Core Contracts

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

Incorrerct update of emission rate of RAACTokens in RAACMinter.sol at 70% utilization.

Summary

In RAACMinter.sol, emission rate is update daily via updateEmissionRate(), which uses calculateEmissionRate() to calculate the emission rate based on current utilization. The function adjust the emission rate based on current utilization rate and returns the new emission rate. It increases the rate when utilization is over target and decreases the rate when utilization is under target. But when utilization is exactly at target, it returns the current emission rate instead of the default rate.

Vulnerability Details

In calculateEmissionRate(), changes to emission rate is done only when its greater than or less than target utilization rate. It returns the old value(i.e yesterday's emission) when utilization is exactly at the target utilization rate.

function calculateNewEmissionRate() internal view returns (uint256) {
uint256 utilizationRate = getUtilizationRate();
uint256 adjustment = (emissionRate * adjustmentFactor) / 100;
if (utilizationRate > utilizationTarget) {
uint256 increasedRate = emissionRate + adjustment;
uint256 maxRate = increasedRate > benchmarkRate ? increasedRate : benchmarkRate;
return maxRate < maxEmissionRate ? maxRate : maxEmissionRate;
} else if (utilizationRate < utilizationTarget) {
uint256 decreasedRate = emissionRate > adjustment ? emissionRate - adjustment : 0;
uint256 minRate = decreasedRate < benchmarkRate ? decreasedRate : benchmarkRate;
return minRate > minEmissionRate ? minRate : minEmissionRate;
}
return emissionRate;
}

Impact

If the emission rate jumps from a low value to the target, it will stay the same even though it is updated. Its the same case when emission comes down from a high value to target. Since emission can only be updated once per day, whenever utilization reach the target rate, emission rate will stay the same for a day, and continue to do so as long as utilization is at the target value.

Tools Used

Manual Review

Recommendations

Returns the default emission rate, set in the constructor, at target instead of the old value.

function calculateNewEmissionRate() internal view returns (uint256) {
....
++ return emissionRate;
-- return INITIAL_RATE / BLOCKS_PER_DAY;
}
Updates

Lead Judging Commences

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