OpenZeppelin2のERC20Capped解説

OpenZeppelinのバージョン2系でERC20を実装するとき、ERC20Cappedを継承すると、トークンの総数の上限を設定することができます。

pragma solidity ^0.4.25;

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/ERC20Capped.sol";

// ERC20CappedはERC20Mintableを継承しているので、
// コントラクト配置後もトークンを増やすことができます。
contract NeruneCoin is ERC20, ERC20Burnable, ERC20Detailed, ERC20Capped {
    string private _name = "NeruneCoin";
    string private _symbol = "NRNC";
    uint8 private _decimals = 18;

    address account = msg.sender;
    uint value = 1000;

    constructor()
    ERC20Detailed( _name, _symbol, _decimals)
    ERC20Burnable()
    // ERC20Cappedコンストラクタの引数に、のトークンの総量を設定
    ERC20Capped(10000) 
    public {
        // ここでこのトークンの初期量を定めている。この値が上記の総量を上回ると、
        // コントラクト配置時(truffleではmigrateコマンド発行時)にエラーが発生する。
        _mint(account, value);
    }
}
# 総数を10000に設定し、初期トークンをaccount[0]のみに1000付与しているとする。

truffle(development)> c = NeruneCoin.at(NeruneCoin.address)
truffle(development)> c.mint(web3.eth.accounts[0], 9000)

# OK.総数が10000に。

truffle(development)> c.mint(web3.eth.accounts[0], 1)

# ERROR. 総数が10000をこえてしまうから。

truffle(development)> c.transfer(web3.eth.accounts[1], 1000)
truffle(development)> c.mint(web3.eth.accounts[0], 1)

# ERROR. トークンを他のアカウントに渡してもだめ。アカウントごとの上限ではなく、総数に対する上限である為。