5 uniswap-v3如何通过输入一定数量的tokenA获取对应输出数量的tokenB?

在uniswap-v2中可以通过直接调用合约getAmountsOut得到,或者是通过知道池子的A和B的token数,x*y=k的公式求出。 但是在uniswap-v3中,我尝试通过oracle的getQuoteAtTick获取的数量,并不正确,没有随着我的Atoken数量的增加产生滑点,而是一个固定的输出tokenB,而通过计算的方式的话,就需要逐个计算每个 tick 区间内流动性得出Btoken累加,有什么简便的办法吗

现在假设价格处于一个持续上涨的趋势,当价格开始从左至右穿过这些价格区间时,会不断用一种资产换取另一种资产,而被换出的资产储备是不断减小的,一旦当前价格区间的某种资产被耗尽,价格会穿过当前区间,进入下一个区间,由此产生了价格的变化(因为价格右移了,变大了)。在价格移动消耗池内资产数量的过程中,输入的资产数量也会不断减少,一旦在某个区间输入资产被耗尽,那么价格就会停留在该区间内。 当然只是让价格停留在区间内,是不精确的,这个时候我们就需要借助计算添加流动性推导出来的公式,去反推计算出一个精确的价格(在该价格区间内)。 为了实现上述计算,就必须清楚每一个 tick 上的流动性分布,然后像真实交易的过程那样,逐个计算每个 tick 区间内流动性是否被耗尽,最后得出交易的价格,才能确认这一笔交易的滑点水平。(UI 界面中并没有这么干,而是很 tricky 的使用了ethers.staticCall去模拟调用合约的交易功能,最后在 revert 信息中读取预估数据,这一点感兴趣的同学可以去阅读 interface 的解析部分,这里不展开讨论)。

通过查阅相关文章,这是可以通过staticCall模拟交易得到Btoken的数据是吗? 但我使用web3.py则会报以下错误,没有staticCall AttributeError: 'exactInputSingle' object has no attribute 'staticCall' 而直接call的话则报 web3.exceptions.ContractLogicError: execution reverted: STF 我并没有从报错中获取我想要的Btoken数量的信息

请问我该如何准确获取Btoken的数量呢

请先 登录 后评论

4 个回答

Tiny熊
  擅长:智能合约,以太坊
请先 登录 后评论
Phi·Wallet - 区块链爱好者和从业者
请先 登录 后评论
Phi·Wallet - 区块链爱好者和从业者
请先 登录 后评论
路远 - 开发
请先 登录 后评论
  • 3 关注
  • 1 收藏,3320 浏览
  • v2K 提出于 2022-12-04 04:38