Home

Awesome

DAO Template

This has been updated to work with Sepolia over Goerli

Need The Javascript Version? Grab it here -> Dao in Javascript Repo

<div id="top"></div>

You can also see the python/brownie version of this here.

<!-- ABOUT THE PROJECT -->

About

How to DAO

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.

FeatureOn-Chain GovernanceHybrid Governance
Gas CostsMore ExpensiveCheaper
ComponentsJust the blockchainAn oracle or trusted multisig

A typical on-chain governance structure might look like:

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:

A typical hybrid governance with a trusted multisig might looks like:

Hybrid governance is much cheaper, just as secure, but the tooling is still being developed.

Tools:

No Code Tools

The following have tools to help you start a DAO without having to deploy contracts yourself.

<p align="right">(<a href="#top">back to top</a>)</p> <!-- GETTING STARTED -->

Getting Started

It's recommended that you've gone through the hardhat getting started documentation before proceeding here.

Requirements

Installation

  1. Clone this repo:
git clone https://github.com/PatrickAlphaC/dao-template
cd dao-template
  1. Install dependencies
yarn

or

npm i 
  1. Run the test suite (which also has all the functionality)
yarn hardhat test

or

npx hardhat test

If you want to deploy to a testnet: 4. Add a .env file with the same contents of .env.example, but replaced with your variables. WARNING WARNING WARNING

DO NOT PUSH YOUR PRIVATE_KEY TO GITHUB

Optional Gitpod

If you can't or don't want to run and install locally, you can work with this repo in Gitpod. If you do this, you can skip the clone this repo part.

Open in Gitpod

<!-- USAGE EXAMPLES -->

Usage

On-Chain Governance Example

Here is the rundown of what the test suite does.

  1. We will deploy an ERC20 token that we will use to govern our DAO.
  2. We will deploy a Timelock contract that we will use to give a buffer between executing proposals.
    1. Note: The timelock is the contract that will handle all the money, ownerships, etc
  3. We will deploy our Governence contract
    1. Note: The Governance contract is in charge of proposals and such, but the Timelock executes!
  4. We will deploy a simple Box contract, which will be owned by our governance process! (aka, our timelock contract).
  5. We will propose a new value to be added to our Box contract.
  6. We will then vote on that proposal.
  7. We will then queue the proposal to be executed.
  8. Then, we will execute it!

Additionally, you can do it all manually on your own local network like so:

  1. Setup local blockchain
yarn hardhat node
  1. Propose a new value to be added to our Box contract

In a second terminal (leave your blockchain running)

yarn hardhat run scripts/propose.ts --network localhost
  1. Vote on that proposal
yarn hardhat run scripts/vote.ts --network localhost
  1. Queue & Execute proposal!
yarn hardhat run scripts/queue-and-execute.ts --network localhost

You can also use the Openzeppelin contract wizard to get other contracts to work with variations of this governance contract.

Off-Chain governance Example

This sectoin is still being developed.

Deploy your ERC20 and make proposals in snapshot.

<p align="right">(<a href="#top">back to top</a>)</p> <!-- ROADMAP -->

Roadmap

See the open issues for a full list of proposed features (and known issues).

<p align="right">(<a href="#top">back to top</a>)</p> <!-- CONTRIBUTING -->

Contributing

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!

  1. Fork the Project
  2. Create your Feature Branch (git checkout -b feature/AmazingFeature)
  3. Commit your Changes (git commit -m 'Add some AmazingFeature')
  4. Push to the Branch (git push origin feature/AmazingFeature)
  5. Open a Pull Request
<p align="right">(<a href="#top">back to top</a>)</p> <!-- LICENSE -->

License

Distributed under the MIT License. See LICENSE.txt for more information.

<p align="right">(<a href="#top">back to top</a>)</p> <!-- CONTACT -->

Contact

Hardhat - @HardhatHQ Patrick Collins - @patrickalphac

<p align="right">(<a href="#top">back to top</a>)</p> <!-- ACKNOWLEDGMENTS -->

Acknowledgments

<p align="right">(<a href="#top">back to top</a>)</p>

You can check out the openzeppelin javascript tests for a full suite of an example of what is possible.