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)
  • Check if the main account has a sufficient wallet balance:
pnpm bal
  • 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.

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
Arbitrum One 42161 Documentation
Sepolia Testnet 11155111 Documentation
OP Sepolia Testnet 11155420 Documentation
Base Sepolia Testnet 84532 Documentation
Arbitrum Sepolia 421614 Documentation

Contract Verification

Network Explorer URL API URL API Key Variable
Optimism https://optimistic.etherscan.io https://api-optimistic.etherscan.io/api OP_ETHERSCAN_API_KEY
Base https://basescan.org https://api.basescan.org/api BASE_ETHERSCAN_API_KEY
Arbitrum One https://arbiscan.io https://api.arbiscan.io/api ARBITRUM_ETHERSCAN_API_KEY
Sepolia https://sepolia.etherscan.io https://api-sepolia.etherscan.io/api ETHERSCAN_API_KEY
OP Sepolia https://sepolia-optimism.etherscan.io https://api-sepolia-optimistic.etherscan.io/api OP_ETHERSCAN_API_KEY
Base Sepolia https://sepolia.basescan.org https://api-sepolia.basescan.org/api BASE_ETHERSCAN_API_KEY
Arbitrum Sepolia https://sepolia.arbiscan.io https://api-sepolia.arbiscan.io/api ARBITRUM_ETHERSCAN_API_KEY

Variants

Crosschain

  • Make sure the main account, as well as Alice and Bob accounts have a sufficient balance on OP Sepolia, Arbitrum Sepolia and Base Sepolia
  • Set the initial parameters of the test DAO in dao.config.ts
  • Run the deploy-and-test.sh script:
chmod +x scripts/deploy-and-test.sh
./scripts/deploy-and-test.sh --salt "<CUSTOM_SALT_HERE>"

Core Dependencies

Support

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