Web3.js – Fixing ‘Provider Not Set or Invalid’ Error with Ganache-CLI Provider

ganachemochanodejsweb3js

I'm trying to write and run tests for my smart contract and I get this error: "Error: Provider not set or invalid"

Smart contract code:

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

  const contractJson = JSON.parse(interface);

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

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

  it('allows one account to enter', async () => {
    await lottery.methods.enter().send({
      from: accounts[0],
      value: web3.utils.toWei('0.02', 'ether')
    });

    const players = await lottery.methods.getPlayers().call({
      from: accounts[0]
    });

    assert.equal(accounts[0], players[0]);
    assert.equal(1, players.length);
  });
});

It fails exactly after this code:

await lottery.methods.enter().send({
          from: accounts[0],
          value: web3.utils.toWei('0.02', 'ether')
        });

Any ideas?

Best Answer

I have read the solution in one of Stephen Grider's Udemy course:

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

      const contractJson = JSON.parse(interface);

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

      /* ************ HERE, ADD THE NEXT LINE ******************* */
      lottery.setProvider(provider);
      /* ******************************************************** */
    });

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

      it('allows one account to enter', async () => {
        await lottery.methods.enter().send({
          from: accounts[0],
          value: web3.utils.toWei('0.02', 'ether')
    });

    const players = await lottery.methods.getPlayers().call({
      from: accounts[0]
    });

    assert.equal(accounts[0], players[0]);
    assert.equal(1, players.length);
   });
  });

According to Grider's comment in the course, this is due to some bug in Web3.

Hope it helps.

Related Topic