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: 0-14 basis points depending on source chain, for example $0–$1.40 per $1,000 transferred
  • 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,
  transferAmountUSDC: string, // USDC amount like "1" or "10.5"
) {
  // Convert USDC to subunits (6 decimals)
  const [whole, decimal = ""] = transferAmountUSDC.split(".");
  const decimal6 = (decimal + "000000").slice(0, 6);
  const transferAmount = BigInt(whole + decimal6);

  // 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 basis points

  // Calculate fee as percentage of transfer amount
  const protocolFee =
    (transferAmount * BigInt(Math.round(minimumFee * 100))) / 1_000_000n;

  // Add 20% buffer to protocol fee (protocolFee × 1.2) - result in subunits
  const maxFee = (protocolFee * 120n) / 100n;

  return maxFee; // denominated in USDC subunits (6 decimals)
}

// Use in your burn call
const maxFee = await calculateMaxFee(0, 1, "10.5");

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.