TaifoonTAIFOON
Transfers

API · 4 of 5

Transfers

The exact calls a wallet signs to move value, then the transfer followed until it lands. Nothing here signs or sends.

THE COORDINATION LAYER · one namespace at https://coord.taifoon.dev/v1 · 5 operations on this page · machine-readable at /v1/openapi.json (see Reference)

Try it

A transfer is quote, plan, sign, attest, mint and prove. Nothing on this page signs: your wallet signs, Circle mints, the chain proves.

Plan

Plan 2 USDC from Base to Arc. The answer is the quote and the transactions in one object: the same numbers the wallet signs.

shell
curl -X POST https://coord.taifoon.dev/v1/transfer/plan \
  -H 'content-type: application/json' \
  -d '{"src_chain_id":8453,"dst_chain_id":5042,"amount":"2000000",
       "recipient":"0x3574999dd4c96eb73bd6e11d4177010c83e14f5b","speed":"standard"}'
FieldMeaning
steps[]approve (skip it if the allowance suffices), then bridge: to, data, value, chain_id.
amounts_usdc_unitsamount, service_fee and its reason (bps or floor), burned, circle_max_fee, circle_fee_estimate and expected_received.
feesThe service fee, Circle’s bps and forwarder fee, and the source of each number.
route.viaThe CCTP fee router on chains that have one, or token_messenger_v2_direct_forwarded.
LegWho takes it
Service feeThe router, on chain: the larger of 10 bps and a 0.02 USDC floor.
BurnedThe amount less the service fee, handed to Circle’s TokenMessengerV2.
Circle feeCircle’s bps tier plus its forwarder fee, taken from the burned amount.
ArrivesNative USDC minted to the recipient by Circle’s forwarder.

Circle's forwarder mints only a burn that carries its hook and whose maxFee covers its fee. The plan sizes maxFee from Circle's live numbers.

Sign

Your wallet sends the steps in order on the source chain. The router takes the fee and calls depositForBurnWithHook: one transaction, one Bridged event. A smart-account wallet (EIP-5792) can batch the approve and the bridge.

Follow it

Follow a transfer by its source transaction (here a transfer from Base that was minted), or read the recent transfers:

shell
curl https://coord.taifoon.dev/v1/transfer/8453/0x81464f5e6a8b6322e4bec8f609a08e8ec1f1ef11d39e5f5d51e3fa676c5f042a
curl "https://coord.taifoon.dev/v1/transfers?limit=3"

The bridge gateway answers the same state machine directly, with more views:

Call on https://arc.taifoon.devGives you
POST /v1/bridge/trackRegisters any send ({ chain_id, tx_hash }); router burns are also found on chain within a minute.
GET /v1/bridge/tx/:chain/:hashThe state (burned → attested → minted, needs_relay, stuck with a resolution), the timeline and the mint transaction.
GET /v1/bridge/status/:chain/:hashCircle's attestation, with forward_state.
GET /v1/bridge/relay-plan/:chain/:hashThe fallback: once attested, the receiveMessage call any funded address may send.
GET /v1/bridge/queueEvery unresolved transfer, oldest first, with what happens next.
GET /v1/bridge/ledgerRecords and a summary: volume, fees, measured burn-to-mint times per tier.
GET /v1/bridge/events/:chainThe router's Bridged logs, decoded from the chain.
GET /v1/bridge/metricsPrometheus metrics: states, unresolved, SLA breaches, volume, durations.
shell
curl https://arc.taifoon.dev/v1/bridge/tx/8453/0x81464f5e6a8b6322e4bec8f609a08e8ec1f1ef11d39e5f5d51e3fa676c5f042a
curl https://arc.taifoon.dev/v1/bridge/queue

Prove it

The burn and the mint are transactions like any other: prove each with GET /v1/proof/tx/:chain/:tx (see Prove a transaction).

Every operation (5)

Each row is generated from the table that routes /v1. The answer of each operation, field by field, is in the OpenAPI document; see Reference.

OperationWhat it doesAuth
POST /v1/transfer/planThe exact calls a wallet must sign to make a transfer.none
POST /v1/bridge/planThe same call as POST /v1/transfer/plan, under the planner’s own name.none
GET /v1/transfer/:chain/:txWhere one transfer has got to.none
GET /v1/transfersThe transfers the service has seen.none
GET /v1/transfer/watch/:chain/:txFollow one transfer as it moves.none