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 自动翻译,所有内容以英文版本为准。查看英文版 →
一句话总结
CLMM — Concentrated Liquidity Market Maker — 是 Raydium 的 Uniswap v3 风格 AMM。与其他 AMM 不同的是,CLMM 不是将流动性提供者的资金分散到整条价格曲线,而是让 LP 存入 特定价格范围。在该范围内,每一块钱的存款效率比 CPMM 池高许多倍;超出范围外,存款不产生收益,作为单边余额存放。协议按 tick(离散化的价格区间)跟踪流动性,用编码为 Q64.64 定点数的价格平方根(sqrt_price_x64)表示池状态,并为每个 LP 头寸铸造 NFT 而不是可互换的 LP 代币。
新增功能
最新的 CLMM 发布版本在 Uniswap v3 风格的核心基础上增加了三项功能。这些功能在池创建时可选,与现有的池和头寸向后兼容:- 限价单。LP 现在可以在特定价格的单个 tick 处挂单,当交换穿过该 tick 时,交换路径会按 FIFO 顺序成交。订单以限价结算到所有者的 ATA;链下守护者(
limit_order_admin)可以清扫已成交的订单,无需所有者在线。详见指令 → OpenLimitOrder / SettleLimitOrder 和数学 → 交换中的限价单匹配。 - 单边费用(
CollectFeeOn)。池可以配置为从输入端口收取交换费(传统行为,模式0),或始终从token_0(1),或始终从token_1(2)。当交易对的一侧是规范记账代币时很有用(如 USDC)。详见费用 → 单边费用。 - 动态费用。池可以选择加入波动率追踪费用附加费,随着快速 tick 移动而上升,随时间衰减。由每层级
DynamicFeeConfig和每池DynamicFeeInfo校准。详见费用 → 动态费用 和数学 → 动态费用推导。
CreateCustomizablePool 在池创建时暴露所有三个旋钮。经典的 CreatePool 继续适用于不含限价单或动态费用的默认费用池。
CLMM 的优势
- 资本效率。稳定币对 LP 将流动性集中在价平线周围 ±0.1% 范围内,可以比相同交易对的 CPMM 池每单位 TVL 赚取 100 倍以上的费用。
- 头寸级费用核算。费用按头寸计算,而非按 LP 铸币。同一池内的两个头寸根据其范围和价格走势赚取不同的费用。
- 每个交易对多个费用等级。一个交易对可以有多个 CLMM 池,每个绑定到不同的
AmmConfig,各有自己的交易费率和 tick 间距。Web UI 和路由器会显示当前价格下流动性最充足的等级。 - 直接在池上激励。最多三个奖励代币流可以附加到池;头寸根据其贡献的秒数 × 范围内流动性按比例收集奖励。详见
products/clmm/fees。 - NFT 头寸。每个头寸是一个非同质化代币,铸币等于确定性 PDA。转移 NFT 即转移头寸;钱包和 UI 可以像显示收藏品一样显示头寸。
- Token-2022 支持在交易对的两侧,具有与 CPMM 相同的扩展限制。
CLMM 不是什么
- 不是设定后就忘记的池。当 SOL 为 $160 时设置的范围,如果 SOL 跌至 $80 而你不主动调整,将不再产生收益。CLMM 奖励活跃的 LP;消极的 LP 应该留在 CPMM。
- 不是零成本开启。头寸跨越的每个新 tick 数组必须初始化,需要支付租金。范围越宽越便宜;范围越窄越昂贵。
- 不是 CLOB。与 AMM v4 不同,CLMM 不依赖 OpenBook。所有流动性都在 tick 映射上。
- 不是 CPMM 的超集。跨越
[tick_min, tick_max]的最大范围 CLMM 头寸行为 类似于 CPMM,但有不同的燃气成本、不同的费用核算模型,且没有可互换的 LP 代币。如果想要简单的可互换 LP 池,请使用 CPMM。
CLMM、CPMM 和 AMM v4 的对比
| 维度 | AMM v4 | CPMM | CLMM |
|---|---|---|---|
| 曲线 | 恒定产品 | 恒定产品 | 集中(基于 tick) |
| LP 份额 | 可互换 LP 铸币 | 可互换 LP 铸币 | 每头寸 NFT |
| 流动性位置 | 跨越所有价格 | 跨越所有价格 | 在用户选择的范围内 |
| 费用等级 | 固定 0.25% | 每 AmmConfig(如 0.25%、1%) | 每 AmmConfig × tick 间距 |
| 主动管理 | 不适用 | 不适用 | 必需 |
| 费用核算 | 池级 | 池级 | 每头寸 |
| 奖励农场 | 独立 Farm 程序 | 独立 Farm 程序 | 内置(最多 3 个奖励) |
| Token-2022 | 否 | 是 | 是 |
| 链上预言机 | 否 | observation 环 | 每池 observation 数组 |
心智模型
可以将 CLMM 池视为三个重叠的数据结构:sqrt_price空间中的连续曲线。池的价格表示为sqrt_price_x64,一个 Q64.64 定点数。交换沿着这条曲线行走;在 tick 边界内,数学运算是标准的集中流动性 AMM 数学(详见algorithms/clmm-math)。- 离散 tick 映射。价格量化为 tick —
1.0001的整数次幂。每个 tick 有已知的sqrt_price。头寸将其端点引用为整数 tick 索引。Tick 索引被分组为固定大小的 tick 数组以用于存储。 - 每头寸费用和奖励簿记。每个头寸存储上次更新时的全局
fee_growth_inside。当 LP 接触头寸(开启、关闭、调整、收集)时,程序从当前全局值减去存储值以计算应得收益。这就是 Uniswap v3 的feeGrowthInside0X128 / feeGrowthInside1X128模式。
- 开启头寸:选择 tick 范围、存入代币、铸造 NFT、将流动性插入范围内的 tick 映射、初始化任何之前空的 tick 数组。
- 增加/减少流动性:调整存储在 NFT 相关头寸账户和 tick 映射中的数量;同时收集累计费用。
- 交换:从当前
sqrt_price_x64沿交易方向行走,消费活跃流动性直到输入耗尽或到达下一个初始化的 tick;穿过 tick 并在新一侧拾取或放下流动性。 - 收集费用/奖励:计算每一侧和每个奖励流的
fee_growth_inside_now − fee_growth_inside_last×position_liquidity;转出。
liquidity 数量缩放。
何时选择 CLMM
当以下情况时选择 CLMM:- 你在为 稳定或均值回复交易对(USDC/USDT、jitoSOL/SOL、wBTC/BTC)提供流动性,并想在价平线附近集中。
- 你是 做市商,愿意监控价格并重新平衡。
- 你特别需要 每池激励排放,而不想单独建立农场。
- 你需要 每头寸核算用于自己的 LP 产品(金库、结构化产品等)。
- 你正在推出价格发现未知的新代币。
- 你想要单个可互换的 LP 代币,可以质押、锁定或组合。
- 你想要消极的 LP 体验。
- 你特别需要 AMM v4 在 OpenBook 上放置的混合 CLOB 深度。
- 你在迁移现有的 AMM v4 集成,而不是开启新头寸。
头寸是 NFT
CLMM 头寸在链上由两个账户表示:- 头寸 NFT 铸币,供应量为 1。
- 个人头寸状态账户,以 NFT 铸币为关键,持有头寸的 tick、流动性和上次观察的费用增长值。
products/clmm/ticks-and-positions。
较早的 CLMM 发布版本还为每个
(pool, tick_lower, tick_upper) 创建了 ProtocolPositionState 账户以聚合该范围的流动性。较新的发布版本不再创建或使用它 — 该字段仍作为 UncheckedAccount 出现在 OpenPosition / IncreaseLiquidity / DecreaseLiquidity 账户列表中以保持 ABI 兼容性,但程序不读或写它。聚合范围簿记直接存在于 tick 端点(liquidity_gross、liquidity_net)。接下来看什么
- 账户 — 池、配置、tick 数组和头寸账户布局。
- Tick 和头寸 — tick 映射、tick 间距、tick 数组大小、基于 NFT 的头寸。
- 数学 —
sqrt_price_x64、交换步进、fee_growth_inside推导。 - 指令 —
OpenPosition、IncreaseLiquidity、Swap、CollectRewards、限价单家族和CreateCustomizablePool。 - 费用和奖励 — 每头寸费用模型、单边费用模式、动态费用和三个奖励槽。
- 代码演示 — 用 TypeScript 演示开启/调整/交换/收集/限价单/可定制化池。
- Raydium CLMM 源代码 —
raydium-io/raydium-clmm - Uniswap v3 白皮书(“Uniswap v3 Core”)用于 CLMM 直接继承的数学
reference/program-addresses获取规范程序 ID


