Skip to content

Fix the remaining UI/UX audit findings across Zoltar, Statoblast, Trading, and augurScan - #1165

Open
KillariDev wants to merge 1 commit into
mainfrom
t3code/comprehensive-ui-ux-audit-1
Open

KillariDev wants to merge 1 commit into
mainfrom
t3code/comprehensive-ui-ux-audit-1

Conversation

@KillariDev

Copy link
Copy Markdown
Collaborator

A UI/UX audit of Zoltar, Statoblast, Trading, the shared UI, and the augurScan explorer reported 93 findings. #1154 and #1162 already fixed three of them, and one was invalid. This change fixes the rest. Where the full fix needs a design decision, it lands the safest part and lists what remains. Several High findings could send transactions that were certain to revert or misstate funds; those are fixed with failing-first regression tests.

Statoblast

  • A blank initial report price no longer submits the stale cached oracle price. Commitment and withdrawal coverage checks now run at the price that will actually be proposed, so a batch no longer pays the oracle bounty and then reverts.
  • Claimable fees read the checkpointed amount that redeemFees pays: updateVaultFees and securityVaults go into one Multicall3 aggregate3. Before, a passive vault showed 0 and "Claim fees" stayed disabled.
  • Pool creation targets the active universe instead of genesis, which has always forked once a child universe exists.
  • Reporting from vault REP offers only what depositToEscalationGame accepts: coverage plus the minimum remaining deposit.
  • "Migrate pool" and "Claim parent deposits" are disabled once the migration window closes.
  • Vaults beyond the 50-vault preview can be liquidated: the target loads on demand, with retry. The liquidation amount resets per target, and approval and receiver data are invalidated after a liquidation.
  • Truth-auction bid estimates and totals use previewFinalization(), so they match what finalization pays.
  • Browse pools discovers pools from the factory and loads the first page on entry, so a new user no longer needs a pool address.
  • Vault operations show their prerequisites inline before Review, each as its own one-transaction button: REP approval, ETH→WETH wrap, and WETH/REP report approvals. The reporting approval uses TokenApprovalControl. Disputes get a Wrap ETH step.
  • Unreachable vault-action code is deleted, including a Claim fees path that sent two transactions from one click. ui/AGENTS.md now points at the live "Funding and approvals" flow.

