Core Contracts

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

Division by Zero Risk in _updateWeights Due to Unchecked duration Parameter

BaseGauge.sol

Finding: Division by Zero Risk in _updateWeights Due to Unchecked duration Parameter

Issue Summary

The _updateWeights function retrieves duration from getPeriodDuration(), which is then used as a divisor in:

uint256 nextPeriodStart = ((currentTime / duration) + 1) * duration;

If duration is zero, the division operation will revert, causing the transaction to fail.

Potential Vulnerability

Division by Zero

  • If getPeriodDuration() returns 0, the division currentTime / duration triggers an error, halting execution.

  • This could prevent weight updates, disrupt reward calculations, or halt time-based logic in the protocol.

Impact: High

  • Critical Functionality Disruption: A revert halts execution, preventing updates to time-weighted averages.

  • System-Wide Failure: If _updateWeights is crucial for periodic updates, it could break reward mechanisms or governance systems.

Likelihood: Medium

  • If getPeriodDuration() is guaranteed to return nonzero values, this risk is low.

  • However, uninitialized variables, incorrect configurations, or malicious input could set it to zero.

Proof of Concept (PoC)

Scenario

  1. getPeriodDuration() unexpectedly returns 0 (due to misconfiguration or contract state reset).

  2. _updateWeights() executes:

    uint256 nextPeriodStart = ((block.timestamp / 0) + 1) * 0; // Division by zero!
  3. Transaction reverts, preventing weight updates.

Recommended Fix

Check for Zero Before Division
Modify _updateWeights to validate duration:

function _updateWeights(uint256 newWeight) internal {
uint256 currentTime = block.timestamp;
uint256 duration = getPeriodDuration();
require(duration > 0, "Invalid period duration");
uint256 nextPeriodStart = ((currentTime / duration) + 1) * duration;
if (weightPeriod.startTime == 0) {
TimeWeightedAverage.createPeriod(
weightPeriod,
nextPeriodStart,
duration,
newWeight,
WEIGHT_PRECISION
);
} else {
TimeWeightedAverage.createPeriod(
weightPeriod,
nextPeriodStart,
duration,
newWeight,
WEIGHT_PRECISION
);
}
}
Updates

Lead Judging Commences

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