🔄 Proposal Lifecycle: Upgrades & Forks
Understand how protocol changes get proposed and executed
Upgrade blockchain protocol through voting
Your Progress
0 / 5 completedProposal Lifecycle
The Five Stages
Every governance proposal follows a structured lifecycle from creation to execution. This process includes multiple checkpoints and delays designed to prevent attacks and give stakeholders time to react.
⚡ Interactive Proposal Simulator
Watch a proposal progress through all lifecycle stages:
Pending
Proposal created, waiting for voting delay
Stage Breakdown
1. Pending (Voting Delay)
After proposal creation, a short delay (typically 1 block) gives users time to prepare for voting. This prevents last-minute proposals that catch voters off-guard.
Proposer: 0xABC...DEF
Voting Starts: Block 15,000,001
2. Active (Voting Period)
Token holders cast votes (For, Against, Abstain) during the voting period (3-7 days typically). Voting power is snapshot at proposal creation to prevent manipulation.
Quorum Required: 400,000 votes
Current Votes: 450,000 (65% FOR)
3. Succeeded
Proposal passes if it meets quorum and majority vote FOR. At this stage, the proposal is ready to be queued in the timelock contract but hasn't been executed yet.
FOR: 292,500 (65%)
AGAINST: 112,500 (25%)
Status: PASSED ✓
4. Queued (Timelock)
Proposal is queued in timelock contract with mandatory delay (1-2 days). This gives stakeholders time to exit if they disagree, serving as the last line of defense against harmful proposals.
Timelock Delay: 2 days
Executable After: Block 15,062,000
5. Executed
After timelock expires, anyone can execute the proposal by calling the execute function. The proposed changes are applied to protocol contracts automatically.
Executor: 0x789...GHI
Changes Applied: ✓
Creating a Proposal
Proposals require a minimum token threshold (e.g., 25,000 COMP) to prevent spam. Each proposal contains target addresses, function signatures, calldata, and descriptions.
function propose( address[] targets, uint[] values, string[] signatures, bytes[] calldatas, string description ) returns (uint proposalId) // Example: Change collateral factor targets = [cTokenAddress] values = [0] signatures = ["_setCollateralFactor(uint256)"] calldatas = [abi.encode(75e16)] // 75% description = "Increase ETH collateral factor to 75%"
💡 Key Insight: Snapshot Voting Power
Voting power is recorded at the block when the proposal is created (snapshot block). This prevents users from buying tokens to influence an active vote, then immediately selling after voting. The snapshot mechanism ensures fair representation of stakeholders at the time of proposal creation.