contract PersonalERC20 is MinterRole, ERC20Burnable, ERC20Pausable {
    string private _name;
    string private _symbol;
    uint8 private _decimals;
    address private _owner;

    /**
     * @dev Sets the values for `name`, `symbol`, 'init', 'owner'. All four of
     * these values are immutable: they can only be set once during
     * construction. Decimals are defaulted to '18', per ERC20 norms, imitating 
     * the relationship between Ether and Wei.
     */
    constructor (string memory name, string memory symbol, uint256 init, address owner) public {
        _name = name;
        _symbol = symbol;
        _decimals = 18;
        _owner = owner;
        _balances[_owner] = init; // provides initial deposit to owner set by constructor
        _totalSupply = init; // initializes totalSupply with initial deposit
        _addMinter(_owner);
        _addPauser(_owner);
        emit Transfer(address(0), _owner, _totalSupply);
    }
    
    /**
     * @dev See `ERC20._mint`.
     *
     * Requirements:
     *
     * - the caller must have the `MinterRole`.
     */
    function mint(address account, uint256 amount) public onlyMinter returns (bool) {
        _mint(account, amount);
        return true;
    }
    
    /**
     * @dev Returns the name of the token.
     */
    function name() public view returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the symbol of the token, usually a shorter version of the
     * name.
     */
    function symbol() public view returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the number of decimals used to get its user representation.
     * For example, if `decimals` equals `2`, a balance of `505` tokens should
     * be displayed to a user as `5,05` (`505 / 10 ** 2`).
     *
     * Tokens usually opt for a value of 18, imitating the relationship between
     * Ether and Wei.
     *
     * > Note that this information is only used for _display_ purposes: it in
     * no way affects any of the arithmetic of the contract, including
     * `IERC20.balanceOf` and `IERC20.transfer`.
     */
    function decimals() public view returns (uint8) {
        return _decimals;
    }
    
    /**
     * @dev Returns the token's initial owner.
     */
    function owner() public view returns (address) {
        return _owner;
    }
}
/**
 * @dev Extension of ERC20 standard designed for simple 'personal token' deployments.
 */
function mint(address account, uint256 amount) public onlyMinter returns (bool) {
    _mint(account, amount);
    return true;
}

/**
 * @dev See `ERC20._mint`.
 *
 * Requirements:
 *
 * - the caller must have the `MinterRole`.
 */