bug(web): Terra Classic T&C sign requires Keplr extension — fails on mobile Chrome #9

Closed
opened 2026-08-18 00:20:53 +00:00 by PlasticDigits · 17 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): after landing on the Accept T&C page, usera (Android 16 Chrome) got Keplr extension not found (reporter spelling: “Kepler”). Repro was on ust1cmm.com (reconnect → Legal portal). The same error is expected on any CL8Y property that redirects to https://terms.cl8y.com/sign/terra-classic from mobile Chrome, because the portal requires window.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 (ConnectedTermsGate only redirects). Portal web/src/pages/terra.ts throws when the extension is missing. Closed #1 fixed ADR-036 signArbitrary / 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):

  • Idle copy: “Connect Keplr for Terra Classic.”
  • onSign starts with if (!window.keplr) throw new Error("Keplr extension not found");
  • Then window.keplr.enable(columbus-5), getKey, signArbitrary(chainId, address, message) (ADR-036, #1).
  • Submit goes to POST /api/v1/signatures/wallet with network: "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-terraclassic C1): they must not reimplement ADR-036; they redirect unsigned connected wallets to this portal. So a WC-connected Android Chrome user on dex.cl8y.com will hit the same error after connect is fixed.


Why this is needed

  • Terra Classic retail users are on mobile. Chrome Android cannot install the Keplr extension. The portal’s only signer is that extension.
  • Ecosystem clickwrap is property-scoped (dex.cl8y.com, ust1cmm.com, bridge.cl8y.com, …). Every property inherits this dead-end.
  • In-app Keplr works, but the general public opening sites in Chrome will see a hard error after they already connected a wallet.
  • #1 made extension signing correct; it did not make signing possible without an extension.

Constraints / guardrails

  1. Do not weaken ADR-036 verify in 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).
  2. Do not change the canonical legal message without coordinated Rust + SDK golden tests (api/src/message.rs, packages/cl8y-clickwrap/src/message.ts).
  3. Chain remains columbus-5 / TERRA_CLASSIC. Do not silently retarget Terra 2.0.
  4. Property isolation unchanged: a signature for ust1cmm.com must not satisfy dex.cl8y.com.
  5. No admin tokens / secrets in the portal bundle.
  6. Address binding: pubkey must still re-derive the claimed terra1… account.
  7. Redirect allowlists stay authoritative; do not add open redirects.
  8. Prefer Keplr-documented mobile APIs / WalletConnect signArbitrary-equivalent over inventing a custom envelope.
  9. Keep Telegram / Solana / EVM sign pages unchanged unless sharing a tiny UI helper (idle status / “open in Keplr browser”).
  10. Fail closed: unknown signer ≠ signed.

Relevant files

Area Path
Portal Terra page web/src/pages/terra.ts
Sign shell / UI web/src/signShell.ts, web/src/ui.ts
API Terra verify api/src/verify/terra.rs
Wallet submit api/src/routes/signatures.rs
Message builders api/src/message.rs, packages/cl8y-clickwrap/src/message.ts
SDK / TermsGate packages/cl8y-clickwrap (integrators still only redirect here)
E2E web/e2e/

Integrator DEX gate (context only): cl8y-dex-terraclassic frontend-dapp/src/components/legal/ConnectedTermsGate.tsx.


Pick one (or stage them):

  1. Short term: on missing window.keplr, do not throw a raw error. Show Open in Keplr (universal / keplrwallet: / documented browse-dapp URL with current sign query string) plus copy-link. Idle status should say the Keplr app browser can sign; Chrome cannot use the desktop extension.
  2. Product: add Keplr Mobile / WalletConnect (or Keplr’s documented mobile signArbitrary) so Chrome can complete ADR-036 without a WebView. Must round-trip the existing API verifier.
  3. Do not ask users to “install the Chrome extension” on Android.

Acceptance criteria

  • Android Chrome: opening /sign/terra-classic?property=… never dead-ends on Keplr extension not found without a working next step (Open in Keplr and/or in-page mobile sign).
  • Happy path: user can produce signed_latest: true for (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).
  • Keplr desktop extension path from #1 still works.
  • API still rejects wrong pubkey, wrong property/version, tampered message, bad timestamp.
  • EVM / Telegram / Solana sign flows unchanged.
  • Copy is retail-short (no “ADR-036” in the idle status).

