[Copied over from Comadery]
Background
As Compound Governance evolves, it is becoming more obvious that certain proposals need a longer time for pre-vote analysis. For instance: The COMP issuance rebalancing proposal (CP011) effects not only Compound, but caused externalities that impact borrowing/supply demand such as Dai issuance and the Dai peg. These externalities affect both systems and deserve a more thorough analysis than proposals that are more straightforward. Compare CP011 to CP014 (née CP013), which aims to change the collateral factor for WBTC to be non-zero. This is a much more straightforward vote as the main economic risk factors deal with answering the following questions:
- Should WBTC be used as collateral in spite of the centralization/liquidity issues?
- Is 65% the right collateral factor? If not, why is it too low/high?
In order to accommodate the differences in analysis complexity (especially with regards to economics), we propose adding a formal analysis period to each vote.
On-Chain Formal Analysis Periods
A formal analysis period is defined as a non-voting period where a proposal is active (e.g. submitted on-chain). Right now, a proposal is defined such that voting starts at block height startBlock
(defined as the predecessor block of the block height where propose
is called) and ends at block height endBlock = startBlock + 17820
(roughly 3 days). With this format, all votes get the same time. We instead propose that another block height beginVotingBlock
is added such that:
- The block height interval
[startBlock, beginVotingBlock)
represents a time where no votes are allowed to be cast but the proposal is on-chain (for provenance) and interested parties can inspect the proposal - The block height interval
[beginVotingBlock, endBlock]
is exactly the same as the current voting interval - We hold the invariant
beginVotingBlock >= startBlock
withstartBlocks == beginVotingBlock
equivalent to the current situation (e.g no formal analysis period)
Using the extra parameter beginVotingBlock
allows for the proposer to signal and declare the following on-chain:
- The proposal requires at least
analysis_time(proposal) = [startBlock, beginVotingBlock)
blocks of analysis. - If
analysisTime(proposal) > analysisTime(proposal')
, whereproposal'
is another proposal, then the proposer signals to all voters thatproposal
is worth more careful analysis (in terms of time) thanproposal'
- By adding this as a parameter to
GovernorAlpha.propose()
each of these analysis periods is documented on-chain for provenance so that the community can later analyze which types of proposals need more/less analysis
The extra work of doing this on-chain will allow for the community to look back upon how different changes require different levels of analysis. This change requires a simple, two-line mutation to contracts/governance/GovernanceAlpha.sol
:
function propose(address[] memory targets, uint[] memory values, string[] memory signatures, bytes[] memory calldatas, string memory description, uint memory analysisTime) public returns (uint) { … uint startBlock = add256(block.number, votingDelay()); uint beginVotingBlock = add256(startBlock, analysisTime); uint endBlock = add256(beginVotingBlock, votingPeriod()); … }
It is our belief that by documenting on-chain the relative amount of difficulty for each proposal, we can provide better analysis and guide informed decisions as Compound Governance manages an ever expanding set of digital assets.