Register the deposit address
POST /api/v1/depositAddresses/gateway/polygon — returns a deterministic evmDepositAddress.Fund it
POST /api/v1/gasless/transferWithAuthorization (recommended) or POST /api/v1/gasless/permit — returns a jobId.Environments
| Environment | Base URL |
|---|---|
| Mainnet | https://deposit-addresses.eco.com |
| Preproduction (testnet) | https://deposit-addresses-preproduction.eco.com |
{ "data": ... } unless otherwise noted.
Endpoint summary
| Method | Path | Purpose |
|---|---|---|
| POST | /api/v1/depositAddresses/gateway/polygon | Generate a Gateway deposit address (source chain → Polygon) |
| GET | /api/v1/depositAddresses/evmAddress/{evmAddress} | Get deposit address record |
| GET | /api/v1/depositAddresses/query | Query deposit addresses |
| POST | /api/v1/gasless/transferWithAuthorization | Queue a gasless ERC-3009 transfer |
| POST | /api/v1/gasless/permit | Queue a gasless EIP-2612 Permit transfer |
| GET | /api/v1/gasless/jobs/{id} | Poll gasless transfer job status |
| POST | /api/v1/intents/intentStatus | Get status of the underlying Routes intents |
| GET | /api/v1/intents/query | Query intents with filters |
| GET | /api/v1/intents/intentExists | Race-safe existence check for an intent |
1. Register a deposit address
Generate Gateway deposit address (source chain → Polygon)
Routes USDC from the source chain through CCTP to Circle Gateway on Polygon. Same inputs always return the sameevmDepositAddress.
| Field | Type | Description |
|---|---|---|
chainId | number | Source chain ID |
depositor | string | EVM address authorized for refunds if the intent expires |
evmDestinationAddress | string | Recipient credited on Gateway (Polygon) |
8453), Optimism (10), Arbitrum (42161) on mainnet; Base Sepolia (84532), OP Sepolia (11155420), Arb Sepolia (421614) on preproduction.
Response (201 Created):
Get deposit address
isDeployed, lastCheckedBalance, lastBlockNumber, and deploymentTxHash once the contract has been deployed.
Query deposit addresses
chainId, factoryAddress, depositor, evmDepositAddress, isDeployed.
2. Fund the deposit address (gasless)
Two signature-based flows. Both queue the transfer via RabbitMQ (prefetch=1, serialized to prevent operator-wallet nonce collisions), the operator wallet broadcasts, and clients poll /gasless/jobs/{id}.
| Standard | User txs | Notes |
|---|---|---|
ERC-3009 transferWithAuthorization | 0 | Recommended. Single on-chain tx, USDC-native |
| EIP-2612 Permit | 0 | Fallback for tokens that support permit() but not ERC-3009 |
chainId, signer must hold sufficient USDC, and validBefore / deadline must be in the future.
See Deposit methods for EIP-712 signing code.
Queue ERC-3009 transferWithAuthorization
202 Accepted.
| Field | Type | Description |
|---|---|---|
chainId | number | Chain where the transfer executes |
from | string | Token owner (signer) |
to | string | Deposit address receiving the tokens |
value | string | Raw token units (e.g. "1000000" = 1 USDC) |
validAfter | string | Earliest unix second the auth is valid |
validBefore | string | Latest unix second the auth is valid |
nonce | hex | Random bytes32 (replay protection) |
signature | hex | 65-byte ERC-3009 signature (130 hex chars, 0x-prefixed) |
transferWithAuthorization() on USDC moves tokens directly from from to to; the deposit address’s balance monitor then deploys the contract (first time) and publishes the Routes intents.
Queue EIP-2612 Permit transfer
202 Accepted.
| Field | Type | Description |
|---|---|---|
chainId | number | Chain where the transfer executes |
owner | string | Token owner (signer of the permit) |
depositAddress | string | Spender; the deposit address contract |
value | string | Raw token units |
deadline | string | Permit deadline (unix seconds) |
signature | hex | 65-byte EIP-2612 signature |
permit() on USDC, then createIntentWithApproval(funder) on the deposit contract — atomically pulls tokens via transferFrom and publishes the intents.
3. Confirm delivery
Poll gasless job status
PENDING → PERMIT_SENT (Permit flow only) → COMPLETED | FAILED. 404 if the job ID is unknown. FAILED means the service couldn’t initiate the transfer — tokens never left the user’s wallet; the signature just expires.
Get intent status
Once the relayer tx is on-chain, use the intent hash from the job (or from the deposit record) to track fulfillment on Polygon.intentHash, intentCreatedHash, or fulfillmentHash. Limited to 100 results.
Query intents
chainId, depositAddress, intentHash, txHash, fulfilledTxHash, status.
Intent exists
true/false. Supplying txHash enables a race-safe lookup.
Validation rules
- EVM addresses: must pass
isEthereumAddress(EIP-55 / lowercase hex) chainId: integer >= 1value/deadline/validAfter/validBefore: non-negative integer stringsnonce: 0x-prefixed 32-byte hex (64 hex chars)signature: 0x-prefixed 65-byte hex (130 hex chars)
