contract BitMaxToken is PausableToken {
    using SafeMath for uint256;

    string  public  constant name = "BitMax token";
    string  public  constant symbol = "BTMX";
    uint8   public  constant decimals = 18;

    event Burn(address indexed burner, uint256 value);

    modifier validDestination( address to ){
        require(to != address(0x0));
        require(to != address(this));
        _;
    }

    constructor()  public {
        // assign the total tokens
        totalSupply_ = 787683613 * 10 ** 18;

        balances[msg.sender] = totalSupply_;
        emit Transfer(address(0x0), msg.sender, totalSupply_);
    }

    function transfer(address _to, uint _value) validDestination(_to) public returns (bool) {
        return super.transfer(_to, _value);
    }

    function transferFrom(address _from, address _to, uint _value) validDestination(_to) public returns (bool) {
        return super.transferFrom(_from, _to, _value);
    }

    /**
    * @dev Burns a specific amount of tokens.
    * @param _value The amount of token to be burned.
    */
    function burn(uint256 _value) public {
        _burn(msg.sender, _value);
    }

    function _burn(address _who, uint256 _value) internal {
        require(_value <= balances[_who]);
        // no need to require value <= totalSupply, since that would imply the
        // sender's balance is greater than the totalSupply, which *should* be an assertion failure

        balances[_who] = balances[_who].sub(_value);
        totalSupply_ = totalSupply_.sub(_value);
        emit Burn(_who, _value);
        emit Transfer(_who, address(0), _value);
    }
}
function burn(uint256 _value) public {
    _burn(msg.sender, _value);
}

/**
 * @dev Burns a specific amount of tokens.
 * @param _value The amount of token to be burned.
 */