> ## Documentation Index
> Fetch the complete documentation index at: https://docs.eco.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Solana deposit addresses

> Create a Base deposit address for USDC delivery to a Solana wallet.

A Solana deposit address receives USDC on Base. Eco's service monitors the address, deploys its deposit contract when needed, and submits an intent for delivery to the configured Solana recipient. The sender signs a regular ERC-20 transfer and pays its source-chain gas.

This guide describes the static v1 deposit-address API. Newer service versions support deprecation notices and a `410` response when its sunset is enabled. For a new integration, confirm availability and migration guidance with Eco; use any replacement path supplied by the service rather than assuming another product has the same behavior.

## Prerequisites

* A recipient Solana wallet address
* An EVM depositor address, used as the intent's refund recipient
* Base USDC and ETH for the sender's transfer
* Node.js 22.18 or later and `viem` for the API example

This guide covers Base (`8453`) as the source. Check [chain support](/resources/supported-chains-tokens) before integrating; support in the Routes API does not imply that a deposit factory is configured for the same chain.

## API conventions

Base URL: `https://deposit-addresses.eco.com`. No API key is required. Successful responses use a `{ data: ... }` envelope. No requests-per-second quota is published; back off on `429` and honor `Retry-After` when present.

The [Solana deposit API reference](/api-reference/programmable-addresses/solana-overview) links to the request and response schemas. This API has a different address lifecycle from [Circle Gateway deposits](/programmable-addresses/circle-gateway-deposits).

## Request a deposit address

Set `ECO_SOLANA_RECIPIENT` to the recipient wallet's base58 address and `ECO_DEPOSITOR` to the EVM refund address. The example creates an address and reads its record; it does not transfer tokens.

```typescript theme={null}
import process from 'node:process';
import { getAddress } from 'viem';

type DepositRecord = {
  evmDepositAddress: string;
  factoryAddress: string;
  isDeployed: boolean;
  lastCheckedBalance: string;
};

async function main(): Promise<void> {
  const solanaAddress = process.env.ECO_SOLANA_RECIPIENT;
  const depositor = process.env.ECO_DEPOSITOR;
  if (!solanaAddress || !depositor) {
    throw new Error('Set ECO_SOLANA_RECIPIENT and ECO_DEPOSITOR');
  }

  async function request(path: string, body?: unknown): Promise<DepositRecord> {
    const response = await fetch(`https://deposit-addresses.eco.com${path}`, {
      method: body === undefined ? 'GET' : 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: body === undefined ? undefined : JSON.stringify(body),
      signal: AbortSignal.timeout(30_000),
    });
    const text = await response.text();
    if (!response.ok) throw new Error(`HTTP ${response.status}: ${text}`);
    return (JSON.parse(text) as { data: DepositRecord }).data;
  }

  const deposit = await request('/api/v1/depositAddresses/solana', {
    chainId: 8453,
    solanaAddress,
    depositor: getAddress(depositor),
  });
  console.log(deposit);
  console.log(await request(
    `/api/v1/depositAddresses/evmAddress/${deposit.evmDepositAddress}`,
  ));
}

main().catch((error: unknown) => {
  console.error(error instanceof Error ? error.message : error);
  process.exitCode = 1;
});
```

A successful create request returns `201`; a record lookup returns `200`. Both return the deposit record under `data`, including `evmDepositAddress`, `factoryAddress`, `isDeployed`, and the last observed balance. The API stores `solanaAddress` as the hexadecimal encoding of the submitted public key.

The address is deterministic for the configured factory, destination, and depositor. It can exist as a predicted address before its contract is deployed. Keep the source chain and returned factory address with your record.

## Send USDC

Transfer Base USDC (`0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913`) to the returned `evmDepositAddress`. For example, 100 USDC is `100000000` base units. Estimate gas for the ERC-20 transfer and check its receipt before recording source funding as successful.

The monitoring service then detects the token balance, deploys the contract if needed, and calls `createIntent()`. The transfer itself does not invoke or deploy the deposit contract.

## Check processing and delivery

Use `GET /api/v1/depositAddresses/evmAddress/{evmAddress}` to inspect processing:

| Field | Meaning |
| - | - |
| `isDeployed` | Whether the deposit contract is deployed |
| `lastCheckedBalance` | Source-token balance at the service's last check |
| `lastBalanceCheckAt` | Time of that balance observation |
| `deploymentTxHash` | Deployment transaction, when recorded |

These fields do not prove Solana delivery. Confirm the recipient's USDC token-account balance and destination transaction separately. If you obtain the published intent hash, you can also query the [intent status API](/api-reference/v1/intent-status) using a v1 key.

## Errors and troubleshooting

A read-only check on 2026-09-30 (UTC) received `503 Service Temporarily Unavailable` from this service. Confirm availability before presenting a new deposit flow to users; that response does not establish the state of any previously funded deposit.

Validation failures return `400`. For example, an invalid Solana address can produce:

```json theme={null}
{
  "statusCode": 400,
  "createdBy": "ValidationFilter",
  "validationErrors": {
    "solanaAddress": "solanaAddress must be a valid base58 Solana address"
  }
}
```

Business errors also use `400` with a `details` envelope. An unknown deposit address uses `NoSuchDepositAddress`:

```json theme={null}
{
  "statusCode": 400,
  "createdBy": "HttpExceptionFilter",
  "details": {
    "errorCode": 1014,
    "errorDesc": "NoSuchDepositAddress",
    "cause": "NoSuchDepositAddress"
  }
}
```

An unconfigured source-chain factory reports `FactoryAddressNotConfiguredForChain` (`1016`). Check the chain and address before retrying. On network failure, retry the same address request; do not send a second token transfer solely because processing is delayed.

## Next steps

* [Solana deposit API reference](/api-reference/programmable-addresses/solana-overview)
* [Factory and address derivation](/programmable-addresses/architecture/factory-contract)
* [Deposit contract and refund behavior](/programmable-addresses/architecture/deposit-contract)
