Skip to main content

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.

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:
  • 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

EnvironmentSource chainsDestination
MainnetBase, Optimism, ArbitrumGateway on Polygon
Testnet (preproduction)Base Sepolia, OP Sepolia, Arb SepoliaGateway on Polygon Amoy
Any Gateway-enabled chain can be added. Ask if you need a chain that isn’t listed.

Environments

EnvironmentBase URLTest app
Mainnethttps://deposit-addresses.eco.comhttps://gateway.eco.com/
Preproduction (testnet)https://deposit-addresses-preproduction.eco.comhttps://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 (or permit + createIntentWithApproval) call on the source chain.
  • The Eco solver service pays gas for the final Gateway deposit on Polygon.
For direct transfers, the sender pays source-chain gas; Eco still covers deployment (first deposit) and intent publication.

Quickstart

1

Generate the deposit address

POST /api/v1/depositAddresses/gateway/polygon with the depositor and recipient.
2

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.
3

Poll for completion

Hit GET /api/v1/gasless/jobs/{id} (gasless) or read the deposit record / intent status (direct transfer).

Step 1: Generate a Gateway deposit address

curl -X POST https://deposit-addresses.eco.com/api/v1/depositAddresses/gateway/polygon \
  -H "Content-Type: application/json" \
  -d '{
    "chainId": 8453,
    "depositor": "0xYourWalletAddress",
    "evmDestinationAddress": "0xRecipientOnGateway"
  }'
Swap the base URL for https://deposit-addresses-preproduction.eco.com and chainId for 84532 (Base Sepolia), 11155420 (OP Sepolia), or 421614 (Arb Sepolia) to target preproduction.
FieldTypeDescription
chainIdnumberSource chain (one of the supported chains above)
depositorstringEVM address authorized for refunds
evmDestinationAddressstringRecipient credited on Gateway (Polygon)
Response (201 Created):
{
  "data": {
    "evmDepositAddress": "0x...",
    "isDeployed": false,
    "createdAt": "..."
  }
}
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.
Have the user sign an EIP-712 TransferWithAuthorization over the USDC contract, then post it:
curl -X POST https://deposit-addresses.eco.com/api/v1/gasless/transferWithAuthorization \
  -H "Content-Type: application/json" \
  -d '{
    "chainId": 8453,
    "from": "0xSignerAddress",
    "to": "0xDepositAddress",
    "value": "1000000",
    "validAfter": "0",
    "validBefore": "1776098178",
    "nonce": "0x<random-32-bytes>",
    "signature": "0x<65-byte-eip712-signature>"
  }'
Response (202 Accepted):
{ "data": { "id": "<job-id>", "status": "PENDING" } }
See Deposit methods for signing code, the Permit variant, and field-by-field details.

Step 3: Poll for completion

For gasless transfers, poll the job:
curl https://deposit-addresses.eco.com/api/v1/gasless/jobs/<job-id>
Status transitions: PENDINGCOMPLETED 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

Three options:
  1. 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).
  2. Poll the deposit address record via GET /api/v1/depositAddresses/evmAddress/{address} (includes lastCheckedBalance, isDeployed, deploymentTxHash).
  3. Poll Circle Gateway directly against the recipient address.
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.
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.
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.
On Base Sepolia → Polygon Amoy we typically see 20–40 seconds from submission to Gateway balance update. Time scales with source-chain finality.
ERC-3009 transferWithAuthorization — single transaction, cleaner UX, USDC-native. Use Permit if the token you’re working with supports permit() but not ERC-3009.
Any Gateway-enabled chain. Today, mainnet is Base / Optimism / Arbitrum; preproduction is their Sepolia / Amoy equivalents. Ask if you need a chain added.
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.