输入/搜索内容
内置函数
结构体
内置变量与常量
通用约定
交易所
能力矩阵
中心化交易所
去中心化交易所
预测市场
证券与期货
链上与自定义接入

集中流动性(Uniswap V3)相关的计算:tick、价格、sqrtPriceX96之间的换算,以及流动性与代币数量之间的换算。适用于Uniswap v3/v4、PancakeSwap v3、Aerodrome Slipstream、SushiSwap v3等使用相同公式的协议。

exchange.IO(k, fn, ...args)

示例

读取Uniswap V3池子价格,并计算在当前价格附近提供流动性所需的数量。

javascript
function main() { var C = exchange.IO("contracts") var T = C.tokens, U = C.uniswapV3 exchange.IO("abi", U.factory, "uniswapV3Factory") var pool = exchange.IO("api", U.factory, "getPool", T.USDC.address, T.WETH.address, 500) exchange.IO("abi", pool, "uniswapV3Pool") var s = exchange.IO("api", pool, "slot0") // 该池 token0 为 USDC(6 位精度),token1 为 WETH(18 位精度):价格表示 1 USDC 值多少 WETH var p = exchange.IO("uniswapV3", "sqrtPriceToPrice", s.sqrtPriceX96, 6, 18) Log("tick:", s.tick, "ETH 价格:", (1 / p).toFixed(2), "USDC") // 以当前价格为中心 ±5% 设置区间,tick 向下对齐到 tickSpacing(0.05% 费率池为 10) var lower = exchange.IO("uniswapV3", "priceToTick", p * 0.95, 6, 18, 10) var upper = exchange.IO("uniswapV3", "priceToTick", p * 1.05, 6, 18, 10) + 10 // 最多投入 1000 USDC 和 0.4 WETH 时能提供的流动性,以及实际用掉的数量 var liq = exchange.IO("uniswapV3", "liquidityForAmounts", s.sqrtPriceX96, lower, upper, exchange.IO("toUnits", "1000", 6), exchange.IO("toUnits", "0.4", 18)) var used = exchange.IO("uniswapV3", "amountsForLiquidity", s.sqrtPriceX96, lower, upper, liq) Log("区间 tick:", lower, "~", upper, "流动性:", liq) Log("实际投入:", exchange.IO("fromUnits", used.amount0, 6), "USDC +", exchange.IO("fromUnits", used.amount1, 18), "WETH") }

返回值

类型描述

number / string / object

价格类函数返回数字(浮点数,用于显示和价位估算);tick类函数返回整数;sqrtPriceX96和流动性、数量类函数返回十进制字符串(精确值)。

参数

名称类型必填描述

k

string

是

固定为uniswapV3,用于集中流动性计算。

fn

string

是

要调用的计算函数名,例如tickToPrice、priceToTick;全部函数及其参数见备注。

args

string / number

是

计算函数的参数。精度参数decimals0、decimals1可以是数字,也可以是代币地址(自动读取decimals())。大整数参数可以使用字符串。

参考

备注

tick与sqrtPriceX96的换算、流动性与数量的换算是合约TickMath、LiquidityAmounts算法的逐位移植,结果与链上合约完全一致;价格换算使用浮点数,存在浮点精度误差。

池子中token0、token1按地址大小排序,价格的方向是1个token0值多少token1,计算前需要确认池子的token0。

fn支持的计算函数(函数名后为它的参数):

  • tickToPrice(tick, decimals0, decimals1):tick对应的价格(1个token0值多少token1)。
  • priceToTick(price, decimals0, decimals1[, tickSpacing]):不高于该价格的最大tick,传tickSpacing时向下对齐到其整数倍。
  • sqrtPriceToPrice(sqrtPriceX96, decimals0, decimals1):池子slot0中的sqrtPriceX96换算为价格。
  • tickToSqrtPrice(tick):tick对应的sqrtPriceX96(与合约TickMath.getSqrtRatioAtTick结果一致)。
  • sqrtPriceToTick(sqrtPriceX96):sqrtPriceX96所在的tick(与合约TickMath.getTickAtSqrtRatio一致)。
  • nearestUsableTick(tick, tickSpacing):四舍五入到tickSpacing的整数倍。
  • amountsForLiquidity(sqrtPriceX96, tickLower, tickUpper, liquidity):区间内流动性在当前价格下对应的代币数量{amount0, amount1}(与合约取出流动性的计算一致)。
  • liquidityForAmounts(sqrtPriceX96, tickLower, tickUpper, amount0, amount1):最多投入给定数量时能提供的流动性。。