# Endorsed votes by a user do not decrease after the user's votes are revoked

Revoking a user's votes in Olympus governance does not reduce their prior proposal endorsements, letting stale endorsements inflate activation odds against a shrunken vote supply.

- Payout: Contest reward
- Severity: medium
- Program: Olympus DAO
- Credited: rbserver
- Disclosed: 2022-10-26
- Write-up quality: 6/10
- Original: https://github.com/code-423n4/2022-08-olympus-findings/issues/257
- Library page: https://bugbountylibrary.com/r/c4%3A2022-08-olympus%3AM-07
- Tags: domain:web3 impact:integrity kind:contest platform:code4rena sev:medium tech:evm tech:solidity technique:source-review vuln:accounting-error vuln:governance

**Target:** Governance/VoterRegistration Solidity contracts
**Root cause:** endorseProposal snapshots userVotes into userEndorsementsForProposal, but revokeVotesFrom only burns VOTES balance and never updates stored endorsements, so totalEndorsementsForProposal keeps stale values.
**Steps:**
1. Deploy governance; submit proposal 1.
2. voter3 calls `endorseProposal(1)` with 300 votes; userEndorsementsForProposal(1,voter3)=300 and totalEndorsementsForProposal(1)=300.
3. voter_admin calls `revokeVotesFrom(voter3,300)` (or VOTES.burnFrom) reducing voter3 balance to 0.
4. Observe userEndorsementsForProposal(1,voter3) and totalEndorsementsForProposal(1) remain 300 while total vote supply dropped.
5. Proposal activation check compares stale 300 endorsements against reduced total supply, passing more easily.
**How found:** Code reading of endorseProposal's snapshot logic versus revokeVotesFrom only burning VOTES, noticing no callback/sync between the two modules; confirmed with a Foundry test.
**Exploitation:** A voter endorses a proposal, then the voter admin revokes their votes; the endorsement count is not decremented, so the proposal retains inflated endorsement weight relative to the now-smaller total vote supply, making activation easier than it should be.
**Insight:** When a module snapshots a balance into stored state (endorsements, votes, weights), any external burn/transfer path that changes the balance without a hook leaves stale state; check every mint/burn/transfer entrypoint against snapshot consumers.
