The problem
Stellar is the odd one out in Circle's CCTP ecosystem
01
No direct mint
Inbound transfers must route through Circle's CctpForwarder contract. Direct minting to a Stellar address isn't supported by the protocol.
02
Different addresses
Stellar uses G.../C... strkeys, not hex. Every recipient needs translating into the 32-byte format CCTP expects.
03
Different precision
USDC is 7 decimals on Stellar, 6 on Arc. Get the conversion wrong and you truncate or overpay.
How it works
Burn, attest, mint — behind one function
Burn
depositForBurn(WithHook)
Locks USDC on the source chain. The Stellar-bound path encodes a forward-recipient hook.
Attest
Iris polling
Circle's Iris service signs an attestation once source-chain finality is reached.
Mint
receiveMessage / mint_and_forward
Submits on the destination chain. Stellar routes through CctpForwarder.
// one function, either directionconst result = await transfer({ from: "arc", to: "stellar", amount: "10.50", recipient: "GBZXN7PIRZ...QRXFDNMADI", speed: "fast", signer: arcSigner, options: { maxFee: "0.05", destinationSigner },});