Universal Rate
Social
The problem Universal Rate solves
Reputation is scattered and slow. Today we rate people and projects with Google Forms, Discord polls, and private spreadsheets. It’s hard to compare, easy to game, and rarely portable across communities.
Universal Rate makes reputation collection instant, privacy-preserving, and composable on Farcaster—starting with builders, and designed as a template-driven toolkit so anyone can spin up a rating flow in minutes.
What people can use it for
- Plug-and-play rater: Hackathons, grants, contributor reviews, mentor matching, service providers, event feedback—any scenario where quick, comparable signal matters.
- Share to widen the funnel: One-tap cast with results to boost discovery and collect more signal.
- Public receipts, zero heavy lift: onchain proof on Base creates auditability without custody or complex infra.
How it makes tasks easier/safer
- Parametric “Universal Rate” schema: Categories, weights, and scales are configurable—ship a new rater without rebuilding UI or backend.
- Frictionless & private by default: No doxxing or forced signups; MiniKit QuickAuth + client-only envs for basic use.
- Trustable signal: Leaderboards, recent ratings, and unlockable community averages surface high-signal profiles over time.
- AI-ready (next): Clean APIs and structured scores make it simple to plug into LLM agents—route bounties, surface experts, flag outliers, and focus resources where they matter most.
This MVP (builder example)
- Flow: rate → unlock → share → leaderboards.
- Proof: optional Base tx per rating as a public receipt.
- Edge cases handled: server-side address resolution for non-verified ETH; guidance + optional fee handling for onchain actions.
Challenges I ran into
-
Next 15 App Router types: Route params now arrive as Promises; fixed invalid “GET” export types by awaiting context.params in API and dynamic routes.
-
Suspense with useSearchParams: Next requires useSearchParams() inside a Suspense boundary; wrapped /, /results, and /profile in <Suspense>.
-
ESLint “no-any” and Next rules: Replaced any with precise types, used Link instead of <a>, and added .eslintignore for Next-generated files.
-
Env var expansion: .env doesn’t expand $VAR; set literal values in Vercel envs and used a dynamic fallback to window.location.origin.
-
Farcaster manifest: Conflict between public/.well-known and App Router; replaced with a dynamic route app/.well-known/farcaster.json/route.ts and env-driven accountAssociation.
-
Sign-in nonce: sdk.actions.signIn requires a nonce; switched to quickAuth.getToken() which handles nonce internally.
-
Address resolution: Not all rated users have verified ETH addresses; added a server-side fallback (/api/address/[fid]) to resolve primary/any ETH or custody.
-
Foundry setup: Missing forge-std/OZ remappings and imports; added remappings, installed libs, and provided a clean deploy/verify workflow.
Smart Contract Address(es)
Contract (Base Sepolia): 0x4344712534c716E215bBa3491C99525e0d6f32a2
Other Onchain Proof
- Emits Rated(rater,
rated, category, score, commentHash, value, timestamp) as a public receipt. - In‑app “Publish Proof”: From the results screen, users can send recordRating via OnchainKit to
append an immutable, verifiable event. - Key verification: Webhook verifies Farcaster Key Registry on Optimism when users add/remove the Mini
App (proof of legitimate Mini App events). - Deploy tooling: Foundry project (backend) and docs (docs/deploy-on-base.md) to reproduce
deployments and verify on Base/Basescan.
Tracks Applied (1)
Top 5 New Mini Apps
Technologies used
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.
