Skip to content

Release v1.2.10#70

Open
BitHighlander wants to merge 23 commits intomasterfrom
release/1.2.10
Open

Release v1.2.10#70
BitHighlander wants to merge 23 commits intomasterfrom
release/1.2.10

Conversation

@BitHighlander
Copy link
Copy Markdown
Collaborator

Summary

  • Zcash deshielding — Orchard → transparent (t-address) deshield transactions
  • Mobile pairing — QR-based pairing via vault.keepkey.com relay
  • CI dual-arch macOS — ARM64 + Intel builds from single runner (binary swap + node-hid prebuild swap)
  • Fiat/locale settings — user-configurable currency and number formatting
  • CSV/report fixes — dead click fix, tx history API rename, KeepKey CSV export
  • Windows build fix — nested node_modules stripping + tar --force-local

Notable changes

CI/Build

  • macOS builds produce both ARM64 and x86_64 artifacts from a single ARM64 runner
  • x64 variant created by swapping Electrobun core binaries + node-hid prebuilds
  • Architecture verification gate prevents mislabeled DMGs
  • make sign-release signs + notarizes + uploads both architectures
  • zcash-cli excluded from Intel builds (Zcash shielded not supported)

Zcash

  • Deshield from Orchard shielded pool to transparent t-address
  • Progress channel for real-time UI updates during proof generation

Mobile

  • QR-code pairing with KeepKey mobile app via relay server
  • 15-minute expiring codes, public keys only

Known limitations (v1.2.10)

  • Intel Mac: no Zcash shielded support (zcash-cli not cross-compiled)
  • Intel Mac: HID transport via prebuild swap (not natively built)

Test plan

  • ARM64 macOS: full device lifecycle (connect, sign, firmware update)
  • Intel macOS: device connect via WebUSB, firmware update via HID
  • Linux: AppImage launch + device connect
  • Zcash deshield: Orchard → transparent with valid t-address
  • Mobile pairing: scan QR, verify addresses match
  • CSV export: CoinTracker + ZenLedger formats
  • Fiat settings: change currency, verify formatting

BitHighlander and others added 22 commits March 23, 2026 21:04
…ce-local

Two Windows build fixes:

1. collect-externals.ts: strip node_modules from file:-linked packages
   after copying to staging. Prevents Inno Setup MAX_PATH failures when
   npm/bun installs transitive deps inside source dirs (e.g.
   modules/proto-tx-builder/node_modules/).

2. patch-electrobun.sh: add --force-local to tar extraction command.
   Windows tar interprets "C:" in paths as a remote host, causing
   electrobun CLI download to fail.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
fix: Windows build — strip nested node_modules + tar --force-local
Two bugs:
1. Frontend catch {} silently swallowed errors — now shows error message
2. Backend threw when 0 transactions had timestamps, which is the common
   case for fresh reports. Removed the guard — empty CSV with headers is
   better than a silent failure.
fix: CSV report exports were dead clicks
CoinTracker/ZenLedger CSVs are tax-specific (transactions only) — empty
when Pioneer returns no tx history. Added "KeepKey CSV" option that uses
the existing reportToCsv() function to export ALL report sections:
device info, chain balances, tokens, xpubs, addresses, and transactions.
… load

Two root causes:
1. Vault called GetTxHistory but Pioneer's operationId is GetTransactionHistory.
   Swagger client returned undefined, parsed as empty array. Zero errors.
2. Pioneer's tx history is async — first call triggers background Blockbook
   fetch and returns { transactions: [], loading: true }. Vault never retried.

Fix: correct method name + poll up to 3 times (5s apart) when Pioneer
indicates loading/cache-miss.
fix: transaction history empty — wrong Pioneer API method + missing retry
Enable unshielding from the Orchard pool to transparent t1/t3 addresses.
No firmware changes needed — device signs Orchard spends with RedPallas
(same as shielded send), transparent outputs require no device signatures.

Sidecar: build_deshield_pczt + finalize_deshield IPC commands, transparent
address decoding (P2PKH/P2SH), hybrid v5 tx serialization with transparent
outputs. Backend: zcash-deshield.ts tx builder, zcashDeshieldZec RPC method.
Frontend: "Unshield to Transparent" section in Privacy tab with address
validation, amount input, max button, and progress feedback.
…hield

