Skip to content
/ gov Public template

A DAO framework built with Open Zeppelin's Governor in combination with NFTs.

License

Notifications You must be signed in to change notification settings

w3hc/gov

Repository files navigation

Gov

A DAO framework built with Open Zeppelin's Governor contract in combination with NFTs.

  • Gov.sol is the Governor contract
  • NFT.sol is the NFT contract (ERC-721)

Since v0.10.0, Gov is using non-tranferable membership NFTs ("SBTs"), it is also timestamp-based by default.

Motivation

Provide a coordination tool that fits the needs of regular users.

Install

pnpm install

Test

pnpm test

Deploy

Create a .env on the model of .env.template:

cp .env.template .env
  • Add your own keys in your .env file
  • Edit the dao.config.ts file (optional)
  • Then deploy to Sepolia:
pnpm deploy:sepolia

Then you can add your DAO in Tally and/or spin up your own interface using Gov UI.

Variants

Crosschain

Make sure that the deployer wallet address is funded on each notwork you want to deploy to:

pnpm bal

Then, you can go ahead and deploy:

pnpm crosschain:sepolia
pnpm crosschain:op-sepolia

Your DAO will be deployed on every networks at the same address.

Then you can follow these steps to verify that proofs can be generated on home chain and claimed on foreign chain:

npx hardhat run scripts/propose.ts --network sepolia
npx hardhat run scripts/verify-proof.ts --network sepolia
npx hardhat run scripts/claim-membership.ts --network op-sepolia

npx hardhat run scripts/gov-burn.ts --network sepolia
npx hardhat run scripts/verify-gov-burn-proof.ts --network sepolia
npx hardhat run scripts/claim-gov-burn.ts --network op-sepolia

npx hardhat run scripts/verify-metadata-proof.ts --network sepolia
npx hardhat run scripts/claim-metadata-update.ts --network op-sepolia

npx hardhat run scripts/verify-manifesto-proof.ts --network sepolia
npx hardhat run scripts/claim-manifesto-update.ts --network op-sepolia

npx hardhat run scripts/gov-voting-delay.ts --network sepolia
npx hardhat run scripts/verify-voting-delay-proof.ts --network sepolia
npx hardhat run scripts/claim-voting-delay.ts --network op-sepolia

npx hardhat run scripts/verify-delegation-proof.ts --network sepolia
npx hardhat run scripts/claim-delegation.ts --network op-sepolia

Security

Here are the differences between the Governor/ERC-721 implementations suggested by Open Zeppelin and ours:

The following function is onlyGovernance, meaning it can only be triggered by a vote.

  • setManifesto() updates the CID.

The following functions are onlyOwner, and since the NFT contract ownership is transferred to the Gov contract, they can only be triggered by a vote.

  • safeMint() adds a new member.
  • govBurn() bans a member.
  • setMetadata() changes the tokenURI of a given NFT ID.

Supported Networks

Network Chain ID Documentation
Optimism Mainnet 10 Documentation
Base Mainnet 8453 Documentation
Sepolia Testnet 11155111 Documentation
OP Sepolia Testnet 11155420 Documentation
Base Sepolia Testnet 84532 Documentation

Core Dependencies

Support

Feel free to reach out to Julien: Farcaster, Element, Status, Telegram, Twitter, Discord, or LinkedIn.