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, ...)。