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 or forwarding it into HyperCore. 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.
To skip the protocol fee on a fast-supporting source chain, force Standard with
protocolArgs.transferType: "standard".
Which chains support Fast Transfer? See Circle’s supported blockchains &
transfer
types
for the canonical matrix. Enso selects Fast for supported source chains and
falls back to Standard for Circle’s Standard-only sources.
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 withprotocolArgs.transferType: "standard". This drops the protocol fee to 0 — only the forwarding fee is charged. Pick protocolArgs.forwardFee based on destination-chain conditions:
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 protocolArgs.transferType: "fast" was requested — a warn is logged but the call succeeds:
cctpFallback.ts
warn log), pass protocolArgs.transferType: "standard" directly.
HyperCore Transfer (USDC to HyperCore)
CCTP can forward source-chain USDC directly into HyperCore spot through HyperEVM (destinationChainId: 999). Use the standard callback shape so the route remains compatible with other post-bridge flows:
cctpHyperCoreTransfer.ts
protocolArgs.isHyperCoreTransfer: true enables the same forwarding path. New HyperCore accounts need more than 1 USDC delivered after CCTP fees so the account activation fee can be covered.
Bridge Parameters
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. - Callback support — CCTP supports one callback shape today:
[enso:balance, hypercore-spot:deposit]for USDC to HyperCore via chain999. Other callback arrays return400 Bad Request. - 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: passprotocolArgs.forwardFee: "low", or passprotocolArgs.transferType: "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
