Langsung ke konten utama

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.

Halaman ini diterjemahkan secara otomatis oleh AI. Versi bahasa Inggris adalah acuan resmi.Lihat versi bahasa Inggris →
Program Raydium yang lebih baru (CPMM, CLMM, Farm v6, LaunchLab) ditulis dalam Anchor — kerangka Rust yang dibangun di atas model program asli Solana untuk memberikan validasi akun, penanganan kesalahan, dan IDL (deskripsi antarmuka). AMM v4 dan farm yang lebih lama mendahului Anchor. Memahami kedua paradigma ini membantu Anda membaca kode, menghasilkan klien dari IDL, dan men-debug kesalahan yang tidak terduga.

Model penyebaran program

Setiap program Solana tinggal di sebuah Pubkey. Bytecode program disimpan dalam akun executable yang dimiliki oleh BPF Upgradable Loader (BPFLoaderUpgradeab1e11111111111111111111111). Penyebaran program terdiri dari tiga akun:
  1. Akun Program: akun metadata kecil di ID program. Pemilik: BPF Upgradable Loader.
  2. Akun ProgramData: menyimpan bytecode sebenarnya. Diturunkan sebagai [program_id, "programdata"].
  3. Akun Buffer (sementara): menyimpan bytecode baru selama peningkatan. Dibuang setelah peningkatan.
Akun ProgramData memiliki upgrade authority — kunci yang dapat mengganti bytecode dengan versi baru. Upgrade authority Raydium adalah multisig di balik timelock 24 jam; lihat security/admin-and-multisig.

Memverifikasi program yang dikerahkan

Untuk mengonfirmasi apa yang ada di chain cocok dengan apa yang ada di sumber yang disetujui audit:
# Dump program dari mainnet
solana program dump CPMMoo8L3F4NbTegBCKVNunggL7H1Zpdmwpwh8KMoZ0F cpmm-onchain.so

# Build dari sumber yang diketahui
cargo build-bpf --manifest-path raydium-cp-swap/programs/cp-amm/Cargo.toml
cp target/deploy/raydium_cp_swap.so cpmm-source.so

# Bandingkan
sha256sum cpmm-onchain.so cpmm-source.so
Hash yang cocok membuktikan Anda berinteraksi dengan sumber yang Anda pikir. Raydium menerbitkan instruksi build terverifikasi di catatan rilis.

Anchor: kerangka di atas Solana

Program Solana mentah adalah fungsi Rust dengan tanda tangan ini:
pub fn process_instruction(
    program_id: &Pubkey,
    accounts: &[AccountInfo],
    instruction_data: &[u8],
) -> ProgramResult {
    // Parsing instruction_data secara manual
    // Validasi akun secara manual
    // Deserialize data akun secara manual
    // Periksa flag signer/writable secara manual
    // ... kemudian lakukan pekerjaan sebenarnya
}
Anchor membungkus semua boilerplate dan memungkinkan Anda menulis:
#[program]
pub mod cpmm {
    use super::*;

    pub fn swap_base_input(
        ctx: Context<Swap>,
        amount_in: u64,
        min_out: u64,
    ) -> Result<()> {
        // Hanya logika bisnis — ctx sudah tervalidasi
    }
}

#[derive(Accounts)]
pub struct Swap<'info> {
    pub payer: Signer<'info>,
    #[account(mut, seeds = [b"pool", config.key().as_ref(), ...], bump)]
    pub pool_state: AccountLoader<'info, PoolState>,
    #[account(mut)]
    pub input_vault: Box<Account<'info, TokenAccount>>,
    // ... lebih banyak akun
}
Anchor:
  • Menghasilkan secara otomatis discriminator 8-byte deterministik untuk setiap instruksi dan tipe akun.
  • Memvalidasi batasan akun (pemilik, seeds, writable, signer, mint-matches, token-program-matches) sebelum kode Anda berjalan.
  • Menghasilkan IDL — berkas deskripsi antarmuka yang digunakan klien untuk memanggil program.
  • Dilengkapi dengan perpustakaan klien Rust, TypeScript, dan Python.

Discriminator 8-byte

Setiap akun Anchor dan setiap instruksi Anchor dimulai dengan discriminator 8-byte — 8 byte pertama dari SHA-256 dari string tetap:
Discriminator akun:      sha256("account:PoolState")[0..8]
Discriminator instruksi: sha256("global:swap_base_input")[0..8]
Ketika Anda memanggil instruksi Anchor, 8 byte pertama dari data instruksi adalah discriminator ini; Anchor mengirim ke penangan yang tepat dengan mencarinya. Ketika Anda membaca akun Anchor, 8 byte pertama memberi tahu Anda jenisnya — penting untuk alat seperti getProgramAccounts yang menghitung semua akun dari tipe tertentu.

Kesalahan

Program Anchor mendefinisikan kesalahan melalui #[error_code]:
#[error_code]
pub enum ErrorCode {
    #[msg("Slippage tolerance exceeded")]
    SlippageExceeded,
    #[msg("Pool is disabled")]
    PoolDisabled,
    // ...
}
Anchor secara otomatis menetapkan kode numerik ini mulai dari 6000 (0x1770). Tabel kode kesalahan lengkap Raydium ada di reference/error-codes.

IDL

