如何用Web3.py在PancakeSwap获取代币准确值?getAmountsOut返回错误
问题原因分析
问题出在calcSell函数内的单位重复转换错误,具体逻辑如下:
- 你已经通过
setDecimals(tokenToSell, tokenDecimals)将待查询的代币数量(你传入的是1个CAKE)转换成了对应代币的最小单位数值,以CAKE为例它的小数位是18,这一步执行完后tokenToSell的值已经是1000000000000000000(即1e18),这个值本身就符合PancakeSwap路由合约getAmountsOut接口对输入金额的要求(接口要求传入对应代币的最小单位数量)。 - 后续你又执行了
amountIn = web3.toWei(tokenToSell, 'ether'),这一步会把已经是最小单位的数值再次乘以1e18,最终传入合约的amountIn变成了1e36,相当于你查询的是1e18个CAKE兑换BNB的价格,最终得到的结果自然比实际1个CAKE的价格大了1e18倍,和你遇到的输出异常完全吻合。
修复方案
删掉calcSell函数中amountIn = web3.toWei(tokenToSell, 'ether')这一行,直接把setDecimals处理后的tokenToSell赋值给amountIn即可,修改后的对应代码段如下:
router = web3.eth.contract(address=Web3.toChecksumAddress(pancakeSwapContract), abi=pancakeSwapAbi) # 直接用处理好的最小单位数值作为输入,不要重复转wei amountIn = tokenToSell amountOut = router.functions.getAmountsOut(amountIn, [tokenAddress, BNBTokenAddress]).call() amountOut = web3.fromWei(amountOut[1], 'ether')
内容的提问来源于stack exchange,提问作者SeriousTia
相关产品推荐
相关产品推荐

