A Farcaster Mini App built on Base blockchain that allows users to endorse builders with on-chain attestations via EAS (Ethereum Attestation Service).
- 🎯 Basename Resolution: Resolves Basenames using CCIP-Read (supports wildcard resolution)
- ⛓️ On-chain Attestations: Creates permanent endorsement records using EAS on Base
- 🎨 Beautiful UI: Modern gradient-based design with intuitive multi-step flow
- 🚀 Skills: Endorse builders as Shippers, Designers, or Big Brains
- 📊 Endorsement Tracking: View endorsement counts broken down by skill type
- 🛡️ Self-Endorsement Prevention: Built-in checks to prevent users from endorsing themselves
- 📱 Mobile Support: Works in Farcaster, Chrome, Safari with multiple wallet connectors
- 🔢 Raw Address Support: Fallback to using 0x addresses directly if resolution fails
- Framework: Next.js 14 with App Router
- Mini App: Farcaster Frame SDK + Wagmi v2
- Blockchain: Base Mainnet (Chain ID: 8453)
- Libraries:
wagmiv2 for wallet connections and transactionsviemfor blockchain interactions@coinbase/onchainkitfor Basename utilities@farcaster/frame-sdkfor Mini App functionality- EAS for on-chain attestations
- Node.js 18+ and npm
- A wallet app (Coinbase Wallet, MetaMask, or Farcaster)
# Install dependencies
npm install
# Run development server
npm run devThe app will be available at http://localhost:3000
Copy .env.example to .env.local:
NEXT_PUBLIC_BASE_RPC_URL=https://mainnet.base.org- Input Screen: User enters a Basename (e.g., "jesse") or 0x address
- Skill Selection: Choose the skill to endorse (Shipper/Designer/Big Brain)
- Confirmation: View resolved address and confirm endorsement
- Connect Wallet: If not connected, wallet connection is triggered
- Transaction: Create EAS attestation on-chain
- Success: View confirmation with link to EASScan
EAS Contract: 0x4200000000000000000000000000000000000021 (Base)
Schema UID: 0xa1380ad137f38b38f91036b612e299ad6b8ebcc86713ff21e9083e1a82add984
Schema: string skill, string comment
The app uses CCIP-Read (EIP-3668) to resolve Basenames:
- Queries Ethereum Mainnet ENS with CCIP-Read support
- Handles wildcard resolution for
*.base.ethsubdomains - Falls back to direct 0x address input if resolution fails
- Local Testing: Run
npm run devand open in browser - Farcaster Testing:
- Deploy to production
- Use Warpcast Frame Validator
- Share in a Warpcast cast
- Mobile Testing: Test on mobile browsers with Coinbase Wallet or MetaMask
npm run build
vercel --prodTo appear in Warpcast's Mini Apps directory:
- Ensure
public/.well-known/farcaster.jsonis deployed - Visit Warpcast Mini App Developer Tools
- Verify ownership of your domain
- Mini App will be indexed automatically
base-endorsement/
├── app/
│ ├── api/
│ │ ├── resolve-basename/ # Basename resolution API
│ │ └── get-endorsement-count/ # Endorsement stats API
│ ├── components/
│ │ ├── EndorsementFlow.tsx # Main endorsement UI
│ │ ├── WagmiProvider.tsx # Wagmi configuration
│ │ └── FarcasterProvider.tsx # Farcaster SDK wrapper
│ ├── layout.tsx # Root layout with providers
│ ├── page.tsx # Homepage
│ └── globals.css # Global styles
├── lib/
│ ├── basename.ts # Basename utilities
│ ├── eas.ts # EAS attestation helpers
│ └── constants.ts # Configuration constants
└── public/
├── icon.png # App icon
└── .well-known/
└── farcaster.json # Mini App manifest
app/components/EndorsementFlow.tsx: Main UI component with multi-step flowapp/api/resolve-basename/route.ts: CCIP-Read basename resolutionapp/api/get-endorsement-count/route.ts: Fetch endorsement statisticslib/basename.ts: Client-side basename utilitieslib/eas.ts: EAS attestation building and ABIlib/constants.ts: Base chain config, schema UID, and skill options
- Skills: Edit
SKILL_OPTIONSinlib/constants.ts - Schema: Update
ENDORSEMENT_SCHEMA_UIDfor custom schemas - Design: Update styles in
app/globals.cssandEndorsementFlow.tsx - Wallet Connectors: Modify
app/components/providers/WagmiProvider.tsx
Feel free to submit issues and enhancement requests!
MIT