Play-route transition state model and UX #343
Labels
No labels
agent:fix_bugfix
agent:fix_conflicts
agent:fix_security
agent:gap_analysis
agent:implement
agent:open_issues
agents
agent:security_audit
agent:verify
area
timecurve
arena
arena-v2
audit
block:feature_review
block:security
bug
contracts
design
devops
docs
documentation
enhancement
epic
feature
frontend
indexer
low priority
megaeth
operations
ops
performance
QA
qa checklist
referrals
removal
security
smart-contracts
tech-debt
testing
time-arena
timecurve
visual-qa
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
code/yieldomega#343
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Parent
Transition Gap Analysis (#342) — P0 #1, P1 #7, P3 #16. Bundles H-F1, H-F2, H-F3.
Current codebase
/) uses indexer-first polling viauseArenaHeroTimer,usePodiumReads,useArenaPlayerLevel, etc. React Query hooks useplaceholderData: (previousData) => previousData(e.g.usePodiumReads.ts), latching stale epoch/standings during refresh.chainNowSecfrompolled_at_ms+block_timestamp_sec) inuseArenaHeroTimer.ts.ArenaTimerChips.tsxuse staticblock_timestamp_secat last poll (now = data ? Number(data.block_timestamp_sec) : …) — can disagree with hero between polls.podiumCopy.tsxdocuments mechanics but there is no explicit UI state for expired-pending-roll, settling, or epoch-advanced.docs/frontend/arena-views.mdcovers level-up celebration (#335) and wallet profile (#336) but has no dedicated transition-state UX spec.Why needed
Users see frozen
00:00timers, old epoch numbers, and stale leaderboards during rollovers because transition boundaries are poll-driven with latched placeholders. There is no settling indicator or permissionless-roll CTA. Timer clock sources split between hero and chips adds confusion during transitions.Constraints / guardrails
VITE_INDEXER_URLis set.Relevant files
frontend/src/pages/arena/useArenaHeroTimer.tsfrontend/src/pages/arena/ArenaTimerChips.tsxfrontend/src/pages/arena/useTimerPodiumSlideMeta.tsfrontend/src/pages/arena/usePodiumReads.tsfrontend/src/pages/arena/podiumCopy.tsxfrontend/src/pages/arena/ArenaSimplePage.tsxfrontend/src/pages/arena/arenaPodiumTimerDisplay.tsdocs/frontend/arena-views.mdRecommended direction
live,expired-pending-roll,settling,epoch-advanced,claimable. Derive frompodium_epochs,podium_deadlines_sec,podium_timer_armed,claimable_cred_epoch(wallet stats), and (when available) ingest-lag fields from sibling issue.rollPodiumEpochCTA when timer expired and armed (with chain-mismatch barrier).chainNowSec— export shared skew helper from hero timer hook; use inArenaTimerChipsanduseTimerPodiumSlideMetaso all countdowns share the same wall-vs-chain anchor.docs/frontend/arena-views.md(“Transition UX” section): on-chain events → indexer fields → UI states.Acceptance criteria
00:00).chainNowSecskew within a poll cycle.arena-views.mdwith event/field mapping.data-testidhooks for settling/pending-roll states for E2E (sibling issue).Test plan
cd frontend && npm run typecheck && npm run lint && npm testuseArenaHeroTimer/ArenaTimerChipstests for unifiedchainNowSecindexerFirstDisplay.test.tsstill passesYIELDOMEGA_E2E_INDEXER=1 bash scripts/e2e-anvil.sh+ transition specAttack / abuse test plan
ChainMismatchWriteBarrier.Verification criteria
arena-views.mdtotime-arena.mdtransition events.mentioned in issue #342
mentioned in commit
e05dae569dmentioned in merge request !519
mentioned in commit
304744cae2Verification — #343 Play-route transition state model and UX
Verified on
main(2026-06-26). All acceptance criteria PASS; no repo changes required.Acceptance criteria
arenaTransitionState.test.ts; manual Anvil warp → Playwright onhttp://127.0.0.1:5175/founddata-testid="arena-timer-expired-pending-roll"(×2) +arena-timer-transition-footwith copy "Waiting for settlement — roll the epoch or wait for the next qualifying buy." andarena-podium-roll-ctachainNowSecskewindexerFirstDisplay.test.ts(#343 skew guard);ArenaTimerChips.test.tsx;arenaChainNow.test.tsarena-views.mdindexerFirstDisplay.test.ts(static guard for podium/timer hooks)data-testidhooks for settling/pending-rolltransitionStateTestId()inarenaTransitionState.ts; manual Playwright confirmedarena-timer-expired-pending-roll,arena-timer-transition-foot,arena-podium-roll-ctaTest plan
cd frontend && npm run typecheck && npm run lint && npm testarenaTransitionState.test.ts,arenaChainNow.test.ts,ArenaTimerChips.test.tsxindexerFirstDisplay.test.ts:8547+ indexer:3102+npm run dev :5175;anvil_setNextBlockTimestamppastlast_buy_deadline_sec; Playwright headlessexpired-pending-roll)YIELDOMEGA_E2E_INDEXER=1 bash scripts/e2e-anvil.shAttack / abuse checks
syncingisSuspiciousDeadline+arenaTransitionState.test.tsChainMismatchWriteBarrierArenaPodiumRollCta.tsxpodiumCountdownSecclamps withMath.max(0, …)Invariant
INV-FRONTEND-343-TRANSITION-UXdocumented indocs/testing/invariants-and-business-logic.mdanddocs/frontend/arena-views.md.