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 →
Chức năng của trang này. Tạo một pool CLMM mới ở mức phí bạn chọn, sau đó mở một vị trí tập trung ban đầu. Hai giao dịch trên bốn tệp — config.ts, createPool.ts, createPosition.ts, và utils.ts — chạy với npx tsx. Mã được lấy từ các demo chính thức trong raydium-sdk-V2-demo/src/clmm và được điều chỉnh để chạy độc lập.

Thiết lập

Hãy chắc chắn rằng bạn đã đọc Điều kiện tiên quyết Bắt đầu nhanh và có RPC_URL, KEYPAIR, cũng như các phụ thuộc đã được cài đặt. Ngoài các phụ thuộc trong hướng dẫn bắt đầu nhanh, bạn cần:
  • decimal.js — toán học giá và tick trong createPool.tscreatePosition.ts.
  • bs58 — giải mã một keypair được mã hóa base58 trong config.ts nếu bạn sử dụng KEYPAIR_BS58 thay vì tệp keyfile JSON.
  • tsx — chạy các tệp .ts dưới đây trực tiếp qua npx tsx; không giống như các script swap và CPMM, tệp này không phải là tệp .mjs thông thường chạy với node.
Tạo pool CLMM có phí một lần cộng với tiền thuê mảng tick cho vị trí ban đầu. Bạn cũng sẽ cần cả hai mint seed trong ví của mình — mở một vị trí khi giá nằm trong phạm vi được chọn yêu cầu thanb khoản ở cả hai phía. Chạy trên devnet. Chỉ thay đổi cluster thành "devnet" trong config.ts là không đủ. createPool.ts truyền một programId: CLMM_PROGRAM_ID rõ ràng, một hằng số mainnet cố định không tuân theo cluster — hãy thay thế nó bằng dòng DEVNET_PROGRAM_ID.CLMM_PROGRAM_ID được chú thích ngay phía trên. createPosition.ts cũng hardcode một poolId mainnet (pool RAY-USDC); thay thế nó bằng ID của pool devnet bạn tạo ở Bước 2.

Bước 1 — config.ts

Lưu dưới dạng config.ts. Đây là hình dạng giống như src/config.ts.template của repo demo — disableFeatureCheck được buộc thành true (được khuyến nghị cho bất kỳ tích hợp không tầm thường nào để SDK không bị chặn trên lệnh gọi phát hiện tính năng khởi động của nó):
config.ts

Bước 2 — createPool.ts

Lưu cùng với config.ts. Nguồn: src/clmm/createPool.ts.
createPool.ts

Bước 3 — createPosition.ts

Nguồn: src/clmm/createPosition.ts.
createPosition.ts

Bước 4 — utils.ts

Nguồn: src/clmm/utils.ts.
utils.ts

Chạy nó

Điều gì vừa xảy ra

Giao dịch 1 — raydium.clmm.createPool đã khởi tạo:
  • trạng thái pool tại PDA chính tắc cho (mint1, mint2, ammConfig),
  • token_0_vaulttoken_1_vault (được sắp xếp theo thứ tự byte mint),
  • vòng đệm observation,
  • bitmap mảng tick nội tuyến,
và đặt sqrt_price_x64 ban đầu từ initialPrice của bạn. Giao dịch 2 — raydium.clmm.openPositionFromBase đã mở một vị trí tập trung:
  • đã mint một NFT vị trí vào ví của bạn (NFT vị trí; chuyển nó sẽ chuyển vị trí),
  • đã cấp phát mảng tick ở các giới hạn dưới và trên (tiền thuê một lần nếu vị trí đầu tiên trong các phạm vi đó; mảng tick không bao giờ được đóng bởi chương trình, vì vậy các vị trí tiếp theo trong các mảng giống nhau không phải trả tiền thuê thêm),
  • đã gửi inputAmount của mint1 và số tiền cặp phù hợp của mint2 (được tính bằng PoolUtils.getLiquidityAmountOutFromAmountIn),
  • đã ghi có vị trí với thanb khoản tỷ lệ với chiều rộng phạm vi.
Phạm vi càng hẹp, hiệu quả vốn trên mỗi đô la TVL càng cao — và tổn thất vô thường càng đau đớn khi giá trôi ra khỏi phạm vi. Phạm vi được sử dụng ở trên ([0.000001, 100000]) về cơ bản là toàn phạm vi; hãy siết chặt nó để tập trung phí gần giá spot hiện tại.

Chọn mức phí

clmmConfigs[0] là mức phí thấp nhất. Bộ đầy đủ được xuất bản tại GET https://api-v3.raydium.io/main/clmm-config: Xem user-flows/choosing-a-pool-type để có ma trận quyết định đầy đủ.

Lỗi phổ biến

  • Pool already exists for this config — Một pool CLMM đã tồn tại cho bộ ba (mint1, mint2, ammConfig) này. Tra cứu ID pool hiện có và bỏ qua Bước 2.
  • Insufficient funds for amount B — Ví của bạn có số tiền được yêu cầu của mintA nhưng không có mintB phù hợp. Mở một vị trí khi giá nằm trong phạm vi yêu cầu thanb khoản ở cả hai phía.
  • Tick out of rangelowerPrice hoặc upperPrice của bạn nằm ngoài phạm vi giá có thể biểu diễn. Sử dụng một phạm vi hợp lý hơn so với giá hiện tại.
  • Giá cũ — Báo giá từ API có thể cũ 5–60 giây. Nếu executePosition không thành công do slippage, hãy bỏ ghi chú khối getRpcClmmPoolInfo trong createPosition.ts để lấy lại giá trực tiếp ngay trước khi ký.

Cảnh báo

  • NFT vị trí là tay cầm duy nhất của bạn. Mất NFT hoặc chuyển nó, mất quyền truy cập vào vị trí. Coi nó như một chìa khóa.
  • Vị trí ngoài phạm vi không kiếm được phí. Nếu giá di chuyển ngoài [lowerPrice, upperPrice], vị trí của bạn được đỗ hoàn toàn trong một tài sản và không kiếm được gì cho đến khi bạn cân bằng lại.
  • Tiền thuê mảng tick là một chiều. Vị trí đầu tiên chạm vào mảng tick chưa được khởi tạo sẽ trả tiền thuê của nó; chương trình không công khai một đường dẫn để đóng mảng tick, vì vậy tiền thuê đó là vĩnh viễn. Các vị trí tiếp theo trong cùng một mảng là miễn phí.

Tiếp theo

Nguồn: