# Lowering the gauge weight can disrupt accounting, potentially leading to both excessive fund distribution and a loss of funds.

GaugeController._change_gauge_weight updates bias but not slope, so lowering a gauge weight leaves stale slope decay, inflating relative weight and over-distributing rewards.

- Payout: Contest reward
- Severity: high
- Program: Convergence
- Credited: 0xDetermination
- Disclosed: 2023-11-06
- Write-up quality: 7/10
- Original: https://github.com/sherlock-audit/2023-11-convergence-judging/issues/94
- Library page: https://bugbountylibrary.com/r/sherlock%3A2023-11-convergence%3AH-1
- Tags: domain:web3 impact:funds-loss kind:contest platform:sherlock sev:high tech:solidity technique:regression technique:source-review vuln:accounting-error vuln:reward-distribution

**Target:** GaugeController.vy / CvgRewards.sol reward accounting
**Root cause:** _change_gauge_weight updates points_weight bias and time_weight but never adjusts the slope, so the decay equation's t-intercept shifts while slope stays; changes_sum slope adjustments from prior votes remain applied, making global weight less than sum of gauge weights.
**Steps:**
1. Call `_change_gauge_weight(addr, weight)` with weight lower than current bias on a gauge with non-zero slope and t-intercept beyond now (or kill_gauge).
2. Observe points_weight[addr][next_time].bias set to new weight but slope unchanged; changes_sum entries from earlier vote_for_gauge_weights not subtracted.
3. During window t1-t2, global total weight < sum of individual gauge weights.
4. CvgRewards.writeStakingRewards calls _checkpoint -> gauge_relative_weight_writes, computing inflated relative weight.
5. Rewards distributed exceed allocation; later users in array get nothing.
**How found:** Compared Convergence's GaugeController to Canto veRWA prior findings (0xDetermination #386, bart1e #206); reasoned about decay equation f(t)=c-mx and noted slope not updated when bias reduced, tracing impact into CvgRewards relative weight computation.
**Exploitation:** Admin-triggered misconfiguration: lowering/killing a gauge weight causes inflated relative weight in CvgRewards checkpoint, over-distributing rewards to early processed gauges and starving remaining users.
**Insight:** When porting Curve-style gauge controllers, check that _change_gauge_weight adjusts slope and changes_sum, not just bias; slope-based decay accounting breaks silently on weight reduction even though the code is battle-tested upstream because the function is never called there.
