A financially-staked anonymous friend rating app on Starknet. Built with StarkZap for the StarkZap Blitz Hackathon.
Every anonymous rating app (NGL, Gas, Tellonym) breaks because ratings are consequence-free — raters troll or fake-nice, creators are delusional. RateMe introduces STRK stakes: honest rating is the only optimal strategy because outliers lose money.
Core loop:
- Pick a category (Rizz, Funny, Fashion, etc.) → self-score → stake STRK
- Share link → friends stake 1 STRK and rate anonymously
- Poll closes → gap between self-score and friend-average revealed as a meme card
- Gap ≥ 3? Delusional. Creator loses stake to accurate raters.
- Smart Contract: Cairo 2.8 on Starknet Sepolia
- Wallet + Payments: StarkZap SDK (Cartridge Controller, gasless, social login)
- Frontend: Next.js 14, TypeScript, Tailwind CSS
- Meme Card: html2canvas for screenshot-ready result cards
StarkZap powers three critical flows:
// 1. Social login via Cartridge Controller (no seed phrases, passkeys/Google)
const { wallet } = await sdk.onboard({
strategy: OnboardStrategy.Cartridge,
cartridge: { policies: [...contractPolicies] },
});
// 2. Atomic approve + create_poll (no double-click, no UX friction)
await wallet.tx()
.approve(STRK, fromAddress(CONTRACT_ADDRESS), stakeAmount)
.add({ contractAddress, entrypoint: 'create_poll', calldata })
.send();
// 3. Same pattern for rater stake + submit_rating
await wallet.tx()
.approve(STRK, fromAddress(CONTRACT_ADDRESS), Amount.parse('1', STRK))
.add({ contractAddress, entrypoint: 'submit_rating', calldata })
.send();starknetblitz/
├── contracts/ # Cairo smart contract
│ ├── Scarb.toml
│ └── src/
│ └── rate_me.cairo # Full staking + distribution logic
└── frontend/ # Next.js app
├── app/
│ ├── page.tsx # Landing
│ ├── create/ # Create poll (4-step flow)
│ ├── poll/[id]/ # Rate anonymously
│ └── result/[id]/ # Meme card result
├── lib/
│ ├── starkzap.ts # StarkZap SDK (wallet, tx building)
│ └── contract.ts # On-chain reads
└── hooks/
└── useWallet.ts # React wallet state
| Scenario | Creator | Accurate Raters (±1) | Outlier Raters (>±1) |
|---|---|---|---|
| Gap < 3 (Based) | Gets stake back | Gets 1 STRK back | Loses 1 STRK |
| Gap ≥ 3 (Delusional) | Loses stake | Gets 1 STRK + share of creator's stake | Loses 1 STRK |
cd contracts
scarb build
starkli deploy target/dev/rate_me_RateMe.contract_class.json \
--network sepolia \
--account ~/.starkli-wallets/deployer.jsoncd frontend
npm install
cp .env.local.example .env.local
# Edit .env.local with your contract address
npm run devNEXT_PUBLIC_NETWORK=sepolia
NEXT_PUBLIC_CONTRACT_ADDRESS=0x... # Your deployed contract
NEXT_PUBLIC_STRK_ADDRESS=0x04718f5a0fc34cc1af16a1cdee98ffb20c31f5cd61d6ab07201858f4287c938d
NEXT_PUBLIC_RPC_URL=https://starknet-sepolia.public.blastapi.io/rpc/v0_7
NEXT_PUBLIC_APP_URL=https://your-app.vercel.app