Невозможно уничтожить свойство `interface` из 'undefined' или 'null' - PullRequest
0 голосов
/ 08 апреля 2019

Когда я выполняю npm run test, я получаю эту ошибку:

Невозможно уничтожить свойство interface из 'undefined' или 'null'

Я пытался исправить эту ошибку в течение нескольких дней безрезультатно. Я видел в некоторых других сообщениях, что это обычно связано с файлом compile.js ... Я думаю, что все в порядке, поэтому я не могу найти проблему.

Я вставлю весь свой код (заметьте, что мне не терпится работать с самой последней версией Solidness, чтобы изучить новые функциональные возможности ... возможно, в этом моя ошибка ...)

THANKYOU !!!

Мой compile.js:

const path = require('path');
const fs = require('fs');
const solc = require('solc');

const lotteryPath = path.resolve(__dirname, 'contracts', 'Lottery.sol');
const source = fs.readFileSync(lotteryPath, 'utf8');

module.exports = solc.compile(source, 1).contracts[':Lottery'];

.sol:

pragma solidity ^0.5.1;

contract Lottery {
    address public manager;
    address payable [] public players;

    constructor() public payable {
        manager = msg.sender;
    }

    function enter() public payable {
        require(msg.value > .01 ether);

        players.push(msg.sender);
    }

    function random() private view returns (uint){
        return uint(keccak256(abi.encode(block.difficulty, now, players)));
    }

    function getPlayers() public view returns (address payable[] memory){
        return players;
    }

    function pickWinner() public payable restricted{
        uint index = random() % players.length;
        address(players[index]).transfer(address(this).balance);
        players = new address payable[](0);
    }

    modifier restricted(){
        require(msg.sender==manager);
        _;
    }
}

TEST:

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 lottery;
let accounts;

beforeEach(async () => {
  accounts = await web3.eth.getAccounts();

  lottery = await new web3.eth.Contract(JSON.parse(interface))
    .deploy({ data: bytecode })
    .send({ from: accounts[0], gas: '1000000' });
});



describe('Lottery Contract', () =>{
  it('deploys a contract', () =>{
    assert.ok(lottery.options.address);
  });

});

1 Ответ

0 голосов
/ 21 апреля 2019

У меня была точно такая же проблема. Проблема связана с компилятором солидности, который вы используете. В моем конкретном случае я пробовал 0.5.4 и по какой-то причине я столкнулся с той же ошибкой.

"Составление контракта отличается от solc 0.5.0 и выше"

одним из возможных решений является использование более низкой версии solc: например, 0.4.25 (в моем случае это работает нормально).

Проблема возникает, когда происходит компиляция, операция возвращает ноль, поэтому нет выходных данных, и поэтому вы получаете сообщение об ошибке с нулевой переменной.

...