Furlpay Docs
Open App

Payments

CCTP Cross-Chain USDC

Native USDC moves between chains with Circle's CCTP V2 burn-and-mint — no wrapped tokens, no bridge custody. Furlpay builds the calldata; your wallet signs and submits both legs, so funds never touch our keys.

How a transfer works

Rendering diagram…
CCTP V2: burn on the source chain, attest off-chain via Iris, mint on the destination.

Endpoints

MethodPathDescription
POST/api/intents/cctpBuild the burn bundle (approve + depositForBurn) or the mint transaction
GET/api/intents/cctp/attestationPoll Iris for the burn's message + attestation
bash
curl -X POST https://furlpay.com/api/intents/cctp \
  -H "content-type: application/json" \
  -b "session" \
  -d '{
    "kind": "burn",
    "amount": 25,
    "sourceChain": "ethereum",
    "destinationChain": "arbitrum",
    "recipient": "0xYourAddressOnArbitrum",
    "fast": true
  }'

Guarantees and limits

  • V2 only — TokenMessengerV2 / MessageTransmitterV2 with addresses verified against Circle's registry; V1 is end-of-life and never used.
  • Fast Transfers — 8–20s attestation with a fee ceiling of 1 basis point, paid from the transferred amount.
  • Supported chains — Ethereum, Arbitrum, Base, Polygon (native Circle-issued USDC on each).
  • Per-transaction cap — burns above the server-side limit (default $500, FURLPAY_MAX_CCTP_USD) are refused with amount_over_limit.
  • Every prepared burn/mint and every attestation check feeds the ops event ledger and rail health.

The mint leg is yours to finish

After the burn confirms and the attestation lands, USDC exists nowhere until receiveMessage executes on the destination. Keep the message + attestation until the mint confirms — they are your claim.
Did this page help?
Edit this page on GitHub