This repo is meant to give you all the knowledge you need to start a DAO and do governance. Since what's the point of a DAO if you can't make any decisions! There are 2 main kinds of doing governance.
Feature | On-Chain Governance | Hybrid Governance |
---|---|---|
Gas Costs | More Expensive | Cheaper |
Components | Just the blockchain | An oracle or trusted multisig |
A typical on-chain governance structure might look like:
- ERC20 based voting happens on a project like Tally, but could hypothetically be done by users manually calling the vote functions.
- Anyone can execute a proposal once it has passed Examples Compound
On-chain governance can be much more expensive, but involves fewer parts, and the tooling is still being developed.
A typical hybrid governance with an oracle might look like:
- ERC20 based voting happens on a project like Snapshot
- An oracle like Chainlink is used to retreive and execute the answers in a decentralized manner.
A typical hybrid governance with a trusted multisig might looks like:
- ERC20 based voting happens on a project like Snapshot
- A trusted gnosis multisig is used to exectue the results of snapshot. Examples: Snapsafe
Hybrid governance is much cheaper, just as secure, but the tooling is still being developed.
Tools:
- Snapshot
- UI for off-chain voting / sentiment analysis
- Tally
- UI for on-chain voting
- Gnosis Safe
- Multi-sig
- Openzeppelin
- DAO code tools
- Zodiac
- More DAO code tools
- Openzeppelin Defender
- A tool to propose governance and other contract functions.
The following have tools to help you start a DAO without having to deploy contracts yourself.
- DAO Stack
- Aragon
- lol, just kidding. Here is the real link.
- Colony
- DAOHaus
- DAO Leaderboard
This is an example of how to list things you need to use the software and how to install them.
- Python
- brownie
python3 -m pip install --user pipx python3 -m pipx ensurepath # restart terminal pipx install eth-brownie
If you want to test and run locally:
- nodejs & npm
- yarn
npm install -g yarn
- Clone this repo:
git clone https://github.com/brownie-mix/dao-mix cd dao-mix
- Install hardhat
yarn add hardhat
If you want to deploy to a testnet:
3. Add a .env
file with the same contents of .env.example
, but replaced with your variables.
- DO NOT PUSH YOUR PRIVATE_KEY TO GITHUB
- Add
dotenv: .env
to yourbrownie-config.yaml
We have just 1 script in the scripts
folder at the moment. This will take you through the whole process of governance.
- We will deploy an ERC20 token that we will use to govern our DAO.
- We will deploy a Timelock contract that we will use to give a buffer between executing proposals.
- Note: The timelock is the contract that will handle all the money, ownerships, etc
- We will deploy our Governence contract
- Note: The Governance contract is in charge of proposals and such, but the Timelock executes!
- We will deploy a simple Box contract, which will be owned by our governance process! (aka, our timelock contract).
- We will propose a new value to be added to our Box contract.
- We will then vote on that proposal.
- We will then queue the proposal to be executed.
- Then, we will execute it!
brownie run scripts/governance_standard/deploy_and_run.py
Or, to a testnet
brownie run scripts/governance_standard/deploy_and_run.py --network kovan
You can also use the Openzeppelin contract wizard to get other contracts to work with variations of this governance contract.
This sectoin is still being developed.
Deploy your ERC20 and make proposals in snapshot.
- [] Add Upgradeability examples with the UUPS proxy pattern
- [] Add Chainlink Oracle Integration with Snapsafe example
See the open issues for a full list of proposed features (and known issues).
Contributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are greatly appreciated.
If you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the tag "enhancement". Don't forget to give the project a star! Thanks again!
- Fork the Project
- Create your Feature Branch (
git checkout -b feature/AmazingFeature
) - Commit your Changes (
git commit -m 'Add some AmazingFeature'
) - Push to the Branch (
git push origin feature/AmazingFeature
) - Open a Pull Request
Distributed under the MIT License. See LICENSE.txt
for more information.
Brownie - @BrownieEth Patrick Collins - @patrickalphac
- Openzeppelin Governance Walkthrough
- Openzeppelin Governance Github
- Vitalik on DAOs
- Vitalik on On-Chain Governance
- Vitalik on Governance in General
You can check out the openzeppelin javascript tests for a full suite of an example of what is possible.