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 →
sdk-api/rust-cpi bao gồm các cơ chế cấp thấp để gọi từng chương trình Raydium. Trang này là phần đi kèm cấp cao hơn: tại sao bạn nên kết hợp Raydium vào chương trình riêng của mình, mẫu nào phù hợp với trường hợp sử dụng của bạn, và toàn bộ mã glue bạn cần từ đầu đến cuối.Khi CPI là công cụ phù hợp
Một chương trình tuỳ chỉnh có ý nghĩa khi giao dịch cần xảy ra nguyên tử với các thay đổi trạng thái on-chain khác mà chỉ chương trình của bạn mới có thể thực hiện. Các trường hợp phổ biến:- Chương trình escrow / lệnh giới hạn — người dùng gửi mint vào escrow của bạn, chương trình của bạn theo dõi điều kiện giá, và khi nó được kích hoạt, chương trình của bạn hoán đổi nguyên tử qua Raydium và ghi có tài khoản của người dùng.
- Proxy aggregator — một hướng dẫn duy nhất định tuyến swap qua Raydium + một hoặc nhiều DEX khác, với tất cả các hop dưới một kiểm tra slippage duy nhất do chương trình của bạn sở hữu.
- Vault tự động gộp — gửi LP hoặc farm stake vào vault của bạn, vault thu hoạch phần thưởng theo lịch biểu, cấp lại thanhkhoản, phát hành token chia sẻ.
- Vault chiến lược — vị trí LP có đòn bẩy được cân bằng lại bằng cách hoán đổi qua CLMM; những người thanh lý đóng vị trí và hoán đổi tài sản thế chấp trong một giao dịch.
- Nền tảng khởi chạy token với vesting tuỳ chỉnh — chương trình của bạn giữ token vesting và phát hành vào pool Raydium theo lịch biểu.
Các mẫu kết hợp
Mẫu 1: Proxy mỏng
Chương trình của bạn đưa ra một hướng dẫn duy nhất để xác thực một số chính sách (ví dụ: các cặp mint được phê duyệt, chiết khấu phí cho người dùng được xác minh) và sau đó chuyển tiếp sang Raydium.Mẫu 2: Escrow
Chương trình của bạn sở hữu một PDA giữ mint đầu vào của người dùng. Khi được kích hoạt, PDA ký một CPI tới Raydium để hoán đổi số dư riêng của nó.CpiContext::new_with_signer. Xem Signer seeds PDA.
Mẫu 3: Kết hợp multi-hop
Chương trình của bạn phát hành nhiều CPI trong một hướng dẫn duy nhất, thực thi một giới hạn slippage duy nhất trên tất cả chúng. Các hướng dẫn swap Raydium mỗi cái cóminimum_amount_out riêng của nó, nhưng bạn đặt những cái đó thành 0 (hoặc một giới hạn sàn rất lỏng) và thực thi một mức tối thiểu chặt chẽ cho riêng bạn sau hop cuối cùng.
Mẫu 4: Vault / chiến lược
Chương trình của bạn giữ token LP hoặc farm stake trong PDA. Một người giám sát (hoặc người dùng) gọicompound(), điều này:
- Thu hoạch phần thưởng từ farm.
- Hoán đổi phần thưởng cho token pool (CPI vào CPMM hoặc CLMM).
- Gửi lại các khoản tiền thu được vào LP (một CPI khác).
- Stake LP mới (một CPI khác).
Xây dựng danh sách tài khoản
StructAccounts của chương trình gọi phản chiếu thứ tự tài khoản của chương trình Raydium, nhưng hầu hết các tài khoản phía Raydium là UncheckedAccount vì Raydium tự xác thực chúng. Bạn chỉ thêm ràng buộc vào các tài khoản bạn sở hữu:
UncheckedAccount trên các tài khoản của Raydium — không phải là lười biếng. Người nhận xác thực của riêng họ; xác thực kép ở người gọi chỉ tiêu CU và có nguy c险mất đồng bộ khi Raydium gửi một trường bố cục struct mới.
Cuộc gọi CPI chính nó
PDA signer seeds
CPI chỉ thành công nếu PDA được chuyển làmauthority phù hợp với dẫn xuất mà người gọi tuyên bố. Cả hai phải đồng ý về:
- Dãy byte seed (ở đây
[b"escrow", user.key().as_ref()]). - Bump.
- ID chương trình gọi (chương trình của bạn, không phải Raydium).
authority là ai — nó chỉ quan tâm rằng chữ ký của authority bao gồm giao dịch và ATA đầu vào được sở hữu bởi authority đó. Xác thực xảy ra trong anchor_spl::token::transfer: trường authority của ATA phải bằng người ký.
Lỗi phổ biến: chuyển user làm authority (và chuyển từ escrow_input_ata được sở hữu bởi PDA escrow). Chương trình SPL Token từ chối với owner mismatch. Luôn làm cho trường authority khớp với chủ sở hữu ATA.
Remaining accounts
Một số hướng dẫn Raydium nhận một danh sách tài khoản có độ dài thay đổi được nối thêm sau những cái cố định — remaining accounts.- CLMM
SwapV2: 1–8 tài khoảnTickArrayStatecho các mảng tick mà swap có thể duyệt, theo hướng swap. - Farm v6
Deposit/Harvest/Withdraw: các cặp(reward_vault, user_reward_ata), một cặp cho mỗi slot phần thưởng trực tiếp. - Token-2022 transfer-hook mints: chương trình transfer-hook cộng với bất kỳ tài khoản nào mà hook cần.
Compute budget cho các cuộc gọi kết hợp
Một CPI chi phí ~1.500 CU cho chính frame gọi; sử dụng CU của callee chính nó xếp chồng lên trên. Rough budget cho mỗi CPI Raydium:| Call | CU (SPL Token) | CU (Token-2022) |
|---|---|---|
| CPMM swap_base_input | ~150,000 | ~200,000 |
| CLMM swap_v2 (single tick array) | ~180,000 | ~230,000 |
| CLMM swap_v2 (crosses 2 ticks) | ~220,000 | ~270,000 |
| Farm v6 deposit | ~120,000 | ~150,000 |
| Farm v6 harvest (per reward slot) | +30,000 | +40,000 |
| AMM v4 swap_base_in | ~140,000 | n/a |
harvest → swap A → swap B → deposit LP → stake LP dễ dàng đạt 700k CU.
Luôn đặt một ComputeBudgetProgram::set_compute_unit_limit rõ ràng:
Truyền lỗi
Các chương trình Raydium trả về lỗi Anchor với mã lỗi ổn định. Chương trình gọi của bạn nhìn thấy chúng dưới dạngErr(ProgramError::Custom(code)). Bong theo mặc định:
sdk-api/anchor-idl); các mã mới nối thêm vào cuối, các mã hiện có không bao giờ thay đổi ý nghĩa.
Ví dụ đầy đủ được thực hiện: limit-order escrow
Luồng:open_order— người dùng gửiamount_incủainput_mintvào PDA escrow; ghi lạimin_amount_outvà hết hạn mục tiêu.execute_order— bất cứ ai (keeper) gọi với các tài khoản pool hiện tại. Chương trình kiểm tra báo giá hiện tại ≥min_amount_out, sau đó CPI Raydium swap và giữ đầu ra trong escrow.claim— người dùng rút mint đầu ra từ escrow.
Kiểm tra
Kéo các chương trình Raydium vào bộ xác thực cục bộ để kiểm tra tích hợp (từAnchor.toml):
anchor test tìm nạp chúng từ mainnet tại khởi động. Xem sdk-api/rust-cpi.
Các cạm bẫy cụ thể cho kết hợp
Reentrancy
Solana không có reentrancy thực sự — một CPI không thể gọi lại vào chương trình gốc trong cùng một lệnh gọi. Nhưng bạn vẫn có thể xây dựng mình thành một reentrancy logic: một CPI đọc trạng thái của bạn, sau đó mã của bạn đọc lại nó giả định CPI đã không thay đổi nó. Đối với Raydium, các CPI không chạm vào trạng thái của bạn, vì vậy đây là mối lo ngại ít hơn so với ví dụ các bối cảnh flash-loan. Nhưng nếu bạn kết hợp Raydium với giao thức cho vay, hãy lưu ý.Sự trôi của tính mutability tài khoản
Nếu chương trình của bạn chuyển một tài khoản làmut nhưng Raydium mong đợi nó chỉ đọc (hoặc ngược lại), runtime từ chối lệnh gọi với InvalidAccountData. Luôn kiểm tra tính mutability dự kiến của hướng dẫn Raydium trong IDL; anchor_cp_swap::cpi::accounts::Swap thực thi nó qua các loại trường của nó.
Trường chương trình Token-2022
Token đầu vào và đầu ra có thể nằm dưới các chương trình token khác nhau — một SPL Token, một Token-2022. CPI có các trườnginput_token_program và output_token_program riêng vì lý do này. Luôn kiểm tra trường owner của mỗi mint và định tuyến chương trình chính xác vào mỗi slot.
Giao dịch đã phiên bản
Một tx kết hợp thực hiện 2+ CPI Raydium cộng với tạo ATA hiếm khi vừa trong một giao dịch cũ (v0-without-LUT). Sử dụng V0 với bảng tra cứu địa chỉ; kéo LUT công khai của Raydium quaraydium.getRaydiumLutAddresses().
Con trỏ
sdk-api/rust-cpi— cơ chế CPI cấp thấp.integration-guides/priority-fee-tuning— sizing compute budget.products/cpmm/code-demos,products/clmm/code-demos,products/farm-staking/code-demos— các đoạn CPI cho từng sản phẩm.

