Chuyển đến nội dung chính
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ố
Tài khoản (rút gọn) Điều kiện tiên quyết
  • token_mint_0 < token_mint_1 theo 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.
Trạng thái sau khi thực thi
  • 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_info bằ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ố
Tài khoản (rút gọn) — tương tự 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_info bằ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ố
Tài khoản (rút gọn) 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ủa pool.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 InitTickArray trong transaction).
  • Người dùng có ít nhất amount_0_maxamount_1_max trong các ATA nguồn.
Trạng thái sau khi thực thi
  • personal_position tồn tại, liquidity được đặt, fee_growth_inside_last được snapshot.
  • Các mục tick-array tại tick_lowertick_upper được cập nhật (liquidity_gross += L, liquidity_net ± L, duy trì snapshot tăng trưởng phí).
  • pool_state.liquidity += L nếu vị thế trong phạm vi (tick_lower ≤ tick_current < tick_upper).
Lỗi thường gặpInvalidTickIndex, 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ố
Tài khoản — tương tự 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_actual từ người dùng → vault.
  • Tăng personal_position.liquiditypool_state.liquidity (nếu trong phạm vi), cùng với liquidity_gross / liquidity_net củ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 khi DecreaseLiquidity hoặc CollectReward, không phải khi tăng.

DecreaseLiquidityV2

Rút thanh khoản khỏi một vị thế. Đối số
Tài khoản — cùng cấu trúc với IncreaseLiquidity. Hiệu lực
  • Tính (amount_0, amount_1) cho L được rút dựa trên sqrt_price_x64 hiệ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_0amount_1 + fees_owed_1 từ vault về cho người dùng.
  • Giảm các bộ đếm thanh khoản; nếu personal_position.liquidity == 0 mới, vị thế đủ điều kiện để ClosePosition.
Slippageamount_0_minamount_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ức là phải thu toàn bộ và giảm về không trước.) Hiệu lực
  • Đốt NFT.
  • Đóng tài khoản NFT mint và tài khoản personal_position, hoàn lại rent cho payer.

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ố
Tài khoản (rút gọn) 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.status cho phép swap.
  • now >= open_time.
  • sqrt_price_limit_x64 nằm đúng phía so với sqrt_price_x64 theo chiều giao dịch.
Lỗi thường gặpExceededSlippage, 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):
  1. Phụ thu phí động — nếu pool.dynamic_fee_info khá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êm dynamic_fee_component vào AmmConfig.trade_fee_rate. Tổng phí được giới hạn ở mức 10% (MAX_FEE_RATE_NUMERATOR / 1_000_000).
  2. 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ật tick.unfilled_ratio_x64tick.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ọi SettleLimitOrder.
  3. Định tuyến phí một chiều — khi pool.fee_on = Token0Only hoặc Token1Only, 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ận out − fee); đối với các chiều mà nó là đầu vào, hành vi khớp với FromInput. Xem is_fee_on_input(zero_for_one)is_fee_on_token0(zero_for_one) trên PoolState.
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ố
Tài khoản (rút gọn) Điều kiện tiên quyết
  • tick_index % pool.tick_spacing == 0 và trong phạm vi [MIN_TICK, MAX_TICK].
  • tick_index nằm đúng phía so với pool.tick_current cho 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.status cho phép thao tác lệnh giới hạn (bit 5).
Trạng thái sau khi thực thi
  • limit_order tồn tại, snapshot tick.order_phasetick.unfilled_ratio_x64 tạ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.
Lỗi thường gặpInvalidLimitOrderAmount (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ố
Tài khoản — tương tự 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ọi DecreaseLimitOrder hoặc SettleLimitOrder trước để cuộn tiến.
Hiệu lực
  • Chuyển amount từ ATA của owner đến input_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ố
Tài khoản — cả hai phía token đầu vào và đầu ra: Hiệu lực
  • Tính lại lượng đã khớp của lệnh từ unfilled_ratio_x64 củ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_order tươ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 cho owner.

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ọiowner 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ọiowner 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).
Hiệu lực
  • Đóng limit_order; rent được gửi đến limit_order.owner.

CreateDynamicFeeConfig (admin)

Tạo một bộ tham số có thể tái sử dụng theo chỉ số u16. Đối số
Tài khoản Lỗi thường gặpInvalidDynamicFeeConfigParams 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ố
Tài khoản Đ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

Nguồn tham khảo: