GaugeController.sol
Inside GaugeController, we see:
But in the vote(...) function:
Nowhere does the contract reference lastVoteTime[msg.sender] or set lastVoteTime[msg.sender] = block.timestamp; after voting. This means:
The user’s last vote time is never stored or updated.
The VOTE_DELAY = 10 days requirement is never enforced—no revert occurs if the user tries to vote again immediately.
User Votes:
The user calls vote(gauge, 5000) at T0. The function never sets lastVoteTime[user] = block.timestamp, nor checks the previous timestamp.
User Votes Again Immediately:
The user calls vote(gauge, 6000) at T0+10 seconds. The code never references VOTE_DELAY or lastVoteTime, so it succeeds.
Effect: The user can spam the vote function, repeatedly adjusting gauge weights with no forced delay.
Documented Feature Not Enforced
The code and doc mention a 10-day minimum interval between user votes (VOTE_DELAY), but the system actually allows unlimited immediate re-voting.
Gaming or Rapid Shifts
Users can quickly re-vote to manipulate gauge weights back and forth, potentially causing instability or making it harder for other participants to see a stable allocation before distribution.
Enforce Voting Delay
In vote(...), do something like:
The contest is live. Earn rewards by submitting a finding.
This is your time to appeal against judgements on your submissions.
Appeals are being carefully reviewed by our judges.