#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. Спасибо, не могу поверить, что я пропустил анализ данных.результат