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

> Tempat menemukan IDL setiap program Raydium, cara membuat ulang klien TS / Rust / Python darinya, dan kebijakan perubahan IDL protokol.

<Info>
  **Halaman ini diterjemahkan secara otomatis oleh AI. Versi bahasa Inggris adalah acuan resmi.**

  [Lihat versi bahasa Inggris →](/sdk-api/anchor-idl)
</Info>

## Apa itu IDL

Program Anchor di Solana menerbitkan file **IDL** (Interface Definition Language) yang menjelaskan instruksi, tata letak akun, enum kesalahan, dan skema struct mereka. IDL adalah sumber kebenaran untuk pembuatan kode klien — TS SDK, crate CPI Rust, dan klien pihak ketiga semuanya dihasilkan dari (atau ditulis tangan terhadap) IDL tersebut.

Raydium menerbitkan IDL untuk CPMM, CLMM, dan LaunchLab. AMM v4, Stable AMM, dan Farm (v3 / v5 / v6) mendahului Anchor atau tidak didistribusikan melalui Anchor — struktur akun mereka dipertahankan secara manual di SDK.

## Tempat menemukannya

IDL berada di repositori khusus:

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

File yang tepat:

| Program | File 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 | tidak ada IDL resmi — lihat [`raydium-sdk-V2/src/raydium/liquidity/layout.ts`](https://github.com/raydium-io/raydium-sdk-V2/blob/master/src/raydium/liquidity/layout.ts) untuk tata letak yang ditulis tangan |
| Stable AMM | tidak ada IDL resmi — tata letak di SDK |
| Farm | tidak ada IDL resmi — tata letak di SDK |

File IDL diversi dalam riwayat git repositori; pin ke commit tertentu jika Anda memerlukan reproduktibilitas byte-for-byte.

Beberapa IDL juga dapat ditarik langsung dari mainnet:

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

Sekarang ada **dua** mekanisme IDL on-chain, dan program Raydium terbagi di antara keduanya — yang penting karena versi Anchor CLI tertentu mungkin hanya mengetahui satu:

| Program | Tempat IDL-nya berada | Akun | Laporan |
| - | - | - | - |
| CLMM | Akun `anchor:idl` Anchor warisan | `FbDNAPsgm8Y5jWXQkXjpfN6Bp8xHeRkhMmsstAooPyY9` | `raydium_clmm` 0.1.0 — 38 instruksi, 52 kesalahan (39 / 53 setelah [upgrade 2026-09-30](/id/reference/changelog/2026-09-30-clmm-anchor-1-and-excess-lamports)) |
| LaunchLab | Akun `anchor:idl` Anchor warisan | `E6wT2uNeoWUvDrwdch1R8ETsyewR1ZM4WAwsa5hLJK5Z` | `raydium_launchpad` 0.2.0 — 27 instruksi |
| Lock (Burn & Earn) | Akun `anchor:idl` Anchor warisan | `HzLkUWn57cdtyQNQLJpyu2EPF8qQAiGt4iuiEo1XnEFK` | 4 instruksi (spesifikasi IDL pre-`metadata`) |
| **CPMM** | **Program Metadata program** `ProgM6JCCvbYkfKqJYHePx4xxSUSqJp7rh8Lyv7nk7S` | `FHuJXL7cEttfHk4sXdTAXVaRymBdKfVs7ZH6cMgA1ihk` (kanonik, seed `idl`) | `raydium_cp_swap` 0.2.0 |
| AMM v4, Stable AMM, AMM Routing, Farm v3 / v5 / v6 | Tidak ada | — | Program non-Anchor; tidak ada IDL yang diterbitkan |

<Warning>
  **CPMM tidak memiliki akun `anchor:idl` warisan.** IDL-nya dimigrasikan ke Program Metadata program, jadi `anchor idl fetch CPMMoo8L3F4NbTegBCKVNunggL7H1ZpdTHKxQB5qKP1C` gagal pada Anchor CLI apa pun yang hanya memeriksa PDA warisan. Gunakan IDL yang dikirimkan dengan SDK, atau baca akun metadata di atas, sampai CLI Anda mendukung program metadata.
</Warning>

Ketiga akun IDL warisan dapat ditulis oleh otoritas IDL `2XVnob28A5Qnpcy95UVeHWNT6G8Poy3tpA3AFyAMoZDt`, yang terpisah dari otoritas upgrade BPF program — jadi IDL dapat disegarkan tanpa redeploy, dan juga dapat tertinggal dari redeploy. Perlakukan IDL on-chain sebagai kenyamanan, bukan sebagai bukti bentuk bytecode yang diterapkan.

## Membuat ulang klien TypeScript

Codegen Anchor menghasilkan klien yang diketik dari IDL:

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

# Atau dengan pembantu TS `@anchor-lang/core` saat runtime:
```

```ts theme={null}
import { Program, AnchorProvider } from "@anchor-lang/core";
// Tarik IDL langsung dari repositori raydium-idl (atau vendor ke proyek Anda).
import cpmmIdl from "./idls/raydium_cp_swap.json";

const provider = new AnchorProvider(connection, wallet, {});
// Anchor >= 0.30 membaca id program dari `idl.address` — IDL ini adalah spesifikasi 0.1.0
// dan membawanya. Bentuk tiga argumen `new Program(idl, programId, provider)` adalah
// pre-0.30 dan melempar.
const program  = new Program(cpmmIdl as any, provider);

// Pembuat metode yang diketik dibuat secara otomatis:
await program.methods
  .swapBaseInput(new BN(amountIn), new BN(minAmountOut))
  .accounts({ ... })
  .rpc();
```

Sebagian besar integrator **tidak** melakukan ini — mereka menggunakan pembantu tingkat lebih tinggi `raydium.cpmm.swap(...)` yang membungkus metode Anchor ditambah semua pembukuan (pembuatan ATA, penyesuaian biaya transfer, anggaran komputasi, perutean program Token-2022). Buat ulang hanya ketika Anda memerlukan lapisan di bawah SDK.

## Membuat ulang klien Rust (crate CPI)

Raydium menerbitkan crate Anchor untuk program yang memiliki IDL:

```toml theme={null}
# Cargo.toml — kunci dependensi harus berupa nama PACKAGE crate.
[dependencies]
raydium-cp-swap = { git = "https://github.com/raydium-io/raydium-cp-swap", branch = "chore/upgrade-anchor", features = ["cpi"] }
raydium-clmm    = { git = "https://github.com/raydium-io/raydium-clmm",    branch = "chore/upgrade-anchor", features = ["cpi"] }
```

Dalam kode, rujuk mereka dengan nama **lib** mereka, `raydium_cp_swap` dan `raydium_clmm`. Tidak ada crate yang disebut `raydium_amm_v3` di bawah ejaan apa pun. Perhatikan cabangnya. Kedua repositori `master` masih pin `anchor-lang 0.32.1`, jadi integrasi Anchor 1.0 memerlukan `chore/upgrade-anchor` di masing-masing. Dengan kedua crate di cabang itu, mereka berbagi `=1.0.2` dan dapat hidup di satu crate. Mencampur crate `master` dengan crate cabang upgrade tidak membangun.

Fitur `cpi` mengekspos struct akun `cpi::accounts::<Ix>` dan invoker `cpi::<ix>()` — pembungkus CPI siap pakai. Lihat [`sdk-api/rust-cpi`](/id/sdk-api/rust-cpi) untuk pola penggunaan.

Jika Anda lebih suka membuat ulang binding segar:

```bash theme={null}
# Dari IDL, menggunakan anchor-client
anchor idl parse \
  --file raydium_cpmm/raydium_cp_swap.json \
  --out src/generated/cpmm_bindings.rs
```

## Membuat ulang klien Python

Tidak ada SDK Python Raydium resmi. Generator pihak ketiga termasuk:

* **`anchorpy`** — port Python dari klien TypeScript Anchor. Menghasilkan pembuat metode yang diketik dari IDL.
* **`solders`** — primitif Solana tingkat rendah (transaksi, keypair, pubkey) dalam binding Rust; digunakan di bawah `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={...}))
```

Lihat [`sdk-api/python-integration`](/id/sdk-api/python-integration) untuk panduan yang lebih lengkap.

## Kebijakan perubahan IDL

Raydium mengikuti aturan ini untuk stabilitas IDL:

1. **Diskriminator instruksi tidak pernah berubah.** Menambahkan instruksi baru memperluas enum di akhir; diskriminator yang ada tetap stabil.
2. **Ukuran akun stabil; bidang baru keluar dari padding yang dicadangkan.** Setiap struct status Raydium membawa wilayah padding trailing yang diukur saat pembuatan, dan bidang baru diukir dari padding itu daripada ditambahkan — jadi panjang byte akun dan offset semua *bidang yang sudah ada sebelumnya* tetap tetap. Korolarinya adalah bahwa byte yang sebelumnya Anda baca sebagai padding dapat menjadi bermakna, dan bidang dapat ditarik kembali ke padding (seperti `PlatformConfig.curve_params` dalam rilis 2026-08-31). Baca ulang definisi struct setelah upgrade; jangan asumsikan padding tetap nol.
3. **Kode enum kesalahan adalah append-only.** Kode kesalahan yang ada selalu berarti hal yang sama.
4. **Perubahan yang merusak dikirim dalam program baru.** Ketika desain ulang diperlukan, tim menerapkan ID program baru (misalnya CPMM sebagai program segar daripada upgrade AMM v4). Pool lama terus berjalan di program lama; pool baru pergi ke yang baru.

Kebijakan ini membuat klien yang dibuat ulang sebagian besar kompatibel ke belakang: klien yang dibuat terhadap IDL yang lebih lama terus mendekode bidang yang diketahuinya, pada offset yang diketahuinya. Apa yang **tidak** akan dilihatnya adalah bidang yang diukir dari apa yang masih dianggapnya sebagai padding — dan, dalam kasus pensiun yang jarang, bidang yang didekodenya mungkin tidak lagi ditulis. Itu tidak melihat "byte trailing ekstra": panjang akun tidak berubah.

## Apa yang harus dilakukan ketika IDL berubah

1. **Perbarui SDK.** `npm update @raydium-io/raydium-sdk-v2`.
2. **Buat ulang kode klien Anda** jika Anda menggunakan Anchor codegen secara langsung.
3. **Diff tata letak akun.** Bidang trailing tata letak baru adalah satu-satunya hal yang belum dilihat kode Anda; konfirmasi apakah Anda membutuhkannya.
4. **Jangan asumsikan diskriminator instruksi lama tidak valid.** Per aturan 1, mereka masih bekerja.
5. **Jalankan kembali tes integrasi** terhadap devnet sebelum bergulir ke mainnet.

## Pemecahan masalah IDL

### Kesalahan "Invalid discriminator"

Biasanya berarti klien yang dibangun terhadap versi N dari IDL mencoba memanggil instruksi yang hanya ada dalam versi program pra-deploy. Tarik ulang IDL dari program langsung:

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

Untuk CPMM ini tidak akan berhasil — lihat tabel lokasi IDL di atas; tarik IDL bundel SDK sebagai gantinya.

### Kegagalan decode akun

Jika `program.account.<Name>.fetch(pubkey)` melempar dengan "Invalid account discriminator", akun dibuat oleh versi program sebelumnya dan Anchor menolak diskriminator 8-byte-nya. Perbaikannya adalah menggunakan parser tata letak mentah dari SDK (`PoolInfoLayout.decode(accountData)`) yang tidak memberlakukan diskriminator Anchor.

### Instruksi yang hilang di klien yang dibuat

Codegen TS Anchor hanya menghasilkan metode untuk instruksi yang entri IDL-nya memiliki `name` yang diuraikan sebagai pengidentifikasi yang valid. Instruksi Raydium semuanya memenuhi ini, tetapi jika Anda melihat ketidaksesuaian, periksa apakah file IDL berasal dari rilis SDK saat ini.

## Penunjuk

* [`sdk-api/rust-cpi`](/id/sdk-api/rust-cpi) — menggunakan crate CPI Rust.
* [`sdk-api/python-integration`](/id/sdk-api/python-integration) — Python melalui `anchorpy`.
* [`sdk-api/typescript-sdk`](/id/sdk-api/typescript-sdk) — klien TS tingkat lebih tinggi.

Sumber:

* [Repositori Raydium IDL](https://github.com/raydium-io/raydium-idl)
* [Spesifikasi Anchor IDL](https://www.anchor-lang.com/docs/basics/idl)


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