Skip to main content
This guide shows how to create a programmable address that automatically bridges USDC from Base to a Solana wallet. Programmable addresses are live today with Base → Solana USDC bridging as the first programmable action. The contracts are deployed, the system monitors for deposits, and funds route automatically. Additional chains and tokens will be added over time. In this quickstart, you will:
1

Generate a programmable address

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

Send USDC

Transfer USDC to your programmable address on Base.
3

Receive on Solana

The pre-programmed action executes automatically—solvers fulfill the intent on Solana.

Step 1: Generate a Programmable Address

Call the API to generate a programmable 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 programmable address—where you’ll send tokens.

Step 2: Send Tokens

Transfer USDC to your programmable 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 programmable 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 programmable address, the pre-programmed 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 programmable 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"
}