Revert when trying to test upgradeable ERC777

Getting error when trying to run mocha tests on erc777 upgradable.

Any ideas?

Error Message:

testContract
       "before each" hook for "returns the name":
     Error: Returned error: VM Exception while processing transaction: revert
      at Context.<anonymous> (test/testContract.test.js:22:41)
      at processImmediate (internal/timers.js:456:21)

testContract.sol


// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.6.9;

import "@openzeppelin/contracts-ethereum-package/contracts/token/ERC777/ERC777.sol";
import "@openzeppelin/contracts-ethereum-package/contracts/access/AccessControl.sol";
import "@openzeppelin/contracts-ethereum-package/contracts/access/Ownable.sol";
import "@openzeppelin/contracts-ethereum-package/contracts/utils/Pausable.sol";

contract testContract is Initializable, ContextUpgradeSafe, ERC777UpgradeSafe {

    function initialize(
        address initialHolder,
        uint256 initialBalance,
        string memory name,
        string memory symbol,
        address[] memory defaultOperators
    ) public initializer {
        __Context_init_unchained();
        __ERC777_init_unchained(name, symbol, defaultOperators);
        __ERC777Mock_init_unchained(initialHolder, initialBalance, name, symbol, defaultOperators);
    }

    function __ERC777Mock_init_unchained(
        address initialHolder,
        uint256 initialBalance,
        string memory name,
        string memory symbol,
        address[] memory defaultOperators
    ) internal initializer {


        _mint(initialHolder, initialBalance, "", "");

    }
}

testContract.test.sol

const { accounts, contract, web3 } = require('@openzeppelin/test-environment');
const { BN, expectEvent, expectRevert, singletons } = require('@openzeppelin/test-helpers');

const { expect } = require('chai');

// Load compiled artifacts
const myContract = contract.fromArtifact('testContract');

// Start test block
describe('testContract', function () {
const [ owner, registryFunder, holder, defaultOperatorA, defaultOperatorB, newOperator, anyone ] = accounts;

const initialSupply = new BN('10000');
  const name = 'testToken';
  const symbol = '777TE';
  // const data = web3.utils.sha3('OZ777TestData');
  // const operatorData = web3.utils.sha3('OZ777TestOperatorData');

  const defaultOperators = [defaultOperatorA, defaultOperatorB];
  beforeEach(async function () {
    this.contract = await myContract.new(holder, initialSupply, name, symbol, defaultOperators, {from: owner});
    await this.contract.initialize(holder, initialSupply, name, symbol, defaultOperators, {from: owner});
  });
it('returns the name', async function () {
    expect(await this.contract.name({from: owner})).to.equal(name);
  });

  it('returns the symbol', async function () {
      try {
      var temp = await this.contract.symbol();
    expect(temp).to.equal(symbol);
      }
      catch (e){
          console.log("e", e);
      }
  });
});

cc @abcoathup

1 Like

Hi @apple,

ERC777 requires an onchain ERC1820 registry. We need to deploy this for local test networks (it is already deployed for mainnet and public testnets)

We can use OpenZeppelin Test Helpers to do this: https://docs.openzeppelin.com/test-helpers/0.5/api#erc1820registry

this.erc1820 = await singletons.ERC1820Registry(registryFunder);

See Simple ERC777 token example

TestContract.sol

// SPDX-License-Identifier: UNLICENSED
pragma solidity ^0.6.9;

import "@openzeppelin/contracts-ethereum-package/contracts/token/ERC777/ERC777.sol";
import "@openzeppelin/contracts-ethereum-package/contracts/access/AccessControl.sol";
import "@openzeppelin/contracts-ethereum-package/contracts/access/Ownable.sol";
import "@openzeppelin/contracts-ethereum-package/contracts/utils/Pausable.sol";

contract TestContract is Initializable, ContextUpgradeSafe, ERC777UpgradeSafe {
    function initialize(
        address initialHolder,
        uint256 initialBalance,
        string memory name,
        string memory symbol,
        address[] memory defaultOperators
    ) public initializer {
        __Context_init_unchained();
        __ERC777_init_unchained(name, symbol, defaultOperators);
        _mint(initialHolder, initialBalance, "", "");

    }
}

TestContract.test.js

const { accounts, contract, web3 } = require('@openzeppelin/test-environment');
const { BN, expectEvent, expectRevert, singletons, constants } = require('@openzeppelin/test-helpers');
const { expect } = require('chai');

// Based on https://github.com/OpenZeppelin/openzeppelin-solidity/blob/master/test/examples/SimpleToken.test.js

const TestContract = contract.fromArtifact('TestContract');

describe('TestContract', function () {

  const [_, registryFunder, creator, operator] = accounts;

  const defaultOperators = [operator];  

  beforeEach(async function () {
    this.erc1820 = await singletons.ERC1820Registry(registryFunder);
    this.token = await TestContract.new({ from: creator });
    await this.token.initialize(creator, '1000000000000000000000', 'TestContract', 'TEST', defaultOperators, { from: creator })
  });

  it('has a name', async function () {
    expect(await this.token.name()).to.equal('TestContract');
  });

  it('has a symbol', async function () {
    expect(await this.token.symbol()).to.equal('TEST');
  });
});