TimeCurve Simple: live podium leaders card above Recent buys / Live ticker #113

Closed
opened 2026-05-03 07:10:34 +00:00 by PlasticDigits · 6 comments
PlasticDigits commented 2026-05-03 07:10:34 +00:00 (Migrated from gitlab.com)

Summary

Add a single cohesive card/section on the TimeCurve Simple route (/timecurve) that surfaces all four v1 reserve podium categories (Last Buy, WarBow / Battle Points ladder, Defended Streak, Time Booster), each showing 1st / 2nd / 3rd winners from onchain TimeCurve.podium(category). Place this section immediately above the existing Recent buys block whose section badge reads Live ticker (PageSection with badgeLabel="Live ticker" in frontend/src/pages/TimeCurveSimplePage.tsx).

The UI must update in near–real-time as buys and WarBow activity change leaderboard snapshots onchain, and must visually highlight any row/placement where the wallet address matches the connected viewer (same semantics as Arena podium highlighting).

Styling must stay aligned with existing Yieldomega / Blockie Hills arcade surface treatment: reuse established podium copy, typography, ranking chrome, and art cues already used on Arena — no generic dashboard widgets.

Product / protocol alignment

Authoritative podium categories are the four fixed v1 tracks documented in docs/product/primitives.md (see also guardrail note on legacy category sets). Contract category indices map through PODIUM_CONTRACT_CATEGORY_INDEX → UX label order PODIUM_LABELS.


Files likely to change

Area Path Notes
Simple page composition frontend/src/pages/TimeCurveSimplePage.tsx Insert new PageSection above the Recent buys section (~lines 1207–1366 today). Wire wallet address + decimals from useTimeCurveSaleSession. Subscribe to live updates (see below).
Styles frontend/src/index.css Prefer extending existing podium / ranking / spotlight classes (.podium-preview, .podium-block, .ranking-list, .spotlight-card) before introducing parallel Simple-only CSS; scope under .timecurve-simple-page if needed for density or spacing.
E2E expectations frontend/e2e/timecurve.spec.ts timecurve simple view does NOT show the dense PvP / podiums sections above the fold intentionally rejects Arena-only H2 headings (Podiums and prizes, WarBow feed, etc.). After this feature, extend or split assertions so Simple may show a compact podium summary without regressing the spirit of issue #40 (no full Arena density above the fold). Use a distinct accessible title for the new section (do not reuse exact Arena Podiums and prizes h2 text unless product asks to unify copy).

Optional / conditional:

Path When
New component module under frontend/src/pages/timecurve/ (e.g. TimeCurveSimplePodiumSection.tsx) If keeping TimeCurveSimplePage.tsx maintainable — recommended once JSX exceeds a reasonable threshold.
docs/frontend/timecurve-views.md Short subsection documenting Simple podium snapshot + realtime behavior + cross-link from docs/testing/invariants-and-business-logic.md if maintainers want parity with other TimeCurve UX issues — only if docs updates are requested in the MR.

Components / modules to reuse or refactor

Reuse as-is or with thin wrappers

  • usePodiumReads — Batch TimeCurve.podium(category) via wagmi useReadContracts; primary data source for winners + raw metric strings per placement.
  • podiumCopy.ts — PODIUM_LABELS, PODIUM_HELP, PODIUM_CONTRACT_CATEGORY_INDEX for consistent naming with Arena / Protocol narrative.
  • RankingList — Already implements rank glyphs (1st/2nd/3rd), --you highlight styling via RankingRow.highlight, and structured rows — matches highlight the user wallet requirement.
  • PodiumAddressExplorerInline pattern — Today lives inside TimeCurveSections.tsx as a local helper (blockie + AddressInline + MegaScanner-style explorer link). Prefer extracting it to frontend/src/pages/timecurve/PodiumAddressExplorerInline.tsx (or components/) so Simple and Arena share one implementation instead of duplicating.
  • formatPodiumLeaderboardValue — Category-aware formatting for onchain podium values (BP vs streak vs seconds vs CL8Y-ish displays). Import from Arena helpers or move to frontend/src/lib/ if coupling Simple → timeCurveArena/ feels wrong for layering; goal is one formatter used by both surfaces.

