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 đi kèm với
products/clmm/accounts (mô tả các tài khoản) và products/clmm/math (mô tả các phép toán). Đây là tài liệu tham chiếu chính xác về các đối số và thứ tự tài khoản; bố cục byte cụ thể lấy từ IDL.Danh sách lệnh
Hầu hết các lệnh chỉ dành cho admin (
CreateAmmConfig, UpdateAmmConfig, UpdatePoolStatus, CreateSupportMintAssociated, CreateOperationAccount, UpdateOperationAccount, CloseProtocolPosition) được kiểm soát bởi khóa công khai admin được mã hóa cứng trong chương trình. Các lệnh admin của luồng phần thưởng (TransferRewardOwner, CollectRemainingRewards) được kiểm soát bởi người cấp vốn phần thưởng, không phải admin chương trình.
Hậu tố V2 có nghĩa là “hỗ trợ Token-2022 trên vault/NFT, yêu cầu slot bitmap-extension”. SDK mặc định chọn V2 cho các pool mới.
CreatePool
Đối số
Điều kiện tiên quyết
token_mint_0 < token_mint_1theo thứ tự byte.amm_config.disable_create_pool == false.- Các mint không bị từ chối bởi danh sách cho phép extension Token-2022.
pool_state.sqrt_price_x64 = sqrt_price_x64,tick_current = floor(log_{1.0001}(price)).pool_state.liquidity = 0(chưa có vị thế nào).pool_state.fee_on = FromInput(mặc định legacy).pool_state.dynamic_fee_infobằng không (phí động bị vô hiệu hóa).
CreateCustomizablePool
Khuyến nghị cho các pool mới. Có tác dụng tương tự CreatePool cộng thêm chế độ thu phí theo từng pool và tùy chọn bật phí động.
Đối số
CreatePool, cộng thêm khi enable_dynamic_fee = true:
Điều kiện tiên quyết — tương tự
CreatePool. Nếu enable_dynamic_fee = false, dynamic_fee_config bị bỏ qua.
Trạng thái sau khi thực thi
pool_state.fee_onđược đặt theo biến thểCollectFeeOnđã chọn.- Nếu phí động được bật:
pool_state.dynamic_fee_infođược khởi tạo từDynamicFeeConfigđược cung cấp (năm tham số hiệu chỉnh được sao chép; các trường trạng thái được đặt về không). - Ngược lại:
pool_state.dynamic_fee_infobằng không (= phí động không hoạt động vĩnh viễn đối với pool này).
fee_on và bit bật phí động chỉ được đặt khi tạo pool. Không có cơ chế nâng cấp tại chỗ — các pool được tạo qua CreatePool cũ không thể có phí động hay phí một chiều sau này. Các triển khai mới nên mặc định dùng lệnh này.
OpenPositionV2 / OpenPositionWithToken22Nft
Tạo một vị thế mới trong một pool đã tồn tại.
Đối số
Toán học — xem
products/clmm/math. Dựa vào base_flag, chương trình giải ra L thực tế và số lượng token thực tế được sử dụng từ liquidity hoặc (amount_0_max, amount_1_max).
Điều kiện tiên quyết
tick_lower < tick_upper, cả hai đều là bội số củapool.tick_spacing, trong phạm vi[MIN_TICK, MAX_TICK].- Các tick array cần thiết được truyền vào và đã khởi tạo (hoặc được tạo tại đây qua CPI
InitTickArraytrong transaction). - Người dùng có ít nhất
amount_0_maxvàamount_1_maxtrong các ATA nguồn.
personal_positiontồn tại,liquidityđược đặt,fee_growth_inside_lastđược snapshot.- Các mục tick-array tại
tick_lowervàtick_upperđược cập nhật (liquidity_gross += L,liquidity_net ± L, duy trì snapshot tăng trưởng phí). pool_state.liquidity += Lnếu vị thế trong phạm vi (tick_lower ≤ tick_current < tick_upper).
InvalidTickIndex, NotApproved, ZeroAmountSpecified, TransactionTooLarge (nếu có quá nhiều tick array).
IncreaseLiquidityV2
Thêm thanh khoản vào một vị thế đã mở.
Đối số
OpenPosition nhưng không có NFT mint (vị thế đã tồn tại; NFT được truyền vào như ATA của owner đang giữ 1 token).
Hiệu lực
- Chuyển
amount_0_actual/amount_1_actualtừ người dùng → vault. - Tăng
personal_position.liquidityvàpool_state.liquidity(nếu trong phạm vi), cùng vớiliquidity_gross/liquidity_netcủa tick endpoint tương ứng. - Thu phí và phần thưởng còn nợ kể từ lần chạm cuối và ghi có vào
tokens_fees_owed_{0,1}/reward_amount_owed. Các khoản này chỉ được thanh toán khiDecreaseLiquidityhoặcCollectReward, không phải khi tăng.
DecreaseLiquidityV2
Rút thanh khoản khỏi một vị thế.
Đối số
IncreaseLiquidity.
Hiệu lực
- Tính
(amount_0, amount_1)choLđược rút dựa trênsqrt_price_x64hiện tại. - Thanh toán phí/phần thưởng tích lũy kể từ lần chạm cuối, tương tự
IncreaseLiquidity. - Chuyển
amount_0 + fees_owed_0vàamount_1 + fees_owed_1từ vault về cho người dùng. - Giảm các bộ đếm thanh khoản; nếu
personal_position.liquidity == 0mới, vị thế đủ điều kiện đểClosePosition.
amount_0_min và amount_1_min là mức tối thiểu người dùng chấp nhận sau khi trừ phí chuyển Token-2022 ở phía đầu ra.
ClosePosition
Đốt NFT vị thế và đóng PersonalPositionState.
Điều kiện tiên quyết
personal_position.liquidity == 0.tokens_fees_owed_{0,1} == 0.- Tất cả bộ đếm phần thưởng
reward_amount_owed == 0.
- Đốt NFT.
- Đóng tài khoản NFT mint và tài khoản
personal_position, hoàn lại rent chopayer.
SwapV2
Duyệt đường cong thanh khoản; chính xác đầu vào hoặc chính xác đầu ra tùy theo is_base_input.
Đối số
Người gọi truyền một danh sách tick array được xếp hạng bao phủ hành trình swap dự kiến; chương trình sử dụng bao nhiêu tùy theo nhu cầu. SDK tính danh sách này qua
PoolUtils.computeAmountOutFormat hoặc endpoint báo giá của API.
Điều kiện tiên quyết
pool_state.statuscho phép swap.now >= open_time.sqrt_price_limit_x64nằm đúng phía so vớisqrt_price_x64theo chiều giao dịch.
ExceededSlippage, SqrtPriceLimitOverflow, TickArrayNotFound, LiquidityInsufficient.
Những gì SwapV2 thực hiện bên trong mà người gọi nên biết (phiên bản sau năm 2025):
- Phụ thu phí động — nếu
pool.dynamic_fee_infokhác không, chương trình cập nhật bộ tích lũy biến động bằng khoảng cách tick đã duyệt kể từ swap cuối (theo các quy tắc lọc/suy giảm từproducts/clmm/fees) và cộng thêmdynamic_fee_componentvàoAmmConfig.trade_fee_rate. Tổng phí được giới hạn ở mức 10% (MAX_FEE_RATE_NUMERATOR / 1_000_000). - Khớp lệnh giới hạn — khi hành trình giá vượt qua một tick có lệnh giới hạn đang mở, chương trình trước tiên điền thanh khoản lệnh giới hạn khả dụng tại tick đó (FIFO theo
order_phase), sau đó tiếp tục theo đường cong thanh khoản LP. Các lượng đã khớp cập nhậttick.unfilled_ratio_x64vàtick.part_filled_orders_remainingđể thanh toán sau; bản thân các lệnh vẫn chưa được chi tiêu cho đến khi chủ sở hữu gọiSettleLimitOrder. - Định tuyến phí một chiều — khi
pool.fee_on = Token0OnlyhoặcToken1Only, bước swap vẫn tính toán cùng một giao dịch đầu vào-đầu ra; phí sau đó được định tuyến về phía đã cấu hình. Đối với các chiều mà phía phí cấu hình là đầu ra, phí được trừ từ đầu ra swap (người dùng nhậnout − fee); đối với các chiều mà nó là đầu vào, hành vi khớp vớiFromInput. Xemis_fee_on_input(zero_for_one)vàis_fee_on_token0(zero_for_one)trênPoolState.
Swap (V1) triển khai cùng phí động, định tuyến phí một chiều và khớp lệnh giới hạn như SwapV2; tính năng duy nhất nó thiếu là hỗ trợ Token-2022 — cả hai vault đều phải là SPL Token cổ điển. Các pool có bất kỳ mint Token-2022 nào phải được swap qua SwapV2. Aggregator và SDK đã ưu tiên V2 cho mọi leg CLMM nên người gọi không cần phân nhánh theo loại mint.
OpenLimitOrder
Đặt lệnh bán tại một tick cụ thể. Lệnh nằm trong một nhóm FIFO theo từng tick và được điền khi giá vượt qua.
Đối số
Điều kiện tiên quyết
tick_index % pool.tick_spacing == 0và trong phạm vi[MIN_TICK, MAX_TICK].tick_indexnằm đúng phía so vớipool.tick_currentcho chiều đã chọn (bán token0 → tick phải cao hơn hiện tại, và ngược lại). Bán tại một tick đã được vượt qua sẽ bị khớp ngay lập tức và bị từ chối.pool_state.statuscho phép thao tác lệnh giới hạn (bit 5).
limit_ordertồn tại, snapshottick.order_phasevàtick.unfilled_ratio_x64tại thời điểm mở.tick.orders_amount += amount(trong cohort hiện tại).limit_order_nonce.order_nonce += 1.- Phát ra sự kiện
OpenLimitOrderEvent.
InvalidLimitOrderAmount (bằng không hoặc dưới mức tối thiểu của pool), InvalidTickIndex (ngoài [MIN_TICK, MAX_TICK], hoặc sai phía so với tick_current cho chiều đã chọn), TickAndSpacingNotMatch (tick_index % pool.tick_spacing != 0), OrderPhaseSaturated.
IncreaseLimitOrder
Thêm vào một lệnh đang mở. Chỉ có thể gọi bởi owner của lệnh.
Đối số
OpenLimitOrder nhưng không có tài khoản nonce; PDA limit_order được truyền trực tiếp.
Điều kiện tiên quyết
limit_order.owner == signer.- Lệnh vẫn còn trong cùng cohort (
tick.order_phase == limit_order.order_phase). Nếu cohort đã bắt đầu điền, lệnh đã được thanh toán một phần — người gọi nên gọiDecreaseLimitOrderhoặcSettleLimitOrdertrước để cuộn tiến.
- Chuyển
amounttừ ATA của owner đếninput_vault. limit_order.total_amount += amount;tick.orders_amount += amount.
DecreaseLimitOrder
Giảm hoặc hủy hoàn toàn một lệnh đang mở. Trả phần chưa khớp về cho owner, cộng thêm bất kỳ đầu ra nào đã được thanh toán bởi các lần điền một phần trước đó.
Đối số
Hiệu lực
- Tính lại lượng đã khớp của lệnh từ
unfilled_ratio_x64của cohort kể từ lúc mở. - Gửi đầu ra đã khớp đến
output_token_account. - Gửi
amountđầu vào chưa khớp vềinput_token_account. - Cập nhật
limit_ordertương ứng. Nếu phần chưa khớp còn lại mới bằng không, chương trình đóng tài khoản và hoàn lại rent choowner.
SettleLimitOrder
Đẩy token đầu ra đã khớp về cho owner mà không thay đổi phần chưa khớp còn lại của lệnh. Hữu ích khi các keeper auto_withdraw muốn thanh toán dần các lần điền một phần kéo dài.
Người gọi — owner của lệnh hoặc limit_order_admin của chương trình (một ví nóng vận hành ngoài chuỗi chạy vòng lặp keeper tự động). Keeper không có quyền hạn khác — nó không thể di chuyển quỹ người dùng ngoài việc đẩy đầu ra đã khớp về ATA owner của lệnh.
Tài khoản
Hiệu lực
- Tính đầu ra tích lũy còn nợ bằng cách dùng
(limit_order.unfilled_ratio_x64, tick.unfilled_ratio_x64). - Chuyển phần chênh lệch đến
output_token_account. - Cập nhật
limit_order.settled_output. - Không đóng lệnh; lệnh vẫn còn mở đối với bất kỳ đầu vào nào còn lại.
CloseLimitOrder
Đóng tài khoản lệnh đã được thực hiện hoàn toàn. Rent luôn được trả về limit_order.owner bất kể ai ký.
Người gọi — owner hoặc limit_order_admin.
Điều kiện tiên quyết
- Lệnh có phần chưa khớp còn lại bằng không (hoặc
amount == total_amountđã được khớp và thanh toán, hoặc owner đã giảm lệnh về không trước đó và quên đóng).
- Đóng
limit_order; rent được gửi đếnlimit_order.owner.
CreateDynamicFeeConfig (admin)
Tạo một bộ tham số có thể tái sử dụng theo chỉ số u16.
Đối số
Lỗi thường gặp —
InvalidDynamicFeeConfigParams nếu decay_period <= filter_period hoặc bất kỳ trường nào có giá trị 0 nằm ngoài giới hạn.
UpdateDynamicFeeConfig (admin)
Chỉnh sửa một DynamicFeeConfig hiện có. Các pool đã snapshot cấu hình tại thời điểm tạo không bị cập nhật hồi tố; chỉ các pool mới tạo tham chiếu đến config này mới nhận các giá trị mới.
Đối số — năm trường hiệu chỉnh giống như CreateDynamicFeeConfig (filter_period, decay_period, reduction_factor, dynamic_fee_control, max_volatility_accumulator); index được cố định khi tạo và không cần truyền lại ở đây.
CollectProtocolFee / CollectFundFee
Có cùng cấu trúc với CollectProtocolFee / CollectFundFee của CPMM. Người ký phải khớp với AmmConfig.owner / AmmConfig.fund_owner. Thu phí giao thức/quỹ đã tích lũy từ vault của pool về cho người nhận, đặt các trường PoolState.protocol_fees_* / fund_fees_* tương ứng về không.
InitializeReward
Thêm một luồng phần thưởng mới vào pool. Tối đa 3 luồng có thể hoạt động cùng lúc.
Đối số
Điều kiện tiên quyết
- Ít hơn 3 luồng hiện đang hoạt động trên pool.
- Người cấp vốn nạp
total_emission = emissions_per_second × (end_time − open_time)token phần thưởng vào vault như một phần của lệnh này. - Mint phần thưởng được đưa vào danh sách trắng theo
operation_state.
SetRewardParams
Gia hạn, nạp thêm hoặc thay đổi tỷ lệ phát thải của một luồng phần thưởng hiện có. Thường được gọi bởi người tạo pool hoặc multisig Raydium. Các ràng buộc nằm trên chuỗi: thông thường bạn có thể gia hạn end_time hoặc tăng phát thải, không thể giảm hồi tố. Kiểm tra danh sách owner của operation_state.
UpdateRewardInfos
Thuần túy kế toán — thanh toán reward_growth_global_x64 đến thời điểm hiện tại bằng cách nhân emissions_per_second × Δt / liquidity. Được gọi nội bộ bởi mọi lệnh chạm đến thanh khoản. Được cung cấp như một lệnh độc lập vì các tác nhân bên ngoài (UI, crank) đôi khi muốn kích hoạt nó.
CollectReward
Chủ sở hữu vị thế nhận token phần thưởng còn nợ.
Tài khoản
Hiệu lực
- Thanh toán tăng trưởng phần thưởng (cùng mẫu với phí).
- Chuyển lượng còn nợ đến ATA người nhận, đặt
reward_amount_owed[i]về không.
Ma trận thay đổi trạng thái
Bước tiếp theo
products/clmm/code-demos— các mẫu TypeScript có thể chạy được.products/clmm/fees— chi tiết về tích lũy phí và phần thưởng.reference/error-codes— bảng lỗi Anchor CLMM đầy đủ.
raydium-io/raydium-clmm—programs/amm/src/instructions- Raydium SDK v2 —
@raydium-io/raydium-sdk-v2

