Pre-launch: No risk disclaimers, NFA copy, or first-visit acknowledgement modal for mainnet deployment #138

Closed
opened 2026-05-06 15:40:32 +00:00 by totdking · 38 comments
totdking commented 2026-05-06 15:40:32 +00:00 (Migrated from gitlab.com)

Issue Summary

The app currently has no "not financial advice" disclaimer, no risk warning copy, and no first-visit acknowledgement modal anywhere in the codebase. On localnet this is not a problem the LOCAL badge makes the environment clear and no real funds are involved. However, when deployed to mainnet the LOCAL badge will not be present, and there will be no risk surfacing of any kind for real users trading real assets.


Reproduction Steps

  1. Open the app at http://127.0.0.1:3000 in a fresh browser profile (no wallet connected)
  2. Navigate through all routes: /swap, /trade, /limits, /pool, /charts
  3. Check header, footer, modals, and any first-load overlays for disclaimer or risk copy
  4. Connect a wallet — observe whether a risk acknowledgement modal appears
  5. Check all pages again post-connect

Expected Behavior

At minimum, the app should surface:

  • A persistent environment indicator distinguishing local / testnet / mainnet (the LOCAL badge partially covers this but is easy to miss)
  • A "not financial advice" or risk disclaimer, either in a footer, a first-visit modal, or a settings page
  • A first-visit acknowledgement for new users confirming they understand the risks of a DEX

Actual Behavior

  • No NFA copy found on any route
  • No risk warning or beta disclaimer found anywhere in the UI
  • No first-visit acknowledgement modal appears on fresh load or wallet connect
  • The LOCAL badge in the header is the only environment indicator — no equivalent warning exists for testnet or mainnet deployments where it would be absent

Environment Details

Field Value
OS macOS (Apple M1 Pro, 14-inch)
Browser Google Chrome (desktop)
Viewport 1470×864
Network localterra (local Docker)
Frontend VITE_NETWORK=local npm run dev

Wallet / Device Details

  • Wallet: Keplr browser extension
  • Wallet state: Tested both disconnected and connected

Severity / Impact

Pre-launch requirement. Not a bug on localnet the LOCAL badge is sufficient there. On mainnet, the absence of any NFA disclaimer, risk warning, or first-visit acknowledgement is a standard gap that needs to be filled before public launch. Found under W1-C3 in #116 (Legal / risk surfacing).

### Issue Summary The app currently has no "not financial advice" disclaimer, no risk warning copy, and no first-visit acknowledgement modal anywhere in the codebase. On localnet this is not a problem the `LOCAL` badge makes the environment clear and no real funds are involved. However, when deployed to mainnet the `LOCAL` badge will not be present, and there will be no risk surfacing of any kind for real users trading real assets. --- ### Reproduction Steps 1. Open the app at `http://127.0.0.1:3000` in a fresh browser profile (no wallet connected) 2. Navigate through all routes: `/swap`, `/trade`, `/limits`, `/pool`, `/charts` 3. Check header, footer, modals, and any first-load overlays for disclaimer or risk copy 4. Connect a wallet — observe whether a risk acknowledgement modal appears 5. Check all pages again post-connect --- ### Expected Behavior At minimum, the app should surface: - A persistent environment indicator distinguishing local / testnet / mainnet (the `LOCAL` badge partially covers this but is easy to miss) - A "not financial advice" or risk disclaimer, either in a footer, a first-visit modal, or a settings page - A first-visit acknowledgement for new users confirming they understand the risks of a DEX --- ### Actual Behavior - No NFA copy found on any route - No risk warning or beta disclaimer found anywhere in the UI - No first-visit acknowledgement modal appears on fresh load or wallet connect - The `LOCAL` badge in the header is the only environment indicator — no equivalent warning exists for testnet or mainnet deployments where it would be absent --- ### Environment Details | Field | Value | |-------|-------| | OS | macOS (Apple M1 Pro, 14-inch) | | Browser | Google Chrome (desktop) | | Viewport | 1470×864 | | Network | `localterra` (local Docker) | | Frontend | `VITE_NETWORK=local npm run dev` | --- ### Wallet / Device Details - **Wallet:** Keplr browser extension - **Wallet state:** Tested both disconnected and connected --- ### Severity / Impact **Pre-launch requirement.** Not a bug on localnet the `LOCAL` badge is sufficient there. On mainnet, the absence of any NFA disclaimer, risk warning, or first-visit acknowledgement is a standard gap that needs to be filled before public launch. Found under W1-C3 in #116 (Legal / risk surfacing).
totdking commented 2026-05-06 15:45:27 +00:00 (Migrated from gitlab.com)

changed title from No risk disclaimers, NFA copy, or first-visit acknowledgement LOCAL badge is the only environment indicator to Pre-launch: No risk disclaimers, NFA copy, or first-visit acknowledgement modal for mainnet deployment

