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.Inventaris instruksi
Sebagian besar instruksi admin-only (
CreateAmmConfig, UpdateAmmConfig, UpdatePoolStatus, CreateSupportMintAssociated, CreateOperationAccount, UpdateOperationAccount, CloseProtocolPosition) dijaga oleh pubkey admin yang dikodekan keras program. CreatePermissionPda / ClosePermissionPda menerima pubkey admin atau kunci permission_pda_admin 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 ekstensi bitmap”. SDK memilih V2 secara default untuk pool baru.
CreatePool
Argumen
Prekondisi
token_mint_0 < token_mint_1menurut urutan byte.amm_config.disable_create_pool == false.- Mint tidak ditolak oleh daftar putih ekstensi Token-2022.
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_infoadalah 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
CreatePool ditambah, ketika enable_dynamic_fee = true:
Prekondisi — sama dengan
CreatePool. Jika enable_dynamic_fee = false, dynamic_fee_config diabaikan.
Postkondisi
pool_state.fee_ondiatur ke varianCollectFeeOnyang dipilih.- Jika dynamic fee diaktifkan:
pool_state.dynamic_fee_infodiinisialisasi dariDynamicFeeConfigyang disediakan (lima parameter kalibrasi disalin; bidang state dinolkan). - Jika tidak:
pool_state.dynamic_fee_infoadalah nol (= dynamic fee tidak aktif selamanya untuk pool ini).
fee_on dan bit enablement dynamic-fee diatur hanya saat pembuatan pool. Tidak ada upgrade di tempat — pool yang dibuat melalui CreatePool warisan tidak dapat secara retroaktif mendapatkan dynamic fee atau biaya satu sisi. Penerapan baru harus default ke instruksi ini.
CreatePermissionedPool
Baik CreatePool maupun CreateCustomizablePool menurunkan PDA pool dari ["pool", amm_config, token_mint_0, token_mint_1], jadi ada tepat satu alamat pool kanonik per triple (config, mint0, mint1) — init kedua pada seed yang sama gagal. CreatePermissionedPool menghilangkan pembatasan itu dengan melipat seed_index: u16 yang disediakan klien ke dalam seed PDA pool, memungkinkan beberapa pool untuk pasangan dan tier biaya yang sama — masing-masing di alamatnya sendiri. Karena alamat pool arbitrer adalah kemampuan istimewa, pembayar harus memegang PDA Permission yang mengotorisasinya.
Segalanya tentang pool identik dengan CreateCustomizablePool: ia mengambil CreateCustomizableParams yang sama dan mendukung biaya satu sisi dan opt-in dynamic-fee.
Argumen
CreateCustomizablePool ditambah, di depan:
PDA
pool_state diturunkan dari ["pool", amm_config, token_mint_0, token_mint_1, seed_index.to_le_bytes()].
Prekondisi
seed_index != 0.seed_indexdari0dicadangkan untuk pool warisan dan ditolak di sini; komponen seed[0, 0]adalah apa yang membuat alamat pool warisan runtuh ke bentuk empat-seed klasik.- PDA
permissionuntukpayerada (dibuat oleh admin melaluiCreatePermissionPda). - Aturan mint / daftar putih yang sama dengan
CreatePool.
pool_statebaru ada di alamat yang diturunkanseed_index, denganpool_state.seed_index = seed_index.- Semua kecocokan post-state lainnya
CreateCustomizablePool(mode biaya, dynamic fee opsional).
Instruksi ini tidak memperluas akses pembuatan pool umum — pembuatan tanpa izin terus melalui
CreatePool / CreateCustomizablePool, yang tetap satu-pool-per-pasangan. CreatePermissionedPool ada untuk kasus spesifik di mana operator yang masuk daftar putih memerlukan beberapa pool untuk pasangan yang sama (misalnya harga awal berbeda atau kohort peluncuran) dan memegang PDA Permission yang diberikan oleh admin.OpenPositionV2 / OpenPositionWithToken22Nft
Buat posisi baru di dalam pool yang ada.
Argumen
Matematika — lihat
products/clmm/math. Diberikan base_flag, program menyelesaikan liquidity atau (amount_0_max, amount_1_max) menjadi L aktual dan jumlah token aktual yang dikonsumsi.
Prekondisi
tick_lower < tick_upper, keduanya kelipatanpool.tick_spacing, dalam[MIN_TICK, MAX_TICK].- Tick array yang diperlukan dilewatkan dan diinisialisasi (atau dibuat di sini melalui CPI
InitTickArraydalam transaksi). - Pengguna memiliki setidaknya
amount_0_maxdanamount_1_maxdi ATA sumber.
personal_positionada,liquiditydiatur,fee_growth_inside_lastdiambil snapshot.- Entri tick-array di
tick_lowerdantick_upperdiperbarui (liquidity_gross += L,liquidity_net ± L, snapshot pertumbuhan biaya dipertahankan). pool_state.liquidity += Ljika posisi dalam jangkauan (tick_lower ≤ tick_current < tick_upper).- Mint NFT posisi mencatat
pool_statesebagai 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 instruksi adalah
OpenPositionV2atauOpenPositionWithToken22Nftdan otoritas pembekuan mint vault cocok dengan daftar penerbit terbatas CLMM. Hanya jalur V2 yang cocok yang membekukan akun.OpenPositionV1 tidak membekukan.
InvalidTickIndex, NotApproved, ZeroAmountSpecified, TransactionTooLarge (jika terlalu banyak tick array).
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
OpenPosition minus mint NFT (posisi sudah ada; NFT dilewatkan sebagai ATA pemilik yang memegang 1 token).
Efek
- Mentransfer
amount_0_actual/amount_1_actualdari pengguna → vault. - Menambah
personal_position.liquiditydanpool_state.liquidity(jika dalam jangkauan), danliquidity_gross/liquidity_nettick endpoint sesuai. - Mengumpulkan biaya dan reward yang terhutang sejak sentuhan terakhir dan mengkreditnya ke
tokens_fees_owed_{0,1}/reward_amount_owed. Ini dibayarkan hanya padaDecreaseLiquidityatauCollectReward, bukan pada peningkatan.
DecreaseLiquidityV2
Hapus likuiditas dari posisi.
Argumen
IncreaseLiquidity.
Efek
- Menghitung
(amount_0, amount_1)untukLyang dihapus diberikansqrt_price_x64saat ini. - Menyelesaikan biaya/reward yang terkumpul sejak sentuhan terakhir, sama dengan
IncreaseLiquidity. - Mentransfer
amount_0 + fees_owed_0danamount_1 + fees_owed_1keluar dari vault ke pengguna. - Mengurangi penghitung likuiditas; jika
personal_position.liquiditybaru == 0, posisi memenuhi syarat untukClosePosition.
amount_0_min dan amount_1_min adalah minimum yang diterima pengguna bersih biaya transfer Token-2022 di sisi output.
ClosePosition
Bakar NFT posisi dan tutup PersonalPositionState.
Akun yang dideklarasikan
Akun sisa
- NFT tidak beku: tidak ada yang diperlukan; akun pool tambahan tidak berbahaya karena handler tidak membacanya.
- NFT beku: tambahkan
personal_position.pool_idsebagai akun sisa pertama. Program memuatnya sebagaiPoolStatedan menggunakan seed PDA-nya untuk menandatangani pencairan.
personal_position.liquidity == 0.tokens_fees_owed_{0,1} == 0.- Semua penghitung reward
reward_amount_owed == 0.
- Jika akun token NFT beku, verifikasi akun sisa pertama sama dengan
personal_position.pool_id, kemudian cairkan dengan PDA pool. - Bakar NFT.
- Tutup akun token NFT dan
personal_position, mengembalikan sewa kenft_owner. Jika NFT posisi menggunakan Token-2022, ia juga menutup mint NFT; mint SPL Token klasik tidak dapat ditutup dan tetap dengan pasokan nol.
AccountLack saat menutup posisi beku. Melewatkan pool untuk setiap penutupan adalah strategi kompatibel paling sederhana.
SwapV2
Berjalan di kurva likuiditas; input tepat atau output tepat tergantung pada is_base_input.
Argumen
Pemanggil melewatkan daftar tick array berperingkat yang mencakup jalan swap yang diharapkan; program menggunakan sebanyak yang dibutuhkan. SDK menghitung daftar ini melalui
PoolUtils.computeAmountOutFormat atau endpoint quote API.
Prekondisi
pool_state.statusmemungkinkan swap.now >= open_time.sqrt_price_limit_x64berada di sisi yang benar darisqrt_price_x64untuk arah.
ExceededSlippage, SqrtPriceLimitOverflow, TickArrayNotFound, LiquidityInsufficient.
Apa yang SwapV2 lakukan secara internal yang harus diketahui pemanggil (rilis pasca-2025):
- Surcharge dynamic fee — jika
pool.dynamic_fee_infobukan nol, program memperbarui akumulator volatilitas menggunakan jarak tick yang dilintasi sejak swap terakhir (dengan aturan filter/decay dariproducts/clmm/fees) dan menambahkandynamic_fee_componentdi atasAmmConfig.trade_fee_rate. Total biaya dibatasi pada 10% (MAX_FEE_RATE_NUMERATOR / 1_000_000). - Pencocokan limit-order — ketika jalan harga melintasi tick yang memegang pesanan limit terbuka, program pertama-tama mengisi likuiditas limit-order yang tersedia di tick itu (FIFO menurut
order_phase), kemudian melanjutkan di sepanjang kurva likuiditas LP. Jumlah yang terisi memperbaruitick.unfilled_ratio_x64dantick.part_filled_orders_remaininguntuk penyelesaian nanti; pesanan itu sendiri tetap tidak dihabiskan sampai pemiliknya memanggilSettleLimitOrder. - Perutean biaya satu sisi — ketika
pool.fee_on = Token0OnlyatauToken1Only, langkah swap masih menghitung input-output perdagangan 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 menerimaout − fee); untuk arah di mana itu adalah input, perilaku cocok denganFromInput. Lihatis_fee_on_input(zero_for_one)danis_fee_on_token0(zero_for_one)padaPoolState.
Swap (V1) mengimplementasikan dynamic fee, perutean biaya satu sisi, dan pencocokan limit-order yang sama dengan SwapV2; satu-satunya fitur yang tidak dimilikinya adalah dukungan Token-2022 — kedua vault harus SPL Token klasik. Pool dengan mint Token-2022 apa pun harus ditukar melalui SwapV2. Agregator dan SDK sudah lebih suka V2 untuk setiap leg CLMM jadi pemanggil tidak harus bercabang pada tipe mint.
OpenLimitOrder
Tempatkan pesanan jual pada tick tertentu. Pesanan duduk di kohort FIFO per-tick dan terisi saat harga berjalan melewati.
Argumen
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 beku. Ini menjamin bahwa pengisian dapat benar-benar diselesaikan ke ATA output pemilik, yang penting untuk mint Token-2022 daftar putih / beku default (misalnya token berizin) di mana akun mungkin belum dicairkan. Klien yang dibangun terhadap daftar akun satu sisi yang lebih lama harus menambahkan tiga akun output.- Baik
input_token_accountmaupunoutput_token_accounttidak beku (jika tidakNotApproved). pool_state.statusmemungkinkan operasi swap (bit 4) dan limit-order (bit 5) (jika tidakNotApproved).tick_index % pool.tick_spacing == 0dan dalam[MIN_TICK, MAX_TICK].tick_indexberada di sisi kananpool.tick_currentuntuk arah yang dipilih (menjual token0 → tick harus di atas saat ini, dan sebaliknya). Menjual di tick yang sudah dilintasi akan segera cocok dan ditolak.
limit_orderada, mengambil snapshottick.order_phasedantick.unfilled_ratio_x64saat dibuka.tick.orders_amount += amount(di kohort saat ini).limit_order_nonce.order_nonce += 1.OpenLimitOrderEventdipancarkan.
NotApproved (akun token input atau output beku, atau pool memiliki swap / limit-order dinonaktifkan), InvalidLimitOrderAmount (nol atau di bawah minimum pool), InvalidTickIndex (di luar [MIN_TICK, MAX_TICK], atau di sisi salah 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
OpenLimitOrder minus akun nonce; PDA limit_order dilewatkan langsung.
Prekondisi
limit_order.owner == signer.- Pesanan masih dalam kohort yang sama (
tick.order_phase == limit_order.order_phase). Jika kohort sudah mulai terisi, pesanan sebagian diselesaikan — pemanggil harus memanggilDecreaseLimitOrderatauSettleLimitOrderterlebih dahulu untuk maju.
- Mentransfer
amountdari ATA pemilik keinput_vault. limit_order.total_amount += amount;tick.orders_amount += amount.
DecreaseLimitOrder
Kurangi atau batalkan sepenuhnya pesanan terbuka. Membayar sisa yang tidak terisi kembali ke pemilik, ditambah output apa pun yang sudah diselesaikan oleh pengisian parsial masa lalu.
Argumen
Efek
- Menghitung ulang jumlah terisi pesanan dari
unfilled_ratio_x64kohort sejak dibuka. - Mengirim output terisi ke
output_token_account. - Mengirim
amountinput yang tidak terisi kembali keinput_token_account. - Memperbarui
limit_ordersesuai. Jika sisa yang tidak terisi baru adalah nol, program menutup akun dan mengembalikan sewa keowner.
SettleLimitOrder
Dorong token output yang terisi ke pemilik tanpa mengubah sisa yang tidak terisi pesanan. Berguna ketika keeper auto_withdraw ingin menetes-bayar pengisian parsial yang berjalan lama.
Pemanggil — baik owner pesanan, atau limit_order_admin program (dompet panas operasional off-chain yang menjalankan loop keeper otomatis). Keeper tidak memiliki otoritas lain — ia tidak dapat memindahkan dana pengguna di luar mendorong output terisi ke ATA owner pesanan.
Akun
Efek
- Menghitung output kumulatif yang terhutang menggunakan
(limit_order.unfilled_ratio_x64, tick.unfilled_ratio_x64). - Mentransfer delta ke
output_token_account. - Memperbarui
limit_order.settled_output. - Tidak menutup pesanan; masih terbuka terhadap input yang tersisa.
CloseLimitOrder
Tutup akun pesanan yang sepenuhnya dikonsumsi. Sewa selalu dikembalikan ke limit_order.owner terlepas dari siapa yang menandatangani.
Pemanggil — baik owner atau limit_order_admin.
Prekondisi
- Pesanan memiliki sisa yang tidak terisi nol (baik
amount == total_amountterisi dan diselesaikan, atau pemilik sebelumnya mengurangi pesanan ke nol dan lupa menutup).
- Menutup
limit_order; sewa dikirim kelimit_order.owner.
CreateDynamicFeeConfig (admin)
Buat set parameter yang dapat digunakan kembali di bawah indeks u16.
Argumen
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 dengan 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
Bentuk identik dengan CollectProtocolFee / CollectFundFee CPMM. Penandatangan harus cocok dengan AmmConfig.owner / AmmConfig.fund_owner. Sapukan biaya protokol/dana yang terkumpul dari vault pool ke penerima, nolkan bidang PoolState.protocol_fees_* / fund_fees_* yang sesuai.
InitializeReward
Tambahkan aliran reward baru ke pool. Hingga 3 aliran dapat aktif sekaligus.
Argumen
Prekondisi
- Kurang dari 3 aliran saat ini aktif di pool.
- Pendana 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 laju 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.
CollectReward
Pemilik posisi mengklaim token reward yang terhutang.
Akun
Efek
- Menyelesaikan pertumbuhan reward (pola yang sama dengan biaya).
- Mentransfer jumlah yang terhutang ke ATA penerima, menolkan
reward_amount_owed[i].
Matriks perubahan status
Ke mana selanjutnya
products/clmm/code-demos— sampel TypeScript yang dapat dijalankan.products/clmm/fees— detail tentang akrual biaya dan reward.reference/error-codes— tabel kesalahan Anchor CLMM lengkap.
raydium-io/raydium-clmm—programs/amm/src/instructions- Raydium SDK v2 —
@raydium-io/raydium-sdk-v2

