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

