Skip to main content
Halaman ini diterjemahkan secara otomatis oleh AI. Versi bahasa Inggris adalah acuan resmi.Lihat versi bahasa Inggris β†’
Halaman ini berpasangan dengan products/clmm/accounts (apa itu akun) dan products/clmm/math (apa itu matematika). Halaman ini adalah acuan otoritatif untuk argumen dan urutan akun; tata letak byte spesifik berasal dari IDL.Upgrade program 2026-09 membangun kembali CLMM di Anchor 1.0.2 / Solana 3.1.10, menambahkan instruksi admin CollectExcessLamports, dan mengubah apa yang ditulis CreateAmmConfig ke dalam owner / fund_owner. Tidak ada instruksi yang menghadap pengguna yang mengubah akun, argumen, atau matematikanya. Lihat entri changelog 2026-09-30.Upgrade program 2026-10-22 mengganti nama CreatePermissionedPool menjadi CreateCustomizablePoolV2, membuatnya dapat dipanggil oleh siapa saja, dan menghapus akun Permission beserta dua instruksi adminnya. Lihat entri changelog 2026-10-22.

Inventaris instruksi

Tidak ada instruksi init-tick-array, dan tidak ada yang diperlukan. Tick array dibuat di dalam OpenPosition* / IncreaseLiquidity* oleh TickArrayState::get_or_create_tick_array, dibayar oleh payer. Lewatkan PDA tick-array (mungkin masih belum diinisialisasi, milik sistem) sebagai tick_array_lower / tick_array_upper dan program mengalokasikannya jika hilang. OpenLimitOrder melakukan hal yang sama untuk tick_array tunggalnya.
Sebagian besar instruksi admin-only (CreateAmmConfig, UpdateAmmConfig, UpdatePoolStatus, CreateOperationAccount, UpdateOperationAccount, CloseProtocolPosition) dijaga oleh pubkey admin yang dikodekan keras dalam program. CreateSupportMintAssociated / CloseSupportMintAssociated menerima pubkey admin atau kunci pemilik support-mint khusus; CollectExcessLamports menerima pubkey admin atau dompet collect-lamports khusus. Instruksi admin aliran reward (TransferRewardOwner, CollectRemainingRewards) dijaga oleh pendana reward, bukan admin program. Akhiran V2 berarti β€œmendukung Token-2022 di vault / NFT, memerlukan slot bitmap-extension”. SDK memilih V2 secara default untuk pool baru.

CreatePool

Argumen
Akun (ringkas)
Slot 10 dan 11 adalah per-mint, bukan β€œSPL Token lalu Token-2022”. Masing-masing dibatasi oleh mint::token_program pada mint yang cocok, jadi untuk pool yang token_mint_0 adalah Token-2022 dan token_mint_1 adalah SPL klasik Anda harus meneruskan Token-2022 di slot 10 dan SPL Token di slot 11. CreateCustomizablePool dan CreateCustomizablePoolV2 menggunakan dua slot yang sama.
Prekondisi
  • token_mint_0 < token_mint_1 menurut urutan byte.
  • amm_config.disable_create_pool == false.
  • Mint tidak ditolak oleh daftar allow-list ekstensi Token-2022.
Postkondisi
  • pool_state.sqrt_price_x64 = sqrt_price_x64, tick_current = floor(log_{1.0001}(price)).
  • pool_state.liquidity = 0 (belum ada posisi).
  • pool_state.fee_on = FromInput (default warisan).
  • pool_state.dynamic_fee_info adalah nol (dynamic fee dinonaktifkan).

CreateCustomizablePool

