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

使用ethers.js调用ERC20 transfer的estimateGas报错排查

ERC20 Transfer Gas预估报错解决方案(ethers.js v6)

错误根源

no matching fragment报错本质是合约方法片段匹配失败,结合你能正常发起交易的情况,大概率是estimateGas的调用语法不符合ethers.js v6的规范,而非ABI本身问题。

正确Gas预估写法

写法1:直接调用方法的estimateGas

假设你已通过合法ABI和地址创建了合约实例erc20Contract,按以下格式调用:

// 参数顺序:接收地址、转账金额(需转为wei格式,比如用parseUnits)
const gasEstimate = await erc20Contract.transfer.estimateGas(
  "0xRecipientAddress",
  ethers.parseUnits("10", 18) // 适配18位小数的ERC20,按需调整小数位
);
console.log("预估Gas:", gasEstimate.toString());

写法2:通过合约实例的estimateGas指定方法

如果写法1仍报错,可改用更明确的调用方式:

const gasEstimate = await erc20Contract.estimateGas.transfer(
  "0xRecipientAddress",
  ethers.parseUnits("10", 18)
);

关键排查点

  • 确认ABI中transfer方法的标准定义,正确的片段应为:
    {
      "inputs": [
        { "name": "_to", "type": "address" },
        { "name": "_value", "type": "uint256" }
      ],
      "name": "transfer",
      "outputs": [{ "name": "", "type": "bool" }],
      "stateMutability": "nonpayable",
      "type": "function"
    }
    
  • 参数类型必须匹配:_to是合法地址格式,_value必须是bigint类型(用parseUnits或BigInt转换,不能直接传普通数字/字符串)
  • 若用Provider创建合约实例,需手动指定发送方地址:
    const gasEstimate = await erc20Contract.transfer.estimateGas(
      "0xRecipientAddress",
      ethers.parseUnits("10", 18),
      { from: "0xYourAddress" }
    );
    

避坑提醒

ethers.js v6彻底抛弃了v5中estimateGas({ transfer: [to, value] })的写法,这种旧语法会直接导致片段匹配失败,必须改用上述直接调用方法的格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 09:52:13