Core Contracts

Regnum Aurum Acquisition Corp
HardhatReal World AssetsNFT
77,280 USDC
View results
Submission Details
Severity: medium
Valid

The protocol does not rebalance liquidity after repay and liquidate.

Summary

The protocol does not rebalance liquidity after repay and liquidate.

Vulnerability Details

LendingPool.sol#_rebalanceLiquidity() function is as follows.

function _rebalanceLiquidity() internal {
// if curve vault is not set, do nothing
if (address(curveVault) == address(0)) {
return;
}
uint256 totalDeposits = reserve.totalLiquidity; // Total liquidity in the system
uint256 desiredBuffer = totalDeposits.percentMul(liquidityBufferRatio);
uint256 currentBuffer = IERC20(reserve.reserveAssetAddress).balanceOf(reserve.reserveRTokenAddress);
if (currentBuffer > desiredBuffer) {
uint256 excess = currentBuffer - desiredBuffer;
// Deposit excess into the Curve vault
_depositIntoVault(excess);
} else if (currentBuffer < desiredBuffer) {
uint256 shortage = desiredBuffer - currentBuffer;
// Withdraw shortage from the Curve vault
_withdrawFromVault(shortage);
}
emit LiquidityRebalanced(currentBuffer, totalVaultDeposits);
}

As we can see above, upper function rebalances liquidty with curve vault.
LendingPool.sol#deposit, withdraw, borrow functions rebalance liquidity.
But LendingPool.sol#_repay(), finalizeLiquidation() functions does not rebalance liquidity.
This is wrong.

Impact

This vulnerability will cause less yield.

Tools Used

Manual review

Recommendations

We have to modify LendingPool.sol#_repay(), finalizeLiquidation() so that they rebalance liquidity at the end.

Updates

Lead Judging Commences

inallhonesty Lead Judge 7 months ago
Submission Judgement Published
Validated
Assigned finding tags:

LendingPool::finalizeLiquidation or repay doesn't call _rebalanceLiquidity, leaving excess funds idle instead of depositing them in Curve vault for yield

Support

FAQs

Can't find an answer? Chat with us on Discord, Twitter or Linkedin.

Give us feedback!