Part of Address → Hex Lookup & Reserve (Res 4) — see docs/prd/address-hex-lookup.md. The core new primitive.
Goal: Off-chain exclusive reservations for Res-4 cells outside the curated 200. No mint, no Genesis edition consumed.
Build
- New
apps/web/src/lib/global-hold-store.ts mirroring genesis-claim-registry.ts, separate KV namespace (hold:res4:<hexId>, hold:email:<email>, hold:index).
POST/GET/DELETE /api/holds: exclusive set-if-absent lock, email-anchored, expiresAt = heldAt + 30d, lazy reclaim on read.
Hard invariants
- Never increments
genesis:issued; never calls issueClaim or the contract.
- Stores canonical Res-4
hexId + email (+ referrerId) so a future global-res change can fractionalize via cellToChildren.
TDD anchor: exclusive lock under concurrent holds; expiry reclaim; cap-isolation (asserts genesis:issued untouched).
Part of Address → Hex Lookup & Reserve (Res 4) — see
docs/prd/address-hex-lookup.md. The core new primitive.Goal: Off-chain exclusive reservations for Res-4 cells outside the curated 200. No mint, no Genesis edition consumed.
Build
apps/web/src/lib/global-hold-store.tsmirroringgenesis-claim-registry.ts, separate KV namespace (hold:res4:<hexId>,hold:email:<email>,hold:index).POST/GET/DELETE /api/holds: exclusive set-if-absent lock, email-anchored,expiresAt = heldAt + 30d, lazy reclaim on read.Hard invariants
genesis:issued; never callsissueClaimor the contract.hexId+email(+referrerId) so a future global-res change can fractionalize viacellToChildren.TDD anchor: exclusive lock under concurrent holds; expiry reclaim; cap-isolation (asserts
genesis:issueduntouched).