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.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
* 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_mintberdasarkan urutan byte). - Tidak ada mint yang menggunakan ekstensi di luar daftar putih CPMM (
TransferFeeConfig,MetadataPointer,TokenMetadata,InterestBearingConfig,ScaledUiAmount) — lihatproducts/cpmm/accounts. Mint yang PDASupportMintAssociated-nya (seed[b"support_mint", mint]) ada melewati pemeriksaan ekstensi — tetapi Anda harus menambahkan PDA itu keremaining_accounts. Program hanya memindai akun yang Anda teruskan dan tidak pernah memuat PDA itu sendiri, jadi mengandalkan registri tanpa menyediakan akun masih gagal denganNotSupportMint(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. creatormemiliki setidaknyainit_amount_0daninit_amount_1di ATA masing-masing.amm_config.disable_create_pool == false.
pool_state.lp_supply = sqrt(init_amount_0 * init_amount_1)— akar kuadrat penuh. Pembuat dimintlp_supply − 100; 100 unit dasar terkunci dihitung dalamlp_supplytetapi tidak pernah dimint.- Jadi
lp_mint.supply == pool_state.lp_supply − 100untuk seumur hidup pool. Semua matematika LP-share (deposit, withdraw) membagi denganlp_supply, jadi gunakan bidang itu dan jangan ganti dengan pasokan mint on-chain. Kembali denganInitLpAmountTooLessjikasqrt(...) < 100. observation_statediinisialisasi;observation_index = 0danpool_id = pool_state.key().- Lamport
create_pool_feeditransfer 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 = falsedancreator_fee_on = BothToken.Initializetidak mendukung pengaktifan biaya kreator — jalur itu adalahInitializeWithPermission.open_timeditingkatkan keblock_timestamp + 1jika pemanggil melewatkan nilai<= block_timestamp. Swap ditolak sebelumopen_time; deposit dan penarikan bekerja segera.
reference/error-codes)
InvalidInput— mint tidak diurutkan, atau mint identik.NotSupportMint— ekstensi Token-2022 yang diblokir.ExceededSlippage— jarang; jikainit_amount_0/1menghasilkan LP nol karena ketidakcocokan desimal.
Deposit
Tambahkan likuiditas di kedua token sebanding dengan pool.
Argumen
Matematika
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).
ExceededSlippage, ZeroTradingTokens, InvalidStatus jika deposit dijeda.
Withdraw
Bakar token LP dan terima kedua token dasar secara pro-rata.
Argumen
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
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
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_statusmemungkinkan swap.- Tidak ada mint dijeda atau dibekukan untuk otoritas ini.
amount_in > 0.
ExceededSlippage—amount_out < minimum_amount_out.ZeroTradingTokens— perdagangan dibulatkan menjadi nol.NotApproved— pool dijeda untuk swap melaluiUpdatePoolStatus.InvalidInput— mint tidak cocok dengan salah satu mint vault pool.
SwapBaseOutput
Swap output-pasti.
Argumen
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
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
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
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
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
Kondisi Pra
- Tidak ada
AmmConfigyang ada denganindexyang 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(menegaskantrade_fee_rate + creator_fee_rate < 1_000_000)param = 1→protocol_fee_rate(menegaskan≤ 1_000_000dan+ fund_fee_rate ≤ 1_000_000)param = 2→fund_fee_rate(menegaskan≤ 1_000_000dan+ protocol_fee_rate ≤ 1_000_000)param = 3→protocol_owner. Kunci baru bukan dalamvalue: tambahkan sebagairemaining_accounts[0](read-only tidak apa-apa). Itu tidak boleh menjadi pubkey default, dan menghilangkan akun panik padaunwrap().param = 4→fund_owner. Mekanisme yang sama seperti3.param = 5→create_pool_feeparam = 6→disable_create_pool(nilai non-nol apa pun menonaktifkan)param = 7→creator_fee_rate(menegaskancreator_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; lihatproducts/cpmm/fees. Itu tidak terkait denganprotocol_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
Kondisi Pra
share_rate <= 1_000_000, sebaliknyaInvalidInput(6003).- PDA tidak boleh sudah ada —
initAnchor gagal pada panggilan kedua untuk pasangan yang sama. Untuk mengubah tingkat, tutup akun dan buat lagi.
creator_fee_sharemenyimpanbump,creator,amm_configdanshare_rate.- Setiap
CollectCreatorFee/CollectCreatorFeePermissionlessberikutnya pada pool yang dibuat olehcreatordi bawahamm_configmenyelesaikan 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_ratelagi — yang0kecuali admin telah menetapkan parameterUpdateAmmConfig8.
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.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
products/cpmm/code-demos— sampel TypeScript yang dapat dijalankan untuk di atas.reference/error-codes— tabel error Anchor lengkap.products/cpmm/fees— model akrual biaya yang dikeringkan instruksiCollect*Fee.

