fix(frontend): Lunc Dash WalletConnect pair on mobile never lists dex.cl8y.com #1308
Labels
No labels
agent:fix_bugfix
agent:fix_conflicts
agent:fix_security
agent:gap_analysis
agent:implement
agent:implement
agent:implement
agent:open_issues
agent:ready
agent:research
agent:security_audit
agent:verify
architecture
backend
blocker:hybrid
blocker:launch
blocker:limit-orders
blocker:v2
block:log_only
block:security
bug
ci
contracts
correctness
deploy
dev
devops
docs
documentation
duplicate
e2e
enhancement
epic
feature
frontend
functional-completion
gas
good first issue
governance
help wanted
high-risk
hooks
hybrid
indexer
infra
infrastructure
integrators
invalid
launch-blocker
limit-orders
localnet
localterra
low priority
missing-implementation
needs-design
ops
performance
priority
high
priority
medium
product
qa
QA
question
ready
ready
research
scripts
security
security-hardening
smartcontracts
tech-debt
testing
ux
UX
v2
verification
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
code/cl8y-dex-terraclassic#1308
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?
Summary
Same-device Lunc Dash WalletConnect on production
https://dex.cl8y.comdoes not complete. After Connect Wallet → LuncDash on a phone, the Lunc Dash app opens but never shows a pairing prompt. The wallet’s WalletConnect settings list a workingbridge.cl8y.comsession and do not listdex.cl8y.com. Returning to the browser shows a QR code (desktop path). Mobile must pair on the same device without a second scanner.This replaces leftover verify #1279. Device QA found a product defect; leftover-complete is no longer a check-only ticket.
Environment
dex.cl8y.com)https://bridge.cl8y.com(CL8Y Bridge)Current codebase
Lunc Dash is a first-class Connect row and is WalletConnect-only (no extension install row). Same-device mobile pairing was already implemented for #519 / #554 and is treated as shipped in leftover #1279. Live device QA shows that path does not establish a session on
dex.cl8y.com.frontend-dapp/src/components/wallet/connectWalletOptions.tsname: 'LuncDash',WalletName.LUNCDASH,WalletType.WALLETCONNECT. Leap absent.frontend-dapp/src/services/terraclassic/walletConnectPairingHook.tsinstalled frommain.tsxwc:URI → hide Connect list, open React pairing sheet. Otherwise returnsfalseand cosmesQRCodeModalpaints the QR (desktop).frontend-dapp/src/utils/walletConnectPairing.tsisWalletConnectMobileClientbuildLuncDashDeepLinkluncdash://wallet_connect?+ percent-encoding of the entirepayload=<encoded wc:>string. Docs/skills describeluncdash://wallet_connect?payload=<encoded wc:>(a realpayloadquery key). Unit tests currently lock the encoded-blob form.frontend-dapp/src/components/wallet/WalletConnectPairingModal.tsxwc:), Copy pairing link, Cancel. No long-press URI field.frontend-dapp/patches/@goblinhunt+cosmes+0.0.71-ghunt.22.patch__CL8Y_WC_PAIRING_MODAL__. Must not auto-location.hreffrom the asyncdisplay_uricallback (WC-M3).frontend-dapp/src/services/terraclassic/wallet.ts,terraWalletSignTxRaw.tsLUNCDashController; 0-wallet recovery readscosmes.wallet.luncdash.wcSession. Station / LuncDash WC stay on atomicbroadcastTx.bridge.cl8y.com)luncdash://builder in-tree, but the live Bridge session already appears in Lunc Dash WalletConnect settings. Bridge sheet also exposes a read-only pairing URI for long-press copy. Use the live Bridge connect as the working reference, not a blind copy of its helper if it still double-encodes.Playbooks:
skills/AGENTS_FRONTEND_WALLETCONNECT_MOBILE.md(WC-M1–WC-M12),skills/AGENTS_OPS_LUNCDASH_VERIFY.md(L1279). Retail:docs/frontend.md§ WalletConnect same-device mobile. Manual matrix:QA_TEMPLATE.md1.5.Why a new implementation is needed
Leftover #1279 assumed the shipped pairing path still worked and only needed a device check. The check failed:
bridge.cl8y.comand do not showdex.cl8y.com.Until
dex.cl8y.comappears as a WalletConnect session and the header showsterra1…, Swap approve/reject leftover cannot run. This is a pairing bug, not an ops-only leftover.Constraints / guardrails
luncdash://wallet_connect?…/ allowlistluncdash:.payloada parseable query parameter (luncdash://wallet_connect?payload=<encoded wc:>) unless live Lunc Dash + Bridge prove a different working encoding. Fix tests that currently assert the encoded-blob form.window.location.hreffrom the async WalletConnect callback (WC-M3). Open only from a tap (<a href>/ button).Recommended direction
dex.cl8y.comvs livebridge.cl8y.comLunc Dash connect on the same phone: pairing UI (sheet vs QR), deep-link query shape, copy/wc:fallback, WalletConnect client metadata url/name (what the wallet lists), v1 bridge vs v2 relay.buildLuncDashDeepLinkwithURLSearchParams/ Lunc Dash’s documentedpayloadkey. Align href with a URI that the wallet actually consumes; keep Copy pairing link as rawwc:(WC-M4).isWalletConnectMobileClient()is false on a real phone (desktop-site UA / wide viewport), tighten detection so coarse/touch phones still get the sheet (WC-M1) without breaking desktop QR.main. Then re-run QA 1.5.1 / 1.5.1a / 1.5.1b and a small Swap approve or reject (1.5.6 / 1.5.7).Acceptance criteria
https://dex.cl8y.com(not the wallet in-app browser): Connect Wallet → LuncDash shows Open Lunc Dash / Open wallet / Copy pairing link / Cancel. No QR on that mobile path.terra1….dex.cl8y.com(same class of entry as the existingbridge.cl8y.comsession).wc:URI that Lunc Dash can add manually if Open fails.Test plan (happy + edge)
payloadquerybuildLuncDashDeepLink→new URL(href).searchParams.get('payload')is awc:URI (isWalletConnectPairingUri). Reject encoded-blob-only hrefs that have nopayloadkey.isWalletConnectMobileClientstill true for Android/iPhone UA, iPad desktop-UA +maxTouchPoints > 1, coarse + ≤1024. False for desktop mouse + wide viewport. Add a case that would have produced QR on a phone if detection is too strict.installWalletConnectPairingHookreturns true on mobile +wc:; false on junk URI; false on desktop so QR remains.luncdash://wallet_connect?payload=; Copy uses rawwc:; Cancel callscancelConnection.javascript:,data:, randomhttps://still rejected (WC-M5).cosmesPatch127/ #519 assertions: hook delegate, no auto-redirect.make verify-issue-519·make verify-issue-554·VERIFY1279_SKIP_CHILDREN=1 make verify-issue-1279(docs/pre-check only).dex.cl8y.cominside Lunc Dash’s browser still connects (WC-M7); this must not be the only passing path.Test plan (attack, hack, abuse)
wc:,luncdash:, …). Maliciousdisplay_uri/ details fields must not becomejavascript:,data:, or arbitraryhttps://.android/iostemplates that escape the allowlist. Galaxyintent:rules stay WC-M11; Lunc Dash staysluncdash:.wc:URI, not session keys or mnemonics.cl8y_wallet_connectionon dismiss without a real address.dex.cl8y.com), not an attacker origin. Do not take metadata from query params.Verification criteria
make verify-issue-519+make verify-issue-554+ patch SHA check.dex.cl8y.com; headerterra1…). AC5 still passes on desktop. AC7 once.VERIFY1279_IID=1279/VERIFY1279_LEFTOVER_COMPLETE=1must still FAIL if those env flags remain — leftover-complete is never make. Close this issue on device AC, not on Vitest.Out of scope
cl8y-ecosystem-legal).cl8y-agent-control: queued
implementjob8946da10-b5a8-4536-b3d3-d44072aa010e(not executed; no Hetzner VM).Merge of !1310 is going in with the payload-query product fix (
luncdash://wallet_connect?payload=<encoded wc:>). In-repo AC that this MR covers: AC1 sheet (WC-M1), AC4 copywc:, AC5 desktop QR, AC6 cancel/stacking, AC8 terms hint.make verify-issue-1308is pre-check only.Device leftover after Coolify frontend cut (not closed by Vitest):
terra1…dex.cl8y.comFixes #1308on !1310 will close this implement ticket. A leftover issue will be opened for Coolify + QA 1.5.1 / 1.5.1a / 1.5.1b + Swap. Do not reopen #1279.!1310 merged; this implement ticket closed via
Fixes #1308. In-repo AC1/AC4/AC5/AC6/AC8 +make verify-issue-1308passed. Device leftover AC2/AC3/AC7 after Coolify is #1311. Do not reopen #1279.