Невозможно деструктурировать свойство `interface` из 'undefined' или 'null'. Как это решить?

const assert = require('assert');
const ganache = require('ganache-cli');
const Web3 = require('web3');

const provider = ganache.provider();
const web3 = new Web3(provider);

const { interface, bytecode } = require('../compile');

let accounts;
let inbox;

beforeEach(async () => {
  // Get a list of all accounts
  accounts = await web3.eth.getAccounts();
  // Use one of those accounts to deploy the contract
  inbox = await new web3.eth.Contract(JSON.parse(interface))
    .deploy({ data: bytecode, arguments: ['Hi there!'] })
    .send({ from: accounts[0], gas: '1000000' });


  inbox.setProvider(provider);
});

describe('inbox', () => {
  it('deploys a contract', () => {
    assert.ok(inbox.options.address);
  });
  it('has a default message', async () => {
    const message = await inbox.methods.message().call();
    assert.equal(message, 'Hi there!');
  });
});

ОШИБКА

не должно beforeEachбыть внутри describe?
Нет, если мы это сделаем, мы должны предоставить его во всех описаниях (локальная, глобальная концепция)
похоже на проблему с вашим файлом компиляции. require('../compile') очевидно возвращает null или undefined.

Ответы (8)

Ошибка заключается в require('../compile')уверенности, поскольку она должна возвращать ноль.

Попробуйте обратиться к приведенному ниже коду для компиляции кода Solidity. Проверьте, работает ли ваш файл compile.js аналогичным образом или нет.

// Compile the source code
const input = fs.readFileSync('Coin.sol');

const output = solc.compile(input.toString(), 1);

const bytecode = output.contracts[':Coin'].bytecode;

const abi = JSON.parse(output.contracts[':Coin'].interface);

Убедитесь, что вы получили const abi = JSON.parse(output.contracts[':Coin'].bytecode); «C» в «Coin.sol» заглавными буквами в «compile.js», потому что именно так он хранится в Solidity.

Как вы заставили это работать? @шашват
@urjitonrails просто проверьте свой файл compile.js. Убедитесь, что первая буква написана заглавными буквами, как показано в приведенном выше коде.

Проблема не в предоставленном коде. Что-то не так с вашим "компилируемым" файлом.

const { interface, bytecode } = require('../compile');

это проблема,

require('../compile')

возвращается undefinedили null.

Да, так как мне это исправить? У меня байткод работает. Я не уверен насчет интерфейса. Не могли бы вы мне помочь?
Возможно, опубликуйте еще один вопрос с вашим файлом компиляции, если вы не можете понять это. Байт-код тоже не работает. Целое require('../compile')оценивается как undefinedили null. Это все, что я могу сказать из того, что вы написали.
Также обратите внимание, что опубликованная вами ошибка не имеет ничего общего с Ethereum, это просто ошибка Javascript.

Вам нужно убедиться, что вы правильно экспортируете все из своего compile.jsфайла в тестовый файл. У меня есть орфографическая ошибка, когда я экспортировал контракт, мой код здесь был вместо module.exports = solc.compile(source, 1).contracts[':Registration'];регистрации и, следовательно, compile.js`.:registration:Registration{interface, bytecode } were not being exported from the

Надеюсь, это поможет. Это была опечатка, ошибка js.

Поскольку я не могу комментировать пост ngambinos. Это также сработало для меня здесь в 2021 году.

(спасибо) ngambino0192:

Проблема в том, что это, вероятно, версия компилятора solc. Замена зависимости версии на более позднюю может решить вашу проблему.

Попробуйте следующее:

  1. rm -rf node_modules// удалятьnode_modules
  2. rm -rf package-lock.json// удалятьpackage-lock.json
  3. Измените оператор импорта файла .sol на:pragma solidity ^0.4.25
  4. Измените оператор импорта файла .sol на:pragma solidity ^0.4.25
  5. Измените зависимость в package.json на"solc": "^0.4.25"
  6. npm install // устанавливаем новые зависимости
  7. Затем вы можете запустить свои тесты

Проблема не в файле js, а в файле .sol

  1. Убедитесь, что вы используете Solidity и Solc версии 0.4.17.

  2. Убедитесь, что вы не используете какие-либо функции новой версии Solidity в своей старой версии, такие как конструктор.

  3. Это может быть основная синтаксическая ошибка в вашем файле compile.js или .sol.

Я также получил ту же ошибку, но убедитесь, что имя вашего контракта правильно написано и имя, которое вы используете здесь: module.exports = solc.compile(source, 1).contracts[': Lottery ']; и контрактная лотерея { Это должно быть идентично.

Для гуглеров:

Проблема в том, что это, вероятно, версия компилятора solc. Замена зависимости версии на более позднюю может решить вашу проблему.

Попробуйте следующее:

  1. rm -rf node_modules// удалятьnode_modules
  2. rm -rf package-lock.json// удалятьpackage-lock.json
  3. Измените оператор импорта файла .sol на:pragma solidity ^0.4.25
  4. Измените зависимость в package.json на"solc": "^0.4.25"
  5. npm install// устанавливаем новые зависимости

Затем вы можете запустить свои тесты

В моем случае я использовал

pragma solidity ^0.4.17;

и

constructor() public {...}

вместо функции

Lottery() public{...}

Поддерживается использование версии 0.4.25 solc и конструктора(). В противном случае возникает ошибка типа «RangeError: превышен максимальный размер стека вызовов» и «Невозможно деструктурировать интерфейс свойства «require (...)», поскольку он не определен».

Я получил эту ошибку выше при выполнении теста мокко по моему контракту.

Удалите node_module, package.lock.json и обновите версию solc в контракте, а также в package.json и переустановите с помощью команды «npm install».