Foundational mechanisms and structures that define how decentralized networks make collective decisions and enact changes.
How Onchain Governance Proposals Work
Core Governance Concepts
Governance Tokens
Governance tokens are assets that confer voting rights within a protocol. They are the primary vehicle for stakeholder participation.
- Represent voting power, often proportional to the amount held or staked.
- Used to create, debate, and vote on proposals for protocol upgrades, parameter changes, or treasury allocations.
- Their value is intrinsically linked to the perceived health and future of the governed protocol, aligning holder incentives.
On-Chain vs. Off-Chain Voting
The distinction between where voting signals are recorded and how they are executed. On-chain voting records votes directly on the blockchain as transactions.
- Votes are binding and automatically trigger execution if the proposal passes (e.g., a smart contract upgrade).
- Off-chain voting uses platforms like Snapshot for gas-free signaling, with execution requiring a separate, trusted multisig transaction.
- This separation allows for efficient discussion but introduces execution latency and potential centralization risk.
Proposal Lifecycle
The structured process a governance idea follows from inception to implementation. It ensures thorough review and community consensus.
- Temperature Check: An informal off-chain poll to gauge initial sentiment.
- Consensus Check: A more formalized discussion to refine the proposal details and build support.
- Governance Vote: The final, binding on-chain vote to approve or reject the executable proposal.
- This phased approach prevents spam and allows for iterative improvement of ideas.
Quorum & Voting Thresholds
Critical parameters that determine the validity and outcome of a governance vote. Quorum is the minimum percentage of voting power that must participate for a vote to be valid.
- Approval Threshold is the minimum percentage of yes votes required for a proposal to pass (e.g., a simple majority or a supermajority).
- Setting these correctly is crucial to balance between security (preventing low-participation attacks) and progress (avoiding paralysis).
- Protocols often adjust these parameters via governance itself.
Delegation & Vote Escrow
Mechanisms to consolidate voting power and align long-term incentives. Delegation allows token holders to assign their voting rights to other addresses (delegates) without transferring custody.
- Vote-Escrow (ve) models lock tokens for a set period, granting boosted voting power proportional to the lock duration.
- This encourages long-term alignment, as voters with "skin in the game" have greater influence.
- It addresses the issue of low voter participation by creating professional delegates.
Treasury Management
The process of governing a protocol's native asset reserves, typically funded by fees or token issuance. The treasury is a smart contract holding assets used for grants, incentives, and operational expenses.
- Proposals can request funds for developer grants, liquidity mining programs, or security audits.
- Effective treasury management is vital for long-term sustainability and funding public goods.
- It represents a major responsibility of token holders, requiring careful economic analysis.
The Proposal Lifecycle
Process overview
Draft and Signal
Formalize the idea and gauge community sentiment.
Detailed Instructions
Begin by drafting a formal proposal document, often using a template like the Ethereum Improvement Proposal (EIP) or a DAO-specific format. This document must clearly define the proposal type (e.g., treasury spend, parameter change), the rationale, and the technical specification. Before submitting onchain, share the draft on governance forums (e.g., Commonwealth, Discourse) to signal for feedback.
- Sub-step 1: Post the draft RFC (Request for Comments) on the official forum.
- Sub-step 2: Engage with community feedback, iterating on the proposal's technical and economic details.
- Sub-step 3: Reach a rough consensus or identify key objections before proceeding to a temperature check snapshot.
markdown# Proposal: Increase Protocol Fee to 0.05% **Summary:** Adjust fee parameter in `FeeCollector.sol`. **Motivation:** To sustainably fund grants program.
Tip: A successful signal phase demonstrates community alignment and reduces the risk of a failed, gas-expensive onchain vote.
Onchain Submission and Queueing
Deploy the proposal contract and enter a timelock queue.
Detailed Instructions
Once signaled, the proposal must be submitted onchain. This typically involves a privileged transaction from a proposer (often requiring a minimum token balance or delegate count). The submission transaction deploys or points to a proposal contract containing the executable calldata. Upon submission, the proposal enters a timelock queue, a mandatory delay period (e.g., 48-72 hours) before voting can begin, allowing users to review final code.
- Sub-step 1: Call the governance contract's
propose()function with targets, values, and calldata. - Sub-step 2: Verify the proposal ID is emitted in the event log and appears on block explorers.
- Sub-step 3: Monitor the timelock contract (
TimelockController) for the scheduled execution transaction.
solidity// Example call to an OpenZeppelin Governor `propose` function propose( targets: [0x1234...], values: [0], calldatas: ["0xabcd..."], description: "Proposal to upgrade Vault contract" );
Tip: The timelock period is a critical security feature, providing a final window to detect malicious proposals.
Active Voting Period
Token holders cast votes weighted by their governance power.
Detailed Instructions
After the timelock delay, the voting period (e.g., 3-7 days) begins. Voting power is typically calculated via a snapshot of token balances or delegate votes at a specific block. Voters cast their choice (For, Against, Abstain) by signing a transaction or using gasless signing via tools like Snapshot or Tally. Key mechanisms include vote delegation (where users can delegate their voting power to others) and quorum requirements (a minimum percentage of total supply must participate for the vote to be valid).
- Sub-step 1: Connect wallet to governance UI (e.g., Tally, Boardroom) to see active proposals.
- Sub-step 2: Review the final proposal details and linked discussion before casting your vote.
- Sub-step 3: Sign the vote transaction or message, choosing your support stance.
solidity// Core voting logic often checks a snapshot of delegated votes function _getVotes(address account, uint256 blockNumber) internal view returns (uint256) { return _delegates[account].getPastVotes(account, blockNumber); }
Tip: Voting strategies can be complex, incorporating staked LP tokens or time-locked veTokens, so verify your calculated voting power.
Execution and Challenge
Successful proposals are executed; contested ones may face a challenge.
Detailed Instructions
If the vote meets quorum and passes the required vote threshold (e.g., simple majority or supermajority), the proposal moves to the execution phase. Anyone (usually the proposer or a keeper) can call the execute() function on the governance contract, which relays the calldata through the timelock to the target contracts. In systems with optimistic governance (like Arbitrum), passed proposals enter a challenge period where they can be disputed by bonding funds and escalating to a dispute resolution layer.
- Sub-step 1: After the voting period ends, confirm the final vote tally and quorum on the governance dashboard.
- Sub-step 2: Call the
executefunction, paying the gas fee to trigger the state changes. - Sub-step 3: In optimistic systems, monitor the challenge period for any disputes before execution is finalized.
solidity// Example execution call in a Governor contract function execute( address[] memory targets, uint256[] memory values, bytes[] memory calldatas, bytes32 descriptionHash ) public payable returns (uint256 proposalId);
Tip: Failed proposals can often be resubmitted. Analyze the voting patterns to understand the opposition before redrafting.
Common Governance Models
Direct Token Voting
Token-based voting is the most prevalent model where voting power is directly proportional to the quantity of governance tokens held or staked. This creates a plutocratic system where large holders have significant influence. Proposals are typically submitted on-chain, and token holders vote directly from their wallets during a specified period.
Key Characteristics
- One-token-one-vote: Power scales linearly with token ownership, though some systems use quadratic voting to reduce whale dominance.
- On-chain execution: Successful proposals often trigger automated execution via smart contracts, reducing reliance on a core team.
- Delegation: Voters can delegate their voting power to representatives or experts without transferring token custody.
Example
Compound and Uniswap use this model. A proposal to adjust the COMP token distribution rate or add a new market to Uniswap V3 would be voted on by holders of COMP or UNI tokens, respectively. The vote outcome is binding and executed by the protocol's governance module.
Types of Governance Proposals
Comparison of common proposal categories and their characteristics.
| Proposal Type | Typical Scope | Voting Duration | Quorum/Threshold | Example |
|---|---|---|---|---|
Parameter Change | Adjust a single protocol parameter (e.g., interest rate, fee). | 3-7 days | Low (e.g., 4% quorum, 50% for) | Change Compound's cETH collateral factor from 82% to 85%. |
Treasury Spend | Allocate funds from the community treasury for a specific initiative. | 5-10 days | Moderate (e.g., 10% quorum, 60% for) | Grant 100,000 USDC to a developer team for protocol integration. |
Contract Upgrade | Deploy new logic or upgrade critical smart contract systems. | 7-14 days | High (e.g., 20% quorum, 70% for) | Migrate Uniswap v3 Factory to a new, gas-optimized implementation. |
Governance Meta-Change | Modify the governance process itself (e.g., voting period, quorum). | 7-14 days | Very High (e.g., 30% quorum, 67% for) | Increase the Aave governance voting delay from 1 day to 2 days. |
Informational/Signal | Gauge community sentiment on a direction without executing code. | 3-5 days | Low (e.g., 2% quorum, simple majority) | Should the DAO explore launching on a new Layer 2 network? |
Emergency Action | Execute a time-sensitive action, often via a multisig or guardian. | 24-48 hours | High (e.g., 80% of multisig signers) | Pause borrowing on a lending protocol due to a critical vulnerability. |
Creating a Governance Proposal
Process overview for drafting, funding, and submitting a formal proposal to a DAO or on-chain governance system.
Draft the Proposal
Define the proposal's purpose, specifications, and on-chain actions.
Detailed Instructions
Begin by clearly defining the proposal's objective, whether it's a parameter change, treasury allocation, or smart contract upgrade. Write a detailed specification document (often a Temperature Check or Request for Comment) outlining the rationale, technical implementation, and expected impact. This document should be shared in the community forum for initial feedback. The core of the proposal is the executable calldata, which encodes the exact function calls to be executed upon passage. This typically involves the target contract address, function signature, and encoded arguments.
solidity// Example calldata for a Compound-style proposal to set a new interest rate model // target: Comptroller contract // signature: _setCompSpeed(address cToken, uint compSpeed) bytes memory data = abi.encodeWithSignature("_setCompSpeed(address,uint256)", cTokenAddress, newSpeed);
Tip: Use a calldata encoder or a library like
ethers.utils.Interfaceto generate the data payload correctly.
Secure Proposal Submission Requirements
Meet the protocol's prerequisites, typically a minimum token deposit or delegate support.
Detailed Instructions
Most governance systems require proposers to meet a proposal threshold before submission. This is often a minimum balance of governance tokens, which may need to be self-delegated or held by a specific delegate. For example, Uniswap governance requires 2.5M UNI delegated to your address. Alternatively, some systems like Compound use a proposal deposit (e.g., 100 COMP) that is refunded only if the proposal passes a preliminary vote. Verify your wallet holds the required tokens and that your voting power is correctly reflected on the governance dashboard. If using a deposit, ensure you approve the governance contract to spend your tokens.
- Check the protocol's documentation for the exact current threshold.
- Use
getPriorVotes(address account, uint blockNumber)to verify your delegate voting power. - For a deposit, call
approve(governanceAddress, depositAmount)on the token contract first.
Tip: The required block number for vote snapshot is often one block before proposal creation, so confirm the latest protocol parameters.
Submit the Proposal On-Chain
Call the governance contract's propose function with the formalized data.
Detailed Instructions
Interact directly with the governance smart contract's propose function. The function arguments typically include: an array of target addresses, an array of values (usually zero for non-payable calls), an array of calldata strings, and a description hash (the IPFS hash of your proposal description). The description is usually stored off-chain on IPFS, and its hash is submitted on-chain for immutability. Use a tool like Pinata to pin the description JSON to IPFS and obtain the CID. The transaction will revert if the proposer's voting power is below the threshold.
solidity// Example interaction for a GovernorBravo-style contract function propose( address[] memory targets, uint256[] memory values, string[] memory signatures, bytes[] memory calldatas, string memory description ) public returns (uint256 proposalId);
- Targets:
[0x3d9819210A31b4961b30EF54bE2aeD79B9c9Cd3B] - Values:
[0] - Signatures:
[""](if using raw calldata) - Calldatas:
[data](bytes from Step 1) - Description:
"QmXyZ..."(IPFS hash)
Tip: Estimate gas carefully; proposal submission is a complex transaction and may require a higher gas limit.
Monitor Proposal State and Campaign
Track the proposal lifecycle and advocate for its passage during the voting period.
Detailed Instructions
After submission, the proposal enters a pending state until the voting delay elapses. Use the governance contract's state(proposalId) function to monitor its status (0=Pending, 1=Active, 2=Canceled, 3=Defeated, 4=Succeeded, 5=Queued, 6=Expired, 7=Executed). Once active, the voting period begins (e.g., 3-7 days). Proposers must actively campaign, explaining the proposal's benefits in forums and social channels to secure votes. Large token holders (whales) and delegates are key targets for outreach. Monitor voting power alignment using on-chain explorers or dashboards like Tally. Be prepared to answer technical questions about the calldata and its implications.
- Query state:
await governor.state(proposalId); - Track votes:
await governor.getVotes(account, proposalSnapshotBlock); - Calculate quorum:
(forVotes + againstVotes) >= quorumVotes
Tip: The proposal
proposalIdis a unique uint256 derived from hashing the proposal data. Save this ID for all future tracking.
Execute or Queue the Successful Proposal
Finalize the process by executing the approved on-chain actions.
Detailed Instructions
If the proposal succeeds (passes quorum and majority vote), it must be executed. Some systems, like GovernorBravo, require a two-step process: first queue, then execute. The queue function moves the proposal to a timelock contract, introducing a mandatory delay (e.g., 48 hours) to allow users to react to the passed decision. After the timelock expires, anyone can call execute to run the encoded calldata on the target contracts. Ensure the transaction is sent to the correct contract (Governor or Timelock) and that you have the latest proposalId. Execution will fail if the proposal state is not Queued and ready, or if the underlying transaction would revert.
solidity// Example execution flow for a timelock system // 1. Queue the proposal timelock.queueTransaction(target, value, signature, data, eta); // 2. After delay, execute it timelock.executeTransaction(target, value, signature, data, eta);
- Verify execution ETA (Estimated Time of Arrival) from the queue transaction logs.
- Check that target contract states haven't changed to make the call fail.
Tip: The
executefunction is permissionless; you can use a service like Etherscan to send the transaction if your wallet lacks gas.
Security and Attack Vectors
Comparison of common attack vectors and their mitigation strategies in onchain governance.
| Attack Vector | Description | Common Mitigations | Example Protocols |
|---|---|---|---|
51% Attack / Token Majority | An entity acquires majority voting power to pass malicious proposals. | Time-locks, veto mechanisms, progressive decentralization. | Compound (Governor Bravo), Uniswap |
Proposal Spam | Flooding the system with proposals to paralyze governance. | Proposal submission deposits, minimum vote thresholds. | MakerDAO, Aave |
Voter Apathy / Low Participation | Low turnout allows a small, coordinated group to decide outcomes. | Incentive programs (token rewards), delegation systems. | Curve (veCRV), Optimism (Citizens' House) |
Flash Loan Manipulation | Borrowing large sums to temporarily sway voting power for a proposal. | Snapshot voting with time-weighted averages, vote delay mechanisms. | Aave, early MakerDAO incidents |
Governance Token Exploit | Direct theft or compromise of governance tokens to seize control. | Multi-signature timelocks, decentralized treasuries (Gnosis Safe). | Various DAO treasury attacks |
Parameter Manipulation | Exploiting poorly configured governance parameters (e.g., quorum). | Conservative initial settings, slow parameter adjustment processes. | Early DeFi protocols |
Bribery/Vote Buying | Openly or covertly paying voters to support a specific outcome. | Futarchy, conviction voting, privacy-preserving techniques. | DAO research, Gitcoin Grants |
Protocol Examples and Resources
Governance Proposal FAQs
A signaling proposal is non-binding and used to gauge community sentiment on a topic, such as a future protocol direction. An executable proposal contains code that, if passed, will be automatically executed by the protocol's governance module to modify onchain parameters or smart contract logic.
- Signaling: Used for discussion, no direct state change.
- Executable: Includes a payload (calldata) for a specific function call.
- Example: Compound's Proposal 62 was a signaling vote to add COMP rewards to a new market, while Proposal 117 was an executable vote to update the
borrowCapfor a specific asset to 300,000 units.