Transfer stages
A CCTP transfer consists of three stages:- Burn: USDC is burned on the source blockchain
- Attestation: Circle’s Attestation Service observes the burn and signs a message
- Mint: The signed attestation is submitted to mint USDC on the destination blockchain
Identify where your transfer is stuck
Use the following steps to determine the current state of your transfer:Check the burn transaction
Verify the burn transaction succeeded on the source blockchain using a block
explorer. If the transaction failed or is pending, the issue is at the burn
stage.
Query the attestation API
Call the
GET /v2/messages endpoint
with your transaction hash.Interpret the response:- 404 response: The attestation service hasn’t observed the burn yet. This is normal and expected. See Why 404 responses are expected.
- Empty
messagesarray: The burn exists but hasn’t been processed yet. - Status
pending: The burn is awaiting block confirmations. - Status
completewith attestation: The attestation is ready. If your transfer is stuck, the issue is at the mint stage.
Common issues and solutions
| Issue | Cause | Solution |
|---|---|---|
| 404 persists for extended time | Burn transaction may have failed or is still confirming | Verify burn succeeded on block explorer. If it failed, retry the burn. |
Attestation status remains pending | Waiting for block confirmations | Wait for sufficient confirmations based on finality threshold |
| Have attestation but mint fails | Gas issues, incorrect parameters, or nonce already used | See Retry a failed mint |
expirationBlock has passed before you submitted the mint | Attestations encode an expirationBlock 24 hours in the future. Once that block passes on the destination blockchain, the existing attestation can no longer be used to mint. | Call POST /v2/reattest/{nonce} to request a new attestation with a refreshed expirationBlock, then poll GET /v2/messages and re-mint. |
Expired messages are not permanently stuckThere is no deadline after which re-attestation becomes unavailable. As long as
the original burn transaction still exists on the source blockchain, you can
request a fresh attestation at any time using the
re-attest endpoint.