Skip to main content
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

Mỗi ví dụ trên trang này phản ánh một tệp trong 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
SDK thực hiện các bước sau:
  • Sắp xếp mint1/mint2 theo 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 observationtick_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
SDK tự động tính toán các tick array mà khoảng này chạm vào và gói các lệnh 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.tssrc/clmm/closePosition.ts
Để chỉ thu thập phí, gọi 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.
Các vị trí phát hành bị hạn chế yêu cầu trình xây dựng đóng tương thích. Các vị trí này có tài khoản token NFT bị đóng băng. ClosePosition phải thêm ID pool của vị trí làm tài khoản còn lại đầu tiên để CLMM có thể rã đông tài khoản trước khi đốt nó. Nhánh nguồn chương trình không bao gồm thay đổi SDK. Xác nhận rằng phiên bản SDK của bạn hỗ trợ rõ ràng đường dẫn đóng bị đóng băng trước khi bật tạo vị trí phát hành bị hạn chế.
Đố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:
Bạn có thể truyền 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).
Luôn truyền 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

SDK dẫn xuất PDA 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)

Điểm cuối lệnh hoạt động trả về cả lệnh chưa điền và lệnh được điền một phần trong một tải trọng (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

Thứ tự tài khoản còn lại cho SwapV2:
Nếu swap không bao giờ cần phần mở rộng, hãy bỏ qua nó; nếu không, nó là tài khoản còn lại đầu tiên.

Những cạm bẫy phổ biến

  • Điểm cuối tick không cách đềuInvalidTickIndex. Luôn snap qua TickUtils.getPriceAndTick.
  • Không cung cấp đủ tick array trong SwapV2TickArrayNotFound. Sử dụng computeAmountOutFormat để 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_x64 với price → 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 harvestAllRewards trên nhiều vị trí.
  • Tự đóng tài khoản NFTClosePosition đố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 đềuInvalidTickIndex. Luôn lượng tử hóa qua TickUtils.getPriceAndTick.
  • Gọi decreaseLimitOrder trên lệnh được điền hoàn toànInvalidOrderPhase. Sử dụng settleLimitOrder rồi closeLimitOrder thay thế.
  • Quên dynamicFeeConfigId trong khi truyền enableDynamicFee: true → hoàn nguyên CreateCustomizablePoolInvalidDynamicFeeConfigParams. Hoặc tắt phí động, hoặc chọn cấu hình từ /main/clmm-dynamic-config.

Bước tiếp theo

Nguồn: