Core Contracts

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

Execution of Governance Proposals Without Continuous Proposer Stake Verification

Summary

The governance system enforces a proposer threshold (100k veToken) only at proposal creation, but fails to validate this requirement during critical actions like voting and execution. This enables proposers to reduce their stake after proposal creation while maintaining proposal validity.

Vulnerability Details

Both vote and execute functions need threshold validation:

function castVote(uint256 proposalId, bool support) external {
ProposalCore storage proposal = _proposals[proposalId];
// Missing check: if (_veToken.getVotingPower(proposal.proposer) >= proposalThreshold)
}
function execute(uint256 proposalId) external {
ProposalCore storage proposal = _proposals[proposalId];
// Missing check: if (_veToken.getVotingPower(proposal.proposer) >= proposalThreshold)
}

Attack path:

  1. Proposer creates proposal with 100k veToken

  2. Proposal passes voting

  3. Proposer reduces stake to 10k veToken

  4. No one calls cancel()

  5. Proposal executes despite proposer losing legitimacy

Impact

Proposals remain valid despite the proposer losing the stake

Tools Used

Manual review

Recommendations

Add threshold validation to both functions:

modifier validateProposerStake(uint256 proposalId) {
if (_veToken.getVotingPower(_proposals[proposalId].proposer) < proposalThreshold)
revert ProposerBelowThreshold();
_;
}
function castVote(uint256 proposalId, bool support) external validateProposerStake(proposalId)
function execute(uint256 proposalId) external validateProposerStake(proposalId)
Updates

Lead Judging Commences

inallhonesty Lead Judge 7 months ago
Submission Judgement Published
Invalidated
Reason: Design choice

Support

FAQs

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

Give us feedback!