Voyage > Business Logic > LiquidityFacet.sol

The maxWithdraw functionality is broken

Low Severity
Low Impact
High Likelihood

Description

Depositors will be unable to use the intended maxWithdraw functionality in withdraw(...):

uint256 userBalance = vToken.maxWithdraw(msg.sender);
uint256 amountToWithdraw = _amount;
if (_amount == type(uint256).max) {
    amountToWithdraw = userBalance;
}
BorrowState storage borrowState = LibAppStorage.ds()._borrowState[
    _collection
][reserve.currency];
uint256 totalDebt = borrowState.totalDebt + borrowState.totalInterest;
uint256 avgBorrowRate = borrowState.avgBorrowRate;
IVToken(vToken).withdraw(_amount, msg.sender, msg.sender);

Impact

Users will need to make withdraw requests for exact amounts in order to retrieve all of their deposited funds. If the _amount provided in the function call exceeds the available balance, the function will fail with no clear error message. This can create a frustrating and unexpected user experience.

Recommendations

Change

IVToken(vToken).withdraw(_amount, msg.sender, msg.sender);

to

IVToken(vToken).withdraw(amountToWithdraw, msg.sender, msg.sender);

Also, modify the _amount check to the following:

if (_amount == type(uint256).max || _amount > userBalance) {
    amountToWithdraw = userBalance;
}

Remediation

Commits aac23ae9 and 0e00c990 were indicated as containing the remediation. The commits correctly fix the issue by applying the suggested remediations.