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

Ethers.js调用tx.wait()在Polygon链无法解析问题求助

问题根源

  • 硬编码固定gasPrice不符合Polygon网络的动态费率要求。Polygon网络的基础打包gasPrice会随链上拥堵程度波动,你固定设置的50Gwei在网络拥堵时远低于矿工的最低打包阈值,交易要么无法进入公共mempool,要么长期滞留在mempool中无法被打包,因此链上查不到记录,await tx.wait()也会持续等待无法返回。
  • 替换交易的费率不满足规则要求。EVM兼容链替换同一nonce的未打包交易时,新交易的gasPrice至少要比原交易高出10%,部分节点要求更高的涨幅阈值。你仅上调20%仍报错的核心原因是原交易的gasPrice本身远低于当前网络的最低打包门槛,即使上浮20%后还是达不到节点要求的最低费率,因此判定费用不足。
  • 使用公共HTTP节点存在广播失败问题。公共RPC节点常出现本地受理交易返回哈希,但未成功将交易广播到全网mempool的情况,此时交易仅存在于你对接的单个节点缓存中,全网其他节点(包括Polyscan)无法查询到该交易,也永远不会被打包。

修复方案

  1. 替换硬编码的gasPrice为动态获取+溢价模式,确保交易费率始终满足打包要求:
const getWallet = (): Wallet => {
  return new ethers.Wallet(PRIVATE_KEY, HTTP_PROVIDER);
};
const wallet = getWallet();
// 动态获取网络当前建议gasPrice,加20%溢价提高打包优先级
const baseGasPrice = await HTTP_PROVIDER.getGasPrice();
const gasPrice = baseGasPrice.mul(120).div(100);
const swap1 = await wallet.sendTransaction({
      data: tx1.data,
      chainId: tx1.chainId,
      from: tx1.from,
      gasLimit: 350449, 
      gasPrice: gasPrice, 
      value: '0x' + new BigNumber(tx1.value).toString(16),
      to: tx1.to,
      nonce: nonce,
    });
  1. 给tx.wait()增加超时配置,避免无限等待:
// 等待1个区块确认,最长等待5分钟,超时自动抛出错误
await swap1.wait(1, 300000);
  1. 提交交易后主动校验广播状态,提交后3分钟调用await ethers.provider.getTransaction(swap1.hash),如果返回null说明交易未广播到全网,直接使用更高的gasPrice重新提交同一nonce的交易即可。
  2. 替换未打包交易时,确保新交易的gasPrice同时满足两个条件:比原交易gasPrice高10%以上、不低于当前网络动态获取的建议gasPrice。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 01:06:03