Core Contracts

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

Utilization Rate Calculation Deviates from Standard AAVE Implementation

Summary

The calculateUtilizationRate function in ReserveLibrary uses a non-standard formula for calculating utilization rate that results in significantly lower rates compared to established DeFi protocols like AAVE. This could lead to unexpected behavior in interest rate calculations.

There is no clear documentation of the expected Utilization Rate calculation but I noticed that the RAAC protocol has copied the logic of the AAVE protocol and modified the code.

Vulnerability Details

function calculateUtilizationRate(uint256 totalLiquidity, uint256 totalDebt) internal pure returns (uint256) {
if (totalLiquidity < 1) {
return WadRayMath.RAY; // 100% utilization if no liquidity
}
uint256 utilizationRate = totalDebt.rayDiv(totalLiquidity + totalDebt).toUint128();
return utilizationRate;
}

The formula used is:

utilizationRate = totalDebt / (totalLiquidity + totalDebt)

This differs from the standard DeFi formula used by protocols like AAVE []:

utilizationRate = totalDebt / totalLiquidity

Impact

The current formula will always result in lower utilization rates than the standard formula. For example:

  • With 80 totalDebt and 100 totalLiquidity:

  • Standard formula: 80/100 = 80% utilization

  • Current formula: 80/(100+80) = 44% utilization

Since interest rates are based on utilization, this leads to:

  • Lower borrow rates than might be intended

  • Lower supply rates than might be intended

The severity is rated as Low because:

  • The system remains functional

  • No funds are at direct risk

  • The calculation is consistent, just different from standard practice

Tools Used

  • Manual review

Recommendations

Consider aligning with the standard utilization rate formula:

function calculateUtilizationRate(uint256 totalLiquidity, uint256 totalDebt) internal pure returns (uint256) {
if (totalLiquidity == 0) {
return WadRayMath.RAY;
}
return totalDebt.rayDiv(totalLiquidity);
}
Updates

Lead Judging Commences

inallhonesty Lead Judge 7 months ago
Submission Judgement Published
Invalidated
Reason: Non-acceptable severity
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!