Decentralized Autonomous Organizations
Governance tokens, voting mechanisms, proposals, and DAO tooling.
Overview
DAOs are organizations governed by token holders.
Governance Token
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.19;
import "@openzeppelin/contracts/token/ERC20/ERC20.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
contract GovernanceToken is ERC20, Ownable {
constructor() ERC20("GovToken", "GOV") {
_mint(msg.sender, 1000000 * 10**decimals());
}
function mint(address to, uint256 amount) public onlyOwner {
_mint(to, amount);
}
}
Simple DAO
contract SimpleDAO {
struct Proposal {
string description;
uint256 forVotes;
uint256 againstVotes;
bool executed;
mapping(address => bool) hasVoted;
}
GovernanceToken public token;
Proposal[] public proposals;
function propose(string memory description) public {
require(token.balanceOf(msg.sender) >= 1000);
proposals.push(Proposal(description, 0, 0, false));
}
function vote(uint256 proposalId, bool support) public {
Proposal storage proposal = proposals[proposalId];
require(!proposal.hasVoted[msg.sender]);
uint256 votes = token.balanceOf(msg.sender);
if (support) {
proposal.forVotes += votes;
} else {
proposal.againstVotes += votes;
}
proposal.hasVoted[msg.sender] = true;
}
function execute(uint256 proposalId) public {
Proposal storage proposal = proposals[proposalId];
require(!proposal.executed);
require(proposal.forVotes > proposal.againstVotes);
proposal.executed = true;
// Execute proposal logic
}
}
Voting Mechanisms
| Type | Description |
|---|---|
| Token-weighted | Votes proportional to tokens |
| Quadratic | Square root of tokens |
| Conviction | Time-weighted voting |
| Delegation | Delegate voting power |
DAO Tools
| Tool | Purpose |
|---|---|
| Snapshot | Off-chain voting |
| Tally | On-chain governance |
| Aragon | DAO framework |
| Governor | OpenZeppelin contracts |
Practice
Create a DAO with governance voting.