bug(frontend): Android Chrome cannot activate Connect Terra Wallet (CONNECT TC) #137
Labels
No labels
agent:implement
agent:ready
backend
bug
cannot-reproduce
confirmed
desktop
docs
documentation
duplicate
enhancement
feature
frontend
good first issue
help wanted
high-risk
in-review
invalid
mobile
needs-triage
P0-critical
P1-high
P2-medium
P3-low
qa
QA
question
ready
report
responsive
security
security-escalate
smart-contract
solana
tablet
test-pass
ux
wallet-issue
wallet:keplr
wallet:metamask
wallet:station
wallet:walletconnect
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
code/cl8y-bridge-monorepo#137
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
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.comLunc 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 foundon T&C is filed oncl8y-ecosystem-legal(same incident).Current codebase
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 callssetShowWalletModal(true).packages/frontend/src/components/wallet/TerraWalletModal.tsxmounted fromLayout.tsx. Extension rows (Station, Keplr, Leap, Cosmostation) useWalletType.EXTENSIONandTerraWalletOptionsetsdisabled={disabled \|\| !available}— on Chrome Android those rows are inert (opacity-40 cursor-not-allowed). Lunc Dash / Galaxy Station areWalletType.WALLETCONNECTandavailable: true.cancelConnectionwhileisWcConnecting(DEX currently has no equivalent).detectInAppBrowserwarns inside the modal; it does not help if the header button never opens the modal.headerz-30,overflow-x-clipon the header,mainglow ispointer-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.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
connecting/ overflow clipping — must be fixed before WC pairing UX.Constraints / guardrails
cancelConnection); do not regress Retry/Cancel.https:to “fix” connect.Relevant files
packages/frontend/src/components/WalletButton.tsx,NavBar.tsx,Layout.tsxpackages/frontend/src/components/wallet/TerraWalletModal.tsx,TerraWalletOption.tsxpackages/frontend/src/stores/wallet.ts,packages/frontend/src/hooks/useWallet.ts(or equivalent)packages/frontend/src/utils/detectInAppBrowser.tspackages/frontend/e2e/wallet-connect.spec.tsRecommended direction
pointer-events, stacking (legal overlay vsz-30header), whetherconnectingis stuck true on load.CONNECT TC). Avoid a clipped TC chip under another header control.window.keplris absent — do not leave Keplr as disabled “Not installed”.Acceptance criteria
aria-label) opensTerraWalletModalon first tap; no dead overlay.connecting === falseon a fresh visit (no spinner-disabled CTA on load).Test plan (functional paths)
connectingfalse.terra1in header.aria-label) so CI does not only clickCONNECT TCwhich ishidden sm:inline.detectInAppBrowserbanner still accurate; default-browser path documented.Test plan (attack / abuse / hack vectors)
fixed inset-0left from a closed dropdown (z-40in WalletButton)connectingfrom a previous tabDEV_MODE)Verification criteria
pointer-events, z-index).packages/frontendunit tests for CTA disabled/enabled and modal open; e2e name that works at mobile width.marked as related to #134
mentioned in issue cl8y-dex-terraclassic#554
Same incident:
changed the description
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:
ust1cmm.com) connect: worksdex.cl8y.com) connect: does not (Lunc Dash / Galaxy Station spinner; Keplr extension-only)bridge.cl8y.com) connect: does not (cannot tap Connect Terra Wallet)Use
PlasticDigits2/ustr-cmmfrontend/as the reference. T&C failure after that connect is Legal portalwindow.keplr, not proof that ustr-cmm connect is broken.mentioned in merge request !156
mentioned in commit
2d8ebc29d9mentioned in merge request !157
mentioned in merge request !159
Implementation is in !159 (
fix/gl-137-android-chrome-terra-connect).Header CTA is now a 44px
Connect Terra Walletcontrol (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).
mentioned in commit
b862755129mentioned in commit
42c92ceabcmentioned in commit
e228eb1cf8mentioned in issue #134
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)
TerraWalletModalterra1in header; returning to Chrome does not rotate the pairing URIwindow.keplr: WalletConnect row, not “Not installed”; WC reject does not say “install the extension”wc:URI (or prompt) visibleDraft !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.mentioned in commit
a211a730bementioned in commit
f7e9ffd6ecmentioned in merge request !161
mentioned in merge request !162
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:connectedafter Cancel.fixed inset-0catchers 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.
mentioned in commit
4761fa5a49mentioned in commit
6e7a510c90!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 --noEmitclean, Playwrighte2e/wallet-connect.spec.ts9/9 (--workers=5). The prior must-fix is onmain: epoch mismatch still throwsConnectionCancelledErrorand skipsdisconnectTerraWalletwhile a newerconnect()owns the shared WalletConnect client (Retry).Do not close this issue. Device QA is still open.
Acceptance criteria after !159 + !162
TerraWalletModal; no dead overlayconnecting === falseon a fresh visitapplyWalletHydrateReset) + unit teststerra1not confirmed on devicewindow.keplrabsent); not re-verified on devicez-50above portaledz-40backdropsRemaining problems
terra1in header. Overlay stacking screenshot if anything still covers the CTA.connectSimulated()is still ungated (DEV_MODEis UI-only). Pre-existing; not a !162 merge blocker.Not merge blockers (nice-to-have)
connect()ifconnectingis already true (Retry already clears it first).Follow-up from !162 review: leftover ghost-disconnect race
The
4761fa5Retry fix is onmainand unit-tested (Cancel → newerconnect()in flight → skipdisconnectTerraWallet). A later timing is still unguarded.shouldDisconnectGhostWalletConnectonly checks!connecting.set({ connected: true, connecting: false }). A still callsdisconnectTerraWallet()and can drop the live Cosmes WalletConnect singleton. Guard should also skip whenconnected === true(or when a newer epoch already committed). Missing test: connect A → Cancel → connect B → resolve B success → resolve A →disconnectTerraWalletmust not run.TerraWalletModal.handleRetrydoescancelConnection()thenconnect()100ms later. In that windowconnecting === false, so a late A success will disconnect. Usually that cleans a ghost before Retry, but it can still race Retry’s newconnect().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.