0%

uniswapv3 | 获取池子的价格

获取代币价格。

获取 pool 地址

ARB 链为例。

主要是调用 getPool 方法。

第一、二参数是交易对合约地址,第三个参数是 fee 的值。

注意点

  • 参数一、二不分先后顺序
  • fee 的百分比乘以 1000000,比如,fee1%,那这里的值就是 10000

比如 lua/usdt 的参数分别是(交易对是什么,可以看 uniswap v3 界面的兑换路径)

  • 0xc3aBC47863524ced8DAf3ef98d74dd881E131C38
  • 0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9
  • 10000

得到的 pool 值是

  • 0x70A7AAabCE0c4c07BeD4937f013B835B931F014B

获取价格

进入 pool 的地址,这里还是以 lua/usdt 为例。

主要是 slot0 这个方法。

获取价格有两个途径

  • sqrtPriceX96
  • tick

这里用的是 sqrtPriceX96

v2v3 计算价格的方式差不多都是

$$ price = \frac {reverse1}{reverse0} $$

v2 中可以直接获取 reverse1reverse0,但是,V3 不行。但是,V3sqrtPriceX96 的公式是这样的

$$ sqrtPriceX96 = \sqrt{ \frac {reverse1}{reverse0}} * 2^{96} $$

所以,加上精度等,V3 的价格是

$$ price = ({sqrtPriceX96 \over 2^{96}})^2 * \frac {reverse0decimal}{reverse1decimal} $$

但是,上面的价格没有考虑到 fee,所以,最后的价格应该是

$$ price = price * (1 - fee) $$

但是,不知道为什么,这个价格和 uniswap V3 对不上。后续我会继续追踪。

请我喝杯咖啡吧~