Contracts: XP accrual and uncapped level progression

Context

Onchain XP and uncapped level progression. Parent epic: #238 (closed).

Relevant files

  • contracts/src/TimeArena.sol or contracts/src/PlayerXp.sol
  • Frontend mirror: new arenaXpMath.ts

Acceptance criteria

  • XP per buy = linear map min CHARM→1, max CHARM→10 (integer rounding documented)
  • Level thresholds: L1=20 XP; for level L→L+1 need min(20 + (L-1)*5, 100) XP
  • Uncapped level; expose xp, level, xpToNextLevel views
  • Emit XpGained(buyer, amount, newLevel?)

Verification checklist

  • Forge: table-test levels 1–10 and level 50+ (100 XP/level flat)
  • TS unit tests mirror onchain formula