Mirror Arena economics (optional CL8Y payout preview)

Arena combines podiumCategorySlices + podiumPlacementShares with podium pool CL8Y balance to show approximate reserve payouts per place (useTimeCurveArenaModel.tsx podiumPayoutPreview). Simple does not currently read podiumPool() / ERC20 balance.

  • Minimum viable: Show addresses + formatted leaderboard values only (still satisfies “who is 1st/2nd/3rd”).
  • Stretch / parity: Add the same CL8Y payout preview tiles Arena shows inside PodiumsSection — requires wagmi reads for pool address + balanceOf (mirror Arena pattern). Document RPC load vs UX benefit in MR.

Realtime updates

Simple already listens for Buy events via useWatchContractEvent (timeCurveBuyEventAbi) to bump indexer polling.

  • Extend that pattern: On each Buy log (and optionally WarBow-related events if indexed reads lag), invalidate or refetch podium contract reads — e.g. expose refetch from usePodiumReads or call queryClient.invalidateQueries scoped to the multicall batch.
  • Fallback: wagmi refetchInterval aligned with other TimeCurve polling (respect indexer backoff philosophy where relevant — podium here is RPC/onchain, not indexer).
  • Ensure no extra load storm: debounce or piggyback on existing buyFeedRefreshNonce tick if appropriate.

Theming / worldbuilding


Tests to add or update

Unit / component (Vitest + Testing Library)

  • New: TimeCurveSimplePodiumSection.test.tsx (or equivalent) — Render with mocked usePodiumReads / mocked rows; assert four categories; assert 1–2–3 labels; assert highlight / ranking-list__item--you when address matches a winner; assert empty / loading copy.
  • Optional: If PodiumAddressExplorerInline is extracted, colocate *.test.tsx for explorer link vs zero address fallback.

