Ошибка при создании контракта после получения ABI контракта из API Etherscan

#blockchain #ethereum #solidity #web3js #etherscan

Вопрос:

Я пытаюсь получить ABI контракта с помощью API Etherscan, а затем создать экземпляр контракта и вызвать метод. Я могу получить ABI от Etherscan, но при создании объекта контракта я получаю эту ошибку: «Вы должны предоставить интерфейс json контракта при создании экземпляра объекта контракта». Вот как выглядит мой код

 let url = 'https://api.etherscan.io/api?module=contractamp;action=getabiamp;address=0x672C1f1C978b8FD1E9AE18e25D0E55176824989camp;apikey=<api-key>';
request(url, (err, res, body) => {
  if (err) {
    console.log(err);
  }
  let data = JSON.parse(body);
  let contract_abi = data.resu<
  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 содержит ABI JSON в виде строки. Вам также нужно расшифровать его для объекта.

 let contract_abi = JSON.parse(data.result);
 

Кроме того, возможно, вы используете устаревшую версию Web3, которая поддерживает contract.at() синтаксис.

Но если вы используете текущую версию, вы получите сообщение об contract.at is not a function ошибке. В этом случае вам нужно передать адрес в качестве второго аргумента Contract конструктора.

 const contract = new web3.eth.Contract(contract_abi, contract_address);
 

Комментарии:

1. Спасибо, не могу поверить, что я пропустил анализ данных.результат