Skip to main content
Recovery depends on the source transaction receipt. Before a fast deposit burns USDC, you can correct the request and try again. After a successful burn, monitor the existing deposit or escalate it. If the submission result is unclear, check the source blockchain before you try again. Quote and progress states apply only to crosschain FAST deposits. STANDARD same blockchain deposits throw structured errors and don’t return progress.
Don’t call deposit() or depositFor() again while the source transaction is pending or after its receipt confirms the burn. A PENDING result means that the kit submitted the source transaction, but it doesn’t prove that the transaction succeeded. Check the receipt before you choose a recovery action.
The snippets assume that you’ve configured kit and a source adapter. See Use fast deposits for the complete deposit flow.

Identify the failure stage

Start with the result. Use it and the source blockchain history to choose a safe next step. For a fast deposit, txHash identifies different transactions depending on the result:
  • DONE: the destination relay transaction.
  • PENDING or FAILED: the source burn transaction.
When the result is PENDING, look up the source txHash and use the source transaction state to choose the next step: Check what the replacement transaction did. Compare its contract address and call data with the original burn, or look for the burn event:
  • Same burn succeeded: Poll IRIS with the replacement transaction hash. Don’t submit another deposit.
  • Still pending: Keep monitoring the replacement. Don’t submit another deposit.
  • Canceled, unrelated, or reverted: The burn didn’t occur. Request a fresh estimate before you retry.
If a wallet or Remote Procedure Call (RPC) request fails while it submits the burn, the transaction might still have reached the source blockchain. Don’t automatically retry an ambiguous submission. First check the signing wallet’s recent transactions for a matching USDC burn.

Inspect structured errors

Unified Balance operations throw a KitError for request validation, balance, RPC, and onchain failures. Record the error name, message, recoverability, and cause. These fields help you tell a request error from an infrastructure error.
TypeScript
Don’t use recoverability alone to decide whether to submit another deposit. First verify whether the source burn occurred.

Resolve request validation errors

Fast deposit configuration errors use the INPUT_VALIDATION_FAILED error name. Fast deposits require an Ethereum Virtual Machine (EVM) source blockchain. Use the field and reason in the error message to correct the request. If the preflight check reports an insufficient USDC balance, fund the source wallet with the required amount shown in the error. The required balance includes the deposit amount and forwarder fee. The wallet also needs enough of the source blockchain’s native token to pay for any required approval and the burn gas.

Resolve fee quote errors

The kit validates a supplied fast deposit quote before it submits the source burn. Quote rejection reasons aren’t KitError names. The kit translates them into either INPUT_VALIDATION_FAILED messages that request a new estimate or a fatal internal error.

Resolve caller quote errors

The kit detects these reasons before it submits a source burn for the current call: Call estimateDeposit() again with the final amount, source, destination, recipient, and transfer configuration. Pass the returned estimate to deposit() without changing its quoted fields:
TypeScript
Request a quote shortly before submission instead of caching it. If a new quote fails with the same reason, stop retrying and contact Circle support with the full structured error. For NON_ZERO_NONCE, request a new quote only after you confirm that you aren’t trying to recover the deposit that used the old quote.

Report an internal quote error

The following reasons indicate that the kit constructed an invalid forwarding payload:
  • EMPTY_HOOK_DATA
  • FORWARD_FEE_WITHOUT_HOOK
  • FORWARD_HOOK_WITHOUT_FEE
These errors have SERVICE_INTERNAL_ERROR as their error name and FATAL as their recoverability. Requesting another quote with the same SDK and parameters won’t correct the payload. Stop retrying and report the error to Circle support.

Handle fast deposit progress

After it submits the source transaction, the kit waits about 60 seconds for Circle’s relayer. It then returns one of these states: PENDING doesn’t by itself mean that the deposit failed or that funds are in transit. The source transaction can still be pending, reverted, or dropped when the kit returns.

Poll a pending deposit

After the source receipt succeeds, query the IRIS messages endpoint with the source Cross-Chain Transfer Protocol (CCTP) domain ID and the source burn transaction hash. For domain IDs, see Supported chains and domains. Mainnet:
Shell
Testnet:
Shell
Use messages[].forwardState to choose the next action: The top-level message status describes the CCTP attestation. It doesn’t confirm that the forwarding transaction completed. Use forwardState and forwardTxHash for the destination deposit.

Escalate a failed deposit

An IRIS FAILED forward state means that Circle’s forwarding attempt failed. Another party might still complete the destination mint using the same CCTP message. Before you contact Circle support, check the recipient’s Unified Balance. If the balance wasn’t credited, provide:
  • The source burn transaction hash from the deposit result.
  • The source and destination blockchains.
  • The deposit account and amount.
  • The approximate submission time and SDK version.
  • The structured error or IRIS response, with secrets removed.
Circle support can inspect the existing burn and attestation and determine whether the destination relay can be submitted again. This recovery reuses the existing burn; it doesn’t require a new deposit. The Unified Balance deposit API doesn’t provide a public retry method for an existing source burn. Don’t reuse Bridge Kit’s retry() method with a Unified Balance deposit result, and don’t submit a new deposit as a recovery attempt.

Prevent duplicate deposits

  • Persist the source transaction hash and deposit state before starting background monitoring.
  • Prevent duplicate submissions while a wallet request or deposit is pending.
  • Request a fresh estimate immediately before deposit() or depositFor().
  • Pass quoted fields to the deposit unchanged.
  • Use backoff when polling IRIS, and stop when the state is terminal.
  • Alert on repeated internal quote errors and FAILED relay states instead of retrying them automatically.