Skip to main content
本页内容由 AI 自动翻译,所有内容以英文版本为准。查看英文版 →

前置要求

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

创建 CPMM 池

源代码:src/cpmm/createCpmmPool.ts
SDK 会默默处理几件事:
  • 在派生 PDA 之前将 mint 排序为 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,将每个增加 1 + slippage 作为指令的 maximum_* 参数,并在必要时构建 ATA 创建。

提出流动性

源代码:src/cpmm/withdraw.ts

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

源代码:src/cpmm/collectCreatorFee.tssrc/cpmm/collectAllCreatorFee.ts 这些指令是管理员或创建者控制的,通常从由 Raydium 多签或池创建者持有的签署者调用。SDK 将它们作为原始构建器表现:
离线,你可以直接从 PoolState 读取应计费用:

Rust CPI 框架

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

常见陷阱

在提交支持工单前的简短检查清单:
  • 排序的 mint。 如果你派生的 poolState PDA 与链上池不匹配,你可能忘记了排序 mint。
  • 过时的 API 报价。 不要将来自 api-v3.raydium.io 的准备金值传入 CurveCalculator.swap。从 RPC 获取。
  • 错误的代币程序。 Token-2022 mint 的金库由 Token-2022 程序所有,而不是由 SPL Token 所有。始终使用池的 token_0_program / token_1_program 字段。
  • 转账费 mint 的滑点分母不足。 如果池的任一侧是 Token-2022 转账费 mint,你的 minimum_amount_out 必须按用户实际接收的金额计值,而不是金库发送的金额。
  • 交换时出现 NotApproved 检查 PoolState.status——管理员可能已暂停该池上的交换。详见 products/cpmm/instructions 的状态位掩码。

后续步骤

源代码: