Core Contracts

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

Lack of Incentives to Initiate Liquidation for Small Positions

Summary

The initiateLiquidation function does not provide sufficient incentives for liquidators to initiate the liquidation process for small or undercollateralized positions. As a result, liquidators may avoid initiating liquidations for small positions due to the high gas costs and low rewards, leaving these positions un-liquidated and increasing the risk to the protocol.

Vulnerability Details

Root Cause:

  • The initiateLiquidation function does not include any mechanism to reward liquidators for initiating the liquidation process.

  • Liquidators incur gas costs when calling initiateLiquidation, but there is no direct incentive to compensate them for this action.

  • Small positions may remain un-liquidated because liquidators prioritize larger positions with higher potential rewards.

Impact

Increased Risk: Small or undercollateralized positions may remain un-liquidated, increasing the risk to the protocol and other users.

  • Inefficient Liquidation: Liquidators may avoid initiating liquidations for small positions, leading to inefficiencies in the liquidation process.

  • Loss of Trust: Users may lose trust in the protocol if small positions are not liquidated in a timely manner.

PoC

  1. A user's health factor falls below the liquidation threshold, and their position becomes eligible for liquidation.

  2. The position is small, and the potential rewards for liquidating it are less than the gas costs of initiating the liquidation.

  3. Liquidators avoid initiating the liquidation due to the lack of incentives.

  4. The user's position remains un-liquidated, increasing the risk to the protocol and other users.

Tools Used

Manual Review

Recommendations

Introduce Liquidation Initiation Incentives:

  • Provide a reward to the liquidator who initiates the liquidation process in the initiateLiquidation function.

  • The reward can be a fixed amount or a percentage of the debt being liquidated.

  • Example:

uint256 public constant INITIATION_REWARD = 0.01 ether; // Fixed reward for initiating liquidation

2. Dynamic Initiation Rewards:

  • Implement a dynamic reward mechanism that adjusts the initiation reward based on the size of the position.

  • Example:

function calculateInitiationReward(uint256 debtAmount) internal pure returns (uint256) {
uint256 baseReward = debtAmount / 100; // 1% of the debt amount
return baseReward > MIN_INITIATION_REWARD ? baseReward : MIN_INITIATION_REWARD;
}

Transfer Rewards to Liquidators:

  • Transfer the initiation reward to the liquidator when they call initiateLiquidation.

  • Example:

function initiateLiquidation(address userAddress) external nonReentrant whenNotPaused {
if (userAddress == address(0)) revert InvalidAddress();
UserData storage user = userData[userAddress];
if (user.scaledDebtBalance == 0) revert UserNotFound();
if (user.underLiquidation) revert UserAlreadyUnderLiquidation();
// Update reserve state
ReserveLibrary.updateReserveState(reserve, rateData);
// Calculate health factor
uint256 healthFactor = calculateHealthFactor(userAddress);
if (healthFactor >= healthFactorLiquidationThreshold) revert HealthFactorAboveThreshold();
// Calculate initiation reward
uint256 initiationReward = calculateInitiationReward(user.scaledDebtBalance.rayMul(reserve.usageIndex));
// Transfer reward to the liquidator
IERC20(reserve.reserveAssetAddress).safeTransfer(msg.sender, initiationReward);
// Initiate liquidation
user.underLiquidation = true;
user.liquidationStartTime = block.timestamp;
emit LiquidationInitiated(msg.sender, userAddress, initiationReward);
}
Updates

Lead Judging Commences

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

Appeal created

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

No incentive to liquidate

Support

FAQs

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