Contracts: Independent podium timers (Streak, Time Booster, WarBow) + epoch settlement

Context

Independent podium timers and per-podium epoch settlement. Parent epic: #238 (closed).

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)