Uniswap V3:如何通过指定Tick计算正确的代币价格?
如何通过Uniswap V3的Tick计算正确的ETH兑USDC价格
你遇到的问题核心是没有考虑Token的小数位数以及Tick对应的价格方向,Uniswap V3的Tick公式计算的是原生单位的价格,而非我们日常看到的法币计价单位,以下是具体的解决步骤:
1. 明确池中的Token0、Token1及小数位数
Uniswap V3的池子会按Token地址的字典序排序,地址更小的为Token0,另一个为Token1。以你使用的USDC/WETH池为例:
- Token0是USDC(小数位数:6,即1 USDC = 10^6 原生单位)
- Token1是WETH(小数位数:18,即1 ETH = 10^18 原生单位)
2. 理解Tick对应的原生单位价格
Uniswap V3的价格公式 p(i) = 1.0001^i 计算的是1原生单位Token0 可兑换的原生单位Token1数量(即 Token1原生 / Token0原生)。
你查询到的Tick值为205930,代入公式得到:
1.0001^205930 ≈ 876958666.47
这个值的意思是:1个原生USDC(0.000001 USDC)可以兑换约876958666.47个原生WETH(0.000000000000000001 ETH)。
3. 换算为实际的ETH/USDC价格
我们需要把原生单位转换为日常使用的单位,计算1 ETH 等于多少 USDC:
- 先计算1原生WETH对应的原生USDC数量:
1 / 876958666.47 ≈ 1.1403e-9原生USDC/原生WETH - 换算为1 ETH(10^18 原生WETH)对应的USDC数量:
10^18 * 1.1403e-9 / 10^6 = 1140.3 USDC/ETH
这个结果和你提到的实际价格(1200.49 USDC/ETH)接近,差异是因为Tick是实时变化的,你查询时的Tick对应的就是这个价格。
4. 通用换算公式
如果要计算任意Token对的实际价格,可套用以下逻辑:
- 若要得到 1单位Token1 兑换多少 Token0(比如ETH/USDC):
实际价格 = (10^decimals_token0) / (1.0001^tick * 10^decimals_token1) - 若要得到 1单位Token0 兑换多少 Token1(比如USDC/ETH):
实际价格 = (1.0001^tick * 10^decimals_token1) / (10^decimals_token0)
关于Uniswap文档示例的说明
文档中的示例使用了简化的Tick值(100000),仅用于演示计算逻辑,并非真实市场的Tick数据,所以得到的22015.5 USDC/WETH是简化计算的结果,无需对应实际价格。
内容的提问来源于stack exchange,提问作者Ritzy Dev
相关产品推荐
相关产品推荐

