bug(frontend): Android Chrome cannot activate Connect Terra Wallet (CONNECT TC) #137

Open
opened 2026-08-18 00:20:53 +00:00 by PlasticDigits · 24 comments
PlasticDigits commented 2026-08-18 00:20:53 +00:00 (Migrated from gitlab.com)

Working control (do not miss)

usera (Android 16 Chrome) successfully disconnected and reconnected a Terra wallet on https://ust1cmm.com (ustr-cmm frontend). After reconnect they had the connected-wallet chrome (orange indicator, top right) and reached Accept T&C.

That means ustr-cmm wallet connect works on the same device / browser / OS where DEX and bridge fail. Treat ustr-cmm frontend/ as the known-good connect implementation (PlasticDigits2/ustr-cmm). Diff DEX / bridge against it (wallet modal, WC pairing, deep links, overlays). Do not treat this incident as “mobile wallets are broken everywhere.”

T&C after that successful ust1cmm connect still failed with Keplr extension not found — that is the Legal portal signer (window.keplr), not a ustr-cmm connect bug.


Summary

Community report (2026-08-17/18): usera (Android 16, Chrome) cannot use Terra wallet connect on https://bridge.cl8y.com — they cannot even tap / activate the Connect Terra Wallet control (no modal, no error). Same session: dex.cl8y.com Lunc Dash / Galaxy Station only spin; Keplr in Chrome is extension-only; Keplr in-app browser later unblocked the DEX.

This issue is bridge-only (header CTA + Terra modal + overlays). DEX pairing/Keplr-WC: https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/work_items/554. Legal Keplr extension not found on T&C is filed on cl8y-ecosystem-legal (same incident).


