Skip to main content
Deposit addresses for Solana let users receive USDC on a Solana wallet by sending to a static EVM address on Base. The sender makes a normal ERC-20 transfer. No bridge UI, no approval step, no contract interaction required. 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-preproduction.eco.com/api/v1/depositAddresses \
  -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": {
    "chainId": 8453,
    "evmDepositAddress": "0x...",
    "solanaAddress": "0x...",
    "depositor": "0x...",
    "factoryAddress": "0x...",
    "isDeployed": false,
    "lastCheckedBalance": "0",
    "createdAt": "2026-01-29T12:00:00.000Z"
  }
}
The evmDepositAddress is your deposit address. This is where you’ll send tokens.

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-preproduction.eco.com/api/v1/depositAddresses/evmAddress/0xYOUR_DEPOSIT_ADDRESS
Response:
{
  "data": {
    "chainId": 8453,
    "evmDepositAddress": "0x...",
    "solanaAddress": "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

If the factory is not configured for the specified chain:
{
  "error": "Factory address not configured for chain 8453"
}
If the address is not found:
{
  "error": "Deposit address not found"
}