abstract contract InitializableStakingContract is Initializable, RawStakingContract {

    StakingInterfaceRouter router_;
    NuCypherToken public token;

    /**
    * @param _router Interface router contract address
    */
    function initialize(StakingInterfaceRouter _router) public initializer {
        router_ = _router;
        NuCypherToken localToken = _router.target().token();
        require(address(localToken) != address(0));
        token = localToken;
    }

    /**
    * @dev Returns address of StakingInterfaceRouter
    */
    function router() public view override returns (StakingInterfaceRouter) {
        return router_;
    }

}
/**
 * @notice Base class for any staking contract usable with openzeppelin proxy
 * @dev Implement `isFallbackAllowed()` or override fallback function
 * Implement `withdrawTokens(uint256)` and `withdrawETH()` functions
 */
function router() public view override returns (StakingInterfaceRouter) {
    return router_;
}

/**
 * @dev Returns address of StakingInterfaceRouter
 */