获取代币价格。
获取 pool 地址
以 ARB
链为例。
主要是调用 getPool
方法。
第一、二参数是交易对合约地址,第三个参数是 fee
的值。
注意点
- 参数一、二不分先后顺序
fee
的百分比乘以1000000
,比如,fee
是1%
,那这里的值就是10000
比如 lua/usdt
的参数分别是(交易对是什么,可以看 uniswap v3
界面的兑换路径)
0xc3aBC47863524ced8DAf3ef98d74dd881E131C38
0xFd086bC7CD5C481DCC9C85ebE478A1C0b69FCbb9
10000
得到的 pool
值是
0x70A7AAabCE0c4c07BeD4937f013B835B931F014B
获取价格
进入 pool
的地址,这里还是以 lua/usdt
为例。
主要是 slot0
这个方法。
获取价格有两个途径
sqrtPriceX96
tick
这里用的是 sqrtPriceX96
。
v2
和 v3
计算价格的方式差不多都是
$$ price = \frac {reverse1}{reverse0} $$
在 v2
中可以直接获取 reverse1
和 reverse0
,但是,V3
不行。但是,V3
的 sqrtPriceX96
的公式是这样的
$$ sqrtPriceX96 = \sqrt{ \frac {reverse1}{reverse0}} * 2^{96} $$
所以,加上精度等,V3
的价格是
$$ price = ({sqrtPriceX96 \over 2^{96}})^2 * \frac {reverse0decimal}{reverse1decimal} $$
但是,上面的价格没有考虑到 fee
,所以,最后的价格应该是
$$ price = price * (1 - fee) $$
但是,不知道为什么,这个价格和 uniswap V3
对不上。后续我会继续追踪。