bug(web): Terra Classic T&C sign requires Keplr extension — fails on mobile Chrome #9
Labels
No labels
agent:implement
agent:ready
api
bot
bug
ci
enhancement
ready
security
terra-classic
testing
ux
web
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
code/cl8y-ecosystem-legal#9
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): after landing on the Accept T&C page, usera (Android 16 Chrome) got
Keplr extension not found(reporter spelling: “Kepler”). Repro was onust1cmm.com(reconnect → Legal portal). The same error is expected on any CL8Y property that redirects tohttps://terms.cl8y.com/sign/terra-classicfrom mobile Chrome, because the portal requireswindow.keplr.Workaround that works: open the dApp inside the Keplr in-app browser (injected
window.keplr) — confirmed by usera and by userb (iPhone Keplr in-app + Brave).This is not the DEX TermsGate itself (
ConnectedTermsGateonly redirects). Portalweb/src/pages/terra.tsthrows when the extension is missing. Closed #1 fixed ADR-036signArbitrary/ verify and explicitly left WalletConnect / multi-wallet pickers out of scope.Related DEX connect work: https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/work_items/554
Current codebase
Portal Terra Classic sign (
web/src/pages/terra.ts):onSignstarts withif (!window.keplr) throw new Error("Keplr extension not found");window.keplr.enable(columbus-5),getKey,signArbitrary(chainId, address, message)(ADR-036, #1).POST /api/v1/signatures/walletwithnetwork: "TERRA_CLASSIC".There is no WalletConnect, Keplr Mobile deep-link, or in-app-browser fallback on the sign page. Chrome / Firefox / Safari on a phone do not inject
window.keplr.DEX / other properties (
cl8y-dex-terraclassicC1): they must not reimplement ADR-036; they redirect unsigned connected wallets to this portal. So a WC-connected Android Chrome user ondex.cl8y.comwill hit the same error after connect is fixed.Why this is needed
dex.cl8y.com,ust1cmm.com,bridge.cl8y.com, …). Every property inherits this dead-end.Constraints / guardrails
api/src/verify/terra.rs. WalletConnect / Keplr Mobile must still produce a signature the existing verifier accepts (or an explicitly versioned new scheme with tests).api/src/message.rs,packages/cl8y-clickwrap/src/message.ts).columbus-5/TERRA_CLASSIC. Do not silently retarget Terra 2.0.ust1cmm.commust not satisfydex.cl8y.com.terra1…account.Relevant files
web/src/pages/terra.tsweb/src/signShell.ts,web/src/ui.tsapi/src/verify/terra.rsapi/src/routes/signatures.rsapi/src/message.rs,packages/cl8y-clickwrap/src/message.tspackages/cl8y-clickwrap(integrators still only redirect here)web/e2e/Integrator DEX gate (context only):
cl8y-dex-terraclassicfrontend-dapp/src/components/legal/ConnectedTermsGate.tsx.Recommended direction
Pick one (or stage them):
window.keplr, do not throw a raw error. Show Open in Keplr (universal /keplrwallet:/ documented browse-dapp URL with currentsignquery string) plus copy-link. Idle status should say the Keplr app browser can sign; Chrome cannot use the desktop extension.signArbitrary) so Chrome can complete ADR-036 without a WebView. Must round-trip the existing API verifier.Acceptance criteria
/sign/terra-classic?property=…never dead-ends onKeplr extension not foundwithout a working next step (Open in Keplr and/or in-page mobile sign).signed_latest: truefor(property, TERRA_CLASSIC, terra1…)from Android Chrome or from Keplr in-app browser (both must be documented; at least one Chrome-viable path is required).Test plan (functional paths)
window.keplr: page shows Open-in-Keplr / mobile sign CTA; no uncaught raw exception as the only UI.signed_latest: true.getStatusshort-circuit still shows success without a second signature.window.keplrasserts CTA; mocksignArbitrarystill covers desktop path.Test plan (attack / abuse / hack vectors)
property/version_label/ accountaccount_idaddress Bwindow.keplrin page (XSS)Verification criteria
dex.cl8y.comunsigned account): can complete T&C without a desktop extension, or is given a working Open-in-Keplr path that then succeeds.cd api && cargo testADR-036 tests remain green.dex.cl8y.com,ust1cmm.com) no longer strand Android Chrome users on this error after redirect.marked as related to #1
mentioned in issue cl8y-dex-terraclassic#554
Same incident:
mentioned in issue cl8y-bridge-monorepo#137
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.Independent confirmation from the community reporter behind cl8y-dex-terraclassic#519 (Android, Chrome, Lunc Dash) — screen recording received 2026-08-18 ~08:00 UTC, matches the "usera" repro exactly:
ust1cmm.com→ Connect → Lunc Dash (Mobile / WalletConnect row) → connected on the same device, no QR involved. Header shows the connected indicator:terms.cl8y.com/sign/terra-classic→ tick consent → Połącz i podpisz (Connect and sign) →Błąd: rozszerzenie Keplr nie zostało znalezione= "Error: Keplr extension not found":So this is a second device confirming both halves of the working-control note: ustr-cmm same-device pairing works, and the Legal portal signer is the dead end. I've told the reporter the fix is tracked here; they're willing to retest once a non-extension sign path ships if that helps QA.
mentioned in merge request !29
mentioned in issue #10
marked as related to #10
Merge verification for !29 (no automerge / not waiting on CI)
Merged via
glab mr mergeafter local sanity check. No merge conflicts —fix/9-terra-mobile-keplr(eb62202) is a fast-forward ontomain(008f924). Scroll-to-bottom consent onmainis compatible with TerraextraControls(Open in Keplr is visible before consent; e2e helpers already callscrollTermsToBottom).Acceptance criteria vs #9
Keplr extension not foundwithout a next stepwindow.keplrcase asserts this.signed_latestfrom Android Chrome or Keplr in-app (≥1 Chrome-viable path)signArbitrary). Stay-in-Chrome WalletConnect not shipped. Real-device Android/desktop QA was not run in this merge.extraControls; e2e asserts no Open in Keplr on/sign/evm).redirect_urijavascript:reject, fail-closed).Problems / leftover work (do not treat #9 as fully field-verified)
eb62202failed immediately withci_quota_exceeded(all jobs: lint/test/build). This is quota, not a code failure. Local unit testskeplrMobile+signShell+keplrMobileUi: 20/20 passed. Playwright e2e andcargo testwere not re-run for this merge.signShellonly clearsbusyincatch, and Terra now returns instead of throwing. Open in Keplr still works.Tracked as new issue #10: https://gitlab.com/PlasticDigits/cl8y-ecosystem-legal/-/issues/10
mentioned in commit
56f99d4ac5Closing after !29 merged into
main(56f99d4). GitLab did not auto-close from the MR description.The short-term #9 path is in production code: missing
window.keplrshows Open in Keplr + Copy link instead of a dead-endKeplr extension not found. Remaining work (manual Android/desktop QA, Connect & signbusyflag, stay-in-Chrome WalletConnect) is tracked on #10.mentioned in issue #11
marked as related to #11
mentioned in merge request !30
mentioned in merge request !31