Skip to main content
Halaman ini diterjemahkan secara otomatis oleh AI. Versi bahasa Inggris adalah acuan resmi.Lihat versi bahasa Inggris →
Halaman ini adalah referensi instruksi yang berwenang. Untuk kode yang benar-benar menyusun instruksi ini, lihat products/cpmm/code-demos. Untuk arti kode error lihat reference/error-codes.Upgrade program 2026-09 membangun kembali CPMM di Anchor 1.0.2 / Solana 3.1.10, menambahkan instruksi admin CollectExcessLamports, menghapus daftar putih mint Token-2022 yang dikodekan keras, dan mengubah apa yang ditulis CreateAmmConfig ke dalam protocol_owner / fund_owner. Tidak ada instruksi yang menghadap pengguna yang mengubah akun, argumen atau matematikanya. Lihat entri changelog 2026-09-09.
Kedua instruksi pengumpulan biaya kreator mengubah daftar akun mereka pada 2026-09-19. CollectCreatorFee mendapatkan creator_fee_share; CollectCreatorFeePermissionless mendapatkan amm_config dan creator_fee_share. Keduanya ditambahkan di akhir setelah system_program, jadi setiap akun yang sudah diteruskan klien yang ada mempertahankan indeksnya — tetapi akun baru bersifat wajib, sehingga transaksi yang dibangun terhadap tata letak yang lebih lama kekurangan akun dan ditolak dengan AccountNotEnoughKeys (3005) dari Anchor. Dua instruksi admin — CreateCreatorFeeShare dan CloseCreatorFeeShare — ditambahkan, dan UpdateAmmConfig mengambil param = 8 yang baru. Lihat entri changelog 2026-09-19.

Ringkasan instruksi

Bitmask status: status setiap pool adalah u8 di mana bit 0 = deposit dinonaktifkan, bit 1 = withdraw dinonaktifkan, bit 2 = swap dinonaktifkan (PoolStatusBitIndex { Deposit, Withdraw, Swap } dalam program). Bit yang jelas berarti operasi diizinkan; bit yang diatur berarti dijeda. UpdatePoolStatus mengambil u8 mentah dan menimpa nilai yang ada. Bagian berikutnya membahas masing-masing secara detail. Urutan akun mengikuti IDL CPMM; SDK dan klien Rust di raydium-cp-swap/programs/cp-swap/src/instructions cocok dengan urutan ini.

Initialize

Buat pool CPMM baru. Argumen
Akun (W = dapat ditulis, S = penandatangan) * pool_state menandatangani hanya pada jalur keypair acak; jalur PDA kanonik berjalan tanpa pool_state menandatangani. Kondisi Pra
  • Mint diurutkan (token_0_mint < token_1_mint berdasarkan urutan byte).
  • Tidak ada mint yang menggunakan ekstensi di luar daftar putih CPMM (TransferFeeConfig, MetadataPointer, TokenMetadata, InterestBearingConfig, ScaledUiAmount) — lihat products/cpmm/accounts. Mint yang PDA SupportMintAssociated-nya (seed [b"support_mint", mint]) ada melewati pemeriksaan ekstensi — tetapi Anda harus menambahkan PDA itu ke remaining_accounts. Program hanya memindai akun yang Anda teruskan dan tidak pernah memuat PDA itu sendiri, jadi mengandalkan registri tanpa menyediakan akun masih gagal dengan NotSupportMint (6007). Urutan tidak penting (pencocokan berdasarkan kunci); teruskan satu entri per mint yang memerlukan bypass. Registri itu adalah satu-satunya bypass sejak upgrade 2026-09 menghapus daftar putih empat-mint yang dikodekan keras.
  • creator memiliki setidaknya init_amount_0 dan init_amount_1 di ATA masing-masing.
  • amm_config.disable_create_pool == false.
Kondisi Pasca
  • pool_state.lp_supply = sqrt(init_amount_0 * init_amount_1) — akar kuadrat penuh. Pembuat dimint lp_supply − 100; 100 unit dasar terkunci dihitung dalam lp_supply tetapi tidak pernah dimint.
  • Jadi lp_mint.supply == pool_state.lp_supply − 100 untuk seumur hidup pool. Semua matematika LP-share (deposit, withdraw) membagi dengan lp_supply, jadi gunakan bidang itu dan jangan ganti dengan pasokan mint on-chain. Kembali dengan InitLpAmountTooLess jika sqrt(...) < 100.
  • observation_state diinisialisasi; observation_index = 0 dan pool_id = pool_state.key().
  • Lamport create_pool_fee ditransfer dari pembuat ke penerima dan disinkronkan sebagai SOL asli (itu adalah ATA wSOL).
  • Bitmask status pool adalah 0 (deposit / withdraw / swap semuanya diaktifkan).
  • enable_creator_fee = false dan creator_fee_on = BothToken. Initialize tidak mendukung pengaktifan biaya kreator — jalur itu adalah InitializeWithPermission.
  • open_time ditingkatkan ke block_timestamp + 1 jika pemanggil melewatkan nilai <= block_timestamp. Swap ditolak sebelum open_time; deposit dan penarikan bekerja segera.
