Core Contracts

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

No crvUSD Balance Check Before Liquidation Transfer

Summary

The liquidateBorrower() function checks crvUSD balance before approval but not after, risking a revert in lendingPool.finalizeLiquidation() if reserves drop mid-transaction. This medium-impact, medium-likelihood issue could disrupt liquidations, leaving debts unresolved and destabilizing the pool.

Vulnerability Details

The function approves crvUSDToken but doesn’t recheck balance before finalizeLiquidation(). Example:

Pool has 1000 crvUSD; liquidation targets 1000 crvUSD debt.
Withdrawal drops balance to 400 crvUSD post-approval.
finalizeLiquidation() needs 1000 crvUSD, reverts, leaving debt intact.
Collateral value is lost without debt offset.

Impact

Unresolved debts (e.g., 1000 crvUSD) and lost collateral harm the pool, a medium-impact issue. The medium likelihood reflects concurrent transaction risks, common in active systems, threatening liquidation reliability.

Tools Used

Static Analysis Tools: Slither to detect missing post-approval checks.

Recommendations

Add post-approval balance and allowance checks:

function liquidateBorrower(address userAddress) external onlyManagerOrOwner nonReentrant whenNotPaused {
_update();
uint256 userDebt = lendingPool.getUserDebt(userAddress);
uint256 scaledUserDebt = WadRayMath.rayMul(userDebt, lendingPool.getNormalizedDebt());
if (userDebt == 0) revert InvalidAmount();
uint256 crvUSDBalance = crvUSDToken.balanceOf(address(this));
if (crvUSDBalance < scaledUserDebt) revert InsufficientBalance();
bool approveSuccess = crvUSDToken.approve(address(lendingPool), scaledUserDebt);
require(approveSuccess && crvUSDToken.allowance(address(this), address(lendingPool)) >= scaledUserDebt, "Approval failed or insufficient allowance");
lendingPool.updateState();
lendingPool.finalizeLiquidation(userAddress);
emit BorrowerLiquidated(userAddress, scaledUserDebt);
}
Updates

Lead Judging Commences

inallhonesty Lead Judge 4 months ago
Submission Judgement Published
Invalidated
Reason: Non-acceptable severity

Support

FAQs

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