Core Contracts

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

RAACMinter Utilization Rate Division by Zero Risk

Summary

After reviewing RAACMinter.sol, I can confirm that the contract already handles zero deposits correctly by explicitly returning 0 for utilization rate, which is then properly handled in the emission calculations.

Vulnerable Code Analysis

function getUtilizationRate() internal view returns (uint256) {
uint256 totalBorrowed = lendingPool.getNormalizedDebt();
uint256 totalDeposits = stabilityPool.getTotalDeposits();
if (totalDeposits == 0) return 0; // Proper handling
return (totalBorrowed * 100) / totalDeposits;
}
function calculateNewEmissionRate() internal view returns (uint256) {
uint256 utilizationRate = getUtilizationRate();
// Proper handling of low utilization
if (utilizationRate < utilizationTarget) {
uint256 decreasedRate = emissionRate > adjustment ? emissionRate - adjustment : 0;
uint256 minRate = decreasedRate < benchmarkRate ? decreasedRate : benchmarkRate;
return minRate > minEmissionRate ? minRate : minEmissionRate;
}
// ...
}

Why This Is Not High Severity

  1. Proper Zero Handling

// Zero deposits case is explicitly handled
if (totalDeposits == 0) return 0;
  1. Emission Logic Safety

// Low utilization properly decreases rate
if (utilizationRate < utilizationTarget) {
// Cannot go below minEmissionRate
return minRate > minEmissionRate ? minRate : minEmissionRate;
}
  1. Bounded Outcomes

// Rate always stays within bounds
uint256 public minEmissionRate = 100 * 1e18 / BLOCKS_PER_DAY;
uint256 public maxEmissionRate = 2000 * 1e18 / BLOCKS_PER_DAY;

Existing Safety Measures

  1. Rate Boundaries

function setMinEmissionRate(uint256 _minEmissionRate) external onlyRole(UPDATER_ROLE) {
if (_minEmissionRate >= maxEmissionRate) revert InvalidMinEmissionRate();
minEmissionRate = _minEmissionRate;
}
function setMaxEmissionRate(uint256 _maxEmissionRate) external onlyRole(UPDATER_ROLE) {
if (_maxEmissionRate <= minEmissionRate) revert InvalidMaxEmissionRate();
maxEmissionRate = _maxEmissionRate;
}
  1. Update Controls

function updateEmissionRate() public whenNotPaused {
if (emissionUpdateInterval > 0 &&
block.timestamp < lastEmissionUpdateTimestamp + emissionUpdateInterval) {
revert EmissionUpdateTooFrequent();
}
// ...
}

Optional Enhancement

While not necessary, could add explicit documentation:

/// @notice Calculates system utilization rate
/// @dev Returns 0 when no deposits exist, triggering minimum emission rate
/// @return Utilization rate as percentage (0-100)
function getUtilizationRate() internal view returns (uint256) {
uint256 totalBorrowed = lendingPool.getNormalizedDebt();
uint256 totalDeposits = stabilityPool.getTotalDeposits();
// Early return for empty pool
if (totalDeposits == 0) {
emit ZeroUtilization();
return 0;
}
return (totalBorrowed * 100) / totalDeposits;
}
event ZeroUtilization();
Updates

Lead Judging Commences

inallhonesty Lead Judge 7 months ago
Submission Judgement Published
Invalidated
Reason: Lack of quality

Support

FAQs

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

Give us feedback!