Web3 DAO enabling domain-restricted, anonymous voting via ZK email proofs on Base Goerli.
DAO Based on Email Proofs is a privacy-focused, Web3 voting system that lets organizations restrict participation to members of a specific email domain without ever exposing voters’ full addresses on chain. Users prove domain ownership via VLayer’s zero-knowledge email proofs, then connect a crypto-wallet (e.g., MetaMask) to cast a single vote per round. All ballots are recorded on Base Goerli, and organizers verify their own domain using VLayer Web2 proofs before launching any poll. Optionally, newcomers can claim sponsored gas from an on-chain faucet, and results can be automatically summarized with an AI helper.
Disclaimer: This app was not completed in time for the hackathon and does not currently support email verification.
The core of the application was developed using a React + Vite frontend, leveraging Wagmi and Viem for Web3 wallet integration. On the backend, a Node.js (Express) server handles API routes and business logic. Due to time constraints, the VLayer email-proof flow was scaffolded but not fully implemented—users cannot yet verify their email domains.
Smart contracts were written in Solidity and deployed to Base Goerli. The main contracts include:
VotingFactory.sol – Allows organizers to create new voting rounds.
VotingRound.sol – Manages a single poll’s lifecycle: proposal setup, vote casting, and result tallying.
GasFaucet.sol – Enables sponsored-gas claims by sending a small ETH allowance to new wallets.
EmailAccessProver.sol / EmailAccessVerifier.sol – Intended to handle zero-knowledge email proofs; these contracts are present but not yet wired into the frontend/backend.
On the frontend, the App.tsx and Dashboard.tsx components provide:
A wallet-connect button (MetaMask via Wagmi).
Listing of active voting rounds fetched from the backend.
“Create Poll” and “Vote” interfaces that interact with the deployed contracts via Viem.
“Claim Gas” functionality that calls the GasFaucet contract; this is fully operational.
Backend routes in userRouter.js and voteRouter.js use controllers (usersController.js, votesController.js) to:
Register new organizers (placeholder for domain-verification steps).
Fetch all polls, create new polls, and record off-chain metadata.
Trigger smart contract deployments (factory pattern) and return contract addresses to the frontend.
MongoDB models (userModel.js, voteModel.js) store organizer profiles and poll metadata. Although the schema reserves fields for email-proof artifacts (e.g., ZK proof data), the actual verification flow is not hooked up, so domain checks are skipped.
In summary, the application’s architecture is in place—React+Wagmi/HTTP↔Node.js/Express↔MongoDB↔Hardhat/Solidity↔Base Goerli—but the email-proof integration remains incomplete.