A DAO framework built with Open Zeppelin's Governor contract in combination with NFTs.
Since v0.10.0
, Gov is using non-tranferable membership NFTs ("SBTs"), it is also timestamp-based by default.
Provide a coordination tool that fits the needs of regular users.
pnpm install
pnpm test
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.
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
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.
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 |
Feel free to reach out to Julien: Farcaster, Element, Status, Telegram, Twitter, Discord, or LinkedIn.