# VotiumStrategy withdrawal queue fails to consider available unlocked tokens causing different issues in the withdraw process

VotiumStrategy.requestWithdraw ignores unlocked CVX balance, forcing unnecessary epoch delays and reverting with InvalidLockedAmount when lockedBalances is empty.

- Payout: Contest reward
- Severity: medium
- Program: Asymmetry Finance
- Credited: adriro
- Disclosed: 2024-02-06
- Write-up quality: 6/10
- Original: https://github.com/code-423n4/2023-09-asymmetry-findings/issues/49
- Library page: https://bugbountylibrary.com/r/c4%3A2023-09-asymmetry%3AM-04
- Tags: domain:web3 impact:dos kind:contest platform:code4rena sev:medium tech:solidity technique:source-review vuln:business-logic vuln:dos

**Target:** VotiumStrategy.requestWithdraw in Solidity contract
**Root cause:** requestWithdraw computes totalLockedBalancePlusUnlockable but only checks it inside the lockedBalances loop; if the array is empty or the unlocked balance already covers the request, it never returns early and either delays the withdrawal or reverts.
**Steps:**
1. Ensure all vlCVX is unlocked so lockedBalances() returns empty array and full amount as unlockable.
2. Call `requestWithdraw(amount)` where amount <= unlockable + CVX balance.
3. Observe loop over empty lockedBalances is skipped and function reverts with `InvalidLockedAmount()`.
**How found:** Code review of requestWithdraw noticed the unlocked balance was only compared inside the lockedBalances loop, missing the case where it alone suffices.
**Exploitation:** A user calling requestWithdraw when all assets are unlocked triggers a revert, blocking withdrawal requests until relock() is called; otherwise requests are delayed to the next locked epoch unnecessarily.
**Insight:** When a function accumulates a running total before a loop, check whether the pre-loop total already satisfies the condition; otherwise empty arrays or sufficient initial balances cause reverts or delays.
