ProposalGovernor
Inherits: ContextUpgradeable, MezzGovernor, MezzEIP712, NoncesUpgradeable, IProposalGovernor
Author: Daniel Yamagata
A base class that provides functionality for on-chain proposals and voting. This contract does not implement the execution of proposals
This contract is heavily inspired by OpenZeppelin's Governor contract.
State Variables
_BALLOT_TYPEHASH
bytes32 internal constant _BALLOT_TYPEHASH =
keccak256("Ballot(uint256 proposalId,uint8 support,address voter,uint256 nonce)");
_EXTENDED_BALLOT_TYPEHASH
bytes32 internal constant _EXTENDED_BALLOT_TYPEHASH =
keccak256("ExtendedBallot(uint256 proposalId,uint8 support,address voter,uint256 nonce,string reason,bytes params)");
SUPER_MAJORITY_PERCENTAGE
uint256 public constant SUPER_MAJORITY_PERCENTAGE = Constants.SUPER_MAJORITY_PERCENTAGE;
ProposalGovernorStorageLocation
bytes32 private constant ProposalGovernorStorageLocation =
0x1f64e26c32eddaf99df35a9898d9e2c7b2a05db947531695b541d0030f865a00;
Functions
_getProposalGovernorStorage
function _getProposalGovernorStorage() internal pure returns (ProposalGovernorStorage storage $);
__ProposalGovernor_init
function __ProposalGovernor_init() internal onlyInitializing;
setQuorumPercentage
Sets a new quourm percentage
Only callable via governance itself
function setQuorumPercentage(uint256 newQuorumPercentage) external onlyMezzGovernance;
Parameters
newQuorumPercentage
uint256
The new quorum percentage
setProposalThresholdPercentage
Sets a new proposal threshold percentage
Only callable via governance itself
function setProposalThresholdPercentage(uint256 newProposalThresholdPercentage) external onlyMezzGovernance;
Parameters
newProposalThresholdPercentage
uint256
The new proposal threshold percentage
setVotingDelay
Sets a new voting delay
Only callable via governance itself
function setVotingDelay(uint256 newVotingDelay) external onlyMezzGovernance;
Parameters
newVotingDelay
uint256
The new voting delay
setVotingPeriod
Sets a new voting period
Only callable via governance itself
function setVotingPeriod(uint256 newVotingPeriod) external onlyMezzGovernance;
Parameters
newVotingPeriod
uint256
The new voting period
castVote
Casts the caller's votes towards the proposal associated with 'proposalId' There are three different vote types defined by the following enum:
0: Against
1: For
2: Abstain
A voter can only vote once and cannot revoke or change their vote. Votes are calculated from the proposal's snapshot and the counting of votes is bespoke and must be implemented by the inheritor
function castVote(uint256 proposalId, uint8 support) public virtual returns (uint256);
Parameters
proposalId
uint256
The ID of the proposal to cast the vote for
support
uint8
The vote type
Returns
<none>
uint256
The number of votes of the caller
castVoteWithReason
Casts the caller's votes with a 'reason' towards the proposal associated with 'proposalId'
The 'reason' is not stored on-chain but, rather, emitted in an event
function castVoteWithReason(uint256 proposalId, uint8 support, string calldata reason)
public
virtual
returns (uint256);
Parameters
proposalId
uint256
The ID of the proposal to cast the vote for
support
uint8
The vote type
reason
string
The reason for the vote
Returns
<none>
uint256
The number of votes of the caller
castVoteWithReasonAndParams
Casts the caller's votes with a 'reason' and 'params' towards the proposal associated with 'proposalId'
'params' are bespoke, abi-encoded arguments that could be used for casting a vote
function castVoteWithReasonAndParams(uint256 proposalId, uint8 support, string calldata reason, bytes memory params)
public
virtual
returns (uint256);
Parameters
proposalId
uint256
The ID of the proposal to cast the vote for
support
uint8
The vote type
reason
string
The reason for the vote
params
bytes
The abi-encoded parameters for the vote
Returns
<none>
uint256
The number of votes of the caller
castVoteBySig
Casts the votes of 'voter' towards the proposal associated with 'proposalId' via an EIP-712 signature
Reference: https://eips.ethereum.org/EIPS/eip-712
function castVoteBySig(uint256 proposalId, uint8 support, address voter, bytes memory signature)
public
virtual
returns (uint256);
Parameters
proposalId
uint256
The ID of the proposal to cast the vote for
support
uint8
The vote type
voter
address
The address of the voter
signature
bytes
The EIP-712 signature of the voter
Returns
<none>
uint256
The number of votes of the voter
castVoteWithReasonAndParamsBySig
Casts the votes of 'voter' towards the proposal associated with 'proposalId' via an EIP-712 signature
Reference: https://eips.ethereum.org/EIPS/eip-712
'params' are bespoke, abi-encoded arguments that could be used for casting a vote
function castVoteWithReasonAndParamsBySig(
uint256 proposalId,
uint8 support,
address voter,
string calldata reason,
bytes memory params,
bytes memory signature
) public virtual returns (uint256);
Parameters
proposalId
uint256
The ID of the proposal to cast the vote for
support
uint8
The vote type
voter
address
The address of the voter
reason
string
The reason for the vote
params
bytes
The abi-encoded parameters for the vote
signature
bytes
The EIP-712 signature of the voter
Returns
<none>
uint256
The number of votes of the voter
_castVote
function _castVote(uint256 proposalId, address account, uint8 support, string memory reason)
internal
virtual
returns (uint256);
_castVote
Overridden by inheriting contracts. Inheritors should query votes and count them towards a proposal
function _castVote(uint256 proposalId, address account, uint8 support, string memory reason, bytes memory params)
internal
virtual
returns (uint256);
state
Returns the state of a proposal associated with 'proposalId' as a ProposalState enum
function state(uint256 proposalId) public view virtual returns (IModifiedGovernor.ProposalState);
hasVoted
Returns true if 'account' has voted on a proposal with 'proposalId', false otherwise
function hasVoted(uint256 proposalId, address account) public view virtual returns (bool);
Returns
<none>
bool
True if the account has voted, false otherwise
getReceipt
Returns the voting receipt of 'account' for the proposal with 'proposalId'
function getReceipt(uint256 proposalId, address account) external view returns (DataTypes.Receipt memory);
Returns
<none>
DataTypes.Receipt
The receipt of the account as a DataTypes.Receipt struct
getProposalVotes
Returns the total votes for the proposal with 'proposalId'
function getProposalVotes(uint256 proposalId) external view returns (DataTypes.ProposalVotes memory);
Returns
<none>
DataTypes.ProposalVotes
The total votes for the proposal as a DataTypes.ProposalVotes struct
votingDelay
Returns the voting delay in seconds
function votingDelay() public view virtual returns (uint256);
Returns
<none>
uint256
The voting delay in seconds
votingPeriod
Returns the voting period
function votingPeriod() public view virtual returns (uint256);
Returns
<none>
uint256
The voting period in seconds
quorumPercentage
Returns the quorum percentage
function quorumPercentage() public view virtual returns (uint256);
Returns
<none>
uint256
The quorum percentage multiplied by the precision factor
proposalThresholdPercentage
Returns the proposal threshold percentage
function proposalThresholdPercentage() public view virtual returns (uint256);
Returns
<none>
uint256
The proposal threshold percentage multiplied by the precision factor
getBallotTransactionHash
Returns the ballot transaction hash, which is used in casting votes by signature
The returned transaction hash should be signed by the voter to create a valid signature Reference: https://eips.ethereum.org/EIPS/eip-712
function getBallotTransactionHash(uint256 proposalId, uint8 support, address voter, uint256 nonce)
public
view
virtual
returns (bytes32);
getBallotStructHash
Return the ballot struct hash
Reference: https://eips.ethereum.org/EIPS/eip-712
function getBallotStructHash(uint256 proposalId, uint8 support, address voter, uint256 nonce)
public
view
virtual
returns (bytes32);
getExtendedBallotTransactionHash
Returns the extended ballot transaction hash, which is used in casting votes with reasons and params by signature
The returned transaction hash should be signed by the voter to create a valid signature Reference: https://eips.ethereum.org/EIPS/eip-712
function getExtendedBallotTransactionHash(
uint256 proposalId,
uint8 support,
address voter,
uint256 nonce,
string memory reason,
bytes memory params
) public view virtual returns (bytes32);
getExtendedBallotStructHash
Returns the extended ballot struct hash
Reference: https://eips.ethereum.org/EIPS/eip-712
function getExtendedBallotStructHash(
uint256 proposalId,
uint8 support,
address voter,
uint256 nonce,
string memory reason,
bytes memory params
) public view virtual returns (bytes32);
coreId
Returns the coreId of the implementation as a bytes32
The core ID is the keccak256 hash of the contract name followed by a version under the following syntax: "mezzanine.coreId.ContractName.vX" For example, the core ID of the 2nd version of the Treasury would be the following: keccak256(abi.encodePacked("mezzanine.coreId.Treasury.v2"))
function coreId() public pure virtual override(Credentialed, ICredentialed) returns (bytes32);
version
Returns the version of the implementation as a uint256
function version() public pure virtual override(Credentialed, ICredentialed) returns (uint256);
clock
EIP-6372 support
function clock() public view virtual returns (uint48);
CLOCK_MODE
EIP-6372 support
function CLOCK_MODE() public view virtual returns (string memory);
_countVote
Counts a vote for a given proposal. Sets the receipt in storage Assumes that the weight has already been calculated
function _countVote(uint256 proposalId, address account, uint8 support, uint256 votes, bytes memory) internal virtual;
_voteSucceeded
Returns whether or not the vote succeeded for a given proposal
function _voteSucceeded(uint256 proposalId) internal view virtual returns (bool);
Returns
<none>
bool
True if the for votes are greater than the against votes, false otherwise
supportsInterface
EIP-165 support. Reference: https://eips.ethereum.org/EIPS/eip-165
function supportsInterface(bytes4 interfaceId)
public
view
virtual
override(MezzEIP712, MezzUUPSUpgradeable, IERC165)
returns (bool);
Structs
ProposalGovernorStorage
struct ProposalGovernorStorage {
uint256 _proposalThresholdPercentage;
uint256 _quorumPercentage;
uint256 _votingPeriod;
uint256 _votingDelay;
mapping(uint256 => DataTypes.ProposalVotes) _proposalVotes;
mapping(uint256 => mapping(address => DataTypes.Receipt)) _receipts;
}
Last updated