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
相关产品推荐
相关产品推荐