Current codebase

  • Header CTA: packages/frontend/src/components/WalletButton.tsx. Disconnected label is CONNECT TC (hidden sm:inline) and TC on small viewports. disabled={connecting} with the same animate-spin pattern as the DEX. Click calls setShowWalletModal(true).
  • Modal: packages/frontend/src/components/wallet/TerraWalletModal.tsx mounted from Layout.tsx. Extension rows (Station, Keplr, Leap, Cosmostation) use WalletType.EXTENSION and TerraWalletOption sets disabled={disabled \|\| !available} — on Chrome Android those rows are inert (opacity-40 cursor-not-allowed). Lunc Dash / Galaxy Station are WalletType.WALLETCONNECT and available: true.
  • WC wait: modal has Retry / Cancel via cancelConnection while isWcConnecting (DEX currently has no equivalent). detectInAppBrowser warns inside the modal; it does not help if the header button never opens the modal.
  • Layout: sticky header z-30, overflow-x-clip on the header, main glow is pointer-events-none. Legal web clickwrap (#134) may add a full-viewport gate — a likely cause of “cannot click” if an overlay captures pointer events above the header CTA.
  • E2E uses getByRole('button', { name: 'CONNECT TC' }) — that name is hidden on mobile, so Playwright desktop does not catch a tap miss on the TC chip.

Why this is needed

  • Bridge transfers require a Terra Classic wallet. If the header control cannot be activated on Android Chrome, the product is unusable for that cohort (same users who then fail DEX WC and Legal T&C).
  • “Cannot click” is distinct from “clicked and spinner” (DEX). Likely overlay / hit-target / disabled-connecting / overflow clipping — must be fixed before WC pairing UX.
  • Even after the button works, Chrome Android still cannot use extension wallets; Lunc Dash / Galaxy Station must complete, and Keplr should not look like a dead “Not installed” row only.

Constraints / guardrails

  1. Do not require a desktop browser extension as the only Terra connect path on mobile Chrome.
  2. Do not auto-redirect WalletConnect from a non-gesture async callback (same WC-M3 lesson as DEX #519).
  3. Keep Simulated Terra Wallet dev-only.
  4. Leap remains a vendor-risk row (DEX removed it #159); do not revive a dead Install URL as the mobile fix.
  5. Legal clickwrap must not intercept the header Connect control unless product explicitly wants connect-after-terms; if gated, the overlay must be dismissible or the CTA must sit above it.
  6. Cancel WC must remain possible (cancelConnection); do not regress Retry/Cancel.
  7. CSP / WC project id: do not blanket-allow https: to “fix” connect.
  8. Deep links: allowlist schemes/hosts only.

Relevant files

Area Paths
Header CTA packages/frontend/src/components/WalletButton.tsx, NavBar.tsx, Layout.tsx
Terra modal packages/frontend/src/components/wallet/TerraWalletModal.tsx, TerraWalletOption.tsx
Store packages/frontend/src/stores/wallet.ts, packages/frontend/src/hooks/useWallet.ts (or equivalent)
In-app detect packages/frontend/src/utils/detectInAppBrowser.ts
Legal overlay clickwrap / TermsGate mount from #134
E2E packages/frontend/e2e/wallet-connect.spec.ts

  1. Reproduce on Android 16 Chrome with DevTools remote debugging: element at tap point, pointer-events, stacking (legal overlay vs z-30 header), whether connecting is stuck true on load.
  2. Hit target: accessible name must work on mobile (not only desktop CONNECT TC). Avoid a clipped TC chip under another header control.
  3. If Legal overlay blocks: raise Connect above the gate, or delay the gate until after Terra connect (match DEX: clickwrap after connect), or provide an explicit enabled CTA on the gate.
  4. After the button opens the modal: ensure Lunc Dash / Galaxy Station same-device Open + Copy (port DEX #519 patterns if the bridge still uses QR / auto-redirect). Offer Keplr WC or Open-in-Keplr when window.keplr is absent — do not leave Keplr as disabled “Not installed”.
  5. Keep Cancel/Retry for WC hangs.

Acceptance criteria

  • Android 16 Chrome: tap header Terra connect (visible label or aria-label) opens TerraWalletModal on first tap; no dead overlay.
  • connecting === false on a fresh visit (no spinner-disabled CTA on load).
  • Lunc Dash and Galaxy Station can complete from Android Chrome (Open / Copy), or a documented in-app-browser path is visible before the user is stuck.
  • Keplr is not a permanently disabled row on Chrome Android without an alternative (WC or Open in Keplr).
  • Desktop extension connect unchanged.
  • Legal gate (if enabled) does not swallow the first tap on Connect; T&C still required before transfers if product requires it.
  • WC Cancel clears spinner and re-enables the header button.

Test plan (functional paths)

  1. Manual Android 16 Chrome: tap Terra CTA → modal. Screenshot overlay stacking if it fails.
  2. Fresh load: CTA enabled; connecting false.
  3. Lunc Dash / Galaxy Station Open + Copy + approve → terra1 in header.
  4. Keplr missing extension: alternative path, not only disabled row.
  5. Cancel during WC: spinner stops; can retry.
  6. Desktop Chrome + Keplr extension: regression.
  7. Legal overlay on/off: Connect still tappable; transfers still gated as designed.
  8. E2E: add a mobile viewport (or aria-label) so CI does not only click CONNECT TC which is hidden sm:inline.
  9. In-app browser: detectInAppBrowser banner still accurate; default-browser path documented.

Test plan (attack / abuse / hack vectors)

Vector Expectation
Overlay / full-screen invisible fixed inset-0 left from a closed dropdown (z-40 in WalletButton) Must not remain after disconnect / route change; must not cover Connect
Stuck connecting from a previous tab New load or Cancel recovers; no permanent disable
WC URI / intent off allowlist No navigation
Legal skip / clickjack through overlay Transfers still require intended terms + wallet; Connect tap ≠ skip T&C
Rapid double-tap Connect One modal; no duplicate WC sessions
Simulated wallet on production build Still hidden (DEV_MODE)

Verification criteria

  • Manual matrix on this issue: Android 16 Chrome tap → modal → Lunc Dash or Galaxy Station (or Keplr alternative) → address shown.
  • If overlay was the root cause: before/after screenshot of the tap target (pointer-events, z-index).
  • packages/frontend unit tests for CTA disabled/enabled and modal open; e2e name that works at mobile width.
  • Desktop Keplr extension regression pass.
  • Cross-link: DEX Android Chrome connect issue; Legal mobile T&C issue.
## Working control (do not miss) **usera (Android 16 Chrome) successfully disconnected and reconnected a Terra wallet on `https://ust1cmm.com` (ustr-cmm frontend).** After reconnect they had the connected-wallet chrome (orange indicator, top right) and reached Accept T&C. That means **ustr-cmm wallet connect works on the same device / browser / OS** where DEX and bridge fail. Treat **ustr-cmm `frontend/` as the known-good connect implementation** (`PlasticDigits2/ustr-cmm`). Diff DEX / bridge against it (wallet modal, WC pairing, deep links, overlays). Do not treat this incident as “mobile wallets are broken everywhere.” T&C **after** that successful ust1cmm connect still failed with `Keplr extension not found` — that is the **Legal portal** signer (`window.keplr`), not a ustr-cmm connect bug. --- ## Summary Community report (2026-08-17/18): **usera** (Android 16, Chrome) cannot use Terra wallet connect on `https://bridge.cl8y.com` — they **cannot even tap / activate the Connect Terra Wallet control** (no modal, no error). Same session: `dex.cl8y.com` Lunc Dash / Galaxy Station only spin; Keplr in Chrome is extension-only; Keplr **in-app browser** later unblocked the DEX. This issue is **bridge-only** (header CTA + Terra modal + overlays). DEX pairing/Keplr-WC: https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/work_items/554. Legal `Keplr extension not found` on T&C is filed on `cl8y-ecosystem-legal` (same incident). --- ## Current codebase - Header CTA: [`packages/frontend/src/components/WalletButton.tsx`](packages/frontend/src/components/WalletButton.tsx). Disconnected label is **CONNECT TC** (`hidden sm:inline`) and **TC** on small viewports. `disabled={connecting}` with the same **animate-spin** pattern as the DEX. Click calls `setShowWalletModal(true)`. - Modal: [`packages/frontend/src/components/wallet/TerraWalletModal.tsx`](packages/frontend/src/components/wallet/TerraWalletModal.tsx) mounted from [`Layout.tsx`](packages/frontend/src/components/Layout.tsx). Extension rows (Station, Keplr, Leap, Cosmostation) use `WalletType.EXTENSION` and `TerraWalletOption` sets `disabled={disabled \|\| !available}` — on Chrome Android those rows are **inert** (`opacity-40 cursor-not-allowed`). Lunc Dash / Galaxy Station are `WalletType.WALLETCONNECT` and `available: true`. - WC wait: modal has **Retry / Cancel** via `cancelConnection` while `isWcConnecting` (DEX currently has no equivalent). `detectInAppBrowser` warns **inside** the modal; it does not help if the header button never opens the modal. - Layout: sticky `header` `z-30`, `overflow-x-clip` on the header, `main` glow is `pointer-events-none`. Legal web clickwrap ([#134](https://gitlab.com/PlasticDigits/cl8y-bridge-monorepo/-/issues/134)) may add a full-viewport gate — a likely cause of “cannot click” if an overlay captures pointer events above the header CTA. - E2E uses `getByRole('button', { name: 'CONNECT TC' })` — that name is **hidden on mobile**, so Playwright desktop does not catch a tap miss on the **TC** chip. --- ## Why this is needed - Bridge transfers require a Terra Classic wallet. If the header control cannot be activated on Android Chrome, the product is unusable for that cohort (same users who then fail DEX WC and Legal T&C). - “Cannot click” is distinct from “clicked and spinner” (DEX). Likely overlay / hit-target / disabled-`connecting` / overflow clipping — must be fixed before WC pairing UX. - Even after the button works, Chrome Android still cannot use extension wallets; Lunc Dash / Galaxy Station must complete, and Keplr should not look like a dead “Not installed” row only. --- ## Constraints / guardrails 1. Do not require a desktop browser extension as the only Terra connect path on mobile Chrome. 2. Do not auto-redirect WalletConnect from a non-gesture async callback (same WC-M3 lesson as DEX #519). 3. Keep Simulated Terra Wallet **dev-only**. 4. Leap remains a vendor-risk row (DEX removed it [#159](https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/issues/159)); do not revive a dead Install URL as the mobile fix. 5. Legal clickwrap must not intercept the header Connect control unless product explicitly wants connect-after-terms; if gated, the overlay must be dismissible or the CTA must sit above it. 6. Cancel WC must remain possible (`cancelConnection`); do not regress Retry/Cancel. 7. CSP / WC project id: do not blanket-allow `https:` to “fix” connect. 8. Deep links: allowlist schemes/hosts only. --- ## Relevant files | Area | Paths | |------|--------| | Header CTA | `packages/frontend/src/components/WalletButton.tsx`, `NavBar.tsx`, `Layout.tsx` | | Terra modal | `packages/frontend/src/components/wallet/TerraWalletModal.tsx`, `TerraWalletOption.tsx` | | Store | `packages/frontend/src/stores/wallet.ts`, `packages/frontend/src/hooks/useWallet.ts` (or equivalent) | | In-app detect | `packages/frontend/src/utils/detectInAppBrowser.ts` | | Legal overlay | clickwrap / TermsGate mount from [#134](https://gitlab.com/PlasticDigits/cl8y-bridge-monorepo/-/issues/134) | | E2E | `packages/frontend/e2e/wallet-connect.spec.ts` | --- ## Recommended direction 1. **Reproduce on Android 16 Chrome** with DevTools remote debugging: element at tap point, `pointer-events`, stacking (legal overlay vs `z-30` header), whether `connecting` is stuck true on load. 2. **Hit target:** accessible name must work on mobile (not only desktop `CONNECT TC`). Avoid a clipped **TC** chip under another header control. 3. **If Legal overlay blocks:** raise Connect above the gate, or delay the gate until after Terra connect (match DEX: clickwrap **after** connect), or provide an explicit enabled CTA on the gate. 4. **After the button opens the modal:** ensure Lunc Dash / Galaxy Station same-device Open + Copy (port DEX #519 patterns if the bridge still uses QR / auto-redirect). Offer Keplr WC or Open-in-Keplr when `window.keplr` is absent — do not leave Keplr as disabled “Not installed”. 5. Keep Cancel/Retry for WC hangs. --- ## Acceptance criteria - [ ] Android 16 Chrome: tap header Terra connect (visible label or `aria-label`) opens `TerraWalletModal` on first tap; no dead overlay. - [ ] `connecting === false` on a fresh visit (no spinner-disabled CTA on load). - [ ] Lunc Dash and Galaxy Station can complete from Android Chrome (Open / Copy), or a documented in-app-browser path is visible **before** the user is stuck. - [ ] Keplr is not a permanently disabled row on Chrome Android without an alternative (WC or Open in Keplr). - [ ] Desktop extension connect unchanged. - [ ] Legal gate (if enabled) does not swallow the first tap on Connect; T&C still required before transfers if product requires it. - [ ] WC Cancel clears spinner and re-enables the header button. --- ## Test plan (functional paths) 1. **Manual Android 16 Chrome:** tap Terra CTA → modal. Screenshot overlay stacking if it fails. 2. **Fresh load:** CTA enabled; `connecting` false. 3. **Lunc Dash / Galaxy Station** Open + Copy + approve → `terra1` in header. 4. **Keplr** missing extension: alternative path, not only disabled row. 5. **Cancel** during WC: spinner stops; can retry. 6. **Desktop Chrome + Keplr extension:** regression. 7. **Legal overlay on/off:** Connect still tappable; transfers still gated as designed. 8. **E2E:** add a mobile viewport (or `aria-label`) so CI does not only click `CONNECT TC` which is `hidden sm:inline`. 9. **In-app browser:** `detectInAppBrowser` banner still accurate; default-browser path documented. --- ## Test plan (attack / abuse / hack vectors) | Vector | Expectation | |--------|-------------| | Overlay / full-screen invisible `fixed inset-0` left from a closed dropdown (`z-40` in WalletButton) | Must not remain after disconnect / route change; must not cover Connect | | Stuck `connecting` from a previous tab | New load or Cancel recovers; no permanent disable | | WC URI / intent off allowlist | No navigation | | Legal skip / clickjack through overlay | Transfers still require intended terms + wallet; Connect tap ≠ skip T&C | | Rapid double-tap Connect | One modal; no duplicate WC sessions | | Simulated wallet on production build | Still hidden (`DEV_MODE`) | --- ## Verification criteria - Manual matrix on this issue: Android 16 Chrome tap → modal → Lunc Dash or Galaxy Station (or Keplr alternative) → address shown. - If overlay was the root cause: before/after screenshot of the tap target (`pointer-events`, z-index). - `packages/frontend` unit tests for CTA disabled/enabled and modal open; e2e name that works at mobile width. - Desktop Keplr extension regression pass. - Cross-link: DEX Android Chrome connect issue; Legal mobile T&C issue.
PlasticDigits commented 2026-08-18 00:20:55 +00:00 (Migrated from gitlab.com)

marked as related to #134

marked as related to #134
PlasticDigits commented 2026-08-18 00:21:02 +00:00 (Migrated from gitlab.com)

mentioned in issue cl8y-dex-terraclassic#554

mentioned in issue cl8y-dex-terraclassic#554
PlasticDigits commented 2026-08-18 00:21:03 +00:00 (Migrated from gitlab.com)
Same incident: - DEX Android Chrome connect: https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/work_items/554 - Legal T&C Keplr extension not found: https://gitlab.com/PlasticDigits/cl8y-ecosystem-legal/-/work_items/9
PlasticDigits commented 2026-08-18 00:25:32 +00:00 (Migrated from gitlab.com)

changed the description

changed the description
PlasticDigits commented 2026-08-18 00:25:35 +00:00 (Migrated from gitlab.com)

Working control — ustr-cmm connect succeeded on the same phone

usera (Android 16 Chrome) disconnected and reconnected on https://ust1cmm.com (ustr-cmm). Wallet connect worked (orange indicator, then Accept T&C).

Same session:

  • ustr-cmm (ust1cmm.com) connect: works
  • DEX (dex.cl8y.com) connect: does not (Lunc Dash / Galaxy Station spinner; Keplr extension-only)
  • Bridge (bridge.cl8y.com) connect: does not (cannot tap Connect Terra Wallet)

Use PlasticDigits2/ustr-cmm frontend/ as the reference. T&C failure after that connect is Legal portal window.keplr, not proof that ustr-cmm connect is broken.

**Working control — ustr-cmm connect succeeded on the same phone** usera (Android 16 Chrome) **disconnected and reconnected** on `https://ust1cmm.com` (ustr-cmm). Wallet **connect worked** (orange indicator, then Accept T&C). Same session: - **ustr-cmm (`ust1cmm.com`) connect: works** - **DEX (`dex.cl8y.com`) connect: does not** (Lunc Dash / Galaxy Station spinner; Keplr extension-only) - **Bridge (`bridge.cl8y.com`) connect: does not** (cannot tap Connect Terra Wallet) Use `PlasticDigits2/ustr-cmm` `frontend/` as the reference. T&C failure after that connect is Legal portal `window.keplr`, not proof that ustr-cmm connect is broken.
PlasticDigits commented 2026-08-31 05:55:47 +00:00 (Migrated from gitlab.com)

mentioned in merge request !156

mentioned in merge request !156
PlasticDigits commented 2026-08-31 05:56:49 +00:00 (Migrated from gitlab.com)

mentioned in commit 2d8ebc29d9

mentioned in commit 2d8ebc29d99d2178c255cd28acc1e078f141a52e
PlasticDigits commented 2026-08-31 05:57:29 +00:00 (Migrated from gitlab.com)

mentioned in merge request !157

mentioned in merge request !157
PlasticDigits commented 2026-08-31 05:58:46 +00:00 (Migrated from gitlab.com)

mentioned in merge request !159

mentioned in merge request !159
PlasticDigits commented 2026-08-31 05:59:01 +00:00 (Migrated from gitlab.com)

Implementation is in !159 (fix/gl-137-android-chrome-terra-connect).

Header CTA is now a 44px Connect Terra Wallet control (accessible name, Cancel while connecting, no persisted spinner). WalletConnect uses Open/Copy pairing instead of async auto-redirect. Keplr on mobile Chrome without inject is a WalletConnect row.

Still needs device QA on Android 16 Chrome (tap → modal → Lunc Dash / Galaxy Station) and a desktop Keplr-extension smoke check. Legal T&C overlay remains GL-134 (not this repo).

Implementation is in !159 (`fix/gl-137-android-chrome-terra-connect`). Header CTA is now a 44px `Connect Terra Wallet` control (accessible name, Cancel while connecting, no persisted spinner). WalletConnect uses Open/Copy pairing instead of async auto-redirect. Keplr on mobile Chrome without inject is a WalletConnect row. Still needs device QA on Android 16 Chrome (tap → modal → Lunc Dash / Galaxy Station) and a desktop Keplr-extension smoke check. Legal T&C overlay remains GL-134 (not this repo).
PlasticDigits commented 2026-08-31 11:25:51 +00:00 (Migrated from gitlab.com)

mentioned in commit b862755129

mentioned in commit b8627551294805a5c39984ee0dfeb94cc8ae3a42
PlasticDigits commented 2026-08-31 12:26:37 +00:00 (Migrated from gitlab.com)

mentioned in commit 42c92ceabc

mentioned in commit 42c92ceabc7843e01af1369b083d5d563e4c48b7
PlasticDigits commented 2026-08-31 12:36:18 +00:00 (Migrated from gitlab.com)

mentioned in commit e228eb1cf8

mentioned in commit e228eb1cf8d7f4902ed9db6b9293f195c70d8384
PlasticDigits commented 2026-08-31 12:39:02 +00:00 (Migrated from gitlab.com)

mentioned in issue #134

mentioned in issue #134
PlasticDigits commented 2026-08-31 12:39:09 +00:00 (Migrated from gitlab.com)

Merge status (!159 landed on main)

Code from !159 is merged. Keep this issue open until Android 16 Chrome device QA passes. The original cohort cannot be verified by Playwright 390×844.

Remaining (issue AC / verification)

  • Android 16 Chrome: first tap header Connect Terra Wallet opens TerraWalletModal
  • Lunc Dash / Galaxy Station: Open or Copy → approve → terra1 in header; returning to Chrome does not rotate the pairing URI
  • Keplr without window.keplr: WalletConnect row, not “Not installed”; WC reject does not say “install the extension”
  • Copy failure: selectable wc: URI (or prompt) visible
  • Cancel during WC: spinner clears; CTA tappable again
  • Desktop Chrome + Keplr extension regression
  • Combined with !156 clickwrap: Legal gate does not swallow Connect; Connect tap ≠ skip T&C
  • Overlay stacking screenshot from a real Android 16 Chrome session (useful, not a code blocker)

Draft !157 was already the closed wrong-target duplicate. Stale remote branch 137-bug-frontend-android-chrome-cannot-activate-connect-terra-wallet-connect-tc- will be deleted.

## Merge status (!159 landed on `main`) Code from !159 is merged. **Keep this issue open** until Android 16 Chrome device QA passes. The original cohort cannot be verified by Playwright `390×844`. ### Remaining (issue AC / verification) - [ ] Android 16 Chrome: first tap header **Connect Terra Wallet** opens `TerraWalletModal` - [ ] Lunc Dash / Galaxy Station: Open or Copy → approve → `terra1` in header; returning to Chrome does not rotate the pairing URI - [ ] Keplr without `window.keplr`: WalletConnect row, not “Not installed”; WC reject does not say “install the extension” - [ ] Copy failure: selectable `wc:` URI (or prompt) visible - [ ] Cancel during WC: spinner clears; CTA tappable again - [ ] Desktop Chrome + Keplr extension regression - [ ] Combined with !156 clickwrap: Legal gate does not swallow Connect; Connect tap ≠ skip T&C - [ ] Overlay stacking screenshot from a real Android 16 Chrome session (useful, not a code blocker) Draft !157 was already the closed wrong-target duplicate. Stale remote branch `137-bug-frontend-android-chrome-cannot-activate-connect-terra-wallet-connect-tc-` will be deleted.
PlasticDigits commented 2026-08-31 12:54:18 +00:00 (Migrated from gitlab.com)

mentioned in commit a211a730be

mentioned in commit a211a730be06ffa659051b393acf30aaad46fd6f
PlasticDigits commented 2026-09-01 07:28:24 +00:00 (Migrated from gitlab.com)

mentioned in commit f7e9ffd6ec

mentioned in commit f7e9ffd6ec86eba7b900afbab21c19860df1ea33
PlasticDigits commented 2026-09-01 07:29:07 +00:00 (Migrated from gitlab.com)

mentioned in merge request !161

mentioned in merge request !161
PlasticDigits commented 2026-09-01 07:29:38 +00:00 (Migrated from gitlab.com)

mentioned in merge request !162

mentioned in merge request !162
PlasticDigits commented 2026-09-01 07:29:56 +00:00 (Migrated from gitlab.com)

Follow-up implementation is in !162 (fix/gl-137-cancel-abort-overlay).

The original connect path from !159 is already on main. This MR hardens two remaining #137 gaps:

  1. Cancel abort — a late WalletConnect success can no longer set connected after Cancel.
  2. Dropdown overlay — connected-wallet fixed inset-0 catchers portal below the header (WalletMenuBackdrop) and dismiss on route change, so they cannot cover Connect.

Automated verification passed (unit + Playwright wallet-connect, 5 workers). Do not close #137 until Android 16 Chrome device QA passes.

Follow-up implementation is in !162 (`fix/gl-137-cancel-abort-overlay`). The original connect path from !159 is already on `main`. This MR hardens two remaining #137 gaps: 1. **Cancel abort** — a late WalletConnect success can no longer set `connected` after Cancel. 2. **Dropdown overlay** — connected-wallet `fixed inset-0` catchers portal below the header (`WalletMenuBackdrop`) and dismiss on route change, so they cannot cover Connect. Automated verification passed (unit + Playwright wallet-connect, 5 workers). **Do not close #137 until Android 16 Chrome device QA passes.**
PlasticDigits commented 2026-09-01 09:04:05 +00:00 (Migrated from gitlab.com)

mentioned in commit 4761fa5a49

mentioned in commit 4761fa5a4916ad66bc24f7daf04b97a74e8fd6a0
PlasticDigits commented 2026-09-02 01:38:25 +00:00 (Migrated from gitlab.com)

mentioned in commit 6e7a510c90

mentioned in commit 6e7a510c90e3cd88fe43c004a431a6d0460007d9
PlasticDigits commented 2026-09-02 01:39:17 +00:00 (Migrated from gitlab.com)

!162 merged — remaining #137 gaps (2026-09-02)

Merged !162 into main (no automerge, no CI wait). Local sanity: wallet unit tests 29/29, tsc --noEmit clean, Playwright e2e/wallet-connect.spec.ts 9/9 (--workers=5). The prior must-fix is on main: epoch mismatch still throws ConnectionCancelledError and skips disconnectTerraWallet while a newer connect() owns the shared WalletConnect client (Retry).

Do not close this issue. Device QA is still open.

Acceptance criteria after !159 + !162

AC Status
Android 16 Chrome first tap opens TerraWalletModal; no dead overlay NOT MET — Playwright UA ≠ real device. Still needs a physical Android 16 Chrome session.
connecting === false on a fresh visit MET in code (applyWalletHydrateReset) + unit tests
Lunc Dash / Galaxy Station Open+Copy from Android Chrome, or documented in-app path PARTIAL — pairing sheet / in-app banner are in code and e2e; live Open+Copy → terra1 not confirmed on device
Keplr not a permanently disabled row without an alternative MET in !159 (WalletConnect row when window.keplr absent); not re-verified on device
Desktop extension connect unchanged MET in code; desktop Keplr extension smoke still unchecked
Legal gate does not swallow first Connect tap MET — TermsGate is transfer-only; header z-50 above portaled z-40 backdrops
WC Cancel clears spinner and re-enables header CTA MET in unit tests (Cancel abort + Retry-does-not-kill-WC). Manual Cancel during a live pairing sheet still useful.

Remaining problems

  1. Android 16 Chrome device QA (blocks close): tap CONNECT/TC → modal → Lunc Dash or Galaxy Station Open+Copy → terra1 in header. Overlay stacking screenshot if anything still covers the CTA.
  2. Desktop Chrome + Keplr extension smoke (regression).
  3. Store connectSimulated() is still ungated (DEV_MODE is UI-only). Pre-existing; not a !162 merge blocker.
  4. No new e2e for Cancel-abort / Verify-route backdrop / Escape-to-close dropdown (History backdrop e2e covers route dismiss).

Not merge blockers (nice-to-have)

  • Single-flight connect() if connecting is already true (Retry already clears it first).
## !162 merged — remaining #137 gaps (2026-09-02) Merged [!162](https://gitlab.com/PlasticDigits/cl8y-bridge-monorepo/-/merge_requests/22) into `main` (no automerge, no CI wait). Local sanity: wallet unit tests 29/29, `tsc --noEmit` clean, Playwright `e2e/wallet-connect.spec.ts` 9/9 (`--workers=5`). The prior must-fix is on `main`: epoch mismatch still throws `ConnectionCancelledError` and skips `disconnectTerraWallet` while a newer `connect()` owns the shared WalletConnect client (Retry). **Do not close this issue.** Device QA is still open. ### Acceptance criteria after !159 + !162 | AC | Status | |----|--------| | Android 16 Chrome first tap opens `TerraWalletModal`; no dead overlay | **NOT MET** — Playwright UA ≠ real device. Still needs a physical Android 16 Chrome session. | | `connecting === false` on a fresh visit | MET in code (`applyWalletHydrateReset`) + unit tests | | Lunc Dash / Galaxy Station Open+Copy from Android Chrome, or documented in-app path | **PARTIAL** — pairing sheet / in-app banner are in code and e2e; live Open+Copy → `terra1` not confirmed on device | | Keplr not a permanently disabled row without an alternative | MET in !159 (WalletConnect row when `window.keplr` absent); not re-verified on device | | Desktop extension connect unchanged | MET in code; **desktop Keplr extension smoke still unchecked** | | Legal gate does not swallow first Connect tap | MET — TermsGate is transfer-only; header `z-50` above portaled `z-40` backdrops | | WC Cancel clears spinner and re-enables header CTA | MET in unit tests (Cancel abort + Retry-does-not-kill-WC). Manual Cancel during a live pairing sheet still useful. | ### Remaining problems 1. **Android 16 Chrome device QA** (blocks close): tap CONNECT/TC → modal → Lunc Dash or Galaxy Station Open+Copy → `terra1` in header. Overlay stacking screenshot if anything still covers the CTA. 2. **Desktop Chrome + Keplr extension** smoke (regression). 3. Store `connectSimulated()` is still ungated (`DEV_MODE` is UI-only). Pre-existing; not a !162 merge blocker. 4. No new e2e for Cancel-abort / Verify-route backdrop / Escape-to-close dropdown (History backdrop e2e covers route dismiss). ### Not merge blockers (nice-to-have) - Single-flight `connect()` if `connecting` is already true (Retry already clears it first).
PlasticDigits commented 2026-09-02 01:41:22 +00:00 (Migrated from gitlab.com)

Follow-up from !162 review: leftover ghost-disconnect race

The 4761fa5 Retry fix is on main and unit-tested (Cancel → newer connect() in flight → skip disconnectTerraWallet). A later timing is still unguarded.

shouldDisconnectGhostWalletConnect only checks !connecting.

  1. Retry already succeeded: cancelled attempt A resolves after Retry B has set({ connected: true, connecting: false }). A still calls disconnectTerraWallet() and can drop the live Cosmes WalletConnect singleton. Guard should also skip when connected === true (or when a newer epoch already committed). Missing test: connect A → Cancel → connect B → resolve B success → resolve A → disconnectTerraWallet must not run.
  2. 100ms Retry window: TerraWalletModal.handleRetry does cancelConnection() then connect() 100ms later. In that window connecting === false, so a late A success will disconnect. Usually that cleans a ghost before Retry, but it can still race Retry’s new connect().

Not a merge blocker for !162 (device QA remains the close criterion). Track as a follow-up on this issue unless a dedicated ticket is opened.

## Follow-up from !162 review: leftover ghost-disconnect race The 4761fa5 Retry fix is on `main` and unit-tested (Cancel → newer `connect()` in flight → skip `disconnectTerraWallet`). A later timing is still unguarded. `shouldDisconnectGhostWalletConnect` only checks `!connecting`. 1. **Retry already succeeded:** cancelled attempt A resolves **after** Retry B has `set({ connected: true, connecting: false })`. A still calls `disconnectTerraWallet()` and can drop the live Cosmes WalletConnect singleton. Guard should also skip when `connected === true` (or when a newer epoch already committed). Missing test: connect A → Cancel → connect B → **resolve B success** → resolve A → `disconnectTerraWallet` must not run. 2. **100ms Retry window:** `TerraWalletModal.handleRetry` does `cancelConnection()` then `connect()` 100ms later. In that window `connecting === false`, so a late A success **will** disconnect. Usually that cleans a ghost before Retry, but it can still race Retry’s new `connect()`. Not a merge blocker for !162 (device QA remains the close criterion). Track as a follow-up on this issue unless a dedicated ticket is opened.
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-bridge-monorepo#137
No description provided.