Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
99980f5
fix(migration): prompt for wallet passwords before completing migration
lklimek Jul 14, 2026
f99630b
fix(migration): free the password prompt from the SPV overlay, add a …
lklimek Jul 14, 2026
03d4c31
Merge branch 'fix/migration-prompt-ux' into feat/migration-password-p…
lklimek Jul 14, 2026
8c6a96a
wip(migration): headless fail-fast, legacy read-only, registration si…
lklimek Jul 14, 2026
5873570
fix(shielded): gate fund-moving shielded tasks at the backend chokepoint
lklimek Jul 14, 2026
0362aa0
fix(dashpay): stop erasing accepted accounts, double-submits and sile…
lklimek Jul 14, 2026
8614c6d
fix(wallet): report a corrupted wallet envelope as damage, not a wron…
lklimek Jul 14, 2026
f59c81c
fix(dashpay): preserve saved contact details and keep paid actions gu…
lklimek Jul 14, 2026
af39624
fix(wallet): unlock a cold-booted protected wallet with its correct p…
lklimek Jul 14, 2026
b3e0057
fix(ui): block input outside a non-dismissible modal prompt
lklimek Jul 14, 2026
dd347ba
fix(migration): keep wallet work gated while the storage update await…
lklimek Jul 14, 2026
641321b
fix(wallet): collect the redundant legacy seed envelope and stop over…
lklimek Jul 14, 2026
8ea3a14
Merge branch 'fix/dashpay-loss-risks' into integration/review-remedia…
lklimek Jul 14, 2026
37c6813
Merge branch 'fix/shielded-chokepoint' into integration/review-remedi…
lklimek Jul 14, 2026
bf5fa3d
Merge branch 'fix/migration-v2-hardening' into integration/review-rem…
lklimek Jul 14, 2026
cb4b706
fix(ui): make every passphrase prompt own the interaction surface
lklimek Jul 14, 2026
f191629
fix(migration): scope an unlocked seed to the storage update, not to …
lklimek Jul 14, 2026
e6dcb76
fix(dashpay): release the request guard when a dispatch is refused pr…
lklimek Jul 14, 2026
7ee54c3
test(backend): pin ShieldedTask inside the wallet-touching migration …
lklimek Jul 14, 2026
555014d
fix(ui): state the disabled-tool reason once, as one translation unit
lklimek Jul 14, 2026
355543b
docs: correct the data-deletion promise and record the migration chan…
lklimek Jul 14, 2026
c13d2de
docs(wallet): warn that SecretLease::lease() refcounts per call, not …
lklimek Jul 14, 2026
ee2aed5
test(ui): prove the secret prompt's transition-frame click-through
lklimek Jul 15, 2026
3e69b2f
fix(backend): refuse unavailable shielded ops early and scope DashPay…
lklimek Jul 15, 2026
7de49aa
fix(ui): drop the transition-frame click when a passphrase prompt act…
lklimek Jul 15, 2026
3591ea8
test(ui): pin passphrase activation wiring in the real AppState updat…
lklimek Jul 15, 2026
d16cb98
fix(wallets): keep dialogs open on trigger clicks
lklimek Jul 15, 2026
1743f7e
build(deps): bump platform to PR3968 tip (d18020f5), pulls in the Ass…
lklimek Jul 15, 2026
52678c4
test(ui): make the opening-click regression test exercise the real guard
lklimek Jul 15, 2026
c861b7a
fix(contracts): don't panic when contracts can't load on Update Contr…
lklimek Jul 15, 2026
551315f
fix(dashpay): accept all integer encodings for contact-request key in…
lklimek Jul 15, 2026
f99c1e0
fix(mcp): hydrate saved wallets before wallet-facing tools read them
lklimek Jul 15, 2026
a40f16a
fix(ui): stop the opening click from immediately cancelling confirmat…
lklimek Jul 15, 2026
6aa8fac
fix(ui): wire missing identity navigation and fix stale post-refresh …
lklimek Jul 15, 2026
82a96ae
fix(backend): stop silent hangs and panics in backend tasks (HANG-CLA…
lklimek Jul 15, 2026
9f64fd5
docs(user-stories): drop transient review-ID citation from UX-001
lklimek Jul 15, 2026
ffa7ea0
fix(app): stop migration frame race and preserve vote eligibility acr…
lklimek Jul 15, 2026
0fda1f6
fix(dashpay): make contact-request decline/cancel idempotent
lklimek Jul 15, 2026
68a2090
fix(wallet): fail Clear-Database safely and hydrate legacy wallets fo…
lklimek Jul 15, 2026
b633a52
fix(app): correlate task results to their originating operation
lklimek Jul 15, 2026
519690e
fix(wallet): also wipe identity private keys on Clear Database (SEC-001)
lklimek Jul 15, 2026
ac69d8b
fix(wallet): report partial failures when Clear Database can't delete…
lklimek Jul 15, 2026
9c9bf1f
test(dashpay): accept both decrypt-failure variants in unreadable-pri…
lklimek Jul 15, 2026
533d121
test(contracts): isolate update_contract_screen degrade test from sha…
lklimek Jul 15, 2026
feb2282
fix(wallet): report Clear-Database failure when the identity index ca…
lklimek Jul 15, 2026
8ba5cdb
fix(ui): add Back navigation to the Manage Keys screen (dead-end lock…
lklimek Jul 15, 2026
4c0a1e6
fix(ui): show fee estimate and total before sending Dash (SND-005)
lklimek Jul 15, 2026
6e094f6
fix(dashpay): report the correct cause when Add Contact can't resolve…
lklimek Jul 15, 2026
207dad9
docs: correct SND-005 fee-estimate criterion to match inline pre-send…
lklimek Jul 15, 2026
420198a
fix(ui): guard reusable modal components against opening-frame dismis…
lklimek Jul 15, 2026
3fda14d
fix(ui): guard screen-level popups against opening-frame dismiss (NEW…
lklimek Jul 15, 2026
3132c47
fix(dashpay): show payment-history amount in DASH, not raw duffs (NEW…
lklimek Jul 15, 2026
1896ac7
fix(wallets): confirm single-key removal and refresh asset locks afte…
lklimek Jul 15, 2026
c22a508
fix(wallets): restore password-modal focus without leaking background…
lklimek Jul 16, 2026
e606874
feat(migration): gate startup migration on a minimum saved-data version
lklimek Jul 16, 2026
6d625ac
test(migration): cover the too-new fail-fast and upper-accept boundary
lklimek Jul 16, 2026
c7ebd8a
feat(settings): add developer-only Wipe Platform Data control (NEW-006)
lklimek Jul 16, 2026
ef3d5c4
feat(contacts): add View Profile action to Identity Hub contacts (NEW…
lklimek Jul 16, 2026
c72658d
fix(wallet): fail-closed on identity-key wipe and surface Clear-Datab…
lklimek Jul 16, 2026
aeb81f8
test: serialize DASH_EVO_DATA_DIR mutation with one shared lock
lklimek Jul 16, 2026
3e5e33e
fix(ui): give each modal a unique guard id so popups don't dismiss ea…
lklimek Jul 16, 2026
9bc21d3
fix(ui): move Wipe Platform Data beside its sibling network controls …
lklimek Jul 16, 2026
3b766b0
fix(platform): keep cause-less transition results unconfirmed (#897)
lklimek Jul 16, 2026
0e79a89
docs(qa): PR892 user-story QA campaign — full retest record (175/175 …
lklimek Jul 16, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -36,3 +36,6 @@ explorer.log
.gitaipconfig
.claude/worktrees
.codex/

# QA scenario screenshots — archived to /data/artifacts, not tracked in git
docs/ai-design/*/scenarios/screenshots/
33 changes: 33 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,22 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).

### Changed

- **The first launch after an upgrade asks for each password-protected wallet's
password**: the app moves your wallets into a new storage format on that first
launch, and it needs each protected wallet's password to finish the move for
that wallet. You are asked once per wallet, one at a time. If you don't have a
password to hand, you can skip that wallet: it stays locked, no coins are lost,
and its move finishes the next time you unlock it with its password. The
password is used for the update and is not kept unlocked afterwards.

- **The previous version's database is kept on this device as a read-only
recovery copy**: it is never written to, and it is no longer erased by "Clear
Database" or "Remove Wallet". Those actions remove the data *this* version
uses; the older recovery database remains and may still contain wallet recovery
data, which both confirmation dialogs now say before you confirm. Because that
database is read-only, the "Clear Platform Addresses" developer tool is
unavailable, and says why.

- **Masternode and evonode identities no longer appear in the Identity Hub or
Identities picker**: they now live exclusively on the new Masternodes tab,
so you're never offered actions (like registering a username) that don't
Expand Down Expand Up @@ -164,6 +180,23 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).

### Fixed

- **Submitted Platform actions are no longer reported as rejected when only
confirmation failed**: if a state transition was broadcast but its result
could not be confirmed, the app now tells you to check whether it completed
before trying again instead of showing an unsafe rejection-and-retry message.

- **Shielded actions now say when they are unavailable instead of failing
obscurely**: if shielding, sending, or withdrawing shielded funds is not
available on your network yet, the app says so and points you at a regular
payment, rather than starting the action and failing part-way through.

- **DashPay contact details and request actions are protected from accidental loss or duplicate
fees**: declining, cancelling, unhiding, or renaming a contact now preserves every unrelated
encrypted detail. If another client saved details this app cannot read, the app offers a clear,
confirmed replacement path instead of silently erasing them or leaving the contact permanently
hidden. Switching Identity Hub tabs also keeps paid request actions disabled until their original
task finishes.

- **Your settings and scheduled votes now survive an upgrade**: upgrading from an
earlier version no longer starts the app with a blank configuration. The first
launch after the upgrade brings across your selected network, start screen,
Expand Down
1 change: 1 addition & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ scripts/safe-cargo.sh +nightly fmt --all
* **i18n-ready strings**: All user-facing strings (labels, messages, tooltips, errors) must be simple, complete sentences. Avoid concatenating fragments, positional assumptions, or grammar that breaks in other languages. Each string should be extractable as a single translation unit with named placeholders for dynamic values and no logic in the text itself. Current code uses standard Rust format specifiers (`{name}`, `{max}`). When i18n extraction happens later, these will become Fluent-style placeholders (`{ $name }`, `{ $max }`).
* **Never parse error strings** to extract information. Always use the typed error chain (downcast, match on variants, access structured fields). If no typed variant exists for the information you need, define a new `TaskError` variant or extend the existing error type. String parsing is fragile, breaks on message changes, and bypasses the type system.
* **Validation placement**: Pure input validation (format, length, character sets) lives in `model/` as stateless functions — single source of truth, unit-testable, no dependencies on `AppContext` or `Sdk`. Backend tasks are the authoritative enforcement layer: they call model validators for format checks AND perform stateful validation that requires network or database (existence checks, uniqueness, business rules). UI screens may call model validators for instant user feedback, but must never implement their own validation logic — always delegate to the model function.
* **Never commit secrets.** Never put plaintext recovery phrases (BIP39 mnemonics), private keys, passwords, seeds, or API tokens anywhere in the repository — not in source, tests, fixtures, or documentation (including QA notes, design docs, and `docs/ai-design/**`). Refer to wallets and keys by name or public identifier only; import real secrets from the operator's secure store at runtime, never by pasting them into a file. A secret committed even once persists in git history after removal, so any exposed secret must be treated as compromised and rotated.

### DET Module Placement Policy

Expand Down
Loading
Loading