Skip to content

release: v1.1.2 — passphrase flow, Windows drag, build fixes#14

Merged
BitHighlander merged 14 commits intomasterfrom
release/1.1.2
Mar 9, 2026
Merged

release: v1.1.2 — passphrase flow, Windows drag, build fixes#14
BitHighlander merged 14 commits intomasterfrom
release/1.1.2

Conversation

@BitHighlander
Copy link
Collaborator

Summary

  • Passphrase flow: confirm-on-device state, auto-dismiss overlay, engine auto-triggers PASSPHRASE_REQUEST
  • Settings gear accessible in watch-only/claimed mode
  • Windows: window drag support in TopNav + SplashNav
  • Build: _build folder rename, absolute DMG path fix for xcrun stapler
  • i18n: passphrase confirm strings (10 languages)
  • Version bump to 1.1.2

Test plan

  • macOS: passphrase-protected device → enter passphrase → confirm on device → overlay auto-dismisses
  • macOS: watch-only mode → settings gear opens drawer
  • Windows: title bar drag works on splash and main nav
  • Build: make build-signed completes end-to-end including staple

BitHighlander and others added 13 commits March 4, 2026 12:13
- Add report generator with 7 sections: device info, portfolio overview,
  chain balances, cached pubkeys, token details, BTC detailed report
  (tx history + address flow analysis)
- Add PDF export with pie chart dashboard on first page using pdf-lib
- Fix BTC balance missing from dashboard: GetPortfolio (charts/portfolio)
  returns empty for BTC xpubs, now falls back to GetPortfolioBalances
  (/portfolio) which correctly returns BTC data
- Fix BTC balance missing from report pie chart: pre-fetch BTC balance
  from Pioneer direct API when cached balances show $0
- Add DB fallback for BTC xpubs when BtcAccountManager init fails
- Add ReportDialog UI with JSON/CSV/PDF download buttons
- BTC report uses /utxo/pubkey-info + /tx/history endpoints (not
  the broken /reports/bitcoin endpoint)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
… mutation

- Fix progress bar race condition: capture report ID from first progress
  message instead of waiting for await to resolve (ReportDialog.tsx)
- Prevent CSV formula injection by prefixing dangerous chars in csvCell()
- Clone balances array in generateReport to avoid caller mutation

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
HIGH:
- H1: Scope getReport/deleteReport to current device ID
- H2: Sanitize chain in filenames, append report ID for uniqueness

MEDIUM:
- M1: Generate Pioneer auth key lazily per request (not stale at module load)
- M2: Use Number()+Math.round() instead of parseInt for satoshi values
- M3: Consolidate per-tx detail sections into single table (was 50 sections)
- M4: Optimize pie chart rendering (~4x fewer draw operations)
- M5: Add report pruning (max 50 per device) and LIMIT on list queries
- M6: Handle JSON parse corruption gracefully instead of returning null
- M7: Check reportExists before final save (prevents delete+save race)
- M9: Sanitize error messages to strip auth keys and URLs
- M10: Strengthen CSV formula injection (handle whitespace + newlines)

LOW:
- L1: Discriminated union type for ReportSection (compile-time safety)
- L2: Remove unused type variants from ReportSection
- L3: Wrap Bun.spawn file reveal in try/catch
- L4: Move os/path to top-level imports
- L5: Add LIMIT 20 to report list DB query
- L6: Per-button saving state (not global disable)
- L7: Remove unused useTranslation import
- L8: Add delete confirmation step

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
feat: full report system with PDF export and BTC balance fix
… updates

- Add tax export module (CoinTracker/ZenLedger CSV generation)
- Add firmware version map and upgrade preview component
- Overhaul OOB setup wizard with firmware upgrade preview step
- Expand report dialog with enhanced export options
- Improve spam filter with tighter heuristics
- Update TopNav, Dashboard, DeviceSettingsDrawer, LanguageSelector
- Add security assessment docs (fault injection, findus library)
- Add firmware build docs
- Update i18n locales across all 10 languages

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Restore finite RPC timeout (30 min) instead of Infinity
- Restore CI codesign/notarize guard in electrobun.config.ts
- Restore dereference:true in collect-externals.ts cpSync calls
- Fix Windows build submodule path (proto-tx-builder-vendored → proto-tx-builder)
- Add idempotency guard to cleanupAndQuit (prevents double-cleanup)
- Add max poll count (60 × 5s = 5 min) to reboot poll timer
- Add firmware base64 size limit (10MB) and sanitize report shortId
- Fix O(n^2) base64 conversion in FirmwareDropZone (use chunked approach)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- reports.ts: output full tx.txid in Transaction History and Transaction Details tables
- tax-export.ts: remove cleanTxid() helper (no longer needed since TXIDs aren't truncated)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…s access in watch-only

- Engine: auto-trigger promptPin() on needs_passphrase so device sends PASSPHRASE_REQUEST
- Engine: route applySettings through updateState so passphrase toggle triggers full flow
- PassphraseEntry: show "Confirm on your KeepKey" spinner after submit instead of dismissing
- App: auto-dismiss passphrase overlay when device transitions away from needs_passphrase
- App: show needs_pin/needs_passphrase as splash (not ready) to prevent dashboard flash
- App: enable settings gear + drawer in watch-only/claimed mode
- TopNav: remove watchOnly disable on settings button
- i18n: add passphrase.confirmOnDevice strings (10 languages)
- i18n: enable partialBundledLanguages for graceful fallback
- Bump version to 1.1.2
- Rename build folder to _build (electrobun.config, collect-externals, build-windows-production.ps1)
- Add cross-platform window drag to TopNav (useWindowDrag on Windows, CSS class on Mac)
- Update Makefile verify/clean targets to match _build rename

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
xcrun stapler staple fails with relative paths — it can't resolve
the file. Using $(pwd) ensures all tools (hdiutil, codesign, stapler)
get a consistent absolute path.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- engine-controller: updatePhase = 'idle' (not null) on reboot poll timeout,
  emit disconnected state so UI recovers; reduce poll log frequency to every 30s
- reports: add safeRoundSats() guard for satoshi values near MAX_SAFE_INTEGER,
  validate Pioneer API response shapes, export SECTION_TITLES constants
- tax-export: use shared SECTION_TITLES constants, add row bounds checking
  to prevent silent data corruption on schema changes
- PassphraseEntry: catch onSubmit errors to reset spinner (device disconnect
  during confirm no longer leaves overlay stuck)
- App: suppress PIN auto-show during all firmware phases (not just rebooting)
- index: post-decode firmware size validation (7.5MB binary limit)
@BitHighlander BitHighlander merged commit 0568a6b into master Mar 9, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant