The GaugeController contract uses balanceOf()
instead of getVotingPower()
to determine user voting weights, causing voting power to not properly decay with time as intended in the vote-escrow model.
HIGH
Users' voting power does not decay linearly with time as intended
Undermines the vote-escrow mechanism where voting power should decrease as lock expiration approaches
Allows for disproportionate voting influence with nearly expired locks
The issue is that balanceOf()
returns the raw locked amount, while getVotingPower()
returns the time-weighted voting power that properly decays:
Curve's GaugeController implementation which properly uses time-decaying voting power
The fix should be prioritized as it impacts core governance functionality.
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.