Direkomendasikan untuk pool baru. Efek yang sama dengan CreatePool ditambah mode pengumpulan biaya per-pool dan opt-in dynamic-fee opsional. Argumen
Akun β€” tepat 13 akun yang dideklarasikan dari CreatePool. dynamic_fee_config bukan akun yang dideklarasikan.
Ketika enable_dynamic_fee = true, DynamicFeeConfig yang akan di-snapshot harus disediakan sebagai akun sisa terakhir β€” handler membaca ctx.remaining_accounts.last(). Setiap PDA bypass SupportMintAssociated harus oleh karena itu datang sebelumnya, atau program mengambil snapshot akun yang salah dan gagal deserialisasi. Menghilangkannya saat flag diatur gagal dengan AccountLack.
Prekondisi β€” sama dengan CreatePool. Jika enable_dynamic_fee = false, tidak ada remaining_account yang diperlukan dan yang dilewatkan hanya dipindai untuk catatan support-mint. Postkondisi
  • pool_state.fee_on diatur ke varian CollectFeeOn yang dipilih.
  • Jika dynamic fee diaktifkan: pool_state.dynamic_fee_info diinisialisasi dari DynamicFeeConfig yang disediakan (lima parameter kalibrasi disalin; bidang status dinolkan).
  • Jika tidak: pool_state.dynamic_fee_info adalah nol (= dynamic fee tidak aktif selamanya untuk pool ini).
fee_on dan bit enablement dynamic-fee diatur hanya saat pembuatan pool. Tidak ada upgrade in-place β€” pool yang dibuat melalui CreatePool warisan tidak dapat secara retroaktif mendapatkan dynamic fee atau biaya satu sisi. Deployment baru harus default ke instruksi ini.

CreateCustomizablePoolV2

Baik CreatePool maupun CreateCustomizablePool menurunkan pool PDA dari ["pool", amm_config, token_mint_0, token_mint_1], sehingga ada tepat satu alamat pool kanonik per triple (config, mint0, mint1) β€” inisialisasi kedua pada seed yang sama akan gagal. CreateCustomizablePoolV2 menghilangkan batasan tersebut dengan melipat seed_index: u16 yang disediakan klien ke dalam seed pool PDA, memungkinkan beberapa pool untuk pasangan dan tier biaya yang sama β€” masing-masing di alamatnya sendiri. Siapa pun dapat memanggilnya. Segala hal lain tentang pool identik dengan CreateCustomizablePool: ia mengambil CreateCustomizableParams yang sama dan mendukung biaya satu sisi serta opsi dynamic-fee.
Hingga upgrade 2026-10-22, instruksi ini disebut CreatePermissionedPool dan memerlukan pembayar untuk memegang PDA Permission yang dikeluarkan admin. Upgrade tersebut mengganti namanya, menghapus akun permission, dan menghapus mesin permission. Diskriminator berubah seiring dengan nama, jadi klien yang dibangun terhadap CreatePermissionedPool harus dibangun ulang.
Argumen
Akun remaining_accounts: PDA registri support-mint ketika mint Token-2022 membutuhkannya, dan DynamicFeeConfig terakhir ketika enable_dynamic_fee = true β€” seperti dalam CreateCustomizablePool. Prekondisi
  • seed_index != 0. seed_index bernilai 0 dicadangkan untuk pool warisan dan ditolak di sini; komponen seed [0, 0] adalah yang membuat alamat pool warisan runtuh ke bentuk empat-seed klasik.
  • Tidak ada pool yang sudah ada di alamat yang diturunkan.
  • Aturan mint / allow-list yang sama dengan CreatePool.
Postkondisi
  • pool_state baru ada di alamat yang diturunkan seed_index, dengan pool_state.seed_index = seed_index.
  • Semua post-state lainnya cocok dengan CreateCustomizablePool (mode biaya, dynamic fee opsional).
Karena pool_creator tidak diperiksa, pembayar apa pun dapat menulis alamat apa pun ke dalam pool_state.owner. Alamat tersebut dapat memanggil InitializeReward di pool, tetapi itu bukan bukti siapa yang membuat pool. Integrator tidak boleh memberi label atau menentukan peringkat pool V2 berdasarkan owner mereka.

OpenPositionV2 / OpenPositionWithToken22Nft

