Release v5.2 audit fixes (#5330)
Signed-off-by: Hadrien Croubois <hadrien.croubois@gmail.com> Co-authored-by: Sam Bugs <101145325+0xsambugs@users.noreply.github.com> Co-authored-by: Ernesto García <ernestognw@gmail.com> Co-authored-by: Arr00 <13561405+arr00@users.noreply.github.com> Co-authored-by: wizard <112275929+famouswizard@users.noreply.github.com> Co-authored-by: leopardracer <136604165+leopardracer@users.noreply.github.com> Co-authored-by: cairo <cairoeth@protonmail.com>
This commit is contained in:
@ -8,8 +8,8 @@ import {VotesExtended} from "../utils/VotesExtended.sol";
|
||||
import {GovernorVotes} from "./GovernorVotes.sol";
|
||||
|
||||
/**
|
||||
* @dev Extension of {Governor} which enables delegatees to override the vote of their delegates. This module requires a
|
||||
* token token that inherits `VotesExtended`.
|
||||
* @dev Extension of {Governor} which enables delegators to override the vote of their delegates. This module requires a
|
||||
* token that inherits {VotesExtended}.
|
||||
*/
|
||||
abstract contract GovernorCountingOverridable is GovernorVotes {
|
||||
bytes32 public constant OVERRIDE_BALLOT_TYPEHASH =
|
||||
@ -35,7 +35,10 @@ abstract contract GovernorCountingOverridable is GovernorVotes {
|
||||
mapping(address voter => VoteReceipt) voteReceipt;
|
||||
}
|
||||
|
||||
event VoteReduced(address indexed voter, uint256 proposalId, uint8 support, uint256 weight);
|
||||
/// @dev The votes casted by `delegate` were reduced by `weight` after an override vote was casted by the original token holder
|
||||
event VoteReduced(address indexed delegate, uint256 proposalId, uint8 support, uint256 weight);
|
||||
|
||||
/// @dev A delegated vote on `proposalId` was overridden by `weight`
|
||||
event OverrideVoteCast(address indexed voter, uint256 proposalId, uint8 support, uint256 weight, string reason);
|
||||
|
||||
error GovernorAlreadyOverridenVote(address account);
|
||||
@ -52,6 +55,11 @@ abstract contract GovernorCountingOverridable is GovernorVotes {
|
||||
|
||||
/**
|
||||
* @dev See {IGovernor-hasVoted}.
|
||||
*
|
||||
* NOTE: Calling {castVote} (or similar) casts a vote using the voting power that is delegated to the voter.
|
||||
* Conversely, calling {castOverrideVote} (or similar) uses the voting power of the account itself, from its asset
|
||||
* balances. Casting an "override vote" does not count as voting and won't be reflected by this getter. Consider
|
||||
* using {hasVotedOverride} to check if an account has casted an "override vote" for a given proposal id.
|
||||
*/
|
||||
function hasVoted(uint256 proposalId, address account) public view virtual override returns (bool) {
|
||||
return _proposalVotes[proposalId].voteReceipt[account].casted != 0;
|
||||
@ -120,7 +128,11 @@ abstract contract GovernorCountingOverridable is GovernorVotes {
|
||||
return totalWeight;
|
||||
}
|
||||
|
||||
/// @dev Variant of {Governor-_countVote} that deals with vote overrides.
|
||||
/**
|
||||
* @dev Variant of {Governor-_countVote} that deals with vote overrides.
|
||||
*
|
||||
* NOTE: See {hasVoted} for more details about the difference between {castVote} and {castOverrideVote}.
|
||||
*/
|
||||
function _countOverride(uint256 proposalId, address account, uint8 support) internal virtual returns (uint256) {
|
||||
ProposalVote storage proposalVote = _proposalVotes[proposalId];
|
||||
|
||||
@ -132,9 +144,9 @@ abstract contract GovernorCountingOverridable is GovernorVotes {
|
||||
revert GovernorAlreadyOverridenVote(account);
|
||||
}
|
||||
|
||||
uint256 proposalSnapshot = proposalSnapshot(proposalId);
|
||||
uint256 overridenWeight = VotesExtended(address(token())).getPastBalanceOf(account, proposalSnapshot);
|
||||
address delegate = VotesExtended(address(token())).getPastDelegate(account, proposalSnapshot);
|
||||
uint256 snapshot = proposalSnapshot(proposalId);
|
||||
uint256 overridenWeight = VotesExtended(address(token())).getPastBalanceOf(account, snapshot);
|
||||
address delegate = VotesExtended(address(token())).getPastDelegate(account, snapshot);
|
||||
uint8 delegateCasted = proposalVote.voteReceipt[delegate].casted;
|
||||
|
||||
proposalVote.voteReceipt[account].hasOverriden = true;
|
||||
@ -150,7 +162,7 @@ abstract contract GovernorCountingOverridable is GovernorVotes {
|
||||
return overridenWeight;
|
||||
}
|
||||
|
||||
/// @dev variant of {Governor-_castVote} that deals with vote overrides.
|
||||
/// @dev Variant of {Governor-_castVote} that deals with vote overrides. Returns the overridden weight.
|
||||
function _castOverride(
|
||||
uint256 proposalId,
|
||||
address account,
|
||||
@ -168,7 +180,7 @@ abstract contract GovernorCountingOverridable is GovernorVotes {
|
||||
return overridenWeight;
|
||||
}
|
||||
|
||||
/// @dev Public function for casting an override vote
|
||||
/// @dev Public function for casting an override vote. Returns the overridden weight.
|
||||
function castOverrideVote(
|
||||
uint256 proposalId,
|
||||
uint8 support,
|
||||
@ -178,7 +190,7 @@ abstract contract GovernorCountingOverridable is GovernorVotes {
|
||||
return _castOverride(proposalId, voter, support, reason);
|
||||
}
|
||||
|
||||
/// @dev Public function for casting an override vote using a voter's signature
|
||||
/// @dev Public function for casting an override vote using a voter's signature. Returns the overridden weight.
|
||||
function castOverrideVoteBySig(
|
||||
uint256 proposalId,
|
||||
uint8 support,
|
||||
|
||||
Reference in New Issue
Block a user