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.
Trang này được dịch tự động bằng AI. Phiên bản tiếng Anh là bản chính thức.Xem bản tiếng Anh →
Trang này mô tả cấu trúc và vai trò của từng tài khoản. Các seed chuẩn được liệt kê tại
reference/program-addresses. Một pool CLMM sử dụng nhiều tài khoản hơn pool CPMM vì thanh khoản được lưu trữ thưa thớt trên toàn bộ phạm vi tick — hiểu được sự thưa thớt đó là trọng tâm của trang này.Danh sách tài khoản
Một pool CLMM đang hoạt động được mô tả bởi các nhóm tài khoản sau. Tất cả đều thuộc sở hữu của chương trình CLMM, ngoại trừ hai mint và các vault tương ứng.| Tài khoản | Mục đích | Số lượng mỗi pool |
|---|---|---|
AmmConfig | Mức phí: tỷ lệ phí giao dịch, phần protocol, phần quỹ, tick-spacing mặc định. Dùng chung cho tất cả các pool trong tier này. | 1 (dùng chung) |
PoolState | sqrt_price_x64 hiện tại, tick hiện tại, tổng thanh khoản, phí tăng trưởng toàn cục, thông tin reward, con trỏ observation. | 1 |
TickArrayState | Một khối gồm TICK_ARRAY_SIZE tick liền kề. Chỉ được khởi tạo khi cần. | 0 ≤ N ≤ phạm vi |
TickArrayBitmapExtension | Bitmap tràn theo dõi các tick array tồn tại ngoài bitmap nội tuyến trong PoolState. | 0 hoặc 1 |
PersonalPositionState | Một tài khoản cho mỗi vị thế LP. Lưu phạm vi, thanh khoản và mức phí/reward tăng trưởng lần cuối. Authority = chủ sở hữu NFT. | 1 mỗi vị thế |
| NFT mint của vị thế | Mint với supply bằng 1, liên kết với PersonalPositionState. Chuyển NFT đồng nghĩa với chuyển vị thế. | 1 mỗi vị thế |
ObservationState | Ring buffer lưu các quan sát giá cho TWAP. | 1 |
token_0_vault, token_1_vault | Các tài khoản token giữ số dư của pool. Thuộc sở hữu của pool authority. | 2 |
DynamicFeeConfig | Bộ tham số có thể tái sử dụng cho cơ chế phí động. Các pool tạo qua create_customizable_pool có thể đăng ký sử dụng. Do admin quản lý. | dùng chung (theo index) |
LimitOrderState | Một tài khoản cho mỗi lệnh giới hạn đang mở. Ghi lại owner, tick, chiều giao dịch, tổng số lượng, snapshot output đã thanh toán. | 1 mỗi lệnh |
LimitOrderNonce | Bộ đếm theo (wallet, nonce_index) để tạo ra các PDA lệnh duy nhất. | 1 mỗi (wallet, index) |
PoolState
Trạng thái trực tiếp của pool, được đọc trong mọi lần swap và mọi thay đổi vị thế.
sqrt_price_x64vàtick_currentlà trạng thái giá của pool. Cả hai được cập nhật đồng thời sau mỗi lần swap.tick_currentlà phần nguyên củalog_{1.0001}(price).liquiditylà thanh khoản đang hoạt động — tổng giá trịLcủa tất cả các vị thế có phạm vi chứatick_current. Giá trị này thay đổi mỗi khi swap vượt qua một tick và mỗi khi một vị thế được mở/đóng/thay đổi kích thước.fee_growth_global_{0,1}_x64là phí tích lũy thu được trên mỗi đơn vị thanh khoản trong toàn bộ lịch sử pool. Các vị thế đọc giá trị này để tính toán phí mà họ được nhận.tick_spacingđược khóa theoAmmConfigkhi khởi tạo và không bao giờ thay đổi. Nó xác định những chỉ số tick nào được phép là điểm đầu/cuối của vị thế.tick_array_bitmaplà bitmap nội tuyến bao phủ phạm vi tick thường dùng quanh giá spot. Với các pool có vị thế trải dài ra xa, việc theo dõi tràn được thực hiện trongTickArrayBitmapExtensionriêng biệt.fee_onđược cố định khi tạo pool. Giá trị0(FromInput) tái hiện hành vi Uniswap-V3 cổ điển. Giá trị1và2định tuyến phí swap về một phía duy nhất của sổ lệnh — xemproducts/clmm/feesđể biết các đánh đổi.dynamic_fee_infolưu trạng thái biến động cho phần phụ phí động. Khi được bật, mỗi lần swap sẽ tính toán lạidynamic_fee_componentcộng thêm vàoAmmConfig.trade_fee_rate. Cấu trúc được tài liệu hóa trong phầnDynamicFeeInfobên dưới; các pool không dùng phí động sẽ để toàn bộ struct này bằng không.
AmmConfig
GET https://api-v3.raydium.io/main/clmm-config):
| Index | trade_fee_rate | Tick spacing | Trường hợp dùng |
|---|---|---|---|
| 0 | 100 (0,01%) | 1 | Cặp stablecoin, USDC/USDT |
| 1 | 500 (0,05%) | 10 | Blue-chip tương quan |
| 2 | 2_500 (0,25%) | 60 | Cặp tiêu chuẩn |
| 3 | 10_000 (1,00%) | 120 | Token biến động mạnh hoặc long-tail |
protocol_fee_rate và fund_fee_rate là phần trăm của phí giao dịch; quy ước giống CPMM. Xem products/clmm/fees.
TickArrayState
CLMM không lưu một bản ghi riêng cho mỗi tick — làm vậy sẽ tạo ra hàng tỷ tài khoản. Thay vào đó, nó nhóm TICK_ARRAY_SIZE tick liền kề (thường là 60 hoặc 88 tùy phiên bản chương trình) vào một TickArrayState được tạo lười khi lần đầu sử dụng.
order_phaselà id của cohort. Nó tăng lên mỗi khi một cohort chuyển từ trạng thái “chưa khớp lệnh nào” sang “đã khớp một phần.”orders_amountlà tổng token đầu vào của cohort hiện tại (mới nhất).part_filled_orders_remainingtheo dõi cohort trước đó đang được các swap tiếp theo lấp đầy dần.unfilled_ratio_x64là hệ số nhân Q64.64 gắn với cohort: khi một swap lấp đầy X% cohort, tỷ lệ này được nhân với(1 − X). Mỗi lệnh mở lưu snapshot(order_phase, unfilled_ratio_x64)của riêng mình tại thời điểm mở, nên toán học thanh toán chỉ đơn giản là so sánh các snapshot.
- Tick điểm đầu/cuối t của một vị thế phải thỏa mãn
t % tick_spacing == 0. Chương trình từ chối các vị thế có tick không đúng khoảng cách. - Mảng chứa tick được xác định tại
floor(t / (TICK_ARRAY_SIZE * tick_spacing)) * (TICK_ARRAY_SIZE * tick_spacing). - Tick array được khởi tạo lười: vị thế hoặc swap đầu tiên chạm vào một mảng chưa khởi tạo sẽ tạo ra nó và trả tiền thuê.
- Tick array không bao giờ bị đóng bởi chương trình. Sau khi được phân bổ, nó tồn tại suốt vòng đời của pool, ngay cả khi mọi tick bên trong đã về lại
liquidity_gross == 0. Các vị thế và swap sau này tái sử dụng tài khoản đã có mà không mất thêm tiền thuê. Không có luồng dọn dẹp nào cho tick array liên kết vớiClosePosition.
TickArrayBitmapExtension
PoolState.tick_array_bitmap (nội tuyến) bao phủ phạm vi “gần giá spot” — ±1.024 tick array. Ngoài phạm vi đó (với các giá trị tick cực đoan), chương trình duy trì một tài khoản mở rộng:
(MIN_TICK, MAX_TICK)) yêu cầu nó; SDK sẽ tự xử lý cho bạn.
Vị thế
Một vị thế CLMM là một bộ gồm ba tài khoản cộng với một mint:NFT mint của vị thế
Một SPL Token mint với supply bằng 1. Địa chỉ mint là một PDA xác định; NFT vị thế trong ví của chủ sở hữu chỉ là một ATA giữ token duy nhất đó. Việc chuyển NFT là cách một vị thế đổi chủ — chương trình ủy quyền cho người đang nắm giữ số dư ATA của NFT, không phải Pubkey lưu trong state.PersonalPositionState
Một tài khoản cho mỗi vị thế đang mở. Được lập chỉ mục theo NFT mint.
ProtocolPositionState (đã lỗi thời)
Các phiên bản CLMM cũ lưu dữ liệu tổng hợp theo
(pool, tick_lower, tick_upper) trong một PDA ProtocolPositionState. Các phiên bản mới hơn không còn tạo hay đọc tài khoản này nữa. Slot vẫn xuất hiện trong danh sách tài khoản của OpenPosition / IncreaseLiquidity / DecreaseLiquidity dưới dạng UncheckedAccount để tương thích ABI, nhưng chương trình không ghi vào đó. Các tài khoản tồn tại sẵn on-chain chỉ là di vật; admin có thể gọi CloseProtocolPosition để thu hồi tiền thuê.Dữ liệu tổng hợp theo phạm vi hiện được suy ra trực tiếp từ hai tick điểm đầu/cuối (liquidity_gross, liquidity_net và fee_growth_outside_* / reward_growths_outside_x64 theo từng tick) trong TickArrayState. Công thức fee-growth-inside fee_growth_inside = global − outside_lower − outside_upper vẫn hoạt động đúng mà không cần tài khoản vị thế tổng hợp.Observation
(tick_cumulative[t1] − tick_cumulative[t0]) / (t1 − t0) rồi price = 1.0001 ** tick. Xem algorithms/clmm-math.
DynamicFeeConfig và DynamicFeeInfo
Tham số phí động được lưu ở hai nơi. Template có thể tái sử dụng — DynamicFeeConfig — do admin quản lý và dùng chung cho các pool đăng ký. Trạng thái runtime theo từng pool — DynamicFeeInfo — được nhúng trong PoolState và cập nhật sau mỗi lần swap.
DynamicFeeConfig
["dynamic_fee_config", index.to_be_bytes()]. Được tạo qua create_dynamic_fee_config (chỉ admin) và sửa đổi qua update_dynamic_fee_config. Một pool tạo với enable_dynamic_fee = true sẽ sao chép năm tham số hiệu chỉnh của config (filter_period, decay_period, reduction_factor, dynamic_fee_control, max_volatility_accumulator) vào DynamicFeeInfo của chính nó tại thời điểm tạo; các chỉnh sửa sau đó đối với DynamicFeeConfig không ảnh hưởng đến các pool đã có.
DynamicFeeInfo (nhúng trong PoolState)
DynamicFeeConfig. Toán học phí và quy tắc decay được tài liệu hóa tại products/clmm/math và products/clmm/fees.
Các hằng số sử dụng trong công thức:
| Hằng số | Giá trị | Ý nghĩa |
|---|---|---|
VOLATILITY_ACCUMULATOR_SCALE | 10_000 | Độ phân giải của bộ tích lũy biến động |
REDUCTION_FACTOR_DENOMINATOR | 10_000 | Mẫu số cho reduction_factor |
DYNAMIC_FEE_CONTROL_DENOMINATOR | 100_000 | Mẫu số cho dynamic_fee_control |
MAX_FEE_RATE_NUMERATOR | 100_000 | Giới hạn cứng 10% cho tỷ lệ phí kết quả |
LimitOrderState
Một tài khoản cho mỗi lệnh giới hạn đang mở.
- Mở — người dùng gọi
open_limit_order, nạptotal_amounttoken đầu vào, lệnh được gắn với một cohortTickState. - (Tùy chọn) Tăng / Giảm —
increase_limit_ordertăng thêm vàototal_amount;decrease_limit_ordertrả lại các token chưa khớp (và bất kỳ output đã thanh toán nào đến thời điểm đó). - Thanh toán — khi cohort được lấp đầy toàn bộ hoặc một phần, chủ sở hữu hoặc keeper vận hành gọi
settle_limit_orderđể đẩy token output vào ATA của chủ sở hữu. - Đóng — khi
unfilled_amount == 0, tài khoản có thể đóng. Tiền thuê luôn trả về choowner.
[owner.as_ref(), limit_order_nonce.key().as_ref(), limit_order_nonce.order_nonce.to_be_bytes().as_ref()]. PDA lệnh do đó là duy nhất theo (owner, nonce_index, order_nonce).
LimitOrderNonce
Bộ đếm theo (wallet, nonce_index) cho phép một người dùng chạy nhiều pipeline lệnh giới hạn song song mà không bị xung đột PDA.
[user_wallet.as_ref(), &[nonce_index]]. Hầu hết các client dùng nonce_index = 0 và để order_nonce đảm nhận vai trò đếm số lượng.
Suy ra các tài khoản chính
reference/program-addresses.
Tham chiếu nhanh vòng đời
| Sự kiện | Tài khoản được tạo | Tài khoản bị hủy |
|---|---|---|
CreatePool | poolState, observation, token_0_vault, token_1_vault | — |
OpenPosition[WithToken22Nft] | NFT mint + ATA, personalPosition, có thể thêm tickArrayState(s) mới, tickArrayBitmapExtension nếu chưa có | — |
IncreaseLiquidity | Có thể thêm tickArrayState(s) mới | — |
DecreaseLiquidity | — | Có thể xóa các mục tick (nhưng tickArrayState không bị đóng) |
ClosePosition | — | NFT mint, personalPosition |
SwapV2 | Có thể thêm tickArrayState mới | — |
OpenLimitOrder | limitOrderState, có thể limitOrderNonce (init-if-needed), có thể thêm tickArrayState mới | — |
IncreaseLimitOrder | — | — |
DecreaseLimitOrder | — | Đóng limitOrderState nếu lệnh đã được thực hiện hết |
SettleLimitOrder | — | — |
CloseLimitOrder | — | limitOrderState (tiền thuê → owner) |
CreateDynamicFeeConfig | dynamicFeeConfig | — |
CreateCustomizablePool | poolState, observation, các vault — giống CreatePool. Sao chép dynamicFeeConfig nếu enable_dynamic_fee = true. | — |
CollectRewards | — | — |
UpdateRewardInfos | — | — |
CloseProtocolPosition (admin) | — | protocolPositionState di vật (tiền thuê → admin) |
TickArrayState không bao giờ bị đóng bởi chương trình — chúng tồn tại suốt vòng đời của pool. Sau khi một tick array đã được khởi tạo, nó vẫn ở trên chain ngay cả khi mọi tick bên trong đã về lại liquidity_gross == 0. Tái sử dụng tick array đã có là miễn phí; chỉ vị thế đầu tiên chạm vào một mảng chưa khởi tạo mới phải trả tiền thuê.
Đọc thêm ở đâu
- Toán học tick và cơ chế phạm vi:
products/clmm/ticks-and-positions. - Luồng swap và toán học fee-growth:
products/clmm/math. - Danh sách tài khoản cho từng instruction:
products/clmm/instructions. - Phí và tích lũy reward:
products/clmm/fees. - Program ID và seed chuẩn:
reference/program-addresses.


