Files
openzeppelin-contracts/test/examples/StandaloneERC20.test.js
Nicolás Venturo 5e69036bbc EVM Package examples (#32)
* Added StandardToken (on-chain lib)

* Added OnChainERC20 example.

* Added OnChainERC721

* Update OnChainERC721.test.js

* Renamed the contracts to Standalone*.

* Fix path to Initializable in StandardToken example
2018-10-18 15:03:34 +02:00

159 lines
5.5 KiB
JavaScript

const encodeCall = require('zos-lib/lib/helpers/encodeCall').default;
const { shouldBehaveLikeERC20Mintable } = require('../token/ERC20/behaviors/ERC20Mintable.behavior');
const { assertRevert } = require('../helpers/assertRevert');
const BigNumber = web3.BigNumber;
const should = require('chai')
.use(require('chai-bignumber')(BigNumber))
.should();
const StandaloneERC20 = artifacts.require('StandaloneERC20');
contract('StandaloneERC20', function ([_, deployer, initialHolder, minterA, minterB, pauserA, pauserB, anyone, ...otherAccounts]) {
const name = "StandaloneERC20";
const symbol = "SAERC20";
const decimals = 18;
const initialSupply = 300;
const minters = [minterA, minterB];
const pausers = [pauserA, pauserB];
const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';
beforeEach(async function () {
this.token = await StandaloneERC20.new({ from: deployer });
});
async function initializeFull(token, name, symbol, decimals, initialSupply, initialHolder, minters, pausers, from) {
const callData = encodeCall('initialize', ['string', 'string', 'uint8', 'uint256', 'address', 'address[]', 'address[]'], [name, symbol, decimals, initialSupply, initialHolder, minters, pausers]);
await token.sendTransaction({ data: callData, from });
}
async function initializePartial(token, name, symbol, decimals, minters, pausers, from) {
const callData = encodeCall('initialize', ['string', 'string', 'uint8', 'address[]', 'address[]'], [name, symbol, decimals, minters, pausers]);
await token.sendTransaction({ data: callData, from });
}
describe('with all arguments', function () {
it('reverts if initial balance is zero', async function () {
await assertRevert(initializeFull(this.token, name, symbol, decimals, 0, ZERO_ADDRESS, minters, pausers, deployer));
});
it('can be created with no minters', async function () {
await initializeFull(this.token, name, symbol, decimals, initialSupply, initialHolder, [], pausers, deployer);
for (const minter of minters) {
(await this.token.isMinter(minter)).should.equal(false);
}
});
it('can be created with no pausers', async function () {
await initializeFull(this.token, name, symbol, decimals, initialSupply, initialHolder, minters, [], deployer);
for (const pauser of pausers) {
(await this.token.isPauser(pauser)).should.equal(false);
}
});
context('with token', async function () {
beforeEach(async function () {
await initializeFull(this.token, name, symbol, decimals, initialSupply, initialHolder, minters, pausers, deployer);
});
it('initializes metadata', async function () {
(await this.token.name()).should.equal(name);
(await this.token.symbol()).should.equal(symbol);
(await this.token.decimals()).should.be.bignumber.equal(decimals);
});
it('assigns the initial supply to the initial holder', async function () {
(await this.token.balanceOf(initialHolder)).should.be.bignumber.equal(initialSupply);
});
describe('mintability', function () {
beforeEach(function () {
this.contract = this.token;
});
it('all minters have the minter role', async function () {
for (const minter of minters) {
(await this.token.isMinter(minter)).should.equal(true);
}
});
shouldBehaveLikeERC20Mintable(minterA, otherAccounts);
});
describe('pausability', function () {
beforeEach(function () {
this.contract = this.token;
});
it('all pausers have the minter role', async function () {
for (const pauser of pausers) {
(await this.token.isPauser(pauser)).should.equal(true);
}
});
});
});
});
describe('without initial balance', function () {
it('can be created with no minters', async function () {
await initializePartial(this.token, name, symbol, decimals, [], pausers, deployer);
for (const minter of minters) {
(await this.token.isMinter(minter)).should.equal(false);
}
});
it('can be created with no pausers', async function () {
await initializePartial(this.token, name, symbol, decimals, minters, [], deployer);
for (const pauser of pausers) {
(await this.token.isPauser(pauser)).should.equal(false);
}
});
context('with token', async function () {
beforeEach(async function () {
await initializePartial(this.token, name, symbol, decimals, minters, pausers, deployer);
});
it('initializes metadata', async function () {
(await this.token.name()).should.equal(name);
(await this.token.symbol()).should.equal(symbol);
(await this.token.decimals()).should.be.bignumber.equal(decimals);
});
describe('mintability', function () {
beforeEach(function () {
this.contract = this.token;
});
it('all minters have the minter role', async function () {
for (const minter of minters) {
(await this.token.isMinter(minter)).should.equal(true);
}
});
shouldBehaveLikeERC20Mintable(minterA, otherAccounts);
});
describe('pausability', function () {
beforeEach(function () {
this.contract = this.token;
});
it('all pausers have the minter role', async function () {
for (const pauser of pausers) {
(await this.token.isPauser(pauser)).should.equal(true);
}
});
});
});
});
});