๐Ÿ‘ฉโ€๐Ÿ’ปDeveloper Guides

Governor C allows the deployment on-chain voting system using PQV, with respect to Compound's Governor Alpha & Bravo interface.

Hardcoded Parameters

Proposal Threshold

    /// @notice The minimum setable proposal threshold
    uint public constant MIN_PROPOSAL_THRESHOLD = 50000e18; // 50,000 Comp

    /// @notice The maximum setable proposal threshold
    uint public constant MAX_PROPOSAL_THRESHOLD = 100000e18; //100,000 Comp

Addresses with more than 50,000 COMP (or any ERC20 token registered by function initialize) can invoke proposal. This threshold can be changed by admin within the range of [50000, 100000].

Voting Period

    /// @notice The minimum setable voting period
    uint public constant MIN_VOTING_PERIOD = 5760; // About 24 hours

    /// @notice The max setable voting period
    uint public constant MAX_VOTING_PERIOD = 80640; // About 2 weeks

After starting of the proposal, COMP holders can submit their votes during a voting period. The voting period can be changed by admin within the range of [5760, 80640] Ethereum blocks.

Each blockchain has a different block interval. Even at the same protocol, it can be changed after a hardfork.

Voting Delay

    /// @notice The min setable voting delay
    uint public constant MIN_VOTING_DELAY = 1;

    /// @notice The max setable voting delay
    uint public constant MAX_VOTING_DELAY = 40320; // About 1 week

Users allow to vote for the proposal after a certain delay. The voting delay can be changed by admin within the range of [1, 40320] Ethereum blocks.

Quorum

    /// @notice The number of votes in support of a proposal required in order for a quorum to be reached and for a vote to succeed
    uint public constant quorumVotes = 400000e18; // 400,000 = 4% of Comp

According to majority, at least 400,000 votes are cast for the proposal to execute.

Max Operations per Proposal

    /// @notice The maximum number of actions that can be included in a proposal
    uint public constant proposalMaxOperations = 10; // 10 actions

The maximum number of actions that can be included in one proposal. Each action is same as booked function-call belongs to the proposal.

Storage

New Proposal State: Unfinalized

    /// @notice Possible states that a proposal may be in
    /// @dev Add `Unfinalized` state - represent that the proposal is ready to get a `baseRandom` number
    enum ProposalState {
        Pending,
        Active,
        Canceled,
        Defeated,
        Succeeded,
        Queued,
        Expired,
        Executed,
        Unfinalized // for PQV's random aggregation round
    }

Enumerated type ProposalState. The types are Pending, Active, Canceled, Defeated, Succeeded, Queued, Expired, Executed, and Unfinalized.

Unfinalized state refers to a status in which casting has been completed but votes aggregation has not yet begun. It is changed into Defeated or Succeeded after executing the finalized function.

Governor C uses Chainlink VRF v1.

Fee

function feeUpdate(uint newFee) public

Fee is required to fulfill a VRF request. Therefore, the contract should own enough LINK to pay the specified fee.

Fee varies by network. To prepare for changes in fee, Governor C provides a fee update function. The admin can change the VRF request fee.

Request Randomness

function requestFlagedRandomness() public returns (bytes32 requestId)
function requestBaseFlagedRandom(uint proposalId) external

Those functions invoke Chainlink's requestRandomness, which makes the initial request for randomness.

PQV

Probabilistic Element ee

    // e = 1.05
    uint32 public expN = 105;
    uint32 public expD = 100;

Probabilistic element ee is calculated by expNexpD\frac{exp_N}{exp_D}. The default value is 1.051.05. The higher ee, the more similar to the result of QV. Details are here: PQV EVALUATION - Change of similarity according to change of PQV probabilistic element.

pageResults
function eUpdate(uint32 newExpN, uint32 newExpD) public

The admin can change ee by assigning new expN and expD.

Expectation Value

function pqvExpect(uint proposalId) public view returns (
    bool isSucceeded,
    uint aggregatedForVotes,
    uint aggregatedAgainstVotes,
    uint aggregatedAbstainVotes
)

pqvExpect gets expectation value of for, against, and abstain votes before finalizing proposal. It also returns bool of a proposal's success or failure.

Finalize

function finalize(uint proposalId) external

Finalizes an active proposal. After the proposal is finalized, votes aggregation is triggered and its state is changed into either Defeated or Succeeded.

Implementation

Last updated