Skip to main content

Get a fee quote from a relayer

What this lets you do​

Ask a relayer how much it'll cost to submit your private transfer or withdrawal on-chain. The relayer returns a signed quote: a commitment that, if you submit before it expires, they'll relay your transaction at the named fee.

Constraints & limits​

  • Quote expiry is short (typically 60 to 90 seconds). Slow proof generation can outlast the quote. The SDK does not auto-retry, so request a fresh quote with prepareTransfer or prepareWithdraw and submit again. Handle both FeeCommitmentExpired and relayer-side rejections.
  • The quote binds the fee, not the transfer. The signed commitment covers the fee asset, fee amount, fee-split data, and expiration. Changing the asset invalidates the quote, while the transfer's recipient and amount are shielded and can change without re-quoting.
  • Signed by the relayer. The signature is what makes the quote binding. Don't trust unsigned "estimates" from a relayer, because only signed quotes give you the fee commitment.
  • One quote per relayer. If you want to compare across relayers, request from each independently. The SDK supports multiple RelayerInfo entries.

What it unlocks next​

  • Submit via relayer, since the standard flow uses the quote you just got.
  • Show the user the fee before they commit to generating the proof, which is a courtesy they'll appreciate when fees are surprisingly high.
  • Compare quotes across multiple relayers and pick the cheapest.

How to use it​

const quote = await relayerInteractor.getTransferQuote(relayers[0], {
asset: tokenId, // chainId comes from the relayer config, not the params
commit: true,
});

console.log(`Relayer fee: ${formatUnits(BigInt(quote.feeAmount), decimals)} ${symbol}`);
console.log(`Valid until: ${new Date(quote.feeCommitment.expiration).toISOString()}`);

Use these methods when you want a fee preview before preparing the full operation. Normal flows fetch a quote inside prepareTransfer() and prepareWithdraw() anyway. The chain comes from the relayer config rather than the params, and quote expiration is in milliseconds.

Behind the scenes​

SDK call relayerInteractor.getTransferQuote(relayer, params), or getWithdrawalQuote for a withdrawal, invoked automatically by prepareTransfer and prepareWithdraw
Relayer endpoint POST {relayer.url}/v1/quote/{chainType}/{chainId}/transfer
What's signed The relayer signs the feeCommitment, covering the fee asset, the amount fields, the encoded fee-split data (recipient, fee recipient, fee amount, native gas), and the expiration. This signedRelayerCommitment is the binding signature.