Uniswap V3:从Tick计算价格序列出现异常值的问题排查
问题原因及解决办法
你的问题核心是Tick符号搞反或提取了错误的Tick值,结合你提供的交易和池信息,具体分析如下:
1. Uniswap V3 Tick与价格的对应逻辑
Uniswap V3中,Tick的取值范围是-887272到+887272,对应价格的指数级变化。价格公式的正确逻辑是:
- 池内
token0是字典序更小的代币(你的池中sUSD地址0x57ab...<WETH地址0xc02a...,所以token0=sUSD,token1=WETH) - 价格表示为1 unit token0 兑换多少 token1(即
sUSD → WETH的汇率),对应公式:
如果你要计算1 WETH 兑换多少 sUSD(即反向汇率),需要取倒数:price_token1_per_token0 = 1.0001 ** tick * 10 ** (decimals0 - decimals1)price_sUSD_per_WETH = 1 / (1.0001 ** tick * 10 ** (decimals0 - decimals1))
2. 异常值的直接原因
你得到的3.4e38是典型的使用了正数Tick且数值过大导致的结果:
- 正常情况下,WETH对sUSD的汇率约3406 sUSD/WETH,对应
sUSD→WETH的汇率是1/3406≈0.0002936 - 代入公式反推正确Tick:
tick = log(0.0002936) / log(1.0001) ≈ -82200(负数) - 如果你错误地使用了正数Tick(比如
+82200),计算结果会是1.0001^82200≈3400,但如果是误取了远超正常范围的大正数Tick(比如+880000),就会得到3.4e38这种天文数字。
3. 可能的错误场景
- Tick提取错误:你可能误提取了流动性区间的
tickUpper(区间上限Tick,通常为大正数),而非交易后池的当前tick(Swap事件中的tick字段) - Tick符号搞反:将负Tick当成正Tick代入计算,直接导致价格指数级放大
- 公式方向错误:混淆了
token0/token1与token1/token0的价格方向,没有取倒数
验证建议
- 查看该交易的Swap事件日志,确认
tick字段的实际值(应为负数,约-82200左右) - 用正确的Tick代入公式计算
sUSD→WETH的汇率,再取倒数得到WETH对sUSD的价格,对比你的直接计算结果
内容的提问来源于stack exchange,提问作者Voerch
相关产品推荐
相关产品推荐

