> ## Documentation Index
> Fetch the complete documentation index at: https://developers.circle.com/llms.txt
> Use this file to discover all available pages before exploring further.

> ## Agent Instructions
> Before reading these docs, install the relevant Circle Skill to get pre-loaded context — skills are LLM-optimized and cover architecture decisions, correct flows, and common pitfalls. In Claude Code: run /plugin marketplace add circlefin/skills then /plugin install circle-skills@circle. With Vercel Skills CLI: run npx skills add circlefin/skills. Available skills: use-usdc https://github.com/circlefin/skills/blob/master/plugins/circle/skills/use-usdc/SKILL.md (balances, transfers, approvals on EVM and Solana); EURC has no skill — see https://developers.circle.com/stablecoins/what-is-eurc.md; bridge-stablecoin https://github.com/circlefin/skills/blob/master/plugins/circle/skills/bridge-stablecoin/SKILL.md (crosschain transfers via CCTP, USDC, EURC, and third-party assets); use-arc https://github.com/circlefin/skills/blob/master/plugins/circle/skills/use-arc/SKILL.md (Arc chain config, contract deployment, USDC bridging — Arc docs: https://docs.arc.io/llms.txt); use-circle-wallets https://github.com/circlefin/skills/blob/master/plugins/circle/skills/use-circle-wallets/SKILL.md (choose wallet type); use-developer-controlled-wallets https://github.com/circlefin/skills/blob/master/plugins/circle/skills/use-developer-controlled-wallets/SKILL.md (custodial wallets for payouts and treasury); use-user-controlled-wallets https://github.com/circlefin/skills/blob/master/plugins/circle/skills/use-user-controlled-wallets/SKILL.md (embedded wallets with Web2 login); use-modular-wallets https://github.com/circlefin/skills/blob/master/plugins/circle/skills/use-modular-wallets/SKILL.md (smart contract wallets with passkeys and ERC-4337); use-gateway https://github.com/circlefin/skills/blob/master/plugins/circle/skills/use-gateway/SKILL.md (unified USDC balance, nanopayments); use-smart-contract-platform https://github.com/circlefin/skills/blob/master/plugins/circle/skills/use-smart-contract-platform/SKILL.md (deploy, interact, monitor contracts). Pair any skill with the Circle MCP server for live SDK signatures, contract addresses, and chain IDs: {"mcpServers":{"circle":{"url":"https://api.circle.com/v1/codegen/mcp"}}}.
> Read the product overview first. Each product has an overview explaining when and why to use it. Read it before quickstarts.
> Pick the right wallet type. Developer-controlled (you hold keys), user-controlled (end user holds keys via PIN/social login), or modular (smart contract wallets with passkeys). See https://developers.circle.com/wallets.md.
> Use CCTP V2 for crosschain transfers. CCTP natively transfers USDC and EURC via burn-and-mint, and supports permissionless wrapping of third-party assets via lock-and-mint. V1 is legacy; always use V2 unless V1 is specified or the chain requires it (Noble, Sui, and Aptos still require V1). Migration guide: https://developers.circle.com/cctp/migration-from-v1-to-v2.md.
> Use Bridge Kit for frontend bridging. Wraps CCTP with a simpler SDK for user-facing apps. Use CCTP directly for backend transfers.
> Gas Station vs Paymaster. Gas Station sponsors gas for Circle Wallet transactions. Paymaster lets users pay gas in USDC. Different use cases — read both overviews.
> Gateway Nanopayments for sub-cent payments. Gasless USDC micropayments down to $0.000001 via x402 and batched settlement. For pay-per-request APIs, AI agent payments, streaming.
> Look up USDC addresses per chain. Never hardcode — use https://developers.circle.com/stablecoins/usdc-contract-addresses.md.
> Prefer SDKs over raw API calls. Node.js and Python SDKs handle auth, retries, and errors.
> API key required. Bearer token in Authorization header. Testnet and mainnet use separate keys and may use different base URLs depending on the product.
> Set up webhooks when available. Most operations are async. Webhooks deliver transaction confirmations and state changes.
> When calling list endpoints, paginate using pageSize and pageAfter until no nextPageAfter cursor is returned—stopping at the first page silently misses records.
> Building an AI agent? Start with the Agent Stack—Circle CLI, agent wallets, and nanopayments built for autonomous use cases: https://developers.circle.com/agent-stack.md.