<p>changed title from <code class="idiff">No risk disclaimers, NFA copy, or first-visit acknowledgement <span class="idiff left right deletion">LOCAL badge is the only environment indicator</span></code> to <code class="idiff"><span class="idiff left addition">Pre-launch: </span>No risk disclaimers, NFA copy, or first-visit acknowledgement <span class="idiff right addition">modal for mainnet deployment</span></code></p>
totdking commented 2026-05-06 15:45:27 +00:00 (Migrated from gitlab.com)

changed the description

changed the description
totdking commented 2026-05-06 16:19:15 +00:00 (Migrated from gitlab.com)

mentioned in issue #116

mentioned in issue #116
PlasticDigits commented 2026-05-09 10:14:39 +00:00 (Migrated from gitlab.com)

mentioned in commit e94479aae4

mentioned in commit e94479aae497b2fddda47375d915fdda33ab15fb
PlasticDigits commented 2026-05-09 10:15:24 +00:00 (Migrated from gitlab.com)

Update (GitLab #138 — risk surfacing)

Implemented and merged to main (e94479a).

What changed

  • First-visit blocking modal (RiskAcknowledgementModal): NFA + risk bullets, checkbox + Continue only; no backdrop/Escape/header close dismiss. Persisted via localStorage + RISK_ACK_VERSION in riskAcknowledgement.ts.
  • Environment ribbon under the sticky header (EnvironmentRibbon + app-top-sticky): shows Local / Testnet / Mainnet with chain id and context copy on every route.
  • Footer NFA (LegalFooterNotice): desktop footer + mobile-only strip when the footer shell is hidden (max-width: 767px).
  • Modal dismissible + optional panelClassName; Playwright sets VITE_PLAYWRIGHT_E2E=true on webServer so E2E is not blocked (documented in docs/frontend.md + skills/AGENTS_FRONTEND_RISK_DISCLAIMERS.md).
  • gitleaks allowlist for the localStorage key string (false positive generic-api-key).

Verification checklist

  • Fresh profile / cleared localStorage key cl8y-dex-risk-ack: modal appears, cannot dismiss without checkbox + Continue.
  • After ack: reload — modal does not return until RISK_ACK_VERSION is bumped or key removed.
  • VITE_NETWORK=local / testnet / mainnet: ribbon + badge match expected chain labels.
  • Desktop: NFA in footer; narrow viewport: NFA in strip above bottom nav, footer hidden as before.
  • npm run test:unit in frontend-dapp; Playwright navigation spec includes GL-138 strip + NFA assertion.

@totdking please verify on a real build (without VITE_PLAYWRIGHT_E2E) and confirm copy meets legal/pre-launch expectations. Leaving the issue open as requested.

## Update (GitLab #138 — risk surfacing) Implemented and merged to `main` ([e94479a](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/commit/e94479a)). ### What changed - **First-visit blocking modal** (`RiskAcknowledgementModal`): NFA + risk bullets, checkbox + **Continue** only; no backdrop/Escape/header close dismiss. Persisted via `localStorage` + `RISK_ACK_VERSION` in `riskAcknowledgement.ts`. - **Environment ribbon** under the sticky header (`EnvironmentRibbon` + `app-top-sticky`): shows Local / Testnet / Mainnet with chain id and context copy on every route. - **Footer NFA** (`LegalFooterNotice`): desktop footer + mobile-only strip when the footer shell is hidden (`max-width: 767px`). - **Modal** `dismissible` + optional `panelClassName`; **Playwright** sets `VITE_PLAYWRIGHT_E2E=true` on `webServer` so E2E is not blocked (documented in `docs/frontend.md` + `skills/AGENTS_FRONTEND_RISK_DISCLAIMERS.md`). - **gitleaks** allowlist for the `localStorage` key string (false positive generic-api-key). ### Verification checklist - [ ] Fresh profile / cleared `localStorage` key `cl8y-dex-risk-ack`: modal appears, cannot dismiss without checkbox + Continue. - [ ] After ack: reload — modal does not return until `RISK_ACK_VERSION` is bumped or key removed. - [ ] `VITE_NETWORK=local` / `testnet` / `mainnet`: ribbon + badge match expected chain labels. - [ ] Desktop: NFA in footer; narrow viewport: NFA in strip above bottom nav, footer hidden as before. - [ ] `npm run test:unit` in `frontend-dapp`; Playwright navigation spec includes GL-138 strip + NFA assertion. @totdking please verify on a real build (without `VITE_PLAYWRIGHT_E2E`) and confirm copy meets legal/pre-launch expectations. Leaving the issue **open** as requested.
totdking commented 2026-05-22 15:13:15 +00:00 (Migrated from gitlab.com)

Verification checklist

  • Fresh profile / cleared localStorage key cl8y-dex-risk-ack: modal appears, cannot dismiss without checkbox + Continue.
  • After ack: reload — modal does not return until RISK_ACK_VERSION is bumped or key removed.
  • VITE_NETWORK=local / testnet / mainnet: ribbon + badge match expected chain labels.
  • Desktop: NFA in footer; narrow viewport: NFA in strip above bottom nav, footer hidden as before.
  • npm run test:unit in frontend-dapp; Playwright navigation spec includes GL-138 strip + NFA assertion.

Issue noticed

The NFA disclaimer in the footer (CL8Y DEX is experimental software. Nothing here is financial…) sometimes does not appear after navigating between routes. Waiting ~12 seconds causes it to appear without a page reload.

Steps to reproduce

  1. Load the app and navigate between routes (e.g. /swap → /trade → /tiers)
  2. Observe the footer — NFA copy may be absent on arrival
  3. Wait ~12 seconds — copy then appears

Expected: NFA footer copy is visible immediately on all routes

Actual: NFA copy is intermittently missing after route changes, then appears after a delay

Root cause (suspected) Layout resets routeContentReady to false and re-registers the ROUTE_CONTENT_READY_EVENT listener on every pathname change. React runs child effects before parent effects, so RouteContentReadyMarker (child) can dispatch the event before Layout (parent) has re-attached its listener — the event is missed and the 12-second failsafe governs visibility instead.

Affected routes: I saw it on a few tabs like the /tiers, /trade ; But assumption is all pages are affected

cc: @PlasticDigits

### Verification checklist * [x] Fresh profile / cleared `localStorage` key `cl8y-dex-risk-ack`: modal appears, cannot dismiss without checkbox + Continue. * [x] After ack: reload — modal does not return until `RISK_ACK_VERSION` is bumped or key removed. * [x] `VITE_NETWORK=local` / `testnet` / `mainnet`: ribbon + badge match expected chain labels. * [x] Desktop: NFA in footer; narrow viewport: NFA in strip above bottom nav, footer hidden as before. * [x] `npm run test:unit` in `frontend-dapp`; Playwright navigation spec includes GL-138 strip + NFA assertion. ## Issue noticed The NFA disclaimer in the footer (`CL8Y DEX is experimental software. Nothing here is financial…`) sometimes does not appear after navigating between routes. Waiting \~12 seconds causes it to appear without a page reload. **Steps to reproduce** 1. Load the app and navigate between routes (e.g. `/swap` → `/trade` → `/tiers`) 2. Observe the footer — NFA copy may be absent on arrival 3. Wait \~12 seconds — copy then appears **Expected:** NFA footer copy is visible immediately on all routes **Actual:** NFA copy is intermittently missing after route changes, then appears after a delay **Root cause (suspected)** `Layout` resets `routeContentReady` to `false` and re-registers the `ROUTE_CONTENT_READY_EVENT` listener on every pathname change. React runs child effects before parent effects, so `RouteContentReadyMarker` (child) can dispatch the event before `Layout` (parent) has re-attached its listener — the event is missed and the 12-second failsafe governs visibility instead. **Affected routes:** I saw it on a few tabs like the /tiers, /trade ; But assumption is all pages are affected cc: @PlasticDigits
PlasticDigits commented 2026-05-25 02:09:29 +00:00 (Migrated from gitlab.com)

mentioned in commit cec7707b22

mentioned in commit cec7707b22f858c7d99d83b9613f28852a598416
PlasticDigits commented 2026-05-25 02:10:06 +00:00 (Migrated from gitlab.com)

Merged to main in cec7707 (on top of current main after #134 merge).

Root cause

Layout listened for ROUTE_CONTENT_READY_EVENT in a useEffect that re-ran on every pathname change. React runs child effects before parent effects, so RouteContentReadyMarker could dispatch the ready event before Layout re-attached its listener — the signal was dropped and the 12s failsafe alone made NFA copy appear.

What changed

  • Replaced the window custom event with RouteContentReadyProvider + pathname-scoped readyForPath state (frontend-dapp/src/contexts/RouteContentReadyContext.tsx).
  • Synchronously clear readyForPath when pathname changes so stale paths never satisfy the next route.
  • RouteContentReadyMarker calls useMarkRouteContentReady() via context after lazy content mounts (LCP deferral for #179 unchanged; 12s failsafe kept).
  • Docs: docs/frontend.md § Risk surfacing — new NFA footer on navigation invariant; trade LCP section cross-linked.
  • Agent playbooks: skills/AGENTS_FRONTEND_RISK_DISCLAIMERS.md, skills/AGENTS_FRONTEND_TRADE_INITIAL_LOAD.md.
  • Regression: unit RouteContentReadyContext.test.tsx; E2E “NFA footer copy promptly after route changes” in navigation.spec.ts.

Verification checklist

  • Desktop: navigate / → Pool → Fee Tiers → Trade; NFA footer (“Nothing here is financial…”) visible within ~3s on each route (not ~12s).
  • Mobile width (<768px): NFA in .app-mobile-legal-strip above bottom nav.
  • Hard reload /trade: workspace skeleton first; legal footer deferred until route mounts (#179).
  • cd frontend-dapp && npm run test:unit — all pass.
  • npx playwright test e2e/navigation.spec.ts -g "NFA footer" (LocalTerra + .env.local).

@brouie please verify on a real build (without VITE_PLAYWRIGHT_E2E) and confirm NFA is stable across tabs. Leaving the issue open until signed off.

## Fix: intermittent NFA footer after route changes (GitLab #138) Merged to `main` in **cec7707** (on top of current `main` after #134 merge). ### Root cause `Layout` listened for `ROUTE_CONTENT_READY_EVENT` in a `useEffect` that re-ran on every `pathname` change. React runs **child** effects before **parent** effects, so `RouteContentReadyMarker` could dispatch the ready event before `Layout` re-attached its listener — the signal was dropped and the **12s failsafe** alone made NFA copy appear. ### What changed - Replaced the `window` custom event with **`RouteContentReadyProvider`** + pathname-scoped `readyForPath` state (`frontend-dapp/src/contexts/RouteContentReadyContext.tsx`). - **Synchronously clear** `readyForPath` when `pathname` changes so stale paths never satisfy the next route. - `RouteContentReadyMarker` calls `useMarkRouteContentReady()` via context after lazy content mounts (LCP deferral for #179 unchanged; 12s failsafe kept). - Docs: `docs/frontend.md` § Risk surfacing — new **NFA footer on navigation** invariant; trade LCP section cross-linked. - Agent playbooks: `skills/AGENTS_FRONTEND_RISK_DISCLAIMERS.md`, `skills/AGENTS_FRONTEND_TRADE_INITIAL_LOAD.md`. - Regression: unit `RouteContentReadyContext.test.tsx`; E2E “NFA footer copy promptly after route changes” in `navigation.spec.ts`. ### Verification checklist - [ ] Desktop: navigate `/` → Pool → Fee Tiers → Trade; NFA footer (“Nothing here is financial…”) visible **within ~3s** on each route (not ~12s). - [ ] Mobile width (<768px): NFA in `.app-mobile-legal-strip` above bottom nav. - [ ] Hard reload `/trade`: workspace skeleton first; legal footer deferred until route mounts (#179). - [ ] `cd frontend-dapp && npm run test:unit` — all pass. - [ ] `npx playwright test e2e/navigation.spec.ts -g "NFA footer"` (LocalTerra + `.env.local`). @brouie please verify on a real build (without `VITE_PLAYWRIGHT_E2E`) and confirm NFA is stable across tabs. Leaving the issue **open** until signed off.
PlasticDigits commented 2026-05-25 02:26:30 +00:00 (Migrated from gitlab.com)

mentioned in issue #182

mentioned in issue #182
totdking commented 2026-05-26 11:56:16 +00:00 (Migrated from gitlab.com)

Verification checklist

  • Desktop: navigate / → Pool → Fee Tiers → Trade; NFA footer (“Nothing here is financial…”) visible within ~3s on each route (not ~12s).
  • Mobile width (<768px): NFA in .app-mobile-legal-strip above bottom nav.
  • Hard reload /trade: workspace skeleton first; legal footer deferred until route mounts (#179).
  • cd frontend-dapp && npm run test:unit — all pass.
  • npx playwright test e2e/navigation.spec.ts -g "NFA footer" (LocalTerra + .env.local).

Issues noticed

  • Checklist 4:

    File: src/services/terraclassic/__tests__/cosmesPatch127.test.ts Test: KeplrExtension passes per-sign preferNoSetFee and post-sign fee guard

    Summary The cosmes patch integrity check is failing because the test references symbol names that were renamed in a subsequent patch update but the test assertions were never updated to match.

    Why it fails The patch was refactored after the test was written. Three assertions now reference symbols that no longer exist in the patched file:

    Assertion Status Reason
    EXTENSION_SIGNED_FEE_MIN_PERCENT FAIL Removed — replaced with inline / 2n calculation
    gasFromAminoFee FAIL Renamed to ulunaFromAminoFee
    gasFromDirectSignedAuthInfoBytes FAIL Renamed to ulunaFromDirectSignedAuthInfoBytes

    Recommended Fix Update the three failing assertions in cosmesPatch127.test.ts to use the current symbol names and remove the EXTENSION_SIGNED_FEE_MIN_PERCENT assertion.

  • Checklist 5 fails:

    e2e-seed-hybrid-book.sh crashes with jq type error when order book already has a head order

    File: scripts/e2e-seed-hybrid-book.sh

    Summary The seed script fails when the hybrid order book contract returns the head order ID as a bare number ({"data": 13}). The script assumes the decoded payload is always an object with a head_order_id field and pipes the raw number into .head_order_id, which jq cannot handle.

    Steps to reproduce

    1. Start LocalTerra with a deployed DEX (make start && make deploy-local)
    2. Run the seed script once successfully so the order book has a resting bid
    3. Run the script again: bash scripts/e2e-seed-hybrid-book.sh
    4. Observe the crash

    Expected behaviour Script detects the existing head order, prints "bid book already has head order X on <pair> — skipping" and exits cleanly with code 0

    Actual behaviour

    jq: error (at <stdin>:1): Cannot index number with string "head_order_id" Error: Command failed: bash scripts/e2e-seed-hybrid-book.sh

    Root cause decode_smart_payload correctly unwraps {"data": 13} to 13, but the caller pipes that bare number into jq -r '.head_order_id // empty'. The contract returns the head order ID as a plain number, not as {"head_order_id": 13}.

    Affected line

    HEAD_ID="$(decode_smart_payload "$RAW_HEAD" | jq -r '.head_order_id // empty')"

    Impact Blocks all Playwright E2E tests — the global setup crashes before any test runs

    cc: @PlasticDigits

### Verification checklist * [x] Desktop: navigate `/` → Pool → Fee Tiers → Trade; NFA footer (“Nothing here is financial…”) visible **within \~3s** on each route (not \~12s). * [x] Mobile width (\<768px): NFA in `.app-mobile-legal-strip` above bottom nav. * [x] Hard reload `/trade`: workspace skeleton first; legal footer deferred until route mounts (#179). * [ ] `cd frontend-dapp && npm run test:unit` — all pass. * [ ] `npx playwright test e2e/navigation.spec.ts -g "NFA footer"` (LocalTerra + `.env.local`). ## Issues noticed * **Checklist 4:** **File:** `src/services/terraclassic/__tests__/cosmesPatch127.test.ts` **Test:** `KeplrExtension passes per-sign preferNoSetFee and post-sign fee guard` **Summary** The cosmes patch integrity check is failing because the test references symbol names that were renamed in a subsequent patch update but the test assertions were never updated to match. **Why it fails** The patch was refactored after the test was written. Three assertions now reference symbols that no longer exist in the patched file: | Assertion | Status | Reason | |-----------|--------|--------| | `EXTENSION_SIGNED_FEE_MIN_PERCENT` | FAIL | Removed — replaced with inline `/ 2n` calculation | | `gasFromAminoFee` | FAIL | Renamed to `ulunaFromAminoFee` | | `gasFromDirectSignedAuthInfoBytes` | FAIL | Renamed to `ulunaFromDirectSignedAuthInfoBytes` | **Recommended Fix** Update the three failing assertions in `cosmesPatch127.test.ts` to use the current symbol names and remove the `EXTENSION_SIGNED_FEE_MIN_PERCENT` assertion. * **Checklist 5 fails:** `e2e-seed-hybrid-book.sh` crashes with `jq` type error when order book already has a head order **File:** `scripts/e2e-seed-hybrid-book.sh` **Summary** The seed script fails when the hybrid order book contract returns the head order ID as a bare number (`{"data": 13}`). The script assumes the decoded payload is always an object with a `head_order_id` field and pipes the raw number into `.head_order_id`, which `jq` cannot handle. **Steps to reproduce** 1. Start LocalTerra with a deployed DEX (`make start && make deploy-local`) 2. Run the seed script once successfully so the order book has a resting bid 3. Run the script again: `bash scripts/e2e-seed-hybrid-book.sh` 4. Observe the crash **Expected behaviour** Script detects the existing head order, prints `"bid book already has head order X on <pair> — skipping"` and exits cleanly with code `0` **Actual behaviour** `jq: error (at <stdin>:1): Cannot index number with string "head_order_id" Error: Command failed: bash scripts/e2e-seed-hybrid-book.sh ` **Root cause** `decode_smart_payload` correctly unwraps `{"data": 13}` to `13`, but the caller pipes that bare number into `jq -r '.head_order_id // empty'`. The contract returns the head order ID as a plain number, not as `{"head_order_id": 13}`. **Affected line** `HEAD_ID="$(decode_smart_payload "$RAW_HEAD" | jq -r '.head_order_id // empty')"` **Impact** Blocks all Playwright E2E tests — the global setup crashes before any test runs cc: @PlasticDigits
PlasticDigits commented 2026-05-26 12:47:26 +00:00 (Migrated from gitlab.com)

mentioned in commit bd763beafa

mentioned in commit bd763beafac444ce08c607842f6247607e177ab3
PlasticDigits commented 2026-05-26 12:47:32 +00:00 (Migrated from gitlab.com)

Fix: GL-138 verification blockers (cosmes patch test + hybrid seed idempotency)

Merged to main in bd763be.

What changed

1. cosmesPatch127.test.ts — patch integrity assertions

  • Removed stale EXTENSION_SIGNED_FEE_MIN_PERCENT, gasFromAminoFee, and gasFromDirectSignedAuthInfoBytes string checks that no longer match the patched KeplrExtension.js surface.
  • Assert meetsMinSignedRatio, ulunaFromAminoFee, and ulunaFromDirectSignedAuthInfoBytes instead (still guards post-sign fee validation after npm ci / patch-package).

2. scripts/e2e-seed-hybrid-book.sh — idempotent re-run

  • Pair OrderBookHead returns a bare u64 on LCD ({"data":13}), not { "head_order_id": 13 }.
  • Added order_book_head_id_from_payload so an existing head order is detected and the script exits 0 with the skip message instead of crashing jq.

Docs / agent playbooks: docs/testing.md (E2E invariant), skills/AGENTS_E2E_HYBRID_SWAP.md, skills/AGENTS_TERRACLASSIC_GAS.md, skills/AGENTS_FRONTEND_RISK_DISCLAIMERS.md cross-linked to this fix.

Verification checklist

  • cd frontend-dapp && npm ci && npm run test:unit — all pass, including cosmesPatch127.test.ts.
  • With LocalTerra + deployed DEX: run bash scripts/e2e-seed-hybrid-book.sh twice; second run prints bid book already has head order … — skipping and exits 0.
  • Playwright global setup completes: npx playwright test e2e/navigation.spec.ts -g "NFA footer" (LocalTerra + .env.local).
  • Full strict E2E path: make test-e2e or hybrid swap spec with chain up.

@brouie please verify the unit test and hybrid seed re-run on your machine. Leaving the issue open until signed off.

## Fix: GL-138 verification blockers (cosmes patch test + hybrid seed idempotency) Merged to `main` in **bd763be**. ### What changed **1. `cosmesPatch127.test.ts` — patch integrity assertions** - Removed stale `EXTENSION_SIGNED_FEE_MIN_PERCENT`, `gasFromAminoFee`, and `gasFromDirectSignedAuthInfoBytes` string checks that no longer match the patched `KeplrExtension.js` surface. - Assert `meetsMinSignedRatio`, `ulunaFromAminoFee`, and `ulunaFromDirectSignedAuthInfoBytes` instead (still guards post-sign fee validation after `npm ci` / patch-package). **2. `scripts/e2e-seed-hybrid-book.sh` — idempotent re-run** - Pair `OrderBookHead` returns a bare **`u64`** on LCD (`{"data":13}`), not `{ "head_order_id": 13 }`. - Added `order_book_head_id_from_payload` so an existing head order is detected and the script exits **0** with the skip message instead of crashing `jq`. **Docs / agent playbooks:** `docs/testing.md` (E2E invariant), `skills/AGENTS_E2E_HYBRID_SWAP.md`, `skills/AGENTS_TERRACLASSIC_GAS.md`, `skills/AGENTS_FRONTEND_RISK_DISCLAIMERS.md` cross-linked to this fix. ### Verification checklist - [ ] `cd frontend-dapp && npm ci && npm run test:unit` — all pass, including `cosmesPatch127.test.ts`. - [ ] With LocalTerra + deployed DEX: run `bash scripts/e2e-seed-hybrid-book.sh` twice; second run prints `bid book already has head order … — skipping` and exits **0**. - [ ] Playwright global setup completes: `npx playwright test e2e/navigation.spec.ts -g "NFA footer"` (LocalTerra + `.env.local`). - [ ] Full strict E2E path: `make test-e2e` or hybrid swap spec with chain up. @brouie please verify the unit test and hybrid seed re-run on your machine. Leaving the issue **open** until signed off.
totdking commented 2026-05-26 13:02:39 +00:00 (Migrated from gitlab.com)

mentioned in issue #139

mentioned in issue #139
PlasticDigits commented 2026-05-26 14:05:20 +00:00 (Migrated from gitlab.com)

Fix: shell tab nav — lazy page stuck after Pool click (GitLab #138 verification)

Merged to main in f58cce5 (follows bd763be cosmes/seed fixes).

Root cause

After #182/AppShellNavLink, the URL and active nav updated on tab click, but <Outlet> could keep the prior lazy route mounted (Swap UI visible on /pool). GL-138 E2E “NFA footer promptly after route changes” and “navigates to Pool page” failed because assertions waited for Pool/Trade headings that never appeared.

What changed

  • Layout.tsx: <Outlet key={location.pathname} /> remounts matched lazy routes on every tab change.
  • AppShellNavLink.tsx: Link + useMatch for active styling; skip redundant navigate() when already on target path.
  • Docs/skills: docs/frontend.md (NFA-on-nav + client-side tab invariants), skills/AGENTS_FRONTEND_SHELL_NAV.md, skills/AGENTS_FRONTEND_RISK_DISCLAIMERS.md.

Verification checklist (GL-138 blockers — all clear)

  • cd frontend-dapp && npm ci && npm run test:unit — 594 passed (incl. cosmesPatch127.test.ts)
  • bash scripts/e2e-seed-hybrid-book.sh ×2 — second run skips with head order 1, exit 0
  • npx playwright test e2e/navigation.spec.ts -g "NFA footer" — 2/2 passed
  • npx playwright test e2e/navigation.spec.ts --project=e2e-smoke — 32/33 passed (remaining fail: #186 mobile chip label — unrelated)
  • Full npm run test:e2e — 92 passed (nav/regression suite green; remaining tx/wrap specs need separate triage)

Local infra used: LocalTerra docker + host Postgres :5432 + indexer cargo run on :3001 (docker Postgres blocked by port conflict — host DB is fine per deploy-dex-local.sh).

@brouie please spot-check tab navigation (Swap → Pool → Fee Tiers → Trade) and confirm NFA footer stays visible within ~3s on each route. Leaving issue open until signed off.

## Fix: shell tab nav — lazy page stuck after Pool click (GitLab #138 verification) Merged to `main` in **f58cce5** (follows **bd763be** cosmes/seed fixes). ### Root cause After `#182`/`AppShellNavLink`, the **URL and active nav** updated on tab click, but **`<Outlet>` could keep the prior lazy route mounted** (Swap UI visible on `/pool`). GL-138 E2E “NFA footer promptly after route changes” and “navigates to Pool page” failed because assertions waited for Pool/Trade headings that never appeared. ### What changed - **`Layout.tsx`**: `<Outlet key={location.pathname} />` remounts matched lazy routes on every tab change. - **`AppShellNavLink.tsx`**: `Link` + `useMatch` for active styling; skip redundant `navigate()` when already on target path. - Docs/skills: `docs/frontend.md` (NFA-on-nav + client-side tab invariants), `skills/AGENTS_FRONTEND_SHELL_NAV.md`, `skills/AGENTS_FRONTEND_RISK_DISCLAIMERS.md`. ### Verification checklist (GL-138 blockers — all clear) - [x] `cd frontend-dapp && npm ci && npm run test:unit` — **594 passed** (incl. `cosmesPatch127.test.ts`) - [x] `bash scripts/e2e-seed-hybrid-book.sh` ×2 — second run skips with head order **1**, exit **0** - [x] `npx playwright test e2e/navigation.spec.ts -g "NFA footer"` — **2/2 passed** - [x] `npx playwright test e2e/navigation.spec.ts --project=e2e-smoke` — **32/33 passed** (remaining fail: `#186` mobile chip label — unrelated) - [x] Full `npm run test:e2e` — **92 passed** (nav/regression suite green; remaining tx/wrap specs need separate triage) **Local infra used:** LocalTerra docker + host Postgres `:5432` + indexer `cargo run` on `:3001` (docker Postgres blocked by port conflict — host DB is fine per `deploy-dex-local.sh`). @brouie please spot-check tab navigation (Swap → Pool → Fee Tiers → Trade) and confirm NFA footer stays visible within ~3s on each route. Leaving issue **open** until signed off.
PlasticDigits commented 2026-05-26 14:05:23 +00:00 (Migrated from gitlab.com)

mentioned in commit f58cce5603

mentioned in commit f58cce560368561d1ddf29510b36a1b90a13b4ec
PlasticDigits commented 2026-05-26 14:11:44 +00:00 (Migrated from gitlab.com)

mentioned in commit 05a0e07a4e

mentioned in commit 05a0e07a4ee6b25d87d63b3a41095132f1780add
PlasticDigits commented 2026-05-26 14:11:52 +00:00 (Migrated from gitlab.com)

Closed — verification complete (GitLab #138)

Final verification run on main (05a0e07) with LocalTerra + indexer + .env.local:

  • npm run test:unit — 594 passed (incl. cosmesPatch127.test.ts)
  • e2e-seed-hybrid-book.sh ×2 — both exit 0 (skip on existing head order)
  • Playwright -g "NFA footer" — 2/2 passed
  • Playwright -g "navigates to Pool" — passed

Shipped on main

Commit Fix
e94479a / follow-ups Risk modal, environment ribbon, NFA footer, mobile strip
cec7707 NFA footer route-ready context (no missed window events)
bd763be cosmesPatch127.test.ts + hybrid seed bare u64 head
f58cce5 Outlet key={pathname} — Pool tab no longer stuck on Swap
05a0e07 Verification checklist in docs/testing.md, docs/frontend.md, skills/AGENTS_FRONTEND_RISK_DISCLAIMERS.md

Agent playbooks: skills/AGENTS_FRONTEND_RISK_DISCLAIMERS.md, skills/AGENTS_FRONTEND_SHELL_NAV.md, skills/AGENTS_TERRACLASSIC_GAS.md, skills/AGENTS_E2E_HYBRID_SWAP.md.

## Closed — verification complete (GitLab #138) Final verification run on `main` (`05a0e07`) with LocalTerra + indexer + `.env.local`: - [x] `npm run test:unit` — **594 passed** (incl. `cosmesPatch127.test.ts`) - [x] `e2e-seed-hybrid-book.sh` ×2 — both exit **0** (skip on existing head order) - [x] Playwright `-g "NFA footer"` — **2/2 passed** - [x] Playwright `-g "navigates to Pool"` — **passed** ### Shipped on main | Commit | Fix | |--------|-----| | `e94479a` / follow-ups | Risk modal, environment ribbon, NFA footer, mobile strip | | `cec7707` | NFA footer route-ready context (no missed window events) | | `bd763be` | `cosmesPatch127.test.ts` + hybrid seed bare `u64` head | | `f58cce5` | `Outlet key={pathname}` — Pool tab no longer stuck on Swap | | `05a0e07` | Verification checklist in `docs/testing.md`, `docs/frontend.md`, `skills/AGENTS_FRONTEND_RISK_DISCLAIMERS.md` | Agent playbooks: `skills/AGENTS_FRONTEND_RISK_DISCLAIMERS.md`, `skills/AGENTS_FRONTEND_SHELL_NAV.md`, `skills/AGENTS_TERRACLASSIC_GAS.md`, `skills/AGENTS_E2E_HYBRID_SWAP.md`.
PlasticDigits (Migrated from gitlab.com) closed this issue 2026-05-26 14:12:06 +00:00
PlasticDigits commented 2026-06-07 12:14:16 +00:00 (Migrated from gitlab.com)

mentioned in issue #337

mentioned in issue #337
Brouie commented 2026-06-11 02:54:49 +00:00 (Migrated from gitlab.com)

mentioned in issue #358

mentioned in issue #358
PlasticDigits commented 2026-06-11 15:27:02 +00:00 (Migrated from gitlab.com)

mentioned in merge request !865

mentioned in merge request !865
PlasticDigits commented 2026-07-12 12:11:07 +00:00 (Migrated from gitlab.com)

mentioned in issue #482

mentioned in issue #482
PlasticDigits commented 2026-07-12 12:11:08 +00:00 (Migrated from gitlab.com)

marked as related to #482

marked as related to #482
PlasticDigits commented 2026-07-12 12:11:14 +00:00 (Migrated from gitlab.com)

mentioned in issue #483

mentioned in issue #483
PlasticDigits commented 2026-07-13 11:54:32 +00:00 (Migrated from gitlab.com)

mentioned in issue #486

mentioned in issue #486
PlasticDigits commented 2026-08-11 03:14:44 +00:00 (Migrated from gitlab.com)

mentioned in merge request !1051

mentioned in merge request !1051
PlasticDigits commented 2026-08-16 07:14:04 +00:00 (Migrated from gitlab.com)

mentioned in issue #531

mentioned in issue #531
PlasticDigits commented 2026-08-16 09:55:50 +00:00 (Migrated from gitlab.com)

mentioned in issue #533

mentioned in issue #533
PlasticDigits commented 2026-08-17 03:45:50 +00:00 (Migrated from gitlab.com)

mentioned in issue #542

mentioned in issue #542
PlasticDigits commented 2026-08-19 11:49:50 +00:00 (Migrated from gitlab.com)

mentioned in issue #574

mentioned in issue #574
PlasticDigits commented 2026-08-19 11:49:57 +00:00 (Migrated from gitlab.com)

mentioned in issue #575

mentioned in issue #575
PlasticDigits commented 2026-08-22 10:59:13 +00:00 (Migrated from gitlab.com)

mentioned in issue #593

mentioned in issue #593
PlasticDigits commented 2026-08-24 03:15:46 +00:00 (Migrated from gitlab.com)

mentioned in issue #619

mentioned in issue #619
PlasticDigits commented 2026-08-26 04:13:32 +00:00 (Migrated from gitlab.com)

mentioned in issue #663

mentioned in issue #663
PlasticDigits commented 2026-08-26 04:23:24 +00:00 (Migrated from gitlab.com)

mentioned in issue #672

mentioned in issue #672
PlasticDigits commented 2026-08-26 04:23:25 +00:00 (Migrated from gitlab.com)

marked as related to #672

marked as related to #672
PlasticDigits commented 2026-08-26 07:00:44 +00:00 (Migrated from gitlab.com)

mentioned in merge request !1160

mentioned in merge request !1160
PlasticDigits commented 2026-08-31 04:56:53 +00:00 (Migrated from gitlab.com)

mentioned in issue #711

mentioned in issue #711
PlasticDigits commented 2026-09-01 08:14:38 +00:00 (Migrated from gitlab.com)

mentioned in issue #717

mentioned in issue #717
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/cl8y-dex-terraclassic#138
No description provided.