Core Contracts

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

Wrong calculation of getLiquidityRate

Summary

The getLiquidityRate function incorrectly calculates the value of total Debt. The normalized debt index is used directly instead of the actual total debt amount, leading to severely underestimated utilization rates and incorrect interest rate calculations.

Vulnerability Details

In the ReserveLibrary, getLiquidityRate function incorrectly use the normalized debt index as the total debt amount:

function getLiquidityRate(ReserveData storage reserve,ReserveRateData storage rateData) internal view returns (uint256) {
uint256 totalDebt = getNormalizedDebt(reserve, rateData);
uint256 utilizationRate = calculateUtilizationRate(reserve.totalLiquidity, totalDebt);
return calculateLiquidityRate(utilizationRate, rateData.currentUsageRate, rateData.protocolFeeRate, totalDebt);
}

However, the getNormalizedDebt() function returns an index in RAY units (1e27) that tracks interest accrual.

function getNormalizedDebt(ReserveData storage reserve, ReserveRateData storage rateData) internal view returns (uint256) {
uint256 timeDelta = block.timestamp - uint256(reserve.lastUpdateTimestamp);
if (timeDelta < 1) {
return reserve.totalUsage;
}
return calculateCompoundedInterest(rateData.currentUsageRate, timeDelta).rayMul(reserve.usageIndex);
}

This index should be multiplied with the total usage to get the actual total debt.

Impact

The incorrect calculation of totalDebt leads to artificially low utilization rates, showing approximately 0.1% when actual utilization could be around 50%. This causes lending and borrowing rates to be severely underpriced due to understated utilization. Furthermore, the protocol suffers significant revenue loss from interest rate miscalculation, creating systemic risk as the protocol operates with incorrect interest rates and inefficient capital allocation.

Tools Used

Manual Review

Recommendations:

function getLiquidityRate(ReserveData storage reserve,ReserveRateData storage rateData) internal view returns (uint256) {
- uint256 totalDebt = getNormalizedDebt(reserve, rateData);
+ uint256 totalDebt = (reserve.totalUsage).rayMul(getNormalizedDebt(reserve, rateData));
uint256 utilizationRate = calculateUtilizationRate(reserve.totalLiquidity, totalDebt);
return calculateLiquidityRate(utilizationRate, rateData.currentUsageRate, rateData.protocolFeeRate, totalDebt);
}
Updates

Lead Judging Commences

inallhonesty Lead Judge 7 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.

Give us feedback!