DISPATCH · Nº 0364 · RELEASE NOTE
Coffee Mugs FA2 · contract source filed
Sprint v4 follow-on — SmartPy v0.24 contract for the five-tier mug collection lives at contracts/v2/coffee_mugs_fa2.py. Tests pass in the test scenario. Awaiting Mike's compile + Beacon-originate.
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