contract GCCDiscreteToken is GCCOracleProofConsumer, ERC20Detailed, ERC20Burnable, ERC20StakableDiscreetly, Pausable {

    function initialize(
        address sender, string memory name, string memory symbol, uint8 decimals, uint256 minTotalSupply, uint256 maxTotalSupply,
        uint256 provableSupply
    ) public initializer {
        GCCOracleProofConsumer.initialize(sender, provableSupply);
        ERC20Detailed.initialize(name, symbol, decimals);
        ERC20StakableDiscreetly.initialize(sender, minTotalSupply, maxTotalSupply, decimals);
        Pausable.initialize(sender);
    }

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

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

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

    function increaseAllowance(address spender, uint256 addedValue) public whenNotPaused returns (bool) {
        return super.increaseAllowance(spender, addedValue);
    }

    function decreaseAllowance(address spender, uint256 subtractedValue) public whenNotPaused returns (bool) {
        return super.decreaseAllowance(spender, subtractedValue);
    }

    function restake() public whenNotPaused returns (bool) {
        return super.restake();
    }

    function stake(uint256 amount) public whenNotPaused returns (bool) {
        return super.stake(amount);
    }

    function stakeAll() public whenNotPaused returns (bool) {
        return super.stakeAll();
    }

    function unstake(uint256 amount) public whenNotPaused returns (bool) {
        return super.unstake(amount);
    }

    function unstakeAll() public whenNotPaused returns (bool) {
        return super.unstakeAll();
    }

    function withdrawReward() public whenNotPaused returns (bool) {
        return super.withdrawReward();
    }

    function estimateReward() public view whenNotPaused returns (uint256) {
        return super.estimateReward();
    }

    /**
     * @dev Hook to execute when proving amount
     */
    function _afterConsumeProofs(address account, uint256 amount) internal {
        _mint(account, amount);
    }

    //uint256[50] private ______gap;
}
function _afterConsumeProofs(address account, uint256 amount) internal {
    _mint(account, amount);
}

/**
 * @dev Hook to execute when proving amount
 */