Skip to main content
本页内容由 AI 自动翻译,所有内容以英文版本为准。查看英文版 →
版本说明。 所有 TypeScript 示例针对 @raydium-io/raydium-sdk-v2@0.2.64-alpha;最后在 0.2.42-alpha(2026-04)上执行,并在 2026-09-09 针对 0.2.64-alpha 源代码重新检查了调用签名,针对 Solana mainnet-beta。Rust CPI 框架针对 chore/upgrade-anchor 分支上的 raydium-cp-swap,Anchor 1.0.2——master 仍然固定 0.32.1。程序 ID 通过 reference/program-addresses 中的常量拉取。

前置条件

本页的每个示例都对应 raydium-sdk-V2-demo/src/cpmm 中的一个文件;GitHub 链接位于每个部分旁边。初始化遵循演示仓库的 config.ts.template(源代码):
Raydium 实例是 SDK 的门面——下面的每个示例都使用它。Raydium.load 是异步的,因为它默认加载代币列表;传递 disableLoadToken: true 可跳过该获取。可用性功能检查已被跳过,除非你传递 disableFeatureCheck: false。费用配置在首次使用时通过 raydium.api.getCpmmConfigs() 延迟获取。

创建 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 从池的当前储备推导配对金额,为指令的 maximum_* 参数将每一侧增加滑点,并在必要时构建 ATA 创建。raydium.cpmm.computePairAmount({ ... }) 如果你想要它们用于 UI 预览,会返回相同的数字。

提取流动性

源代码:src/cpmm/withdraw.ts

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

源代码:src/cpmm/collectCreatorFee.ts、src/cpmm/collectAllCreatorFee.ts 协议和基金收集仍然受权限限制。创建者费用有两条路径:创建者签署的 CollectCreatorFee 和加法 CollectCreatorFeePermissionless,任何支付者都可以调用,但只能转账到创建者的规范 ATA。0.2.64-alpha 为两个创建者路径提供模块级构建器:
两个创建者指令在 2026-09-19 程序升级中改变了它们的账户列表。 每个现在都在 ["creator_fee_share", creator, ammConfig] 处获取 creator_fee_share PDA,无权限的那个也获取 amm_config——两者都追加在 system_program 之后,而不是插入,因此原有的账户都保持它们的位置。固定到升级前 SDK 版本的构建器发出较短的账户列表,交易会因账户缺失而被拒绝。在针对升级后的程序使用这些辅助函数之前,检查你安装的版本是否包含新账户,如果你从它生成客户端,请刷新 IDL。即使 PDA 从未被创建过,传递它也是强制性的——推导它并传递它;当账户为空时,程序回退到 AmmConfig.creator_fee_share_rate。
两个创建者指令有不同的判别器和账户布局——无权限的那个用单独的 payer 和非签署的 creator 替换创建者签署者。使用匹配的构建器,而不是在另一个上手动交换账户。SDK 中没有协议或基金费用构建器(makeCollectProtocolFeeInstruction 和 makeCollectFundFeeInstruction 在任何名称下都不存在)——那些是管理路径,CreateCreatorFeeShare / CloseCreatorFeeShare 也是,它们也没有构建器。确实存在的低级指令构建器是 collectCpFeeInstruction、makeCollectCreatorFeeInstruction 和 collectCreatorFeePermissionlessInInstruction。
离链,你可以直接从 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。

接下来去哪里

源代码: