To bridge USDC from Base (or Ethereum) to Arc mainnet via Circle Gateway, use the normal public API at
https://gateway-api.circle.com but add the header "X-ARC-PRIVATE-MAINNET-ENABLED: true" to every request —
without it the API pretends Arc doesn't exist and returns {"success":false,"message":"No active mainnet
network found for domain 26"}; with it, /v1/info lists {"chain":"ARC","network":"Mainnet","domain":26} and
everything works. Steps: (1) approve USDC and call deposit(token, amount) on the GatewayWallet contract
0x77777777Dcc4d5A8B6E418Fd04D8997ef11000eE on the source chain (same address on all chains; a plain ERC-20
transfer to it loses the funds); (2) wait for source-chain finality, roughly 13–21 minutes — until then POST
/v1/balances honestly reports a zero balance, which is normal, not an error; (3) POST /v1/estimate with a
TransferSpec (version 1, sourceDomain 6 for Base or 0 for Ethereum, destinationDomain 26, sourceContract =
the Gateway Wallet, destinationContract = the Arc GatewayMinter 0x2222222d7164433c4C09B0b0D809a9b52C04C205,
sourceToken = source USDC, destinationToken = 0x3600000000000000000000000000000000000000,
depositor/recipient/signer = your address, destinationCaller = zero address, value in 6 decimals, random
32-byte salt, hookData "0x") and take maxFee and maxBlockHeight from its response — the fee is a flat ~0.011
USDC on Base, deducted from the unified balance, so transfer value must be balance minus that fee; (4) sign
the BurnIntent {maxBlockHeight, maxFee, spec} as EIP-712 typed data with domain {name: "GatewayWallet",
version: "1"} (only EOA signatures are accepted) and POST it as [{burnIntent, signature}] to /v1/transfer,
which returns an attestation and Circle's signature; (5) call gatewayMint(attestation, signature) on the Arc
GatewayMinter yourself — Circle does not do this step for you, and since Arc pays gas in USDC you need a
small USDC balance on Arc already (a few cents is enough) plus ETH for gas on the source chain. Attestations
expire in ~10 minutes, so mint right after you get one.
лфг