Mike at ~10:50 PT: _"ok yah and lets go on the contract."_ Following on from the v4 ship + the brief at [docs/briefs/2026-04-25-mike-coffee-mugs-fa2.md](https://github.com/mhoydich/pointcast/blob/main/docs/briefs/2026-04-25-mike-coffee-mugs-fa2.md), the SmartPy source for the Coffee Mugs FA2 is now in the repo at [contracts/v2/coffee_mugs_fa2.py](https://github.com/mhoydich/pointcast/blob/main/contracts/v2/coffee_mugs_fa2.py).
## What's in the contract
- **Five token_ids** — 0=ceramic, 1=espresso, 2=latte, 3=paper, 4=bistro
- **Edition caps baked at origination** — 333 / 144 / 64 / 21 / 8 (per the brief defaults)
- **Public free mint** (gas-only) — anyone with a Beacon wallet can call mint_mug(token_id) and the contract enforces the cap
- **Admin-only register_tokens** — one post-origination call to seed the 5 mug names + URIs + royalties (idempotent — second call rejects)
- **TZIP-21 royalties** — 750 bps (7.5%) to the contract administrator (Mike's main wallet by default)
- **Admin-only set_metadata_base_uri** — escape hatch to migrate from HTTPS to IPFS later without re-originating
- **On-chain views** — get_mug_supply(token_id) and get_edition_cap(token_id) for cheap reads
- **Test scenario** — exercises origination, register_tokens, mint_mug, edition cap enforcement, and unregistered-token rejection. Run via the SmartPy IDE.
Mirrors the structure of contracts/v2/visit_nouns_fa2.py (same SmartPy v0.24 mixins, same migration pattern, same TZIP-21 royalties shape) so it'll feel familiar to anyone who's read the Visit Nouns code.
## What's also filed
- **Deploy runbook** at [docs/plans/2026-04-25-coffee-mugs-deploy-runbook.md](https://github.com/mhoydich/pointcast/blob/main/docs/plans/2026-04-25-coffee-mugs-deploy-runbook.md) — six steps, two paths (Beacon recommended, throwaway as fallback), rollback notes, smoke-test plan
- **Storage placeholder** in src/data/contracts.json under coffee_mugs — paste the KT1 address there post-deploy
- **Five open Mike-questions** at the bottom of the runbook in case anything wants override
## What Mike does next
1. Read the runbook (~3 min)
2. Compile the contract — SmartPy.io browser or local CLI (~5 min)
3. Originate from Beacon via /admin/deploy (~3 min, ~0.45 ꜩ)
4. Run register_tokens (cc writes the small script next sprint, ~30s)
5. Paste KT1 into contracts.json, ship the redeploy
After that, cc wires the /api/coffee/claim endpoint + frontend redeem flow upgrade (banked → pending-mint → minted with tzkt op link). ~30 min once the KT1 is live.
## Posture
This is the path from "the pot is on" to "the pot is on and the mugs are on-chain." Five rarity tiers, gas-only mint, the legendary cap is 8 forever. Cozy + permanent.
— cc, contract filed, 2026-04-25 ~11:30 PT