Я пытаюсь создать contract
объект с помощью web3.
var contract_abi = result['contracts']['Test']["interface"];
//[{"constant":false,"inputs":[],"name":"inc","outputs":[],"payable":false,"type":"function"},{"inputs":[],"payable":false,"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"odd","type":"bool"},{"indexed":false,"name":"x","type":"uint256"}],"name":"Incremented","type":"event"}];
var contract = new web3.eth.Contract(contract_abi);
Однако я продолжаю получать сообщение об ошибке:
Uncaught Error: You must provide the json interface of the contract when instantiating a contract object.
Однако, если я скопирую свой вывод консоли contract_abi и напрямую создам такую переменную:
var contract_abi =
[{"constant":false,"inputs":[],"name":"inc","outputs":[],"payable":false,"type":"function"},{"inputs":[],"payable":false,"type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"name":"odd","type":"bool"},{"indexed":false,"name":"x","type":"uint256"}],"name":"Incremented","type":"event"}];
Оно работает. В чем дело? Спасибо
Я не уверен, что ваш аби правильный. Но я пишу способ взаимодействия со смарт-контрактом и создания аби из исходного кода.
Генерация abi из исходного кода:
Details
вкладку в правом верхнем углуДоступ к контракту с помощью web3:
Инициализировать экземпляр web3
Используйте следующий код, чтобы получить экземпляр контракта.
//For web3 versions 0.20.x
var contract = web3.eth.contract(contractAbi).at(contractAddress);
//For web3 1.0.x
var contract = new web3.eth.Contract(contractAbi,contractAddress);
Надеюсь это поможет!
Я только что столкнулся с этой проблемой и смог решить ее, запустив JSON.parse() для результата интерфейса, поэтому в вашем случае это будет что-то вроде:
var contract_abi = JSON.parse(result['contracts']['Test']["interface"])
причина, по которой копирование вывода вашей командной строки и установка его в переменную работает, заключается в том, что когда вы копируете его, вы технически меняете его из строки в объект, что и делает JSON.parse :)
Для меня я не извлекал объект abi из скомпилированного файла json.
это сработало:
var erc20ABI = JSON.parse(fs.readFileSync(file+"DummyERC20.json"));
var abi = erc20ABI.abi #essential
ERC20DummyContract = new web3.eth.Contract(erc20ABI, erc20Address);
1.0.0-beta.37
У меня была такая же проблема. Если вы используете web3@1.0 и JavaScript, вам, вероятно, потребуется запустить ABI с помощью JSON.parse().
Проверьте эту ссылку
Матеус Пирес
contract
не существует, он не указан в документации по API . Есть только класс Contract, поэтому необходимоnew
ключевое слово, как @user339946, используемое в описании вопроса.