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ụ TypeScript nhắm mục tiêu @raydium-io/raydium-sdk-v2@0.2.64-alpha; chúng được thực thi lần cuối cùng với 0.2.42-alpha (2026-04) và chữ ký gọi của chúng được kiểm tra lại với nguồn 0.2.64-alpha vào ngày 2026-09-09, trên Solana mainnet-beta. Bộ khung CPI Rust nhắm mục tiêu raydium-cp-swap trên master, Anchor 1.0.2. ID chương trình được lấy thông qua các hằng số từ reference/program-addresses.

Điều kiện tiên quyết

Mỗi ví dụ trên trang này phản ánh một tệp trong raydium-sdk-V2-demo/src/cpmm; 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 lưu trữ demo (nguồn):
Instance Raydium là facade của SDK — mỗi ví dụ dưới đây sử dụng nó. Raydium.load là async vì nó tải danh sách token theo mặc định; truyền disableLoadToken: true để bỏ qua lần tìm nạp đó. Kiểm tra tính năng khả dụng đã bị bỏ qua trừ khi bạn truyền disableFeatureCheck: false. Các cấu hình phí được tìm nạp một cách lười biếng khi sử dụng lần đầu tiên thông qua raydium.api.getCpmmConfigs().

Tạo một pool CPMM

Nguồn: src/cpmm/createCpmmPool.ts
Một vài điều mà SDK xử lý một cách im lặng:
  • Sắp xếp các mint theo thứ tự token0/token1 trước khi lấy PDA.
  • Trả phí create_pool_fee một lần cho poolFeeAccount.
  • Tạo các tài khoản token được liên kết của người gọi nếu bị thiếu.
  • Chọn chương trình token phù hợp (SPL Token so với Token-2022) cho mỗi bên.
Sau khi xác nhận, bạn có thể tìm nạp trạng thái pool trực tiếp với:

Swap (base-input)

Nguồn: src/cpmm/swap.ts
Lưu ý: SDK luôn tìm nạp lại trạng thái pool từ RPC bên trong getPoolInfoFromRpc. Không báo giá từ api-v3.raydium.io cho một giao dịch mà bạn sắp ký — một báo giá cũ một khối có thể trượt vào ExceededSlippage tại thời điểm hạ cánh.

Swap (base-output)

Nguồn: src/cpmm/swapBaseOut.ts

Gửi thanh khoản

Nguồn: src/cpmm/deposit.ts
SDK lấy số tiền được ghép nối từ dự trữ hiện tại của pool, tăng mỗi bên theo slippage cho các đối số maximum_* của hướng dẫn, và xây dựng các tạo ATA nếu cần thiết. raydium.cpmm.computePairAmount({ ... }) trả về các số giống nhau nếu bạn muốn chúng để xem trước UI.

Rút thanh khoản

Nguồn: src/cpmm/withdraw.ts

Thu thập phí protocol/fund/creator

Nguồn: src/cpmm/collectCreatorFee.ts, src/cpmm/collectAllCreatorFee.ts Thu thập protocol và fund vẫn được kiểm soát bởi quyền hạn. Phí creator có hai cách: CollectCreatorFee được ký bởi creator, và CollectCreatorFeePermissionless có thể được gọi bởi bất kỳ người trả phí nào nhưng chỉ có thể chuyển đến các ATA chính thức của creator. Phiên bản 0.2.64-alpha cung cấp các builder ở cấp module cho cả hai cách của creator:
Cả hai instruction creator đã thay đổi danh sách tài khoản trong bản nâng cấp chương trình ngày 2026-09-19. Mỗi cái hiện nhận một PDA creator_fee_share tại ["creator_fee_share", creator, ammConfig], và cái permissionless cũng nhận amm_config — cả hai được thêm vào sau system_program thay vì được chèn vào, vì vậy các tài khoản đã có giữ nguyên vị trí của chúng. Một builder được ghim vào phiên bản SDK trước bản nâng cấp sẽ phát ra danh sách ngắn hơn và giao dịch bị từ chối vì thiếu tài khoản. Hãy kiểm tra rằng phiên bản bạn cài đặt có chứa các tài khoản mới trước khi sử dụng các helper này với chương trình đã nâng cấp, và làm mới IDL nếu bạn tạo client từ nó.Truyền PDA là bắt buộc ngay cả khi nó chưa bao giờ được tạo — hãy dẫn xuất nó và truyền nó; chương trình sẽ quay lại AmmConfig.creator_fee_share_rate khi tài khoản trống.
Hai instruction creator có các discriminator và account layout khác nhau — cái permissionless thay thế người ký creator bằng một payer riêng biệt và một creator không ký. Hãy sử dụng builder phù hợp thay vì trao đổi tài khoản thủ công trên cái kia.Không có builder phí protocol hoặc fund trong SDK (makeCollectProtocolFeeInstruction và makeCollectFundFeeInstruction không tồn tại dưới bất kỳ tên nào) — đó là các đường dẫn admin, cũng như CreateCreatorFeeShare / CloseCreatorFeeShare, cũng không có builder. Các builder instruction cấp thấp thực sự tồn tại là collectCpFeeInstruction, makeCollectCreatorFeeInstruction và collectCreatorFeePermissionlessInInstruction.
Off-chain, bạn có thể đọc phí tích lũy trực tiếp từ PoolState:

Bộ xương CPI Rust

Nếu bạn muốn gọi CPMM từ chương trình Anchor của riêng mình — ví dụ, một vault thực hiện swap thay mặt cho những người gửi tiền của nó — ngữ cảnh CPI trông như thế này. Thứ tự tài khoản tuân theo products/cpmm/instructions.
Nếu CPI của bạn ký như một PDA (ví dụ, bạn quản lý một vault thay mặt cho những người gửi tiền), hãy hoán đổi CpiContext::new với CpiContext::new_with_signer và truyền các seed của bạn.

Những lỗi thường gặp

Một danh sách kiểm tra ngắn trước khi mở một vé hỗ trợ:
  • Sorted mints. Nếu poolState PDA dẫn xuất của bạn không khớp với pool trên chuỗi, bạn có thể đã quên sắp xếp các mint.
  • Stale API quote. Không bao giờ truyền giá trị reserve từ api-v3.raydium.io vào CurveCalculator.swap. Hãy lấy từ một RPC.
  • Wrong token program. Vault của một mint Token-2022 được sở hữu bởi chương trình Token-2022, không phải bởi SPL Token. Luôn sử dụng các trường token_0_program / token_1_program của pool.
  • Slippage under-denominated for transfer-fee mints. Nếu một trong hai bên của pool là một mint Token-2022 transfer-fee, minimum_amount_out của bạn phải được tính bằng những gì người dùng thực sự nhận được, không phải những gì vault gửi.
  • NotApproved on a swap. Kiểm tra PoolState.status — admin có thể đã tạm dừng swap trên pool đó. Xem products/cpmm/instructions để biết bitmask trạng thái.

Bước tiếp theo

Nguồn: