Skip to main content
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
Akun (ringkasan) Prasyarat
  • token_mint_0 < token_mint_1 berdasarkan urutan byte.
  • amm_config.disable_create_pool == false.
  • Mint tidak ditolak oleh daftar izin ekstensi Token-2022.
Hasil setelah eksekusi
  • 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_info dinolkan (dynamic fee dinonaktifkan).

CreateCustomizablePool

Direkomendasikan untuk pool baru. Efeknya sama dengan CreatePool ditambah mode pengumpulan fee per-pool dan opsi dynamic fee opsional. Argumen
Akun (ringkasan) — sama seperti 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_on diatur ke varian CollectFeeOn yang dipilih.
  • Jika dynamic fee diaktifkan: pool_state.dynamic_fee_info diinisialisasi dari DynamicFeeConfig yang diberikan (lima parameter kalibrasi disalin; kolom state dinolkan).
  • Jika tidak: pool_state.dynamic_fee_info dinolkan (= 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
Akun (ringkasan) 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 dari pool.tick_spacing, berada dalam rentang [MIN_TICK, MAX_TICK].
  • Tick array yang diperlukan sudah diinisialisasi (atau dibuat di sini melalui CPI InitTickArray dalam transaksi).
  • Pengguna memiliki setidaknya amount_0_max dan amount_1_max di ATA sumber.
Hasil setelah eksekusi
  • personal_position ada, liquidity diatur, fee_growth_inside_last diambil snapshotnya.
  • Entri tick-array pada tick_lower dan tick_upper diperbarui (liquidity_gross += L, liquidity_net ± L, snapshot pertumbuhan fee dipertahankan).
  • pool_state.liquidity += L jika posisi berada dalam rentang (tick_lower ≤ tick_current < tick_upper).
Error umumInvalidTickIndex, NotApproved, ZeroAmountSpecified, TransactionTooLarge (jika terlalu banyak tick array).

IncreaseLiquidityV2

Menambah likuiditas ke posisi yang sudah terbuka. Argumen
Akun — seperti OpenPosition tanpa mint NFT (posisi sudah ada; NFT diteruskan sebagai ATA pemilik yang menyimpan 1 token). Efek
  • Mentransfer amount_0_actual / amount_1_actual dari pengguna ke vault.
  • Menaikkan personal_position.liquidity dan pool_state.liquidity (jika dalam rentang), serta liquidity_gross / liquidity_net pada 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 saat DecreaseLiquidity atau CollectReward, bukan saat penambahan.

DecreaseLiquidityV2

Mengurangi likuiditas dari posisi. Argumen
Akun — bentuknya sama dengan IncreaseLiquidity. Efek
  • Menghitung (amount_0, amount_1) untuk L yang dihapus berdasarkan sqrt_price_x64 saat ini.
  • Menyelesaikan fee/reward yang terkumpul sejak sentuhan terakhir, sama seperti IncreaseLiquidity.
  • Mentransfer amount_0 + fees_owed_0 dan amount_1 + fees_owed_1 dari vault ke pengguna.
  • Mengurangi penghitung likuiditas; jika personal_position.liquidity == 0 yang baru, posisi tersebut memenuhi syarat untuk ClosePosition.
Slippageamount_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.
(Artinya, kumpulkan semua dan kurangi ke nol terlebih dahulu.) Efek
  • Membakar NFT.
  • Menutup akun mint NFT dan akun personal_position, mengembalikan rent ke payer.

SwapV2

Berjalan di sepanjang kurva likuiditas; input eksak atau output eksak bergantung pada is_base_input. Argumen
Akun (ringkasan) 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.status mengizinkan swap.
  • now >= open_time.
  • sqrt_price_limit_x64 berada di sisi yang benar dari sqrt_price_x64 untuk arah yang dipilih.
Error umumExceededSlippage, SqrtPriceLimitOverflow, TickArrayNotFound, LiquidityInsufficient. Yang dilakukan SwapV2 secara internal yang perlu diketahui pemanggil (rilis pasca-2025):
  1. Surcharge dynamic fee — jika pool.dynamic_fee_info bukan nol, program memperbarui akumulator volatilitas menggunakan jarak tick yang dilalui sejak swap terakhir (dengan aturan filter/peluruhan dari products/clmm/fees) dan menambahkan dynamic_fee_component di atas AmmConfig.trade_fee_rate. Total fee dibatasi pada 10% (MAX_FEE_RATE_NUMERATOR / 1_000_000).
  2. 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 memperbarui tick.unfilled_ratio_x64 dan tick.part_filled_orders_remaining untuk penyelesaian selanjutnya; order itu sendiri tetap tidak terselesaikan hingga pemiliknya memanggil SettleLimitOrder.
  3. Routing fee satu sisi — saat pool.fee_on = Token0Only atau Token1Only, 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 menerima out − fee); untuk arah di mana sisi fee adalah input, perilakunya sama dengan FromInput. Lihat is_fee_on_input(zero_for_one) dan is_fee_on_token0(zero_for_one) pada PoolState.
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
Akun (ringkasan) Prasyarat
  • tick_index % pool.tick_spacing == 0 dan berada dalam rentang [MIN_TICK, MAX_TICK].
  • tick_index berada di sisi kanan pool.tick_current untuk 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.status mengizinkan operasi limit order (bit 5).
Hasil setelah eksekusi
  • limit_order ada, mengambil snapshot tick.order_phase dan tick.unfilled_ratio_x64 saat dibuka.
  • tick.orders_amount += amount (dalam kohort saat ini).
  • limit_order_nonce.order_nonce += 1.
  • Event OpenLimitOrderEvent dipancarkan.
Error umumInvalidLimitOrderAmount (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
Akun — seperti 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 memanggil DecreaseLimitOrder atau SettleLimitOrder terlebih dahulu untuk maju ke depan.
Efek
  • Mentransfer amount dari ATA pemilik ke input_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
Akun — mencakup kedua sisi token input dan output: Efek
  • Menghitung ulang jumlah yang terisi dari unfilled_ratio_x64 kohort sejak dibuka.
  • Mengirim output yang terisi ke output_token_account.
  • Mengirim amount dari input yang belum terisi kembali ke input_token_account.
  • Memperbarui limit_order sesuai. Jika sisa yang belum terisi yang baru adalah nol, program menutup akun dan mengembalikan rent ke owner.

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_amount sudah terisi dan diselesaikan, atau pemilik sebelumnya mengurangi order ke nol dan lupa menutupnya).
Efek
  • Menutup limit_order; rent dikirimkan ke limit_order.owner.

CreateDynamicFeeConfig (admin)

Membuat kumpulan parameter yang dapat digunakan ulang di bawah indeks u16. Argumen
Akun Error umumInvalidDynamicFeeConfigParams 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
Akun 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

Sumber: