Skip to main content
1

加载池和费率档位

2

选择区间

把人类可读价格(每个 token0 值多少 token1)转换为按档位间距对齐的 tick:
如需全区间头寸,请使用 TickUtils.getMinPriceFromTick 和 getMaxPriceFromTick,它们返回按间距对齐的极值 tick。
3

确定存入数量

给定一种代币的数量,按当前价格计算另一种代币的匹配数量:
如果当前价格在区间之外,头寸是单边的:只需要 token0(价格等于或低于 tickLower)或只需要 token1(价格高于区间)。
4

添加流动性

保存返回的 positionId:后续读取、领取和撤出头寸都要用到它。之后要向同一区间追加流动性时,传入 existingPosition: true,SDK 会附加头寸代币。
5

监控手续费和价值

tokensOwed 保存已经记入头寸的手续费(token0、token1、奖励代币)。池的 positionInfo 视图方法(powfi.clmm.positionInfo)也会返回当前的代币数量和手续费,见 CLMM 参考。要计算头寸价值,请把 -liquidity、当前 sqrtPriceX96 和区间边界传给 ClmmLiquidityUtils.getAmountsForLiquidity。
6

收取手续费

7

提取

removeLiquidity 会在同一笔交易中完成收取:提取出的代币以及累计的手续费和奖励都会发送到你的地址,无需再单独调用 collectTokens。

创建新池

任何人都可以创建 CLMM 池,合约层面对创建者和代币都没有白名单。创建之前请注意:
  • **只能使用已有的费率档位。**池必须建在 Powfi 团队已经设置好的费率档位(configIndex)下,不能自定义手续费率或 tick 间距。用 getAllPoolConfigs() 查看可用的档位。
  • **每个代币对在每个档位上只能有一个池。**池地址由代币对和档位推导得出,如果该池已存在,创建会失败。
  • **初始价格由创建者设定。**你传入的 tick 就是池的初始价格,第一个头寸也按这个价格铸造。如果它与市场价格相差很大,套利者会立即与你的头寸交易。
  • **两个代币都应在代币列表中。**合约接受任何代币,但如果代币不在代币列表中,SDK 的 getPoolState 等方法会报错。
如果 poolExists(token0, token1, configIndex) 为 false,可以一次调用完成建池并注入第一个头寸:
如果要自己计算头寸 ID(例如在添加前检查钱包是否已持有某个区间),不要把无分组地址原样传给 getPositionId,否则算出的 ID 是错的。请先用 normalizeAddress(address, powfi.clmm.getClmmConfig().groupIndex) 规范化,或者使用会自动规范化的 PoolUtils.getPositionId(poolAddress, owner, ...)。