Skip to main content
Deposit addresses for Solana let users receive USDC on a Solana wallet by sending to a deterministic EVM address on Base. The sender makes a normal ERC-20 transfer. No bridge UI, no approval step, no contract interaction required. Looking for gasless deposits into Circle Gateway instead? See Circle Gateway Deposits. That’s a different product with its own endpoints and supported chains.
For the full REST endpoint reference, see Solana API under the API Reference tab.

Environment

Base URL: https://deposit-addresses.eco.com In this quickstart, you will:
1

Generate a deposit address

Request a deposit address for your Solana wallet via the API.
2

Send USDC

Transfer USDC to your deposit address on Base.
3

Receive on Solana

The deposit address routes funds automatically. Solvers fulfill the intent on Solana.

Step 1: Generate a Deposit Address

Call the API to generate a deposit address for your Solana wallet.
curl -X POST https://deposit-addresses.eco.com/api/v1/depositAddresses/solana \
  -H "Content-Type: application/json" \
  -d '{
    "chainId": 8453,
    "solanaAddress": "YOUR_SOLANA_ADDRESS",
    "depositor": "YOUR_EVM_ADDRESS"
  }'
Request parameters:
FieldTypeDescription
chainIdnumberSource chain ID. Currently only Base (8453) is supported
solanaAddressstringYour Solana wallet address (base58, 32-44 characters)
depositorstringEVM address authorized to claim refunds if the intent expires unfulfilled
Response (201 Created):
{
  "data": {
    "addressID": "573c3006-0e7d-4874-add7-57afe6a98ee6",
    "depositAddressType": "SOLANA",
    "chainId": 8453,
    "evmDepositAddress": "0x...",
    "solanaAddress": "0x...",
    "depositor": "0x...",
    "factoryAddress": "0x...",
    "isDeployed": false,
    "lastCheckedBalance": "0",
    "lastBalanceCheckAt": "1970-01-01T00:00:00.000Z",
    "lastBlockNumber": "0",
    "createdAt": "2026-01-29T12:00:00.000Z",
    "updatedAt": "2026-01-29T12:00:00.000Z"
  }
}
The evmDepositAddress is your deposit address. This is where you’ll send tokens. The address is deterministic: repeating the same request always returns the same address, and you can share it before the contract is deployed onchain. The solanaAddress in the response is the hex encoding of the base58 address you submitted (a 32-byte public key).

Step 2: Send Tokens

Transfer USDC to your deposit address on Base. The sender makes a normal ERC-20 transfer. No special app or bridge UI required.
import { createWalletClient, http, parseUnits } from 'viem';
import { base } from 'viem/chains';

const walletClient = createWalletClient({
  chain: base,
  transport: http()
});

// Transfer USDC to the deposit address
const hash = await walletClient.writeContract({
  address: USDC_ADDRESS,
  abi: erc20Abi,
  functionName: 'transfer',
  args: [
    depositAddress,      // evmDepositAddress from API response
    parseUnits('100', 6) // Amount in token decimals
  ]
});

Step 3: Automatic Processing

Once tokens arrive at the deposit address, the routing logic executes automatically:
  1. Detects the deposit: Balance monitoring detects the incoming tokens
  2. Deploys the contract: If not already deployed, the contract is deployed via the factory
  3. Executes the action: For cross-chain deposits, createIntent() is called
  4. Publishes to Portal: The intent is published to the Routes Portal
  5. Solver fulfillment: Solvers compete to fulfill the intent on Solana

Step 4: Check Status

Query the deposit address to check its status.
curl https://deposit-addresses.eco.com/api/v1/depositAddresses/evmAddress/0xYOUR_DEPOSIT_ADDRESS
Response:
{
  "data": {
    "addressID": "573c3006-0e7d-4874-add7-57afe6a98ee6",
    "depositAddressType": "SOLANA",
    "chainId": 8453,
    "evmDepositAddress": "0x...",
    "solanaAddress": "0x...",
    "depositor": "0x...",
    "factoryAddress": "0x...",
    "isDeployed": true,
    "lastCheckedBalance": "100000000",
    "deploymentTxHash": "0x...",
    "deploymentBlockNumber": "12345678"
  }
}
FieldDescription
isDeployedtrue once the contract is deployed
lastCheckedBalanceCurrent token balance at the address
deploymentTxHashTransaction hash of the contract deployment

Validation rules

The API validates input parameters:
  • solanaAddress: Must be a valid base58 Solana address (32-44 characters)
  • depositor: Must be a valid Ethereum address
  • chainId: Must be a number >= 1

Error handling

Validation failures return 400 with a validationErrors map:
{
  "statusCode": 400,
  "createdBy": "ValidationFilter",
  "validationErrors": {
    "solanaAddress": "solanaAddress must be a valid base58 Solana address"
  }
}
Business errors also return 400, with an error envelope. If the factory is not configured for the specified chain:
{
  "statusCode": 400,
  "createdBy": "HttpExceptionFilter",
  "details": {
    "errorCode": 1016,
    "errorDesc": "FactoryAddressNotConfiguredForChain",
    "cause": "FactoryAddressNotConfiguredForChain"
  }
}
If the address is not found:
{
  "statusCode": 400,
  "createdBy": "HttpExceptionFilter",
  "details": {
    "errorCode": 1014,
    "errorDesc": "NoSuchDepositAddress",
    "cause": "NoSuchDepositAddress"
  }
}