> ## 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.

# Anchor IDL

> 找到每個 Raydium 程式的 IDL，以及如何從中重新產生 TS / Rust / Python 用戶端、協議的 IDL 變動政策。

<Info>
  **本頁內容由 AI 自動翻譯，所有內容以英文版本為準。**

  [查看英文版 →](/sdk-api/anchor-idl)
</Info>

## IDL 是什麼

Solana 上的 Anchor 程式會發布 **IDL**（介面定義語言）檔案，描述其指令、帳戶佈局、錯誤列舉和結構綱要。IDL 是用戶端程式碼產生的真實來源——TS SDK、Rust CPI crate 和第三方用戶端都從中產生（或針對其手動編寫）。

Raydium 為 CPMM、CLMM 和 LaunchLab 發布 IDL。AMM v4、Stable AMM 和 Farm（v3 / v5 / v6）是在 Anchor 之前開發的，或並未使用 Anchor 分發——它們的帳戶結構在 SDK 中手動維護。

## 在哪找到它們

IDL 存放在專用的儲存庫中：

```
https://github.com/raydium-io/raydium-idl
```

具體檔案如下：

| 程式         | IDL 檔案                                                                                                                                                           |
| ---------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| CPMM       | [`raydium_cpmm/raydium_cp_swap.json`](https://github.com/raydium-io/raydium-idl/blob/master/raydium_cpmm/raydium_cp_swap.json)                                   |
| CLMM       | [`raydium_clmm/raydium_clmm.json`](https://github.com/raydium-io/raydium-idl/blob/master/raydium_clmm/raydium_clmm.json)                                         |
| LaunchLab  | [`raydium_launchpad/raydium_launchpad.json`](https://github.com/raydium-io/raydium-idl/blob/master/raydium_launchpad/raydium_launchpad.json)                     |
| AMM v4     | 無官方 IDL——見 [`raydium-sdk-V2/src/raydium/liquidity/layout.ts`](https://github.com/raydium-io/raydium-sdk-V2/blob/master/src/raydium/liquidity/layout.ts) 中手動編寫的佈局 |
| Stable AMM | 無官方 IDL——佈局在 SDK 中                                                                                                                                               |
| Farm       | 無官方 IDL——佈局在 SDK 中                                                                                                                                               |

IDL 檔案在儲存庫的 git 歷史中有版本控制；如需逐字節再現性，請釘選到特定提交。

也可以透過 Anchor 的 **on-chain IDL** 功能直接從已部署的程式提取 IDL（如果程式發布者選擇加入）：

```bash theme={null}
anchor idl fetch <PROGRAM_ID> --provider.cluster mainnet
```

CPMM、CLMM 和 LaunchLab 都有 on-chain IDL。AMM v4、Stable AMM 和 Farm 沒有（Anchor 之前的程式）。

## 重新產生 TypeScript 用戶端

Anchor 的程式碼產生器從 IDL 產生一個型別化用戶端：

```bash theme={null}
# 使用 anchor CLI
anchor build
anchor idl parse \
  --file target/idl/cpmm.json \
  --out target/types/cpmm.ts

# 或在執行時使用 `@coral-xyz/anchor` TS 助手：
```

```ts theme={null}
import { Program, AnchorProvider } from "@coral-xyz/anchor";
// 直接從 raydium-idl 儲存庫提取 IDL（或將其自行提供到你的專案中）。
import cpmmIdl from "./idls/raydium_cp_swap.json";

const provider = new AnchorProvider(connection, wallet, {});
const program  = new Program(cpmmIdl as any, CPMM_PROGRAM_ID, provider);

// 自動產生的型別化方法建構器：
await program.methods
  .swapBaseInput(new BN(amountIn), new BN(minAmountOut))
  .accounts({ ... })
  .rpc();
```

大多數整合者**不會**這樣做——他們使用更高層的 `raydium.cpmm.swap(...)` 助手，包裝 Anchor 方法以及所有簿記（ATA 建立、轉帳費用調整、計算預算、Token-2022 程式路由）。只有當你需要 SDK 下方的層級時才應重新產生。

## 重新產生 Rust 用戶端（CPI crate）

Raydium 為具有 IDL 的程式發布 Anchor crate：

```toml theme={null}
# Cargo.toml
[dependencies]
raydium_cp_swap = { git = "https://github.com/raydium-io/raydium-cp-swap", branch = "master", features = ["cpi"] }
raydium_amm_v3 = { git = "https://github.com/raydium-io/raydium-clmm",    branch = "master", features = ["cpi"] }
```

`cpi` 功能公開 `cpi::accounts::<Ix>` 帳戶結構和 `cpi::<ix>()` 呼叫器——準備好使用的 CPI 包裝器。見 [`sdk-api/rust-cpi`](/zh-Hant/sdk-api/rust-cpi) 以了解用途模式。

如果你更喜歡產生全新的繫結：

```bash theme={null}
# 從 IDL，使用 anchor-client
anchor idl parse \
  --file raydium_cpmm/raydium_cp_swap.json \
  --out src/generated/cpmm_bindings.rs
```

## 重新產生 Python 用戶端

沒有官方的 Raydium Python SDK。第三方產生器包括：

* **`anchorpy`** — `@coral-xyz/anchor` 的 Python 移植。從 IDL 產生型別化方法建構器。
* **`solders`** — 低層級 Solana 基本元素（交易、金鑰對、公開金鑰）以 Rust 繫結；在 `anchorpy` 下使用。

```bash theme={null}
pip install anchorpy solders solana
```

```python theme={null}
from anchorpy import Program, Provider
from solana.rpc.async_api import AsyncClient
from pathlib import Path
import json

idl = json.loads(Path("cpmm.json").read_text())
provider = Provider(AsyncClient("https://api.mainnet-beta.solana.com"), wallet)
program  = Program(idl, CPMM_PROGRAM_ID, provider)

await program.rpc["swap_base_input"](amount_in, min_amount_out, ctx=Context(accounts={...}))
```

見 [`sdk-api/python-integration`](/zh-Hant/sdk-api/python-integration) 以取得更完整的說明。

## IDL 變動政策

Raydium 遵循以下 IDL 穩定性規則：

1. **指令判別器永遠不會改變。** 添加新指令會在列舉末端擴展；現有判別器保持穩定。
2. **帳戶結構佈局僅以加法方式演進。** 新欄位放在末端，前面加上 on-chain 綱要的大小凸起。現有欄位保持其位移。
3. **錯誤列舉代碼僅可追加。** 現有錯誤代碼始終表示同一件事。
4. **破壞性變動在新程式中發送。** 當需要重新設計時，團隊部署一個新程式 ID（例如 CPMM 作為全新程式而不是升級 AMM v4）。舊池繼續在舊程式上運行；新池走向新程式。

此政策使重新產生的用戶端向後相容：根據兩版本舊 IDL 產生的用戶端仍可正確解碼當前狀態（它將額外尾部位元組視為填充）。

## IDL 變動時該做什麼

1. **更新 SDK。** `npm update @raydium-io/raydium-sdk-v2`。
2. **重新產生你的用戶端程式碼**，如果你直接使用 Anchor 程式碼產生。
3. **比較帳戶佈局。** 新佈局的尾部欄位是你的程式碼未見過的唯一東西；確認你是否需要它們。
4. **不要假定舊指令判別器無效。** 根據規則 1，它們仍然有效。
5. **在上線到主網前，對 devnet 重新執行整合測試**。

## IDL 故障排除

### 「無效判別器」錯誤

通常表示使用 IDL 版本 N 建構的用戶端正在嘗試呼叫僅在程式部署前版本中存在的指令。重新提取活動程式的 IDL：

```bash theme={null}
anchor idl fetch <PROGRAM_ID>
```

### 帳戶解碼失敗

如果 `program.account.<Name>.fetch(pubkey)` 拋出「無效帳戶判別器」，則帳戶由前一個程式版本建立，Anchor 拒絕其 8 位元組判別器。修復方法是使用 SDK 中的原始佈局分析器（`PoolInfoLayout.decode(accountData)`），它不強制執行 Anchor 判別器。

### 產生的用戶端中遺漏指令

Anchor 的 TS 程式碼產生器僅為 IDL 項目產生方法，其 `name` 可解析為有效識別符。Raydium 的指令都滿足此條件，但如果你看到不匹配，檢查 IDL 檔案是否來自當前 SDK 版本。

## 指標

* [`sdk-api/rust-cpi`](/zh-Hant/sdk-api/rust-cpi) — 使用 Rust CPI crate。
* [`sdk-api/python-integration`](/zh-Hant/sdk-api/python-integration) — 透過 `anchorpy` 的 Python。
* [`sdk-api/typescript-sdk`](/zh-Hant/sdk-api/typescript-sdk) — 更高層的 TS 用戶端。

來源：

* [Raydium IDL 儲存庫](https://github.com/raydium-io/raydium-idl)
* [Anchor IDL 規格](https://www.anchor-lang.com/docs/idl)
