Skip to main content
本页内容由 AI 自动翻译,所有内容以英文版本为准。查看英文版 →
版本说明。 所有 TypeScript 示例针对 @raydium-io/raydium-sdk-v2@0.2.42-alpha 在 Solana mainnet-beta 上运行,已于 2026 年 4 月验证。Rust CPI 框架针对 master 分支上的 raydium-cp-swap,Anchor 0.30.x。程序 ID 通过 reference/program-addresses 中的常量获取。

前置条件

本页的每个示例都对应 raydium-sdk-V2-demo/src/cpmm 中的一个文件;GitHub 链接位于每个部分旁边。初始化遵循演示仓库的 config.ts.template源代码):
Raydium 实例是 SDK 的门面 — 下面的每个示例都使用它。它会延迟从 api-v3.raydium.io 获取代币列表和费用配置;在离线环境中,你可以用自己的数据进行初始化。

创建 CPMM 池

源代码:src/cpmm/createCpmmPool.ts
SDK 会自动处理以下几点:
  • 在推导 PDA 之前将代币排序为 token0/token1 顺序。
  • poolFeeAccount 支付一次性的 create_pool_fee
  • 如果缺少,创建调用者的关联代币账户。
  • 根据每一侧选择正确的代币程序(SPL Token 或 Token-2022)。
确认后,你可以使用以下方式获取实时池状态:

交换(基础输入)

源代码:src/cpmm/swap.ts
注意:SDK 总是getPoolInfoFromRpc 内部从 RPC 重新获取池状态。不要使用来自 api-v3.raydium.io 的储备值进行报价以用于你即将签署的交易 — 一个落后一个区块的报价可能在着陆时滑入 ExceededSlippage

交换(基础输出)

源代码:src/cpmm/swapBaseOut.ts

存入流动性

源代码:src/cpmm/deposit.ts
SDK 使用池的当前储备将 lpAmount 转换为 needed_token_0needed_token_1,为指令的 maximum_* 参数将每个值增加 1 + slippage,并在必要时构建 ATA 创建。

提取流动性

源代码:src/cpmm/withdraw.ts

收取协议/基金/创建者费用

源代码:src/cpmm/collectCreatorFee.tssrc/cpmm/collectAllCreatorFee.ts 协议和基金收集仍然受权限限制。创建者费用有两条路径:现有的创建者签署的 CollectCreatorFee,以及附加的 CollectCreatorFeePermissionless,任何支付者都可以调用,但只能转账到创建者的规范 ATA。固定的 SDK 公开现有的原始构建器:
@raydium-io/raydium-sdk-v2@0.2.42-alpha 尚未公开 CollectCreatorFeePermissionless 的构建器。在 SDK 发布添加它之前,从升级的 CPMM IDL 构建或直接调用程序。不要重用 makeCollectCreatorFeeInstruction:新指令有不同的判别器,并用单独的 payer 和非签署的 creator 账户替换创建者签署者 / amm_config 位置。
离线,你可以直接从 PoolState 读取应计费用:

Rust CPI 框架

如果你想从自己的 Anchor 程序调用 CPMM — 例如,一个代表其存款人进行交换的金库 — CPI 上下文如下所示。账户顺序遵循 products/cpmm/instructions
如果你的 CPI 作为 PDA 签署(例如,你代表存款人管理金库),将 CpiContext::new 替换为 CpiContext::new_with_signer 并传递你的种子。

常见陷阱

在开启支持工单之前的简短检查清单:
  • 排序的代币。 如果你推导的 poolState PDA 与链上池不匹配,你可能忘记了排序代币。
  • 陈旧的 API 报价。 永远不要将来自 api-v3.raydium.io 的储备值传递给 CurveCalculator.swap。从 RPC 获取。
  • 错误的代币程序。 Token-2022 代币的金库由 Token-2022 程序拥有,而不是 SPL Token。始终使用池的 token_0_program / token_1_program 字段。
  • 转账费用代币的滑点未充分计算。 如果池的任一侧是 Token-2022 转账费用代币,你的 minimum_amount_out 必须以用户实际收到的金额计价,而不是金库发送的金额。
  • 交换时出现 NotApproved 检查 PoolState.status — 管理员可能已暂停该池上的交换。有关状态位掩码,请参见 products/cpmm/instructions

接下来去哪里

来源: