FAST deposits. STANDARD
same blockchain deposits throw structured errors and don’t return progress.
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.PENDINGorFAILED: the source burn transaction.
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.
Inspect structured errors
Unified Balance operations throw aKitError 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
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 theINPUT_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’tKitError 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
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_DATAFORWARD_FEE_WITHOUT_HOOKFORWARD_HOOK_WITHOUT_FEE
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
Shell
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 IRISFAILED 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.
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()ordepositFor(). - 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
FAILEDrelay states instead of retrying them automatically.