Skip to main content

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.

Goldsky, step 2: TurboRecord each burnYour app’s burns, in the app’s database
Blockchains, step 1: Burn USDC on the source chainCircle’s contract emits the message
Goldsky, step 3: ComposeFetch the attestationChecked until Circle signs the burn
Goldsky, step 4: ComposeMint on the destination chainMessage and attestation, gas sponsored
Blockchains, step 5: Receive the USDCMinted to the recipient
Your business, step 6: Follow up on stuck transfersBurns that never mint
  • Goldsky

How to complete cross-chain USDC transfers

Circle’s Cross-Chain Transfer Protocol (CCTP) moves USDC by burning it on one chain and minting it on another, and the mint waits until someone submits Circle’s attestation of the burn. A pipeline records each burn your app makes, and a scheduled task that Goldsky hosts fetches the attestation once Circle signs it and submits it on the destination chain. The same steps apply to any protocol that attests a message and lets anyone deliver it.

What you’ll need

  • Goldsky Compose
  • Goldsky Turbo
  • Burns sent through CCTP with the destination caller left open or set to your task’s wallet
  • Access to Circle’s attestation API
  • Someone who follows up on transfers that don’t mint
  1. 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.

  2. Record each burn to complete

    Handled by Goldsky Turbo

    A 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 DepositForBurn events from Circle’s TokenMessengerV2 contract 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.

    Index CCTP burns across chains (opens in a new tab)
  3. Fetch the attestation once Circle signs it

    Handled by Goldsky Compose

    The 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 ctx.db.query and calls Circle’s GET /v2/messages endpoint for each with ctx.fetch, which retries failed calls and records each response on the run. A burn still pending waits for the next run.

    Call an API from a task (opens in a new tab)
  4. Mint the USDC on the destination chain

    Handled by Goldsky Compose

    The USDC exists on the destination chain once Circle’s contract there accepts the attestation.

    The call is receiveMessage with the message and its attestation, sent to Circle’s MessageTransmitterV2, which checks Circle’s signatures before minting. Each burn mints once, so a second submission reverts with Nonce 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 writeContract from a smart wallet whose gas is sponsored and paid through your Goldsky bill, so the task keeps no native tokens on each destination chain. With onReorg set to replay, a mint a reorg removes is sent again.

    How Compose wallets pay gas (opens in a new tab)
  5. 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.

  6. 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.

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.

© Endless Sky Inc. All rights reserved.

PrivacyTermsSecurity

System status