Paying from another chain

A customer holding USDC on another chain should not have to bridge it themselves before they can pay you. There are two ways they don't have to.

Just send USDC to the address — from any chain

Every payment's deposit address is the same address on Arc, Base, Ethereum, Arbitrum, Avalanche and Monad. The customer sends USDC to it on whichever chain they hold it — including a withdrawal straight from an exchange, or a QR scan — with no wallet connection and no app to trust.

USDC that arrives on a source chain is bridged to Arc automatically over Circle's CCTP and settles exactly like a direct payment. This works because the address is a contract deployed at an identical address on every chain; the bridge's mint recipient is that address itself, so a cross-chain payment cannot be redirected any more than a direct one.

The merchant absorbs the bridge fee. A payer sending from an exchange sends the round invoice amount; CCTP takes its cut in transit (0 on Monad, ~1.3 bps on Base). The payment still confirms in full — the shortfall is credited as the fee it is, not read as underpayment.

USDC only, on a supported chain

The address moves only USDC, and only on the six supported chains.

Sent to the addressResult
USDC on Arc, Base, Ethereum, Arbitrum, Avalanche or Monadbridged and settled
A different token (USDT, DAI, …)not moved automatically
Native gas (ETH, AVAX, MON)not moved automatically
A wrapped-USDC variant that is not Circle'snot moved automatically

Anything in the bottom three rows can be recovered by the operator through an owner-gated rescue call — the vault refuses to let that call touch a real payment — but the safe path is to send only USDC. Show the payer the chain list and label it clearly.

Or connect a wallet and let the payer cover the fee

For a payer who would rather pay from a connected wallet, the checkout offers a wallet path that sizes the burn so the payer covers the fee and the merchant receives the exact invoice.

GET /api/public/payments/{id}/cross-chain?chain=base-sepolia
{
  "burn_amount": "2.500326",
  "bridge_fee": "0.000326",
  "receives": "2.50",
  "mint_recipient": "0x…",
  "finality_threshold": 1000
}

The payer sends burn_amount; the merchant receives the full invoice. Because CCTP charges on the burn rather than on what arrives, this cannot be computed by adding the fee to the invoice — that undershoots, and by more as the amount grows.

If you build your own version of this, pass the quoted bridge_fee_minor as maxFee. It carries a unit of headroom on purpose: a maxFee sitting exactly on the fee boundary gets the fast transfer declined, and CCTP silently falls back to standard finality — 15 minutes instead of 15 seconds.

Redemption is ours to do

On either path, an attestation being ready moves no money — receiveMessage has to be called on Arc, and the relayer does it, because the payer would otherwise need gas on a chain they have never used. The relayer pays gas and nothing else: the mint recipient was fixed when the funds were burned, and credit still comes from the funds arriving, not from this step.

Supported chains

ChainCCTP domain
Arc26
Base6
Ethereum0
Arbitrum3
Avalanche1
Monad15