Skip to content

0011 — Retire the gaming-era wallet currencies

Status: accepted (2026-08-10). Follow-up to 0010.

Context

After 0010 removed the gaming and affiliate domains, the wallet still carried their currencies: free_points (contest play-money), cash (contest stakes), rewards (contest prizes), and the pending-claim buckets (is_reward_points, is_shopping_points, is_e_vouchers) that only the rewards→credits claims conversion ever filled. None had a remaining earn or spend path — with one dangerous exception: every real-money top-up still minted free_points at 100.7% of the top-up amount (the "Scratch Card / Mystery Box" bonus — play-money matching from the fantasy era) with no way to redeem it. Every balance across all of these was zero in production.

Decision

  • Drop the columns and the claims table (migration 065_retire_gaming_currencies.sql, guarded to refuse if any balance is non-zero). Remove the claims conversion endpoints (/wallet/claim, /wallet/claims, /admin/users/:uid/claims) and their repo machinery.
  • Remove the top-up bonus entirely rather than redirect it: at 100.7% it was play-money economics, and paying it in any redeemable currency would double customers' money. A real loyalty bonus, if wanted later, is its own deliberately-rated decision.
  • Keep /wallet/settle-pending as a compatibility no-op (returns the wallet, settles nothing) because shipped app builds call it from the spin & win gate.
  • The wallet is now: shopping_credits (money), reward_points (checkout redemption), e_vouchers, last_daily_spin. The daily spin is untouched.
  • wallet_ledger history keeps its old currency_type values; the CHECK constraint is not tightened, and RealMoneyTopupPredicate keeps its currency filter because historical bonus rows share txn_type='topup'.

Consequences

  • A top-up now credits exactly 100% shopping_credits — no promotional ledger rows.
  • Old app builds render absent currency fields as 0 and their settle calls no-op; no forced app update is needed.
  • Restoring any of this means a new design, not a revert — there is no rollback file, only pre-migration backups.