跳转到主要内容

Documentation Index

Fetch the complete documentation index at: https://docs.raydium.io/llms.txt

Use this file to discover all available pages before exploring further.

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

一句话总结

AMM 路由程序将多跳交换捆绑为单个链上交易,跨池连接流动性。你提供路由(池和中间代币的列表)以及一个带滑点参数的指令;路由器按顺序执行所有 N 个跳跃,将一个池的输出移动到下一个池的输入。不需要单独的链上路由逻辑来计算价格——每个跳跃的费用和曲线由其自己的池程序通过 CPI 处理——但路由器协调账户传递和代币流动。

为什么需要独立的路由程序?

Raydium 客户端和聚合器总可以在客户端编织多跳交换,而不使用路由器:构建 N 个交换指令(每个池一个)并在单个交易中提交。那么,为什么要有专门的路由程序呢?

使用路由器的理由

  1. 来自其他程序的 CPI。 如果你的程序需要调用路由作为更大交易的一部分(例如,交换费用以获取目标代币的流动性管理器),CPI 到路由器比捆绑 N 个子 CPI 并在合约中管理所有账户更简洁。
  2. 原子账户状态。 每个跳跃的账户列表在一个指令上下文中验证。如果中间池的状态被损坏或限价断言失败,整个路由以原子方式失败,没有部分结算。
  3. 单个指令组合。 SDK 和前端可以将多跳路由表示为一个逻辑操作,而不是 N 个恰好连续的单独指令。

客户端拼接仍是默认方式

对于大多数应用,为每个池构建单独的 Swap 指令并按顺序提交它们更简单、更可组合且同样有效。Raydium SDK 的 Trade.makeSwapTransaction 和类似流程对大多数路由都是这样做的。 路由器是替代方案,不是替代品。在以下情况下使用:
  • 你正在实现一个需要路由作为更大原子操作一部分的程序。
  • 你正在构建一个希望有单个「提交此路由」操作的聚合器。

工作原理

路由指令携带:
  • 交换参数:精确输入(amount_inminimum_amount_out)或精确输出(maximum_amount_inamount_out)。
  • 路由规范:每个跳跃的 program_id + 子程序账户列表,按顺序。路由器读取每个跳跃组中的第一个账户来确定要调用哪个程序。
  • 限价(CLMM):sqrt_price_x64 边界的 VecDeque<u128>。仅用于进入 CLMM 池的跳跃;对于较旧的指令变体,空队列是错误。
路由器然后:
  1. 执行第一个跳跃:amount_in(或为精确输出计算所需输入)转移到第一个池的输入金库,调用该池的交换,并收集输出。
  2. 链接后续跳跃: 对于每个跳跃 N,将第 N−1 个跳跃的输出用作第 N 个跳跃的输入。
  3. 强制执行滑点: 在每个 CLMM 跳跃处,检查 sqrt_price 是否符合对应的 limit_price;在最后一个跳跃处,检查总输出是否符合全局 minimum_amount_out
中间代币可以流经 用户控制的 ATA(每个跳跃一个,较慢但透明)或 共享的 PDA 派生账户(所有跳跃一个地址,较快,不透明)。

定价和费用委托

路由器 不自行计算价格。每个跳跃委托给子程序的曲线:
  • AMM v4:使用常数乘积公式和 OpenBook 混合定价。
  • CPMM:使用常数乘积公式和配置的费用等级。
  • CLMM:使用集中流动性数学和基于 tick 的定价。
  • Stable:对类似代币使用稳定交换曲线。
费用由每个池根据其自己的配置收取。路由器自己不收费。

何时避免使用路由器

  • 跳跃次数少(1-2 次)。 账户传递的开销最小;只需使用两个单独的交换指令。
  • 非 Raydium 池。 路由器只了解四种 Raydium 池类型。对于跨越外部程序的路由,在客户端编织指令。
  • 条件路由。 如果你需要根据价格或池状态在路由中途分支,链上路由的灵活性不如客户端组合。

心理模型

将路由器视为 交易打包实用程序。它接受你的路由规范并将其打包为一个指令、一个交易、一个计算预算。每个跳跃在内部 CPI 到其池程序并在那里处理曲线数学。路由器的工作是正确传递账户、在跳跃之间移动代币和检查滑点。

下一步