Halaman ini diterjemahkan secara otomatis oleh AI. Versi bahasa Inggris adalah acuan resmi.Lihat versi bahasa Inggris →
sdk-api/rust-cpi membahas mekanika tingkat rendah untuk memanggil setiap program Raydium. Halaman ini adalah pendamping tingkat lebih tinggi: mengapa Anda akan membuat komposisi Raydium ke dalam program Anda sendiri, pola mana yang cocok untuk kasus penggunaan Anda, dan semua kode yang Anda perlukan dari awal hingga akhir.Kapan CPI adalah alat yang tepat
Program khusus masuk akal ketika swap perlu terjadi secara atomik dengan perubahan state on-chain lainnya yang hanya program Anda yang dapat 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 melakukan swap melalui Raydium dan mengkredit akun pengguna.
- Proxy agregator — instruksi tunggal 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 — deposit LP atau farm stake ke vault Anda, vault memanen reward sesuai jadwal, memasok kembali likuiditas, menerbitkan share token.
- Vault strategi — posisi LP leverage yang menyeimbangkan ulang dengan swap melalui CLMM; liquidator yang menutup posisi dan swap kolateral dalam satu transaksi.
- Platform token-launch dengan vesting khusus — program Anda menyimpan token vesting dan melepasnya ke pool Raydium sesuai jadwal.
Pola komposisi
Pola 1: Proxy sederhana
Program Anda menampilkan instruksi tunggal yang memvalidasi beberapa kebijakan (misalnya, pasangan mint yang disetujui, diskon biaya untuk pengguna terverifikasi) dan kemudian meneruskan ke Raydium.Pola 2: Escrow
Program Anda memiliki PDA yang menyimpan input mint pengguna. Saat terpicu, PDA menandatangani CPI ke Raydium untuk swap saldo miliknya sendiri.CpiContext::new_with_signer. Lihat Signer seeds.
Pola 3: Multi-hop yang dikomposisi
Program Anda mengeluarkan beberapa CPI dalam satu instruksi, menegakkan batas slippage tunggal di seluruh semuanya. Instruksi swap Raydium masing-masing memilikiminimum_amount_out mereka sendiri, tetapi Anda menetapkannya ke 0 (atau batas lantai yang sangat longgar) dan menegakkan minimum final yang ketat sendiri setelah hop terakhir.
Pola 4: Vault / strategi
Program Anda menyimpan token LP atau farm stake dalam PDA. Keeper (atau pengguna) memanggilcompound(), yang:
- Memanen reward dari farm.
- Menukar reward untuk token pool (CPI ke CPMM atau CLMM).
- Menyetor hasil kembali ke LP (CPI lainnya).
- Melakukan stake LP baru (CPI lainnya).
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 kelalaian. Penerima memvalidasi miliknya sendiri; validasi ganda di pemanggil hanya membakar CU dan berisiko kehilangan sinkronisasi ketika Raydium mengirim field layout struct baru.
Panggilan CPI itu sendiri
Signer seeds PDA
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 mencakup transaksi dan bahwa ATA input dimiliki oleh authority tersebut. Validasi terjadi di anchor_spl::token::transfer: field authority ATA harus sama dengan signer.
Bug umum: melewatkan user sebagai authority (dan transfer dari escrow_input_ata yang dimiliki oleh PDA escrow). Program SPL Token menolak dengan owner mismatch. Selalu buat field authority cocok dengan pemilik ATA.
Remaining accounts
Beberapa instruksi Raydium menerima 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 pasang per slot reward yang aktif. - Token-2022 transfer-hook mints: program transfer-hook ditambah akun apa pun yang diperlukan hook.
Compute budget untuk panggilan yang dikomposisi
CPI biaya ~1.500 CU untuk call frame itu sendiri; penggunaan CU callee stack di atas. Anggaran kasar per CPI Raydium:| Call | CU (SPL Token) | CU (Token-2022) |
|---|---|---|
| CPMM swap_base_input | ~150.000 | ~200.000 |
| CLMM swap_v2 (single tick array) | ~180.000 | ~230.000 |
| CLMM swap_v2 (crosses 2 ticks) | ~220.000 | ~270.000 |
| Farm v6 deposit | ~120.000 | ~150.000 |
| Farm v6 harvest (per reward slot) | +30.000 | +40.000 |
| AMM v4 swap_base_in | ~140.000 | n/a |
harvest → swap A → swap B → deposit LP → stake LP dengan mudah mencapai 700k CU.
Selalu set ComputeBudgetProgram::set_compute_unit_limit yang eksplisit:
Propagasi error
Program Raydium mengembalikan error Anchor dengan kode stabil. Program pemanggil Anda melihatnya sebagaiErr(ProgramError::Custom(code)). Bubble through secara default:
sdk-api/anchor-idl); kode baru append di akhir, kode yang ada tidak pernah berubah makna.
Contoh lengkap: escrow limit-order
Alur:open_order— pengguna menyetoramount_indariinput_mintke PDA escrow; record targetmin_amount_outdan expiry.execute_order— siapa saja (keeper) memanggil dengan akun pool saat ini. Program memeriksa quote saat ini ≥min_amount_out, kemudian CPI Raydium swap dan menyimpan output di escrow.claim— pengguna menarik output mint dari escrow.
Pengujian
Menarik program Raydium ke validator lokal untuk integration test (dariAnchor.toml):
anchor test mengambilnya dari mainnet saat startup. Lihat sdk-api/rust-cpi.
Jebakan spesifik komposisi
Reentrancy
Solana tidak memiliki reentrancy sejati — CPI tidak dapat memanggil kembali ke program asal dalam invocation yang sama. Tetapi Anda masih dapat membangun diri Anda ke reentrancy logis: CPI yang membaca state Anda, kemudian kode Anda membacanya lagi mengasumsikan CPI tidak mengubahnya. Untuk Raydium, CPI tidak menyentuh state Anda, jadi ini adalah kekhawatiran yang kurang dari misalnya konteks flash-loan. Tetapi jika Anda membuat komposisi Raydium dengan protokol lending, sadari.Account mutability drift
Jika program Anda melewatkan akun sebagaimut tetapi Raydium mengharapkannya read-only (atau sebaliknya), runtime menolak invocation dengan InvalidAccountData. Selalu periksa mutability yang diharapkan instruksi Raydium di IDL; anchor_cp_swap::cpi::accounts::Swap menegakkannya melalui tipe fieldnya.
Field program Token-2022
Input dan output mints mungkin di bawah program token yang berbeda — satu SPL Token, satu Token-2022. CPI memiliki fieldinput_token_program dan output_token_program terpisah karena alasan ini. Selalu periksa field owner setiap mint dan rutekan program yang benar ke setiap slot.
Versioned transactions
Tx yang dikomposisi yang melakukan 2+ CPI Raydium plus pembuatan ATA jarang sesuai dalam transaksi legacy (v0-without-LUT). Gunakan V0 dengan address lookup tables; tarik LUT publik Raydium melaluiraydium.getRaydiumLutAddresses().
Pointer
sdk-api/rust-cpi— mekanika CPI tingkat rendah.integration-guides/priority-fee-tuning— sizing compute budget.products/cpmm/code-demos,products/clmm/code-demos,products/farm-staking/code-demos— snippets CPI per-produk.