Test plan (functional paths)

  1. Desktop Chrome + Keplr extension: existing #1 happy path (regression).
  2. Android Chrome, no window.keplr: page shows Open-in-Keplr / mobile sign CTA; no uncaught raw exception as the only UI.
  3. Android Chrome → Open in Keplr in-app: sign succeeds; redirect_uri returns; status signed_latest: true.
  4. If WC / mobile signArbitrary ships: Chrome stays in Chrome, approves in Keplr app, status true.
  5. Already signed: getStatus short-circuit still shows success without a second signature.
  6. Property isolation: signature for property A does not satisfy property B.
  7. Mixed-case terra address: still canonicalized / rejected per current rules.
  8. Playwright: mock missing window.keplr asserts CTA; mock signArbitrary still covers desktop path.

Test plan (attack / abuse / hack vectors)

Vector Expectation
Replay sig for another property / version_label / account Reject (message bind)
Submit ADR-036 sig for message A claiming message B Reject
Pubkey for address A, account_id address B Reject
Deep-link / return URL not on portal allowlist No open redirect
Fake window.keplr in page (XSS) CSP + existing verify still required server-side; client must not skip verify
Extremely large signature / pubkey bodies Reject or body limits
Timestamp skew outside window Reject
WC session from a different chain account Address/pubkey mismatch → reject

Verification criteria

  • Manual: Android 16 Chrome against staging or prod portal for a test property (or dex.cl8y.com unsigned account): can complete T&C without a desktop extension, or is given a working Open-in-Keplr path that then succeeds.
  • Manual: desktop Keplr extension still signs.
  • cd api && cargo test ADR-036 tests remain green.
  • Portal e2e / Playwright for missing-extension CTA green.
  • Integrator sites (dex.cl8y.com, ust1cmm.com) no longer strand Android Chrome users on this error after redirect.
