Skip to content
Request an audit

‹ All findings

Creating a new proposal in StandardGovernor may reach a state of permanent DoS

MediumM^0 Minter Gateway·Three Sigma · Stablecoin framework · 8th January, 2024Codebase3S-M^0-L04

Description

The function StandardGovernor.propose is used to create a new proposal to be executed in the StandardGovernor.

If it's the first proposal for that epoch, it will call PowerToken.markNextVotingEpochAsActive to set the next target supply. Inside this

solidity
function, there's a check to cap the next target supply at type(uint240).max: uint240 nextTargetSupply_ = _nextTargetSupply = UIntMath.bound240( uint256(_targetSupply) + (_targetSupply *

participationInflation) / ONE ); The issue is that the most likely scenario will be that the multiplication _targetSupply * participationInflation will overflow first, before any bound checks.

Because _targetSupply is a uint240 and participationInflation is a uint16, the multiplication will raise a panic overflow when it passes the maximum value of a uint240.

This means that, in most cases, the transaction will revert with a panic overflow instead of just capping the next target supply. Because the problematic function is called by StandardGovernor.propose for the first proposal of an epoch, this results in a permanent denial-of-service situation where it will no longer be possible to create new proposals in the StandardGovernor.

Recommendation

Cast _targetSupply to not allow a uint240 overflow:

solidity
uint240 nextTargetSupply_ = _nextTargetSupply = UIntMath.bound240( uint256(_targetSupply) + (uint256(_targetSupply) *

participationInflation) / ONE );

Status

Addressed in #c2131a5.