Transfer flow with upfront fees
1
Request a quote
Request an upfront fee quote from the
Quote API for the fees you
want to pay upfront: the Forwarding Service fee, the Fast Transfer fee, or
both. See Paying the fee for the available fee tokens.
2
Receive a signed quote
Circle returns a signed, time-bound quote that prices each fee and includes a
signedQuote blob.3
Approve USDC
Approve
TokenMessengerWithFees
to spend the USDC amount you’re transferring, plus the quoted fee if you’re
paying it in USDC. The contract pulls the transfer amount for the burn and, if
applicable, the fee amount.4
Submit the burn
Call
depositForBurnWithFees (or depositForBurnWithHookAndFees) on
TokenMessengerWithFees, passing the signed quote along with the standard
depositForBurn parameters, and pay the quoted fee amount: attach it as the
transaction’s native value, or rely on the USDC approval from the previous
step.5
Fee is collected and tokens are burned
The contract verifies the quote, collects the fee, and then delegates to
TokenMessengerV2 to complete the CCTP burn.6
Full amount is minted
Circle attests the transfer with no fee deducted at mint, and the full amount
is minted to the recipient.
Paying the fee
The token you selected on the quote request decides where the fee comes from:- Native gas token (default): attach the quoted amount as the transaction’s native value.
- USDC: request the quote with
feeTokenset to the USDC address, then approveTokenMessengerWithFeesto spend the quoted fee before you submit. This fee approval is on top of the USDC you’re transferring, so approve the transfer amount plus the quoted fee.
Forwarding with upfront fees
When a quote includes aFORWARD fee, the transfer is forwarded on the
destination blockchain the same way as any other
Forwarding Service transfer, except that
the forwarding fee isn’t deducted from the transferred amount. What changes is
how you supply the hook data.
Forwarding requires a valid cctp-forward hook in the submitted hook data.
depositForBurnWithFees
builds this hook for you automatically, as long as you request the quote without
passing hookData. For custom hook data, use
depositForBurnWithHookAndFees
and submit the same hookData you used to request the quote. For the hook
structure, including how to append your own frame, see
Forwarding Service hook format.