## 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 on `ust1cmm.com` (reconnect → Legal portal). The same error is expected on **any** CL8Y property that redirects to `https://terms.cl8y.com/sign/terra-classic` from **mobile Chrome**, because the portal requires `window.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 (`ConnectedTermsGate` only redirects). Portal `web/src/pages/terra.ts` throws when the extension is missing. Closed [#1](https://gitlab.com/PlasticDigits/cl8y-ecosystem-legal/-/issues/1) fixed ADR-036 `signArbitrary` / 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`): - Idle copy: “Connect Keplr for Terra Classic.” - `onSign` starts with `if (!window.keplr) throw new Error("Keplr extension not found");` - Then `window.keplr.enable(columbus-5)`, `getKey`, `signArbitrary(chainId, address, message)` (ADR-036, [#1](https://gitlab.com/PlasticDigits/cl8y-ecosystem-legal/-/issues/1)). - Submit goes to `POST /api/v1/signatures/wallet` with `network: "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-terraclassic` **C1**): they must not reimplement ADR-036; they redirect unsigned connected wallets to this portal. So a WC-connected Android Chrome user on `dex.cl8y.com` will hit the same error after connect is fixed. --- ## Why this is needed - Terra Classic retail users are on **mobile**. Chrome Android cannot install the Keplr **extension**. The portal’s only signer is that extension. - Ecosystem clickwrap is property-scoped (`dex.cl8y.com`, `ust1cmm.com`, `bridge.cl8y.com`, …). Every property inherits this dead-end. - In-app Keplr works, but the general public opening sites in Chrome will see a hard error after they already connected a wallet. - [#1](https://gitlab.com/PlasticDigits/cl8y-ecosystem-legal/-/issues/1) made extension signing correct; it did not make signing possible without an extension. --- ## Constraints / guardrails 1. **Do not weaken ADR-036 verify** in `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). 2. **Do not change the canonical legal message** without coordinated Rust + SDK golden tests (`api/src/message.rs`, `packages/cl8y-clickwrap/src/message.ts`). 3. **Chain remains `columbus-5` / `TERRA_CLASSIC`.** Do not silently retarget Terra 2.0. 4. **Property isolation** unchanged: a signature for `ust1cmm.com` must not satisfy `dex.cl8y.com`. 5. **No admin tokens / secrets in the portal bundle.** 6. **Address binding:** pubkey must still re-derive the claimed `terra1…` account. 7. **Redirect allowlists** stay authoritative; do not add open redirects. 8. Prefer Keplr-documented mobile APIs / WalletConnect signArbitrary-equivalent over inventing a custom envelope. 9. Keep Telegram / Solana / EVM sign pages unchanged unless sharing a tiny UI helper (idle status / “open in Keplr browser”). 10. Fail closed: unknown signer ≠ signed. --- ## Relevant files | Area | Path | |------|------| | Portal Terra page | `web/src/pages/terra.ts` | | Sign shell / UI | `web/src/signShell.ts`, `web/src/ui.ts` | | API Terra verify | `api/src/verify/terra.rs` | | Wallet submit | `api/src/routes/signatures.rs` | | Message builders | `api/src/message.rs`, `packages/cl8y-clickwrap/src/message.ts` | | SDK / TermsGate | `packages/cl8y-clickwrap` (integrators still only redirect here) | | E2E | `web/e2e/` | Integrator DEX gate (context only): `cl8y-dex-terraclassic` `frontend-dapp/src/components/legal/ConnectedTermsGate.tsx`. --- ## Recommended direction Pick one (or stage them): 1. **Short term:** on missing `window.keplr`, do not throw a raw error. Show **Open in Keplr** (universal / `keplrwallet:` / documented browse-dapp URL with current `sign` query string) plus copy-link. Idle status should say the Keplr app browser can sign; Chrome cannot use the desktop extension. 2. **Product:** add **Keplr Mobile / WalletConnect** (or Keplr’s documented mobile `signArbitrary`) so Chrome can complete ADR-036 without a WebView. Must round-trip the existing API verifier. 3. **Do not** ask users to “install the Chrome extension” on Android. --- ## Acceptance criteria - [ ] Android Chrome: opening `/sign/terra-classic?property=…` never dead-ends on `Keplr extension not found` without a working next step (Open in Keplr and/or in-page mobile sign). - [ ] Happy path: user can produce `signed_latest: true` for `(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). - [ ] Keplr desktop extension path from [#1](https://gitlab.com/PlasticDigits/cl8y-ecosystem-legal/-/issues/1) still works. - [ ] API still rejects wrong pubkey, wrong property/version, tampered message, bad timestamp. - [ ] EVM / Telegram / Solana sign flows unchanged. - [ ] Copy is retail-short (no “ADR-036” in the idle status). --- ## Test plan (functional paths) 1. **Desktop Chrome + Keplr extension:** existing #1 happy path (regression). 2. **Android Chrome, no `window.keplr`:** page shows Open-in-Keplr / mobile sign CTA; no uncaught raw exception as the only UI. 3. **Android Chrome → Open in Keplr in-app:** sign succeeds; redirect_uri returns; status `signed_latest: true`. 4. **If WC / mobile signArbitrary ships:** Chrome stays in Chrome, approves in Keplr app, status true. 5. **Already signed:** `getStatus` short-circuit still shows success without a second signature. 6. **Property isolation:** signature for property A does not satisfy property B. 7. **Mixed-case terra address:** still canonicalized / rejected per current rules. 8. **Playwright:** mock missing `window.keplr` asserts CTA; mock `signArbitrary` still covers desktop path. --- ## Test plan (attack / abuse / hack vectors) | Vector | Expectation | |--------|-------------| | Replay sig for another `property` / `version_label` / account | Reject (message bind) | | Submit ADR-036 sig for message A claiming message B | Reject | | Pubkey for address A, `account_id` address B | Reject | | Deep-link / return URL not on portal allowlist | No open redirect | | Fake `window.keplr` in page (XSS) | CSP + existing verify still required server-side; client must not skip verify | | Extremely large signature / pubkey bodies | Reject or body limits | | Timestamp skew outside window | Reject | | WC session from a different chain account | Address/pubkey mismatch → reject | --- ## Verification criteria - Manual: Android 16 Chrome against staging or prod portal for a **test property** (or `dex.cl8y.com` unsigned account): can complete T&C **without** a desktop extension, or is given a working Open-in-Keplr path that then succeeds. - Manual: desktop Keplr extension still signs. - `cd api && cargo test` ADR-036 tests remain green. - Portal e2e / Playwright for missing-extension CTA green. - Integrator sites (`dex.cl8y.com`, `ust1cmm.com`) no longer strand Android Chrome users on this error after redirect.
PlasticDigits commented 2026-08-18 00:20:54 +00:00 (Migrated from gitlab.com)

