| Method | User txs | User needs gas? | When to use |
|---|---|---|---|
ERC-3009 transferWithAuthorization | 0 | No | Recommended: single-tx gasless (USDC-native) |
| EIP-2612 Permit | 0 | No | Fallback for tokens that support permit() but not ERC-3009 |
| Direct transfer | 1 | Yes | Sender already has source-chain gas |
POST /circle-gateway/v2/depositAddresses to create a quoted vault. The response includes the vaultAddress to fund, the quoted amount, and the quote deadline. The vault must receive at least amount USDC before deadline.
ERC-3009 transferWithAuthorization
Recommended. USDC’s native gasless path. User signs aTransferWithAuthorization offchain; the operator wallet submits a single transferWithAuthorization() call that moves tokens directly from the signer to the vault.
USDC’s EIP-712 domain name varies per chain, "USDC" on Base Sepolia, "USD Coin" elsewhere. Use the correct value for the chain you’re signing on.
value must be at least the quoted amount, the vault’s quote deadline must not have passed, and validBefore must be at least a minute in the future. Status transitions PENDING → COMPLETED (or FAILED).
EIP-2612 Permit
Fallback when the token supportspermit() but not ERC-3009. User signs a Permit offchain with the vault as spender; the operator wallet submits the transactions that pull the tokens into the vault on their behalf via POST /circle-gateway/v1/gasless/permit.
202 Accepted with { id, status: "PENDING" }. Status transitions PENDING → PERMIT_SENT → COMPLETED (or FAILED).
Direct transfer
The sender submits a vanilla ERC-20transfer() to the vault address. Balance monitoring detects when the vault balance reaches the quoted amount and publishes the deposit intent.
POST to obtain the vault. The sender pays gas.
Polling
For gasless transfers, poll the relayer job:COMPLETED/FAILED and the vault state is PUBLISHED, with a 1–2 minute overall timeout. See the state table for all vault states.
Validation
The service rejects gasless requests before queueing if any of:toisn’t a known quoted vault (or legacy deposit address) onchainId- The quoted vault isn’t in a fundable state, or its quote
deadlinehas passed - USDC isn’t configured for
chainId - Permit
deadlineis in the past, ERC-3009validBeforeis less than a minute in the future, orvalidAfteris in the future valueis below the vault’s quotedamount, or the signer’s USDC balance is less thanvalue- Signature, nonce, or address fields don’t match the expected shapes (see Validation rules)
FAILED; the transaction is never retried automatically.