You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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。

  • 错误原因及代码问题排查:

    1. 流动性不足的真实原因:错误提示明确指向流动性不足,但你输入的100000000如果对应WETH(18位小数),仅相当于0.0001 WETH,这个量级的交易几乎不可能触发流动性不足,更可能是以下问题:
      • 地址不匹配:确认token_dict中的WETH、UNI地址,以及router_dict中的Uniswap Router地址,是否与你当前连接的网络(主网/测试网)完全对应。比如连接主网节点但用了Goerli测试网的代币地址,会导致找不到对应交易对的流动性。
      • 小数位数错误:检查输入的amount是否符合代币的小数位数。WETH是18位小数,若要查询1个WETH的输出,需传入10**18,而非100000000(仅8位小数)。
    2. 代码语法错误:最后一行print(output())是错误的——checkSubTrade返回的是getAmountsOut的结果(一个列表),而非函数,应改为print(output)。这个错误会导致后续运行抛出TypeError,需要修正。

内容的提问来源于stack exchange,提问作者bsaoptima

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 15:27:23