No se puede desestructurar la propiedad 'interfaz' de 'indefinido' o 'nulo'. ¿Cómo resolver esto?

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!');
  });
});

ERROR

no debería beforeEachestar dentro del describe?
No, si lo hacemos, tenemos que proporcionarlo dentro de toda la descripción (concepto local, global)
parece un problema con su archivo de compilación. require('../compile') aparentemente está devolviendo nulo o indefinido.

Respuestas (8)

El error recae en el require('../compile')seguro, ya que debe devolver un valor nulo.

Intente consultar el código a continuación para compilar el código de solidez. Compruebe si su archivo compile.js funciona de manera similar o no.

// 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);

Asegúrese de tener const abi = JSON.parse(output.contracts[':Coin'].bytecode); la 'C' de 'Coin.sol' en mayúsculas en 'compile.js' porque así es como se almacena en solidez

¿Cómo lo hiciste funcionar? @shashvat
@urjitonrails simplemente revise su archivo compile.js. Asegúrese de tener la primera letra en mayúsculas como se muestra en el código anterior.

El problema no radica en el código proporcionado. Hay algo mal con su archivo de "compilación".

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

es el problema,

require('../compile')

está regresando undefinedo null.

Sí, entonces, ¿cómo debo solucionarlo? I Bytecode está funcionando. No estoy seguro acerca de la interfaz. ¿Puedes ayudarme?
Tal vez publique otra pregunta con su archivo de compilación si no puede resolverlo. El bytecode tampoco funciona. El todo require('../compile')se evalúa como undefinedo null. Eso es todo lo que puedo decir de lo que has publicado.
También tenga en cuenta que el error que ha publicado no tiene nada que ver con Ethereum, es solo un error de Javascript.

Debe asegurarse de exportar todo correctamente desde su compile.jsarchivo a su archivo de prueba. Tengo un error ortográfico cuando estaba exportando el contrato, mi código mordió aquí module.exports = solc.compile(source, 1).contracts[':Registration'];el registro fue :registrationen lugar de :Registrationy, por lo tanto, el {interface, bytecode } were not being exported from thearchivo compile.js`.

Espero que esto ayude. Fue un error tipográfico, js.

Como no puedo comentar la publicación de ngambinos. Esto también funcionó para mí aquí en 2021.

(gracias a) ngambino0192:

El problema es que esto es probablemente la versión del compilador solc. Cambiar la dependencia de la versión a una más reciente puede resolver su problema.

Prueba lo siguiente:

  1. rm -rf node_modules// eliminarnode_modules
  2. rm -rf package-lock.json// eliminarpackage-lock.json
  3. Cambie la declaración de importación del archivo .sol a:pragma solidity ^0.4.25
  4. Cambie la declaración de importación del archivo .sol a:pragma solidity ^0.4.25
  5. Cambie la dependencia en package.json a"solc": "^0.4.25"
  6. npm install // instala nuevas dependencias
  7. Entonces puedes ejecutar tus pruebas.

El problema no está en el archivo js, ​​está en el archivo .sol

  1. Asegúrese de estar usando solidity y solc versión 0.4.17

  2. Asegúrese de no estar utilizando ninguna función de la nueva versión de solidez en su versión anterior como constructor

  3. Puede ser un error de sintaxis básico en su archivo compile.js o archivo .sol

También recibí el mismo error, pero asegúrese de escribir el nombre de su contrato y el nombre que está usando aquí: module.exports = solc.compile(source, 1).contracts[': Lottery ']; y contrato Lotería { Debe ser idéntico.

Para los googleadores:

El problema es que esto es probablemente la versión del compilador solc. Cambiar la dependencia de la versión a una más reciente puede resolver su problema.

Prueba lo siguiente:

  1. rm -rf node_modules// eliminarnode_modules
  2. rm -rf package-lock.json// eliminarpackage-lock.json
  3. Cambie la declaración de importación del archivo .sol a:pragma solidity ^0.4.25
  4. Cambie la dependencia en package.json a"solc": "^0.4.25"
  5. npm install// instalar nuevas dependencias

Entonces puedes ejecutar tus pruebas.

En mi caso, estaba usando

pragma solidity ^0.4.17;

y

constructor() public {...}

en lugar de función

Lottery() public{...}

Se admite el uso de la versión 0.4.25 solc y constructor(). De lo contrario, se genera un error como "RangeError: se excedió el tamaño máximo de la pila de llamadas" y "No se puede desestructurar la propiedad 'interfaz' de 'requerir (...)' ya que no está definida".

Recibí estos errores anteriores mientras ejecutaba la prueba mocha en mi contrato.

Elimine node_module, package.lock.json y actualice la versión de solc en contract, así como en package.json y vuelva a instalar usando el comando "npm install"