marked as related to #1

marked as related to #1
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:02 +00:00 (Migrated from gitlab.com)

Same incident:

Same incident: - DEX Android Chrome connect (Lunc Dash / Galaxy Station / Keplr): https://gitlab.com/PlasticDigits/cl8y-dex-terraclassic/-/work_items/554 - Bridge CONNECT TC: https://gitlab.com/PlasticDigits/cl8y-bridge-monorepo/-/work_items/137
PlasticDigits commented 2026-08-18 00:21:04 +00:00 (Migrated from gitlab.com)

mentioned in issue cl8y-bridge-monorepo#137

mentioned in issue cl8y-bridge-monorepo#137
PlasticDigits commented 2026-08-18 00:25:30 +00:00 (Migrated from gitlab.com)

changed the description

changed the description
PlasticDigits commented 2026-08-18 00:25:34 +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.
leonardocolucci commented 2026-08-18 11:09:39 +00:00 (Migrated from gitlab.com)

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:

  1. ust1cmm.com → Connect → Lunc Dash (Mobile / WalletConnect row) → connected on the same device, no QR involved. Header shows the connected indicator:

connected_header

  1. Accept T&C → 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":

terms_error

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.

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: 1. `ust1cmm.com` → Connect → **Lunc Dash** (Mobile / WalletConnect row) → connected on the same device, no QR involved. Header shows the connected indicator: ![connected_header](/uploads/8ba9e6c995128058bd11eed2e8f2a03a/connected_header.png) 2. Accept T&C → `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"**: ![terms_error](/uploads/39c1164d11acd3779fb4f7470c80806f/terms_error.png) 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.
PlasticDigits commented 2026-08-18 14:41:50 +00:00 (Migrated from gitlab.com)

mentioned in merge request !29

mentioned in merge request !29
PlasticDigits commented 2026-08-18 15:00:42 +00:00 (Migrated from gitlab.com)

mentioned in issue #10

mentioned in issue #10
PlasticDigits commented 2026-08-18 15:00:42 +00:00 (Migrated from gitlab.com)

marked as related to #10

marked as related to #10
PlasticDigits commented 2026-08-18 15:00:50 +00:00 (Migrated from gitlab.com)

Merge verification for !29 (no automerge / not waiting on CI)

Merged via glab mr merge after local sanity check. No merge conflicts — fix/9-terra-mobile-keplr (eb62202) is a fast-forward onto main (008f924). Scroll-to-bottom consent on main is compatible with Terra extraControls (Open in Keplr is visible before consent; e2e helpers already call scrollTermsToBottom).

Acceptance criteria vs #9

Criterion Result
Android Chrome never dead-ends on Keplr extension not found without a next step Met in code — Open in Keplr + Copy link; Connect & sign sets guidance instead of throwing. Playwright missing-window.keplr case asserts this.
Happy path signed_latest from Android Chrome or Keplr in-app (≥1 Chrome-viable path) Met as documented short-term path (Open in Keplr → in-app signArbitrary). Stay-in-Chrome WalletConnect not shipped. Real-device Android/desktop QA was not run in this merge.
Desktop Keplr extension path from #1 Unchanged in code + mock e2e still present. Manual desktop regression not run.
API rejects wrong pubkey / property / tampered message / timestamp No API delta in !29.
EVM / Telegram / Solana unchanged Confirmed (EVM omits extraControls; e2e asserts no Open in Keplr on /sign/evm).
Retail-short copy (no ADR-036 in idle status) Met (unit + e2e).
Deep-link is current portal sign URL, not query redirect_uri Met (origin-bind, javascript: reject, fail-closed).

Problems / leftover work (do not treat #9 as fully field-verified)

  1. CI did not run tests. Pipeline on eb62202 failed immediately with ci_quota_exceeded (all jobs: lint/test/build). This is quota, not a code failure. Local unit tests keplrMobile + signShell + keplrMobileUi: 20/20 passed. Playwright e2e and cargo test were not re-run for this merge.
  2. Manual Android 16 Chrome / desktop Keplr QA still open (unchecked on !29).
  3. UX bug (non-blocking): Connect & sign stays disabled after the missing-Keplr early return because signShell only clears busy in catch, 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

## Merge verification for !29 (no automerge / not waiting on CI) Merged via `glab mr merge` after local sanity check. **No merge conflicts** — `fix/9-terra-mobile-keplr` (`eb62202`) is a fast-forward onto `main` (`008f924`). Scroll-to-bottom consent on `main` is compatible with Terra `extraControls` (Open in Keplr is visible before consent; e2e helpers already call `scrollTermsToBottom`). ### Acceptance criteria vs #9 | Criterion | Result | |-----------|--------| | Android Chrome never dead-ends on `Keplr extension not found` without a next step | **Met in code** — Open in Keplr + Copy link; Connect & sign sets guidance instead of throwing. Playwright missing-`window.keplr` case asserts this. | | Happy path `signed_latest` from Android Chrome **or** Keplr in-app (≥1 Chrome-viable path) | **Met as documented short-term path** (Open in Keplr → in-app `signArbitrary`). Stay-in-Chrome WalletConnect **not** shipped. **Real-device Android/desktop QA was not run in this merge.** | | Desktop Keplr extension path from #1 | **Unchanged** in code + mock e2e still present. Manual desktop regression **not** run. | | API rejects wrong pubkey / property / tampered message / timestamp | **No API delta** in !29. | | EVM / Telegram / Solana unchanged | **Confirmed** (EVM omits `extraControls`; e2e asserts no Open in Keplr on `/sign/evm`). | | Retail-short copy (no ADR-036 in idle status) | **Met** (unit + e2e). | | Deep-link is current portal sign URL, not query `redirect_uri` | **Met** (origin-bind, `javascript:` reject, fail-closed). | ### Problems / leftover work (do not treat #9 as fully field-verified) 1. **CI did not run tests.** Pipeline on `eb62202` failed immediately with `ci_quota_exceeded` (all jobs: lint/test/build). This is quota, not a code failure. Local unit tests `keplrMobile` + `signShell` + `keplrMobileUi`: **20/20 passed**. Playwright e2e and `cargo test` were not re-run for this merge. 2. **Manual Android 16 Chrome / desktop Keplr QA still open** (unchecked on !29). 3. **UX bug (non-blocking):** Connect & sign stays disabled after the missing-Keplr early return because `signShell` only clears `busy` in `catch`, 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
PlasticDigits commented 2026-08-18 15:00:56 +00:00 (Migrated from gitlab.com)

mentioned in commit 56f99d4ac5

mentioned in commit 56f99d4ac5ec5c3cd4129e85f8a90520af09686d
PlasticDigits commented 2026-08-18 15:01:46 +00:00 (Migrated from gitlab.com)

Closing 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.keplr shows Open in Keplr + Copy link instead of a dead-end Keplr extension not found. Remaining work (manual Android/desktop QA, Connect & sign busy flag, stay-in-Chrome WalletConnect) is tracked on #10.

Closing after [!29](https://gitlab.com/PlasticDigits/cl8y-ecosystem-legal/-/merge_requests/11) merged into `main` (`56f99d4`). GitLab did not auto-close from the MR description. The short-term #9 path is in production code: missing `window.keplr` shows Open in Keplr + Copy link instead of a dead-end `Keplr extension not found`. Remaining work (manual Android/desktop QA, Connect & sign `busy` flag, stay-in-Chrome WalletConnect) is tracked on **#10**.
PlasticDigits (Migrated from gitlab.com) closed this issue 2026-08-18 15:01:47 +00:00
PlasticDigits commented 2026-08-18 15:16:13 +00:00 (Migrated from gitlab.com)

mentioned in issue #11

mentioned in issue #11
PlasticDigits commented 2026-08-18 15:16:13 +00:00 (Migrated from gitlab.com)

marked as related to #11

marked as related to #11
PlasticDigits commented 2026-08-26 01:36:09 +00:00 (Migrated from gitlab.com)

mentioned in merge request !30

mentioned in merge request !30
PlasticDigits commented 2026-08-26 01:36:52 +00:00 (Migrated from gitlab.com)

mentioned in merge request !31

mentioned in merge request !31
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-ecosystem-legal#9
No description provided.