Skip to main content
CCTP charges fees on Fast Transfers only. Standard Transfers are free. Fast Transfer enables USDC transfers at faster-than-finality speeds by leveraging Circle’s Fast Transfer allowance. These transfers incur a fee that varies by route.
  • Fee range: Typically 0.01 USDC per transfer (0.1 basis points on a $1,000 transfer)
  • When the fee is charged: When you initiate a burn with minFinalityThreshold ≤ 1000
  • Payment method: The fee is deducted from the burn amount on the source blockchain

Get the current fee

To retrieve the current Fast Transfer fee for your route, call the GET /v2/burn/USDC/fees endpoint. For more details, see Get the fee for your transfer.

Maximum fee parameter

When calling depositForBurn, you specify a maxFee parameter that sets the maximum fee you’re willing to pay:
TypeScript
await tokenMessenger.depositForBurn(
  amount,
  destinationDomain,
  mintRecipient,
  burnToken,
  destinationCaller,
  500n, // maxFee: 500 subunits (0.0005 USDC)
  1000, // minFinalityThreshold: Fast Transfer
);
If the actual fee exceeds your specified maxFee, the transaction will revert on the source blockchain, and no USDC will be burned. To avoid transaction failures:
  1. Retrieve the current fee before initiating a transfer
  2. Add a small buffer (for example, 10-20%) to account for potential fee fluctuations
  3. Set maxFee to this buffered amount
Example:
TypeScript
async function calculateMaxFee(sourceDomain: number, destDomain: number) {
  // Get current fee
  const response = await fetch(
    `https://iris-api-sandbox.circle.com/v2/burn/USDC/fees/${sourceDomain}/${destDomain}`,
  );
  const fees = await response.json();

  // Extract minimumFee for Fast Transfer (finalityThreshold 1000)
  const minimumFee = fees[0].minimumFee; // Fee in cents of USDC

  // Convert cents → subunits (1 cent = 10,000 subunits)
  const feeSubunits = BigInt(Math.floor(minimumFee * 10_000));
  const maxFee = (feeSubunits * 120n) / 100n; // 20% buffer

  return maxFee;
}

// Use in your burn call
const maxFee = await calculateMaxFee(0, 1); // Ethereum to Avalanche

Fee optimization strategies

To minimize fees while maximizing transfer speed:
  • Choose the right method: Use Fast Transfer when speed is critical and Standard Transfer when cost optimization is the priority.
  • Monitor allowance: For high-volume applications, monitor the Fast Transfer allowance and switch to Standard Transfer when it’s low.
  • Batch transfers: If you’re making multiple transfers, consider batching them during periods when Fast Transfer allowance is high.
  • Set appropriate maxFee: Always retrieve the current fee before initiating a transfer and set maxFee with a buffer to account for minor fluctuations.