Halaman ini diterjemahkan secara otomatis oleh AI. Versi bahasa Inggris adalah acuan resmi.Lihat versi bahasa Inggris →
Kapan CPI adalah alat yang tepat
Program kustom masuk akal ketika pertukaran perlu terjadi secara atomik dengan perubahan state on-chain lainnya yang hanya program Anda yang bisa lakukan. Kasus umum:- Program escrow / limit-order — pengguna menyetor mint ke escrow Anda, program Anda memantau kondisi harga, dan ketika terpicu, program Anda secara atomik menukar melalui Raydium dan mengkreditkan akun pengguna.
- Proxy agregator — satu instruksi yang merutekan swap melalui Raydium + satu atau lebih DEX lain, dengan semua hop di bawah satu slippage check yang dimiliki program Anda.
- Vault auto-compounding — setor LP atau farm stake ke vault Anda, vault memanen reward sesuai jadwal, memasok kembali likuiditas, mengeluarkan share token.
- Vault strategi — posisi LP leverage yang menyeimbangkan kembali dengan menukar melalui CLMM; liquidator yang menutup posisi dan menukar collateral dalam satu transaksi.
- Platform peluncuran token dengan vesting kustom — program Anda memegang token vesting dan melepasnya ke pool Raydium sesuai jadwal.
Pola komposisi
Pola 1: Proxy tipis
Program Anda mengekspos satu instruksi yang memvalidasi beberapa kebijakan (misalnya pasangan mint yang di-whitelist, diskon biaya untuk pengguna terverifikasi) lalu meneruskan ke Raydium.Pola 2: Escrow
Program Anda memiliki PDA yang memegang input mint pengguna. Saat terpicu, PDA menandatangani CPI ke Raydium untuk menukar saldo miliknya sendiri.CpiContext::new_with_signer. Lihat Signer seeds.
Pola 3: Multi-hop komposisi
Program Anda mengeluarkan beberapa CPI dalam satu instruksi, menegakkan batas slippage tunggal di semua. Instruksi swap Raydium masing-masing memilikiminimum_amount_out mereka sendiri, tetapi Anda menetapkannya ke 0 (atau floor yang sangat longgar) dan menegakkan minimum final yang ketat sendiri setelah hop terakhir.
Pola 4: Vault / strategi
Program Anda memegang LP token atau farm stake di PDA. Keeper (atau pengguna) memanggilcompound(), yang:
- Memanen reward dari farm.
- Menukar reward untuk pool token (CPI ke CPMM atau CLMM).
- Menyetor hasil kembali ke LP (CPI lain).
- Stake LP baru (CPI lain).
Konstruksi daftar akun
StructAccounts program pemanggil mencerminkan urutan akun program Raydium, tetapi sebagian besar akun sisi Raydium adalah UncheckedAccount karena Raydium memvalidasinya sendiri. Anda hanya menambahkan constraint pada akun yang Anda miliki:
UncheckedAccount pada akun Raydium — bukan kemalasan. Penerima memvalidasi miliknya sendiri; double-validating di pemanggil hanya membakar CU dan berisiko keluar dari sinkronisasi ketika Raydium mengirim field layout struct baru.
Panggilan CPI itu sendiri
PDA signer seeds
CPI berhasil hanya jika PDA yang dilewatkan sebagaiauthority cocok dengan derivasi yang diklaim pemanggil. Keduanya harus setuju tentang:
- Urutan byte seed (di sini
[b"escrow", user.key().as_ref()]). - Bump.
- ID program pemanggil (program Anda, bukan Raydium).
authority CPMM adalah PDA vault miliknya sendiri — akun tetap yang luas program yang diturunkan dan ditandatangani dengan sendirinya, dan yang program Anda tidak kontrol atau substitusi. Akun yang seed PDA Anda harus selaras adalah payer: pemeriksaan terjadi di dalam helper transfer_from_user_to_pool_vault CPMM sendiri, yang memerlukan akun yang dilewatkan sebagai payer menjadi pemilik input_token_account.
Bug umum: melewatkan user sebagai payer sementara escrow_input_ata dimiliki oleh PDA escrow. Program SPL Token menolak dengan owner mismatch. Selalu buat payer menjadi pemilik ATA — dan tandatangani untuk itu dengan new_with_signer ketika pemilik itu adalah PDA.
Remaining accounts
Beberapa instruksi Raydium mengambil daftar akun dengan panjang variabel yang ditambahkan setelah yang tetap — remaining accounts.- CLMM
SwapV2: 1–8 akunTickArrayStateuntuk tick array yang mungkin dilalui swap, dalam arah swap. - Farm v6
Deposit/Harvest/Withdraw: pasangan(reward_vault, user_reward_ata), satu pasangan per slot reward aktif. - Token-2022 transfer-hook mint: program transfer-hook plus akun apa pun yang dibutuhkan hook.
Compute budget untuk panggilan komposisi
CPI biaya ~1.500 CU untuk frame panggilan itu sendiri; penggunaan CU callee sendiri menumpuk di atas. Angka callee di bawah diukur dari transaksi mainnet aktif pada pool volume tinggi pada 2026-09-09, dibaca dari baris logProgram <id> consumed N of M compute units untuk invokasi program Raydium sendiri (jadi mencakup CPI token-program inner-nya):
Tambahkan ~1.500 untuk setiap frame CPI dan overhead program Anda sendiri di atas. Biaya swap CLMM berskala dengan tick crossing, jadi perlakukan angka itu sebagai floor. Token-2022 mint menambahkan biaya penanganan ekstensi dari transfer itu sendiri; ukur untuk mint Anda sendiri daripada menerapkan multiplier flat.
Selalu atur
ComputeBudgetProgram::set_compute_unit_limit eksplisit:
Propagasi error
Program Raydium mengembalikan error Anchor dengan kode stabil. Program pemanggil Anda melihatnya sebagaiErr(ProgramError::Custom(code)). Bubble through secara default:
ERROR_CODE_OFFSET: varian #[error_code] dipancarkan mulai dari 6000, jadi membandingkan dengan discriminant enum telanjang tidak pernah cocok. (Tidak ada helper is_err di anchor-lang atau di raydium_cp_swap — revisi sebelumnya dari halaman ini menggunakan yang tidak ada.)
Pemetaan kode error ke makna stabil per kebijakan IDL (sdk-api/anchor-idl); kode baru menambahkan di akhir, kode yang ada tidak pernah mengubah makna.
Contoh lengkap yang dikerjakan: escrow limit-order
Alur:open_order— pengguna menyetoramount_indariinput_mintke PDA escrow; catat targetmin_amount_outdan expiry.execute_order— siapa pun (keeper) memanggil dengan akun pool saat ini. Program memeriksa quote saat ini ≥min_amount_out, lalu CPI swap Raydium dan menyimpan output di escrow.claim— pengguna menarik output mint dari escrow.
order menandatangani CPI sebagai payer, karena itu memiliki input ATA escrow; ExecuteOrder oleh karena itu juga memerlukan field pool_authority: UncheckedAccount<'info> untuk PDA vault CPMM sendiri. Baik pemeriksaan slippage sisi Raydium dan pemeriksaan delta escrow sendiri menegakkan floor — belt dan braces.
Pengujian
Menarik program Raydium ke validator lokal untuk tes integrasi (dariAnchor.toml):
anchor test mengambilnya dari mainnet saat startup. Lihat sdk-api/rust-cpi.
Jebakan spesifik untuk komposisi
Reentrancy
Solana tidak memiliki reentrancy sejati — CPI tidak dapat memanggil kembali ke program asal dalam invokasi yang sama. Tetapi Anda masih dapat membangun diri sendiri ke dalam reentrancy logis: CPI yang membaca state Anda, lalu kode Anda membacanya lagi dengan asumsi CPI tidak mengubahnya. Untuk Raydium, CPI tidak menyentuh state Anda, jadi ini kurang menjadi perhatian daripada misalnya konteks flash-loan. Tetapi jika Anda menggabungkan Raydium dengan protokol pinjaman, waspadai.Account mutability drift
Jika program Anda melewatkan akun sebagaimut tetapi Raydium mengharapkannya read-only (atau sebaliknya), runtime menolak invokasi dengan InvalidAccountData. Selalu periksa mutability yang diharapkan instruksi Raydium di IDL; raydium_cp_swap::cpi::accounts::Swap menetapkan mutability setiap akun untuk Anda, dari marker #[account(mut)] pada struct Swap CPMM sendiri — field yang diturunkan semuanya AccountInfo<'info> biasa, jadi impl ToAccountMetas yang diturunkan, bukan tipe field, yang membawa flag.
Token-2022 program field
Input dan output mint mungkin berada di bawah program token yang berbeda — satu SPL Token, satu Token-2022. CPI memiliki fieldinput_token_program dan output_token_program terpisah untuk alasan ini. Selalu periksa field owner setiap mint dan rutekan program yang benar ke setiap slot.
Versioned transactions
Tx komposisi yang melakukan 2+ CPI Raydium plus pembuatan ATA jarang cocok dalam transaksi legacy (v0-without-LUT). Gunakan V0 dengan address lookup table; tarik LUT publik Raydium melaluiraydium.getRaydiumLutAddresses().
Penunjuk
sdk-api/rust-cpi— mekanik CPI tingkat rendah.integration-guides/priority-fee-tuning— sizing compute budget.products/cpmm/code-demos,products/clmm/code-demos,products/farm-staking/code-demos— snippet CPI per-produk.

