Complete cross-chain USDC transfers
What it is
Completing a cross-chain USDC transfer means taking Circle’s signed attestation of a USDC burn on one chain and submitting it on the destination chain, where the same amount is minted; it’s the last step of a transfer through Circle’s Cross-Chain Transfer Protocol (CCTP), and some protocols call it relaying.
Unless a transfer opts into Circle’s paid forwarding, the mint waits until someone submits that attestation, so wallets, exchanges and payment apps that move USDC between chains complete their own transfers, because a transfer left unfinished is money a user saw leave and never receive.
With Goldsky, Turbo Pipelines records each burn your app makes and a Compose task fetches the attestation and mints the USDC from a gas-sponsored wallet; the same steps work for any protocol that attests a message and lets anyone deliver it.
Who it’s for
Wallets, exchanges, payment apps and chains that move their users’ USDC between chains, and treasury teams that rebalance their own float across chains; watching every transfer’s status is cross-chain transfer tracking.
How a cross-chain USDC transfer is completed
The diagram follows one transfer from the USDC burn on the source chain to the mint on the destination chain, and shows who does each step. Your setup may differ.
Burn USDC on the source chain
A transfer starts when your app or a user burns USDC on one chain, naming the destination chain and the recipient there.
Circle’s messenger contract burns the USDC and emits the message Circle will attest. Unless the burn opts into Circle’s paid forwarding, Circle doesn’t mint on the other chain itself, so the USDC is gone from one chain and not yet on the other until someone submits the attestation.
Record each burn to complete
Handled by Goldsky TurboA burn nobody records never gets minted, and the recipient never receives the USDC.
Keep the burns you’re responsible for, such as your app’s own, with the source transaction hash Circle’s API looks them up by. A list built only from a live connection to a node can miss burns sent while the connection was down.
With Goldsky, a Turbo Pipelines pipeline decodes
Index CCTP burns across chains (opens in a new tab)DepositForBurnevents from Circle’sTokenMessengerV2contract on each chain, keeps your app’s burns with a SQL filter and writes them to a table in your Compose app’s Postgres database, in a schema of its own. A burn a reorg undoes is deleted from the table.Fetch the attestation once Circle signs it
Handled by Goldsky ComposeThe destination chain mints only with Circle’s signed attestation of the burn.
Circle signs a burn once the source chain reaches the finality the burn asked for: once its block is confirmed for a Fast Transfer, after hard finality for a Standard one. Until then the API reports the message as not found or pending, so the task checks again later, and it submits the message bytes the API returns, because those carry the nonce Circle assigns.
A Compose task on a cron trigger reads the burns not yet minted with
Call an API from a task (opens in a new tab)ctx.db.queryand calls Circle’sGET /v2/messagesendpoint for each withctx.fetch, which retries failed calls and records each response on the run. A burn still pending waits for the next run.Mint the USDC on the destination chain
Handled by Goldsky ComposeThe USDC exists on the destination chain once Circle’s contract there accepts the attestation.
The call is
receiveMessagewith the message and its attestation, sent to Circle’sMessageTransmitterV2, which checks Circle’s signatures before minting. Each burn mints once, so a second submission reverts withNonce already used, which means the USDC already minted and the task can mark the transfer done instead of retrying.Goldsky Compose sends the call with
How Compose wallets pay gas (opens in a new tab)writeContractfrom a smart wallet whose gas is sponsored and paid through your Goldsky bill, so the task keeps no native tokens on each destination chain. WithonReorgset toreplay, a mint a reorg removes is sent again.Receive the USDC on the destination chain
The transfer is complete once the recipient holds the minted USDC.
Circle’s contract mints to the recipient and emits
MessageReceived. A Fast Transfer’s attestation expires after a set number of blocks, and an expired one needs a fresh attestation from Circle’s reattest endpoint before it can be submitted.Follow up on transfers that don’t mint
A burn that never mints is money gone from one chain and missing from the other, and the recipient will ask where it is.
Burns still pending long after their finality window, or mints that fail on every run, need a person: the attestation may have expired, or the burn may name another address as its destination caller. To watch every transfer’s status across chains, use cross-chain transfer tracking.
What you control
- Your team
- Follow up on transfers that don’t mint
Questions and answers
How does Circle’s CCTP work?
Circle’s Cross-Chain Transfer Protocol (CCTP) moves USDC by burning it on the source chain and minting the same amount on the destination chain. After the burn, Circle’s attestation service signs the message, once its block is confirmed for a Fast Transfer or after hard finality for a Standard one. Someone then submits the message and attestation to receiveMessage on the destination chain, which checks Circle’s signatures and mints the USDC.
How can I monitor the status of a CCTP transfer?
Look the burn up by its source transaction hash in Circle’s messages API: no result means Circle hasn’t seen the burn yet, pending means it’s waiting for confirmations, and complete with an attestation means it’s ready to mint. A transfer with a ready attestation but no mint is stuck at the mint step. To follow every transfer, pair burns with mints as in cross-chain transfer tracking.
Security and deployment
- SOC 2 Type IIIndependently audited security controls.
- Dedicated infrastructureSingle-tenant options for production workloads.
- Data residencyCloud, on-premises or co-located.
More use cases that run protocol automation
- Run your own oracle price feedPush prices and other data to contracts on many chains.
- Smart contract automation and keepersRun recurring or event-driven contract calls a protocol needs to keep working.
- Onchain circuit breakersPause a token, market or payout when a rule is breached.
- Cross-chain automationAct on one chain when an event happens on another.
- Cross-chain message relayingDeliver each message your app sends through a bridge or messaging protocol to its destination contract, with the protocol’s proof attached.
- Onchain interest rate, funding rate and volatility feedsPublish interest rates, funding rates and volatility benchmarks to contracts.
- VRF and verifiable randomness for smart contractsDeliver signed random values to contracts for prize draws, lottery allocations and random selection, checkable by anyone.
Use cases built the same way
- Authorize and capture stablecoin paymentsHold a buyer’s stablecoins in an escrow contract at checkout, capture them to the merchant as orders ship, void what can’t be filled and refund after capture.
- Programmable escrow for B2B stablecoin paymentsHold a buyer’s stablecoin payment until delivery, a milestone or a deadline, then release it to the seller or refund the buyer.
- Cross-chain transfer trackingSee every cross-chain stablecoin transfer as settled, in flight or stalled, and catch the stuck ones.
- Prediction market creation and resolutionCreate and resolve prediction markets automatically, with every write retried and traced.
Complete cross-chain USDC transfers with Goldsky
We’ll map it to your systems and show you what Goldsky runs, so your team builds the product, not the pipelines underneath it.