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

Uniswap V2调用swapExactTokensForTokens无理由交易回滚问题求助

问题原因分析

  • 本地节点未同步对应链上状态:代码中使用的都是以太坊主网的Uniswap V2路由、WETH、ENJ合约地址,如果你启动的Hardhat本地节点是全新的干净链,没有fork主网状态,也没有手动部署上述合约、添加WETH-ENJ交易对的流动性,调用swap时会因为找不到对应交易对、合约不存在直接回滚。
  • 授权验证逻辑错误,未确认实际授权状态:你给路由授权WETH的交易发起方是walletAddress(0x3c44cdddb6a900fa2b585dd299e03d12fa4293bc),但查询授权额度时传入的owner地址是另一个地址0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266,打印出来的授权额度和实际交易用的地址无关,无法证明walletAddress的WETH授权成功。
  • 交易未等待确认,硬编码nonce存在冲突风险:你连续发送三笔交易,没有等待上一笔交易链上确认就直接发送下一笔,且三笔交易的nonce是硬编码的固定值,如果该地址此前在本地节点已有交易记录,nonce不匹配会导致交易失败。
  • Gas limit设置不足:swapExactTokensForTokens的链上执行消耗通常高于70000 gas,你设置的70000 gas limit可能不足以覆盖交易执行,导致gas不足直接回滚。
  • 余额校验缺失:你deposit的WETH数量是1ETH(1e18 wei),但没有等待deposit交易确认就直接执行后续操作,可能出现WETH未到账导致swap时余额不足回滚。

修复建议

  • 启动Hardhat节点时添加fork主网参数,同步主网的合约和流动池状态,无需手动部署合约即可调用主网已有的协议。
  • 修正授权查询逻辑,查询walletAddress给路由的授权额度,确认授权值≥你要swap的0.1 WETH(1e17 wei)。
  • 每笔交易发送后调用w3.eth.wait_for_transaction_receipt()等待交易确认,不要硬编码nonce,用w3.eth.get_transaction_count(walletAddress)动态获取当前可用nonce。
  • 把swap交易的gas limit调高到300000以上,或者去掉gas参数让web3自动估算合适的gas值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.28 02:15:01