# CCTP fees

> Understanding CCTP transfer fees for Fast and Standard transfers

CCTP charges fees on Fast Transfers only. Standard Transfers are free.

[Fast Transfer](/cctp/concepts/finality-and-block-confirmations#fast-transfer-attestation-times)
enables USDC transfers at faster-than-finality speeds by leveraging Circle's
[Fast Transfer allowance](/cctp/concepts/fast-transfer-allowance). These
transfers incur a fee that varies by route.

* **Fee range**: 0-13 basis points depending on source blockchain, for example
  \$0–\$1.30 per \$1,000 transferred
* **When and how the fee is collected**: The fee is deducted from the
  transferred amount when USDC is minted on the destination blockchain

<Note>
  Instead of having the Fast Transfer fee deducted at mint, you can pay it upfront
  on the source blockchain so the recipient receives the full transferred amount
  on the destination blockchain. See [Upfront fees](/cctp/concepts/upfront-fees).
</Note>

## Get the current fee

To retrieve the current Fast Transfer fee for your route, call the
[`GET /v2/burn/USDC/fees`](/api-reference/cctp/all/get-burn-usdc-fees) endpoint.
For more details, see
[Get the fee for your transfer](/cctp/howtos/get-transfer-fee).

## Maximum fee parameter

When calling
[`depositForBurn`](/cctp/references/contract-interfaces#depositforburn), you
specify a `maxFee` parameter that sets the maximum fee you're willing to pay:

```ts TypeScript theme={null}
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:

```ts TypeScript theme={null}
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.

<Warning>
  **Do not hardcode fee values.** Fees can change at any time. Always retrieve the
  current fee by calling the [fee API](/api-reference/cctp/all/get-burn-usdc-fees)
  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.
</Warning>

<Tabs>
  <Tab title="Fast Transfer fee">
    | Source blockchain | Fee |
    | - | - |
    | Arbitrum | 1.4 bps (0.014%) |
    | Base | 1.3 bps (0.013%) |
    | Codex | 1.5 bps (0.015%) |
    | EDGE | 1.5 bps (0.015%) |
    | Ethereum | 1 bps (0.01%) |
    | Ink | 2 bps (0.02%) |
    | Linea | 13 bps (0.13%) |
    | Morph | 4 bps (0.04%) |
    | OP Mainnet | 1.3 bps (0.013%) |
    | Plume | 2 bps (0.02%) |
    | Solana | 1 bps (0.01%) |
    | Starknet | 12 bps (0.12%) |
    | Unichain | 2 bps (0.02%) |
    | World Chain | 1.3 bps (0.013%) |
    | X Layer | 1.3 bps (0.013%) |

    <Note>
      **Blockchains without Fast Transfer fees**

      Some 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](/cctp/concepts/supported-chains-and-domains).
    </Note>
  </Tab>

  <Tab title="Standard Transfer fee">
    | Source blockchain | Fee |
    | - | - |
    | Aptos | 0 bps (0%) |
    | Arbitrum | 0 bps (0%) |
    | Arc | 0 bps (0%) |
    | Avalanche | 0 bps (0%) |
    | Base | 0 bps (0%) |
    | Codex | 0 bps (0%) |
    | Cronos | 0 bps (0%) |
    | EDGE | 0 bps (0%) |
    | Ethereum | 0 bps (0%) |
    | HyperEVM | 0 bps (0%) |
    | Injective | 0 bps (0%) |
    | Ink | 0 bps (0%) |
    | Linea | 0 bps (0%) |
    | Monad | 0 bps (0%) |
    | Morph | 0 bps (0%) |
    | OP Mainnet | 0 bps (0%) |
    | Pharos | 0 bps (0%) |
    | Plasma | 0 bps (0%) |
    | Plume | 0 bps (0%) |
    | Polygon PoS | 0 bps (0%) |
    | Sei | 0 bps (0%) |
    | Solana | 0 bps (0%) |
    | Sonic | 0 bps (0%) |
    | Starknet | 0 bps (0%) |
    | Sui | 0 bps (0%) |
    | Unichain | 0 bps (0%) |
    | World Chain | 0 bps (0%) |
    | X Layer | 0 bps (0%) |
    | XDC | 0 bps (0%) |
  </Tab>
</Tabs>

## 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`.

<Note>
  **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.
</Note>

### `TokenMessenger` contracts without fee switch support

| Source blockchain | Contract source code |
| - | - |
| Arbitrum | [`7d70310`](https://github.com/circlefin/evm-cctp-contracts/pull/57/commits/7d703109a2cfcb3f76375fef5f1a97f03c447b94) |
| Avalanche | [`7d70310`](https://github.com/circlefin/evm-cctp-contracts/pull/57/commits/7d703109a2cfcb3f76375fef5f1a97f03c447b94) |
| Base | [`7d70310`](https://github.com/circlefin/evm-cctp-contracts/pull/57/commits/7d703109a2cfcb3f76375fef5f1a97f03c447b94) |
| Codex | [`7d70310`](https://github.com/circlefin/evm-cctp-contracts/pull/57/commits/7d703109a2cfcb3f76375fef5f1a97f03c447b94) |
| Ethereum | [`7d70310`](https://github.com/circlefin/evm-cctp-contracts/pull/57/commits/7d703109a2cfcb3f76375fef5f1a97f03c447b94) |
| Linea | [`7d70310`](https://github.com/circlefin/evm-cctp-contracts/pull/57/commits/7d703109a2cfcb3f76375fef5f1a97f03c447b94) |
| OP Mainnet | [`7d70310`](https://github.com/circlefin/evm-cctp-contracts/pull/57/commits/7d703109a2cfcb3f76375fef5f1a97f03c447b94) |
| Polygon PoS | [`7d70310`](https://github.com/circlefin/evm-cctp-contracts/pull/57/commits/7d703109a2cfcb3f76375fef5f1a97f03c447b94) |
| Sonic | [`7d70310`](https://github.com/circlefin/evm-cctp-contracts/pull/57/commits/7d703109a2cfcb3f76375fef5f1a97f03c447b94) |
| Unichain | [`7d70310`](https://github.com/circlefin/evm-cctp-contracts/pull/57/commits/7d703109a2cfcb3f76375fef5f1a97f03c447b94) |
| World Chain | [`7d70310`](https://github.com/circlefin/evm-cctp-contracts/pull/57/commits/7d703109a2cfcb3f76375fef5f1a97f03c447b94) |

### `TokenMessenger` contracts with fee switch support

| Source blockchain | Contract source code |
| - | - |
| Sei | [`2f9a2ba`](https://github.com/circlefin/evm-cctp-contracts/commit/2f9a2ba993b96a442c75bf21b3cb6d6292d81439) |

## 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](/cctp/concepts/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.

## Charging your own application fee

The fees described on this page are protocol fees collected by Circle. The CCTP
protocol has no built-in mechanism for adding a custom application or
marketplace fee to a transfer. To collect a fee from your users on top of the
protocol fee, either use
[Bridge Kit's custom fee support](https://docs.arc.io/app-kit/tutorials/bridge/collect-bridge-fee)
or implement the fee yourself in a smart contract or backend alongside the CCTP
call (for example, by wrapping `depositForBurn` in a contract that also
transfers a fee to your treasury).
