Skip to main content
Puffin routes cross-chain transfers through whichever mechanism actually fits the pair you’re moving — you call one endpoint either way.

How routing works

CCTP V2

Used for USDC-only legs between CCTP-enabled chains (Solana and the supported EVM chains). Native burn-and-mint via Circle’s protocol — no wrapped assets, no liquidity pool slippage.

NEAR Intents

Used for everything CCTP doesn’t cover: USDT on any chain, BSC legs, and any cross-asset swap. Solver-network routed via a deposit address.
You never choose the route explicitly — POST /bridge/quote tells you which one was selected ("route": "cctp_v2" or "route": "near_intents") along with the network fee and an ETA, before you commit to it.

Quote, then execute

ourFee is Puffin’s platform + gas-recovery charge on top of the quoted network fee — see Pricing for how it’s configured. When you’re ready:
This debits the source wallet immediately and returns a bridgeTransfer you can poll — or just wait for the webhook.

Webhooks

Subscribe to bridge.completed and bridge.failed — see Webhooks for the full payload shape.
Bridging is USDC/USDT-only today, matching the Wallet-as-a-Service chain/token matrix (Solana, Polygon, BSC, Base). A bridge request for an unconfigured route returns bridge_not_configured — this is an operational gate on our side while a corridor is being rolled out, not something you can work around client-side.