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

从Etherscan API获取合约ABI后创建web3合约实例报错如何解决

问题原因
  • Etherscan API返回的result字段为字符串格式的ABI序列化结果,Web3.js实例化合约要求传入原生JSON数组类型的ABI,直接传入字符串就会触发题目中的报错
  • 若你使用的是Web3.js 1.x及以上版本,已废弃旧版contract.at()的实例化写法,不需要额外调用该方法
修正后代码
let url = 'https://api.etherscan.io/api?module=contract&action=getabi&address=0x672C1f1C978b8FD1E9AE18e25D0E55176824989c&apikey=<api-key>';
request(url, (err, res, body) => {
  if (err) {
    console.log(err);
    return;
  }
  let data = JSON.parse(body);
  // 先校验接口返回状态是否正常,避免拿到错误ABI
  if (data.status !== '1') {
    console.log('获取ABI失败:', data.message);
    return;
  }
  // 核心修改:将字符串格式的ABI二次解析为JSON数组
  let contract_abi = JSON.parse(data.result);
  let contract_address = '0x672C1f1C978b8FD1E9AE18e25D0E55176824989';
  // Web3.js 1.x+ 直接在构造函数传入ABI和地址即可完成实例化
  const contract = new web3.eth.Contract(contract_abi, contract_address);
  // 后续直接用contract调用合约方法即可
})
校验说明

你可以执行console.log(typeof contract_abi, Array.isArray(contract_abi)),输出object true就说明ABI格式符合要求,可以正常实例化合约。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 05:39:01