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

# Program addresses

> Canonical Raydium program IDs and shared PDAs on Solana mainnet-beta and devnet. Every other page links here instead of hardcoding addresses.

<Info>
  **Source of truth.** This page is the only place in the docs that lists program addresses verbatim. Other pages link here. If an ID changes, update it **only here** and every reference in the site stays consistent.

  Always cross-check values against the live API (`https://api-v3.raydium.io/main/info`) before signing real transactions.
</Info>

## Mainnet-beta

<Tip>
  Rule of thumb: if a program ID in the wild does not match the table below, **do not sign the transaction.** A mismatched program ID is the single easiest way to lose funds on Solana.
</Tip>

### On-chain programs

| Program                                     | Program ID                                     | Source                                                           |
| ------------------------------------------- | ---------------------------------------------- | ---------------------------------------------------------------- |
| **AMM v4** (Hybrid AMM + OpenBook)          | `675kPX9MHTjS2zt1qfr1NYHuzeLXfQM9H24wFSUt1Mp8` | [raydium-amm](https://github.com/raydium-io/raydium-amm)         |
| **CPMM** (Standard AMM)                     | `CPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C` | [raydium-cp-swap](https://github.com/raydium-io/raydium-cp-swap) |
| **CLMM** (Concentrated Liquidity)           | `CAMMCzo5YL8w4VFF8KVHrK22GGUsp5VTaW7grrKgrWqK` | [raydium-clmm](https://github.com/raydium-io/raydium-clmm)       |
| **Stable AMM** (StableSwap-style curve)     | `5quBtoiQqxF9Jv6KYKctB59NT3gtJD2Y65kdnB1Uev3h` | source not publicly available                                    |
| **Farm v3** (legacy RAY staking)            | `EhhTKczWMGQt46ynNeRX1WfeagwwJd7ufHvCDjRxjo5Q` | source not publicly available                                    |
| **Farm v5** (legacy ecosystem farms)        | `9KEPoZmtHUrBbhWN1v1KWLMkkvwY6WLtAVUCPRtRjP4z` | source not publicly available                                    |
| **Farm v6** (current ecosystem farms)       | `FarmqiPv5eAj3j1GMdMCMUGXqPUvmquZtMy86QH6rzhG` | source not publicly available                                    |
| **LaunchLab**                               | `LanMV9sAd7wArD4vJFi2qDdfnVhFxYSUg6eADduJ3uj`  | source not publicly available                                    |
| **AMM Routing** (Raydium's on-chain router) | `routeUGWgWzqBWFcrCfv8tritsqukccJPu3q5GPP3xS`  | source not publicly available                                    |
| **Burn & Earn / LP Lock**                   | `LockrWmn6K5twhz3y9w1dQERbmgSaRkfnTeTKbpofwE`  | source not publicly available                                    |

Notes:

* AMM v4 and Farm v3/v5 are **retained for existing pools and positions**. The Raydium UI and SDK route new pool creation and new ecosystem farms to CPMM, CLMM, and Farm v6 respectively — see [`protocol-overview/versions-and-migration`](/protocol-overview/versions-and-migration).
* The Farm v3 ID above doubles as the \$RAY single-asset staking program. Behavior is identical to Farm v3 for LP staking.
* **Stable AMM** is a separate program that the AMM Routing program can target alongside AMM v4, CPMM, and CLMM. Liquidity is thin compared to the other three programs and the SDK does not expose a first-class API for it; integrators that route through it generally do so via the router.
* **Source-code availability.** Of the on-chain programs above, only `raydium-amm` (AMM v4), `raydium-cp-swap` (CPMM), and `raydium-clmm` (CLMM) ship with public source repositories under [`github.com/raydium-io`](https://github.com/raydium-io). Stable AMM, LaunchLab, AMM Routing, Burn & Earn / LP Lock, and the Farm programs are not publicly available — verify them against the live API, the on-chain bytecode, and the published IDLs in [`raydium-io/raydium-idl`](https://github.com/raydium-io/raydium-idl) instead.

### Shared admin authority

All Anchor-based programs (CLMM, CPMM, LaunchLab, Lock) share a single hardcoded admin `Pubkey` for instruction-level access control to admin paths (such as `CreateAmmConfig` or `UpdatePoolStatus`):

| Cluster      | Admin                                          |
| ------------ | ---------------------------------------------- |
| mainnet-beta | `GThUX1Atko4tqhN2NaiTazWSeFWMuiUvfFnyJyUghFMJ` |
| devnet       | `DRayqG9RXYi8WHgWEmRQGrUWRWbhjYWYkCRJDd6JBBak` |

Account-level operational authorities (e.g. `protocol_owner`, `fund_owner` on CPMM/CLMM `AmmConfig`, or the migration wallets on LaunchLab `GlobalConfig`) are stored on-chain and may differ from the program admin. Read them directly from the relevant config account before sending high-stakes transactions.

### Shared config / PDA conventions

Several Raydium programs expose **config accounts** whose public keys are stable and listed on the public API. Prefer the API lookup over hardcoding:

```
# CPMM fee configs (returns an array of {id, index, tradeFeeRate, ...})
GET https://api-v3.raydium.io/main/cpmm-config

# CLMM fee configs
GET https://api-v3.raydium.io/main/clmm-config
```

Default CPMM `AmmConfig` index `0` (standard 0.25% pool) fee parameters, for reference:

| Field               | Value    | Meaning                                                  |
| ------------------- | -------- | -------------------------------------------------------- |
| `trade_fee_rate`    | `2500`   | 0.25% of trade volume                                    |
| `protocol_fee_rate` | `120000` | 12% **of the trade fee** (not volume) routed to protocol |
| `fund_fee_rate`     | `40000`  | 4% **of the trade fee** routed to the fund multisig      |
| `creator_fee_rate`  | `500`    | 0.05% of trade volume to the pool creator (optional)     |

See [`products/cpmm/fees`](/products/cpmm/fees) for how the splits compose, and [`reference/fee-comparison`](/reference/fee-comparison) for the cross-product matrix.

### PDA seeds

The seeds below are **canonical** and used by both the SDK and on-chain CPIs. Always compute PDAs; do not hardcode derived addresses.

```ts theme={null}
// CPMM — all seeds are static ASCII strings unless noted.
const [ammConfig]   = PublicKey.findProgramAddressSync(
  [Buffer.from("amm_config"), u16ToBytes(index)],
  CPMM_PROGRAM_ID,
);
const [authority]   = PublicKey.findProgramAddressSync(
  [Buffer.from("vault_and_lp_mint_auth_seed")],
  CPMM_PROGRAM_ID,
);
const [poolState]   = PublicKey.findProgramAddressSync(
  [Buffer.from("pool"), ammConfig.toBuffer(), token0Mint.toBuffer(), token1Mint.toBuffer()],
  CPMM_PROGRAM_ID,
);
const [lpMint]      = PublicKey.findProgramAddressSync(
  [Buffer.from("pool_lp_mint"), poolState.toBuffer()],
  CPMM_PROGRAM_ID,
);
const [vault0]      = PublicKey.findProgramAddressSync(
  [Buffer.from("pool_vault"), poolState.toBuffer(), token0Mint.toBuffer()],
  CPMM_PROGRAM_ID,
);
const [vault1]      = PublicKey.findProgramAddressSync(
  [Buffer.from("pool_vault"), poolState.toBuffer(), token1Mint.toBuffer()],
  CPMM_PROGRAM_ID,
);
const [observation] = PublicKey.findProgramAddressSync(
  [Buffer.from("observation"), poolState.toBuffer()],
  CPMM_PROGRAM_ID,
);
```

`token0Mint` / `token1Mint` are **sorted by public-key byte order** (token0 \< token1) before hashing. Getting this wrong yields a valid PDA for a non-existent pool.

The equivalent CLMM seeds follow the same style; see [`products/clmm/accounts`](/products/clmm/accounts).

## Devnet

| Program                   | Program ID                                                                                                              |
| ------------------------- | ----------------------------------------------------------------------------------------------------------------------- |
| **AMM v4**                | `DRaya7Kj3aMWQSy19kSjvmuwq9docCHofyP9kanQGaav`                                                                          |
| **CPMM**                  | `DRaycpLY18LhpbydsBWbVJtxpNv9oXPgjRSfpF2bWpYb`                                                                          |
| **CLMM**                  | `DRayAUgENGQBKVaX8owNhgzkEDyoHTGVEGHVJT1E9pfH`                                                                          |
| **Stable AMM**            | `DRayDdXc1NZQ9C3hRWmoSf8zK4iapgMnjdNZWrfwsP8m`                                                                          |
| **LaunchLab**             | `DRay6fNdQ5J82H7xV6uq2aV3mNrUZ1J4PgSKsWgptcm6`                                                                          |
| **AMM Routing**           | `DRaybByLpbUL57LJARs3j8BitTxVfzBg351EaMr5UTCd`                                                                          |
| **Burn & Earn / LP Lock** | `DLockwT7X7sxtLmGH9g5kmfcjaBtncdbUmi738m5bvQC`                                                                          |
| **Farm v3 / v5 / v6**     | Not reliably published for devnet — confirm via the live API (`https://api-v3-devnet.raydium.io/main/info`) before use. |

Devnet REST API base: `https://api-v3-devnet.raydium.io/` (same route shape as mainnet).

## How to verify an address on-chain

1. **Solana Explorer.** Paste the address into [explorer.solana.com](https://explorer.solana.com) and confirm it's marked `Program` with a current upgrade authority. Mainnet-beta should show deploys signed by Raydium's upgrade authority.
2. **CLI.** Use `solana program show <PROGRAM_ID> -u mainnet-beta` to inspect deploy slot, BPF loader, upgrade authority, and data length. Record these in your runbook.
3. **IDL attachment.** Query the on-chain IDL with `anchor idl fetch <PROGRAM_ID> --provider.cluster mainnet`. The IDL's `address` field should match. The same IDLs are mirrored at [github.com/raydium-io/raydium-idl](https://github.com/raydium-io/raydium-idl) — diff the on-chain IDL against the repo before trusting it.
4. **Config/admin authorities.** For CPMM/CLMM config accounts, read the `owner`/`protocol_owner` field and confirm it matches the current Raydium multisig published in [`security/admin-and-multisig`](/security/admin-and-multisig).

If any of the four checks above disagrees with this page, treat this page as wrong and open an issue before writing new code against the addresses.

## Updating this page

* Changes to program IDs are safety-critical. Do **not** ship a program-ID change without (a) linking to the Raydium announcement, (b) adding an entry in [`reference/changelog`](/reference/changelog), and (c) running a link-check over the docs to confirm no page still references the old value.
* Deprecations stay in the table with a status note rather than being deleted — existing pools still resolve via the old program.

Sources:

* Live API: `https://api-v3.raydium.io/main/info`
* [github.com/raydium-io/raydium-idl](https://github.com/raydium-io/raydium-idl)
* [github.com/raydium-io/raydium-cp-swap](https://github.com/raydium-io/raydium-cp-swap)
