Skip to main content
You have three ways to fund a Gateway deposit vault. The right choice depends on whether your users have gas and which token standards they support. 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 a TransferWithAuthorization 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.
The authorization 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 supports permit() 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.
Response is 202 Accepted with { id, status: "PENDING" }. Status transitions PENDING → PERMIT_SENT → COMPLETED (or FAILED).

Direct transfer

The sender submits a vanilla ERC-20 transfer() to the vault address. Balance monitoring detects when the vault balance reaches the quoted amount and publishes the deposit intent.
No signature, no API call beyond the initial POST to obtain the vault. The sender pays gas.

Polling

For gasless transfers, poll the relayer job:
For any method, poll the vault status to track the deposit itself:
Typical client: poll every few seconds until the job is 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:
  • to isn’t a known quoted vault (or legacy deposit address) on chainId
  • The quoted vault isn’t in a fundable state, or its quote deadline has passed
  • USDC isn’t configured for chainId
  • Permit deadline is in the past, ERC-3009 validBefore is less than a minute in the future, or validAfter is in the future
  • value is below the vault’s quoted amount, or the signer’s USDC balance is less than value
  • Signature, nonce, or address fields don’t match the expected shapes (see Validation rules)
On failure after queueing, the job record captures the error and moves to FAILED; the transaction is never retried automatically.