Skip to main content
Halaman ini diterjemahkan secara otomatis oleh AI. Versi bahasa Inggris adalah acuan resmi.Lihat versi bahasa Inggris →
Halaman ini menjelaskan tata letak dan peran setiap akun. Seed bersifat kanonik dan tercantum di reference/program-addresses. Pool CLMM lebih berat dalam hal akun dibanding pool CPMM karena likuiditas disimpan secara sparse di seluruh rentang tick; memahami sparsity ini adalah inti dari halaman ini.

Inventaris akun

Pool CLMM yang aktif dijelaskan oleh keluarga akun berikut. Semua dimiliki oleh program CLMM kecuali dua mint dan vault mereka.

PoolState

Status pool yang aktif, dibaca pada setiap swap dan setiap perubahan posisi.
Field yang benar-benar akan Anda sentuh:
  • sqrt_price_x64 dan tick_current adalah status harga pool. Keduanya diperbarui bersama pada setiap swap. tick_current adalah floor dari log_{1.0001}(price).
  • liquidity adalah likuiditas aktif — jumlah nilai L untuk semua posisi yang rentangnya berisi tick_current. Berubah setiap kali swap melintasi tick dan setiap kali posisi dibuka/ditutup/diubah ukurannya.
  • fee_growth_global_{0,1}_x64 adalah biaya kumulatif yang diperoleh per unit likuiditas di seluruh riwayat pool. Posisi membaca ini untuk menghitung apa yang mereka terima.
  • tick_spacing terkunci ke AmmConfig saat inisialisasi dan tidak pernah berubah. Ini menentukan indeks tick mana yang diizinkan menjadi endpoint posisi.
  • tick_array_bitmap adalah bitmap inline yang mencakup rentang tick yang umum digunakan di sekitar spot price. Untuk pool yang posisinya menjangkau jauh, pelacakan overflow hidup di TickArrayBitmapExtension terpisah.
  • fee_on ditetapkan saat pembuatan pool. 0 (FromInput) mereproduksi perilaku klasik Uniswap-V3. 1 dan 2 mengarahkan biaya swap ke satu sisi buku — lihat products/clmm/fees untuk trade-off.
  • seed_index adalah [0, 0] untuk setiap pool yang dibuat melalui CreatePool / CreateCustomizablePool (satu pool kanonik per pasangan). Nilai non-zero berarti pool dibuat via CreateCustomizablePoolV2 (bernama CreatePermissionedPool sebelum 2026-10-22) dan indeks adalah bagian dari seed PDA pool, memungkinkan beberapa pool hidup berdampingan untuk (config, mint0, mint1) yang sama. Untuk menurunkan ulang alamat pool seperti itu, Anda harus mengetahui seed_index-nya.
  • dynamic_fee_info membawa status volatilitas untuk surcharge dynamic-fee. Ketika diaktifkan, setiap swap menghitung ulang dynamic_fee_component di atas AmmConfig.trade_fee_rate. Tata letak didokumentasikan di bawah DynamicFeeInfo; pool tanpa dynamic fee membiarkan seluruh struct bernilai nol.

AmmConfig

