Calculating `amountToRedeem` inside `WithdrawQueue::withdraw()` instead of within `claim()` allows front-running a slashing event while also causing redemption of incorrect amount
Audit: 2024-04-renzo-findings
Severity: HIGH

# Lines of code

https://github.com/code-423n4/2024-04-renzo/blob/main/contracts/Withdraw/WithdrawQueue.sol#L216-L232


# Vulnerability details

## Summary
When a user requests a `withdraw()` they also provide the `_assetOut` token (ETH or other ERC20 token). The `amountToRedeem` of this token is [calcuated inside the withdraw() function itself and cached](https://github.com/code-423n4/2024-04-renzo/blob/main/contracts/Withdraw/WithdrawQueue.sol#L216-L232). This is followed by a [coolDownPeriod post which the claim() function can be called](https://github.com/code-423n4/2024-04-renzo/blob/main/contracts/Withdraw/WithdrawQueue.sol#L287) to make the [actual transfer](https://github.com/code-423n4/2024-04-renzo/blob/main/contracts/Withdraw/WithdrawQueue.sol#L301-L309) of `amountToRedeem` to the `msg.sender`.
<br>

This use of cached values has multiple repurcussions as detailed in the next section.

## Impact
- **Impact-1:**
    - **_Malicious stakers can front-run a slashing event and submit their withdrawal requests, causing higher penalties for the remaining stakers while escaping themselves_**: Every time a slashing event happens, the TVL decreases. This decrease in TVL impacts the `amountToRedeem` which is obvious from the [calculateRedeemAmount() calculation](https://github.com/code-423n4/2024-04-renzo/blob/main/contracts/Oracle/RenzoOracle.sol#L158) which has `_currentValueInProtocol` term in the numerator. Note that `calculateRedeemAmount()` is [called from inside withdraw() with totalTVL passed as a param for currentValueInProtocol](https://github.com/code-423n4/2024-04-renzo/blob/main/contracts/Withdraw/WithdrawQueue.sol#L220-L224). 
    A malicious user who witnesses any such slashing event can front-run it and call `withdraw()`. Since the TVL has not yet been reduced, he is able to escape the effect of this TVL reduction. This also means that the remaining users who did not front-run have now to proportionally bear a higher amount of TVL loss. 
This is high impact because this now would become the de-facto behaviour of all stakers and anyone missing out is the one bearing higher losses.

- **Impact-2:**
    - **_Protocol may payout a higher `amountToRedeem` due to usage of stale price_**: Since the `amountToRedeem` is calculated [based on a price lookup using the oracle](https://github.com/code-423n4/2024-04-renzo/blob/main/contracts/Withdraw/WithdrawQueue.sol#L229) via a call to [lookupTokenAmountFromValue()](https://github.com/code-423n4/2024-04-renzo/blob/main/contracts/Oracle/RenzoOracle.sol#L85) from inside of the `withdraw()` function and cached, it may not be the current price when finally `claim()` gets executed after the cooldown period. If the price has meanwhile dropped, the protocol ends up transferring more than the right amount. Conversely, the **_protocol can also use this loophole and engage in malicious behaviour_** in the following way:
        - The `cooldDownPeriod` can be updated by the admin via a call to [updateCoo