Skip to content

wkalidev/dailydrop

Repository files navigation

DailyDrop 🔥

DailyDrop Logo

Check in daily on-chain. 7-day streak = 10 DROP tokens.

Compatible MiniPay ✅ | Compatible Farcaster ✅ | Celo + Base ✅ | Proof of Presence ✅


Live

🔗 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


What is DailyDrop?

DailyDrop is two things at once:

  1. A daily check-in app — users check in on-chain every day, build a 7-day streak, and earn DROP tokens + G$ rewards.

  2. A Proof of Presence ProtocolDailyDropShield is 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.


How it works

  1. Connect wallet (MiniPay auto-connects, or MetaMask/RainbowKit)
  2. Click Check-in once per day (1 TX on-chain)
  3. Build a 7-day consecutive streak
  4. Claim 10 DROP tokens 🎁
  5. Repeat!

🛡️ DailyDropShield — Proof of Presence

Any project can verify real humans using the free public API or npm SDK:

REST API (free, no auth)

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 SDK

npm install @dailydrop/shield
import 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 Cases

Use Case minStreak
Airdrop sybil filter 7
DAO voting weight 30
NFT allowlist 7
DeFi APY boost 14

Smart Contracts

Celo Mainnet

Contract Address
DailyDrop 0xd8Cc2a639a8D4e7A75a5B41C28606712e4fDf70b
DailyDropShield 0x24eFf9bdE979D6dccC869178F353D663bC8A6983

Base Mainnet

Contract Address
DailyDrop 0x974fB504172f2aABbecc698Ebf137202a5E4e495
StreakMaster 0x038F496eCf99ecA5959A40493C96670Ea8a14345
StreakNFT 0xbBa5865b3E3A5033730f851d555cc922B74B25Fa

G$ Integration (GoodBuilders Season 4) — Planned, not yet live

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.


Agent Score (8004scan)

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.


x402 Payment (verify_batch)

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.


OpenAPI / OASF

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.


Performance

  • 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: optimizePackageImports for wagmi / viem / RainbowKit tree-shaking

Stack

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

Installation

git clone https://github.com/wkalidev/dailydrop
cd dailydrop
npm install
cd frontend && npm install

Environment Variables

NEXT_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=...

Deploy Contracts

npm run deploy:celo   # Deploy DailyDrop + DailyDropShield on Celo
npm run deploy:base   # Deploy DailyDrop on Base

MiniPay

Auto-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 feeCurrency on checkIn()/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


API Reference

GET /api/verify?address=0x...&minStreak=7

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.


GET /api/stats

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


GET /api/leaderboard

Returns wallet addresses sorted by activity, sourced from Etherscan V2 API with Basescan V1 fallback. Includes celoAddresses and baseAddresses arrays for chain-filter UI.


GET /api/agent?address=0x...

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)


GET/POST /api/mcp

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}}}

GET /.well-known/agent-card.json

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.

GET /.well-known/openapi.json

OpenAPI 3.1.0 spec for all Shield API endpoints. Declares x402 security scheme. Used by OASF-compatible agent scanners.


GET /api/frame/image?address=0x...

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.


Advanced Architecture

StreakMaster (Base)

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

DailyDropShield (Celo)

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() is nonpayable (not view) because it caches results on-chain. Use verifyView() for gas-free reads.

StreakNFT (Base)

Soulbound ERC-721 NFT with 100% on-chain SVG metadata. Automatically updates on each check-in. Non-transferable.

Address (Base Mainnet): 0xbBa5865b3E3A5033730f851d555cc922B74B25Fa

Relayer

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.

Agent discovery endpoints

/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) uses untrustedData — 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). See SECURITY.md.


Proof of Ship — Celo

  • ✅ 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/shield v1.4.0 in source, not yet published — v1.3.0 is the latest version live on npm; run npm publish from shield-sdk/ (after npm 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)

Known Limitations

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 productionStreakMaster._triggerReward() calls DailyDrop(base).mintInitial(), which requires StreakMaster to own the Base DailyDrop contract. 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.md for the full threat model.
  • Farcaster Frame signatures are not verified/api/frame trusts untrustedData (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.

License

MIT © 2026 @wkalidev


Built for the 1.4 billion unbanked · Powered by Celo · Proof of Presence Protocol

About

DailyDrop — Check in daily on-chain, build a 7-day streak, earn DROP tokens. Built on Celo & Base.

Topics

Resources

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Releases

No releases published

Packages

 
 
 

Contributors