Deposit USDC into Circle Gateway on Polygon from any supported source chain, using Eco orchestration to route Gateway deposits through fast-finality chains like Polygon. The destination Gateway balance updates in typically 20–40 seconds and the user does not need to hold source-chain gas — they sign an ERC-3009 authorization and Eco broadcasts. Three properties define the system:Documentation Index
Fetch the complete documentation index at: https://eco.com/docs/llms.txt
Use this file to discover all available pages before exploring further.
- Non-custodial: Eco never holds user funds. Each deposit address is a deterministic contract whose only operation is to publish a Routes intent. If the intent expires unfulfilled, an independent, permissionless refund service returns funds to the depositor.
- Permissionless: Any wallet or application can generate a deposit address via the API. No whitelisting, no KYC gate.
- Immutable: The address is CREATE2-derived from
(depositor, evmDestinationAddress, chainId)— the same inputs always produce the same address, and it can be shared before it’s deployed.
Supported chains
| Environment | Source chains | Destination |
|---|---|---|
| Mainnet | Base, Optimism, Arbitrum | Gateway on Polygon |
| Testnet (preproduction) | Base Sepolia, OP Sepolia, Arb Sepolia | Gateway on Polygon Amoy |
Environments
| Environment | Base URL | Test app |
|---|---|---|
| Mainnet | https://deposit-addresses.eco.com | https://gateway.eco.com/ |
| Preproduction (testnet) | https://deposit-addresses-preproduction.eco.com | https://deposit-addresses-sandbox.vercel.app/ |
How it works
When funds arrive, the deposit contract publishes two intents: a local intent that handles the CCTP leg and a second intent that credits the user’s Gateway balance on Polygon. Solvers compete to fulfill.Who pays gas
Under the gasless flow, the user pays nothing:- The deposit address service pays gas for the USDC
transferWithAuthorization(orpermit+createIntentWithApproval) call on the source chain. - The Eco solver service pays gas for the final Gateway deposit on Polygon.
Quickstart
Generate the deposit address
POST /api/v1/depositAddresses/gateway/polygon with the depositor and recipient.Fund it — gasless or direct
Collect an ERC-3009 signature and call
POST /api/v1/gasless/transferWithAuthorization, or just do a vanilla ERC-20 transfer.Step 1: Generate a Gateway deposit address
https://deposit-addresses-preproduction.eco.com and chainId for 84532 (Base Sepolia), 11155420 (OP Sepolia), or 421614 (Arb Sepolia) to target preproduction.
| Field | Type | Description |
|---|---|---|
chainId | number | Source chain (one of the supported chains above) |
depositor | string | EVM address authorized for refunds |
evmDestinationAddress | string | Recipient credited on Gateway (Polygon) |
201 Created):
evmDepositAddress is deterministic — the same inputs always return the same address, so you can surface it to users or embed it before it’s deployed on-chain.
Step 2: Fund the address
Three ways — pick one:- ERC-3009
transferWithAuthorization(recommended for gasless UX). Single transaction, no user gas. - EIP-2612 Permit. Two transactions (
permit()+createIntentWithApproval()), no user gas. - Direct ERC-20 transfer. Sender pays gas.
Recommended: ERC-3009 gasless transfer
Have the user sign an EIP-712TransferWithAuthorization over the USDC contract, then post it:
202 Accepted):
Step 3: Poll for completion
For gasless transfers, poll the job:PENDING → COMPLETED or FAILED. The response includes transferTxHash and intentHash when complete.
To confirm the deposit reached Gateway, you have three options (covered in the FAQ below): poll the Routes intent status, read the deposit address’s balance record, or query Circle Gateway’s balance API directly.
FAQ
How do I know when funds have landed in Gateway?
How do I know when funds have landed in Gateway?
Three options:
- Poll the Routes intent status via
POST /api/v1/intents/intentStatus(returns both the CCTP leg and the Gateway-deposit leg as an ordered array — see the API reference). - Poll the deposit address record via
GET /api/v1/depositAddresses/evmAddress/{address}(includeslastCheckedBalance,isDeployed,deploymentTxHash). - Poll Circle Gateway directly against the recipient address.
What happens if the gasless job ends up `FAILED`?
What happens if the gasless job ends up `FAILED`?
Nothing.
FAILED means the service couldn’t initiate the transfer (e.g. signature invalid, balance dropped, deadline expired). USDC never left the user’s wallet. The signature just expires — submit a new one to retry.What if USDC arrives at the deposit address but the deposit to Gateway never happens?
What if USDC arrives at the deposit address but the deposit to Gateway never happens?
The deposit address service monitors the deposit contract for any balance and publishes an intent with that balance. The intent carries a ~4-hour deadline (reducible). If Eco’s protocol doesn’t fulfill it in time, an independent, permissionless refund service returns the USDC to the depositor. You (or anyone) can also drive both steps yourself — intent creation and refund are permissionless.
What if USDC gets bridged via CCTP but doesn't land in Gateway?
What if USDC gets bridged via CCTP but doesn't land in Gateway?
CCTP-bridged tokens are minted straight into a Routes intent vault, not into a floating account. The same refund path applies: after the deadline elapses, the refund service unlocks the vault and returns funds to the depositor.
How fast is end-to-end?
How fast is end-to-end?
On Base Sepolia → Polygon Amoy we typically see 20–40 seconds from submission to Gateway balance update. Time scales with source-chain finality.
Permit vs ERC-3009 — which should I prefer?
Permit vs ERC-3009 — which should I prefer?
ERC-3009
transferWithAuthorization — single transaction, cleaner UX, USDC-native. Use Permit if the token you’re working with supports permit() but not ERC-3009.Which source chains can I use?
Which source chains can I use?
Any Gateway-enabled chain. Today, mainnet is Base / Optimism / Arbitrum; preproduction is their Sepolia / Amoy equivalents. Ask if you need a chain added.
Is the deposit address the same every time?
Is the deposit address the same every time?
Yes — it’s a deterministic CREATE2 address derived from
(depositor, evmDestinationAddress, chainId). Calling the endpoint again with identical inputs returns the same evmDepositAddress.Security
- Contracts are deployed per user, deterministically derived. No shared contract state.
- The only operation a deposit address can perform is
createIntent(). It cannot be drained, redirected, or upgraded. - Refunds are driven by an independent, permissionless service. Funds cannot be stuck.
- No AMB (Arbitrary Message Bridge). Settlement uses Circle’s CCTP.
- Security model = CCTP transfer security + contract-level operation constraints.
- Full audit reports (Cantina) available on request.
- Eco never holds or touches user funds.
Next steps
Deposit methods
EIP-712 signing code for ERC-3009 and Permit, plus the direct-transfer path.
API Reference
Every endpoint with request/response shapes, status transitions, and validation rules.
