```\n  function _requestWithdrawal(uint256 _sTokenAmount) internal {\n    uint256 _sTokenBalance = balanceOf(msg.sender);\n    if (_sTokenAmount > _sTokenBalance) {\n      revert InsufficientSTokenBalance(msg.sender, _sTokenBalance);\n    }\n\n    /// Get current cycle index for this pool\n    uint256 _currentCycleIndex = poolCycleManager.getCurrentCycleIndex(\n      address(this)\n    );\n\n    /// Actual withdrawal is allowed in open period of cycle after next cycle\n    /// For example: if request is made in at some time in cycle 1,\n    /// then withdrawal is allowed in open period of cycle 3\n    uint256 _withdrawalCycleIndex = _currentCycleIndex + 2;\n\n    WithdrawalCycleDetail storage withdrawalCycle = withdrawalCycleDetails[\n      _withdrawalCycleIndex\n    ];\n\n    /// Cache existing requested amount for the cycle for the sender\n    uint256 _oldRequestAmount = withdrawalCycle.withdrawalRequests[msg.sender];\n    withdrawalCycle.withdrawalRequests[msg.sender] = _sTokenAmount;\n\n    unchecked {\n      /// Update total requested withdrawal amount for the cycle considering existing requested amount\n      if (_oldRequestAmount > _sTokenAmount) {\n        withdrawalCycle.totalSTokenRequested -= (_oldRequestAmount -\n          _sTokenAmount);\n      } else {\n        withdrawalCycle.totalSTokenRequested += (_sTokenAmount -\n          _oldRequestAmount);\n      }\n    }\n\n    emit WithdrawalRequested(msg.sender, _sTokenAmount, _withdrawalCycleIndex);\n  }\n```\n