UniswapV3中slot0()返回sqrtPriceX96计算价格错误问题排查
UniswapV3 价格计算错误分析与正确公式
问题根源
你犯了两个关键错误:
- 价格方向完全搞反:UniswapV3的
sqrtPriceX96代表的是sqrt(token1 / token0),直接用(sqrtPriceX96²)/(2^192)算出的是1个token0兑换多少token1的比例。但你的场景里,token1是WETH,token0是目标代币,你需要的是1个目标代币兑换多少WETH,也就是这个比例的倒数。 - 缺少法币转换环节:你算出的是代币与WETH的兑换比例,要得到美元价格,必须乘以WETH的实时美元价格。
正确计算步骤
1. 确认Token顺序
先明确池中的token0和token1:你的示例池中,token0是目标代币,token1是WETH。
2. 计算代币与WETH的兑换比例
如果目标代币是token0,正确的1个目标代币兑换的WETH数量公式为:
# 计算 1 token0 = ? WETH(token1) price_token0_in_weth = (2 ** 192) / (sqrtPriceX96 ** 2)
如果目标代币是token1,则用你最初的公式:
price_token1_in_token0 = (sqrtPriceX96 ** 2) / (2 ** 192)
3. 转换为美元价格
由于两个代币都是18位小数,上述计算结果直接是真实数量比例,再乘以WETH的实时美元价格即可得到代币的美元价格:
# 假设WETH当前价格为2400美元 token_usd_price = price_token0_in_weth * weth_usd_price
验证你的示例
代入你的sqrtPriceX96=12934124507235850032763499380293:
- 计算
(2^192)/(sqrtPriceX96²),得到约3.75e-5WETH/代币; - 乘以WETH的美元价格(如2400美元):
3.75e-5 * 2400 = 0.09美元,与实际价格完全匹配。
内容的提问来源于stack exchange,提问作者Владислав Сизов
相关产品推荐
相关产品推荐

