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 tables

The following tables show the current fee rates by source blockchain for Fast and Standard Transfers. Fees are subject to change at any time.
Do not hardcode fee values. Fees can change at any time. Always retrieve the current fee by calling the fee API at least once per week. Hardcoding fees can cause:
  • Insufficient fees: If fees increase, your Fast Transfers may be degraded to Standard Transfers when the provided maxFee is below the required threshold.
  • Overstated fees: If fees decrease, users may see higher fees than necessary in your UI, even though the excess is refunded during minting.
Source blockchainFee
Arbitrum1.3 bps (0.013%)
Base1.3 bps (0.013%)
Codex1.5 bps (0.015%)
EDGE1.5 bps (0.015%)
Ethereum1 bps (0.01%)
Ink2 bps (0.02%)
Linea11 bps (0.11%)
Morph4 bps (0.04%)
OP Mainnet1.3 bps (0.013%)
Plume2 bps (0.02%)
Solana1 bps (0.01%)
Starknet14 bps (0.14%)
Unichain1.5 bps (0.015%)
World Chain1.3 bps (0.013%)
Blockchains without Fast Transfer feesSome blockchains don’t appear in the Fast Transfer fee table because their standard attestation times are already fast enough. Consequently, Fast Transfer is not applicable when these blockchains are used as the source blockchain for burns. For affected blockchains, see CCTP supported blockchains.

Standard Transfer fee switch

Some blockchains support a Standard Transfer fee switch, which enables enforcing a minimum fee during a CCTP Standard Transfer.
  • Some deployments of the TokenMessengerV2 contract include a fee switch that enforces a minimum onchain fee. This fee is collected during USDC minting in a Standard Transfer. See tables below for supported blockchains.
  • TokenMessengerV2 contracts with fee switch support include the getMinFeeAmount function, which calculates and returns the minimum fee required for a given burn amount, in units of the burnToken.
Important: Calling getMinFeeAmount on a blockchain that uses an older TokenMessengerV2 contract (without fee switch support) results in an error. Refer to the tables below to determine which contract version is deployed on each EVM blockchain.

TokenMessenger contracts without fee switch support

Source blockchainContract source code
Arbitrum7d70310
Avalanche7d70310
Base7d70310
Codex7d70310
Ethereum7d70310
Linea7d70310
OP Mainnet7d70310
Polygon PoS7d70310
Sonic7d70310
Unichain7d70310
World Chain7d70310

TokenMessenger contracts with fee switch support

Source blockchainContract source code
Sei2f9a2ba

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.