内置函数
结构体
内置变量与常量
通用约定
交易所
能力矩阵
中心化交易所
去中心化交易所
预测市场
证券与期货
链上与自定义接入
通用协议
Web3
exchange.IO("abi", ...)
exchange.IO("api", blockChain, ...)
exchange.IO("encode", ...)
exchange.IO("encodePacked", ...)
exchange.IO("decode", ...)
exchange.IO("hash", ...)
exchange.IO("key", ...)
exchange.IO("sign", ...)
exchange.IO("signTypedData", ...)
exchange.IO("signMessage", ...)
exchange.IO("api", ...)
exchange.IO("call", ...)
exchange.IO("multicall", ...)
exchange.IO("logs", ...)
exchange.IO("waitReceipt", ...)
exchange.IO("nonce", ...)
exchange.IO("speedUp", ...)
exchange.IO("cancelTx", ...)
exchange.IO("toUnits", ...)
exchange.IO("fromUnits", ...)
exchange.IO("uniswapV3", ...)
exchange.IO("contracts", ...)
exchange.IO("address")
exchange.IO("base", ...)
exchange.IO("sendBase", ...)
exchange.IO("uniswapV3", ...)
集中流动性(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 | 是 | 固定为 |
fn | string | 是 | 要调用的计算函数名,例如 |
args | string / number | 是 | 计算函数的参数。精度参数 |
参考
备注
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):最多投入给定数量时能提供的流动性。。