OpenZeppelinのv2.0.0 への対応版 ( https://qiita.com/infinith4/items/199a54dd416eaa1dee51 はv1.12.0版)
$ mkdir erc20_zeppelin2_token
$ cd erc20_zeppelin2_token/
$ truffle init
$ npm init -y
$ npm i --save-exact openzeppelin-solidity
contract
contracts/E20Z2Token.sol
pragma solidity ^0.4.23;
import "../node_modules/openzeppelin-solidity/contracts/token/ERC20/ERC20.sol";
//import "../node_modules/openzeppelin-solidity/contracts/token/ERC20/ERC20Detailed.sol";
import "../node_modules/openzeppelin-solidity/contracts/token/ERC20/ERC20Mintable.sol";
import "../node_modules/openzeppelin-solidity/contracts/token/ERC20/ERC20Burnable.sol";
import "../node_modules/openzeppelin-solidity/contracts/token/ERC20/ERC20Detailed.sol";
contract E20Z2Token is ERC20, ERC20Mintable, ERC20Burnable, ERC20Detailed {
string private _name = "E20Z2Token";
string private _symbol = "Z2T";
uint8 private _decimals = 18;
address account = msg.sender;
constructor(uint value)
ERC20Detailed(_name, _symbol, _decimals)
ERC20Burnable()
ERC20Mintable()
public
{
_mint(account, value);
}
}
migration
migrations/2_deploy_e20z2_token.js
var E20Z2Token = artifacts.require("./E20Z2Token.sol")
module.exports = function(deployer) {
var initialSupply = 100000;
deployer.deploy(E20Z2Token, initialSupply);
}
test
test/E20Z2Token.js
var E20Z2Token = artifacts.require("E20Z2Token.sol");
contract('E20Z2Token', function(accounts) {
it("account[0] own 100000 E20Z2Token.", function() {
return E20Z2Token.deployed().then(function(instance) {
return instance.balanceOf.call(accounts[0]);
}).then(function(balance) {
assert.equal(balance.valueOf(), 100000, "account[0] don't own 100000");
});
});
});
$ truffle develop
truffle(develop)> test
Using network 'develop'.
Compiling ./contracts/E20Z2Token.sol...
Compiling ./node_modules/openzeppelin-solidity/contracts/access/Roles.sol...
Compiling ./node_modules/openzeppelin-solidity/contracts/access/roles/MinterRole.sol...
Compiling ./node_modules/openzeppelin-solidity/contracts/math/SafeMath.sol...
Compiling ./node_modules/openzeppelin-solidity/contracts/token/ERC20/ERC20.sol...
Compiling ./node_modules/openzeppelin-solidity/contracts/token/ERC20/ERC20Burnable.sol...
Compiling ./node_modules/openzeppelin-solidity/contracts/token/ERC20/ERC20Detailed.sol...
Compiling ./node_modules/openzeppelin-solidity/contracts/token/ERC20/ERC20Mintable.sol...
Compiling ./node_modules/openzeppelin-solidity/contracts/token/ERC20/IERC20.sol...
Contract: E20Z2Token
✓ account[0] own 100000 E20Z2Token.
1 passing (126ms)
truffle(develop)> migrate
Compiling ./contracts/E20Z2Token.sol...
Compiling ./node_modules/openzeppelin-solidity/contracts/access/Roles.sol...
Compiling ./node_modules/openzeppelin-solidity/contracts/access/roles/MinterRole.sol...
Compiling ./node_modules/openzeppelin-solidity/contracts/math/SafeMath.sol...
Compiling ./node_modules/openzeppelin-solidity/contracts/token/ERC20/ERC20.sol...
Compiling ./node_modules/openzeppelin-solidity/contracts/token/ERC20/ERC20Burnable.sol...
Compiling ./node_modules/openzeppelin-solidity/contracts/token/ERC20/ERC20Detailed.sol...
Compiling ./node_modules/openzeppelin-solidity/contracts/token/ERC20/ERC20Mintable.sol...
Compiling ./node_modules/openzeppelin-solidity/contracts/token/ERC20/IERC20.sol...
Writing artifacts to ./build/contracts
Using network 'develop'.
Running migration: 2_deploy_e20z2_token.js
Deploying E20Z2Token...
... 0x93a83d9720d735e16d964f4c1a364c639279eb0f4ce9efa629800def1a1a79df
E20Z2Token: 0xd95b1dbec167c6cf547d018ddecf41a4cb2e2f73
Saving successful migration to network...
... 0xfc97643e2ba3f4a79580184ceb5ab1f882f0827f4c36feda08d92cfd4c833f1e
Saving artifacts..
送金
$ truffle develop
truffle(develop)> migrate
truffle(develop)> e20z2Token = E20Z2Token.at(E20Z2Token.address)
truffle(develop)> e20z2Token.name()
'E20Z2Token'
truffle(develop)> e20z2Token.symbol()
'Z2T'
truffle(develop)> e20z2Token.totalSupply()
BigNumber { s: 1, e: 5, c: [ 100000 ] }
truffle(develop)> e20z2Token.balanceOf(web3.eth.accounts[0])
BigNumber { s: 1, e: 5, c: [ 100000 ] }
truffle(develop)> e20z2Token.balanceOf(web3.eth.accounts[1])
BigNumber { s: 1, e: 0, c: [ 0 ] }
truffle(develop)> e20z2Token.transfer(web3.eth.accounts[1], 10)
{ tx: '0x016a269aab91313529d7f13b540ca9cf55dd767a7a223b86e938c72aada5f363',
receipt:
{ transactionHash: '0x016a269aab91313529d7f13b540ca9cf55dd767a7a223b86e938c72aada5f363',
transactionIndex: 0,
blockHash: '0x26d27224a937f09edcba068678f725b297f23ebcb9094e4930bb820e15070137',
blockNumber: 61,
gasUsed: 51739,
cumulativeGasUsed: 51739,
contractAddress: null,
logs: [ [Object] ],
status: '0x01',
logsBloom: '0x00000000000000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000100000000000000000000000000000000010000008000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000030000000000000000000010000000000000000000000000000000000000000010000000002000000000000000000000000002000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000' },
logs:
[ { logIndex: 0,
transactionIndex: 0,
transactionHash: '0x016a269aab91313529d7f13b540ca9cf55dd767a7a223b86e938c72aada5f363',
blockHash: '0x26d27224a937f09edcba068678f725b297f23ebcb9094e4930bb820e15070137',
blockNumber: 61,
address: '0xd95b1dbec167c6cf547d018ddecf41a4cb2e2f73',
type: 'mined',
event: 'Transfer',
args: [Object] } ] }
truffle(develop)> e20z2Token.balanceOf(web3.eth.accounts[0])
BigNumber { s: 1, e: 4, c: [ 99990 ] }
truffle(develop)> e20z2Token.balanceOf(web3.eth.accounts[1])
BigNumber { s: 1, e: 1, c: [ 10 ] }
Source Code:
https://github.com/tys-hiroshi/dapps/tree/master/erc20_zeppelin2_token
参考
https://qiita.com/toshiaki_takase/items/75fe140f78e03aa5f732