
PoEP
Prove Humanity. Preserve Privacy.
Demo
About
The problem it solves 🪪 **PoEP – Proof-of-Existence Passport** *The first human-native identity layer on Base* **The Problem** Base today has millions of active wallets, but no concept of on-chain reputation. Incentive programs are bleeding value because of sybil farmers — about **15%** of budgets lost (~**$60M** per year). At the same time, apps that try to fight bots using KYC face a **32%** user drop-off. Teams are forced to choose between privacy invasion or bot chaos. **The Solution** PoEP (Proof-of-Existence Passport) is a soul-bound NFT that proves you are a unique human, without leaking personal data. It is minted in one click through a Farcaster Frame, using zero-knowledge proofs generated in the browser. Once minted, every on-chain action automatically updates your trust score, creating a live identity layer that dApps on Base can use instantly. **This means:** **For users** → No hardware, no KYC, no friction. **For developers** → A single view-call gives access to a wallet’s trust score. **For Base** → Reduced sybil attacks, more real humans, more gas demand. **How It Works** 1. User taps “**Mint PoEP**” inside Farcaster. 2. A face hash is created locally and converted into a zero-knowledge proof inside the browser. 3. The proof is sent to the smart contract on Base, which verifies and mints a soul-bound NFT tied to that wallet. 4. Each time the user interacts on-chain, their trust score increases automatically, visible in the NFT metadata. **Why It Matters** **Privacy first**: No PII, no phone numbers, no central servers. **Cheap & fast**: Proofs generate in ~1 second; minting costs less than $0.02 on Base. **Composable**: Any Base dApp can use the trust score to offer perks (like fee rebates or better loan terms). **Economic impact**: Saves Base ~$60M per year in sybil losses while driving new recurring gas fees and higher user LTV. **Technologies We Used ** **Circom + Groth16 + SnarkJS (WASM)**: To generate zero-knowledge proofs directly inside the browser in under 2 seconds. This makes the flow hardware-free (no Orb like Worldcoin) and globally accessible. **Solidity Smart Contracts on Base**: To verify proofs, mint the PoEP NFT, and store the evolving trust score. The mint cost is $0.02), making it practical for mass adoption. **nft.storage + IPFS**: To store the NFT metadata and trust score attributes in a decentralized, censorship-resistant way. Metadata updates happen off-chain, but the tokenURI stays constant. **TheGraph + Node Bot**: To index on-chain activity and update trust scores in near real-time. This prevents the lag that would come with manual polling. **Farcaster Frames**: To give users a one-click minting flow inside Warpcast, reducing friction compared to standalone dApps. **Roadmap** **Week 1**: 10k human mints. **Week 4**: 50 dApps integrate PoEP trust scores. **Month 3**: DAO treasury launch, with small query fees feeding back into Base. Smart Contract Address(es) POEP_CONTRACT_ADDRESS=0xDDaad7df1b101B8042792C7b54D2748C3220712f Other Onchain Proof PoEP (Passport) — Base Mainnet (8453) **Address**: 0xDDaad7df1b101B8042792C7b54D2748C3220712f **Explorer**: https://basescan.org/address/0xDDaad7df1b101B8042792C7b54D2748C3220712f ****Deployment Tx: ****https://basescan.org/tx/0xe839613798d66694536b36ca6597ad04abf02645bc5f099ccebda9a839ba7266 **Deployer:** 0x3253Ea72908f09B938DB572a690aFa005fcC1341 **Block:** 34472750
How it's made
Challenges we ran into Mobile wallets not connecting **Symptom**: Only injected connector was configured, so mobile users couldn’t connect. **Fix:** Added WalletConnect initially, then migrated to Reown AppKit for a better mobile UX. Updated peop-mini/src/components/providers/WagmiProvider.tsx to use @reown/appkit-adapter-wagmi and <appkit-button> in peop-mini/src/components/WalletWrapper.tsx. Added NEXT_PUBLIC_REOWN_PROJECT_ID to .env and Vercel. **Reown type conflicts and build failure** **Symptom**: Type error “Type 'WagmiAdapter' is not assignable to type 'ChainAdapter'” during next build. **Root cause**: Duplicate/locked dependency trees and multiple lockfiles caused mismatched @reown/* versions. **Fix:** Clean reinstall in peop-mini/ (removed node_modules and package-lock.json, re-ran npm install). Ensured Reown packages resolve to a single version. Build passed. **Next.js lockfile/root tracing warning** **Symptom:** Next inferred workspace root due to multiple lockfiles in the monorepo. **Impact: **No functional break, but noisy builds. **Mitigation:** Proceeded with builds; noted we can set outputFileTracingRoot in next.config.ts later to silence warning. **Farcaster Mini App “Ready not called”** **Symptom**: Mini app wouldn’t finish initializing. **Root cause:** Mixing older SDK patterns and providers. **Fix:** Standardized on @farcaster/miniapp-sdk with await sdk.context and await sdk.actions.ready() inside MiniAppHome (peop-mini/src/components/HomePage.tsx). Added a small timeout and try/catch to ensure readiness. ** Component API mismatch after swapping connect UI** **Symptom:** HomePage.tsx passed className/text props to WalletWrapper, which no longer accepted them after switching to <appkit-button>. **Fix:** Updated peop-mini/src/components/HomePage.tsx to render <WalletWrapper /> without props. **Webpack externals and SDK aliasing** **Symptom**: Bundle issues with server-only deps in browser and SDK import inconsistencies. **Fix:** Added externals in peop-mini/next.config.ts for pino-pretty, lokijs, encoding. Added alias to map @farcaster/frame-sdk to @farcaster/miniapp-sdk for consistency. **Local Frog dev 404s (Frame app)** **Symptom:** Persistent 404 in local Next.js route handling for frames. **Fix/Workaround: **Used Frog Devtools at http://localhost:5180/ for local testing and recommended deploying to Vercel where routing works reliably. **Contract and indexer issues (earlier phase)** **Symptom:** Solidity compile errors and subgraph mapping failures. **Fix:** Replaced deprecated _exists() with _ownerOf() in the contract. Added missing ABIs. Fixed mapping handlers. Verified indexer build. **What unblocked progress** **Standardized SDK usage**: Unified around @farcaster/miniapp-sdk and Reown AppKit. **Clean dependency tree**: Deleted lockfile/node_modules and reinstalled to resolve adapter type conflicts. **Clear env setup:** Added NEXT_PUBLIC_REOWN_PROJECT_ID locally and on Vercel to ensure the modal initializes on prod. **Incremental UI adaption**: Updated WalletWrapper and HomePage.tsx to match the new connect flow.