Skip to main content
本页内容由 AI 自动翻译,所有内容以英文版本为准。查看英文版 →
聚合器的职责是为用户提供跨多个流动性池的最优价格,可能将单个输入拆分到多个池路由中,并以原子方式执行。本页记录了该工作的 Raydium 特定部分:发现、报价和交易组装。

发现

流动性池清单

你需要获取每个产品的完整实时 Raydium 流动性池列表。有三种选择:
  1. REST API(最简单):GET https://api-v3.raydium.io/pools/info/list?poolType=all&pageSize=1000&page=1 以 1000 个为一批返回流动性池。分页直到获取全部。缓存 1–5 分钟。
  2. 链上扫描:在 CPMM、CLMM 和 AMM v4 程序 ID 上调用 getProgramAccounts,按状态账户判别器过滤。产生约每个实时流动性池,耗时约 10 秒的 RPC 时间。当 API 宕机或限流时有用。
  3. 混合方案:以 API 作为主要来源;每天运行一次链上扫描作为完整性检查。团队承诺保持 API 的全面性,但通过直接 CPI 创建的流动性池(无前端)偶尔会滞后。

交易对查询

对于特定的 (mintA, mintB) 交易对,使用 GET /pools/info/mint?mint1=...&mint2=...&poolType=all&sort=liquidity。返回任何费率层级和产品类型的每个流动性池。热门代币对通常返回约 10 个结果;按 TVL 排序并选择前几个用于路由。

报价

报价数学因产品而异。使用 SDK 的纯数学函数,这样你就不需要重新实现:
三个产品不共享一个签名。computeAmountOut 仅存在于 raydium.liquidity(AMM v4)和 CLMM 的 PoolUtils.computeAmountOut(Format) 中;CPMM 的 等效函数称为 computeSwapAmount 并采用不同的参数。明确写出三个调用,而不是在产品上参数化。
对于聚合器比较,使用每个的 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 + 指令。模式:
全部在一个交易内以保证原子性。对于 V0 上的 3 池拆分,带地址查询表,这通常适合约 1100 字节。对于 4+ 个流动性池,交易大小上限强制要么多交易,要么在中心代币处合并。

原子性

聚合器必须保证原子性:要么完整路由落地,要么都不落地。Raydium 的交换指令在 ExceededSlippage 时回滚,所以一个多池路由中一跳失败会导致整个交易回滚。免费。 唯一的例外:如果你的路由通过 Raydium + 第三方 DEX,确保该 DEX 也有滑点回滚模型。某些程序忽略滑点界限(罕见)。

陷阱

1. 过期报价

在用户看到”你将收到 125.43 RAY”和交易落地之间,储备可能会移动。在提交前立即重新获取流动性池状态;重新报价;如果新报价差 >1%,暂停并与用户重新确认。

2. 流动性池黑名单

某些 Raydium 流动性池是转账费设置为 99% 或具有不可转账扩展的诈骗代币。REST API 标记这些(参见 tags 字段);跳过任何标记为 scam 或 honeypot 的流动性池。在 Raydium 标签之上运行自己的安全检查是谨慎的。

3. CLMM 上的观察状态要求

CLMM SwapV2 采用 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 过期(重试)和回滚(不重试)。

指针

来源: