UX verification checklist — DOUB launch flows (approved via cl8y-ecosystem-qa #9) #38

Closed
opened 2026-04-21 07:34:44 +00:00 by Brouie · 13 comments
Brouie commented 2026-04-21 07:34:44 +00:00 (Migrated from gitlab.com)

@PlasticDigits approved via cl8y-ecosystem-qa#9. Full checklist committed at specs/YO-DOUB-Launch-UX-Flows.md in cl8y-ecosystem-qa (commit 556fdc0).

Scope

Frontend UX verification for YO's DOUB launch on MegaETH devnet → mainnet. Covers the full pre-launch / live-sale / post-sale lifecycle plus cross-cutting concerns (mobile, a11y, error states).

Flows identified (15 total)

Pre-launch

  • F-01 Pre-launch gate (LaunchCountdownPage, routes locked)
  • F-02 Launch moment (unlock without reload)

Live sale

  • F-03 First-time visitor, no wallet
  • F-04 Wallet connect during live sale
  • F-05 Buy charms (CL8Y → TimeCurve)
  • F-06 Timer-extension buy
  • F-07 WarBow PvP (steal/guard/revenge/flag)
  • F-08 Podium standings (Last Buy / WarBow / Defended Streak / Time Booster)

Post-sale / adjacent

  • F-09 Redeem charms → DOUB
  • F-10 Presale vesting UX (DoubPresaleVesting 30% + 180-day)
  • F-11 Under-construction routes (Rabbit / Collection / Referrals)
  • F-12 Third-party DEX pages (Kumbaya / Sir)

Cross-cutting

  • F-13 Mobile layout (390x844)
  • F-14 Error states (RPC down, indexer stale, wrong chain, wallet mismatch)
  • F-15 Accessibility

Notable calls

  • F-05 below-MIN UX: enforce same standard as bridge #113 (disabled button + visible reason)
  • F-09 DOUB (charm payout) vs CL8Y (podium payout) — spec says don't conflate; UX must separate too
  • F-10 vesting clock in local tz AND UTC
  • F-12 placeholder LP readout at launch, not real values yet

Hand-off

Intended for whoever picks up manual UX QA. Checklist is self-contained per flow. Log findings as new YO issues, tag @Brouie for triage.

Full spec: https://gitlab.com/PlasticDigits/cl8y-ecosystem-qa/-/blob/main/specs/YO-DOUB-Launch-UX-Flows.md

@PlasticDigits approved via cl8y-ecosystem-qa#9. Full checklist committed at `specs/YO-DOUB-Launch-UX-Flows.md` in cl8y-ecosystem-qa (commit 556fdc0). ## Scope Frontend UX verification for YO's DOUB launch on MegaETH devnet → mainnet. Covers the full pre-launch / live-sale / post-sale lifecycle plus cross-cutting concerns (mobile, a11y, error states). ## Flows identified (15 total) **Pre-launch** - F-01 Pre-launch gate (LaunchCountdownPage, routes locked) - F-02 Launch moment (unlock without reload) **Live sale** - F-03 First-time visitor, no wallet - F-04 Wallet connect during live sale - F-05 Buy charms (CL8Y → TimeCurve) - F-06 Timer-extension buy - F-07 WarBow PvP (steal/guard/revenge/flag) - F-08 Podium standings (Last Buy / WarBow / Defended Streak / Time Booster) **Post-sale / adjacent** - F-09 Redeem charms → DOUB - F-10 Presale vesting UX (DoubPresaleVesting 30% + 180-day) - F-11 Under-construction routes (Rabbit / Collection / Referrals) - F-12 Third-party DEX pages (Kumbaya / Sir) **Cross-cutting** - F-13 Mobile layout (390x844) - F-14 Error states (RPC down, indexer stale, wrong chain, wallet mismatch) - F-15 Accessibility ## Notable calls - F-05 below-MIN UX: enforce same standard as bridge #113 (disabled button + visible reason) - F-09 DOUB (charm payout) vs CL8Y (podium payout) — spec says don't conflate; UX must separate too - F-10 vesting clock in local tz AND UTC - F-12 placeholder LP readout at launch, not real values yet ## Hand-off Intended for whoever picks up manual UX QA. Checklist is self-contained per flow. Log findings as new YO issues, tag @Brouie for triage. Full spec: https://gitlab.com/PlasticDigits/cl8y-ecosystem-qa/-/blob/main/specs/YO-DOUB-Launch-UX-Flows.md
Brouie commented 2026-04-24 06:22:51 +00:00 (Migrated from gitlab.com)

mentioned in issue #59

mentioned in issue #59
Brouie commented 2026-04-24 06:45:16 +00:00 (Migrated from gitlab.com)

mentioned in issue #61

mentioned in issue #61
Brouie commented 2026-04-27 02:46:34 +00:00 (Migrated from gitlab.com)

mentioned in issue #72

mentioned in issue #72
Brouie commented 2026-04-28 08:08:45 +00:00 (Migrated from gitlab.com)

Partial walkthrough today on 7b0f37d SKIP+KUMBAYA stack with sale live. Evidence below for F-01 through F-08; F-09 through F-15 deferred to a follow-up session.

F-01 Pre-launch gate — PASS

Set VITE_LAUNCH_TIMESTAMP to 1 hour ahead, restarted Vite. Hit all 7 routes with hard-refresh:

  • / -> LaunchCountdownPage (not HomePage), countdown ticking, no nav, no wallet button, no console errors specific to gate
  • /timecurve -> gate (no bypass)
  • /rabbit-treasury -> gate
  • /collection -> gate
  • /referrals -> gate
  • /kumbaya -> gate
  • /sir -> gate

Countdown ticked consistently across navigations (~30s deltas across screenshots). Branded shell rendered on all gated routes (YIELDOMEGA logo, DOUB LAUNCHES IN, Telegram/X.com/Docs/Agent Skills CTAs). Console issues observed were standard background noise (MetaMask/Backpack provider conflict, wagmi WC project ID empty notice, AudioContext autoplay) — none gate-specific.

F-02 Launch moment — PASS

Set VITE_LAUNCH_TIMESTAMP to 60s ahead, restarted Vite, opened / and watched live. At 00:00:00 the gate flipped without manual reload:

  • / started serving TimeCurvePage (verified by post-flip screenshot showing TimeCurve nav + Buy CHARM panel)
  • /home served HomePage (separate verification — YIELDOMEGA hero card + product tiles for TIMECURVE LIVE / RABBIT TREASURY IN QUEUE / COLLECTION IN QUEUE / REFERRALS IN QUEUE / KUMBAYA EXTERNAL / SIR EXTERNAL)
  • Nav appeared (TimeCurve / Rabbit Treasury / Collection / Referrals / Kumbaya / Sir)
  • Wallet auto-reconnected (chip 0xf3...2266 visible)
  • No double-render or hydration warnings in console at the flip

Idle-stale-timer check skipped (would need hours at gate).

F-03 First-time visitor, sale live — PASS

Disconnected wallet via MetaMask, refreshed /timecurve as no-wallet visitor:

  • Hero with TIME LEFT timer (23+ hours), SALE LIVE pill
  • Buy CHARM surface showed clean 'Connect a wallet to mint CHARM and lock in your DOUB launch share.' prompt + Connect Wallet button (not a broken form)
  • Onchain reads worked without wallet: '1 CHARM COSTS RIGHT NOW: 1.000429 CL8Y', '1 CHARM AT LAUNCH: 343.13k DOUB = 1.200515 CL8Y'
  • RECENT BUYS feed populated with prior buys, yellow live-ticker dot indicator
  • Header showed 'Connect Wallet' button instead of address chip
  • No 'Latest buys from indexer' aside collapse

F-04 Wallet connect during live sale — PASS

Reconnected wallet:

  • RainbowKit modal opened on first click (no double-click bug)
  • After connect, address chip 0xf3...2266 in header, CL8Y balance read (50m abbr), charm weight populated (matched onchain)
  • Live buys feed didn't blow away during connect transition
  • Verified by transition screenshot showing Connect Wallet -> address chip without page reload

F-05 Buy charms (CL8Y -> TimeCurve) — PASS

Direct CL8Y buy path exercised:

  • Spending cap prompt appeared with correct token/spender (CL8Y -> TimeCurve proxy)
  • Buy tx prompt followed for 1.001 CHARM at ~1.005559 CL8Y/CHARM, slider value clamped within band correctly
  • On confirm: 'YOU HOLD' updated 2.914 -> 3.915 CHARM, 'WORTH AT LAUNCH ≈' tracked correctly, RECENT BUYS gained new row tx 0x059eb9c3...
  • Tx revert path also exercised (the #82 lower-edge friendly-revert) — friendly message displayed correctly per spec ('amount band moved between quote and submit')

Below-MIN UX item not separately exercised (slider doesn't visibly let you go below MIN; would need manual amount input to test).

F-06 Timer-extension buy — PASS

Across 4 successful buys today (1 Kumbaya path A, 1 Kumbaya path B, 2 CL8Y direct):

  • Every buy showed 'Just +120s by 0xf39fd6...2266' overlay on hero card
  • Timer label is 'TIME LEFT' (matches spec mid-state copy)
  • Live buys feed populated cleanly across multiple buys without page-reload, no layout shift visible

Urgency-class transition not exercised (timer at 23+ hours, nowhere near deadline). Would need warp setup which is ground we already covered in #83.

F-07 WarBow PvP — PASS

Arena tab walkthrough on connected wallet:

  • Steal cap visible: 'Steal cap: 3 per victim per UTC day'
  • Bypass burn / Guard burn from contract: 'Bypass burn DECIMAL 50 / ABBR 50', 'Guard burn DECIMAL 10 / ABBR 10' (proper formatted reads, not hardcoded strings)
  • Action buttons gate correctly: 'WarBow actions unlock when the sale is live.' + 'Loading pending WarBow flag from chain...' empty-state — Steal/Guard/Revenge/Flag buttons NOT visible because no other players + no flag planted (correct empty-state behavior)
  • Acting on self blocked: Chasing pack shows '1. 0xf39fd6...2266 / Connected wallet / 500 BP' with NO Steal/Guard buttons against self
  • Rivalry feed: 'No WarBow feed rows yet' empty state
  • Top rivals: 'Waiting for WarBow contract snapshot' load state

F-08 Podium standings — PASS

All 4 categories rendered with correct % breakdowns:

  • Last Buy 40% — 'The final buyer takes first, with the two buyers before them taking second and third'
  • WarBow 25% — 'Top Battle Points on the WarBow ladder (1st / 2nd / 3rd)'
  • Defended Streak 20% — 'Tracks the best under-15-minute defended streak per wallet'
  • Time Booster 15% — 'Tracks the wallets that added the most real seconds to the deadline'
  • Total: 40+25+20+15 = 100% ✓

Each category shows 1st/2nd/3rd rows with correct empty-state copy: 'Largest reserve slice in category' / 'Reserve payout preview' + decimal/abbr 0. No broken rows.

Bonus: Live Battle Feed shows MOMENTUM SHIFT rows with full enrichment (amount + decimal/abbr + 'added 120s · moved to 500 BP · Base buy +250 BP · charms 1 · BP 500 · block 10 · tx 0x059eb9c3...').

Bonus: Indexer status bar 'Indexer v1.8.0 · latest indexed block 10 · live' renders with version + block + green status pill.

Bonus: Canonical fee sinks (Protocol Detail) shows the 30/40/20/0/10 split per buy: 'DOUB/CL8Y LP (locked) 0.302 · CL8Y burned (sale proceeds) 0.403 · Podium pool 0.201 · Team / reserved 0 · Rabbit Treasury 0.101'. That's the F-05 fee preview spec line, surfaced in Protocol Detail not the buy panel.

Deferred to follow-up session (7)

  • F-09 Post-sale redeem — partial verify done on rich-state stack (UI state-transition walkthrough PASS: SALE ENDED pill, buy form gone, REDEEM CHARM panel appears with 'The sale is over. Redeem CHARM to mint your DOUB share onchain.' copy, 'Already redeemed' disabled button, charmWeight=10e18 + charmsRedeemed=true onchain matches UI state). Live signed redeem tx + DOUB balance check NOT exercised (rich-state seeds all 4 buyer wallets as already-redeemed; would need a fresh non-rich-state ended-sale setup which I started but ran out of session time)
  • F-10 Presale vesting (DoubPresaleVesting)
  • F-11 Under-construction routes — partially observed, /referrals is now built so spec is slightly stale on this
  • F-12 Third-party DEX pages (/kumbaya, /sir)
  • F-13 Mobile layout 390x844
  • F-14 Error states — partially observed (indexer status bar correct, 'Set the indexer URL or wait for indexed buys' empty-state visible during F-03 walkthrough)
  • F-15 Accessibility

Spec drift to flag (not a launch-blocker)

  • F-11 says /referrals renders UnderConstruction.tsx but the page is now fully built (per #64 close). Spec needs an update.
  • F-09 acceptance line 'Post-redeem: charm weight shows as zero / claimed state' is slightly off contract semantics. Onchain, charmWeight is preserved as a permanent record after redemption; only charmsRedeemed flips to true. UI correctly displays both pieces of state ('YOU HOLD: 10 CHARM' alongside 'Already redeemed' disabled button) which matches contract design but contradicts spec literal.
  • F-05 'MIN/MAX buttons populate correct value in wei' — current UI uses a slider, not MIN/MAX buttons. Minor spec drift on input UX.

Notes on stack mode

Most flows above were exercised on SKIP_ANVIL_RICH_STATE=1 + YIELDOMEGA_DEPLOY_KUMBAYA=1. F-09 partial used full rich-state mode. Cycled stack 4 times today across #75/#84/#82/F-09 work.

Picking up F-09 live signed redeem and F-10 through F-15 next session.

cc @PlasticDigits

Partial walkthrough today on `7b0f37d` SKIP+KUMBAYA stack with sale live. Evidence below for F-01 through F-08; F-09 through F-15 deferred to a follow-up session. ## F-01 Pre-launch gate — PASS Set VITE_LAUNCH_TIMESTAMP to 1 hour ahead, restarted Vite. Hit all 7 routes with hard-refresh: - / -> LaunchCountdownPage (not HomePage), countdown ticking, no nav, no wallet button, no console errors specific to gate - /timecurve -> gate (no bypass) - /rabbit-treasury -> gate - /collection -> gate - /referrals -> gate - /kumbaya -> gate - /sir -> gate Countdown ticked consistently across navigations (~30s deltas across screenshots). Branded shell rendered on all gated routes (YIELDOMEGA logo, DOUB LAUNCHES IN, Telegram/X.com/Docs/Agent Skills CTAs). Console issues observed were standard background noise (MetaMask/Backpack provider conflict, wagmi WC project ID empty notice, AudioContext autoplay) — none gate-specific. ## F-02 Launch moment — PASS Set VITE_LAUNCH_TIMESTAMP to 60s ahead, restarted Vite, opened / and watched live. At 00:00:00 the gate flipped without manual reload: - / started serving TimeCurvePage (verified by post-flip screenshot showing TimeCurve nav + Buy CHARM panel) - /home served HomePage (separate verification — YIELDOMEGA hero card + product tiles for TIMECURVE LIVE / RABBIT TREASURY IN QUEUE / COLLECTION IN QUEUE / REFERRALS IN QUEUE / KUMBAYA EXTERNAL / SIR EXTERNAL) - Nav appeared (TimeCurve / Rabbit Treasury / Collection / Referrals / Kumbaya / Sir) - Wallet auto-reconnected (chip 0xf3...2266 visible) - No double-render or hydration warnings in console at the flip Idle-stale-timer check skipped (would need hours at gate). ## F-03 First-time visitor, sale live — PASS Disconnected wallet via MetaMask, refreshed /timecurve as no-wallet visitor: - Hero with TIME LEFT timer (23+ hours), SALE LIVE pill - Buy CHARM surface showed clean 'Connect a wallet to mint CHARM and lock in your DOUB launch share.' prompt + Connect Wallet button (not a broken form) - Onchain reads worked without wallet: '1 CHARM COSTS RIGHT NOW: 1.000429 CL8Y', '1 CHARM AT LAUNCH: 343.13k DOUB = 1.200515 CL8Y' - RECENT BUYS feed populated with prior buys, yellow live-ticker dot indicator - Header showed 'Connect Wallet' button instead of address chip - No 'Latest buys from indexer' aside collapse ## F-04 Wallet connect during live sale — PASS Reconnected wallet: - RainbowKit modal opened on first click (no double-click bug) - After connect, address chip 0xf3...2266 in header, CL8Y balance read (50m abbr), charm weight populated (matched onchain) - Live buys feed didn't blow away during connect transition - Verified by transition screenshot showing Connect Wallet -> address chip without page reload ## F-05 Buy charms (CL8Y -> TimeCurve) — PASS Direct CL8Y buy path exercised: - Spending cap prompt appeared with correct token/spender (CL8Y -> TimeCurve proxy) - Buy tx prompt followed for 1.001 CHARM at ~1.005559 CL8Y/CHARM, slider value clamped within band correctly - On confirm: 'YOU HOLD' updated 2.914 -> 3.915 CHARM, 'WORTH AT LAUNCH ≈' tracked correctly, RECENT BUYS gained new row tx 0x059eb9c3... - Tx revert path also exercised (the #82 lower-edge friendly-revert) — friendly message displayed correctly per spec ('amount band moved between quote and submit') Below-MIN UX item not separately exercised (slider doesn't visibly let you go below MIN; would need manual amount input to test). ## F-06 Timer-extension buy — PASS Across 4 successful buys today (1 Kumbaya path A, 1 Kumbaya path B, 2 CL8Y direct): - Every buy showed 'Just +120s by 0xf39fd6...2266' overlay on hero card - Timer label is 'TIME LEFT' (matches spec mid-state copy) - Live buys feed populated cleanly across multiple buys without page-reload, no layout shift visible Urgency-class transition not exercised (timer at 23+ hours, nowhere near deadline). Would need warp setup which is ground we already covered in #83. ## F-07 WarBow PvP — PASS Arena tab walkthrough on connected wallet: - Steal cap visible: 'Steal cap: 3 per victim per UTC day' - Bypass burn / Guard burn from contract: 'Bypass burn DECIMAL 50 / ABBR 50', 'Guard burn DECIMAL 10 / ABBR 10' (proper formatted reads, not hardcoded strings) - Action buttons gate correctly: 'WarBow actions unlock when the sale is live.' + 'Loading pending WarBow flag from chain...' empty-state — Steal/Guard/Revenge/Flag buttons NOT visible because no other players + no flag planted (correct empty-state behavior) - Acting on self blocked: Chasing pack shows '1. 0xf39fd6...2266 / Connected wallet / 500 BP' with NO Steal/Guard buttons against self - Rivalry feed: 'No WarBow feed rows yet' empty state - Top rivals: 'Waiting for WarBow contract snapshot' load state ## F-08 Podium standings — PASS All 4 categories rendered with correct % breakdowns: - Last Buy 40% — 'The final buyer takes first, with the two buyers before them taking second and third' - WarBow 25% — 'Top Battle Points on the WarBow ladder (1st / 2nd / 3rd)' - Defended Streak 20% — 'Tracks the best under-15-minute defended streak per wallet' - Time Booster 15% — 'Tracks the wallets that added the most real seconds to the deadline' - Total: 40+25+20+15 = 100% ✓ Each category shows 1st/2nd/3rd rows with correct empty-state copy: 'Largest reserve slice in category' / 'Reserve payout preview' + decimal/abbr 0. No broken rows. Bonus: Live Battle Feed shows MOMENTUM SHIFT rows with full enrichment (amount + decimal/abbr + 'added 120s · moved to 500 BP · Base buy +250 BP · charms 1 · BP 500 · block 10 · tx 0x059eb9c3...'). Bonus: Indexer status bar 'Indexer v1.8.0 · latest indexed block 10 · live' renders with version + block + green status pill. Bonus: Canonical fee sinks (Protocol Detail) shows the 30/40/20/0/10 split per buy: 'DOUB/CL8Y LP (locked) 0.302 · CL8Y burned (sale proceeds) 0.403 · Podium pool 0.201 · Team / reserved 0 · Rabbit Treasury 0.101'. That's the F-05 fee preview spec line, surfaced in Protocol Detail not the buy panel. ## Deferred to follow-up session (7) - F-09 Post-sale redeem — partial verify done on rich-state stack (UI state-transition walkthrough PASS: SALE ENDED pill, buy form gone, REDEEM CHARM panel appears with 'The sale is over. Redeem CHARM to mint your DOUB share onchain.' copy, 'Already redeemed' disabled button, charmWeight=10e18 + charmsRedeemed=true onchain matches UI state). Live signed redeem tx + DOUB balance check NOT exercised (rich-state seeds all 4 buyer wallets as already-redeemed; would need a fresh non-rich-state ended-sale setup which I started but ran out of session time) - F-10 Presale vesting (DoubPresaleVesting) - F-11 Under-construction routes — partially observed, /referrals is now built so spec is slightly stale on this - F-12 Third-party DEX pages (/kumbaya, /sir) - F-13 Mobile layout 390x844 - F-14 Error states — partially observed (indexer status bar correct, 'Set the indexer URL or wait for indexed buys' empty-state visible during F-03 walkthrough) - F-15 Accessibility ## Spec drift to flag (not a launch-blocker) - F-11 says /referrals renders UnderConstruction.tsx but the page is now fully built (per #64 close). Spec needs an update. - F-09 acceptance line 'Post-redeem: charm weight shows as zero / claimed state' is slightly off contract semantics. Onchain, charmWeight is preserved as a permanent record after redemption; only charmsRedeemed flips to true. UI correctly displays both pieces of state ('YOU HOLD: 10 CHARM' alongside 'Already redeemed' disabled button) which matches contract design but contradicts spec literal. - F-05 'MIN/MAX buttons populate correct value in wei' — current UI uses a slider, not MIN/MAX buttons. Minor spec drift on input UX. ## Notes on stack mode Most flows above were exercised on SKIP_ANVIL_RICH_STATE=1 + YIELDOMEGA_DEPLOY_KUMBAYA=1. F-09 partial used full rich-state mode. Cycled stack 4 times today across #75/#84/#82/F-09 work. Picking up F-09 live signed redeem and F-10 through F-15 next session. cc @PlasticDigits
Brouie commented 2026-04-29 01:30:18 +00:00 (Migrated from gitlab.com)

mentioned in issue #88

mentioned in issue #88
Brouie commented 2026-04-29 06:06:56 +00:00 (Migrated from gitlab.com)

mentioned in issue #90

mentioned in issue #90
Brouie commented 2026-04-29 06:08:51 +00:00 (Migrated from gitlab.com)

mentioned in issue #39

mentioned in issue #39
Brouie commented 2026-04-29 06:46:33 +00:00 (Migrated from gitlab.com)

mentioned in issue #91

mentioned in issue #91
Brouie commented 2026-04-29 06:56:41 +00:00 (Migrated from gitlab.com)

mentioned in issue #92

mentioned in issue #92
Brouie commented 2026-04-30 01:08:28 +00:00 (Migrated from gitlab.com)

Continued walkthrough yesterday on 799cf6f SKIP+KUMBAYA+NO_COOLDOWN stack. Evidence below for F-09 through F-12; F-13 / F-14 / F-15 deferred to a follow-up session.

F-09 Stake-at-launch / live signed redeem — PASS

Walked on the post-end stack pivot (chain warp 85500s + endSale() called from deployer keypair, status 1, SaleEnded event emitted). State pre-redeem on the running stack:

  • deadline() past chain ts, ended()=true, charmRedemptionEnabled()=true
  • Deployer 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266: charmWeight()=3e18 (3 CHARM), charmsRedeemed()=false
  • Deployer was the only charm holder this session; totalCharmWeight=3e18, totalTokensForSale=1e24

Live signed redeemCharms() from deployer wallet. Post-tx state:

  • charmsRedeemed(0xf3...2266) flipped false → true (one-way, confirms guards from B4)
  • charmWeight(0xf3...2266)=3e18 preserved post-redeem (NOT zeroed — confirms contract semantics flagged in 0428 as a spec note: only the redeemed flag flips, weight is kept for historical reference)
  • DOUB balance on deployer: 1,000,000e18 (1M DOUB) — pro-rata math correct (totalTokensForSale * charmWeight / totalCharmWeight = 1e24 * 3 / 3 = 1e24)
  • Frontend "Already redeemed" panel surfaced post-tx, persisted across hard refresh

Filed cosmetic follow-up #90 — "Already redeemed" / stake-at-launch panel shows historical CHARM held + worth-at-launch projection, not the actual DOUB amount received.

F-10 DoubPresaleVesting — GAP, filed as #92

No /vesting route in the frontend, no DoubPresaleVesting deployment in DeployDev.s.sol, no UI surface for vesting checklist verification. Filed as #92 with suggested resolution: deploy DoubPresaleVesting in DeployDev fixture + add /vesting route + wire claim/schedule UI.

F-11 External venue placeholders — PARTIAL PASS, filed as #91

  • /collection — PASS. Clean UnderConstruction-style placeholder, same shell + mascot system, "Open TimeCurve" CTA wired.
  • /rabbit-treasury — PASS. Same placeholder pattern, CTA wired.
  • /referrals — SPEC DRIFT. Route is fully built and functional: referral registration form live, 5% bonus read direct from chain, CL8Y burn flow wired. Spec lists this route as "under construction." Filed as #91 to align spec to implementation.

F-12 Kumbaya / Sir external venue placeholders — PASS

  • /kumbaya — PASS. Clean external-venue placeholder with proper trust framing, build-time hint env vars, "Outbound route ready, live depth readout not wired yet" status banner. Matches spec.
  • /sir — PASS. Same pattern as /kumbaya. Matches spec.

Deferred (next session)

  • F-13 mobile 390x844 viewport (DevTools device emulation across all 7 routes)
  • F-14 error states (RPC down, indexer stale, wrong chain, wallet mismatch synthesis)
  • F-15 accessibility (semantic markup, keyboard nav, ARIA labels)

cc @PlasticDigits

Continued walkthrough yesterday on `799cf6f` SKIP+KUMBAYA+NO_COOLDOWN stack. Evidence below for F-09 through F-12; F-13 / F-14 / F-15 deferred to a follow-up session. ## F-09 Stake-at-launch / live signed redeem — PASS Walked on the post-end stack pivot (chain warp 85500s + endSale() called from deployer keypair, status 1, SaleEnded event emitted). State pre-redeem on the running stack: - `deadline()` past chain ts, `ended()=true`, `charmRedemptionEnabled()=true` - Deployer `0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266`: `charmWeight()=3e18` (3 CHARM), `charmsRedeemed()=false` - Deployer was the only charm holder this session; `totalCharmWeight=3e18`, `totalTokensForSale=1e24` Live signed `redeemCharms()` from deployer wallet. Post-tx state: - `charmsRedeemed(0xf3...2266)` flipped false → true (one-way, confirms guards from B4) - `charmWeight(0xf3...2266)=3e18` preserved post-redeem (NOT zeroed — confirms contract semantics flagged in 0428 as a spec note: only the redeemed flag flips, weight is kept for historical reference) - DOUB balance on deployer: `1,000,000e18` (1M DOUB) — pro-rata math correct (`totalTokensForSale * charmWeight / totalCharmWeight = 1e24 * 3 / 3 = 1e24`) - Frontend "Already redeemed" panel surfaced post-tx, persisted across hard refresh Filed cosmetic follow-up #90 — "Already redeemed" / stake-at-launch panel shows historical CHARM held + worth-at-launch projection, not the actual DOUB amount received. ## F-10 DoubPresaleVesting — GAP, filed as #92 No `/vesting` route in the frontend, no `DoubPresaleVesting` deployment in `DeployDev.s.sol`, no UI surface for vesting checklist verification. Filed as #92 with suggested resolution: deploy DoubPresaleVesting in DeployDev fixture + add /vesting route + wire claim/schedule UI. ## F-11 External venue placeholders — PARTIAL PASS, filed as #91 - `/collection` — PASS. Clean UnderConstruction-style placeholder, same shell + mascot system, "Open TimeCurve" CTA wired. - `/rabbit-treasury` — PASS. Same placeholder pattern, CTA wired. - `/referrals` — SPEC DRIFT. Route is fully built and functional: referral registration form live, 5% bonus read direct from chain, CL8Y burn flow wired. Spec lists this route as "under construction." Filed as #91 to align spec to implementation. ## F-12 Kumbaya / Sir external venue placeholders — PASS - `/kumbaya` — PASS. Clean external-venue placeholder with proper trust framing, build-time hint env vars, "Outbound route ready, live depth readout not wired yet" status banner. Matches spec. - `/sir` — PASS. Same pattern as `/kumbaya`. Matches spec. ## Deferred (next session) - F-13 mobile 390x844 viewport (DevTools device emulation across all 7 routes) - F-14 error states (RPC down, indexer stale, wrong chain, wallet mismatch synthesis) - F-15 accessibility (semantic markup, keyboard nav, ARIA labels) cc @PlasticDigits
Brouie commented 2026-04-30 03:15:16 +00:00 (Migrated from gitlab.com)

mentioned in issue #93

mentioned in issue #93
Brouie commented 2026-04-30 04:21:08 +00:00 (Migrated from gitlab.com)

Walked deferred F-13 / F-14 / F-15 (partial) on 282eb62 SKIP+KUMBAYA+NO_COOLDOWN stack today. Closing #38.

This builds on yesterday's partial close note (F-09 PASS / F-10 GAP filed as #92 / F-11 partial PASS + spec drift filed as #91 / F-12 PASS).

F-13 — Mobile layout (390x844): PASS with 1 finding

Walked all 10 routes at iPhone 12 Pro preset (390x844) via Chrome DevTools device emulation:

  • / — PASS
  • /timecurve — PASS
  • /timecurve/arena — PASS
  • /timecurve/protocol — PASS
  • /rabbit-treasury — PASS
  • /collection — PASS
  • /referrals — PASS
  • /kumbaya — PASS
  • /sir — PASS
  • /vesting — PASS

Layouts all reflow correctly to mobile width. Nav menu collapses appropriately. Cards stack vertically. Sliders, inputs, and CTAs remain tap-target sized.

Finding filed as #93 — the global "Canonical fee sinks (read-only)" panel that appears on every route truncates each sink address (40 char hex) at the right edge with no scroll affordance, no tap-to-expand, no copy-to-clipboard, and no ellipsis indicator. Mobile users cannot read or verify the sink addresses on the most trust-sensitive read-only panel. P2 medium, single-component fix.

F-14 — Error states: 2 PASS + 2 findings

F-14.1 — Wrong chain: PASS indicator + finding filed (#95)

Switched MetaMask from Chain 31337 to BNB Chain. YO header pill correctly flipped to "Wrong Network" indicator. Indicator works.

However, finding filed as #95: the "Wrong Network" pill is informational only. The BUY CHARM CTA stayed clickable, frontend built buy calldata against 0x59b670e9fA9D0A427751Af201D676719a970857b (the Anvil TimeCurve proxy address) and shipped the tx to MetaMask on BSC mainnet. Two saves prevented impact:

  1. MetaMask's Blockaid integration flagged the BSC destination as "Malicious address" and greyed out Review alerts
  2. The address slot is empty / scam-flagged on BSC

But the underlying gap is real: write-action CTAs (BUY CHARM, Register & burn CL8Y, Claim DOUB, etc.) are not gated on chainId match. Filed as MEDIUM-HIGH severity because at TGE users will be juggling MegaETH + BSC + ETH mainnet to bridge, and a wrong-chain BUY CHARM click is a plausible everyday mistake.

F-14.2 — RPC down: PASS

Disconnected the SSH tunnel forwarding for port 8545 to simulate RPC unreachability. Hard-refreshed /timecurve. Frontend correctly degraded:

  • "TIME LEFT" panel showed "LOADING" badge + "Loading sale state..." copy + skeleton bar
  • "BUY CHARM" panel switched to "COMING SOON" badge + "The sale will open here when the timer hits zero" copy
  • Section header showed "LOADING" badge
  • BUY CHARM button was removed (not just disabled)
  • Wallet pill kept cached values (Chain 31337 + 0xf3...2266)

Safe degraded state. Users cannot interact with stale data. Polish nit (no explicit "RPC offline / retrying" copy to differentiate fresh-page-load from mid-session-disconnect) was noted but not severe enough to file.

F-14.3 — Indexer down: finding filed (#96)

Disconnected the SSH tunnel forwarding for port 3100 only (kept 8545 + 5173 alive). Frontend behavior:

  • Console: 155+ net::ERR_CONNECTION_REFUSED errors in ~10 seconds, all targeting :3100/v1/timecurve/chain-timer, /buys, etc., aggressive retry with no backoff
  • Page UI: NO visible change. The "Indexer v1.8.0 · latest indexed block N · live" status banner just disappeared. No "offline" badge, no "Reconnecting..." copy.
  • "Recent Buys" panel: showed "Waiting for the first buy of this round" — identical to legitimate empty state, indistinguishable from indexer-offline state
  • RPC-derived reads still worked (timer ticking, prices, balance, BUY CHARM button clickable)

Real user-trust gap: a user with degraded indexer connectivity sees "Waiting for the first buy" and may think they're early when 100+ buys have actually happened (just can't fetch them). Filed as #96 MEDIUM with multiple resolution options (explicit offline banner, stale-data badges, exponential backoff, distinguish empty-vs-offline copy).

F-14.4 — Wallet mismatch synthesis: PASS

Switched MetaMask active account from deployer 0xf39Fd6...2266 to personal test wallet 0xc46b15...0650 mid-session. Frontend correctly:

  • Detected the MM accountsChanged event
  • Updated header pill from 0xf3...2266 to 0xc4...0650
  • Reset "Your CL8Y balance" from 50000000 to 0 (personal wallet has 0 CL8Y on this fresh stack)
  • Showed transient "Loading live min - max..." + "Loading CHARM preview..." states while re-fetching

No frozen old-wallet data, no stale balance display. PASS.

F-15 — Accessibility: PARTIAL with 1 finding (#97); full audit deferred post-TGE

F-15.1 — Keyboard focus visibility: finding filed (#97)

Tabbed through the page from a focused position. Focus moves correctly through interactive elements (verified via document.activeElement polling in console — element changes on each Tab) but no visible focus indicator appears on any element. Click-to-focus works (focus styles applied on mouse interaction) but Tab-to-focus is silently invisible.

WCAG 2.4.7 (Focus Visible, Level AA) violation. Filed as #97 with a one-rule CSS fix recommendation (:focus-visible rule on interactive selectors with appropriate outline + offset).

F-15.2 — Full a11y audit deferred to post-TGE

Semantic markup audit, ARIA label coverage, screen reader announcements, color contrast checks, and keyboard interaction patterns (Enter to submit, Escape to close modals, arrow keys on sliders, etc.) were not exhaustively walked this session due to time pressure on TGE day. The keyboard focus-visible finding (#97) is the most critical and is filed. The remaining a11y items are deferred to a dedicated post-TGE audit session.

#38 closure summary

15 of 15 F-flow rows walked across the two-day session (yesterday + today):

  • F-01 through F-08: PASS (yesterday's partial1 note note_3296...)
  • F-09: PASS (yesterday's partial2 note posted today, note_3301812521)
  • F-10: GAP, filed as #92 (now CLOSED — dev shipped DoubPresaleVesting + /vesting route, verified today, see #92 close note)
  • F-11: PARTIAL PASS, spec drift filed as #91 (now CLOSED — dev fixed spec docs, verified today, see #91 close note)
  • F-12: PASS
  • F-13: PASS with 1 finding (#93)
  • F-14: 2 PASS + 2 findings (#95, #96)
  • F-15: PARTIAL with 1 finding (#97), full audit deferred post-TGE

Issues filed during #38 walkthrough:

  • Closed same week: #90 (post-end UI polish), #91 (spec drift), #92 (vesting deploy + UI), #38 (this issue)
  • Open: #93 (mobile fee sinks truncation), #95 (wrong-chain submit gate), #96 (indexer offline UX), #97 (focus-visible)
  • Other deferred follow-ups noted in earlier sessions: #89 (WC mobile)

Closing #38. The full F-flow checklist is exercised, every gap that surfaced is now either fixed (and verified) or filed with severity + suggested resolution.

cc @PlasticDigits

Walked deferred F-13 / F-14 / F-15 (partial) on `282eb62` SKIP+KUMBAYA+NO_COOLDOWN stack today. Closing #38. This builds on yesterday's partial close note (F-09 PASS / F-10 GAP filed as #92 / F-11 partial PASS + spec drift filed as #91 / F-12 PASS). ## F-13 — Mobile layout (390x844): PASS with 1 finding Walked all 10 routes at iPhone 12 Pro preset (390x844) via Chrome DevTools device emulation: - `/` — PASS - `/timecurve` — PASS - `/timecurve/arena` — PASS - `/timecurve/protocol` — PASS - `/rabbit-treasury` — PASS - `/collection` — PASS - `/referrals` — PASS - `/kumbaya` — PASS - `/sir` — PASS - `/vesting` — PASS Layouts all reflow correctly to mobile width. Nav menu collapses appropriately. Cards stack vertically. Sliders, inputs, and CTAs remain tap-target sized. **Finding filed as #93** — the global "Canonical fee sinks (read-only)" panel that appears on every route truncates each sink address (40 char hex) at the right edge with no scroll affordance, no tap-to-expand, no copy-to-clipboard, and no ellipsis indicator. Mobile users cannot read or verify the sink addresses on the most trust-sensitive read-only panel. P2 medium, single-component fix. ## F-14 — Error states: 2 PASS + 2 findings ### F-14.1 — Wrong chain: PASS indicator + finding filed (#95) Switched MetaMask from Chain 31337 to BNB Chain. YO header pill correctly flipped to "Wrong Network" indicator. Indicator works. **However**, finding filed as #95: the "Wrong Network" pill is informational only. The BUY CHARM CTA stayed clickable, frontend built buy calldata against `0x59b670e9fA9D0A427751Af201D676719a970857b` (the Anvil TimeCurve proxy address) and shipped the tx to MetaMask on BSC mainnet. Two saves prevented impact: 1. MetaMask's Blockaid integration flagged the BSC destination as "Malicious address" and greyed out Review alerts 2. The address slot is empty / scam-flagged on BSC But the underlying gap is real: write-action CTAs (BUY CHARM, Register & burn CL8Y, Claim DOUB, etc.) are not gated on chainId match. Filed as MEDIUM-HIGH severity because at TGE users will be juggling MegaETH + BSC + ETH mainnet to bridge, and a wrong-chain BUY CHARM click is a plausible everyday mistake. ### F-14.2 — RPC down: PASS Disconnected the SSH tunnel forwarding for port 8545 to simulate RPC unreachability. Hard-refreshed `/timecurve`. Frontend correctly degraded: - "TIME LEFT" panel showed "LOADING" badge + "Loading sale state..." copy + skeleton bar - "BUY CHARM" panel switched to "COMING SOON" badge + "The sale will open here when the timer hits zero" copy - Section header showed "LOADING" badge - BUY CHARM button was removed (not just disabled) - Wallet pill kept cached values (Chain 31337 + `0xf3...2266`) Safe degraded state. Users cannot interact with stale data. Polish nit (no explicit "RPC offline / retrying" copy to differentiate fresh-page-load from mid-session-disconnect) was noted but not severe enough to file. ### F-14.3 — Indexer down: finding filed (#96) Disconnected the SSH tunnel forwarding for port 3100 only (kept 8545 + 5173 alive). Frontend behavior: - Console: 155+ `net::ERR_CONNECTION_REFUSED` errors in ~10 seconds, all targeting `:3100/v1/timecurve/chain-timer`, `/buys`, etc., aggressive retry with no backoff - Page UI: NO visible change. The "Indexer v1.8.0 · latest indexed block N · live" status banner just disappeared. No "offline" badge, no "Reconnecting..." copy. - "Recent Buys" panel: showed "Waiting for the first buy of this round" — identical to legitimate empty state, indistinguishable from indexer-offline state - RPC-derived reads still worked (timer ticking, prices, balance, BUY CHARM button clickable) Real user-trust gap: a user with degraded indexer connectivity sees "Waiting for the first buy" and may think they're early when 100+ buys have actually happened (just can't fetch them). Filed as #96 MEDIUM with multiple resolution options (explicit offline banner, stale-data badges, exponential backoff, distinguish empty-vs-offline copy). ### F-14.4 — Wallet mismatch synthesis: PASS Switched MetaMask active account from deployer `0xf39Fd6...2266` to personal test wallet `0xc46b15...0650` mid-session. Frontend correctly: - Detected the MM `accountsChanged` event - Updated header pill from `0xf3...2266` to `0xc4...0650` - Reset "Your CL8Y balance" from `50000000` to `0` (personal wallet has 0 CL8Y on this fresh stack) - Showed transient "Loading live min - max..." + "Loading CHARM preview..." states while re-fetching No frozen old-wallet data, no stale balance display. PASS. ## F-15 — Accessibility: PARTIAL with 1 finding (#97); full audit deferred post-TGE ### F-15.1 — Keyboard focus visibility: finding filed (#97) Tabbed through the page from a focused position. Focus moves correctly through interactive elements (verified via `document.activeElement` polling in console — element changes on each Tab) but **no visible focus indicator** appears on any element. Click-to-focus works (focus styles applied on mouse interaction) but Tab-to-focus is silently invisible. **WCAG 2.4.7 (Focus Visible, Level AA) violation.** Filed as #97 with a one-rule CSS fix recommendation (`:focus-visible` rule on interactive selectors with appropriate outline + offset). ### F-15.2 — Full a11y audit deferred to post-TGE Semantic markup audit, ARIA label coverage, screen reader announcements, color contrast checks, and keyboard interaction patterns (Enter to submit, Escape to close modals, arrow keys on sliders, etc.) were not exhaustively walked this session due to time pressure on TGE day. The keyboard focus-visible finding (#97) is the most critical and is filed. The remaining a11y items are deferred to a dedicated post-TGE audit session. ## #38 closure summary 15 of 15 F-flow rows walked across the two-day session (yesterday + today): - F-01 through F-08: PASS (yesterday's partial1 note `note_3296...`) - F-09: PASS (yesterday's partial2 note posted today, `note_3301812521`) - F-10: GAP, filed as #92 (now CLOSED — dev shipped DoubPresaleVesting + /vesting route, verified today, see #92 close note) - F-11: PARTIAL PASS, spec drift filed as #91 (now CLOSED — dev fixed spec docs, verified today, see #91 close note) - F-12: PASS - F-13: PASS with 1 finding (#93) - F-14: 2 PASS + 2 findings (#95, #96) - F-15: PARTIAL with 1 finding (#97), full audit deferred post-TGE Issues filed during #38 walkthrough: - Closed same week: #90 (post-end UI polish), #91 (spec drift), #92 (vesting deploy + UI), #38 (this issue) - Open: #93 (mobile fee sinks truncation), #95 (wrong-chain submit gate), #96 (indexer offline UX), #97 (focus-visible) - Other deferred follow-ups noted in earlier sessions: #89 (WC mobile) Closing #38. The full F-flow checklist is exercised, every gap that surfaced is now either fixed (and verified) or filed with severity + suggested resolution. cc @PlasticDigits
Brouie (Migrated from gitlab.com) closed this issue 2026-04-30 04:21:09 +00:00
PlasticDigits commented 2026-05-03 13:03:43 +00:00 (Migrated from gitlab.com)

mentioned in issue #115

mentioned in issue #115
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#38
No description provided.