1. Base58Check checksum verification in transparent address decoder —
   rejects typo'd t1/t3 addresses before building the output script,
   preventing funds from being sent to invalid addresses.

2. Deshield Max button now uses ZIP-317 fee estimation based on actual
   unspent note count instead of hardcoded 10000 zatoshis. Reads
   notes_unspent from balance response and computes
   5000 * max(2, max(n_spends, 1) + 1).

3. Separate deshield-progress RPC message channel so deshield stage
   transitions don't leak into the shield UI state. Added dedicated
   useEffect listener that updates deshieldStep/deshieldResult.
feat: add Zcash deshielding (Orchard → transparent)
Desktop vault derives all pubkeys from the connected KeepKey, POSTs
them to vault.keepkey.com/api/pairing, and displays a QR code + 8-char
code for the mobile app to scan. Pubkey format matches Pioneer SDK
expectations (addressNList, context, path, available_scripts_types).

Also adds a Mobile panel (phone icon in TopNav) with an App Store QR
code linking to https://apps.apple.com/us/app/keepkey-mobile/id6755204956,
a "Pair Device" button, and feature overview.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
feat: mobile pairing + App Store QR panel
Replace all hardcoded USD/en-US formatting with the user's chosen
currency and locale from FiatProvider. Removes legacy formatUsd(),
updates AnimatedUsd to use fiat symbol, fixes i18n strings that
hardcoded "$0.00 USD", and adds browser language auto-detection on
first launch.
…review restored

1. Reports: stored values are USD — keep USD currency label, only use
   user's number_locale for digit separators (no relabeling bug).
2. AnimatedUsd: replace brittle separator guessing with CountUp's
   formattingFn backed by Intl.NumberFormat. Correctly handles fr-FR
   spaces, pl-PL suffix symbols, de-CH apostrophes, and 0-decimal
   currencies (JPY/KRW/HUF).
3. SendForm: zero preview now falls back to fmt(0) instead of
   fmtCompact(0) which returns '' for zero values.
The x86_64 DMG shipped ARM64 binaries because build-intel used
arch -x86_64 on ARM64-only Bun — Rosetta can't force a native
binary to produce cross-arch output.

CI:
- Add macos-14 (ARM64) and macos-13 (Intel) runners to build matrix
- Build zcash-cli sidecar on macOS runners (Rust pre-installed)
- Verify binary architecture post-build (lipo -archs on launcher+bun)
- Create unsigned DMGs in CI for testing
- Generate combined SHA256SUMS in release job

Makefile:
- Add verify-arch target (now a dependency of dmg)
- Deprecate build-intel/build-signed-intel with clear explanation
- Add sign-release: downloads CI artifacts, signs both archs, uploads
- Add upload-all-dmgs convenience target
… stale/missing artifacts

Three review fixes:

1. _sign-one-dmg now re-packs the signed .app into a tar.zst so auto-update
   payloads on the release are signed, not just the DMGs.
   sign-release uploads both DMGs and signed tar.zst files.

2. build-intel deprecation message corrected: references release/* or v* tag
   (not develop) since only those trigger the draft release job.

3. sign-release now: verifies the draft release exists before starting, cleans
   stale DMGs/tar.zst from artifacts/ before signing, fails hard if zero CI
   artifacts were downloaded, and verifies at least one DMG was produced.
zcash-cli uses prost-build which requires the protoc compiler.
GitHub macOS runners don't include it by default.
Electrobun's build tooling is ARM64-only, so we can't build natively
on Intel CI runners. Instead, build on ARM64 (macos-14) then create
the x64 variant by downloading pre-built x64 Electrobun core binaries
from GitHub and swapping them into the app bundle.

- Remove macos-15-intel matrix entry (Electrobun can't run there)
- Single macOS runner produces both arm64 and x64 artifacts
- Downloads electrobun-core-darwin-x64.tar.gz matching installed version
- Swaps launcher, bun, libNativeWrapper.dylib, libasar.dylib
- Removes zcash-cli from x64 bundle (not supported on Intel)
- Verifies x86_64 architecture before creating DMG
fix: CI macOS dual-arch builds + architecture verification
…mware updates)

node-hid HID-darwin-x64 prebuild exists in the npm package but
collect-externals strips it during ARM64 builds. The x64 variant
needs it for firmware updates, bootloader recovery, and OOB setup.
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