Users unable to withdraw their funds due to FRAX admin action
FRAX admin action can lead to the fund of Naiper protocol and its users being stuck, resulting in users being unable to withdraw their assets.\\nPer the contest page, the admins of the protocols that Napier integrates with are considered "RESTRICTED". This means that any issue related to FRAX's admin action that could negatively affect Napier protocol/users will be considered valid in this audit contest.\\nQ: Are the admins of the protocols your contracts integrate with (if any) TRUSTED or RESTRICTED? RESTRICTED\\nWhen the Adaptor needs to unstake its staked ETH to replenish its ETH buffer so that users can redeem/withdraw their funds, it will first join the FRAX's redemption queue, and the queue will issue a redemption NFT afterward. After a certain period, the adaptor can claim their ETH by burning the redemption NFT at Line 65 via the `burnRedemptionTicketNft` function.\\n```\\nFile: SFrxETHAdapter.sol\\n    function claimWithdrawal() external override {\\n        uint256 _requestId = requestId;\\n        uint256 _withdrawalQueueEth = withdrawalQueueEth;\\n        if (_requestId == 0) revert NoPendingWithdrawal();\\n\\n        /// WRITE ///\\n        delete withdrawalQueueEth;\\n        delete requestId;\\n        bufferEth += _withdrawalQueueEth.toUint128();\\n\\n        /// INTERACT ///\\n        uint256 balanceBefore = address(this).balance;\\n        REDEMPTION_QUEUE.burnRedemptionTicketNft(_requestId, payable(this));\\n        if (address(this).balance < balanceBefore + _withdrawalQueueEth) revert InvariantViolation();\\n\\n        IWETH9(Constants.WETH).deposit{value: _withdrawalQueueEth}();\\n    }\\n```\\n\\nHowever, it is possible for FRAX's admin to disrupt the redemption process of the adaptor, resulting in Napier users being unable to withdraw their funds. When the `burnRedemptionTicketNft` function is executed, the redemption NFT will be burned, and native ETH residing in the `FraxEtherRedemptionQueue` contract will be sent to the adaptor at Line 498 below\\n```\\nFile: FraxEtherRedemptionQueue.sol\\n    function burnRedemptionTicketNft(uint256 _nftId, address payable _recipient) external nonReentrant {\\n..SNIP..\\n        // Effects: Burn frxEth to match the amount of ether sent to user 1:1\\n        FRX_ETH.burn(_redemptionQueueItem.amount);\\n\\n        // Interactions: Transfer ETH to recipient, minus the fee\\n        (bool _success, ) = _recipient.call{ value: _redemptionQueueItem.amount }("");\\n        if (!_success) revert InvalidEthTransfer();\\n```\\n\\nFRAX admin could execute the `recoverEther` function to transfer out all the Native ETH residing in the `FraxEtherRedemptionQueue` contract, resulting in the NFT redemption failing due to lack of ETH.\\n```\\nFile: FraxEtherRedemptionQueue.sol\\n    /// @notice Recover ETH from exits where people early exited their NFT for frxETH, or when someone mistakenly directly sends ETH here\\n    /// @param _amount Amount of ETH to recover\\n    function recoverEther(uint256 _amount) external {\\n        _requireSenderIsTimelock();\\n\\n        (bool _success, ) = address(msg.sender).call{ value: _amount }("");\\n        if (!_success) revert InvalidEthTransfer();\\n\\n        emit RecoverEther({ recipient: msg.sender, amount: _amount });\\n    }\\n```\\n\\nAs a result, Napier users will not be able to withdraw their funds.
Ensure that the protocol team and its users are aware of the risks of such an event and develop a contingency plan to manage it.
The fund of Naiper protocol and its users will be stuck, resulting in users being unable to withdraw their assets.
```\\nFile: SFrxETHAdapter.sol\\n    function claimWithdrawal() external override {\\n        uint256 _requestId = requestId;\\n        uint256 _withdrawalQueueEth = withdrawalQueueEth;\\n        if (_requestId == 0) revert NoPendingWithdrawal();\\n\\n        /// WRITE ///\\n        delete withdrawalQueueEth;\\n        delete requestId;\\n        bufferEth += _withdrawalQueueEth.toUint128();\\n\\n        /// INTERACT ///\\n        uint256 balanceBefore = address(this).balance;\\n        REDEMPTION_QUEUE.burnRedemptionTicketNft(_requestId, payable(this));\\n        if (address(this).balance < balanceBefore + _withdrawalQueueEth) revert InvariantViolation();\\n\\n        IWETH9(Constants.WETH).deposit{value: _withdrawalQueueEth}();\\n    }\\n```\\n