Sejak upgrade 2026-09, CreateAmmConfig menulis protocol_fee_owner::ID yang dikodekan keras program ke dalam owner dan fund_fee_owner::ID ke dalam fund_owner. Sebelumnya, ia menyalin kunci penandatangan admin ke keduanya. Config yang ada mempertahankan apa pun yang mereka buat atau putar ke, jadi baca kedua field dari akun. Parameter UpdateAmmConfig 3 / 4 masih memutar mereka. Alamat ada di reference/program-addresses. Set tingkat biaya CLMM yang dipublikasikan secara khas (konfirmasi terhadap GET https://api-v3.raydium.io/main/clmm-config): protocol_fee_rate dan fund_fee_rate adalah fraksi dari biaya perdagangan; konvensi yang sama dengan CPMM. Lihat products/clmm/fees.

TickArrayState

CLMM tidak menyimpan satu catatan per tick. Itu akan menjadi miliaran akun. Sebaliknya, CLMM mengelompokkan TICK_ARRAY_SIZE tick yang berdekatan (diinisialisasi atau tidak) (biasanya 60 atau 88 tergantung versi program) ke dalam TickArrayState yang dibuat secara malas saat pertama kali digunakan.
Empat field limit-order bernilai nol pada tick apa pun yang tidak pernah digunakan untuk limit order. Ketika order dibuka pada tick, program melacaknya sebagai urutan cohort:
  • order_phase adalah id cohort. Nilainya bertambah setiap kali cohort bertransisi dari “semua unfilled” menjadi “partially filled.”
  • orders_amount adalah total input-token dari cohort saat ini (terbaru).
  • part_filled_orders_remaining melacak cohort sebelumnya yang sedang diisi oleh swap yang sedang berlangsung.
  • unfilled_ratio_x64 adalah pengali Q64.64 yang dibawa pada cohort: ketika swap mengisi X% dari cohort, rasio dikalikan dengan (1 − X). Setiap open order menyimpan snapshot (order_phase, unfilled_ratio_x64) miliknya sendiri saat waktu pembukaan, jadi matematika settle berkurang menjadi membandingkan snapshot.
Aturan:
  • Tick endpoint posisi t harus memenuhi t % tick_spacing == 0. Program menolak posisi yang tidak sesuai spacing.
  • Array tick berada di floor(t / (TICK_ARRAY_SIZE * tick_spacing)) * (TICK_ARRAY_SIZE * tick_spacing).
  • Tick array diinisialisasi secara malas: posisi atau swap pertama yang menyentuh array yang belum diinisialisasi membuatnya, membayar rent.
  • Tick array tidak pernah ditutup oleh program. Setelah dialokasikan, tick array bertahan selama masa hidup pool, bahkan setelah setiap tick di dalamnya kembali ke liquidity_gross == 0. Posisi dan swap berikutnya menggunakan kembali akun yang ada tanpa rent tambahan. Tidak ada jalur pembersihan yang didorong ClosePosition untuk tick array.

TickArrayBitmapExtension

PoolState.tick_array_bitmap (inline) mencakup rentang “dekat spot” — ±512 tick array (TICK_ARRAY_BITMAP_SIZE = 512; field [u64; 16] adalah 1.024 bit yang dibagi rata antara indeks start negatif dan positif, jadi indeks array −512 … +511). Di luar rentang itu (untuk nilai tick ekstrem), program mempertahankan akun extension:
Jika rentang posisi Anda “normal”, Anda tidak perlu memikirkan akun extension. Posisi full-range (misalnya, (MIN_TICK, MAX_TICK)) memerlukan extension; SDK menyelesaikannya untuk Anda.

Posisi

Posisi CLMM adalah bundel dari tiga akun plus mint:

Position NFT mint

Mint SPL Token atau Token-2022 dengan supply 1. Position NFT di dompet pemilik adalah ATA yang memegang token tunggal itu. Program mengikat otorisasi ke pemegang saat ini dari saldo ATA NFT, bukan ke Pubkey yang disimpan dalam state. Position NFT mint baru menetapkan pool_state sebagai freeze authority mereka sebelum minting token tunggal dan menghapus mint authority. Menetapkan freeze authority tidak dengan sendirinya membekukan akun NFT. Akun tetap unfrozen dan dapat ditransfer kecuali kedua kondisi berlaku: pemanggil menggunakan OpenPositionV2 atau OpenPositionWithToken22Nft, dan freeze authority dari setidaknya satu mint vault yang mendasar muncul di daftar restricted-issuer CLMM. Hanya kemudian CLMM membekukan akun NFT setelah minting. Ini tidak mengubah byte PersonalPositionState atau PoolState apa pun.

PersonalPositionState

Satu per posisi terbuka. Dikey dari NFT mint.

ProtocolPositionState (deprecated)

Rilis CLMM yang lebih lama menyimpan bookkeeping agregat per-(pool, tick_lower, tick_upper) dalam PDA ProtocolPositionState. Rilis yang lebih baru tidak lagi membuat atau membaca akun ini. Slot masih muncul di daftar akun OpenPosition / IncreaseLiquidity / DecreaseLiquidity sebagai UncheckedAccount untuk kompatibilitas ABI, tetapi program tidak menulis ke dalamnya. Akun yang ada on-chain adalah vestigial; admin dapat memanggil CloseProtocolPosition untuk mengklaim kembali rent untuk mereka.Bookkeeping range agregat sekarang diturunkan langsung dari dua tick endpoint (liquidity_gross, liquidity_net, dan per-tick fee_growth_outside_* / reward_growths_outside_x64) dalam TickArrayState. Formula fee-growth-inside fee_growth_inside = global − outside_lower − outside_upper terus bekerja tanpa akun posisi agregat.

Observation

Buffer observation CLMM menyimpan cumulative tick, bukan cumulative price. Konsumen eksternal menghitung geometric-mean price selama interval dari (tick_cumulative[t1] − tick_cumulative[t0]) / (t1 − t0) dan kemudian price = 1.0001 ** tick. Lihat algorithms/clmm-math.

DynamicFeeConfig dan DynamicFeeInfo

Parameter dynamic fee berada di dua tempat. Template yang dapat digunakan kembali — DynamicFeeConfig — dikelola admin dan dibagikan di seluruh pool yang opt-in. State runtime per-pool — DynamicFeeInfo — tertanam dalam PoolState dan diperbarui oleh setiap swap.

DynamicFeeConfig

PDA seed: ["dynamic_fee_config", index.to_be_bytes()]. Dibuat melalui create_dynamic_fee_config (admin-gated) dan dimodifikasi melalui update_dynamic_fee_config. Pool yang dibuat dengan enable_dynamic_fee = true mengambil snapshot lima parameter kalibrasi config (filter_period, decay_period, reduction_factor, dynamic_fee_control, max_volatility_accumulator) ke dalam DynamicFeeInfo miliknya sendiri saat waktu pembuatan; edit kemudian ke DynamicFeeConfig tidak mempengaruhi pool yang ada secara retroaktif.

DynamicFeeInfo (tertanam dalam PoolState)

Empat field terbawah adalah state; lima field teratas adalah kalibrasi yang disalin dari DynamicFeeConfig. Matematika fee dan aturan decay didokumentasikan di bawah products/clmm/math dan products/clmm/fees. Konstanta yang digunakan oleh formula:

LimitOrderState

Satu akun per open limit order.
Lifecycle:
  1. Open — pengguna memanggil open_limit_order, menyetor total_amount dari input token, order terikat pada cohort TickState.
  2. (opsional) Increase / Decrease — increase_limit_order menambah total_amount; decrease_limit_order mengembalikan token unfilled (dan output yang sudah settled hingga saat itu).
  3. Settle — ketika cohort fully atau partially filled, pemilik atau operational keeper memanggil settle_limit_order untuk mendorong output token ke ATA pemilik.
  4. Close — setelah unfilled_amount == 0, akun dapat ditutup. Rent selalu kembali ke owner.
PDA seed: [owner.as_ref(), limit_order_nonce.key().as_ref(), limit_order_nonce.order_nonce.to_be_bytes().as_ref()]. Order PDA oleh karena itu unik per (owner, nonce_index, order_nonce).

LimitOrderNonce

Penghitung per-(wallet, nonce_index) yang memungkinkan satu pengguna menjalankan beberapa pipeline limit order secara paralel tanpa tabrakan pada PDA.
Seed PDA: [user_wallet.as_ref(), &[nonce_index]]. Sebagian besar klien menggunakan nonce_index = 0 dan membiarkan order_nonce membawa kardinalitas.

Permission (sudah dihapus)

Akun Permission dihapus dalam upgrade 2026-10-22. Akun ini sebelumnya mengontrol CreatePermissionedPool, yang sekarang menjadi CreateCustomizablePoolV2 tanpa izin. Program tidak lagi membaca atau menutup akun-akun ini, dan instruksi CreatePermissionPda / ClosePermissionPda sudah hilang. PDA yang dibuat sebelum upgrade (["permission", authority], 280 byte) tetap berada di chain sebagai data inert; abaikan saat memindai akun milik CLMM.
String seed yang tepat harus selalu diperiksa ulang terhadap IDL on-chain dan reference/program-addresses.

Referensi cepat siklus hidup

Akun TickArrayState tidak pernah ditutup oleh program — akun tersebut bertahan selama masa hidup pool. Setelah array tick diinisialisasi, akun tersebut tetap berada di chain bahkan ketika setiap tick di dalamnya kembali ke liquidity_gross == 0. Menggunakan kembali array tick yang sudah ada gratis; hanya posisi pertama yang menyentuh array yang belum pernah diinisialisasi yang membayar rentnya.

Apa yang dibaca di mana

Sumber: