我正在尝试使用Uniswap Router-02的getAmountOut()函数,该函数应该告诉您给定的输入令牌数量应该收到多少输出令牌。
问题是我收到以下错误:
web3.exceptions.ContractLogicError: execution reverted: UniswapV2Library: INSUFFICIENT_LIQUIDITY
.
现在这个函数是否需要您使用一些 ETH,因为它必须支付 gas 费用才能执行,或者我的代码中有错误?
def checkSubTrade(exchange, in_token_address, out_token_address, amount):
# Should be general cross exchange but would have to check if each routers contain the same methods
router_address = w3.toChecksumAddress(router_dict[str(exchange)])
router_abi = abi_dict[str(exchange)]
router_contract = w3.eth.contract(address = router_address, abi = router_abi)
swap_path = [in_token_address, out_token_address]
output = router_contract.functions.getAmountsOut(amount, swap_path).call()
return output
output = checkSubTrade('uniswap', token_dict['WETH'], token_dict['UNI'], 100000000)
print(output())
token_dict
,router_dict
包含地址,abi_dict
包含DEX的ABI。
我认为您需要检查两件事。
- router_address:也许它和你想象的不一样 当你去链提供的范围页面时,你可以看到交易 细节。并且有 从 和 到 ,例如这个链接 可能会看到"交换会话中的收件人"为route_address。因此,您需要在范围页面中搜索以获取route_address
- router_abi : 我认为您使用 UniswapV2Library ,但在 Uniswap2Library 中还有许多其他 ABI。 例如工厂。 所以你需要检查ABI是否正确。 我强烈建议您需要获取或制作ABI的Solidity文件,并通过Web IDE更改ABI