Skip to main content
这些是链上数学的无状态移植,使用 Alephium 的取整方式(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 对每一行调用一次。