本页内容由 AI 自动翻译,所有内容以英文版本为准。查看英文版 →
一句话总结
CLMM — Concentrated Liquidity Market Maker(集中流动性做市商)— 是 Raydium 的 Uniswap v3 风格 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 继续用于没有限价单或动态费用的默认费用池。
后续版本添加了许可多池:CreatePermissionedPool 允许白名单操作员(持有 Permission PDA 的操作员)通过将 seed_index 折叠到池地址中,为同一交易对和费用层级创建多个池,并强化 OpenLimitOrder 以拒绝其输入或输出代币账户被冻结的订单。参见指令 → CreatePermissionedPool和2026-07-30 更新日志条目。
2026-08 版本为选定的 KYC 受限发行人池添加了条件头寸冻结路径。每个新头寸 NFT 铸造都使用池作为冻结权限,但 NFT 代币账户默认保持解冻和可转移。CLMM 仅在通过 OpenPositionV2 或 OpenPositionWithToken22Nft 打开头寸且任一池铸造的冻结权限与程序的受限发行人列表匹配时才冻结它。所有者仍可以管理流动性和关闭匹配的头寸,但无法转移其 NFT 或更改代币账户所有者。现有头寸不会被追溯冻结。参见Ticks 和头寸 → 受限发行人头寸和2026-08-17 更新日志条目。
CLMM 的优势
- 资本效率。 稳定币对 LP 在平价附近 ±0.1% 范围内集中流动性,相比相同交易对的 CPMM 池,每美元 TVL 的费用收益可高出 100 倍以上。
- 头寸级费用计算。 费用按头寸累积,而非按 LP 铸造。同一池上的两个头寸根据其范围和价格走过的路径赚取不同的费用。
- 每个交易对多个费用层级。 一个交易对可以有多个 CLMM 池,每个池绑定到不同的
AmmConfig,各自有自己的交易费率和 tick 间距。Web UI 和路由器会显示当前价格处流动性最多的层级。 - 直接在池上激励。 最多三个奖励代币流可以附加到池;头寸根据它们贡献的秒数 × 范围内流动性按比例收集奖励。参见
products/clmm/fees。 - NFT 头寸。 每个头寸都是非同质化代币。转移 NFT 通常会转移头寸;钱包和 UI 可以像显示收藏品一样显示头寸。只有基础铸造与受限发行人过滤器匹配的 V2 头寸会被冻结且不可转移。
- 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,但有不同的 gas 成本、不同的费用计算模型,以及没有可互换的 LP 代币。如果你想要一个简单的可互换 LP 池,使用 CPMM。
CLMM 与 CPMM 和 AMM v4 的区别
心智模型
将 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 数组和头寸账户布局。
- Ticks 和头寸 — 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

