MathUtil.alphDiv),因此结果与合约精确到最小单位一致。
ClmmLiquidityUtils
约定:sqrtRatioX96 是当前价格。sqrtRatioAX96 和 sqrtRatioBX96 是区间边界(getSqrtRatioAtTick(tickLower/Upper))。数量按排序后的 token0/token1 顺序。
getLiquidityFromAmounts(sqrtRatioX96, sqrtRatioAX96, sqrtRatioBX96, amount0, amount1)
给定数量所能铸造的最大流动性:
- 价格等于或低于区间下界 → 只计算
amount0 - 价格在区间内 →
min(amount0 对应的 L, amount1 对应的 L) - 价格高于区间 → 只计算
amount1
getAmountsForLiquidity(sqrtRatioX96, sqrtRatioAX96, sqrtRatioBX96, liquidity)
有符号流动性变化量对应的 [amount0, amount1]。合约约定:传入 -liquidity 得到添加流动性所需的数量(取负),传入 +liquidity 得到移除时收到的数量。
getAmountsAndLiquidityAtSqrtPrice(sqrtRatioX96, sqrtRatioAX96, sqrtRatioBX96, amount0, amount1)
返回 [amount0Used, amount1Used, liquidity]:针对期望的 amount0 和 amount1,实际存入的平衡数量。这是展示”你将存入”预览时通常使用的函数。
getAmountsAndLiquidityAtPrice(price, token0, token1, lowerTick, upperTick, amount0, amount1)
与上面相同,但接收人类可读价格和 TokenInfo。
getPositionAmountsFromPrice(props)
面向界面的版本,以基础/报价的方式工作,tick 顺序任意:
0n 时返回零。要按一侧确定头寸大小,请给另一侧传入 UNLIMITED_AMOUNT(2^128 − 1)。
底层函数
PoolUtils
getPositionId(poolAddress, owner, tickLower, tickUpper)
根据池地址推导头寸合约 ID。与 clmm.getPositionId 不同,它会自动规范化无分组的 owner 地址。
offlineSwap
clmm.simulateSwap 返回的流动性曲线上本地重放一次兑换,并以有符号值返回另一侧的数量:
- 精确输入(
amountSpecified > 0):输出以负数返回(你收到的是-offlineSwap(...)) - 精确输出(
amountSpecified < 0):返回所需的输入(取绝对值)
simulateSwap 返回值完全一致。
computeSwapStep(sqrtPriceX96, sqrtPriceTargetX96, liquidity, amount, feePips)
在一个流动性区间内的单步兑换。返回 [sqrtPriceNextX96, amountIn, amountOut, feeAmount]。offlineSwap 对每一行调用一次。