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;
return (totalBorrowed * 100) / totalDeposits;
}
function calculateNewEmissionRate() internal view returns (uint256) {
uint256 utilizationRate = getUtilizationRate();
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
Proper Zero Handling
if (totalDeposits == 0) return 0;
Emission Logic Safety
if (utilizationRate < utilizationTarget) {
return minRate > minEmissionRate ? minRate : minEmissionRate;
}
Bounded Outcomes
uint256 public minEmissionRate = 100 * 1e18 / BLOCKS_PER_DAY;
uint256 public maxEmissionRate = 2000 * 1e18 / BLOCKS_PER_DAY;
Existing Safety Measures
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;
}
Update Controls
function updateEmissionRate() public whenNotPaused {
if (emissionUpdateInterval > 0 &&
block.timestamp < lastEmissionUpdateTimestamp + emissionUpdateInterval) {
revert EmissionUpdateTooFrequent();
}
}
Optional Enhancement
While not necessary, could add explicit documentation:
function getUtilizationRate() internal view returns (uint256) {
uint256 totalBorrowed = lendingPool.getNormalizedDebt();
uint256 totalDeposits = stabilityPool.getTotalDeposits();
if (totalDeposits == 0) {
emit ZeroUtilization();
return 0;
}
return (totalBorrowed * 100) / totalDeposits;
}
event ZeroUtilization();