Error Umum (daftar lengkap di reference/error-codes)
  • InvalidInput — mint tidak diurutkan, atau mint identik.
  • NotSupportMint — ekstensi Token-2022 yang diblokir.
  • ExceededSlippage — jarang; jika init_amount_0/1 menghasilkan LP nol karena ketidakcocokan desimal.

Deposit

Tambahkan likuiditas di kedua token sebanding dengan pool. Argumen
Akun Matematika
Dua detail yang patut diperhatikan: basis pro-rata adalah total vault yang dikecualikan biaya (vault_amount_without_fee, yaitu saldo mentah dikurangi penghitung protokol, dana dan kreator yang terkumpul), bukan saldo vault mentah; dan batas slippage diperiksa terhadap apa yang benar-benar ditransfer pembayar, setelah biaya transfer Token-2022 ditambahkan, bukan terhadap pergerakan vault kotor. Tidak ada perubahan pada proporsionalitas k — kedua total dan lp_supply diskalakan dengan faktor yang sama. Kondisi Pasca
  • lp_supply += lp_token_amount.
  • vault_0 += needed_token_0 (bersih dari biaya transfer Token-2022 apa pun pada input).
  • vault_1 += needed_token_1 (bersih dari biaya transfer Token-2022 apa pun pada input).
Error Umum — ExceededSlippage, ZeroTradingTokens, InvalidStatus jika deposit dijeda.

Withdraw

Bakar token LP dan terima kedua token dasar secara pro-rata. Argumen
Akun 14 akun pertama identik dengan Deposit, dan lp_mint dapat ditulis karena token LP dibakar. Withdraw juga mengambil akun ke-14, memo_program (dibatasi address = memo::ID) — Deposit tidak. Withdraw dengan 13 akun gagal deserialisasi Anchor, jadi LP tidak dapat keluar. Matematika
Kondisi Pasca
  • lp_supply -= lp_token_amount.
  • Vault mengirim out_token_0 / out_token_1 (kotor; pengguna menerima bersih dari biaya transfer Token-2022 apa pun).

SwapBaseInput

Swap input-pasti. Argumen
Akun Urutan input → output adalah berdasarkan arah pengguna, bukan token_0 / token_1 kanonik pool. Program mengetahui vault mana yang mana dengan mencocokkan mint. Matematika — lihat products/cpmm/math. Kondisi Pra
  • open_time <= now.
  • pool_status memungkinkan swap.
  • Tidak ada mint dijeda atau dibekukan untuk otoritas ini.
  • amount_in > 0.
Error Umum
  • ExceededSlippage — amount_out < minimum_amount_out.
  • ZeroTradingTokens — perdagangan dibulatkan menjadi nol.
  • NotApproved — pool dijeda untuk swap melalui UpdatePoolStatus.
  • InvalidInput — mint tidak cocok dengan salah satu mint vault pool.

SwapBaseOutput

Swap output-pasti. Argumen
Akun — sama dengan SwapBaseInput. Matematika — kurva terbalik dengan ceiling, lihat products/cpmm/math. Error Umum — ExceededSlippage (gross_in > max_amount_in), ZeroTradingTokens, InvalidInput, NotApproved.

CollectProtocolFee

Kumpulkan biaya protokol yang terkumpul dari vault ke tujuan protokol. Argumen — tidak ada. Akun Efek
Tidak ada perubahan pada saldo efektif kurva (biaya yang terkumpul sudah dikecualikan). Error Umum — InvalidOwner (6001) jika penandatangan bukan amm_config.protocol_owner maupun admin program. (Tidak ada NotApproved pada jalur ini.)

CollectFundFee

Bentuk yang sama dengan CollectProtocolFee tetapi ditandatangani oleh amm_config.fund_owner — atau, sekali lagi, admin program — dan menolkan penghitung fund_fees_*. InvalidOwner yang sama pada penandatangan yang salah.

CollectCreatorFee

Ditandatangani oleh pool_state.pool_creator. Ini menyelesaikan biaya kreator yang terkumpul dan mentransfer bagian kreator ke akun token kreator. Argumen — tidak ada. Akun Efek
Bagian protokol tidak pernah meninggalkan vault di sini — itu dilabel ulang sebagai biaya protokol dan menunggu CollectProtocolFee. Kedua penghitung sudah dikecualikan dari pandangan kurva tentang vault, jadi harga pool tidak bergerak. Derivasi lengkap di products/cpmm/fees. Error Umum — NoFeeCollect ketika kedua penghitung kreator nol (diperiksa sebelum pemisahan), InvalidInput (6003) jika share_rate yang diselesaikan melebihi 1_000_000, MathOverflow (6011) jika membukukan bagian akan meluap protocol_fees_token_*, dan error ConstraintSeeds Anchor jika creator_fee_share bukan PDA kanonik.

