This workflow demonstrates bridging USDC across chains using Circle’s Cross-Chain Transfer Protocol (CCTP) v2. CCTP burns USDC on the source chain and mints native USDC on the destination chain — no wrapped or synthetic tokens involved. Every CCTP bundle action is submitted through Circle’s Forwarding Service, which auto-relaysDocumentation Index
Fetch the complete documentation index at: https://docs.enso.build/llms.txt
Use this file to discover all available pages before exploring further.
receiveMessage on the destination chain so the recipient doesn’t need destination-chain gas. Two finality modes are available:
- Fast Transfer — sub-15s delivery, available only on a subset of source chains (Circle’s Iris API decides). Pays a small protocol fee on top of the forwarding fee.
- Standard Transfer — waits for full source-chain finality. No protocol fee, only the forwarding fee.
- Burn USDC on the source chain via Circle’s
TokenMessengerV2.depositForBurnWithHook(with thecctp-forwardhook) - Circle attests the burn message off-chain via the Iris API
- Circle’s Forwarding Service calls
MessageTransmitterV2.receiveMessageon the destination, minting native USDC to the receiver. The forwarding fee covers destination gas.
User-Paid Fees
Both fees are deducted from the minted USDC amount on the destination — the user does not pay gas in any native token at any point.| Fee | When it applies | Source | Notes |
|---|---|---|---|
| Protocol fee | Fast transfers only | Iris minimumFee (basis points, dynamic per route) | Buffered by 20% per Circle’s recommendation. 0 on Standard. |
| Forward fee | Always (fast + standard) | Iris forwardFee.{low,med,high} (USDC subunits, dynamic per route) | Pays the Forwarding Service to relay receiveMessage. Default bracket: med. |
cctpTransferType: "standard".
Which chains support Fast Transfer? See Circle’s supported blockchains &
transfer
types
for the canonical matrix. Fast vs Standard availability per source chain comes
straight from Circle’s Iris API at request time — no hardcoded list.
Use the GET
/api/v1/cctp/bridge/tokenmessengerv2
endpoint to fetch the TokenMessengerV2 address for the source chain and pass
it as primaryAddress.Defaults (Fast Transfer, Base → Optimism)
When the source chain supports Fast Transfer (Iris reportsminimumFee > 0 on the fast finality row), no extra args are needed — Fast is picked automatically and both fees are taken from the minted amount.
cctpFastBridge.ts
Standard Transfer (Skip the Protocol Fee)
Force Standard finality withcctpTransferType: "standard". This drops the protocol fee to 0 — only the forwarding fee is charged. Pick cctpForwardFee based on destination-chain conditions:
| Level | When to use |
|---|---|
low | Cheap destination chain, no gas spikes expected |
med (default) | Normal operating conditions |
high | Destination chain is expensive or congested |
cctpStandardTransfer.ts
Non-Fast Source Chain (Monad → Avalanche)
Some chains don’t support Fast Transfer as a source (Iris reportsminimumFee: 0 on the fast finality row). For these, the bundle action silently falls back to Standard even if cctpTransferType: "fast" was requested — a warn is logged but the call succeeds:
cctpFallback.ts
warn log), pass cctpTransferType: "standard" directly.
Bridge Parameters
| Parameter | Type | Required | Description |
|---|---|---|---|
primaryAddress | string | Yes | TokenMessengerV2 contract for the source chain — fetch via GET /api/v1/cctp/bridge/tokenmessengerv2 |
destinationChainId | number | Yes | Target chain ID (must be CCTP-supported) |
tokenIn | string | Yes | Source-chain USDC address (CCTP only supports USDC) |
amountIn | string | { useOutputOfCallAt } | Yes | Amount in USDC subunits (6 decimals) |
receiver | string | Yes | Recipient on the destination chain |
cctpTransferType | "fast" | "standard" | No | Defaults to fast when supported on the source; otherwise falls back to standard |
cctpForwardFee | "low" | "med" | "high" | No | Forwarding fee bracket. Defaults to med. Always applied (both fast and standard use the Forwarding Service) |
Important Considerations
- USDC only — CCTP supports exactly one token. Bridging anything else returns
400 Bad Request: CCTP only supports USDC transfers. The destination-chain USDC is the native Circle-issued token, not a wrapped variant. - No callbacks — CCTP bundle actions do not accept a
callbackarray. Passing one returns400 Bad Request: CCTP does not support callback/post-bridge actions. If you need a post-bridge swap, use CCIP, Stargate, or Relay. - Minimum amount — if the amount is too small to cover protocol fee + forwarding fee, the request fails with
CCTP: amountIn too small. To reduce the floor: passcctpForwardFee: "low", or passcctpTransferType: "standard"(zeroes the protocol fee), or increaseamountIn. maxFeeis consumed, not refunded — both fast and standard go throughdepositForBurnWithHook, so any unusedmaxFeeheadroom is taken by the Forwarding Service as destination priority fee. Don’t over-buffer.- Source-chain finality — Standard transfers wait for full source-chain finality (sub-second on Avalanche, up to 15-20 minutes on Ethereum) before Circle attests the burn. Fast transfers attest after a few block confirmations.
Supported Chains
For the current canonical list of supported networks, domains, USDC addresses, and per-chain Fast/Standard support, see Circle’s supported blockchains & domains.Manual Claim (Recovery Flow)
The Forwarding Service automatically callsreceiveMessage on the destination for every transfer (fast and standard). Manual claiming is rarely needed — but if a transfer gets stuck (Forwarding Service delay, exhausted allowance, etc.) you can fetch a ready-to-submit claim transaction:
tx from any wallet on the destination chain to mint the USDC. If the nonce was already consumed (e.g., the Forwarding Service got there first), the response is { claimable: false, reason: "Already claimed (nonce used)" }.
Resources
- Bridge Transaction Status — Polling
/api/v1/cctp/bridge/check - Crosschain Routing Guide — Complete guide to crosschain operations
- Circle CCTP v2 Docs — Protocol reference
- Circle Forwarding Service — How the destination mint is auto-relayed
- Supported blockchains & transfer types — Per-chain Fast/Standard support matrix
GET /v2/burn/USDC/fees/{srcDomain}/{dstDomain}— protocol fee + forwarding fee brackets (?forward=true)GET /v2/fastBurn/USDC/allowance— global rolling Fast Transfer allowanceGET /v2/messages/{srcDomain}— attestation + decoded message; backs/api/v1/cctp/bridge/checkand/claim
Updated
