从 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 后创建合约时出错的主要内容,如果未能解决你的问题,请参考以下文章

如何使用GETH获取合约地址对应的ABI?

etherscan如何获​​得区块链编译代码?

创建智能合约并使用 ABI 函数

我们可以通过 Token Name 获取智能合约地址吗

API调用返回的Contract_ABI有JSON接口错误

深入以太坊智能合约 ABI