CollectCreatorFeePermissionless

Siapa pun dapat memicu pengumpulan biaya kreator. Instruksi selalu mengirim bagian kreator ke akun token terkait kanonik yang dimiliki oleh pool_state.pool_creator; pemanggil tidak dapat memilih kreator atau tujuan lain. Jika salah satu ATA hilang, pembayar mendanai pembuatannya. CollectCreatorFee asli tetap dapat dipanggil, jadi kreator yang ingin menandatangani untuk pengumpulan mereka sendiri masih bisa. Argumen — tidak ada. Akun
Dua akun baru ditambahkan di akhir setelah system_program, bukan disisipkan. Setiap akun dari payer hingga system_program mempertahankan posisi yang dimilikinya sebelum upgrade, jadi pemutusannya bersih: transaksi yang dibangun terhadap tata letak empat belas akun pra-upgrade tidak salah membaca vault sebagai konfigurasi — ia hanya meneruskan terlalu sedikit akun dan Anchor menolaknya dengan AccountNotEnoughKeys (3005) sebelum batasan apa pun berjalan. Akun-akun itu tetap wajib, jadi tambahkan keduanya di akhir dan segarkan IDL; tidak ada jalur kompatibilitas untuk tata letak lama.
Efek — identik dengan CollectCreatorFee di atas: bagian diselesaikan dari creator_fee_share atau amm_config, bagian protokol dicatat ke dalam protocol_fees_token_{0,1}, bagian kreator ditransfer ke ATA kreator, kedua penghitung kreator dinolkan, dan recent_epoch diperbarui. Mengembalikan NoFeeCollect ketika kedua penghitung nol.

UpdatePoolStatus

Jeda atau lanjutkan operasi individual pada pool. Bidang status adalah bitmask: Argumen
Akun Kunci admin adalah pubkey yang dikompilasi ke dalam program (crate::admin::ID), bukan otoritas upgrade BPF — mengubahnya memerlukan upgrade program. Lihat reference/program-addresses untuk nilainya dan security/admin-and-multisig untuk siapa yang memegangnya.

CreateAmmConfig

Buat tingkat biaya baru. Argumen
Akun Kondisi Pra
  • Tidak ada AmmConfig yang ada dengan index yang sama.
  • protocol_fee_rate + fund_fee_rate <= FEE_RATE_DENOMINATOR_VALUE.
Berubah pada 2026-09: pemilik biaya konfigurasi baru tidak lagi berasal dari penandatangan. create_amm_config sekarang menulis protocol_fee_owner::ID yang dikodekan keras program ke dalam protocol_owner dan fund_fee_owner::ID ke dalam fund_owner, bukan menyalin kunci penandatangan admin ke keduanya. Alamat ada di reference/program-addresses.Konsekuensi: biaya pada AmmConfig yang baru dibuat mendarat di dompet biaya khusus daripada dompet admin. Admin tetap menjadi penandatangan yang diterima untuk pengumpulan — CollectProtocolFee / CollectFundFee menerima amm_config.protocol_owner / fund_owner atau crate::admin::ID — jadi tidak ada yang harus dirotasi untuk menyapu; apa yang berubah hanya di mana hasilnya pergi secara default. Akun AmmConfig yang ada tidak ditulis ulang — apa pun yang disimpan di atasnya masih mengatur, jadi selalu baca protocol_owner / fund_owner dari akun bukan mengasumsikan nilai apa pun. Parameter UpdateAmmConfig 3 dan 4 masih merotasinya.

UpdateAmmConfig

Ubah tingkat biaya atau kepemilikan pada AmmConfig yang ada. Mengambil param: u8 (bidang mana yang diperbarui) dan value: u64. Tabel pengiriman lengkap:
  • param = 0 → trade_fee_rate (menegaskan trade_fee_rate + creator_fee_rate < 1_000_000)
  • param = 1 → protocol_fee_rate (menegaskan ≤ 1_000_000 dan + fund_fee_rate ≤ 1_000_000)
  • param = 2 → fund_fee_rate (menegaskan ≤ 1_000_000 dan + protocol_fee_rate ≤ 1_000_000)
  • param = 3 → protocol_owner. Kunci baru bukan dalam value: tambahkan sebagai remaining_accounts[0] (read-only tidak apa-apa). Itu tidak boleh menjadi pubkey default, dan menghilangkan akun panik pada unwrap().
  • param = 4 → fund_owner. Mekanisme yang sama seperti 3.
  • param = 5 → create_pool_fee
  • param = 6 → disable_create_pool (nilai non-nol apa pun menonaktifkan)
  • param = 7 → creator_fee_rate (menegaskan creator_fee_rate + trade_fee_rate < 1_000_000)
  • param = 8 → creator_fee_share_rate (menegaskan ≤ 1_000_000). Ditambahkan 2026-09-19. Bagian default protokol dari biaya kreator pada tingkat ini; lihat products/cpmm/fees. Itu tidak terkait dengan protocol_fee_rate, yang membagi biaya perdagangan.
