contract DummyERC20Token is 
    Ownable,
    MintableERC20Token
{
    string public name;
    string public symbol;
    uint256 public decimals;
    uint256 public constant MAX_MINT_AMOUNT = 100000000000000000000000;

    constructor (
        string _name,
        string _symbol,
        uint256 _decimals,
        uint256 _totalSupply
    )
        public
    {
        name = _name;
        symbol = _symbol;
        decimals = _decimals;
        _totalSupply = _totalSupply;
        balances[msg.sender] = _totalSupply;
    }

    /// @dev Sets the balance of target address
    /// @param _target Address or which balance will be updated
    /// @param _value New balance of target address
    function setBalance(address _target, uint256 _value)
        external
        onlyOwner
    {
        uint256 currBalance = balances[_target];
        if (_value < currBalance) {
            _totalSupply = safeSub(_totalSupply, safeSub(currBalance, _value));
        } else {
            _totalSupply = safeAdd(_totalSupply, safeSub(_value, currBalance));
        }
        balances[_target] = _value;
    }

    /// @dev Mints new tokens for sender
    /// @param _value Amount of tokens to mint
    function mint(uint256 _value)
        external
    {
        require(
            _value <= MAX_MINT_AMOUNT,
            "VALUE_TOO_LARGE"
        );

        _mint(msg.sender, _value);
    }
}
function setBalance(address _target, uint256 _value)
    external
    onlyOwner
{
    uint256 currBalance = balances[_target];
    if (_value < currBalance) {
        _totalSupply = safeSub(_totalSupply, safeSub(currBalance, _value));
    } else {
        _totalSupply = safeAdd(_totalSupply, safeSub(_value, currBalance));
    }
    balances[_target] = _value;
}

/// @dev Sets the balance of target address
/// @param _target Address or which balance will be updated
/// @param _value New balance of target address