Skip to main content
本页内容由 AI 自动翻译,所有内容以英文版本为准。查看英文版 →
Raydium 的产品程序是独立的代码库,但它们是根据一套共享的约定设计的。本页是这些约定的规范参考。各产品章节描述这些约定如何在其账户中被实例化;本页描述约定本身。

“共享”在这里的含义

代码库中有三种共享方式:
  • 约定共享。 每个程序都使用相同的 PDA 推导模式、相同的费用分割形状和相同的观察账户概念——但每个都在自己的程序中用自己的种子实现它们。
  • 账户共享。 少数几个账户在许多池中字面上是相同的记录(CPMM 中的全局权限 PDA、AmmConfig 账户)。
  • 链下共享。 一个 REST API 和一个 TypeScript SDK 为所有四个程序提供服务。集成者与一个 HTTP 主机和一个 NPM 包交互,无论他们最终调用哪个程序。
下面的五个原语涵盖了跨越程序边界的所有内容。

1. 权限 PDA

每个 Raydium 程序都有一个 PDA 拥有其代币金库。用户永远不会直接持有金库权限——权限 PDA 是唯一可以转移资金的签名者,它只在有效的程序指令告诉它时才签名。 该模式在各产品中相同;种子不同: 这带来了几个后果:
  • 对于 CPMM 和 CLMM,权限 PDA 是全局账户——该类型的每个池都使用它。如果你正在 CPI 到 CPMM,你只需要一次,而不是每个池。
  • 对于每个池/每个农场的权限,你从池/农场 ID 推导 PDA。SDK 在 getPoolKeys / getFarmKeys 中执行此操作;如果你直接集成,你使用 findProgramAddressSync 推导。
  • 金库所有权无法更改。 一旦创建了以权限 PDA 为所有者的代币账户,只有该 PDA——由程序调用——可以转移出去。没有管理员覆盖。
有关每个程序的确切种子和 ATA 布局,请参阅 products/cpmm/accountsproducts/clmm/accountsproducts/amm-v4/accountsproducts/farm-staking/accountsproducts/launchlab/accounts

2. 管理员和配置账户

CPMM 和 CLMM 共享一个配置账户模式,称为 AmmConfig:一个小的全局账户,由 u16 索引,持有适用于整个费用层级的费率和管理员目的地。池在创建时绑定到配置,永远不会重新绑定。
行为规则:
  • 费用层级是全局的。 当一个池说”这是一个 0.25% 的池”时,它意味着它绑定到 AmmConfig,其 trade_fee_rate 在创建时为 0.25%。没有每个池的费率覆盖。
  • 配置可以更改但池不跟随。 如果配置权限编辑 AmmConfig,绑定到该配置的每个现有池立即获取新费率。这是一个功能,不是错误;这是协议级经济变化如何在没有每个池迁移的情况下传播的方式。
  • disable_create_pool 是弃用杠杆。 当费用层级被日落时,协议多签设置此标志——现有池继续工作但没有新池可以选择该层级。
  • protocol_owner / fund_owner 是费用收集调用的签名者。将它们设置为多签是什么限制费用提取。它们不是费用本身的目的地地址;那是同一账户上的 protocol_fee_destination / fund_fee_destination
AMM v4 没有 AmmConfig——其费用参数是每个池的,在创建时硬编码。Farm 和 LaunchLab 有自己的等价物(FarmConfigLaunchConfig),在各自的章节中介绍。 谁可以更改什么的完整表格在 security/admin-and-multisig 中。当前用户面向的费用分割在 ray/protocol-fees 中。

3. 协议/基金/创建者费用分割

每个 CPMM 和 CLMM 交换费都在输出时分割到最多四个目的地:
机制上:
  1. 交易费累积到池中。 费用从交换的输入端移除,扣费后的金额是常数乘积数学看到的。这就是”LP 赚取费用”的含义——k 上升,隐含的每 LP 代币价值也上升。
  2. 协议/基金/创建者部分从该 LP 端累积中扣除到每个池的计数器账户中。 它们位于池状态(protocol_fees_token{0,1}fund_fees_token{0,1} 等)上,直到有人调用相应的收集指令。它们在那之前不会离开池的金库;从交换的角度来看,它们仍然”在池中”。
  3. 收集将它们移出。 协议和基金路径需要来自 AmmConfig 的各自 protocol_owner / fund_owner 签名者。CPMM 创建者费用使用创建者签名的 CollectCreatorFee 路径或 CollectCreatorFeePermissionless,任何支付者都可以触发,但它将目的地固定为创建者的规范 ATA。
