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

# Solana USDC & USDT

> Provision zero-SOL deposit addresses, monitor SPL deposits, and send sponsored USDC or USDT.

Rach's Solana rail supports canonical mainnet **USDC** and **USDT** SPL tokens.
It is separate from the `chain` field used by Polygon, Base, and BNB Smart
Chain: use the dedicated `/v1/solana/*` endpoints.

<Note>
  This guide applies when Solana is enabled for your Rach environment. Check
  `GET /health/ready` first. `solana: INBOUND_READY` means zero-SOL wallet
  provisioning and balance reads passed and receipt monitoring is configured.
  It does **not** prove that the separately operated scanner worker has observed a
  deposit or that a webhook was delivered. With monitoring disabled, Solana reports
  `DEGRADED` even where balance reads work. `solana: READY` additionally permits
  sponsored sends. Treat a confirmed deposit record or signed `transfer.received`
  webhook as evidence of an observed credit.
</Note>

## What your customer needs

Nothing native. Rach pays the Solana transaction fee and creates the customer's
USDC and USDT Associated Token Accounts (ATAs) before a provision request
succeeds. Your customer can receive, hold, and send USDC/USDT while their owner
address holds **0 SOL**.

This differs from an ordinary raw Solana address: SPL tokens need a recipient
token account, and many exchanges will not create one for an empty recipient.
Rach creates both supported ATAs first, so the address is ready for USDC and
USDT deposits from the moment you receive it.

## 1. Provision a deposit-ready customer address

```bash theme={null}
curl -X POST https://api.rach.finance/caas/v1/solana/users/provision \
  -H "X-API-Key: $RACH_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"phone_number":"+2250700000001"}'
```

```json theme={null}
{
  "address": "7EqQdEULxWcraVx3mXKFjc84LhCkMGZCkRuDpvcMwJeK",
  "network": "mainnet-beta",
  "chain": "solana",
  "status": "PROVISIONED",
  "token_accounts": {
    "USDC": "<derived-USDC-ATA>",
    "USDT": "<derived-USDT-ATA>"
  },
  "token_accounts_ready": true,
  "sponsorship": "Rach funded the USDC and USDT token-account rent; the customer needs no SOL."
}
```

Only use an address for deposits when `token_accounts_ready` is `true`. A `503`
means Rach's sponsor capacity is being restored; retry the **same** provision
request before giving the address to your customer or an exchange. The retry
uses the same customer key and idempotent ATA creation.

Use `address` as the customer's normal Solana owner address. The ATA values are
included for a deposit provider that explicitly asks for a token-account
address. They are deterministic and belong to the customer, not to Rach.

## 2. Read both balances

```bash theme={null}
curl "https://api.rach.finance/caas/v1/solana/users/balance?phone_number=%2B2250700000001" \
  -H "X-API-Key: $RACH_API_KEY"
```

```json theme={null}
{
  "address": "7EqQdEULxWcraVx3mXKFjc84LhCkMGZCkRuDpvcMwJeK",
  "network": "mainnet-beta",
  "chain": "solana",
  "balance_usdc": "12.500000",
  "balance_usdt": "0.000000"
}
```

Amounts are decimal strings with six decimal places. The rail recognizes only
canonical SPL USDC and USDT; a native SOL balance or another SPL mint is not a
CaaS balance and is not available through this endpoint. For privacy, this
endpoint returns an unlinked wallet as not provisioned; use the customer consent
linking flow before reading or sending from a wallet another business created.

## 3. Receive and reconcile deposits

When receipt monitoring is enabled for your environment, Rach scans finalized
Solana receipts and writes an immutable deposit record before it sends
`transfer.received`. The notification is at-least-once, so deduplicate on
`transfer_id`—the durable Rach deposit UUID—not on the Solana signature alone.
One Solana transaction can credit USDC and USDT, or more than one customer
account. Do not treat health status alone as proof of a specific deposit.

```json theme={null}
{
  "event": "transfer.received",
  "transfer_id": "b5ecb7ac-…",
  "recipient_wallet": "7EqQdEULxWcraVx3mXKFjc84LhCkMGZCkRuDpvcMwJeK",
  "amount_usdc": "25.000000",
  "amount": "25.000000",
  "token": "USDT",
  "tx_hash": "5tJx…",
  "tx_id": "5tJx…",
  "network": "mainnet-beta",
  "settled_at": "2026-09-03T12:00:00Z"
}
```

Every business currently authorized to operate the wallet receives the same
receipt event. Verify the normal `X-Rach-Signature` HMAC and keep webhook
processing idempotent; see [Webhooks](/guides/webhooks).

## 4. Send USDC or USDT without customer SOL

Once readiness reports `solana: READY`, submit a sponsored send:

```bash theme={null}
curl -X POST https://api.rach.finance/caas/v1/solana/transfers/send \
  -H "X-API-Key: $RACH_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "sender_phone": "+2250700000001",
    "recipient_address": "7EqQdEULxWcraVx3mXKFjc84LhCkMGZCkRuDpvcMwJeK",
    "token": "USDC",
    "amount": "25.500000",
    "idempotency_key": "payout_20260903_001"
  }'
```

The customer signs only as the SPL token authority. Rach is the transaction fee
payer. If the recipient does not yet have the requested token account, Rach
creates it in the same transaction and the final transfer includes
`created_recipient_ata: true`.

Use a normal **on-curve** wallet address as `recipient_address`; Rach rejects
program-derived addresses because funds sent to one can be unrecoverable to a
customer. Reuse the same `idempotency_key` on every retry. `SETTLED` and
`FAILED` are terminal; never issue a new key while a transfer is `QUEUED`,
`SUBMITTING`, `SUBMITTED`, or `SUBMISSION_UNKNOWN`.

## Fees and boundaries

Rach sponsors Solana network and ATA costs in this release. There is no hidden
native-Solana product fee deducted from the transfer amount. A product fee would
require an explicit business policy and is not inferred from EVM merchant-pricing
settings.

The current rail does **not** support native SOL payments, SOL swaps, or a
Solana swap program. Use it for USDC/USDT deposits, balances, and sponsored
outbound SPL transfers only.
