我想获取uniswapV3对中代币的价格。例如,我有一对https://etherscan.io/address/0x409634ea16d98b0b245f345079c8f3cfe3ef1fa6。 调用slot0()的结果是[12934124507235850032763499380293, 101910, 0, 1, 1, 0, True],其中12934124507235850032763499380293是sqrtPriceX96。我使用这个公式:价格 = (sqrtPriceX96 ** 2) / (2 ** 192)。结果是 26666 ETH,而实际价格是 0.09$。 Token有18位小数,WETH也是如此。问题出在哪里?
正确的价格计算公式
我明白了。如果pair中的token0是基础token,本例中为WETH,则需要进行反向操作。 1/价格。这里我得到 26666 -> 1 / 26666 * 2400 (ETH 价格) = 0.09$.
数据中的价格是正确的。这里有一个解释:
.slot0() 返回以下类型
type Slot0RawType = [bigint, number, number, number, number, number, boolean];
可以进一步转换为
type Slot0ReturnType = {
sqrtPriceX96: BigInt; // Returns a bigint representation of the sqrt price
tick: number; // Returns the current tick (usually a number)
observationIndex: number; // Returns the last observation index
observationCardinality: number; // Returns the max observations that can be stored
observationCardinalityNext: number; // Returns the next cardinality
feeProtocol: number; // Returns the protocol fee
unlocked: boolean; // If the pool is unlocked
};
安装
@evmexplorer/uniswap
以导入类型。该包还包含 convertSlot0()
将数组转换为对象。