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 →
Biểu ngữ phiên bản. Tất cả các ví dụ nhắm tới
@raydium-io/raydium-sdk-v2@0.2.42-alpha trên Solana mainnet-beta, được xác minh vào tháng 4 năm 2026. ID chương trình được lấy từ reference/program-addresses thông qua SDK.Thiết lập
raydium-sdk-V2-demo/src/clmm; liên kết GitHub nằm bên cạnh mỗi phần. Bootstrap tuân theo config.ts.template của kho demo (nguồn) — disableFeatureCheck: true là cài đặt được khuyến nghị cho bất kỳ tích hợp không tầm thường nào:
Tạo pool CLMM
Nguồn:src/clmm/createPool.ts
- Sắp xếp
mint1/mint2theo thứ tự byte trước khi dẫn xuất. - Tính toán
sqrt_price_x64 = floor(sqrt(initialPrice × 10^(dB−dA)) × 2^64). - Tạo các tài khoản
observationvàtick_array_bitmap_extension. - Thanh toán phí tạo pool được định nghĩa bởi
ammConfig.
Mở vị trí trong khoảng được chọn
Nguồn:src/clmm/createPosition.ts
InitTickArray nếu có bất kỳ lệnh nào chưa được khởi tạo.
Tăng thanh khoản trên vị trí hiện có
Nguồn:src/clmm/increaseLiquidity.ts
Giảm thanh khoản (và thu thập phí cùng lúc)
Nguồn:src/clmm/decreaseLiquidity.ts và src/clmm/closePosition.ts
decreaseLiquidity với liquidity = new BN(0). Tác dụng phụ của lệnh là giải quyết tokens_fees_owed_{0,1} và chuyển chúng ra ngoài.
Để đóng vị trí hoàn toàn sau khi xóa thanh khoản và phí, hãy truyền closePosition: true trong lệnh gọi decreaseLiquidity cuối cùng. SDK thêm ClosePosition và đốt NFT.
Đối với máy khách Anchor trực tiếp, giữ các tài khoản được khai báo không thay đổi và thêm pool:
poolId trên mỗi lần đóng. CLMM chỉ đọc nó khi positionNftAccount bị đóng băng, điều này giữ một đường dẫn máy khách tương thích với các vị trí cũ và mới.
Thu thập phần thưởng
Nguồn:src/clmm/harvestAllRewards.ts
harvestAllRewards duyệt qua mỗi vị trí trên mỗi pool được truyền vào, gói các lệnh CollectReward (và bất kỳ UpdateRewardInfos nào), và chia chúng thành các giao dịch nếu cần.
Swap
Nguồn:src/clmm/swap.ts
computeAmountOutFormat duyệt qua bản đồ tick ngoài chuỗi bằng cách sử dụng logic giống như chương trình trên chuỗi và trả về:
- số lượng dự kiến ra,
- số lượng tối thiểu ra sau slippage,
- danh sách các tài khoản tick-array mà swap thực tế sẽ chạm vào (
remainingAccounts).
remainingAccounts được trả về bởi mô phỏng: nếu bạn truyền quá ít, swap sẽ hoàn nguyên giữa chừng với TickArrayNotFound; nếu bạn truyền các tài khoản cũ, sẽ lãng phí tính toán.
Tạo pool CLMM có thể tùy chỉnh
createCustomizablePool là điểm vào mới để hiển thị các công tắc phí động và phí một chiều tại thời điểm tạo pool. Nó có cùng hình dạng với createPool cộng với ba bổ sung:
createPool tiếp tục hoạt động cho đường dẫn phí mặc định, không có lệnh giới hạn, không có phí động. Sử dụng createCustomizablePool bất cứ khi nào bạn cần bất kỳ ba công tắc mới nào. Xem products/clmm/instructions để biết danh sách tài khoản trên chuỗi.
Lệnh giới hạn
Lệnh giới hạn đỗ đầu vào của người dùng tại một tick duy nhất và được điền FIFO khi swap vượt qua tick đó. Đầu ra được đẩy đến ATA của chủ sở hữu tại thời điểm giải quyết; chủ sở hữu không cần phải trực tuyến để được điền.Mở lệnh giới hạn
LimitOrderState từ (pool, owner, tick, nonce), tăng LimitOrderNonce cho mỗi (pool, owner), và chèn lệnh vào cohort FIFO tại tick đó.
Tăng / giảm lệnh mở
decreaseLimitOrder chỉ có thể loại bỏ từ phần chưa điền của lệnh; phần đã điền bị khóa cho đến khi giải quyết. Cả hai lệnh đều hoàn nguyên với InvalidOrderPhase nếu lệnh đã được điền hoàn toàn.
Giải quyết lệnh đã điền
settleLimitOrder đọc unfilled_ratio_x64 của lệnh so với trình theo dõi cohort, tính toán đầu ra đã điền và chuyển nó đến ATA của chủ sở hữu. Chủ sở hữu có thể gọi điều này cho chính họ; limit_order_admin (một người giữ hoạt động ngoài chuỗi) cũng có thể gọi nó thay mặt chủ sở hữu — đầu ra vẫn đi đến chủ sở hữu.
Để đóng các lệnh đã giải quyết hoàn toàn để khôi phục tiền thuê, hãy sử dụng closeLimitOrder (đơn) hoặc closeAllLimitOrder (hàng loạt). Để giải quyết nhiều lệnh cùng lúc, settleAllLimitOrder gói nhiều lệnh gọi SettleLimitOrder vừa với giao dịch v0.
Liệt kê các lệnh đỗ của ví (ngoài chuỗi)
totalAmount / filledAmount / pendingSettle phân biệt các giai đoạn). Để lấy lịch sử lệnh đóng, hãy sử dụng /limit-order/history/order/list-by-user?wallet=… (theo ví, phân trang theo nextPageId); để lấy nhật ký sự kiện đầy đủ của một lệnh cụ thể, hãy sử dụng /limit-order/history/event/list-by-pda?pda=….
Bộ xương CPI Rust
SwapV2:
Những cạm bẫy phổ biến
- Điểm cuối tick không cách đều →
InvalidTickIndex. Luôn snap quaTickUtils.getPriceAndTick. - Không cung cấp đủ tick array trong
SwapV2→TickArrayNotFound. Sử dụngcomputeAmountOutFormatđể lấy danh sách đầy đủ. - Vị trí phạm vi đầy đủ mà không có phần mở rộng bitmap → PDA phần mở rộng phải có thể ghi được; SDK xử lý điều này tự động.
- Nhầm lẫn
sqrt_price_x64vớiprice→ sự nhầm lẫn về hệ số 2 ở đây đặc biệt đau đớn. Khi không chắc chắn, hãy để SDK tính toán nó từ giá có thể đọc được của con người. - Thu thập phần thưởng quá sớm → mỗi lần thu thập tốn một giao dịch. Gói qua
harvestAllRewardstrên nhiều vị trí. - Tự đóng tài khoản NFT →
ClosePositionđốt NFT và đóng ATA của nó. Nó cũng đóng mint NFT Token-2022; mint SPL Token cổ điển vẫn ở mức cung cấp bằng không vì chương trình đó không thể đóng mint. Không đóng các tài khoản được hỗ trợ riêng biệt hoặc lệnh sẽ hoàn nguyên. - Mở lệnh giới hạn tại tick không cách đều →
InvalidTickIndex. Luôn lượng tử hóa quaTickUtils.getPriceAndTick. - Gọi
decreaseLimitOrdertrên lệnh được điền hoàn toàn →InvalidOrderPhase. Sử dụngsettleLimitOrderrồicloseLimitOrderthay thế. - Quên
dynamicFeeConfigIdtrong khi truyềnenableDynamicFee: true→ hoàn nguyênCreateCustomizablePoollàInvalidDynamicFeeConfigParams. Hoặc tắt phí động, hoặc chọn cấu hình từ/main/clmm-dynamic-config.
Bước tiếp theo
sdk-api/typescript-sdk— bề mặt SDK hoàn chỉnh.sdk-api/rest-api— các điểm cuối báo giá và siêu dữ liệu pool.user-flows/create-clmm-pool— hướng dẫn không có mã.integration-guides/aggregator— định tuyến CLMM như một phần của đường dẫn.

