ERC777 constructor arguments

Hi,
I’m trying to deploy zeppelin’s implementation of ERC777 just as an example. I understand the constructor takes three arguments: name, symbol and an array of addresses (default operators), hence the following 2_another_migrate.js code in truffle:

var MyContract = artifacts.require("./ERC777.sol");
var defaultOperators = ["0xEe545e6239a7e0d42095872956DdC981f028da60","0x3e576F19520215637569c6aCB0740723326d1375", "0x569bd2696200ce347f72cE586B6d355C28E5aAf4"];

module.exports = function(deployer) {
deployer.deploy(MyContract, "TestToken", "TTN", defaultOperators);
}

BUT, when I to run the migration the console says:

“ERC777” hit a require or revert statement somewhere in its constructor. Try:

  • Verifying that your constructor params satisfy all require conditions.
  • Adding reason strings to your require statements.

So what exactly should I pass as a third argument? My goal is to eventually deploy it to a test network and interact with it via MEW… any other thing I might be missing here? Thank you

Hi @Bleier, I deployed a simple ERC777 to Rinkeby testnet with a similar deploy script to yours using Truffle.

In a testing environment an ERC777 requires deploying an ERC1820 registry using openzeppelin-test-helpers. See the test suite: https://github.com/OpenZeppelin/openzeppelin-solidity/blob/release-v2.3.0/test/drafts/ERC777/ERC777.test.js

Smart contract:

pragma solidity ^0.5.0;

import "openzeppelin-solidity/contracts/token/ERC777/ERC777.sol";

contract ABC777 is ERC777 {
    constructor(
        string memory name,
        string memory symbol,
        address[] memory defaultOperators
    ) public ERC777(name, symbol, defaultOperators) {
        _mint(msg.sender, msg.sender, 10000 * 10 ** 18, "", "");
    }
}

2_deploy.js:

var MyContract = artifacts.require("ABC777");
var defaultOperators = [
"0xEe545e6239a7e0d42095872956DdC981f028da60",
"0x3e576F19520215637569c6aCB0740723326d1375",
"0x569bd2696200ce347f72cE586B6d355C28E5aAf4"];

module.exports = function(deployer) {
    deployer.deploy(MyContract, "ABC 777 Token", "ABC", defaultOperators);
}

Deployed contract:

Etherscan: 0x8312703dd4296D5c98Ab885e6E5BA12147aC168C
OneClickDapp: ABC777 (to interact with the contract)

3 Likes

Thanks so much! I was missing the contract itself hehe

1 Like

For the record, when testing against a development network like ganache or geth --dev you need to use openzeppelin-test-helpers as shown below.

const { singletons } = require('openzeppelin-test-helpers');

contract('ERC777', function (accounts) {
  before(async function () {
    const funder = accounts[0]; // account that will be used to fund the deployment
    await singletons.ERC1820Registry(funder);
  });

  it(...your test here...);
});
1 Like

Yup, I realized my problem was not the constructor but the deployment of the ERC12820Registry. I followed the instructions you gave to CrazyRabbitLTC a couple of days ago. but truffle “Cannot find module ‘openzeppelin-test-helpers/configure’”

This is the deploy code I wrote after going over that issue:

var ERC777 = artifacts.require("TTN777");

require('openzeppelin-test-helpers/configure')({ web3 });

const { singletons } = require('openzeppelin-test-helpers');

const name = "TestToken777";
const symbol = "TTN";
const defaultOperators = [];

module.exports = async function(deployer, network, accounts) {
  const erc1820 = await singletons.ERC1820Registry(accounts[0]);
  deployer.deploy(ERC777, name, symbol, defaultOperators);
};
1 Like

Configure is still unreleased! :slightly_smiling_face: You can try it for now by installing the latest code from GitHub directly: npm install github:OpenZeppelin/openzeppelin-test-helpers. The feature will be released on npm likely next week.

Check out the changelog in case there are any breaking changes you need to adapt to.

3 Likes

Ty! so I did try
npm install github:OpenZeppelin/openzeppelin-test-helpers
but npm throws a ELIFECYCLE error…

npm ERR! scrypt@6.0.3 install: `node-gyp rebuild`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the scrypt@6.0.3 install script.

Maybe this has been a problem with my node version all along?

node -v v12.2.9
node-gyp -v v3.8.0

running npm install openzeppelin-test-helpers does start the installation, but fails with the same error… :frowning:

@abcoathup what node/truffle version did you use to deploy your 777, if I may ask? And thanks guys for your time

1 Like

@Bleier
I am running:
Truffle v5.0.17
Node v11.9.0
npm 6.9.0

On Windows using Windows Subsystem for Linux.

Potentially an issue with your node/node-gyp setup.

1 Like

Thanks mate, I believe it is indeed a problem with node… I will roll back to v11.9 and see if that works.
Is your project open sourced by the way? :sweat_smile:

1 Like

@Bleier Let us know how you get on with node.

My sample project is pretty much just the smart contract and deploy above. Happy to share.

Yeah I completely uninstalled and reinstalled node following these instructions. I’m gonna try with different versions starting next week :slight_smile:

1 Like

Hopefully with a clean start for node you should be fine. I have definitely been there before.

Let us know if you have any issues.

We’ve just released v0.4.0 with this change, so there’s no need to install from GitHub anymore :slight_smile: Simply run npm install openzeppelin-test-helpers

3 Likes

Just did that and oh it felt so good

+ openzeppelin-test-helpers@0.4.0 added 11 packages and updated 4 packages in 52.933s

BUT truffle migrate throws an error anyways:

Error: Error: Cannot find module 'openzeppelin-test-helpers'

It looks like it was properly installed though…

2 Likes

So yes, it was a problem with node. It stopped throwing a bunch of errors after rolling back to version 10.0.0. Now it only throws one error lol (see above)

2 Likes

Hi @Bleier is your code open source so I can have a look?

I have a simple ERC777 token example using the OpenZeppelin implementation on GitHub which I have deployed to ganache-cli, Ropsten and Rinkeby.

1 Like

This is mine, I just uploaded it now: https://github.com/alanbleier182/777/tree/master
The readme contains everything I did to replicate the bug… I’ll check yours out and see if I can decypher what went wrong. Thanks a bunch! :slight_smile:

1 Like

Hi @Bleier

You didn’t have a package.json in GitHub. I assume you have one, if you haven’t, run npm init and then install any packages you need.

Appears there are three issues;

  1. openzeppelin-test-helpers has a dependency on chai so run an npm install --save-dev chai

  2. module.exports = async function(deployer, accounts) { should be module.exports = async function(deployer, network, accounts) {

  1. Need to add an await to the deploy await deployer.deploy(ERC777, name, symbol, defaultOperators);

As an aside, for deploying to ganache-cli I uncommented in truffle-config.js the development network

    development: {
     host: "127.0.0.1",     // Localhost (default: none)
     port: 8545,            // Standard Ethereum port (default: none)
     network_id: "*",       // Any network (default: none)
    },

Once the above is done truffle migrate deploys your 777 token.

1 Like

Hi,

Here is an example to deploy the ERC1820 registry, using the openzeppelin-test-helpers.

This example deals with multiple migrate --reset inside the truffle console.

Please note that the second step of migration, is for loading the openzeppelin-test-helpers.
There we try to configure it, but if is already configured, an exception is thrown and it is catch.
Then we deploy the ERC1820Registry.

The third step of migration is for deploying the ERC777.

Enjoy!

1 Like