本页内容由 AI 自动翻译,所有内容以英文版本为准。查看英文版 →
聚合器的职责是为用户提供跨多个流动性池的最优价格,可能将单个输入拆分到多个池路由中,并以原子方式执行。本页记录了该工作的 Raydium 特定部分:发现、报价和交易组装。
发现
流动性池清单
你需要获取每个产品的完整实时 Raydium 流动性池列表。有三种选择:- REST API(最简单):
GET https://api-v3.raydium.io/pools/info/list?poolType=all&pageSize=1000&page=1以 1000 个为一批返回流动性池。分页直到获取全部。缓存 1–5 分钟。 - 链上扫描:在 CPMM、CLMM 和 AMM v4 程序 ID 上调用
getProgramAccounts,按状态账户判别器过滤。产生约每个实时流动性池,耗时约 10 秒的 RPC 时间。当 API 宕机或限流时有用。 - 混合方案:以 API 作为主要来源;每天运行一次链上扫描作为完整性检查。团队承诺保持 API 的全面性,但通过直接 CPI 创建的流动性池(无前端)偶尔会滞后。
交易对查询
对于特定的(mintA, mintB) 交易对,使用 GET /pools/info/mint?mint1=...&mint2=...&poolType=all&sort=liquidity。返回任何费率层级和产品类型的每个流动性池。热门代币对通常返回约 10 个结果;按 TVL 排序并选择前几个用于路由。
报价
报价数学因产品而异。使用 SDK 的纯数学函数,这样你就不需要重新实现:amountOut(滑点前)。
缓存新鲜度
流动性池状态衰退很快。推荐的新鲜度目标:
对于以交互延迟获取报价的聚合器,订阅每个相关流动性池状态的 WebSocket 账户更新(
accountSubscribe)。这将模型从轮询翻转为推送。
Token-2022 调整
如果路由中的任何代币有 Token-2022 转账费,报价数学必须根据algorithms/token-2022-transfer-fees 调整输入和输出。如果 poolInfo.mintA.extensions.transferFeeConfig 已填充,SDK 会处理此问题。在信任报价之前,通过查看 .extensions 字段进行确认。
路由
单池路由
大多数路由是单池。选择amountOut 最高的流动性池。如果多个接近,按费率层级(较低更好)打破平局,然后按 TVL(更多更安全)。
拆分路由
对于单个流动性池价格影响 >5% 的大交易,跨流动性池拆分。一个简单的贪心算法:[(pool_A, 0.6), (pool_B, 0.3), (pool_C, 0.1)],最小化聚合影响。适当的凸优化解决方案(例如跨流动性池均衡边际价格)在实践中与贪心结果相差约 1%。
多跳路由
USDC → RAY → SOL 通过两个单独的流动性池很常见,当没有直接的 USDC-SOL 流动性池给出好报价时(罕见)。应用每跳滑点界限;每跳强制执行自己的 minAmountOut。参见 algorithms/slippage-and-price-impact。
跨同一流动性池的多跳(例如 SOL-USDC 上的两个 CLMM 跳)总是相对于单跳次优的——不要生成此类路由。
交易组装
单跳、单池
对于单个流动性池,调用该流动性池类型自己的交换构建器——raydium.liquidity.swap、raydium.cpmm.swap 或 raydium.clmm.swap。raydium.tradeV2.swap 是多跳路由执行器,采用完全不同的形状({ swapInfo, swapPoolKeys, routeProgram, ownerInfo, txVersion });没有 raydium.trade。
拆分和多跳
手动组合 ATA + 指令。模式:原子性
聚合器必须保证原子性:要么完整路由落地,要么都不落地。Raydium 的交换指令在ExceededSlippage 时回滚,所以一个多池路由中一跳失败会导致整个交易回滚。免费。
唯一的例外:如果你的路由通过 Raydium + 第三方 DEX,确保该 DEX 也有滑点回滚模型。某些程序忽略滑点界限(罕见)。
陷阱
1. 过期报价
在用户看到”你将收到 125.43 RAY”和交易落地之间,储备可能会移动。在提交前立即重新获取流动性池状态;重新报价;如果新报价差 >1%,暂停并与用户重新确认。2. 流动性池黑名单
某些 Raydium 流动性池是转账费设置为 99% 或具有不可转账扩展的诈骗代币。REST API 标记这些(参见tags 字段);跳过任何标记为 scam 或 honeypot 的流动性池。在 Raydium 标签之上运行自己的安全检查是谨慎的。
3. CLMM 上的观察状态要求
CLMMSwapV2 采用 observation_state 账户。SDK 为你填充它;手工构建的指令经常忘记,这会导致程序以 AccountNotFound 回滚。始终包含它。
4. 地址查询表
Raydium 为其最常用的账户(主代币、程序 ID、AmmConfigs)维护公共查询表。聚合器应该使用这些——它每个交易节省约 100 字节,并使更大的路由适合 V0。拉取 LUT 地址:5. 处理拥塞
在高交易量窗口期间,交易可能在内存池中停留多个区块。建议在 TX 过期时积极重试(不是在回滚时——回滚是确定性的)。SDK 的sendAndConfirm 选项进行基本重试;生产聚合器在其上层自己的逻辑(Jito 捆绑、多 RPC 广播)。
检查清单
上线前,验证:- 流动性池发现全面覆盖 CPMM + CLMM + AMM v4。
- 报价在少数测试交易上与 Raydium 自己的 UI 报价相差 1 个基点以内。
- 拆分路由在任何单个流动性池 >5% 影响的交易中启动。
- 优先费根据最近的流动性池程序费调整大小(参见
integration-guides/priority-fee-tuning)。 - Token-2022 转账费被计算并显示给用户。
- 当超过滑点时交易干净地回滚。
- 重试逻辑区分 tx 过期(重试)和回滚(不重试)。
指针
integration-guides/routing-and-mev— 三明治抵抗、捆绑。integration-guides/priority-fee-tuning— 调整计算预算指令大小。sdk-api/rest-api— 流动性池列表端点。