Buat posisi baru di dalam pool yang sudah ada. Argumen
Akun β€” kedua varian memiliki daftar akun yang berbeda. OpenPositionV2 mendeklarasikan 22; OpenPositionWithToken22Nft mendeklarasikan 20. OpenPositionV2, secara berurutan: OpenPositionWithToken22Nft adalah daftar yang sama dengan metadata_account (5) dan metadata_program (19) dihapus β€” ia menulis metadata posisi melalui ekstensi metadata Token-2022 pada mint NFT sebagai gantinya β€” menghasilkan 20 akun. position_nft_mint adalah Signer biasa dan position_nft_account adalah UncheckedAccount.
tick_array_bitmap_extension bukan akun yang dideklarasikan di kedua varian. Ketika jangkauan posisi berada di luar tick_array_bitmap inline pool (Β±512 tick array), tambahkan PDA TickArrayBitmapExtension di seed ["pool_tick_array_bitmap_extension", pool_state] sebagai remaining_accounts[0].
Matematika β€” lihat products/clmm/math. Diberikan base_flag, program menyelesaikan baik liquidity atau (amount_0_max, amount_1_max) menjadi L aktual dan jumlah token aktual yang dikonsumsi. Prekondisi
  • tick_lower < tick_upper, keduanya kelipatan pool.tick_spacing, dalam [MIN_TICK, MAX_TICK].
  • Dua PDA tick-array dilewatkan. Mereka tidak perlu sudah ada β€” get_or_create_tick_array mengalokasikan yang hilang di biaya payer di dalam instruksi ini. Tidak ada instruksi init-tick-array terpisah.
  • Pengguna memiliki setidaknya amount_0_max dan amount_1_max di ATA sumber.
Postkondisi
  • personal_position ada, liquidity diatur, fee_growth_inside_last difoto.
  • Entri tick-array di tick_lower dan tick_upper diperbarui (liquidity_gross += L, liquidity_net Β± L, snapshot pertumbuhan biaya dipertahankan).
  • pool_state.liquidity += L jika posisi dalam jangkauan (tick_lower ≀ tick_current < tick_upper).
  • Mint NFT posisi mencatat pool_state sebagai otoritas pembekuan. Otoritas mint dihapus setelah NFT tunggal dimint. Mencatat otoritas pembekuan tidak mengubah status akun token NFT.
  • Akun token NFT tetap tidak beku kecuali instruksinya adalah OpenPositionV2 atau OpenPositionWithToken22Nft dan otoritas pembekuan mint vault cocok dengan daftar penerbit terbatas CLMM. Hanya jalur V2 yang cocok yang membekukan akun. OpenPosition V1 tidak membekukan.
Kesalahan umum β€” TickInvalidOrder (tick_lower >= tick_upper), TickAndSpacingNotMatch (titik akhir bukan kelipatan tick_spacing), InvalidTickIndex (di luar [MIN_TICK, MAX_TICK]), MissingTickArrayBitmapExtensionAccount (jangkauan di luar bitmap inline dan ekstensi tidak ditambahkan), NotApproved (pool_state.status memblokir pembukaan), ZeroAmountSpecified.
Pembekuan posisi tidak menambahkan akun instruksi yang dideklarasikan atau argumen. Klien dapat membuka posisi ini dengan tata letak V2 yang ada. Perilaku dipilih on-chain dari vault_0_mint dan vault_1_mint.

IncreaseLiquidityV2

Tambahkan likuiditas ke posisi yang sudah terbuka. Argumen
Akun β€” 15, dan tidak dapat diturunkan dari OpenPosition: tidak ada rent, tidak ada system_program, tidak ada associated_token_program dan tidak ada akun metadata. Tambahkan PDA TickArrayBitmapExtension di depan sebagai remaining_accounts[0] ketika jangkauan posisi berada di luar bitmap inline. Efek
  • Mentransfer amount_0_actual / amount_1_actual dari pengguna β†’ vault.
  • Menambah personal_position.liquidity dan pool_state.liquidity (jika dalam jangkauan), dan liquidity_gross / liquidity_net tick titik akhir sesuai kebutuhan.
  • Mengumpulkan biaya dan reward yang terhutang sejak sentuhan terakhir dan mengkreditkannya ke token_fees_owed_{0,1} / reward_amount_owed. Ini dibayarkan hanya pada DecreaseLiquidity / DecreaseLiquidityV2, bukan pada peningkatan β€” tidak ada instruksi pengumpulan mandiri.

DecreaseLiquidityV2

Hapus likuiditas dari posisi. Argumen
Akun β€” 16, dan bukan bentuk atau urutan yang sama dengan IncreaseLiquidityV2: personal_position dan pool_state ditukar, vault datang sebelum tick array, akun sisi pengguna dinamai recipient_token_account_*, dan ada memo_program tambahan. Akun yang tersisa β€” tiga per reward aktif yang dikumpulkan, dalam urutan reward_token_vault(W), recipient_token_account(W), reward_vault_mint. Tambahkan PDA TickArrayBitmapExtension di depan ketika jangkauan posisi berada di luar bitmap inline.
Ini juga satu-satunya cara untuk mengumpulkan biaya dan reward. Untuk mengumpulkan tanpa mengubah posisi, panggilnya dengan liquidity = 0, amount_0_min = 0, amount_1_min = 0.
Efek
  • Menghitung (amount_0, amount_1) untuk L yang dihapus diberikan sqrt_price_x64 saat ini.
  • Menyelesaikan biaya/reward yang terkumpul sejak sentuhan terakhir, sama dengan IncreaseLiquidity.
  • Mentransfer amount_0 + fees_owed_0 dan amount_1 + fees_owed_1 keluar dari vault ke pengguna.
  • Mengurangi penghitung likuiditas; jika personal_position.liquidity == 0 baru, posisi memenuhi syarat untuk ClosePosition.
Slippage β€” amount_0_min dan amount_1_min adalah minimum yang diterima pengguna bersih dari biaya transfer Token-2022 di sisi output.

ClosePosition

Bakar NFT posisi dan tutup PersonalPositionState. Akun yang dideklarasikan Akun yang tersisa
  • NFT yang tidak dibekukan: tidak ada yang diperlukan; akun pool tambahan tidak berbahaya karena handler tidak membacanya.
  • NFT yang dibekukan: tambahkan personal_position.pool_id sebagai akun yang tersisa pertama. Program memuat sebagai PoolState dan menggunakan seed PDA-nya untuk menandatangani pencairan.
Kondisi awal
  • personal_position.liquidity == 0.
  • tokens_fees_owed_{0,1} == 0.
  • Semua penghitung reward reward_amount_owed == 0.
(Yaitu, kumpulkan semuanya dan kurangi ke nol terlebih dahulu.) Efek
  • Jika akun token NFT dibekukan, verifikasi akun yang tersisa pertama sama dengan personal_position.pool_id, kemudian cairkan dengan PDA pool.
  • Bakar NFT.
  • Tutup akun token NFT dan personal_position, mengembalikan sewa ke nft_owner. Jika NFT posisi menggunakan Token-2022, juga tutup mint NFT; mint SPL Token klasik tidak dapat ditutup dan tetap dengan pasokan nol.
Pencairan, pembakaran, dan penutupan bersifat atomik. NFT tidak dapat menjadi dapat ditransfer di antara langkah-langkah tersebut. Pemutus klien bersyarat β€” tata letak IDL yang dideklarasikan tidak berubah, sehingga klien lama terus menutup posisi yang ada dan tidak dibekukan. Pembangun lama yang menghilangkan akun pool yang tersisa gagal dengan AccountLack saat menutup posisi yang dibekukan. Melewatkan pool untuk setiap penutupan adalah strategi yang paling kompatibel.

SwapV2

Berjalan di sepanjang kurva likuiditas; input tepat atau output tepat tergantung pada is_base_input. Argumen
Akun (ringkas) Pemanggil melewatkan daftar tick array berperingkat yang mencakup jalan swap yang diharapkan; program menggunakan sebanyak yang diperlukan. SDK menghitung daftar ini melalui PoolUtils.computeAmountOutFormat atau endpoint quote API. Kondisi awal
  • pool_state.status memungkinkan swap.
  • now >= open_time.
  • sqrt_price_limit_x64 berada di sisi yang benar dari sqrt_price_x64 untuk arahnya.
Kesalahan umum β€” TooLittleOutputReceived (slippage exact-in), TooMuchInputPaid (slippage exact-out), SqrtPriceLimitOverflow, NotEnoughTickArrayAccount, InvalidFirstTickArrayAccount, MissingTickArrayBitmapExtensionAccount, LiquidityInsufficient, NotApproved (bit swap diatur pada pool_state.status). CLMM tidak memiliki varian ExceededSlippage β€” nama itu milik CPMM β€” dan tidak ada TickArrayNotFound. Apa yang dilakukan SwapV2 secara internal yang harus diketahui pemanggil (rilis pasca-2025):
  1. Surcharge biaya dinamis β€” jika pool.dynamic_fee_info bukan nol, program memperbarui akumulator volatilitas menggunakan jarak tick yang dilalui sejak swap terakhir (dengan aturan filter/decay dari products/clmm/fees) dan menambahkan dynamic_fee_component di atas AmmConfig.trade_fee_rate. Total biaya dibatasi pada 10% (MAX_FEE_RATE_NUMERATOR / 1_000_000).
  2. Pencocokan limit order β€” ketika jalan harga melintasi tick yang memegang limit order terbuka, program pertama-tama mengisi likuiditas limit order yang tersedia di tick itu (FIFO oleh order_phase), kemudian melanjutkan di sepanjang kurva likuiditas LP. Jumlah yang diisi memperbarui tick.unfilled_ratio_x64 dan tick.part_filled_orders_remaining untuk penyelesaian nanti; order itu sendiri tetap tidak dihabiskan sampai pemiliknya memanggil SettleLimitOrder.
  3. Perutean biaya satu sisi β€” ketika pool.fee_on = Token0Only atau Token1Only, langkah swap masih menghitung perdagangan input-output yang sama; biaya kemudian dirutkan ke sisi yang dikonfigurasi. Untuk arah di mana sisi biaya yang dikonfigurasi adalah output, biaya dikurangi dari output swap (pengguna menerima out βˆ’ fee); untuk arah di mana itu adalah input, perilaku cocok dengan FromInput. Lihat is_fee_on_input(zero_for_one) dan is_fee_on_token0(zero_for_one) pada PoolState.
Swap (V1) mengimplementasikan biaya dinamis yang sama, perutean biaya satu sisi, dan pencocokan limit order seperti SwapV2; satu-satunya fitur yang tidak dimilikinya adalah dukungan Token-2022 β€” kedua vault harus berupa SPL Token klasik. Pool dengan mint Token-2022 apa pun harus ditukar melalui SwapV2. Agregator dan SDK sudah lebih memilih V2 untuk setiap leg CLMM sehingga pemanggil tidak perlu bercabang pada jenis mint.

OpenLimitOrder

Tempatkan pesanan jual pada tick tertentu. Pesanan duduk di kohort FIFO per-tick dan diisi saat harga berjalan melewati. Argumen
Akun (ringkas) Akun yang tersisa β€” [0] tick_array_bitmap_extension, diperlukan hanya saat menginisialisasi array tick yang indeks awalnya berada di luar bitmap inline pool. Jangan lewatkan apa pun sebaliknya.
Tidak ada akun rent: struct berakhir di system_program, 13 akun yang dideklarasikan. rent yang tersesat di posisi 14 mendarat tepat di mana ekstensi bitmap opsional dibaca, sehingga pesanan tampak berfungsi sampai pertama kali array tick di luar bitmap inline harus dibuat β€” dan kemudian gagal.
Perubahan daftar akun (rilis 2026-07). OpenLimitOrder sekarang juga mengambil akun sisi output β€” output_token_account, output_vault, dan output_vault_mint β€” selain sisi input. Mereka digunakan hanya untuk validasi: program menolak pesanan jika akun token input atau output pemilik dibekukan. Ini menjamin bahwa pengisian benar-benar dapat diselesaikan ke ATA output pemilik, yang penting untuk mint Token-2022 dengan daftar izin / beku default (misalnya token berlisensi) di mana akun mungkin belum dicairkan. Klien yang dibangun terhadap daftar akun satu sisi yang lebih lama harus menambahkan tiga akun output.
Kondisi awal
  • Baik input_token_account maupun output_token_account tidak dibekukan (jika tidak NotApproved).
  • pool_state.status memungkinkan operasi swap (bit 4) dan limit-order (bit 5) (jika tidak NotApproved).
  • tick_index % pool.tick_spacing == 0 dan dalam [MIN_TICK, MAX_TICK].
  • tick_index berada di sisi kanan pool.tick_current untuk arah yang dipilih (menjual token0 β†’ tick harus di atas saat ini, dan sebaliknya). Menjual pada tick yang sudah dilintasi akan dicocokkan segera dan ditolak.