几个承重的观察:
  • 分割百分比是交易费的,不是交易的。 一个 0.25% 的交易费,有 12% 的协议份额意味着协议获得 0.25% × 12% = 0.03% 的交易——不是交易的 12%。
  • 创建者费用仅存在于 LaunchLab 毕业的池上。 标准 CPMM/CLMM 池有三向分割(LP / 协议 / 基金)。LaunchLab 添加第四个槽位,路由到启动代币的人,在 Initialize 时配置且不可变。
  • AMM v4 仅分割两种方式,每个池硬编码:LP 和协议。没有基金槽位,没有创建者槽位。
  • 基金 vs 协议——两者都是协议金库目的地,但它们有不同的签名者和不同的预期用途。protocol 历史上资助运营;fund 是更长期的金库。两者之间的分割本身是可调的。
具体费率在 reference/fee-comparisonray/protocol-fees 中。

4. 观察账户(TWAP 环形缓冲区)

CPMM 和 CLMM 都为每个池维护一个观察账户——一个固定大小的 (timestamp, cumulative_price) 样本环形缓冲区,其他合约可以使用它来推导抗操纵的 TWAP。
它如何工作:
  • 每个交换都调用 update_observation 程序读取当前价格,乘以自上一个观察以来经过的秒数,并将其添加到累积计数器中。新条目覆盖最旧的槽位(环形缓冲区风格)。
  • 窗口上的 TWAP = (cumul[end] − cumul[start]) / (timestamp[end] − timestamp[start])。消费者选择两个观察来括住所需的窗口并进行除法。
  • Raydium 本身不使用 TWAP 进行定价。 AMM 数学直接读取现货储备。观察是外部性——Raydium 支付写入成本,以便其他合约可以读取。
  • AMM v4 没有观察账户。 它比 ObservationState 设计更旧;想要 v4 TWAP 的集成者必须从日志历史中离线计算一个。
布局详情和索引数学在 products/cpmm/accountsproducts/clmm/accounts 中。

5. REST API + SDK + IDL

链下表面是每个产品使用的单个三元组:
  • REST APIhttps://api-v3.raydium.io。所有链上状态的读取为主的索引视图加上报价引擎。一个主机,一个模式。
  • TypeScript SDK — NPM 上的 @raydium-io/raydium-sdk-v2。为每个程序构建和签署交易。与 API 通信以获取报价/元数据,与 Solana RPC 通信以进行签前状态刷新。
  • IDL 注册表 — 每个已发布程序的 Anchor IDL 位于 raydium-idl 仓库中(每个程序一个 JSON:CPMM、CLMM、LaunchLab)。TypeScript SDK 在内部使用这些 IDL;下游 Rust / Python 客户端从相同的文件重新生成。
它们之间的边界很清晰: 一个常见的错误是直接将 REST API 输出馈送到交易中。不要——在你签署的槽位中从 Solana RPC 重新获取相关的池/头寸状态。SDK 为第一方流自动执行此操作;如果你绕过 SDK,你必须自己执行。 完整参考在 sdk-api/ 中,IDL 表面特别在 sdk-api/anchor-idl 中。

6. 索引器和价格源

REST API 由 Raydium 自己的索引器提供,该索引器订阅来自 Solana RPC 舰队的程序日志,并将非规范化记录写入 SQL 存储。对集成者的两个后果:
  • 索引器是唯一”知道”跨程序状态的东西。 将 CPMM 池映射到其 CLMM 对应物、计算跨程序版本的 24 小时交易量、获取与 LP 铸币相关的农场——所有这些都是索引器工作。程序本身不执行此操作。
  • 索引器停机是 API 停机。 如果 API 返回陈旧或空数据,索引器是嫌疑人。链上状态不受影响;拥有自己的 RPC 和 SDK 的集成者可以继续交易。
价格源是一个单独的问题。API 在大多数池响应上发布 priceUsd 字段;这是从索引器对池储备的快照和引用价格报价(USDC 池作为常见枢纽)离线计算的。它对 UI 足够好;使用它作为链上预言机是不安全的。为此使用观察 TWAP。

什么不共享

值得明确列出,因为新读者经常假设比存在的更多共享:
  • 程序不相互调用。 CPMM 交换永远不会 CPI 到 CLMM 或 AMM v4。唯一组合多个 AMM 的程序是 AMM 路由程序——而那个本身很薄,只是按顺序向每个 AMM 发出 CPI。
  • 跨程序没有共享升级权限。 每个链上程序都有自己的程序升级密钥(3/4 多签加 24 小时时间锁)。它们没有链接。
  • 农场和 AMM 之间没有共享状态。 农场不知道它质押的 LP 来自 CPMM 池、CLMM 头寸 NFT 铸币还是不相关的 SPL 代币。农场程序将质押铸币视为不透明。
  • 没有预言机依赖。 定价是链上储备。没有 Pyth/Switchboard 回退;AMM 在清算前不检查预言机。

指针

来源: