Under the gasless flows the user pays nothing onchain: the deposit address service pays gas for the source-chain transaction, and the Eco solver service pays gas for final fulfillment on the destination chain.
For both gasless methods, Eco’s operator wallet submits the onchain transactions. Requests are validated, then routed through a serialized transaction queue to prevent operator-wallet nonce collisions under concurrent load.
Prerequisite for all three: call
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.