Zoltar

  • A partially migrated scalar fork is no longer reported as fully migrated, and the tick picker stays reachable.
  • Question creation rejects a Yes/No categorical question (it would get the Binary question's ID), an outcome named Invalid, case-insensitive duplicates, and a question that already exists. It offers the existing question instead.
  • "Use for fork" stays visible but is disabled, with a reason, until the question ends. Creating another question no longer replaces the chosen fork question, and the choice persists in the URL.
  • The fork page shows the REP credited to the migration balance, and success reads "Universe forked". "Migrate REP" is its own persistent button.
  • Create-question layout fixes, typed-order preview, time-zone hint offset, mobile migration step status, and "Wallet REP" wording.

Trading

  • A sale never signs more shares than entered. The router pulls maxLongSharesIn, which was sized as the entered amount plus slippage. The ticket now shows a "Maximum sold" row.
  • Capacity and price-impact blocks state the largest accepted amount, and the shortcuts respect both limits.
  • The ticket and liquidity panel wait for post-receipt balances. An unknown ETH balance blocks instead of skipping the funds check.
  • Markets load from the registry with paging. Prices read "Price if not Invalid", resolved markets show their outcome, remove-liquidity and complete-set Max are exact, and liquidity keeps ETH back for gas.

augurScan

  • Live refreshes skip unchanged renders and preserve filter input, open details, and focus.
  • A deep-linked log is revealed and pinned above the feed, and has a close control.
  • History restores rich-list sort and view. Network changes drop old block numbers. CSV export has raw values.
  • The activity feed has field labels, and its layout no longer scrolls sideways between 601 and 1180 px. Selects need an explicit Show or Switch, live regions are calmer, and units and timestamps are consistent.

Shared

  • The app chrome is a <header> landmark and only route content is in <main>. The static loading placeholder and the startup error notice share the app frame, so neither leaves "Loading…" behind.
  • Focus rings use the full accent colour. Disabled pagination and Connect controls keep focus.
  • With no browser wallet, Connect is disabled and wallet-blocked actions say "No browser wallet found…". A wallet injected after load is detected and subscribed.
  • HTTP 408/429/5xx RPC errors read as plain language.

Screenshots

Headless Chromium against the walletless simulation, at the exact viewport noted.

Pool discovery (security-pool, 1440×900) Funding and approvals before Review (1440×900)
Vault health chip (1440×900) "Use for fork" disabled with its reason (800 wide, docs crop)
Existing question detected (1440×900) Fork page with migration credit (1440×900)
Deploy route, baseline scenario (1100×900) Markets from the registry (trading-funded, 1440×900)
Sell ticket with Maximum sold (docs crop) Limit reason states the accepted amount (1440×900)
augurScan activity, no sideways scroll (900×900) augurScan pinned log with Close (1440×900)
Zoltar migration step status (390×844) Statoblast vault operations (390×844)

The tutorial screenshots for all three apps are recaptured, and the pages that quote changed labels are updated.

Not done, or done differently

  • auction integration #60: the "gwei" unit was not adopted, because check-unit-terminology forbids wei/gwei; the unit stays "nanoETH per gas". The create-pool fee now shows two decimals.
  • use zoltars fork time right away for security pools, move variables around and make some immutable #19 (Zoltar sub-navigation placement): reverted. Putting the Deploy tab beside the four view tabs overflowed the header, so this needs an overflow design.
  • Deferred remainders:
    • the Trading security-pool list is still favorites-only;
    • no repo-wide ActionAvailability type change;
    • Trading's own wallet-error presentation;
    • focus when "Show more" disappears after the last page;
    • a question picker on the fork page;
    • the migration balance after forking;
    • keeping stale vault data visible during reloads;
    • mobile tab stacking in vault operations;
    • raw OpenOracle round amounts in augurScan (token decimals are unknown in the browser).

Validation

  • bun run ui:build:apps, bun run tsc, bun run format:check, bun run knip, bun run check:changed, bun run check:repository:current, bun run docs:check, bun run check:static, git diff --check: pass.
  • bun run check passes except test:preflight's tooling/repo/project-registry.integration.test.ts. That test requires the pinned Bun 1.4.2, and the local machine has 1.4.3; the other preflight tests pass when run on their own.
  • UI suites (ui/coreShared, ui/zoltar, ui/statoblast, ui/trading): 4015 pass, 0 fail, including the Anvil integration tests.
  • augurScan unit and browser tests: 0 fail. The opt-in Chromium suites were also run against a demo server.
  • Tooling, bot dashboard, and Solidity trading integration tests: pass.
  • bun run test:browser:smoke: pass. test:browser:workflow: 6/6 pass. Its helpers now approve inline before Review and read the shared approval control's label.
  • bun run docs:screenshots for all apps: freshness check clean, search index rebuilt.
  • Browser QA in headless Chromium at 1440×900 and 390×844 (augurScan also at 900×900), using the deployed, baseline, security-pool, ended-pool-commitment, and trading-funded scenarios plus the augurScan demo. No console or runtime errors. QA found two regressions this change had introduced, both now fixed with tests:
    • a "Loading…" placeholder left visible;
    • the vault card disappearing after a direct commitment reduction, because reads paused mid-reload.
  • Reviews:
    • documentation reviewer: 42 → 88, remaining Lows fixed;
    • visual reviewer: 64 → 82 → 86, all Medium and Low findings fixed;
    • final code reviewer: 66 → 84 → 86. All Medium findings and the remaining Lows are fixed, except one declined Low that assumed viem multicall batching, which the repo's client does not use.
  • Current with main.

…ding, and augurScan

A UI/UX audit of the three apps, their shared UI, and the augurScan explorer
reported 93 findings; #1154 and #1162 already fixed 3 of them and one was
invalid. This fixes the rest, or the safest part of a finding where the full
change needs a design decision.

Statoblast: a blank initial report price no longer submits the stale cached
price, and commitment and withdrawal checks run at the price that will be
proposed. Claimable fees read the checkpointed amount that redeemFees pays.
Pool creation targets the active universe. Reporting from vault REP offers
only what the contract accepts. Migration actions close with the migration
window, vaults beyond the 50-vault preview can be liquidated, and truth-auction
estimates and totals use previewFinalization. Browse pools discovers pools
from the factory. Vault approvals and WETH wrapping appear inline before
Review, the reporting approval uses TokenApprovalControl, and disputes get a
Wrap ETH step. Unreachable vault-action code is deleted.

Zoltar: a partial scalar migration is no longer reported as complete. Question
creation rejects Yes/No categorical outcomes, Invalid, case-insensitive
duplicates, and existing questions. Use for fork stays disabled until a
question ends, and the choice persists in the URL. The fork page shows the REP
credited to the migration balance. Migrate REP is its own persistent button.

Trading: a sale never signs more shares than entered, and the ticket shows the
maximum sold. Capacity and price-impact limits state the largest accepted
amount. The ticket and liquidity panel wait for post-receipt balances. Markets
load from the registry, prices say they are conditional on a valid
resolution, resolved markets show their outcome, Max is exact, and liquidity
keeps ETH for gas.

augurScan: live refreshes preserve filters, open details, and focus.
Deep-linked logs are revealed, pinned, and closable. History restores rich
list state, network changes drop block numbers, and CSV exports raw values.
The activity feed is labelled and no longer scrolls sideways at medium widths.

Shared: the app chrome is a header landmark, and the loading placeholder and
startup error share the app frame. Focus rings are stronger. Disabled controls
keep focus and give reasons, a missing wallet is explained instead of offering
an impossible connect, and RPC errors read as plain language.

The tutorials, screenshots, screenshot specs, and browser workflow helpers
follow the new labels and inline approval flow.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant