ProposalGovernor

Git Source

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

setProposalThresholdPercentage

Sets a new proposal threshold percentage

Only callable via governance itself

function setProposalThresholdPercentage(uint256 newProposalThresholdPercentage) external onlyMezzGovernance;

Parameters

setVotingDelay

Sets a new voting delay

Only callable via governance itself

function setVotingDelay(uint256 newVotingDelay) external onlyMezzGovernance;

Parameters

setVotingPeriod

Sets a new voting period

Only callable via governance itself

function setVotingPeriod(uint256 newVotingPeriod) external onlyMezzGovernance;

Parameters

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

Returns

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

Returns

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

Returns

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

Returns

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

Returns

_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

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

getProposalVotes

Returns the total votes for the proposal with 'proposalId'

function getProposalVotes(uint256 proposalId) external view returns (DataTypes.ProposalVotes memory);

Returns

votingDelay

Returns the voting delay in seconds

function votingDelay() public view virtual returns (uint256);

Returns

votingPeriod

Returns the voting period

function votingPeriod() public view virtual returns (uint256);

Returns

quorumPercentage

Returns the quorum percentage

function quorumPercentage() public view virtual returns (uint256);

Returns

proposalThresholdPercentage

Returns the proposal threshold percentage

function proposalThresholdPercentage() public view virtual returns (uint256);

Returns

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

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