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

# Solana — Programs & Addresses

> The program IDs, PDAs, and mint addresses you need to trade RWA tokens on Solana.

On Solana you trade against the **`rwa_market`** program. Per-asset state lives in
**PDAs keyed by the SPL mint** — the mint address is effectively the "token id", and you
derive every account you need from it. Tokens are **Token-2022** mints.

## Program IDs (same on every cluster)

A program id equals its deploy keypair's pubkey, so **the same id is used on
devnet/testnet/mainnet**.

| Program      | Program ID                                     | What you use it for                             |
| ------------ | ---------------------------------------------- | ----------------------------------------------- |
| `rwa_market` | `Fv7op93iVyTGKVeD3bQvh3dsi6u5g8ULyvvg48dRqWqe` | `buy` / `sell`, read the price                  |
| `rwa_token`  | `8eiSiyHwkB3s5x4jNEWrfnPFyWULYMRApFe8ungsu9Gy` | read asset terms & payout token                 |
| `rwa_exit`   | `7q7cns2MDf2sNVtwGHczub2oTrz8YjqFutEHHJZuQKqc` | `claim` at redemption                           |
| `rwa_vault`  | `A5SYMN5DGKWo8oPwDgWUxCZHZA7TaCkLbguSrLiWc91`  | derive the vault token accounts a trade touches |

## Per-cluster addresses

Only the RPC endpoint and the payment-token mints differ per cluster.

|                              | Devnet                                         | Mainnet-beta                                   |
| ---------------------------- | ---------------------------------------------- | ---------------------------------------------- |
| RPC (default)                | `https://api.devnet.solana.com`                | `https://api.mainnet-beta.solana.com`          |
| USDC mint (SPL Token, 6 dp)  | `4zMMC9srt5Ri5X14GAgXhaHii3GnPAEERYPJgZJDncDU` | `EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v` |
| CNGN mint (Token-2022, 6 dp) | `HfJWS8vJHvxKn5xW3uLXkTmEy4jny3G45QnS1Eab5sg`  | `3jiqwBQVRC5zRwHyqvnkQurebJ5RNxg3F5fXMwaxgkv8` |

<Note>
  Which payment mint applies is per-asset — read `payout_token` from the token's
  `TokenMeta` before trading.
</Note>

## Tradeable RWA tokens (devnet)

Only assets with a Solana mint can be traded here. **`DPRI` is currently the only asset
live on Solana** — the others are EVM-only, so they have no mint on this cluster.

| Symbol | Asset                          | SPL mint                                       |
| ------ | ------------------------------ | ---------------------------------------------- |
| DPRI   | Dangote Petroleum Refinery IPO | `Fvdk1zV7WqfDBxg5S4qcyaF7TCuABAso6KcRR8Nnvdya` |
| NTBL   | Nigerian Treasury Bill         | *EVM-only — no Solana mint*                    |
| CHDNRE | Chapel Hill Denham NREIT       | *EVM-only — no Solana mint*                    |
| ANMF   | ARM NGN Mutual Fund            | *EVM-only — no Solana mint*                    |

## Deriving the accounts you need

Every per-asset account is a PDA of a constant seed + the SPL mint pubkey.

| PDA               | Program      | Seeds             | Why you need it                             |
| ----------------- | ------------ | ----------------- | ------------------------------------------- |
| `Asset` (listing) | `rwa_market` | `["asset", mint]` | holds price/fee; passed to `buy`/`sell`     |
| `TokenMeta`       | `rwa_token`  | `["meta", mint]`  | read `payout_token`, decimals, terms        |
| `Vault`           | `rwa_vault`  | `["vault", mint]` | owns the vault token accounts a trade moves |
| `ExitState`       | `rwa_exit`   | `["exit", mint]`  | passed to `claim` at redemption             |

```js theme={null}
// @solana/web3.js
const [assetPda] = PublicKey.findProgramAddressSync([Buffer.from("asset"), mint.toBuffer()], RWA_MARKET_PROGRAM_ID);
const [metaPda]  = PublicKey.findProgramAddressSync([Buffer.from("meta"),  mint.toBuffer()], RWA_TOKEN_PROGRAM_ID);
const [vaultPda] = PublicKey.findProgramAddressSync([Buffer.from("vault"), mint.toBuffer()], RWA_VAULT_PROGRAM_ID);
const [exitPda]  = PublicKey.findProgramAddressSync([Buffer.from("exit"),  mint.toBuffer()], RWA_EXIT_PROGRAM_ID);
```