E2E (Playwright)

  • Update frontend/e2e/timecurve.spec.ts: assert new section appears below hub row (timer + buy) and above Recent buys / Live ticker badge (stable selector: data-testid on the new PageSection wrapper — required for CI resilience).
  • Anvil-backed flows (scripts/e2e-anvil.sh, docs/testing/e2e-anvil.md): optional assertion after buys that podium rows non-empty — only if deterministic enough under workers: 1 constraints (issue #87).

Documentation / invariant map


Verification checklist (manual)

  • /timecurve shows the new podium section above Recent buys / Live ticker badge.
  • All four categories appear with readable titles + short help consistent with podiumCopy.ts.
  • Each category lists 1st, 2nd, 3rd wallet presentation (blockie + abbreviated address + explorer affordance).
  • Connected wallet matching any placement receives clear highlight (inherits RankingList you styling or equivalent).
  • After another wallet buys / podium shifts onchain, Simple podium rows refresh without full page reload (observe with local Anvil + swarm or scripted buys).
  • No duplicate/conflicting phase messaging vs useTimecurveHeroTimer / timeCurveSimplePhase.ts guardrails (issue #48).
  • Wrong-chain write gating unchanged; podium section is read-only and safe when disconnected wallet.
  • Mobile viewport (~390×844): section scrolls cleanly; touch targets remain usable (existing Simple mobile test).
  • frontend/npm test + targeted Playwright suites green per docs/testing/strategy.md.

Acceptance criteria (close when)

  1. Placement: Podium summary is a dedicated PageSection card inserted above the Recent buys section whose badge label is Live ticker on TimeCurveSimplePage.tsx.
  2. Content: All four v1 podium categories render with three placements each; labels match canonical PODIUM_LABELS ordering (via contract index mapping).
  3. Realtime: Podium data refreshes automatically after live activity (document concrete mechanism in MR: event-driven refetch + optional interval).
  4. Viewer highlight: Rows/placements for the connected account are visually distinguished (highlight).
  5. Theming: Uses shared Yieldomega TimeCurve visual language (ranking list / podium chrome / optional category art), not ad-hoc unrelated styles.
  6. Quality: Automated tests updated as above; CI passes; MR links this issue.
## Summary Add a **single cohesive card/section** on the TimeCurve **Simple** route (`/timecurve`) that surfaces **all four v1 reserve podium categories** (Last Buy, WarBow / Battle Points ladder, Defended Streak, Time Booster), each showing **1st / 2nd / 3rd** winners **from onchain `TimeCurve.podium(category)`**. Place this section **immediately above** the existing **Recent buys** block whose section badge reads **Live ticker** (`PageSection` with `badgeLabel="Live ticker"` in `frontend/src/pages/TimeCurveSimplePage.tsx`). The UI must **update in near–real-time** as buys and WarBow activity change leaderboard snapshots onchain, and must **visually highlight** any row/placement where the wallet address matches the connected viewer (same semantics as Arena podium highlighting). Styling must stay aligned with existing **Yieldomega / Blockie Hills arcade** surface treatment: reuse established podium copy, typography, ranking chrome, and art cues already used on Arena — no generic dashboard widgets. ### Product / protocol alignment Authoritative podium categories are the **four fixed v1 tracks** documented in [`docs/product/primitives.md`](docs/product/primitives.md) (see also guardrail note on legacy category sets). Contract category indices map through [`PODIUM_CONTRACT_CATEGORY_INDEX`](frontend/src/pages/timecurve/podiumCopy.ts) → UX label order [`PODIUM_LABELS`](frontend/src/pages/timecurve/podiumCopy.ts). --- ## Files likely to change | Area | Path | Notes | |------|------|--------| | Simple page composition | [`frontend/src/pages/TimeCurveSimplePage.tsx`](frontend/src/pages/TimeCurveSimplePage.tsx) | Insert new `PageSection` above the Recent buys section (~lines 1207–1366 today). Wire wallet address + decimals from [`useTimeCurveSaleSession`](frontend/src/pages/timecurve/useTimeCurveSaleSession.ts). Subscribe to live updates (see below). | | Styles | [`frontend/src/index.css`](frontend/src/index.css) | Prefer extending existing podium / ranking / spotlight classes (`.podium-preview`, `.podium-block`, `.ranking-list`, `.spotlight-card`) before introducing parallel Simple-only CSS; scope under `.timecurve-simple-page` if needed for density or spacing. | | E2E expectations | [`frontend/e2e/timecurve.spec.ts`](frontend/e2e/timecurve.spec.ts) | [`timecurve simple view does NOT show the dense PvP / podiums sections above the fold`](frontend/e2e/timecurve.spec.ts) intentionally rejects Arena-only **H2** headings (**Podiums and prizes**, WarBow feed, etc.). After this feature, **extend or split** assertions so Simple may show a **compact podium summary** without regressing the spirit of issue **#40** (no full Arena density above the fold). Use a **distinct accessible title** for the new section (do not reuse exact Arena **Podiums and prizes** `h2` text unless product asks to unify copy). | Optional / conditional: | Path | When | |------|------| | New component module under `frontend/src/pages/timecurve/` (e.g. `TimeCurveSimplePodiumSection.tsx`) | If keeping `TimeCurveSimplePage.tsx` maintainable — recommended once JSX exceeds a reasonable threshold. | | [`docs/frontend/timecurve-views.md`](docs/frontend/timecurve-views.md) | Short subsection documenting Simple podium snapshot + realtime behavior + cross-link from [`docs/testing/invariants-and-business-logic.md`](docs/testing/invariants-and-business-logic.md) if maintainers want parity with other TimeCurve UX issues — **only if** docs updates are requested in the MR. | --- ## Components / modules to reuse or refactor ### Reuse as-is or with thin wrappers - **[`usePodiumReads`](frontend/src/pages/timecurve/usePodiumReads.ts)** — Batch `TimeCurve.podium(category)` via wagmi `useReadContracts`; primary data source for winners + raw metric strings per placement. - **[`podiumCopy.ts`](frontend/src/pages/timecurve/podiumCopy.ts)** — `PODIUM_LABELS`, `PODIUM_HELP`, `PODIUM_CONTRACT_CATEGORY_INDEX` for consistent naming with Arena / Protocol narrative. - **[`RankingList`](frontend/src/pages/timecurve/timecurveUi.tsx)** — Already implements rank glyphs (1st/2nd/3rd), `--you` highlight styling via `RankingRow.highlight`, and structured rows — matches **highlight the user wallet** requirement. - **`PodiumAddressExplorerInline`** pattern — Today lives inside [`TimeCurveSections.tsx`](frontend/src/pages/timecurve/TimeCurveSections.tsx) as a **local** helper (blockie + `AddressInline` + MegaScanner-style explorer link). Prefer **extracting** it to `frontend/src/pages/timecurve/PodiumAddressExplorerInline.tsx` (or `components/`) so Simple and Arena **share one implementation** instead of duplicating. - **[`formatPodiumLeaderboardValue`](frontend/src/pages/timeCurveArena/arenaPageHelpers.ts)** — Category-aware formatting for onchain podium values (BP vs streak vs seconds vs CL8Y-ish displays). Import from Arena helpers **or** move to `frontend/src/lib/` if coupling Simple → `timeCurveArena/` feels wrong for layering; goal is **one formatter** used by both surfaces. ### Mirror Arena economics (optional CL8Y payout preview) Arena combines [`podiumCategorySlices`](frontend/src/lib/timeCurvePodiumMath.ts) + [`podiumPlacementShares`](frontend/src/lib/timeCurvePodiumMath.ts) with **podium pool CL8Y balance** to show approximate reserve payouts per place ([`useTimeCurveArenaModel.tsx`](frontend/src/pages/timeCurveArena/useTimeCurveArenaModel.tsx) `podiumPayoutPreview`). Simple does **not** currently read `podiumPool()` / ERC20 balance. - **Minimum viable:** Show **addresses + formatted leaderboard values** only (still satisfies “who is 1st/2nd/3rd”). - **Stretch / parity:** Add the same CL8Y payout preview tiles Arena shows inside [`PodiumsSection`](frontend/src/pages/timecurve/TimeCurveSections.tsx) — requires wagmi reads for pool address + `balanceOf` (mirror Arena pattern). Document RPC load vs UX benefit in MR. ### Realtime updates Simple already listens for `Buy` events via [`useWatchContractEvent`](frontend/src/pages/TimeCurveSimplePage.tsx) (`timeCurveBuyEventAbi`) to bump indexer polling. - **Extend that pattern:** On each `Buy` log (and optionally WarBow-related events if indexed reads lag), **invalidate or refetch** podium contract reads — e.g. expose `refetch` from `usePodiumReads` or call `queryClient.invalidateQueries` scoped to the multicall batch. - **Fallback:** wagmi `refetchInterval` aligned with other TimeCurve polling (respect indexer backoff philosophy where relevant — podium here is **RPC/onchain**, not indexer). - Ensure **no extra load storm:** debounce or piggyback on existing `buyFeedRefreshNonce` tick if appropriate. ### Theming / worldbuilding - Reuse podium category art under [`frontend/public/art/podium_prizes/`](frontend/public/art/podium_prizes/) (referenced in [`frontend/public/art/README.md`](frontend/public/art/README.md)) where it matches layout density — same spirit as Arena podium row / `spotlight-card` treatment in [`TimeCurveArenaView.tsx`](frontend/src/pages/timeCurveArena/TimeCurveArenaView.tsx). - Follow [`docs/frontend/design.md`](docs/frontend/design.md) for contrast, badges, and arcade panel language; keep **`PageSection`** spotlight / badge tones consistent with adjacent Simple sections (timer, buy panel, stake panel). --- ## Tests to add or update ### Unit / component (Vitest + Testing Library) - **New:** `TimeCurveSimplePodiumSection.test.tsx` (or equivalent) — Render with mocked `usePodiumReads` / mocked rows; assert four categories; assert 1–2–3 labels; assert `highlight` / `ranking-list__item--you` when `address` matches a winner; assert empty / loading copy. - **Optional:** If `PodiumAddressExplorerInline` is extracted, colocate `*.test.tsx` for explorer link vs zero address fallback. ### E2E (Playwright) - Update [`frontend/e2e/timecurve.spec.ts`](frontend/e2e/timecurve.spec.ts): assert new section appears **below** hub row (timer + buy) and **above** Recent buys / Live ticker badge (stable selector: `data-testid` on the new `PageSection` wrapper — **required** for CI resilience). - **Anvil-backed** flows ([`scripts/e2e-anvil.sh`](scripts/e2e-anvil.sh), [`docs/testing/e2e-anvil.md`](docs/testing/e2e-anvil.md)): optional assertion after buys that podium rows non-empty — only if deterministic enough under **`workers: 1`** constraints ([issue #87](https://gitlab.com/PlasticDigits/yieldomega/-/issues/87)). ### Documentation / invariant map - If behavior is user-visible and regression-prone: add a row or pointer under [`docs/testing/invariants-and-business-logic.md`](docs/testing/invariants-and-business-logic.md) referencing this issue (follow existing TimeCurve frontend rows). --- ## Verification checklist (manual) - [ ] `/timecurve` shows the new podium section **above** Recent buys / **Live ticker** badge. - [ ] All **four** categories appear with readable titles + short help consistent with [`podiumCopy.ts`](frontend/src/pages/timecurve/podiumCopy.ts). - [ ] Each category lists **1st, 2nd, 3rd** wallet presentation (blockie + abbreviated address + explorer affordance). - [ ] Connected wallet matching any placement receives clear **highlight** (inherits `RankingList` **you** styling or equivalent). - [ ] After another wallet buys / podium shifts onchain, Simple podium rows **refresh without full page reload** (observe with local Anvil + swarm or scripted buys). - [ ] No duplicate/conflicting **phase** messaging vs [`useTimecurveHeroTimer`](frontend/src/pages/timecurve/useTimecurveHeroTimer.ts) / [`timeCurveSimplePhase.ts`](frontend/src/pages/timecurve/timeCurveSimplePhase.ts) guardrails ([issue #48](https://gitlab.com/PlasticDigits/yieldomega/-/issues/48)). - [ ] Wrong-chain write gating unchanged; podium section is **read-only** and safe when disconnected wallet. - [ ] Mobile viewport (~390×844): section scrolls cleanly; touch targets remain usable ([existing Simple mobile test](frontend/e2e/timecurve.spec.ts)). - [ ] `frontend/npm test` + targeted Playwright suites green per [`docs/testing/strategy.md`](docs/testing/strategy.md). --- ## Acceptance criteria (close when) 1. **Placement:** Podium summary is a dedicated **`PageSection` card** inserted **above** the Recent buys section whose badge label is **Live ticker** on [`TimeCurveSimplePage.tsx`](frontend/src/pages/TimeCurveSimplePage.tsx). 2. **Content:** All **four** v1 podium categories render with **three placements** each; labels match canonical [`PODIUM_LABELS`](frontend/src/pages/timecurve/podiumCopy.ts) ordering (via contract index mapping). 3. **Realtime:** Podium data refreshes automatically after live activity (document concrete mechanism in MR: event-driven refetch + optional interval). 4. **Viewer highlight:** Rows/placements for the connected account are visually distinguished (**highlight**). 5. **Theming:** Uses shared Yieldomega TimeCurve visual language (ranking list / podium chrome / optional category art), not ad-hoc unrelated styles. 6. **Quality:** Automated tests updated as above; CI passes; MR links this issue.
PlasticDigits commented 2026-05-03 07:27:03 +00:00 (Migrated from gitlab.com)

Implemented and pushed the fix to main in commit 6ccaf68 (feat(frontend): add Simple live reserve podiums). Leaving this issue open for product verification.

What changed:

  • Added a compact /timecurve Live reserve podiums section above Recent buys / Live ticker.
  • Reads all four v1 categories from onchain TimeCurve.podium(category) via PODIUM_CONTRACT_CATEGORY_INDEX: Last Buy, WarBow, Defended Streak, Time Booster.
  • Reuses shared ranking/address chrome with blockie + explorer links and connected-wallet highlighting.
  • Refetches podium reads on Buy logs and also uses a light RPC refresh interval for WarBow-only movement.
  • Integrated existing podium prize art/cutouts and documented asset consumers, invariants, manual QA, frontend docs, and player-agent skill pointers.

Verified:

  • pnpm --dir frontend exec vitest run src/pages/timecurve/TimeCurveSimplePodiumSection.test.tsx
  • pnpm --dir frontend run typecheck
  • pnpm --dir frontend run lint (existing warning only: IndexerConnectivityContext.tsx fast-refresh export)
  • pnpm --dir frontend test (254 tests passed)
  • pnpm --dir frontend run build
  • pnpm --dir frontend exec playwright test e2e/timecurve.spec.ts --workers=5 (5 passed)
  • YIELDOMEGA_DEPLOY_NO_COOLDOWN=1 bash scripts/start-qa-local-full-stack.sh --rich-state
  • Stack smoke: Anvil block read, indexer /v1/status, buys endpoint, make check-frontend-env
  • Cursor browser MCP verified http://127.0.0.1:5173/timecurve: podium section appears above Recent buys, four categories render, onchain rows populate from the QA stack, desktop + narrow viewport checked.

@brouie please verify:

  • /timecurve shows Live reserve podiums above Recent buys / Live ticker.
  • All four categories render with 1st / 2nd / 3rd rows.
  • Wallet rows use blockie + explorer links and viewer matches get the magenta highlight.
  • A buy refreshes the podium snapshot without a full page reload.
  • WarBow-only changes refresh via the light RPC interval.
  • Mobile layout stacks cleanly around 390×844.
  • Simple still avoids Arena headings: Podiums and prizes, WarBow moves and rivalry, Live battle feed.
Implemented and pushed the fix to `main` in commit `6ccaf68` (`feat(frontend): add Simple live reserve podiums`). Leaving this issue open for product verification. What changed: - Added a compact `/timecurve` **Live reserve podiums** section above **Recent buys / Live ticker**. - Reads all four v1 categories from onchain `TimeCurve.podium(category)` via `PODIUM_CONTRACT_CATEGORY_INDEX`: Last Buy, WarBow, Defended Streak, Time Booster. - Reuses shared ranking/address chrome with blockie + explorer links and connected-wallet highlighting. - Refetches podium reads on `Buy` logs and also uses a light RPC refresh interval for WarBow-only movement. - Integrated existing podium prize art/cutouts and documented asset consumers, invariants, manual QA, frontend docs, and player-agent skill pointers. Verified: - `pnpm --dir frontend exec vitest run src/pages/timecurve/TimeCurveSimplePodiumSection.test.tsx` - `pnpm --dir frontend run typecheck` - `pnpm --dir frontend run lint` (existing warning only: `IndexerConnectivityContext.tsx` fast-refresh export) - `pnpm --dir frontend test` (254 tests passed) - `pnpm --dir frontend run build` - `pnpm --dir frontend exec playwright test e2e/timecurve.spec.ts --workers=5` (5 passed) - `YIELDOMEGA_DEPLOY_NO_COOLDOWN=1 bash scripts/start-qa-local-full-stack.sh --rich-state` - Stack smoke: Anvil block read, indexer `/v1/status`, buys endpoint, `make check-frontend-env` - Cursor browser MCP verified `http://127.0.0.1:5173/timecurve`: podium section appears above Recent buys, four categories render, onchain rows populate from the QA stack, desktop + narrow viewport checked. @brouie please verify: - [ ] `/timecurve` shows **Live reserve podiums** above **Recent buys / Live ticker**. - [ ] All four categories render with 1st / 2nd / 3rd rows. - [ ] Wallet rows use blockie + explorer links and viewer matches get the magenta highlight. - [ ] A buy refreshes the podium snapshot without a full page reload. - [ ] WarBow-only changes refresh via the light RPC interval. - [ ] Mobile layout stacks cleanly around 390×844. - [ ] Simple still avoids Arena headings: **Podiums and prizes**, **WarBow moves and rivalry**, **Live battle feed**.
Brouie commented 2026-05-05 04:39:45 +00:00 (Migrated from gitlab.com)

@PlasticDigits — source-side verification PASS on 6ccaf68 at HEAD e12ddab. live UX walk (your 7-item visual checklist) pending — local stack is dev-blocked on the indexer migration timestamp collision filed as #150 / MR !374. once that lands I'll pull, bring up the full stack, and walk all 7 items + screenshots + mobile viewport.

what I confirmed source + automated:

  • vitest run TimeCurveSimplePodiumSection.test.tsx: 3/3 PASS, 32ms.
  • full frontend vitest from earlier today (#148 verification): 281/281 PASS across 46 files including the new section's tests.
  • tsc -b typecheck clean (also from #148 run).
  • integration into TimeCurveSimplePage.tsx: imports at L58-59 (TimeCurveSimplePodiumSection + usePodiumReads + TIMECURVE_PODIUMS_QUERY_KEY), hook invocation at L307 (const podiumReads = usePodiumReads(tc)), render at L1257.
  • spec position requirement (Acceptance Criterion #1: section above Recent buys / Live ticker): verified — podium at L1257, Recent buys block at L1267-1273 with badgeLabel="Live ticker". correct ordering.
  • realtime data path: hook reads contract via PODIUM_CONTRACT_CATEGORY_INDEX mapping to all four v1 categories (Last Buy, WarBow, Defended Streak, Time Booster) per podiumCopy.ts, refetches on Buy log + light RPC interval per your commit notes — wired through TIMECURVE_PODIUMS_QUERY_KEY query invalidation pattern.

what I'll walk live once #150 merges:

  1. /timecurve shows Live reserve podiums above Recent buys / Live ticker badge
  2. all four categories render with 1st / 2nd / 3rd rows
  3. wallet rows use blockie + explorer links + magenta highlight on viewer match
  4. buy refreshes podium snapshot without page reload (anvil swarm or scripted buys)
  5. WarBow-only changes refresh via the light RPC interval (steal tx triggers)
  6. mobile viewport ~390×844 stacks cleanly
  7. Simple still avoids Arena h2 headings (no "Podiums and prizes" / "WarBow moves and rivalry" / "Live battle feed")

source-side ready for sign-off on the implementation shape. live walk caveat above.

@PlasticDigits — source-side verification PASS on `6ccaf68` at HEAD `e12ddab`. live UX walk (your 7-item visual checklist) pending — local stack is dev-blocked on the indexer migration timestamp collision filed as #150 / MR !374. once that lands I'll pull, bring up the full stack, and walk all 7 items + screenshots + mobile viewport. what I confirmed source + automated: - `vitest run TimeCurveSimplePodiumSection.test.tsx`: 3/3 PASS, 32ms. - full frontend vitest from earlier today (#148 verification): 281/281 PASS across 46 files including the new section's tests. - `tsc -b` typecheck clean (also from #148 run). - integration into `TimeCurveSimplePage.tsx`: imports at L58-59 (`TimeCurveSimplePodiumSection` + `usePodiumReads` + `TIMECURVE_PODIUMS_QUERY_KEY`), hook invocation at L307 (`const podiumReads = usePodiumReads(tc)`), render at L1257. - spec position requirement (Acceptance Criterion #1: section above Recent buys / Live ticker): verified — podium at L1257, Recent buys block at L1267-1273 with `badgeLabel="Live ticker"`. correct ordering. - realtime data path: hook reads contract via `PODIUM_CONTRACT_CATEGORY_INDEX` mapping to all four v1 categories (Last Buy, WarBow, Defended Streak, Time Booster) per `podiumCopy.ts`, refetches on `Buy` log + light RPC interval per your commit notes — wired through `TIMECURVE_PODIUMS_QUERY_KEY` query invalidation pattern. what I'll walk live once #150 merges: 1. `/timecurve` shows Live reserve podiums above Recent buys / Live ticker badge 2. all four categories render with 1st / 2nd / 3rd rows 3. wallet rows use blockie + explorer links + magenta highlight on viewer match 4. buy refreshes podium snapshot without page reload (anvil swarm or scripted buys) 5. WarBow-only changes refresh via the light RPC interval (steal tx triggers) 6. mobile viewport ~390×844 stacks cleanly 7. Simple still avoids Arena h2 headings (no "Podiums and prizes" / "WarBow moves and rivalry" / "Live battle feed") source-side ready for sign-off on the implementation shape. live walk caveat above.
PlasticDigits commented 2026-05-05 05:41:11 +00:00 (Migrated from gitlab.com)

@Brouie Live ux walk required

@Brouie Live ux walk required
PlasticDigits (Migrated from gitlab.com) closed this issue 2026-05-05 07:22:25 +00:00
Brouie commented 2026-05-05 23:51:54 +00:00 (Migrated from gitlab.com)

mentioned in issue #164

mentioned in issue #164
Brouie commented 2026-05-06 03:23:06 +00:00 (Migrated from gitlab.com)

@PlasticDigits — finishing the live UX walk on this for trail completeness. items 4/5/6 were the outstanding ones, all clean.

watched the Simple page podium for a while with the swarm running. last buy podium re-ranked three times in a row with no reloads — first frame had 0xdf37f8...0913 on top at 562, then 0xfabb0a...694a took 1st (also 562) and bumped the previous leader down to 3rd, then 0x1cbd3b...c9ec jumped to 1st at 563 with 0x2546bc...ec30 showing up at 2nd. amounts ticking 562→562→563 and 140→140→141 line up with charm-mint progression as total_raised climbs. that is item 4.

item 5 — across those same three frames the WarBow column kept the same BP-leaders (0x02484c...627d, 0x5e661b...43f1, 0x8626f6...1199) but the prize-pool numbers drifted slightly (351→352, 87.8→87.9). different cadence from last buy, which is what i would expect — WarBow is on its own RPC poll, refreshing in place. Time Booster tracked the same three wallets, looks correct.

item 6 — opened DevTools at iPhone 14 Pro Max (430×932). last buy and WarBow stack single-column, full-width cards, no overflow or horizontal scroll. trophies + amounts + addresses readable. caught a fresh buy land while at mobile width and it demoted the previous 1st on the podium without reload, so item 4 cross-confirmed on mobile too. Recent Buys below renders clean — fresh-buy card and big-bite card both fine.

one unrelated thing — saw the floating Rockie Hills chip overlap the Live Reserve Podiums header on mobile first-scroll. looks like the shared-component layout thing nullvector_ux already filed in #163, not flagging separately.

items 1/2/3/7 confirmed earlier via Simple page text dump. all 7 clean.

@PlasticDigits — finishing the live UX walk on this for trail completeness. items 4/5/6 were the outstanding ones, all clean. watched the Simple page podium for a while with the swarm running. last buy podium re-ranked three times in a row with no reloads — first frame had `0xdf37f8...0913` on top at 562, then `0xfabb0a...694a` took 1st (also 562) and bumped the previous leader down to 3rd, then `0x1cbd3b...c9ec` jumped to 1st at 563 with `0x2546bc...ec30` showing up at 2nd. amounts ticking 562→562→563 and 140→140→141 line up with charm-mint progression as total_raised climbs. that is item 4. item 5 — across those same three frames the WarBow column kept the same BP-leaders (`0x02484c...627d`, `0x5e661b...43f1`, `0x8626f6...1199`) but the prize-pool numbers drifted slightly (351→352, 87.8→87.9). different cadence from last buy, which is what i would expect — WarBow is on its own RPC poll, refreshing in place. Time Booster tracked the same three wallets, looks correct. item 6 — opened DevTools at iPhone 14 Pro Max (430×932). last buy and WarBow stack single-column, full-width cards, no overflow or horizontal scroll. trophies + amounts + addresses readable. caught a fresh buy land while at mobile width and it demoted the previous 1st on the podium without reload, so item 4 cross-confirmed on mobile too. Recent Buys below renders clean — fresh-buy card and big-bite card both fine. one unrelated thing — saw the floating Rockie Hills chip overlap the Live Reserve Podiums header on mobile first-scroll. looks like the shared-component layout thing nullvector_ux already filed in #163, not flagging separately. items 1/2/3/7 confirmed earlier via Simple page text dump. all 7 clean.
PlasticDigits commented 2026-05-21 04:40:55 +00:00 (Migrated from gitlab.com)

mentioned in issue #228

mentioned in issue #228
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
code/yieldomega#113
No description provided.