Skip to content
PoEP

PoEP

Prove Humanity. Preserve Privacy.

Created on 21st August 2025

•

PoEP

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

  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.

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

*Built for Farcaster Mini Apps: *Uses @farcaster/miniapp-sdk with proper await sdk.context and await sdk.actions.ready()...Read More

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.

Discussion

Builders also viewed

See more projects on Devfolio