Contracts: Independent podium timers (Streak, Time Booster, WarBow) + epoch settlement
## Context Independent podium timers and per-podium epoch settlement. Parent epic: #238. ## Relevant files - `contracts/src/TimeArena.sol` - `contracts/src/libraries/TimeMath.sol` - Per-podium score tracking (adapt from `TimeCurve.sol` `_updateTopThreeMonotonic`, streak/booster logic) ## Acceptance criteria - [ ] Four deadline storage slots + four epoch counters - [ ] Each buy extends **all four** podium timers with **podium-specific** extension/reset params (see spec issue) - [ ] On podium epoch end (deadline passed + qualifying buy or permissionless `rollPodiumEpoch(category)`): - Snapshot top-3 (or last-3 for Last Buy) - Pay winners from that podium's DOUB pool (4:2:1 within category) - Roll seed vault → active pool - Increment podium epoch; **reset live scores** for that podium only - [ ] Last Buy reset additionally triggers global Last Buy epoch (CHARM/CRED) ## Verification checklist - [ ] Forge: Streak/TimeBooster/WarBow timers diverge from Last Buy after different buy patterns - [ ] Epoch counters independent (assert unequal after time skew)
issue