The LendingPool aims to maintain a liquidity buffer by rebalancing funds between the buffer (asset balance of RToken) and CurveVault. When a shortage occurs; asset balance of RToken < reserve.totalLiquidity, LendingPool::_rebalanceLiquidity calculates the shortfall and calls _withdrawFromVault to withdraw this amount from CurveVault,
However, it does not transfer the withdrawn assets back to RToken, leaving the currentBuffer; the reserve asset balance in RToken - unchanged.
This failure to transfer creates a persistent liquidity shortage. Each subsequent call to _rebalanceLiquidity, triggered by user operations such as deposit, withdraw or borrow, detects the same unresolved shortage and attempts to withdraw the shortage from the CurveVault again. The repetitive withdrawls deplete the Vault's liquidity, and once exhausted, a revert would happen (e.g., reverting due to insufficient funds), causing _rebalanceLiquidity to revert.
Even if the Vault isn't totally exhausted, _withdrawFromVault would still revert due to underflow from amount being greater than totalVaultDeposits when repetitive withdrawals occur,
Since _rebalanceLiquidity is integral to deposits, withdrawals and potential borrows which call ensureLiquidity to cover shortage, this failure results in a DoS, blocking users from interacting with the protocol.
The liquidity won't be trapped in the protocol since the owner can always call LendingPool::rescueToken to send tokens over to RToken, but that's a manual process, and during cases of high traffic, a DoS is bound to happen.
Users interacting with protocol would repeatedly face DoS, and the protocol would be unable to function properly.
Manual Review
Transfer the withdrawn assets back to RToken to update the currentBuffer and prevent the DoS.
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
Appeals are being carefully reviewed by our judges.