Supported chains

April 18, 2026 · View on GitHub

Every supported chain uses Circle's native USDC via CCTP V2 — burn/mint, zero slippage, no wrapped tokens.

Chains are opt-in: each is enabled by setting FACILITATOR_<CHAIN> plus its RPC URL. Unconfigured chains are silently excluded from GET /supported, GET /discover, and GET /.well-known/x402.json.

Mainnet

ChainCAIP-2CCTP domainFamilySDK
Baseeip155:84536EVMviem
Ethereumeip155:10EVMviem
Optimismeip155:102EVMviem
Arbitrumeip155:421613EVMviem
Lineaeip155:5914411EVMviem
Unichaineip155:13010EVMviem
World Chaineip155:48014EVMviem
Solanasolana:mainnet5Solana@solana/web3.js
Stellarstellar:pubnet27Stellar@stellar/stellar-sdk

Testnet

ChainCAIP-2CCTP domain
Base Sepoliaeip155:845326
Ethereum Sepoliaeip155:111551110
Optimism Sepoliaeip155:111554202
Arbitrum Sepoliaeip155:4216143
Linea Sepoliaeip155:5914111
Unichain Sepoliaeip155:130110
World Chain Sepoliaeip155:480114
Solana devnetsolana:devnet5
Stellar testnetstellar:testnet27

Select which set is active with NETWORK_ENV=mainnet or NETWORK_ENV=testnet.

Pull mechanism (buyer → facilitator)

FamilyPull mechanismCCTP burn call
EVMUSDC.transferWithAuthorization (EIP-3009)TokenMessengerV2.depositForBurn — or depositForBurnWithHook when the destination is Stellar
SolanaFacilitator pays fee + TransferChecked authorized by buyerCCTP program depositForBurn
StellarFacilitator is fee source + buyer-signed payment opSoroban TokenMessengerMinter.deposit_for_burn

The buyer never pays gas in the x402 flow — the Facilitator submits every transaction. In MPP charge mode, the buyer broadcasts directly and pays their own fee.

Cross-chain destination: Stellar

When a buyer pays on an EVM chain and the seller is on Stellar, the EVM adapter uses depositForBurnWithHook on TokenMessengerV2 with the CctpForwarder contract as mintRecipient. hookData carries the seller's Stellar address. When Circle attests, the worker calls receiveMessage on the destination's MessageTransmitter; CctpForwarder atomically mints and forwards USDC to the seller's Stellar account.

You do not have to do anything on the seller side — registering on stellar:pubnet is enough.

EVM key sharing

All 7 EVM chains share a single private key: set FACILITATOR_PRIVATE_KEY_EVM once, on the worker. The same 0x… address serves as FACILITATOR_BASE, FACILITATOR_ETHEREUM, FACILITATOR_OPTIMISM, etc. — set each one to the same address.

Solana and Stellar use separate keys:

  • FACILITATOR_PRIVATE_KEY_SOLANA — base64-encoded keypair.
  • FACILITATOR_PRIVATE_KEY_STELLAR — Stellar secret key (S…).

One-time USDC approval per EVM chain

Before the Facilitator can burn on an EVM chain, its wallet must approve TokenMessengerV2 to spend USDC. Do this once per chain:

cast send <USDC_CONTRACT> \
  "approve(address,uint256)" \
  <TokenMessengerV2> \
  $(python3 -c "print(2**256-1)") \
  --private-key $FACILITATOR_PRIVATE_KEY_EVM \
  --rpc-url $BASE_RPC_URL

The exact USDC_CONTRACT and TokenMessengerV2 addresses per chain are in Circle's public deployment docs.

Chains explicitly excluded

Polygon and Avalanche are excluded: CCTP V1 only, which has a different depositForBurn signature and ~13-minute settlement. They would require a separate adapter with a separate test matrix.

Adding a new chain

Any new CCTP V2 deployment fits the existing EVM adapter. See add a new EVM chain.