param apa pun yang lain mengembalikan InvalidInput. Perubahan ditandatangani oleh admin dan mempengaruhi setiap pool yang terikat pada AmmConfig ini pada swap berikutnya. Tidak ada migrasi; pool hanya membaca nilai baru.

CreateCreatorFeeShare

Tetapkan bagian protokol khusus dari biaya kreator untuk satu pasangan (creator, amm_config), menimpa AmmConfig.creator_fee_share_rate untuk setiap pool yang dimiliki kreator itu pada tingkat biaya itu. Ditambahkan dalam upgrade pembagian biaya kreator 2026-09-19. Argumen
Akun Kondisi Pra
  • share_rate <= 1_000_000, sebaliknya InvalidInput (6003).
  • PDA tidak boleh sudah ada — init Anchor gagal pada panggilan kedua untuk pasangan yang sama. Untuk mengubah tingkat, tutup akun dan buat lagi.
Kondisi Pasca
  • creator_fee_share menyimpan bump, creator, amm_config dan share_rate.
  • Setiap CollectCreatorFee / CollectCreatorFeePermissionless berikutnya pada pool yang dibuat oleh creator di bawah amm_config menyelesaikan bagian dari akun ini bukan konfigurasi.
Pembuat pool bukan pihak dalam instruksi ini dan tidak menandatanganinya. Tingkat dibaca pada waktu pengumpulan, jadi penimpaan yang dibuat setelah biaya sudah terkumpul berlaku untuk saldo yang sudah terkumpul itu juga.

CloseCreatorFeeShare

Hapus penimpaan. Pasangan kembali ke AmmConfig.creator_fee_share_rate. Argumen — tidak ada. Akun Kondisi Pasca
  • Akun ditutup dan lamportnya pergi ke owner.
  • Pengumpulan untuk pasangan itu menyelesaikan bagian dari amm_config.creator_fee_share_rate lagi — yang 0 kecuali admin telah menetapkan parameter UpdateAmmConfig 8.

CollectExcessLamports

Penyapuan admin lamport yang duduk di atas minimum bebas sewa pada akun yang dikendalikan CPMM. Ditambahkan dalam upgrade 2026-09 sehingga protokol dapat mengklaim kelebihan pendanaan yang ditinggalkan pengurangan sewa SIMD-0437 pada akun yang dibuat sebelum setiap langkah. Hanya kelebihan yang bergerak. Saldo token, data akun, pemilik, status pool dan kurva tidak tersentuh, dan instruksi adalah no-op terhadap akun yang sudah di minimum — jadi aman untuk dijalankan kembali setelah setiap peluncuran langkah. Argumen — tidak ada. Akun
Perbaikan urutan, 2026-09-19. Program sekarang membuat dua lintasan atas remaining_accounts — setiap CPI program token terlebih dahulu, kemudian debit langsung PDA yang dikendalikan CPMM. Menyelipnya membatalkan dengan UnbalancedInstruction runtime (“jumlah saldo akun sebelum dan sesudah instruksi tidak cocok”) kapan pun PDA didebit sebelum CPI, karena perubahan lamport yang tertunda pemanggil hanya disiram ke akun yang CPI benar-benar bawa. Pemanggil tidak harus mengelompokkan atau mengurutkan daftar sendiri.
Bagaimana setiap akun sumber ditangani Program mengirim berdasarkan owner akun sumber: Karena mengambil daftar remaining_accounts yang tidak terbatas, ukuran transaksi adalah batas nyata — batasan yang sama seperti penyapuan sisi dompet yang dijelaskan di solana-fundamentals/rent-and-reclaimable-rent. Error Umum — InvalidOwner (6001, penandatangan salah), LamportsCalculateError (6015, putaran wSOL tidak nol bersih), dan InsufficientFunds dari jalur yang dimiliki program ketika akun menyimpan kurang dari minimum sewa sendirinya. Tidak ada pembangun SDK. @raydium-io/raydium-sdk-v2 tidak mengirim pembangun untuk instruksi ini, dan begitu juga repo raydium-sdk-V2-demo — itu adalah jalur admin. Enkode dengan tangan, cara penyapuan sisi dompet di solana-fundamentals/rent-and-reclaimable-rent lakukan untuk instruksi program token.

Matriks perubahan status

Ke mana selanjutnya

Sumber: