feat(frontend): storage consent that stops idle WalletConnect pulse and Coinbase CCA #200

Open
PlasticDigits wants to merge 1 commit from issue/165 into main

Summary

Implements bridge SPA scope for #165: first-party storage notice (Accept / Refuse / Manage), shared cl8y-storage-consent schema, idle fail-closed wagmi (no WC/Coinbase chunk until allow/JIT), Terra WC auto-reconnect gate, JIT prompts on EVM/Terra connect, Manage → Refuse clears third-party wallet keys, footer Storage preferences, INV-FE-STORAGE-CONSENT-1 + agent skill.

Fixes #165 (bridge repo only; DEX / CL8Y-web / legal / voting remain sibling PRs per bundle spec).

Acceptance criteria (bridge)

AC Status
AC1 Cold visit: no pulse/CCA/AppKit until Accept/JIT; banner when undecided Done — WagmiConsentProvider + dynamic wagmiOptionalConnectors
AC2 Refuse persists + AC1 on reload Done — refuseOptionalThirdParty
AC3 Accept restores WC/Coinbase path Done
AC4 Injected EVM/Terra after Refuse Done — injected-only wagmi; Terra extension reconnect
AC5 JIT WC/Coinbase (cancel/confirm) Done — StorageJitPrompt + gated EVM rows
AC6 DEX WC auto-reconnect Out of scope (sibling repo)
AC7 CL8Y-web fonts/WC Out of scope
AC8 Legal Telegram script Out of scope
AC9 Invalid JSON / query bypass Done — parseStorageConsentJson fail-closed
AC10 Clickwrap unchanged Done — separate record
AC11 Voting Out of scope
AC12 Docs/skills Done — invariants, frontend.md, skill

Validation

  • npm run build (packages/frontend) — pass
  • Vitest: storageConsent.test.ts, wagmi.consent.test.ts, walletConnectForeground.test.ts — pass
  • Playwright e2e/storage-consent.spec.ts — not run here (headless Chromium missing libnspr4 on worker); CI should run with E2E_UI_ONLY=1
  • Existing E2E default fixture now calls installStorageConsentAccepted so transfer/wallet specs stay stable

Gaps / follow-up

  • Sibling repos for bundle AC6–AC8, AC11
  • Broader Playwright network matrix (T5–T8) optional in follow-up
  • Manual tri-browser cold-profile check per issue verification criteria
## Summary Implements bridge SPA scope for **#165**: first-party storage notice (Accept / Refuse / Manage), shared `cl8y-storage-consent` schema, idle fail-closed wagmi (no WC/Coinbase chunk until allow/JIT), Terra WC auto-reconnect gate, JIT prompts on EVM/Terra connect, Manage → Refuse clears third-party wallet keys, footer **Storage preferences**, **INV-FE-STORAGE-CONSENT-1** + agent skill. Fixes #165 (bridge repo only; DEX / CL8Y-web / legal / voting remain sibling PRs per bundle spec). ## Acceptance criteria (bridge) | AC | Status | |----|--------| | AC1 Cold visit: no pulse/CCA/AppKit until Accept/JIT; banner when undecided | Done — `WagmiConsentProvider` + dynamic `wagmiOptionalConnectors` | | AC2 Refuse persists + AC1 on reload | Done — `refuseOptionalThirdParty` | | AC3 Accept restores WC/Coinbase path | Done | | AC4 Injected EVM/Terra after Refuse | Done — injected-only wagmi; Terra extension reconnect | | AC5 JIT WC/Coinbase (cancel/confirm) | Done — `StorageJitPrompt` + gated EVM rows | | AC6 DEX WC auto-reconnect | **Out of scope** (sibling repo) | | AC7 CL8Y-web fonts/WC | **Out of scope** | | AC8 Legal Telegram script | **Out of scope** | | AC9 Invalid JSON / query bypass | Done — `parseStorageConsentJson` fail-closed | | AC10 Clickwrap unchanged | Done — separate record | | AC11 Voting | **Out of scope** | | AC12 Docs/skills | Done — invariants, `frontend.md`, skill | ## Validation - `npm run build` (packages/frontend) — pass - Vitest: `storageConsent.test.ts`, `wagmi.consent.test.ts`, `walletConnectForeground.test.ts` — pass - Playwright `e2e/storage-consent.spec.ts` — **not run here** (headless Chromium missing `libnspr4` on worker); CI should run with `E2E_UI_ONLY=1` - Existing E2E default fixture now calls `installStorageConsentAccepted` so transfer/wallet specs stay stable ## Gaps / follow-up - Sibling repos for bundle AC6–AC8, AC11 - Broader Playwright network matrix (T5–T8) optional in follow-up - Manual tri-browser cold-profile check per issue verification criteria
feat(frontend): storage consent idle fail-closed for WC and Coinbase
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/pr/woodpecker Pipeline was successful
acfc50e9d3
Gate optional WalletConnect/Coinbase SDK init behind a first-party notice
and shared cl8y-storage-consent record so cold loads do not hit pulse or CCA
until Accept or per-connector JIT unlock.

Fixes #165

Co-authored-by: Cursor <cursoragent@cursor.com>
Author
Owner

Implement summary

PR reuse: No open related PR on issue/165 / Fixes #165 at implement time — created head issue/165.

Bridge AC1–AC5, AC9–AC10, AC12: landed in this PR (see table in description).

Validation run locally: npm run build; Vitest (storageConsent, wagmi.consent, walletConnectForeground). Playwright storage-consent.spec.ts blocked on worker (libnspr4 for Chromium) — rely on CI E2E_UI_ONLY=1.

Bundle gaps: DEX / CL8Y-web / legal / voting AC6–AC8, AC11 need separate worktrees per issue isolation.

## Implement summary **PR reuse:** No open related PR on `issue/165` / `Fixes #165` at implement time — created head `issue/165`. **Bridge AC1–AC5, AC9–AC10, AC12:** landed in this PR (see table in description). **Validation run locally:** `npm run build`; Vitest (`storageConsent`, `wagmi.consent`, `walletConnectForeground`). Playwright `storage-consent.spec.ts` blocked on worker (`libnspr4` for Chromium) — rely on CI `E2E_UI_ONLY=1`. **Bundle gaps:** DEX / CL8Y-web / legal / voting AC6–AC8, AC11 need separate worktrees per issue isolation.
Author
Owner

drain skip: no occupying job for rebase/fix-pr/CI-wait; remaining continue

drain skip: no occupying job for rebase/fix-pr/CI-wait; remaining continue
Author
Owner

drain skip: default autoland requires tip ACCEPT (#77)

drain skip: default autoland requires tip ACCEPT (#77)
All checks were successful
ci/woodpecker/push/woodpecker Pipeline was successful
ci/woodpecker/pr/woodpecker Pipeline was successful
Required
Details
This pull request can be merged automatically.
You are not authorized to merge this pull request.
View command line instructions

Checkout

From your project repository, check out a new branch and test the changes.
git fetch -u origin issue/165:issue/165
git switch issue/165
Sign in to join this conversation.
No description provided.