从 Etherscan API 获取合约 ABI 后创建合约时出错
Posted
技术标签:
【中文标题】从 Etherscan API 获取合约 ABI 后创建合约时出错【英文标题】:Error creating contract after getting contract ABI from Etherscan API 【发布时间】:2021-11-26 03:07:11 【问题描述】:我正在尝试使用 Etherscan API 获取合约 ABI,然后创建一个合约实例并调用一个方法。我能够从 Etherscan 获取 ABI,但在创建合约对象时出现此错误:“在实例化合约对象时,您必须提供合约的 json 接口。” 这就是我的代码的样子
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);
let data = JSON.parse(body);
let contract_abi = data.result;
console.log(contract_abi)
let contract_address = '0x672C1f1C978b8FD1E9AE18e25D0E55176824989';
const contract = new web3.eth.Contract(contract_abi);
const contract_instance = contract.at(contract_address);
// Call contract method
)
当我控制台记录 contract_abi 时,我看到了 ABI 数据。我也尝试过创建合同
const contract = new web3.eth.Contract(contract_abi, contract_address)
谢谢!
【问题讨论】:
【参考方案1】:data.result
包含 JSON ABI 作为字符串。您还需要将其解码为对象。
let contract_abi = JSON.parse(data.result);
此外,您可能正在使用支持 contract.at()
语法的已弃用 Web3 版本。
但如果您使用的是当前版本,则会收到 contract.at is not a function
错误。在这种情况下,您需要将地址作为Contract
构造函数的第二个参数传递。
const contract = new web3.eth.Contract(contract_abi, contract_address);
【讨论】:
谢谢,不敢相信我错过了解析 data.result以上是关于从 Etherscan API 获取合约 ABI 后创建合约时出错的主要内容,如果未能解决你的问题,请参考以下文章