Check in daily on-chain. 7-day streak = 10 DROP tokens.
Compatible MiniPay ✅ | Compatible Farcaster ✅ | Celo + Base ✅ | Proof of Presence ✅
🔗 App : https://dailydrop-five.vercel.app
🏆 Leaderboard : https://dailydrop-five.vercel.app/leaderboard
🛡️ Shield API : https://dailydrop-five.vercel.app/api/verify
🤖 MCP Server : https://dailydrop-five.vercel.app/api/mcp
🤖 Agent Card : https://dailydrop-five.vercel.app/.well-known/agent-card.json
📄 OpenAPI : https://dailydrop-five.vercel.app/.well-known/openapi.json
📦 SDK : npm i @dailydrop/shield
🐙 GitHub : https://github.com/wkalidev/dailydrop
DailyDrop is two things at once:
-
A daily check-in app — users check in on-chain every day, build a 7-day streak, and earn DROP tokens + G$ rewards.
-
A Proof of Presence Protocol —
DailyDropShieldis an open infrastructure layer that any project can use to verify real humans by their on-chain streak. No KYC. No passport scan. Just behavioral proof.
A streak on-chain can't be faked retroactively. If a wallet showed up every day, it's a real human.
- Connect wallet (MiniPay auto-connects, or MetaMask/RainbowKit)
- Click Check-in once per day (1 TX on-chain)
- Build a 7-day consecutive streak
- Claim 10 DROP tokens 🎁
- Repeat!
Any project can verify real humans using the free public API or npm SDK:
GET https://dailydrop-five.vercel.app/api/verify?address=0xABC&minStreak=7{
"address": "0xABC...",
"passed": true,
"streak": { "current": 12, "celo": 12, "base": 0 },
"badges": { "level": 1, "label": "🥉 Weekly", "weekly": true },
"shield": "0x24eFf9bdE979D6dccC869178F353D663bC8A6983"
}npm install @dailydrop/shieldimport DailyDropShield, {
CELO_DAILYDROP,
BASE_DAILYDROP,
SHIELD_ADDRESS,
STREAK_MASTER_ADDRESS,
STREAK_NFT_ADDRESS,
} from "@dailydrop/shield"
const shield = new DailyDropShield()
const isHuman = await shield.isHuman("0xABC...", 7)
const streak = await shield.getStreak("0xABC...")
const badge = await shield.getBadge("0xABC...")
// Batch verify for airdrop filtering
const results = await shield.verifyBatch(["0xABC...", "0xDEF..."], 7)| Use Case | minStreak |
|---|---|
| Airdrop sybil filter | 7 |
| DAO voting weight | 30 |
| NFT allowlist | 7 |
| DeFi APY boost | 14 |
| Contract | Address |
|---|---|
| DailyDrop | 0xd8Cc2a639a8D4e7A75a5B41C28606712e4fDf70b |
| DailyDropShield | 0x24eFf9bdE979D6dccC869178F353D663bC8A6983 |
| Contract | Address |
|---|---|
| DailyDrop | 0x974fB504172f2aABbecc698Ebf137202a5E4e495 |
| StreakMaster | 0x038F496eCf99ecA5959A40493C96670Ea8a14345 |
| StreakNFT | 0xbBa5865b3E3A5033730f851d555cc922B74B25Fa |
DailyDrop's roadmap includes GoodDollar G$ as a bonus reward layer on top of DROP:
- Streak 7 days → 100 G$ bonus (planned)
- Streak 30 days → 500 G$ bonus (planned)
- Streak 100 days → 2000 G$ bonus (planned)
G$ token on Celo: 0x62B8B11039FcfE5aB0C56E502b1C372A3D2a9C7A
Status: no G$ distribution code exists in this repo yet — no contract call, no route, no reference anywhere in contracts/ or frontend/. This section previously read as a shipped feature; it wasn't. Treat it as a stated intent for GoodBuilders Season 4, not a working integration, until a PR actually wires up a G$ mint/transfer path.
Live, current score: https://8004scan.io/agents/celo/9421 — check that page directly rather than this table, which is a point-in-time snapshot and not computed by anything in this repo.
Last snapshot (2026-07-01):
| Category | Score |
|---|---|
| Engagement | 13/100 (2 reviews) |
| Service | 100/100 — MCP + OASF + A2A |
| Compliance | 100/100 — full metadata |
| x402 | enforced on verify_batch |
There is no aggregate "Total" score published by 8004scan for this agent — a prior version of this table listed "Total: targeting 90+/100", which was an internal goal, not a score 8004scan reports.
verify_batch (up to 100 wallets) requires an HTTP 402 payment. When called without an X-Payment header the server returns:
HTTP 402
X-Payment-Required: {"scheme":"exact","network":"base","maxAmountRequired":"10000","asset":"0x833589fCD6eDb6E08f4c7C32D4f71b54bdA02913",...}
Pay 0.01 USDC on Base to 0xDEAcDe6eC27Fd0cD972c1232C4f0d4171dda2357 (the payTo address served in the actual 402 response — this is not the StreakMaster contract), then retry with the X-Payment header. All other tools are free.
Full API spec at /.well-known/openapi.json (OpenAPI 3.1.0).
Declares x402 security scheme, all endpoints, and OASF metadata for agent-scanner compliance.
- Inline critical CSS — above-the-fold styles inlined in
<head>for immediate paint (no FOUC) - Fonts: self-hosted at build time via
next/font/google— eliminates render-blocking Google Fonts request - Viewport: user zoom enabled (accessibility compliant, WCAG 1.4.4)
- CLS: protocol stats section always reserves DOM space (skeleton while loading) to prevent layout shift
- Bundle:
optimizePackageImportsfor wagmi / viem / RainbowKit tree-shaking
| Layer | Tech |
|---|---|
| Smart Contracts | Solidity 0.8.20, OpenZeppelin ERC20 |
| Frontend | Next.js 14, TypeScript |
| Web3 | wagmi v2, viem, RainbowKit |
| Shield SDK | TypeScript, viem (@dailydrop/shield v1.4.0) |
| AI Coach | Claude Haiku 4.5 (Anthropic) |
| Chains | Celo Mainnet + Base Mainnet |
| Deploy | Vercel (frontend), Hardhat (contracts) |
| Agent | MCP 2024-11-05, A2A, OASF, x402 |
git clone https://github.com/wkalidev/dailydrop
cd dailydrop
npm install
cd frontend && npm installNEXT_PUBLIC_WALLETCONNECT_PROJECT_ID=...
NEXT_PUBLIC_CDP_PROJECT_ID=...
NEXT_PUBLIC_CELO_CONTRACT_ADDRESS=0xd8Cc2a639a8D4e7A75a5B41C28606712e4fDf70b
NEXT_PUBLIC_BASE_CONTRACT_ADDRESS=0x974fB504172f2aABbecc698Ebf137202a5E4e495
NEXT_PUBLIC_SHIELD_ADDRESS=0x24eFf9bdE979D6dccC869178F353D663bC8A6983
NEXT_PUBLIC_STREAK_MASTER_ADDRESS=0x038F496eCf99ecA5959A40493C96670Ea8a14345
NEXT_PUBLIC_STREAK_NFT_ADDRESS=0xbBa5865b3E3A5033730f851d555cc922B74B25Fa
CELOSCAN_API_KEY=...
BASESCAN_API_KEY=...
ANTHROPIC_API_KEY=...npm run deploy:celo # Deploy DailyDrop + DailyDropShield on Celo
npm run deploy:base # Deploy DailyDrop on BaseAuto-detects MiniPay via window.ethereum.isMiniPay:
- Auto wallet connection via injected provider (no modal shown)
- Forces Celo mainnet on every connection via
switchChain - Connect button hidden when MiniPay is detected
- Graceful connection error recovery with retry button
- Gas fees: the app never sets
feeCurrencyoncheckIn()/claimReward()— MiniPay's Custom Fee Abstraction intercepts the transaction and pays gas in whichever Mento stablecoin (cUSD, USDT, USDC, USDm) the user holds, per MiniPay's own docs. This is the officially recommended integration path (viem/wagmi handle it natively) — no dApp-side fee-currency logic needed or wanted. - Mobile-optimized UI (360×640 px minimum viewport, user zoom enabled)
- Terms / Privacy / Support links open
target="_self"(in-app, no external tab)
Test: https://dailydrop-five.vercel.app
Proof of Presence verification. Reads streaks from both Celo and Base chains.
{
"address": "0xABC...",
"passed": true,
"minStreak": 7,
"streak": { "current": 12, "bestChain": "celo", "celo": 12, "base": 0 },
"checkins": { "total": 36, "canCheckIn": false, "canClaim": false, "nextCheckIn": 1780613801 },
"badges": { "level": 1, "label": "🥉 Weekly", "weekly": true, "monthly": false, "century": false },
"shield": "0x24eFf9bdE979D6dccC869178F353D663bC8A6983",
"meta": { "verifiedAt": "2026-06-22T00:00:00.000Z", "celoscan": "...", "basescan": "..." }
}CORS: fully open (Access-Control-Allow-Origin: *). Cache: 60s.
Protocol-wide analytics. Fetches transaction counts from Celoscan + Basescan. Cached 5 minutes.
{
"totalCheckIns": 842,
"uniqueWallets": 301,
"celoWallets": 190,
"baseWallets": 145
}Environment variables: CELOSCAN_API_KEY, BASESCAN_API_KEY
Returns wallet addresses sorted by activity, sourced from Etherscan V2 API with Basescan V1 fallback. Includes celoAddresses and baseAddresses arrays for chain-filter UI.
AI streak coach powered by Claude Haiku 4.5. Returns personalized motivation, action tip, and on-chain data.
{
"streak": 5,
"totalCheckIns": 12,
"canCheckIn": true,
"canClaim": false,
"riskLevel": "low",
"message": "5 days in — 2 more to claim 10 DROP. You're almost there!",
"tip": "Check in now while you remember — consistency beats motivation.",
"aiPowered": true
}Environment variable: ANTHROPIC_API_KEY (optional — falls back to deterministic heuristics)
MCP Server (protocol 2024-11-05). Tools: verify_streak, get_profile, verify_batch (x402), get_stats.
# Discovery
GET https://dailydrop-five.vercel.app/api/mcp
# Tool call (free)
POST https://dailydrop-five.vercel.app/api/mcp
{"jsonrpc":"2.0","id":1,"method":"tools/call","params":{"name":"verify_streak","arguments":{"address":"0xABC...","minStreak":7}}}
# verify_batch — requires X-Payment header (0.01 USDC on Base)
POST https://dailydrop-five.vercel.app/api/mcp
X-Payment: <signed-payment-proof>
{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"verify_batch","arguments":{"addresses":["0xABC...","0xDEF..."],"minStreak":7}}}A2A AgentCard v1.2.0 — 5 skills: verify_streak, get_profile, verify_batch, get_leaderboard, get_stats. Full OASF metadata, x402 pricing, and authentication scheme declared.
OpenAPI 3.1.0 spec for all Shield API endpoints. Declares x402 security scheme. Used by OASF-compatible agent scanners.
Returns a 1200×630 SVG image for Farcaster Frames. Personalized when address is provided (shows live streak, color-coded). Generic brand image when no address given.
Cross-chain source of truth. Receives check-ins from Celo, Base, and Stacks via authorized relayers. Maintains an on-chain leaderboard (top 10), streak tiers, and triggers rewards.
Address (Base Mainnet): 0x038F496eCf99ecA5959A40493C96670Ea8a14345
Proof of Presence verification layer. Any project can call verify(address, minStreak) to check if an address is an active human. Free. No KYC.
Address (Celo Mainnet): 0x24eFf9bdE979D6dccC869178F353D663bC8A6983
REST API: GET /api/verify?address=0x...&minStreak=7
Note:
verify()isnonpayable(notview) because it caches results on-chain. UseverifyView()for gas-free reads.
Soulbound ERC-721 NFT with 100% on-chain SVG metadata. Automatically updates on each check-in. Non-transferable.
Address (Base Mainnet): 0xbBa5865b3E3A5033730f851d555cc922B74B25Fa
Next.js API route (/api/relayer) that receives check-in notifications and calls StreakMaster.updateStreak() on Base. Requires RELAYER_PRIVATE_KEY for signing. Authentication is not a shared secret (any secret sent from a public browser client is visible to that client — see SECURITY.md); instead the route independently re-verifies, via RPC, that the reported txHash is a real, successful transaction sent by the claimed user to the real DailyDrop contract, emitting a genuine check-in event.
/api/agent-card, /api/agent-metadata, and /.well-known/agent-card.json all serve the exact same AgentCard object — /api/agent-metadata and the .well-known route both re-export the handler in /api/agent-card/route.ts rather than keeping their own copies, so there is a single source of truth and no risk of a scanner seeing different metadata depending on which path it hits.
The Farcaster Frame (
/api/frame) usesuntrustedData— Farcaster signature verification is not yet implemented. Reflected values are sanitized before being embedded in the frame HTML, but full production hardening would add hub-based signature verification (Neynar or a self-hosted Farcaster Hub). SeeSECURITY.md.
- ✅ DailyDrop deployed Celo + Base mainnet
- ✅ DailyDropShield deployed Celo mainnet
- ✅ StreakMaster + StreakNFT deployed Base mainnet
- ✅ Public REST API live —
/api/verify,/api/stats,/api/leaderboard,/api/agent - ✅ MCP Server live —
/api/mcp(x402 enforced on verify_batch) - ✅ A2A AgentCard v1.2.0 —
/.well-known/agent-card.json(full metadata, x402, OASF) - ✅ OpenAPI 3.1.0 —
/.well-known/openapi.json(x402Payment scheme, OASF) ⚠️ @dailydrop/shieldv1.4.0 in source, not yet published — v1.3.0 is the latest version live on npm; runnpm publishfromshield-sdk/(afternpm run build) to ship v1.4.0's on-chain-mode fixes- ✅ MiniPay compatible (auto-detect, force Celo, no modal, reconnect on failure, target="_self" links)
- ✅ Farcaster Mini App (farcaster.json + frame endpoint)
- 🚧 G$ integration (GoodBuilders Season 4) — planned, not implemented yet (see G$ Integration above)
- ✅ Leaderboard (Celoscan + Basescan, live on-chain)
- ✅ AI streak coach (Claude Haiku 4.5 + deterministic fallback)
- ✅ PWA (manifest + service worker)
- ✅ Inline critical CSS shell for fast first paint
- ✅ Fonts self-hosted via next/font (no render-blocking external requests)
- ✅ Accessible viewport (user zoom enabled, WCAG 1.4.4 compliant)
Full detail and dates in SECURITY.md. Headline items as of 2026-07-18:
- G$ rewards are not implemented — see G$ Integration above. Roadmap item, not a bug, but the README used to claim it shipped.
- Base cross-chain reward mint may still be broken in production —
StreakMaster._triggerReward()callsDailyDrop(base).mintInitial(), which requiresStreakMasterto own the BaseDailyDropcontract. A fix script (deploy/fix-streakmaster-base.ts) exists with pre-flight safety checks, but it must be run manually against Base mainnet — verify on-chain ownership before assuming this path works. - Relayer trust model — the relayer operator can submit a check-in on behalf of any user, bounded by on-chain cooldowns, replay protection, and (as of 2026-07-01) verification that the submitted transaction really was sent by that user. See
SECURITY.mdfor the full threat model. - Farcaster Frame signatures are not verified —
/api/frametrustsuntrustedData(input is sanitized, not authenticated). Fine for the current use case; not sufficient if the frame ever gates a privileged action. - No automated test suite — contracts (Solidity and Clarity) and the SDK are currently verified by manual review and on-chain observation, not CI tests.
MIT © 2026 @wkalidev
Built for the 1.4 billion unbanked · Powered by Celo · Proof of Presence Protocol