Commit 644b1216 by Mikhail Melnik

Merge branch 'master' into linter

parents 05c7d8c8 453e3dd4
...@@ -23,12 +23,15 @@ To write your custom contracts, import ours and extend them through inheritance. ...@@ -23,12 +23,15 @@ To write your custom contracts, import ours and extend them through inheritance.
pragma solidity ^0.5.0; pragma solidity ^0.5.0;
import 'zos-lib/contracts/Initializable.sol'; import 'zos-lib/contracts/Initializable.sol';
import 'openzeppelin-solidity/contracts/token/ERC721/ERC721Full.sol'; import 'openzeppelin-eth/contracts/token/ERC721/ERC721Full.sol';
import 'openzeppelin-solidity/contracts/token/ERC721/ERC721Mintable.sol'; import 'openzeppelin-eth/contracts/token/ERC721/ERC721Mintable.sol';
contract MyNFT is Initializable, ERC721Full, ERC721Mintable { contract MyNFT is Initializable, ERC721Full, ERC721Mintable {
function initialize() public initializer { function initialize() public initializer {
ERC721Full.initialize("MyNFT", "MNFT"); ERC721.initialize();
ERC721Enumerable.initialize();
ERC721Metadata.initialize("MyNFT", "MNFT");
ERC721Mintable.initialize(msg.sender);
} }
} }
``` ```
......
pragma solidity ^0.5.0;
import "zos-lib/contracts/Initializable.sol";
import "../token/ERC20/ERC20Detailed.sol";
import "../token/ERC20/ERC20Mintable.sol";
import "../token/ERC20/ERC20Pausable.sol";
/**
* @title Standard ERC20 token, with minting and pause functionality.
*
*/
contract StandardToken is Initializable, ERC20Detailed, ERC20Mintable, ERC20Pausable {
function initialize(
string memory name, string memory symbol, uint8 decimals, uint256 initialSupply, address initialHolder,
address[] memory minters, address[] memory pausers, address sender
) public initializer {
ERC20Detailed.initialize(name, symbol, decimals);
// Mint the initial supply
if (initialSupply > 0) { // To allow passing a null address when not doing any initial supply
_mint(initialHolder, initialSupply);
}
// Initialize the minter and pauser roles, and renounce them
ERC20Mintable.initialize(sender);
_removeMinter(sender);
ERC20Pausable.initialize(sender);
_removePauser(sender);
// Add the requested minters and pausers (this can be done after renouncing since
// these are the internal calls)
for (uint256 i = 0; i < minters.length; ++i) {
_addMinter(minters[i]);
}
for (uint256 i = 0; i < pausers.length; ++i) {
_addPauser(pausers[i]);
}
}
}
...@@ -13,7 +13,7 @@ import "./ERC20Pausable.sol"; ...@@ -13,7 +13,7 @@ import "./ERC20Pausable.sol";
contract StandaloneERC20 is Initializable, ERC20Detailed, ERC20Mintable, ERC20Pausable { contract StandaloneERC20 is Initializable, ERC20Detailed, ERC20Mintable, ERC20Pausable {
function initialize( function initialize(
string memory name, string memory symbol, uint8 decimals, uint256 initialSupply, address initialHolder, string memory name, string memory symbol, uint8 decimals, uint256 initialSupply, address initialHolder,
address[] memory minters, address[] memory pausers, address sender address[] memory minters, address[] memory pausers
) public initializer { ) public initializer {
ERC20Detailed.initialize(name, symbol, decimals); ERC20Detailed.initialize(name, symbol, decimals);
...@@ -21,11 +21,11 @@ contract StandaloneERC20 is Initializable, ERC20Detailed, ERC20Mintable, ERC20Pa ...@@ -21,11 +21,11 @@ contract StandaloneERC20 is Initializable, ERC20Detailed, ERC20Mintable, ERC20Pa
_mint(initialHolder, initialSupply); _mint(initialHolder, initialSupply);
// Initialize the minter and pauser roles, and renounce them // Initialize the minter and pauser roles, and renounce them
ERC20Mintable.initialize(sender); ERC20Mintable.initialize(address(this));
_removeMinter(sender); _removeMinter(address(this));
ERC20Pausable.initialize(sender); ERC20Pausable.initialize(address(this));
_removePauser(sender); _removePauser(address(this));
// Add the requested minters and pausers (this can be done after renouncing since // Add the requested minters and pausers (this can be done after renouncing since
// these are the internal calls) // these are the internal calls)
...@@ -39,16 +39,16 @@ contract StandaloneERC20 is Initializable, ERC20Detailed, ERC20Mintable, ERC20Pa ...@@ -39,16 +39,16 @@ contract StandaloneERC20 is Initializable, ERC20Detailed, ERC20Mintable, ERC20Pa
} }
function initialize( function initialize(
string memory name, string memory symbol, uint8 decimals, address[] memory minters, address[] memory pausers, address sender string memory name, string memory symbol, uint8 decimals, address[] memory minters, address[] memory pausers
) public initializer { ) public initializer {
ERC20Detailed.initialize(name, symbol, decimals); ERC20Detailed.initialize(name, symbol, decimals);
// Initialize the minter and pauser roles, and renounce them // Initialize the minter and pauser roles, and renounce them
ERC20Mintable.initialize(sender); ERC20Mintable.initialize(address(this));
_removeMinter(sender); _removeMinter(address(this));
ERC20Pausable.initialize(sender); ERC20Pausable.initialize(address(this));
_removePauser(sender); _removePauser(address(this));
// Add the requested minters and pausers (this can be done after renouncing since // Add the requested minters and pausers (this can be done after renouncing since
// these are the internal calls) // these are the internal calls)
......
...@@ -12,9 +12,5 @@ import "./ERC721Metadata.sol"; ...@@ -12,9 +12,5 @@ import "./ERC721Metadata.sol";
* @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md * @dev see https://github.com/ethereum/EIPs/blob/master/EIPS/eip-721.md
*/ */
contract ERC721Full is Initializable, ERC721, ERC721Enumerable, ERC721Metadata { contract ERC721Full is Initializable, ERC721, ERC721Enumerable, ERC721Metadata {
function initialize(string memory name, string memory symbol) public initializer {
ERC721Metadata.initialize(name, symbol);
}
uint256[50] private ______gap; uint256[50] private ______gap;
} }
...@@ -15,17 +15,17 @@ import "./ERC721Pausable.sol"; ...@@ -15,17 +15,17 @@ import "./ERC721Pausable.sol";
contract StandaloneERC721 contract StandaloneERC721
is Initializable, ERC721, ERC721Enumerable, ERC721Metadata, ERC721MetadataMintable, ERC721Pausable is Initializable, ERC721, ERC721Enumerable, ERC721Metadata, ERC721MetadataMintable, ERC721Pausable
{ {
function initialize(string memory name, string memory symbol, address[] memory minters, address[] memory pausers, address sender) public initializer { function initialize(string memory name, string memory symbol, address[] memory minters, address[] memory pausers) public initializer {
ERC721.initialize(); ERC721.initialize();
ERC721Enumerable.initialize(); ERC721Enumerable.initialize();
ERC721Metadata.initialize(name, symbol); ERC721Metadata.initialize(name, symbol);
// Initialize the minter and pauser roles, and renounce them // Initialize the minter and pauser roles, and renounce them
ERC721MetadataMintable.initialize(sender); ERC721MetadataMintable.initialize(address(this));
_removeMinter(sender); _removeMinter(address(this));
ERC721Pausable.initialize(sender); ERC721Pausable.initialize(address(this));
_removePauser(sender); _removePauser(address(this));
// Add the requested minters and pausers (this can be done after renouncing since // Add the requested minters and pausers (this can be done after renouncing since
// these are the internal calls) // these are the internal calls)
......
{
"package_name": "zeppelin",
"version": "2.1.2",
"description": "Secure Smart Contract library for Solidity",
"authors": [
"OpenZeppelin Community <maintainers@openzeppelin.org>"
],
"keywords": [
"solidity",
"ethereum",
"smart",
"contracts",
"security",
"zeppelin"
],
"license": "MIT"
}
{ {
"name": "openzeppelin-eth", "name": "openzeppelin-eth",
"version": "2.1.2", "version": "2.1.3",
"lockfileVersion": 1, "lockfileVersion": 1,
"requires": true, "requires": true,
"dependencies": { "dependencies": {
...@@ -19722,6 +19722,31 @@ ...@@ -19722,6 +19722,31 @@
"ms": "^2.1.1" "ms": "^2.1.1"
} }
}, },
"ethereumjs-abi": {
"version": "0.6.6",
"resolved": "https://registry.npmjs.org/ethereumjs-abi/-/ethereumjs-abi-0.6.6.tgz",
"integrity": "sha512-w8KubDsA/+OAuqtIR9RGsMcoZ5nhM8vxwjJAJvEIY+clhxA3BHoLG3+ClYQaQhD0n3mlDt3U5rBrmSVJvI3c8A==",
"dev": true,
"requires": {
"bn.js": "^4.10.0",
"ethereumjs-util": "^5.0.0"
}
},
"ethereumjs-util": {
"version": "5.2.0",
"resolved": "https://registry.npmjs.org/ethereumjs-util/-/ethereumjs-util-5.2.0.tgz",
"integrity": "sha512-CJAKdI0wgMbQFLlLRtZKGcy/L6pzVRgelIZqRqNbuVFM3K9VEnyfbcvz0ncWMRNCe4kaHWjwRYQcYMucmwsnWA==",
"dev": true,
"requires": {
"bn.js": "^4.11.0",
"create-hash": "^1.1.2",
"ethjs-util": "^0.1.3",
"keccak": "^1.0.2",
"rlp": "^2.0.0",
"safe-buffer": "^5.1.1",
"secp256k1": "^3.0.1"
}
},
"ethjs-abi": { "ethjs-abi": {
"version": "0.1.8", "version": "0.1.8",
"resolved": "https://registry.npmjs.org/ethjs-abi/-/ethjs-abi-0.1.8.tgz", "resolved": "https://registry.npmjs.org/ethjs-abi/-/ethjs-abi-0.1.8.tgz",
......
{ {
"name": "openzeppelin-eth", "name": "openzeppelin-eth",
"version": "2.1.2", "version": "2.1.3",
"description": "Secure Smart Contract library for Solidity", "description": "Secure Smart Contract library for Solidity",
"files": [ "files": [
"build", "build",
......
const { shouldBehaveLikeERC20Mintable } = require('../token/ERC20/behaviors/ERC20Mintable.behavior');
const { BN } = require('openzeppelin-test-helpers');
const StandardToken = artifacts.require('StandardToken');
contract('StandardToken', function ([
_, deployer, initialHolder, minterA, minterB, pauserA, pauserB, anyone, ...otherAccounts
]) {
const name = 'StdToken';
const symbol = 'STDT';
const decimals = new BN('18');
const initialSupply = new BN('300');
const minters = [minterA, minterB];
const pausers = [pauserA, pauserB];
const ZERO_ADDRESS = '0x0000000000000000000000000000000000000000';
beforeEach(async function () {
this.token = await StandardToken.new({ from: deployer });
});
async function initialize (token, name, symbol, decimals, initialSupply, initialHolder, minters, pausers, from) {
const signature = 'initialize(string,string,uint8,uint256,address,address[],address[],address)';
const args = [name, symbol, decimals, initialSupply, initialHolder, minters, pausers, from];
await token.methods[signature](...args, { from });
}
context('with all arguments', function () {
beforeEach(async function () {
await initialize(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);
}
});
});
});
it('can be created with zero initial balance', async function () {
await initialize(this.token, name, symbol, decimals, new BN(0), ZERO_ADDRESS, minters, pausers, deployer);
(await this.token.balanceOf(initialHolder)).should.be.bignumber.equal('0');
});
it('can be created with no minters', async function () {
await initialize(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 initialize(this.token, name, symbol, decimals, initialSupply, initialHolder, minters, [], deployer);
for (const pauser of pausers) {
(await this.token.isPauser(pauser)).should.equal(false);
}
});
});
...@@ -23,14 +23,14 @@ contract('StandaloneERC20', function ([ ...@@ -23,14 +23,14 @@ contract('StandaloneERC20', function ([
}); });
async function initializeFull (token, name, symbol, decimals, initialSupply, initialHolder, minters, pausers, from) { async function initializeFull (token, name, symbol, decimals, initialSupply, initialHolder, minters, pausers, from) {
const signature = 'initialize(string,string,uint8,uint256,address,address[],address[],address)'; const signature = 'initialize(string,string,uint8,uint256,address,address[],address[])';
const args = [name, symbol, decimals, initialSupply, initialHolder, minters, pausers, from]; const args = [name, symbol, decimals, initialSupply, initialHolder, minters, pausers];
await token.methods[signature](...args, { from }); await token.methods[signature](...args, { from });
} }
async function initializePartial (token, name, symbol, decimals, minters, pausers, from) { async function initializePartial (token, name, symbol, decimals, minters, pausers, from) {
const signature = 'initialize(string,string,uint8,address[],address[],address)'; const signature = 'initialize(string,string,uint8,address[],address[])';
const args = [name, symbol, decimals, minters, pausers, from]; const args = [name, symbol, decimals, minters, pausers];
await token.methods[signature](...args, { from }); await token.methods[signature](...args, { from });
} }
......
...@@ -14,8 +14,8 @@ contract('StandaloneERC721', function ([_, deployer, minterA, minterB, pauserA, ...@@ -14,8 +14,8 @@ contract('StandaloneERC721', function ([_, deployer, minterA, minterB, pauserA,
}); });
async function initialize (token, name, symbol, minters, pausers, from) { async function initialize (token, name, symbol, minters, pausers, from) {
const signature = 'initialize(string,string,address[],address[],address)'; const signature = 'initialize(string,string,address[],address[])';
const args = [name, symbol, minters, pausers, from]; const args = [name, symbol, minters, pausers];
await token.methods[signature](...args, { from }); await token.methods[signature](...args, { from });
} }
......
...@@ -2,7 +2,7 @@ ...@@ -2,7 +2,7 @@
"zosversion": "2", "zosversion": "2",
"name": "openzeppelin-eth", "name": "openzeppelin-eth",
"publish": true, "publish": true,
"version": "2.1.2", "version": "2.1.3",
"contracts": { "contracts": {
"StandaloneERC20": "StandaloneERC20", "StandaloneERC20": "StandaloneERC20",
"StandaloneERC721": "StandaloneERC721", "StandaloneERC721": "StandaloneERC721",
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment