0

我正在尝试使用 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)

谢谢!

4

1 回答 1

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);
于 2021-10-05T21:21:29.063 回答