Kondisi akhir
  • limit_order ada, mengambil snapshot tick.order_phase dan tick.unfilled_ratio_x64 pada waktu pembukaan.
  • tick.orders_amount += amount (dalam kohort saat ini).
  • limit_order_nonce.order_nonce += 1.
  • OpenLimitOrderEvent dipancarkan.
Kesalahan umum β€” NotApproved (akun token input atau output dibekukan, atau pool memiliki swap / limit-order dinonaktifkan), ZeroAmountSpecified (amount == 0 setelah biaya transfer sisi input), InvalidLimitOrderAmount (jumlah akan menghasilkan output di bawah 1 unit dasar pada tick itu, atau overflow u64), InvalidTickIndex (di luar [MIN_TICK, MAX_TICK], atau di sisi yang salah dari tick_current untuk arah yang dipilih), TickAndSpacingNotMatch (tick_index % pool.tick_spacing != 0), OrderPhaseSaturated.

IncreaseLimitOrder

Tambahkan ke pesanan terbuka yang ada. Hanya dapat dipanggil oleh owner pesanan. Argumen
Akun β€” 8, hanya sisi input. Ini menghilangkan akun nonce, ketiga akun sisi output dan system_program. Kondisi awal
  • limit_order.owner == signer.
  • Pesanan masih dalam kohort yang sama (tick.order_phase == limit_order.order_phase). Jika kohort sudah mulai diisi, pesanan sebagian diselesaikan β€” pemanggil harus memanggil DecreaseLimitOrder atau SettleLimitOrder terlebih dahulu untuk maju.
Efek
  • Mentransfer amount dari ATA pemilik ke input_vault.
  • limit_order.total_amount += amount; tick.orders_amount += amount.

DecreaseLimitOrder

Kurangi atau batalkan sepenuhnya pesanan terbuka. Membayar sisa yang tidak diisi kembali ke pemilik, ditambah output apa pun yang sudah diselesaikan oleh pengisian parsial sebelumnya. Argumen
Akun β€” kedua sisi token input dan output: Efek
  • Menghitung ulang jumlah pengisian pesanan dari unfilled_ratio_x64 kohort sejak pembukaan.
  • Mengirim output yang diisi ke output_token_account.
  • Mengirim amount dari input yang tidak diisi kembali ke input_token_account.
  • Memperbarui limit_order sesuai kebutuhan. Jika sisa yang tidak diisi baru adalah nol, program menutup akun dan mengembalikan sewa ke owner.

SettleLimitOrder

Dorong token output yang telah terisi ke pemilik tanpa mengubah sisa order yang belum terisi. Berguna ketika keeper auto_withdraw ingin melakukan pembayaran bertahap untuk pengisian parsial jangka panjang. Pemanggil β€” baik owner order, atau limit_order_admin program (dompet operasional panas off-chain yang menjalankan loop keeper otomatis). Keeper tidak memiliki otoritas lain β€” tidak dapat memindahkan dana pengguna di luar mendorong output terisi ke ATA owner order. Akun Efek
  • Menghitung output kumulatif yang diterima menggunakan (limit_order.unfilled_ratio_x64, tick.unfilled_ratio_x64).
  • Mentransfer delta ke output_token_account.
  • Memperbarui limit_order.settled_output.
  • Tidak menutup order; order masih terbuka terhadap input yang tersisa.

CloseLimitOrder

Tutup akun order yang sepenuhnya dikonsumsi. Sewa selalu dikembalikan ke limit_order.owner terlepas dari siapa yang menandatangani. Pemanggil β€” baik owner atau limit_order_admin. Prasyarat
  • Order memiliki sisa yang belum terisi nol (baik amount == total_amount telah terisi dan diselesaikan, atau pemilik sebelumnya mengurangi order menjadi nol dan lupa menutupnya).
Efek
  • Menutup limit_order; sewa dikirim ke limit_order.owner.

CreateDynamicFeeConfig (admin)

Buat set parameter yang dapat digunakan kembali di bawah indeks u16. Argumen
Akun Kesalahan umum β€” InvalidDynamicFeeConfigParams jika decay_period <= filter_period atau bidang bernilai 0 di luar batas.

UpdateDynamicFeeConfig (admin)

Ubah DynamicFeeConfig yang ada. Pool yang sudah mengambil snapshot konfigurasi saat pembuatan tidak diperbarui secara retroaktif; hanya pool yang baru dibuat yang mereferensikan konfigurasi ini akan mengambil nilai baru. Argumen β€” lima bidang kalibrasi yang sama seperti CreateDynamicFeeConfig (filter_period, decay_period, reduction_factor, dynamic_fee_control, max_volatility_accumulator); index ditetapkan saat pembuatan dan tidak dilewatkan ulang di sini.

CollectProtocolFee / CollectFundFee

Kumpulkan biaya protokol/dana yang terkumpul dari vault pool ke penerima, mengosongkan bidang PoolState.protocol_fees_* / fund_fees_* yang sesuai. Ini bukan tata letak CPMM β€” CLMM tidak memiliki akun authority, dan bidang penerima dinamai recipient_token_account_{0,1} bukan recipient_token_{0,1}_account. Argumen β€” amount_0_requested: u64, amount_1_requested: u64.
Berubah di 2026-09: konfigurasi baru tidak lagi mengambil pemilik biaya dari penandatangan. create_amm_config sekarang menulis protocol_fee_owner::ID program yang dikodekan keras ke dalam owner dan fund_fee_owner::ID ke dalam fund_owner. Sebelumnya, ia menyalin kunci penandatangan admin ke keduanya. Di mainnet ini adalah kunci yang sama yang sudah disimpan di semua 21 konfigurasi yang ada. Alamat ada di reference/program-addresses.Penandatangan yang diterima di atas tidak berubah. Admin masih dapat mengumpulkan dari konfigurasi apa pun, dan akun AmmConfig yang ada tidak ditulis ulang. Baca owner / fund_owner dari akun daripada mengasumsikan nilai apa pun. Parameter UpdateAmmConfig 3 dan 4 masih memutar keduanya.

CollectExcessLamports

Penyapuan admin lamport di atas minimum bebas sewa pada akun yang dikendalikan CLMM. Ini ditambahkan dalam upgrade 2026-09 untuk mengklaim pendanaan berlebih yang pengurangan sewa SIMD-0437 tinggalkan pada akun yang dibuat sebelum setiap langkah. Hanya kelebihan yang bergerak. Saldo token, data akun, pemilik, status pool, dan kurva harga tidak tersentuh. Akun yang sudah mencapai minimumnya dibiarkan apa adanya, sehingga instruksi dapat dijalankan kembali dengan aman setelah setiap peluncuran. Argumen: tidak ada. Akun Cakupan: satu pool per panggilan. CLMM tidak memiliki otoritas vault program-lebar. Vault setiap pool dimiliki oleh PoolState-nya sendiri. Setiap sumber program token harus memiliki pool_state di slot 2 sebagai otoritasnya: token_vault_0, token_vault_1, atau salah satu vault reward pool itu. Jika Anda melewatkan vault pool lain atau akun token pengguna, pemeriksaan pemilik program token gagal dan seluruh instruksi kembali. Ini tidak dilewati. Mint NFT posisi tidak dapat disapu, karena otoritas mint-nya dibatalkan saat posisi dibuka. Cara setiap akun sumber ditangani Program membuat dua lintasan atas remaining_accounts: setiap CPI program token terlebih dahulu, kemudian debit langsung. Menyelipkan keduanya membatalkan dengan kesalahan UnbalancedInstruction runtime, jadi urutan ditetapkan dalam program dan Anda tidak harus mengurutkan daftar sendiri.
Lintasan 2 mencakup akun yang sewanya dibayar pengguna. PersonalPositionState atau LimitOrderState yang dilewatkan di sini melepaskan kelebihannya seperti akun milik CLMM lainnya. Tetap bebas sewa dan menyimpan datanya. Ketika kemudian ditutup, pemilik mendapatkan kembali apa pun yang dipegang akun pada saat itu, yang setelah penyapuan adalah minimum sewa saat ini.
Ukuran transaksi adalah batas nyata pada berapa banyak sumber yang cocok dalam satu panggilan. Ini adalah batasan yang sama dengan penyapuan sisi dompet yang dijelaskan dalam solana-fundamentals/rent-and-reclaimable-rent. Kesalahan umum:
  • NotApproved (6000): penandatangan salah.
  • LamportsCalculateError (6052): putaran wSOL tidak nol bersih.
  • Kesalahan ketidakcocokan pemilik program token: sumber token tidak dimiliki oleh pool_state.
  • InsufficientFunds: akun milik program menyimpan kurang dari minimum sewa-nya sendiri.
Tidak ada pembangun SDK. @raydium-io/raydium-sdk-v2 tidak mengirimkan pembangun untuk jalur admin ini. Enkode dengan tangan dari IDL.

InitializeReward

Tambahkan aliran reward baru ke pool. Hingga 3 aliran dapat aktif sekaligus. Argumen β€” satu struct, param: InitializeRewardParam:
Pengkodean wire adalah tiga bidang berturut-turut, jadi instruksi yang dibangun dengan tangan tidak terpengaruh β€” tetapi klien yang didorong IDL harus melewatkan satu objek param daripada tiga argumen posisional. Akun Prasyarat
  • Kurang dari 3 aliran saat ini aktif di pool.
  • Funder menyetor total_emission = emissions_per_second Γ— (end_time βˆ’ open_time) senilai token reward ke vault sebagai bagian dari instruksi ini.
  • Mint reward yang masuk daftar putih per operation_state.

SetRewardParams

Perpanjang, isi ulang, atau ubah tingkat emisi pada aliran reward yang ada. Biasanya dipanggil oleh pembuat pool atau multisig Raydium. Batasan hidup on-chain: Anda biasanya dapat memperpanjang end_time atau meningkatkan emisi, bukan menyusutnya secara retroaktif. Periksa daftar pemilik operation_state.

UpdateRewardInfos

Pembukuan murni β€” menyelesaikan reward_growth_global_x64 ke waktu saat ini dengan mengalikan emissions_per_second Γ— Ξ”t / liquidity. Dipanggil secara internal oleh setiap instruksi yang menyentuh likuiditas. Diekspos sebagai instruksi mandiri karena aktor eksternal (UI, crank) kadang-kadang ingin memicunya.

Mengumpulkan reward

Tidak ada instruksi kumpul-reward mandiri. Program tidak mengekspos entrypoint CollectReward, dan IDL yang dipublikasikan juga tidak memilikinya.
Reward yang diterima posisi dibayarkan oleh DecreaseLiquidity / DecreaseLiquidityV2. Untuk mengumpulkan tanpa mengubah posisi, panggilnya dengan liquidity = 0, amount_0_min = 0, amount_1_min = 0. Vault reward dan akun penerima masuk remaining_accounts dalam grup tiga per reward aktif, dalam urutan reward_token_vault(W), recipient_token_account(W), reward_vault_mint. CollectRemainingRewards adalah hal yang berbeda: memungkinkan reward funder, setelah end_time aliran, menyapu token yang tidak pernah dialokasikan ke posisi apa pun.

Matriks perubahan state

Langkah selanjutnya

Sumber: