Admin will not be able to only pause deposits in the Vault due to incorrect check leading to DoSed withdrawals
Summary
The modifier LVDepositNotPaused in Vault::depositLv() checks states[id].vault.config.isWithdrawalPaused instead of states[id].vault.config.isDepositPaused, which means deposits will only be paused if withdrawals are paused, DoSing withdrawals.
Root Cause
In ModuleState:109, it checks states[id].vault.config.isWithdrawalPaused when it should check states[id].vault.config.isDepositPaused.
Internal pre-conditions
- Admin pauses deposits.
External pre-conditions
None.
Attack Path
- Admin sets deposits paused, but deposits are not actually paused due to the incorrect modifier.
- Admin either leaves deposits unpaused or pauses both deposits and withdrawals, DoSing withdrawals.
Impact
Admin is not able to pause deposits alone which would lead to loss of funds as this is an emergency mechanism. If the admin wants to pause deposits, withdrawals would also have to be paused, DoSing withdrawals.
PoC
ModuleState::LVDepositNotPaused() is incorrect:
modifier LVDepositNotPaused(Id id) {
if (states[id].vault.config.isWithdrawalPaused) { //@audit isDepositPaused
revert LVDepositPaused();
}
_;
}Mitigation
ModuleState::LVDepositNotPaused() should be:
modifier LVDepositNotPaused(Id id) {
if (states[id].vault.config.isDepositPaused) {
revert LVDepositPaused();
}
_;
}