contract ZilRollToken is StandardToken, Pausable, Claimable, Destructible {
    string public constant name = "ZilRoll";
    string public constant symbol = "ZLR";
    uint8  public constant decimals = 18;
    
    uint256 public constant INITIAL_SUPPLY = 1000000000 * (10 ** uint256(decimals));
    
    /**
     * The listed addresses are not valid recipients of tokens.
     *
     * 0x0 - the zero address is not valid
     * this - the contract itself should not receive tokens
     * owner - the owner has all the initial tokens, but cannot receive any back
     */
    modifier validDestination(address to) {
        require(to != address(0x0));
        require(to != address(this));
        require(to != owner);
        _;
    }
    
    modifier isTradeable() {
        require(
            !paused ||
            msg.sender == owner
        );
        _;
    }
    
    /**
     * Constructor - instantiates token supply and allocates entire balance to the contract owner (msg.sender).
     */
    constructor() public {
        // Mint all tokens
        totalSupply_ = INITIAL_SUPPLY;
        balances[msg.sender] = totalSupply_;
        emit Transfer(address(0x0), msg.sender, totalSupply_);
    }
    
    // ERC20 Methods

    function transfer(address to, uint256 value) public validDestination(to) isTradeable returns (bool) {
        return super.transfer(to, value);
    }

    function transferFrom(address from, address to, uint256 value) public validDestination(to) isTradeable returns (bool) {
        return super.transferFrom(from, to, value);
    }

    function approve(address spender, uint256 value) public isTradeable returns (bool) {
        return super.approve(spender, value);
    }

    function increaseApproval(address spender, uint addedValue) public isTradeable returns (bool) {
        return super.increaseApproval(spender, addedValue);
    }

    function decreaseApproval(address spender, uint subtractedValue) public isTradeable returns (bool) {
        return super.decreaseApproval(spender, subtractedValue);
    }
    
    // Token Drain
    function emergencyERC20Drain(ERC20 token, uint256 amount) external onlyOwner {
        // Owner can drain tokens that are sent here by mistake
        token.transfer(owner, amount);
    }
}
/**
 * Zil Roll Token is used to fund the initial capital of ZillRoll, a provably-fair
 * and transparent dice gaming on the Zilliqa network. All profits (if any) shall be
 * periodically and proportionately distributed between token holders.
 */
function transfer(address to, uint256 value) public validDestination(to) isTradeable returns (bool) {
    return super.transfer(to, value);
}

// ERC20 Methods