Berkas Anchor IDL (Interface Description Language) adalah deskripsi JSON dari program: instruksi, akun, tipe, kesalahan, dan acara. Ini setara dengan ABI Ethereum. Raydium menerbitkan IDL untuk semua program Anchor. Ambil secara langsung dari on-chain:
anchor idl fetch CPMMoo8L3F4NbTegBCKVNunggL7H1Zpdmwpwh8KMoZ0F -o cpmm.idl.json
Atau dari sumber SDK: src/raydium/*/idl/*.json.

Struktur IDL

{
  "version":      "0.1.0",
  "name":         "raydium_cp_swap",
  "instructions": [ { "name": "swap_base_input", "accounts": [ ... ], "args": [ ... ] }, ... ],
  "accounts":     [ { "name": "PoolState", "type": { ... } }, ... ],
  "types":        [ { "name": "AmmConfig", "type": { ... } }, ... ],
  "errors":       [ { "code": 6000, "name": "SlippageExceeded", "msg": "..." }, ... ],
  "events":       [ { "name": "SwapEvent", "fields": [ ... ] }, ... ]
}

Menghasilkan klien dari IDL

CLI Anchor anchor menghasilkan tipe TypeScript dan Rust:
anchor idl build -o target/idl/cpmm.json
# Tipe TypeScript yang dihasilkan secara otomatis oleh ts-client Anchor
# SDK Raydium sudah menyertakan ini
Alat pihak ketiga seperti Kinobi dapat menghasilkan klien Rust, Python, C, atau Go dari IDL.

Ketika IDL adalah teman Anda

Jika Anda ingin membangun integrasi khusus yang tidak melalui SDK Raydium:
  1. Ambil IDL (langsung dari on-chain atau dari sumber SDK).
  2. Cari instruksi yang Anda inginkan (misalnya, swap_base_input).
  3. Konstruksikan data instruksi: discriminator 8-byte + argumen yang dikodekan.
  4. Lewatkan akun dalam urutan yang ditentukan IDL.
Lihat sdk-api/anchor-idl untuk contoh kerja.

Program pra-Anchor: AMM v4 dan Farm v3/v5

Program ini mendahului Anchor. Mereka menggunakan:
  • Pengiriman instruksi manual: tag u8 dalam instruction_data dengan pernyataan match.
  • Validasi akun manual: if accounts[0].owner != &expected_program { ... }.
  • Argumen instruksi yang diserialisasi Borsh: tidak ada discriminator, hanya instruction_data[1..].
  • Layout melalui #[repr(C, packed)]: tata letak biner struct C.
SDK Raydium v2 dilengkapi dengan tata letak TypeScript untuk instruksi AMM v4 non-Anchor sehingga klien dapat mengenkode/mendekode tanpa Anchor:
import { liquidityStateV4Layout, swapInstructionData }
  from "@raydium-io/raydium-sdk-v2";

const data = swapInstructionData.encode({
  instruction: 9,   // swap
  amountIn:    1_000_000n,
  minAmountOut: 950_000n,
});
Pola integrasi sama — Anda hanya tidak mendapatkan pembuatan otomatis yang didorong IDL Anchor.

Mekanik peningkatan program

Hanya upgrade_authority ProgramData yang dapat meningkatkan. Langkah-langkahnya:
  1. Kompilasi bytecode baru.
  2. Tuliskan ke akun buffer (solana program write-buffer).
  3. Kirim instruksi peningkatan: BpfLoaderUpgradeable::Upgrade { buffer, program, authority }.
  4. Runtime secara atomik mengganti bytecode program dengan isi buffer.
Raydium membatasi ini di balik timelock 24 jam yang diimplementasikan dalam pengaturan multisig Squads. Transaksi peningkatan harus menunggu 24 jam setelah persetujuan multisig sebelum eksekusi. Ini melindungi dari peningkatan yang terburu-buru / dipaksa. Lihat security/admin-and-multisig.

Membuat program tidak dapat diubah

Upgrade authority dapat diatur ke None, di mana program menjadi selamanya tidak dapat diubah. Raydium belum melakukan ini untuk produk apa pun — tim mempertahankan kemampuan untuk mendorong perbaikan keamanan. Trade-off: pengguna harus mempercayai proses multisig + timelock.

Program dan sewa

Menyebarkan program mengkonsumsi lamport yang bebas sewa:
  • Program 50 KB: ~0,35 SOL dalam sewa.
  • Program 200 KB: ~1,4 SOL dalam sewa.
Menutup program (melalui solana program close) mengembalikan lamport. Program Raydium tetap aktif dan tidak dijadwalkan untuk ditutup.

Program Anchor untuk debugging

Output log

Makro msg! Anchor menulis ke log transaksi. Simulasikan transaksi untuk melihat log:
const sim = await connection.simulateTransaction(tx);
console.log(sim.value.logs);
Log mencakup:
  • Pemanggilan program (Program CPMMoo8... invoke [1]).
  • Panggilan msg! dari kode program.
  • Konsumsi unit komputasi (consumed 137842 of 400000 compute units).
  • Keberhasilan atau kesalahan program.

Kode kesalahan

Jika program Anchor melempar, log menampilkan:
Program CPMMoo8... failed: custom program error: 0x1770
0x1770 = 6000 desimal = kesalahan Anchor pertama (misalnya, SlippageExceeded). Referensi silang dengan array errors IDL. Lihat reference/error-codes untuk tabel kesalahan lengkap Raydium.

Ketidakcocokan tata letak akun

Jika Anda melewatkan akun yang salah di slot yang salah, makro validasi akun Anchor mengembalikan kesalahan seperti:
AnchorError: AccountNotInitialized. Error Number: 3012
Nomor kesalahan di bawah 6000 adalah kesalahan bawaan Anchor (lihat enum ErrorCode Anchor); kesalahan ≥6000 adalah kode khusus program.

Penunjuk

Sumber: