Soulbound NFTs that prove you actually attended an event, using zk-proofs of DKIM-signed emails.
Luma sends "Thanks for joining" emails only to people whose tickets were scanned at entry. Mintmarks verifies the DKIM signature of these emails in a ZK circuit, proving attendance without exposing any personal data. Optional ZKPassport integration prevents sybil attacks by tying each mint to a unique human identity.
Two verification tiers:
- Email-only: Proved you attended
- Passport-verified: Proved you're a unique human
mintmarks.fun/
├── circuits/ # Noir ZK circuits for email verification
├── contracts/ # Solidity smart contracts (ERC-1155 soulbound tokens)
└── web/ # React frontend with Coinbase Smart Wallet integration
- Circuits: Noir + ZK-Email for DKIM verification
- Contracts: Solidity, Foundry, deployed on Ethereum Sepolia and Base Sepolia
- Frontend: React, Vite, TailwindCSS
- Wallets: Coinbase CDP (email login) + RainbowKit (EOA)
- Identity: ZKPassport for sybil resistance
# Clone with submodules
git clone --recursive https://github.com/trionlabs/mintmarks.fun.git
cd mintmarks.fun
# Install dependencies
pnpm install
# Copy environment variables
cp .env.example .env
# Fill in your values (RPC URLs, contract addresses, etc.)cd circuits
# Compile the Noir circuit
pnpm build
# Run circuit tests
pnpm test
# Generate proof from an email
pnpm generate:proof path/to/email.eml
# Generate Solidity verifier
pnpm generate:verifiercd contracts
# Build contracts
pnpm build
# Run tests
pnpm test
# Deploy (requires PRIVATE_KEY and RPC_URL in .env)
forge script script/DeployMintmarks.s.sol --rpc-url $SEPOLIA_RPC_URL --broadcastcd web
# Start dev server
pnpm dev
# Build for production
pnpm buildSee .env.example for all required variables.
┌─────────────┐ ┌──────────────┐ ┌─────────────────┐
│ Gmail API │────▶│ ZK Circuit │────▶│ Mintmarks.sol │
│ (DKIM sig) │ │ (Noir/WASM) │ │ (ERC-1155) │
└─────────────┘ └──────────────┘ └─────────────────┘
│
┌──────┴──────┐
│ ZKPassport │
│ (optional) │
└─────────────┘
MIT