本页内容由 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——由程序调用——可以转移出去。没有管理员覆盖。
products/cpmm/accounts、products/clmm/accounts、products/amm-v4/accounts、products/farm-staking/accounts、products/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。
AmmConfig——其费用参数是每个池的,在创建时硬编码。Farm 和 LaunchLab 有自己的等价物(FarmConfig、LaunchConfig),在各自的章节中介绍。
谁可以更改什么的完整表格在 security/admin-and-multisig 中。当前用户面向的费用分割在 ray/protocol-fees 中。
3. 协议/基金/创建者费用分割
每个 CPMM 和 CLMM 交换费都在输出时分割到最多四个目的地:- 交易费累积到池中。 费用从交换的输入端移除,扣费后的金额是常数乘积数学看到的。这就是”LP 赚取费用”的含义——
k上升,隐含的每 LP 代币价值也上升。 - 协议/基金/创建者部分从该 LP 端累积中扣除到每个池的计数器账户中。 它们位于池状态(
protocol_fees_token{0,1}、fund_fees_token{0,1}等)上,直到有人调用相应的收集指令。它们在那之前不会离开池的金库;从交换的角度来看,它们仍然”在池中”。 - 收集将它们移出。 协议和基金路径需要来自
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-comparison 和 ray/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/accounts 和 products/clmm/accounts 中。
5. REST API + SDK + IDL
链下表面是每个产品使用的单个三元组:- REST API —
https://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 的集成者可以继续交易。
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 在清算前不检查预言机。
指针
protocol-overview/architecture— 显示这些部分如何组合的规范图。protocol-overview/versions-and-migration— 约定如何在程序版本中演变。security/admin-and-multisig— 谁控制 AmmConfigs 后面的密钥。reference/fee-comparison— 每个产品的费率矩阵。reference/program-addresses— 规范程序 ID。
- Raydium SDK v2 — PDA 种子、账户布局和 IDL 定义的真实来源。
- Raydium IDL 注册表 — Anchor IDL。
- 上面内联引用的各产品账户页面。

