Halaman ini diterjemahkan secara otomatis oleh AI. Versi bahasa Inggris adalah acuan resmi.Lihat versi bahasa Inggris →
Halaman ini merupakan pasangan dari
products/clmm/accounts (penjelasan akun) dan products/clmm/math (penjelasan matematika). Halaman ini menjadi acuan untuk argumen dan urutan akun; tata letak byte terperinci tersedia di IDL.Daftar instruksi
Sebagian besar instruksi khusus admin (
CreateAmmConfig, UpdateAmmConfig, UpdatePoolStatus, CreateSupportMintAssociated, CreateOperationAccount, UpdateOperationAccount, CloseProtocolPosition) dibatasi oleh pubkey admin yang dikodekan langsung ke program. Instruksi admin aliran reward (TransferRewardOwner, CollectRemainingRewards) dibatasi oleh funder reward, bukan admin program.
Sufiks V2 berarti “mendukung Token-2022 pada vault/NFT, memerlukan slot bitmap-extension”. SDK memilih V2 secara default untuk pool baru.
CreatePool
Argumen
Prasyarat
token_mint_0 < token_mint_1berdasarkan urutan byte.amm_config.disable_create_pool == false.- Mint tidak ditolak oleh daftar izin 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 lama).pool_state.dynamic_fee_infodinolkan (dynamic fee dinonaktifkan).
CreateCustomizablePool
Direkomendasikan untuk pool baru. Efeknya sama dengan CreatePool ditambah mode pengumpulan fee per-pool dan opsi dynamic fee opsional.
Argumen
CreatePool ditambah, jika enable_dynamic_fee = true:
Prasyarat — sama seperti
CreatePool. Jika enable_dynamic_fee = false, dynamic_fee_config diabaikan.
Hasil setelah eksekusi
pool_state.fee_ondiatur ke varianCollectFeeOnyang dipilih.- Jika dynamic fee diaktifkan:
pool_state.dynamic_fee_infodiinisialisasi dariDynamicFeeConfigyang diberikan (lima parameter kalibrasi disalin; kolom state dinolkan). - Jika tidak:
pool_state.dynamic_fee_infodinolkan (= dynamic fee tidak aktif selamanya untuk pool ini).
fee_on dan bit aktifasi dynamic fee hanya dapat diatur saat pembuatan pool. Tidak ada upgrade di tempat — pool yang dibuat melalui CreatePool lama tidak dapat memperoleh dynamic fee atau fee satu sisi secara retroaktif. Penerapan baru sebaiknya menggunakan instruksi ini sebagai default.
OpenPositionV2 / OpenPositionWithToken22Nft
Membuat posisi baru di dalam pool yang sudah ada.
Argumen
Matematika — lihat
products/clmm/math. Berdasarkan base_flag, program menyelesaikan nilai liquidity atau (amount_0_max, amount_1_max) menjadi L aktual dan jumlah token yang dikonsumsi.
Prasyarat
tick_lower < tick_upper, keduanya merupakan kelipatan daripool.tick_spacing, berada dalam rentang[MIN_TICK, MAX_TICK].- Tick array yang diperlukan sudah 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 snapshotnya.- Entri tick-array pada
tick_lowerdantick_upperdiperbarui (liquidity_gross += L,liquidity_net ± L, snapshot pertumbuhan fee dipertahankan). pool_state.liquidity += Ljika posisi berada dalam rentang (tick_lower ≤ tick_current < tick_upper).
InvalidTickIndex, NotApproved, ZeroAmountSpecified, TransactionTooLarge (jika terlalu banyak tick array).
IncreaseLiquidityV2
Menambah likuiditas ke posisi yang sudah terbuka.
Argumen
OpenPosition tanpa mint NFT (posisi sudah ada; NFT diteruskan sebagai ATA pemilik yang menyimpan 1 token).
Efek
- Mentransfer
amount_0_actual/amount_1_actualdari pengguna ke vault. - Menaikkan
personal_position.liquiditydanpool_state.liquidity(jika dalam rentang), sertaliquidity_gross/liquidity_netpada tick ujung posisi. - Mengumpulkan fee dan reward yang terutang sejak sentuhan terakhir dan mengkreditkannya ke
tokens_fees_owed_{0,1}/reward_amount_owed. Jumlah tersebut baru dibayarkan saatDecreaseLiquidityatauCollectReward, bukan saat penambahan.
DecreaseLiquidityV2
Mengurangi likuiditas dari posisi.
Argumen
IncreaseLiquidity.
Efek
- Menghitung
(amount_0, amount_1)untukLyang dihapus berdasarkansqrt_price_x64saat ini. - Menyelesaikan fee/reward yang terkumpul sejak sentuhan terakhir, sama seperti
IncreaseLiquidity. - Mentransfer
amount_0 + fees_owed_0danamount_1 + fees_owed_1dari vault ke pengguna. - Mengurangi penghitung likuiditas; jika
personal_position.liquidity == 0yang baru, posisi tersebut memenuhi syarat untukClosePosition.
amount_0_min dan amount_1_min adalah jumlah minimum yang diterima pengguna setelah dikurangi transfer fee Token-2022 pada sisi output.
ClosePosition
Membakar NFT posisi dan menutup PersonalPositionState.
Prasyarat
personal_position.liquidity == 0.tokens_fees_owed_{0,1} == 0.- Semua penghitung reward
reward_amount_owed == 0.
- Membakar NFT.
- Menutup akun mint NFT dan akun
personal_position, mengembalikan rent kepayer.
SwapV2
Berjalan di sepanjang kurva likuiditas; input eksak atau output eksak bergantung pada is_base_input.
Argumen
Pemanggil meneruskan daftar tick array yang mencakup perjalanan swap yang diharapkan; program menggunakan sebanyak yang diperlukan. SDK menghitung daftar ini melalui
PoolUtils.computeAmountOutFormat atau endpoint quote API.
Prasyarat
pool_state.statusmengizinkan swap.now >= open_time.sqrt_price_limit_x64berada di sisi yang benar darisqrt_price_x64untuk arah yang dipilih.
ExceededSlippage, SqrtPriceLimitOverflow, TickArrayNotFound, LiquidityInsufficient.
Yang dilakukan SwapV2 secara internal yang perlu diketahui pemanggil (rilis pasca-2025):
- Surcharge dynamic fee — jika
pool.dynamic_fee_infobukan nol, program memperbarui akumulator volatilitas menggunakan jarak tick yang dilalui sejak swap terakhir (dengan aturan filter/peluruhan dariproducts/clmm/fees) dan menambahkandynamic_fee_componentdi atasAmmConfig.trade_fee_rate. Total fee dibatasi pada 10% (MAX_FEE_RATE_NUMERATOR / 1_000_000). - Pencocokan limit order — saat perjalanan harga melintasi tick yang memiliki limit order terbuka, program pertama-tama mengisi likuiditas limit order yang tersedia pada tick tersebut (FIFO berdasarkan
order_phase), lalu melanjutkan sepanjang kurva likuiditas LP. Jumlah yang terisi memperbaruitick.unfilled_ratio_x64dantick.part_filled_orders_remaininguntuk penyelesaian selanjutnya; order itu sendiri tetap tidak terselesaikan hingga pemiliknya memanggilSettleLimitOrder. - Routing fee satu sisi — saat
pool.fee_on = Token0OnlyatauToken1Only, langkah swap tetap menghitung pertukaran input-output yang sama; fee kemudian diarahkan ke sisi yang dikonfigurasi. Untuk arah di mana sisi fee yang dikonfigurasi adalah output, fee dikurangi dari output swap (pengguna menerimaout − fee); untuk arah di mana sisi fee adalah input, perilakunya sama denganFromInput. Lihatis_fee_on_input(zero_for_one)danis_fee_on_token0(zero_for_one)padaPoolState.
Swap (V1) mengimplementasikan dynamic fee, routing fee satu sisi, dan pencocokan limit order yang sama dengan SwapV2; satu-satunya fitur yang tidak dimilikinya adalah dukungan Token-2022 — kedua vault harus berupa SPL Token klasik. Pool dengan mint Token-2022 harus di-swap melalui SwapV2. Agregator dan SDK sudah lebih memilih V2 untuk setiap leg CLMM sehingga pemanggil tidak perlu memilah berdasarkan jenis mint.
OpenLimitOrder
Menempatkan sell order pada tick tertentu. Order tersebut berada dalam antrian FIFO per-tick dan terisi saat harga melewatinya.
Argumen
Prasyarat
tick_index % pool.tick_spacing == 0dan berada dalam rentang[MIN_TICK, MAX_TICK].tick_indexberada di sisi kananpool.tick_currentuntuk arah yang dipilih (menjual token0 → tick harus di atas tick saat ini, dan sebaliknya). Menjual pada tick yang sudah dilewati akan langsung dicocokkan dan ditolak.pool_state.statusmengizinkan operasi limit order (bit 5).
limit_orderada, mengambil snapshottick.order_phasedantick.unfilled_ratio_x64saat dibuka.tick.orders_amount += amount(dalam kohort saat ini).limit_order_nonce.order_nonce += 1.- Event
OpenLimitOrderEventdipancarkan.
InvalidLimitOrderAmount (nol atau di bawah minimum pool), 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
Menambah jumlah order yang sudah terbuka. Hanya dapat dipanggil oleh owner order.
Argumen
OpenLimitOrder tanpa akun nonce; PDA limit_order diteruskan langsung.
Prasyarat
limit_order.owner == signer.- Order masih berada dalam kohort yang sama (
tick.order_phase == limit_order.order_phase). Jika kohort sudah mulai terisi, order tersebut sebagian diselesaikan — pemanggil sebaiknya memanggilDecreaseLimitOrderatauSettleLimitOrderterlebih dahulu untuk maju ke depan.
- Mentransfer
amountdari ATA pemilik keinput_vault. limit_order.total_amount += amount;tick.orders_amount += amount.
DecreaseLimitOrder
Mengurangi atau sepenuhnya membatalkan order yang terbuka. Membayarkan sisa yang belum terisi ke pemilik, beserta output yang sudah diselesaikan dari pengisian parsial sebelumnya.
Argumen
Efek
- Menghitung ulang jumlah yang terisi dari
unfilled_ratio_x64kohort sejak dibuka. - Mengirim output yang terisi ke
output_token_account. - Mengirim
amountdari input yang belum terisi kembali keinput_token_account. - Memperbarui
limit_ordersesuai. Jika sisa yang belum terisi yang baru adalah nol, program menutup akun dan mengembalikan rent keowner.
SettleLimitOrder
Mendorong token output yang sudah terisi ke pemilik tanpa mengubah sisa input order yang belum terisi. Berguna ketika keeper auto_withdraw ingin membayar pengisian parsial yang berjalan lama secara bertahap.
Pemanggil — baik owner order, maupun limit_order_admin program (hot wallet operasional off-chain yang menjalankan loop keeper otomatis). Keeper tidak memiliki otoritas lain — ia tidak dapat memindahkan dana pengguna selain mendorong output yang terisi ke ATA owner order.
Akun
Efek
- Menghitung output kumulatif yang terutang menggunakan
(limit_order.unfilled_ratio_x64, tick.unfilled_ratio_x64). - Mentransfer selisihnya ke
output_token_account. - Memperbarui
limit_order.settled_output. - Tidak menutup order; order masih terbuka terhadap input yang tersisa.
CloseLimitOrder
Menutup akun order yang sudah sepenuhnya dikonsumsi. Rent selalu dikembalikan ke limit_order.owner terlepas dari siapa yang menandatangani.
Pemanggil — baik owner maupun limit_order_admin.
Prasyarat
- Order memiliki sisa yang belum terisi sebesar nol (baik
amount == total_amountsudah terisi dan diselesaikan, atau pemilik sebelumnya mengurangi order ke nol dan lupa menutupnya).
- Menutup
limit_order; rent dikirimkan kelimit_order.owner.
CreateDynamicFeeConfig (admin)
Membuat kumpulan parameter yang dapat digunakan ulang di bawah indeks u16.
Argumen
Error umum —
InvalidDynamicFeeConfigParams jika decay_period <= filter_period atau kolom bernilai 0 di luar batas.
UpdateDynamicFeeConfig (admin)
Mengubah DynamicFeeConfig yang sudah ada. Pool yang telah mengambil snapshot config ini saat dibuat tidak diperbarui secara retroaktif; hanya pool yang baru dibuat dan merujuk config ini yang akan mengambil nilai baru.
Argumen — lima kolom kalibrasi yang sama dengan CreateDynamicFeeConfig (filter_period, decay_period, reduction_factor, dynamic_fee_control, max_volatility_accumulator); index ditetapkan saat pembuatan dan tidak diteruskan ulang di sini.
CollectProtocolFee / CollectFundFee
Bentuknya identik dengan CollectProtocolFee / CollectFundFee pada CPMM. Penandatangan harus cocok dengan AmmConfig.owner / AmmConfig.fund_owner. Menyapu protocol/fund fee yang terkumpul dari vault pool ke penerima, menolkan kolom PoolState.protocol_fees_* / fund_fees_* yang sesuai.
InitializeReward
Menambahkan aliran reward baru ke pool. Maksimal 3 aliran dapat aktif sekaligus.
Argumen
Prasyarat
- Kurang dari 3 aliran yang saat ini aktif pada pool.
- Funder menyetor
total_emission = emissions_per_second × (end_time − open_time)token reward ke vault sebagai bagian dari instruksi ini. - Mint reward diizinkan oleh
operation_state.
SetRewardParams
Memperpanjang, mengisi ulang, atau mengubah laju emisi pada aliran reward yang sudah ada. Biasanya dipanggil oleh pembuat pool atau Raydium multisig. Batasan tersimpan di on-chain: Anda umumnya dapat memperpanjang end_time atau meningkatkan emisi, tetapi tidak dapat menguranginya secara retroaktif. Periksa daftar pemilik operation_state.
UpdateRewardInfos
Hanya pembukuan — menyelesaikan reward_growth_global_x64 hingga 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) terkadang ingin memicunya.
CollectReward
Pemilik posisi mengklaim token reward yang terutang.
Akun
Efek
- Menyelesaikan pertumbuhan reward (pola yang sama dengan fee).
- Mentransfer jumlah yang terutang ke ATA penerima, menolkan
reward_amount_owed[i].
Matriks perubahan state
Langkah selanjutnya
products/clmm/code-demos— contoh TypeScript yang dapat dijalankan.products/clmm/fees— detail tentang akrual fee dan reward.reference/error-codes— tabel error Anchor CLMM lengkap.
raydium-io/raydium-clmm—programs/amm/src/instructions- Raydium SDK v2 —
@raydium-io/raydium-sdk-v2

