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

# Solana: ramp liquidity

> How Corridor funds and receives from ramp partners on Solana: USDC TransferChecked plus an SPL Memo carrying the Corridor Reference in one transaction, and an observer that reads it back.

<img src="https://mintcdn.com/corridorapp/YeOtjsXcStLLcZ_W/images/chains/solana.svg?fit=max&auto=format&n=YeOtjsXcStLLcZ_W&q=85&s=1f02bb5a523f35db49b138ad27b56989" alt="Solana" width="56" height="56" data-path="images/chains/solana.svg" />

Solana is where most ramp partners hold USDC liquidity. Corridor keeps two vaults there: **egress** (funds partner payouts) and **ingress** (receives collections). Every transfer carries the Corridor Reference.

## The transaction

One `@solana/kit` transaction does three things atomically:

<Steps>
  <Step title="Create the recipient's USDC account if missing">
    Idempotent associated-token-account creation, so a first-time partner deposit address works.
  </Step>

  <Step title="TransferChecked">
    USDC from the vault to the partner's one-off funding address, amount and decimals checked by the token program.
  </Step>

  <Step title="SPL Memo">
    `corridor:<hex>`: the 32-byte reference as hex, logged by the Memo program.
  </Step>
</Steps>

```ts theme={"dark"}
const vault = new SolanaVault(signer, "devnet");
const signature = await vault.transferWithReference({
  toOwner: fundingAddress,      // partner's one-off deposit address
  amount: 2_000_000n,           // 2 USDC (6 decimals)
  reference: ref,
});
```

## Reading it back

RPC signature lists expose each transaction's memo as `[N] corridor:<hex>`. `extractReference` pulls the reference out, so the observer can join Solana movements to ledger entries without decoding instructions.

`SolanaWatcher` reads amounts from each transaction's pre- and post-token balances, so it sees the real amount and asset of any stablecoin movement, whichever program made it. It needs only an address, which is what a [read-only pilot](/flows/read-only-pilot) runs on.

## Stablecoins

| Stablecoin | Mainnet mint | Token program |
| - | - | - |
| USDC | `EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v` | SPL Token |
| USDT | `Es9vMFrzaCERmJfrF4H2FYD4KCoNkY11McCe8BenwNYB` | SPL Token |
| PYUSD | `2b1kV6DkPAnxd5ixfnxCpjxmKwqjjaYmCZfHsFu24GXo` | Token-2022 |
| EURC | `HzwqbKZw8HxMN6bF2yFZNrht3c2iXXzpKcFu7uBEDKtr` | SPL Token |

Transfers create the recipient's token account and move funds with the mint's own token program, so Token-2022 stablecoins work the same way as SPL ones. The vault signs through any `@solana/kit` transaction signer, including `solanaSigner(...)` from [Keys and signers](/architecture/keys-and-signers).

## Environments

| Cluster | RPC | USDC mint |
| - | - | - |
| Mainnet | `api.mainnet-beta.solana.com` | `EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v` |
| Devnet | `api.devnet.solana.com` | `4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU` |

## Evidence

Partner funding for a EUR → NGN payout on devnet, with the reference in the Memo program logs: [nDGHfRgM…](https://explorer.solana.com/tx/nDGHfRgMgK1Xc8gjE3bqUvgfp5qP13HnP6nTtLQGBSqaLLtdDfg2nXYPEzbHfcwpYjv1xQFedMcRh3KkJyRZicH?cluster=devnet).

When the devnet vault holds USDC, the runtime funds the mock partner with a real transfer; otherwise it records a clearly marked simulated funding reference, so a demo never pretends a transfer happened.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.