> ## 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 mendeskripsikan instruksi, tata letak akun, enum error, dan skema struct mereka. IDL adalah sumber kebenaran untuk pembuatan kode klien — TS SDK, crate Rust CPI, dan klien pihak ketiga semuanya dihasilkan dari (atau ditulis tangan terhadap) IDL.

Raydium menerbitkan IDL untuk CPMM, CLMM, dan LaunchLab. AMM v4, Stable AMM, dan Farm (v3 / v5 / v6) mendahului Anchor atau dengan cara lain tidak didistribusikan oleh 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 ada di SDK                                                                                                                                                                   |
| Farm       | tidak ada IDL resmi — tata letak ada di SDK                                                                                                                                                                   |

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

IDL juga dapat ditarik langsung dari program yang diterapkan melalui fitur **on-chain IDL** Anchor (jika penerbit program memilih):

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

CPMM, CLMM, dan LaunchLab semuanya memiliki IDL on-chain. AMM v4, Stable AMM, dan Farm tidak (program pre-Anchor).

## Membuat ulang klien TypeScript

Codegen Anchor menghasilkan klien yang diketik dari IDL:

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

# Atau dengan pembantu TS `@coral-xyz/anchor` saat runtime:
```

```ts theme={null}
import { Program, AnchorProvider } from "@coral-xyz/anchor";
// 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, {});
const program  = new Program(cpmmIdl as any, CPMM_PROGRAM_ID, provider);

// Pembuat metode yang diketik dihasilkan 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 bookkeeping (pembuatan ATA, penyesuaian biaya transfer, anggaran komputasi, Token-2022 program routing). 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
[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"] }
```

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

Jika Anda lebih suka membuat 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 meliputi:

* **`anchorpy`** — port Python dari `@coral-xyz/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. **Tata letak struct akun berkembang hanya secara aditif.** Field baru masuk di akhir, didahului oleh kenaikan ukuran dalam skema on-chain. Field yang ada menyimpan offset mereka.
3. **Kode enum error hanya append.** Kode error yang ada selalu berarti hal yang sama.
4. **Perubahan breaking dikirim dalam program baru.** Ketika redesain diperlukan, tim menerapkan ID program baru (misalnya CPMM sebagai program segar daripada upgrade AMM v4). Pool lama terus berjalan di program lama; pool baru masuk ke pool baru.

Kebijakan ini membuat klien yang dibuat ulang backward-compatible: klien yang dibuat terhadap IDL berusia dua versi lalu akan tetap mendekode state saat ini dengan benar (ia melihat byte trailing tambahan sebagai padding).

## Yang harus dilakukan ketika IDL berubah

1. **Update 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.** Field 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.** Menurut aturan 1, mereka masih bekerja.
5. **Jalankan kembali pengujian integrasi** terhadap devnet sebelum menerapkan ke mainnet.

## Troubleshooting IDL

### Kesalahan "Invalid discriminator"

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

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

### Kegagalan decode akun

Jika `program.account.<Name>.fetch(pubkey)` melempar "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 dihasilkan

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

## Petunjuk

* [`sdk-api/rust-cpi`](/id/sdk-api/rust-cpi) — menggunakan crate Rust CPI.
* [`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/idl)
