web3.py调用Uniswap Router-02 getAmountsOut遇INSUFFICIENT_LIQUIDITY错误求助
问题描述
尝试使用Uniswap Router-02的getAmountsOut()函数查询给定输入代币数量对应的输出代币数量时,触发以下错误:
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。
解答
getAmountsOut()无需支付Gas费:该函数是view类型的只读函数,使用.call()调用时仅在本地节点模拟执行,不会向区块链发送交易,因此完全不消耗Gas。错误原因及代码问题排查:
- 流动性不足的真实原因:错误提示明确指向流动性不足,但你输入的
100000000如果对应WETH(18位小数),仅相当于0.0001 WETH,这个量级的交易几乎不可能触发流动性不足,更可能是以下问题:- 地址不匹配:确认
token_dict中的WETH、UNI地址,以及router_dict中的Uniswap Router地址,是否与你当前连接的网络(主网/测试网)完全对应。比如连接主网节点但用了Goerli测试网的代币地址,会导致找不到对应交易对的流动性。 - 小数位数错误:检查输入的
amount是否符合代币的小数位数。WETH是18位小数,若要查询1个WETH的输出,需传入10**18,而非100000000(仅8位小数)。
- 地址不匹配:确认
- 代码语法错误:最后一行
print(output())是错误的——checkSubTrade返回的是getAmountsOut的结果(一个列表),而非函数,应改为print(output)。这个错误会导致后续运行抛出TypeError,需要修正。
- 流动性不足的真实原因:错误提示明确指向流动性不足,但你输入的
内容的提问来源于stack exchange,提问作者bsaoptima
相关产品推荐
相关产品推荐

