PoEP
Prove Humanity. Preserve Privacy.
The problem PoEP 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
-
User taps “Mint PoEP” inside Farcaster.
-
A face hash is created locally and converted into a zero-knowledge proof inside the browser.
-
The proof is sent to the smart contract on Base, which verifies and mints a soul-bound NFT tied to that wallet.
-
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.
Challenges I 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.
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
Tracks Applied (1)
Top 5 New Mini Apps
Cheer Project
Cheering for a project means supporting a project you like with as little as 0.0025 ETH. Right now, you can Cheer using ETH on Arbitrum, Optimism and Base.
