Contracts: Play CRED ledger, epoch CHARM, pro-rata CRED yield, claim on Last Buy reset

Context

Play CRED non-transferable token, epoch CHARM, and CRED claim flow. Parent epic: #238 (closed).

Relevant files

  • New: contracts/src/PlayCred.sol
  • contracts/src/TimeArena.sol — epoch CHARM mappings charmWad[epoch][user]
  • New: contracts/src/interfaces/IPlayCred.sol

Acceptance criteria

  • PlayCred — no transfer; MINTER_ROLE for TimeArena + admin grantor
  • Optional CredGrantor contract admin can authorize
  • buyWithCred(charmWad) burns 70 CRED from buyer; same min/max CHARM rules
  • Each DOUB buy accrues 35 CRED to distribute: pro-rata by epoch CHARM weight
  • claimCred(epoch) callable after Last Buy epoch ends; zeros charmWad[epoch][user]; transfers accrued CRED
  • Buys still accrue CHARM into current Last Buy epoch (for CRED weighting)

Verification checklist

  • Forge: two holders 1:2 CHARM → 35 CRED splits correctly
  • Claim zeros epoch CHARM; cannot double-claim
  • CRED buy respects charm min/max