deviant/shells/app
Local Dev 31273686a5 feat(anthemus.dex): live cross-nav + BCH/USD/EUR chips + sequential PIN
Three fixes in one turn.

CROSS-NAV — Artemision · Katalogos · Listing · Swap · Deposit all
now actually land somewhere.
- New deep-link protocol: hash form (#tab=… &sub=… &view=…) instead
  of query string. The BNS gateway strips ?query from path-key
  resolution so `wallet/?tab=agora` falls back to the name-root
  landing; hash never hits the gateway.
- src/deepLink.ts::deepLinkParam(name) reads hash first, query second.
  All wallet-side sniffers switched to it (App.tsx tab · AgoraScreen
  panel · AnthemusScreen view · ArtemisionScreen sub · KatalogosPanel
  open=publish).
- ExchangePanel takes a `routes` + `linkTarget` prop; AnthemusKiosk
  populates it with wallet URLs opening in a new tab
  (deviant.x/wallet/#tab=…). Wallet-embedded ExchangePanel keeps
  the old hash-only defaults.
- KatalogosPanel opens the Pinax registration modal automatically
  when the deep link carries open=publish, so the Listing link lands
  on the "add asset" form instead of the readonly directory.

ASSET CHIPS — Favorites/All/Fiat replaced with ★ · BCH · USD · EUR
per user request (Binance-style compact chips).
- Single-select with click-again-to-clear; no active chip = show all.
- ★ chip is icon-only, gold when active; currency chips filter pairs
  whose base OR quote ticker matches. Counts render next to each
  chip and update as favorites change.
- Persists to deviant.anthemus.assetChip; retired the assetTab key.

PIN ENTRY — two pads on one screen is fixed. Set-a-PIN now walks
choose → confirm sequentially: single pad on screen, "Next" advances
after ≥ 4 digits, "Back" returns to edit the first without clearing.
Same PinPad component, two-step state (pinStep) inside Onboarding.

ASSET-BASE FIX — the BNS gateway injects `<base href="/bns/<name>/">`
into every served HTML, which broke the subpath deploy: assets at
`/bns/deviant.x/wallet/assets/…` were resolved against the name root
and 404'd. Now building with DEVIANT_BASE=/bns/deviant.x/wallet/ so
all asset paths are absolute — the gateway's injected base becomes
irrelevant. Cross-bucket loads (anthemus.dex → wallet's assets)
work by design because the origin is the same.

Deployed to bns/deviant.x/wallet/ + bns/deviant.x/anthemus/. Verified
end to end: wallet boots at deviant.x/wallet/, kiosk fires at
anthemus.dex/, chips filter correctly (USD→2 rows, ★→favorites only),
PIN flow shows one pad at a time.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
2026-09-19 21:38:48 +02:00
..
android
patches
public feat(wallet): LGPL §4(a)/(b)/(c) attribution UI for WizardConnect 2026-09-06 01:47:47 +02:00
src feat(anthemus.dex): live cross-nav + BCH/USD/EUR chips + sequential PIN 2026-09-19 21:38:48 +02:00
test feat(keystore-native): port CapacitorKeyStore to 0083 all-in-one multi-account model 2026-08-31 13:14:03 +02:00
.env.example
asm.html
BETA_TESTING.md
capacitor.config.ts
DEPLOY.md
index.html feat(anthemus.dex): serve DEX-only kiosk at root — no wallet chrome 2026-09-16 01:02:20 +02:00
NATIVE_BUILD.md
package-lock.json
package.json
README.md
redeploy.sh feat(artemision): auto-prepare a vout-0 UTXO on the wall when genesis needs one 2026-09-02 00:23:43 +02:00
tsconfig.json
vite.config.ts app: move hosting to silentmode.st/apps/deviant + BNS canonical addresses 2026-08-30 10:37:16 +02:00
vitest.config.ts
WALLET-COORDINATION.md feat(wallet): bulk-import wallets from encrypted keystore 2026-09-16 00:22:14 +02:00

shells/app/ — Deviant wallet shell (Capacitor + Vite + React)

The production wallet shell: the four-tab CosmoGenesis IA over the existing shared TypeScript core, running in-process, client-side, non-custodially in the WebView (desktop browser = same engine class — build/verify here first). No core fork, no nodejs-mobile, no IPC bridge — proven viable in snapshot 0044 via the noble crypto shim (ADR-0023). Full brief: ../../design/CAPACITOR_HANDOFF.md.

Status — chipnet beta (snapshot 0102)

The shell is a feature-complete, installable chipnet beta (web/PWA). Onboarding, real keystores (web + native), live balance, swap broadcast, token import, sweep, and activity all work; production vite build is green and a 17-test vitest suite covers keystore/registry/safety. See BETA_TESTING.md (tester runbook) and NATIVE_BUILD.md (device build). Remaining ⬜ items are device-only or post-beta.

Piece State
vite.config.ts (node polyfills, @core/@design, noble shim default, esnext, code-split manualChunks) ✅ dev + vite build green, no chunk-size warning
src/core/wallet.ts thin client ✅ session, balance, swap plan→execute (real broadcast), BCH send, token register, history
KeyStore — WebKeyStore (AES-GCM/PBKDF2 vault) + CapacitorKeyStore (Keychain/Keystore + biometric) ✅ runtime-selected via Capacitor.isNativePlatform(); created wallets restore from their own seed (R-017 fixed)
Token registry — LocalStorageTokenRegistry ✅ persists across sessions; chipnet ASM/ASM2 auto-seeded
Onboarding (create/restore/PIN) + loading splash + Manifesto ✅ phone-framed tap-to-enter splash; manifesto carries to welcome
CosmoGenesis theme + src/shell.css + PWA (manifest, sw.js, icon) ✅ installable on Android/desktop Chrome
Beta safety — buildInfo.ts + BetaBanner ✅ mainnet structurally absent; persistent banner
Main / Assets / Artemision / Apps / Settings tabs ✅ built (Artemision create wizard; genesis broadcast ⬜)
Swap (Builder → live quote → broadcast) ✅ planSwap/executeSwap on chipnet
Receive (real addr + QR) / Send (BCH broadcast) / Activity / Sweep / Token import ✅ chipnet
Native iOS/Android packages (cap add), camera QR scan, live WalletConnect/CashConnect, genesis broadcast ⬜ device-only / post-beta

Run

npm install            # core deps (mainnet-js/cashscript/libauth) resolve from repo root
npm run dev            # Vite dev server — noble shim crypto (ADR-0023) by default
npm run build          # production bundle (noble shim; esnext target)
USE_WASM=1 npm run dev # opt back into raw libauth WASM (dev only; it has a top-level await)

Crypto: the bundle replaces libauth's WASM crypto with the pure-JS @noble shim by default (ADR-0023) — no WASM, no top-level await, bundles cleanly and runs on any engine. The core is imported from the repo's compiled dist/ via @core; run npm run build at the repo root first if dist/ is stale.