Documentation Index
Fetch the complete documentation index at: https://docs.raydium.io/llms.txt
Use this file to discover all available pages before exploring further.
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 yang kanonik tercantum di
reference/program-addresses. Pool CLMM memiliki lebih banyak akun dibanding pool CPMM karena likuiditas disimpan secara jarang (sparse) di sepanjang rentang tick; memahami kejarangan tersebut adalah inti dari halaman ini.Inventaris akun
Sebuah pool CLMM yang aktif terdiri dari keluarga akun berikut. Semuanya dimiliki oleh program CLMM, kecuali dua mint dan vault-nya.| Akun | Tujuan | Jumlah per pool |
|---|---|---|
AmmConfig | Tingkat biaya: trade-fee rate, bagian protokol, bagian dana, default tick-spacing. Dibagi bersama semua pool dalam tier ini. | 1 (bersama) |
PoolState | sqrt_price_x64 saat ini, tick saat ini, total likuiditas, global pertumbuhan biaya, info reward, pointer observasi. | 1 |
TickArrayState | Blok berisi TICK_ARRAY_SIZE tick yang berdekatan. Hanya diinisialisasi sesuai kebutuhan. | 0 ≤ N ≤ range |
TickArrayBitmapExtension | Bitmap overflow yang melacak array tick mana yang ada di luar bitmap inline pada PoolState. | 0 atau 1 |
PersonalPositionState | Satu per posisi LP. Menyimpan rentang, likuiditas, dan pertumbuhan biaya/reward terakhir yang diamati. Authority = pemilik NFT. | 1 per posisi |
| Position NFT mint | Mint dengan supply 1, terkait dengan PersonalPositionState. Memindahkan NFT berarti memindahkan posisi. | 1 per posisi |
ObservationState | Ring buffer dari observasi harga untuk TWAP. | 1 |
token_0_vault, token_1_vault | Akun token yang menyimpan saldo pool. Dimiliki oleh pool authority. | 2 |
DynamicFeeConfig | Set parameter yang dapat digunakan ulang untuk mekanisme dynamic-fee. Pool yang dibuat melalui create_customizable_pool dapat ikut serta. Dikelola admin. | bersama (per indeks) |
LimitOrderState | Satu per limit order yang terbuka. Mencatat pemilik, tick, sisi, jumlah total, snapshot output yang diselesaikan. | 1 per order |
LimitOrderNonce | Counter per (wallet, nonce_index) yang menghasilkan PDA order yang unik. | 1 per (wallet, indeks) |
PoolState
State live pool, dibaca pada setiap swap dan setiap perubahan posisi.
sqrt_price_x64dantick_currentadalah state harga pool. Keduanya diperbarui bersama pada setiap swap.tick_currentadalah floor darilog_{1.0001}(price).liquidityadalah likuiditas aktif — jumlah nilaiLdari semua posisi yang rentangnya mencakuptick_current. Nilainya berubah setiap kali swap melintasi sebuah tick dan setiap kali posisi dibuka/ditutup/diubah ukurannya.fee_growth_global_{0,1}_x64adalah biaya kumulatif yang diperoleh per unit likuiditas sepanjang seluruh riwayat pool. Posisi membaca nilai ini untuk menghitung jumlah yang terutang kepada mereka.tick_spacingdikunci keAmmConfigsaat inisialisasi dan tidak pernah berubah. Nilai ini menentukan indeks tick mana saja yang diizinkan menjadi endpoint posisi.tick_array_bitmapadalah bitmap inline yang mencakup rentang tick yang umum digunakan di sekitar harga spot. Untuk pool dengan posisi yang mencapai jangkauan jauh, pelacakan overflow disimpan di akunTickArrayBitmapExtensionyang terpisah.fee_onditetapkan saat pool dibuat.0(FromInput) mereproduksi perilaku klasik Uniswap-V3.1dan2mengarahkan biaya swap ke satu sisi buku — lihatproducts/clmm/feesuntuk pertimbangannya.dynamic_fee_infomenyimpan state volatilitas untuk surcharge dynamic-fee. Jika diaktifkan, setiap swap menghitung ulangdynamic_fee_componentdi atasAmmConfig.trade_fee_rate. Tata letak didokumentasikan di bawahDynamicFeeInfo; pool tanpa dynamic fee membiarkan seluruh struct bernilai nol.
AmmConfig
GET https://api-v3.raydium.io/main/clmm-config):
| Indeks | trade_fee_rate | Tick spacing | Penggunaan umum |
|---|---|---|---|
| 0 | 100 (0.01%) | 1 | Pasangan stabil, USDC/USDT |
| 1 | 500 (0.05%) | 10 | Blue-chip yang berkorelasi |
| 2 | 2_500 (0.25%) | 60 | Pasangan standar |
| 3 | 10_000 (1.00%) | 120 | Aset volatil atau long-tail |
protocol_fee_rate dan fund_fee_rate adalah fraksi dari trade fee; konvensinya sama dengan CPMM. Lihat products/clmm/fees.
TickArrayState
CLMM tidak menyimpan satu record per tick — pendekatan itu akan menghasilkan miliaran akun. Sebagai gantinya, TICK_ARRAY_SIZE tick yang berdekatan (umumnya 60 atau 88 tergantung versi program), baik yang sudah diinisialisasi maupun belum, dikelompokkan ke dalam sebuah TickArrayState yang dibuat secara lazy saat pertama kali digunakan.
order_phaseadalah id kohort. Nilainya bertambah setiap kali sebuah kohort bertransisi dari “semua belum terisi” menjadi “sebagian terisi.”orders_amountadalah total token input dari kohort saat ini (terbaru).part_filled_orders_remainingmelacak kohort sebelumnya yang sedang diisi oleh swap yang sedang berjalan.unfilled_ratio_x64adalah multiplier Q64.64 yang dibawa pada kohort: ketika swap mengisi X% dari kohort, rasionya dikalikan dengan(1 − X). Setiap order yang terbuka menyimpan snapshot(order_phase, unfilled_ratio_x64)saat dibuka, sehingga matematika penyelesaian cukup membandingkan snapshot.
- Tick endpoint posisi t harus memenuhi
t % tick_spacing == 0. Program menolak posisi yang tidak sesuai spacing. - Array dari sebuah tick berada pada
floor(t / (TICK_ARRAY_SIZE * tick_spacing)) * (TICK_ARRAY_SIZE * tick_spacing). - Array tick diinisialisasi secara lazy: posisi atau swap pertama yang menyentuh array yang belum diinisialisasi akan membuatnya sekaligus membayar rent.
- Array tick tidak pernah ditutup oleh program. Setelah dialokasikan, akun ini bertahan selama pool ada, bahkan setelah setiap tick di dalamnya kembali ke
liquidity_gross == 0. Posisi dan swap berikutnya menggunakan kembali akun yang sudah ada tanpa biaya rent tambahan. Tidak ada jalur pembersihan berbasisClosePositionuntuk array tick.
TickArrayBitmapExtension
PoolState.tick_array_bitmap (inline) mencakup rentang “dekat spot” — ±1.024 array tick. Di luar rentang tersebut (untuk nilai tick yang ekstrem), program memelihara akun extension:
(MIN_TICK, MAX_TICK)) membutuhkannya; SDK akan menanganinya untuk Anda.
Posisi
Sebuah posisi CLMM adalah gabungan dari tiga akun ditambah satu mint:Position NFT mint
Mint SPL Token dengan supply 1. Alamat mint adalah PDA deterministik; NFT posisi di wallet pemilik hanyalah ATA yang menyimpan satu token tersebut. Memindahkan NFT adalah cara suatu posisi berganti pemilik — program mengaitkan otorisasi ke pemegang saldo ATA NFT saat ini, bukan ke Pubkey yang tersimpan dalam state.PersonalPositionState
Satu per posisi yang terbuka. Dikunci berdasarkan NFT mint.
ProtocolPositionState (tidak digunakan lagi)
Rilis CLMM yang lebih lama menyimpan pembukuan agregat per
(pool, tick_lower, tick_upper) dalam PDA ProtocolPositionState. Rilis terbaru tidak lagi membuat atau membaca akun ini. Slot tersebut masih muncul dalam daftar akun OpenPosition / IncreaseLiquidity / DecreaseLiquidity sebagai UncheckedAccount untuk kompatibilitas ABI, tetapi program tidak menulisi akun tersebut. Akun yang ada di on-chain bersifat vestigial; admin dapat memanggil CloseProtocolPosition untuk mengklaim kembali rent-nya.Pembukuan rentang agregat kini diturunkan langsung dari dua tick endpoint (liquidity_gross, liquidity_net, dan fee_growth_outside_* / reward_growths_outside_x64 per tick) dalam TickArrayState. Formula fee-growth-inside fee_growth_inside = global − outside_lower − outside_upper tetap berfungsi tanpa akun posisi agregat.Observation
(tick_cumulative[t1] − tick_cumulative[t0]) / (t1 − t0), kemudian price = 1.0001 ** tick. Lihat algorithms/clmm-math.
DynamicFeeConfig dan DynamicFeeInfo
Parameter dynamic fee berada di dua tempat. Template yang dapat digunakan ulang — DynamicFeeConfig — dikelola admin dan dibagi bersama pool yang ikut serta. State runtime per pool — DynamicFeeInfo — tertanam dalam PoolState dan diperbarui oleh setiap swap.
DynamicFeeConfig
["dynamic_fee_config", index.to_be_bytes()]. Dibuat melalui create_dynamic_fee_config (dibatasi admin) dan dimodifikasi melalui update_dynamic_fee_config. Pool yang dibuat dengan enable_dynamic_fee = true menyalin lima parameter kalibrasi konfigurasi (filter_period, decay_period, reduction_factor, dynamic_fee_control, max_volatility_accumulator) ke dalam DynamicFeeInfo-nya sendiri saat pembuatan; pengeditan selanjutnya pada DynamicFeeConfig tidak berlaku surut bagi pool yang sudah ada.
DynamicFeeInfo (tertanam dalam PoolState)
DynamicFeeConfig. Matematika biaya dan aturan decay didokumentasikan di products/clmm/math dan products/clmm/fees.
Konstanta yang digunakan dalam formula:
| Konstanta | Nilai | Makna |
|---|---|---|
VOLATILITY_ACCUMULATOR_SCALE | 10_000 | Granularitas dari volatility accumulator |
REDUCTION_FACTOR_DENOMINATOR | 10_000 | Penyebut untuk reduction_factor |
DYNAMIC_FEE_CONTROL_DENOMINATOR | 100_000 | Penyebut untuk dynamic_fee_control |
MAX_FEE_RATE_NUMERATOR | 100_000 | Batas keras 10% pada fee rate yang dihasilkan |
LimitOrderState
Satu akun per limit order yang terbuka.
- Buka — pengguna memanggil
open_limit_order, menyetortotal_amounttoken input, order terikat ke kohortTickState. - (opsional) Tambah / Kurangi —
increase_limit_ordermenambahtotal_amount;decrease_limit_ordermengembalikan token yang belum terisi (dan output yang sudah diselesaikan hingga saat itu). - Selesaikan — ketika kohort terisi penuh atau sebagian, pemilik atau keeper operasional memanggil
settle_limit_orderuntuk mendorong token output ke ATA pemilik. - Tutup — setelah
unfilled_amount == 0, akun dapat ditutup. Rent selalu dikembalikan keowner.
[owner.as_ref(), limit_order_nonce.key().as_ref(), limit_order_nonce.order_nonce.to_be_bytes().as_ref()]. PDA order oleh karena itu unik per (owner, nonce_index, order_nonce).
LimitOrderNonce
Counter per (wallet, nonce_index) yang memungkinkan satu pengguna menjalankan beberapa pipeline limit order secara paralel tanpa bentrokan pada PDA.
[user_wallet.as_ref(), &[nonce_index]]. Sebagian besar klien menggunakan nonce_index = 0 dan membiarkan order_nonce menangani kardinalitas.
Menurunkan akun-akun utama
reference/program-addresses.
Referensi cepat siklus hidup
| Event | Akun yang dibuat | Akun yang dihancurkan |
|---|---|---|
CreatePool | poolState, observation, token_0_vault, token_1_vault | — |
OpenPosition[WithToken22Nft] | NFT mint + ATA, personalPosition, kemungkinan tickArrayState baru, tickArrayBitmapExtension jika belum ada | — |
IncreaseLiquidity | Kemungkinan tickArrayState baru | — |
DecreaseLiquidity | — | Kemungkinan membersihkan entri tick (tetapi tickArrayState itu sendiri tidak ditutup) |
ClosePosition | — | NFT mint, personalPosition |
SwapV2 | Kemungkinan tickArrayState baru | — |
OpenLimitOrder | limitOrderState, kemungkinan limitOrderNonce (init-if-needed), kemungkinan tickArrayState baru | — |
IncreaseLimitOrder | — | — |
DecreaseLimitOrder | — | Menutup limitOrderState jika order sudah habis terisi |
SettleLimitOrder | — | — |
CloseLimitOrder | — | limitOrderState (rent → owner) |
CreateDynamicFeeConfig | dynamicFeeConfig | — |
CreateCustomizablePool | poolState, observation, vault — sama seperti CreatePool. Menyalin dynamicFeeConfig jika enable_dynamic_fee = true. | — |
CollectRewards | — | — |
UpdateRewardInfos | — | — |
CloseProtocolPosition (admin) | — | protocolPositionState vestigial (rent → admin) |
TickArrayState tidak pernah ditutup oleh program — akun ini bertahan selama pool ada. Setelah sebuah array tick diinisialisasi, akun tersebut tetap ada di on-chain bahkan ketika setiap tick di dalamnya kembali ke liquidity_gross == 0. Menggunakan kembali array tick yang sudah ada tidak dikenakan biaya; hanya posisi pertama yang menyentuh array yang belum pernah diinisialisasi yang membayar rent-nya.
Panduan referensi selanjutnya
- Matematika tick dan mekanika rentang:
products/clmm/ticks-and-positions. - Alur swap dan matematika pertumbuhan biaya:
products/clmm/math. - Daftar akun instruksi:
products/clmm/instructions. - Biaya dan akumulasi reward:
products/clmm/fees. - Program ID dan seed yang kanonik:
reference/program-addresses.


