Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
347 commits
Select commit Hold shift + click to select a range
ce676fa
refactor(migration): typed legacy_table_exists_named pre-check (PROJ-…
lklimek May 29, 2026
24ea553
feat(migration): wire WalletStorageNotReady + NFR-4 short-circuit guards
lklimek May 29, 2026
d30f937
docs(migration): paragraph break in sentinel rationale comment
lklimek May 29, 2026
48cdb8a
feat(wallet-storage): version-tag envelopes, row-level length guards,…
lklimek May 29, 2026
6052dc7
feat(single-key): per-key passphrase at import (SEC-002 Option C)
lklimek May 29, 2026
4d235a5
docs(single-key): TODO marker for SEC-002 sign-time prompt follow-up
lklimek May 29, 2026
a90603a
fix(security,qa): redact private bytes in Debug; pin IdentityTask/Das…
lklimek May 29, 2026
686430a
docs(kv-keys): sync key reference with current source
lklimek Jun 1, 2026
2313089
docs(audit): consolidated gap report for PR 860 platform-wallet rewrite
lklimek Jun 1, 2026
42388c4
fix(spv): wire start_spv() to WalletBackend::start()
lklimek Jun 1, 2026
3165f98
fix(spv): start SPV on backend-wiring completion across all callers
lklimek Jun 1, 2026
36f5a98
fix(spv): surface chain-sync start failures to the user
lklimek Jun 1, 2026
8d35933
docs(audit): mark PROJ-001 resolved on-branch in PR 860 gap report
lklimek Jun 1, 2026
549ddfa
fix(wallet): honest error when wallet data is from a newer app version
lklimek Jun 1, 2026
dbd9435
refactor(kv): reseat DetKv on 08b0ed9 per-object KvStore; seam out up…
lklimek Jun 1, 2026
845ff68
fix(kv): honest error on incompatible wallet schema; finish token-bal…
lklimek Jun 1, 2026
fb50c04
chore(deps): bump platform to 35e4a2f (meta_* FK relaxation + token-b…
lklimek Jun 1, 2026
f6119de
refactor(kv): delete det:token_balance cache, read balances from upst…
lklimek Jun 1, 2026
d7ac9a0
refactor(kv): promote identity + dashpay-overlay keys to Identity scope
lklimek Jun 1, 2026
129d54d
docs(kv): sync DetScope/per-object docs with integrated state
lklimek Jun 1, 2026
bd0ed0e
fix(spv): surface SPV sync progress in the UI from live upstream state
lklimek Jun 1, 2026
5a04735
fix(tokens): make "Stop Tracking Balance" truly un-watch the pair
lklimek Jun 1, 2026
7e2553e
fix(spv): return real per-network platform activation height
lklimek Jun 1, 2026
a7327e7
feat(dashpay): derive contact-request expires_at from created_at
lklimek Jun 1, 2026
5ba4554
feat(mcp): structured, paginated platform_withdrawals_get
lklimek Jun 1, 2026
3ac9b3b
fix(dashpay): persist payment status transitions; document check_addr…
lklimek Jun 1, 2026
6c520a3
fix(dashpay): derive contact-request xpub from HD seed (PROJ-004)
lklimek Jun 1, 2026
450214e
fix(dashpay): per-network coin-type on receive-side contact derivatio…
lklimek Jun 1, 2026
fd20978
chore(deps): bump platform deps 35e4a2f → ffdc28b8 (PR #3625 head)
lklimek Jun 2, 2026
419ef95
docs(gap-audit): refresh PR #860 gaps to as-of-450214e5 state
lklimek Jun 2, 2026
9529aed
refactor(dashpay): remove dead add_contact/remove_contact stubs and o…
lklimek Jun 2, 2026
b2febb7
docs(gap-audit): resolve PROJ-002 (removed); re-file PROJ-012 as MEDI…
lklimek Jun 2, 2026
df38b31
docs(rehydration): design UpstreamFromPersisted re-wire onto PR 3692
lklimek Jun 2, 2026
d681173
docs(unlock-ux): requirements + UX spec for sign-time passphrase prompt
lklimek Jun 2, 2026
bf939c6
docs(unlock-ux): Phase 1c test-case specification for sign-time unloc…
lklimek Jun 2, 2026
f35ea7b
chore(deps): switch platform to PR 3692 head ddfa66ed (rehydration)
lklimek Jun 2, 2026
e6c6c01
feat(wallet): seedless wallet load via UpstreamFromPersisted (PROJ-010)
lklimek Jun 2, 2026
c3695bd
docs(unlock-ux): Phase 1d development plan for sign-time unlock prompt
lklimek Jun 2, 2026
2272bae
fix(wallet): inject seed on no-password unlock so hydrated wallets ca…
lklimek Jun 2, 2026
f329e8f
docs(secret-access): JIT SecretAccess chokepoint design (supersedes g…
lklimek Jun 2, 2026
ed06c01
feat(wallet): SecretAccess JIT chokepoint + SecretPrompt seam + DetSi…
lklimek Jun 2, 2026
29b68a0
feat(ui): egui SecretPrompt host + SecretAccess wiring (additive)
lklimek Jun 2, 2026
db03053
refactor(wallet): JIT secret access — retire R1/R2 eager residencies,…
lklimek Jun 2, 2026
29637b0
docs(secret-access): scope R3 completion (Wallet::Open retirement)
lklimek Jun 2, 2026
4545b1e
refactor(dashpay,identity): fetch HD seed JIT in 4 async readers (R3 D1)
lklimek Jun 2, 2026
d04ba87
refactor(wallet): seed-as-parameter for in-model HD derivation (R3 D2)
lklimek Jun 2, 2026
ca14778
feat(wallet): JIT DetPlatformSigner at the 4 SDK fund sites; xpub-onl…
lklimek Jun 2, 2026
62ab8c4
feat(wallet): WalletTask::DeriveKeyForDisplay; route wallets-screen k…
lklimek Jun 2, 2026
832c345
fix(identity): route address-funding signing through DetPlatformSigne…
lklimek Jun 2, 2026
9e778d9
fix(wallet): use WalletLocked for missing HD seed at the 4 fund sites…
lklimek Jun 2, 2026
a61f56b
refactor(wallet): route remaining seed readers through JIT chokepoint…
lklimek Jun 2, 2026
5c05e91
docs(secret-access): design identity-auth xpub persistence (R3 D4b)
lklimek Jun 2, 2026
cc2875a
docs(secret-access): design 1112 identity-key-chooser redesign (R3 D4)
lklimek Jun 2, 2026
c2e50a1
feat(wallet): memoize identity-auth public keys to retire steady-stat…
lklimek Jun 2, 2026
b1c4079
refactor(identity): public-only key chooser, retire seed readers (R3 …
lklimek Jun 2, 2026
f474403
fix(shielded): JIT platform signer for shield transitions; retire leg…
lklimek Jun 2, 2026
2fdbc26
refactor(identity): route every get_resolve caller through the JIT ch…
lklimek Jun 2, 2026
825ae58
test(e2e): migrate platform-receive derivation off the retired parked…
lklimek Jun 2, 2026
06a4b92
feat(wallet)!: drop parked seed from WalletSeed::Open — full JIT secr…
lklimek Jun 2, 2026
e6bd34e
fix(wallet): align JIT secret-prompt copy and docs to present state (…
lklimek Jun 2, 2026
6c7002f
test(wallet): JIT signer parity + secret-access guards; SEC-103 key z…
lklimek Jun 2, 2026
8b3d9d3
style: rustfmt new R3-QA test code
lklimek Jun 2, 2026
43f412c
test(kittest): isolate AppState tests onto a temp data dir (QA-005)
lklimek Jun 3, 2026
2a9161d
test(backend-e2e): drive SDK tasks on a 32MB-stack runtime (PROJ-013)
lklimek Jun 3, 2026
d852ce9
refactor(dashpay): classify add-contact errors by typed variant, not …
lklimek Jun 3, 2026
f39b085
docs: document PR #860 wallet migration gaps (PROJ-018..021)
lklimek Jun 3, 2026
6518778
docs: refresh PR #860 gap audit at f39b085d (PROJ-008/013/020/021/023…
lklimek Jun 3, 2026
39e459f
refactor(dashpay): classify contact-request errors by typed variant, …
lklimek Jun 3, 2026
954ea3f
docs(gap-audit): flip PROJ-025 to RESOLVED at 39e459ff
lklimek Jun 3, 2026
93a2076
test(backend-e2e): retire stale RUST_MIN_STACK run-doc; harness owns …
lklimek Jun 8, 2026
ebde4f9
docs(backend-task): mark single-key dispatch arms as by-design (PROJ-…
lklimek Jun 8, 2026
85a8b33
docs(gap-audit): re-pin stale line refs and refresh PROJ-013 entry
lklimek Jun 8, 2026
a94c166
test(backend-e2e): drop ephemeral review IDs from framework comments
lklimek Jun 8, 2026
b88597c
chore(deps): bump dashpay/platform to PR #3692 head (9e1248cb)
lklimek Jun 8, 2026
85adea3
test(backend-e2e): retry framework-wallet registration and contain wo…
lklimek Jun 8, 2026
5140a39
test: isolate e2e app-kv store to a tempdir so tests never touch real…
lklimek Jun 8, 2026
5c0c413
feat(wallet): default the "remember secret until app close" choice to…
lklimek Jun 8, 2026
17b6337
feat(wallet): add birth-height policy helper for upstream registratio…
lklimek Jun 8, 2026
a635384
fix(wallet): re-register wallets with upstream SPV backend so receive…
lklimek Jun 8, 2026
96720b1
test(wallet): add backend-e2e below-tip funds-visibility repro for PR…
lklimek Jun 8, 2026
42b9bf6
docs(wallet): reopen PROJ-010 as a fixed regression; correct seedless…
lklimek Jun 8, 2026
be0598b
fix(wallet): own the seed vault in AppContext so sidecars persist bef…
lklimek Jun 8, 2026
c18da45
perf(wallet): short-circuit on seed_hash before deriving WalletId in …
lklimek Jun 8, 2026
51b29c3
docs: add wallet re-registration fix design (PROJ-010)
lklimek Jun 8, 2026
dc9a0c3
fix(wallet): drop legacy DB write so fresh installs can register wallets
lklimek Jun 8, 2026
cacbf6c
fix(database): guard clear_network_data DELETEs against missing tables
lklimek Jun 8, 2026
f6d2ecf
fix(wallet): permanently wipe seed + shielded state on wallet removal…
lklimek Jun 9, 2026
415b482
fix(shielded): persist note before checkpointing tree so a failed ins…
lklimek Jun 9, 2026
2304d06
fix(wallet): wipe session-cached seed when a wallet is locked
lklimek Jun 9, 2026
88c21c9
fix(wallet): fail closed when the seed-envelope vault write fails on …
lklimek Jun 9, 2026
36f7756
fix(migration): re-hydrate wallets after migration so they appear wit…
lklimek Jun 9, 2026
c15048f
fix(wallet): redact plaintext seed from Debug and identity funding log
lklimek Jun 8, 2026
3a1bb2f
fix(identity): do not persist all-zeros placeholder on registration f…
lklimek Jun 8, 2026
34543c0
fix(wallets): make advanced single-key import visible in-session
lklimek Jun 8, 2026
d92dcf3
fix(dashpay): forward display_task_error to the active subscreen
lklimek Jun 9, 2026
cdfa431
test(backend-e2e): use shared runtime attribute for event_bridge_live
lklimek Jun 9, 2026
6300f27
fix(wallet): guard legacy-table removal so fresh-install wallet delet…
lklimek Jun 9, 2026
4ec7b5e
fix(wallet): make wallet-meta sidecar write fail-closed to prevent or…
lklimek Jun 9, 2026
b5ad862
fix(identity): redact private-key bytes in PrivateKeyData Debug and D…
lklimek Jun 9, 2026
a0f0929
docs(review): persist PR #860 full-review findings + fast-follow backlog
lklimek Jun 9, 2026
6dfc5ff
fix(wallet)!: load tracked asset locks via the async task system inst…
lklimek Jun 9, 2026
0196b12
fix(wallet): surface a retry state instead of an infinite spinner whe…
lklimek Jun 9, 2026
253a4c6
fix(wallet): produce recoverable signatures for signed messages
lklimek Jun 9, 2026
86e0d2b
fix(platform): filter in-queue withdrawals to queued/pooled/broadcasted
lklimek Jun 9, 2026
5617ae3
fix(shielded): keep batch shield build async and prompt once per batch
lklimek Jun 9, 2026
da7110f
test(wallet): cover fee-from-wallet platform funding output map
lklimek Jun 9, 2026
837fc6b
fix(settings): re-run dash-qt autodetect when stored path is unset
lklimek Jun 9, 2026
c33773e
fix(ui): drop duplicate Total Received column and fix modal Escape ha…
lklimek Jun 9, 2026
90cc22c
fix(wallet): return typed errors at the at-rest decode boundary (F12)
lklimek Jun 9, 2026
499947e
fix(wallet): tighten single-key import secret hygiene (F9, F92, F10)
lklimek Jun 9, 2026
74cbeb1
test(dashpay): pin the contact-derivation seam vectors (F3)
lklimek Jun 9, 2026
858fc63
docs(wallet): correct sidecar forward-compat and hydration-skip comme…
lklimek Jun 9, 2026
d9f9983
refactor(migration): sweep dead code and stale docs left by the unwire
lklimek Jun 9, 2026
52edbaf
fix(migration): show the completion banner only when work happened, a…
lklimek Jun 9, 2026
a6322da
docs(migration): correct stale migration design/audit docs to present…
lklimek Jun 9, 2026
18b9f65
refactor(errors): replace stringified errors with typed variants; map…
lklimek Jun 9, 2026
bed6f8a
fix(dashpay): scope blocked/rejected markers per owner identity
lklimek Jun 9, 2026
3392789
fix(dashpay-ui): set auto-fetch attempted flag at dispatch, not on su…
lklimek Jun 9, 2026
938a843
feat(payments): restore backend-authoritative recipient validation
lklimek Jun 9, 2026
9085395
test(context): add k/v round-trip unit tests for contested-names, tok…
lklimek Jun 9, 2026
6d9dbe9
fix(ui): keep raw SPV/unlock error text out of user-facing copy
lklimek Jun 9, 2026
1ac5739
fix(spv): actually clear the cached chain data instead of faking success
lklimek Jun 9, 2026
ff98ef8
fix(backend): wire shielded lazily and surface terminal storage errors
lklimek Jun 9, 2026
2484221
fix(context): serialize lazy backend build and settings-cache fill
lklimek Jun 9, 2026
8c49cb2
fix(wallet): harden secret-expiry arithmetic and runtime-handle lookup
lklimek Jun 9, 2026
7c6a996
fix(dashpay-ui): settle PaymentHistory loading state on failed fetch …
lklimek Jun 9, 2026
03ec523
docs(review): mark PR #860 fast-follow findings resolved and fix stal…
lklimek Jun 9, 2026
e5c59af
refactor(wallet): split WalletBackendNotYetWired catch-all into preci…
lklimek Jun 9, 2026
dd5f4e7
docs(platform-wallet): draft upstream issue — rs-platform-wallet owns…
lklimek Jun 9, 2026
6fcd44c
docs(platform-wallet): link upstream nonce-ownership draft to filed i…
lklimek Jun 9, 2026
12276f9
docs(platform-wallet): cross-reference PR #3650 in upstream nonce iss…
lklimek Jun 9, 2026
a4ec2ca
docs(platform-wallet): correct apply.rs nonce-comment citation to bla…
lklimek Jun 9, 2026
710df51
docs(platform-wallet): correct DAPI privacy claim — one avoidable req…
lklimek Jun 9, 2026
1e19f46
docs(wallet-backend): mark missing core_derived_addresses seeding (ut…
lklimek Jun 9, 2026
9b2aacb
fix(settings): make the Disconnect button actually disconnect
lklimek Jun 9, 2026
a067a74
fix(settings): close disconnect double-click window + add reconnect test
lklimek Jun 9, 2026
4247c36
chore(deps)!: re-pin platform-wallet to dashpay/platform#3828 + port …
lklimek Jun 10, 2026
a0d5034
fix(shielded,test): harden secrets-dir perms, green the suite under b…
lklimek Jun 10, 2026
39433da
fix(shielded): reset nullifier sync cursor on migration + resync (PRO…
lklimek Jun 10, 2026
9655891
fix(shielded): correct stale nullifier-cursor doc comment; mark PROJ-…
lklimek Jun 10, 2026
727e8d6
chore(triage): add deferred-finding TODO markers (PROJ-032/034/018/01…
lklimek Jun 10, 2026
255aa01
refactor: remove dead ZMQ subsystem, Dash-Qt launcher, and legacy ide…
lklimek Jun 10, 2026
1871c59
fix(wallet,identity,docs): clear up stale copy, dead controls, and re…
lklimek Jun 10, 2026
23b8171
docs(changelog): record ZMQ + Dash-Qt launcher removals (DOC-001)
lklimek Jun 10, 2026
0ba0a27
docs(triage): persist gaps-report triage decisions (25: 18 fix / 6 de…
lklimek Jun 10, 2026
fe01feb
fix(core): emit ReceivedAvailableUTXOTransaction so asset-lock fundin…
lklimek Jun 10, 2026
918b8e5
fix(send): client-side Max for Core sends, remove unsupported subtrac…
lklimek Jun 10, 2026
08c895a
refactor(shielded): remove unsupported shield-from-core source-addres…
lklimek Jun 10, 2026
d504d09
docs(wallet): note dropped DIP-14 legacy contact re-derivation (PROJ-…
lklimek Jun 10, 2026
2667576
docs(wallet): scope funding-account load() comments to per-index top-…
lklimek Jun 10, 2026
26c1338
fix(send,shielded): reserve Max against spendable balance, resolve sh…
lklimek Jun 10, 2026
910f883
feat(dashpay): detect+record incoming contact payments (PROJ-027)
lklimek Jun 10, 2026
467dc80
feat(dashpay): offline contact/profile reads + avatar cache (PROJ-040)
lklimek Jun 10, 2026
dc94bba
fix(dashpay): per-output payment keying, avatar cache invalidation+bo…
lklimek Jun 10, 2026
fba925e
fix(migration): guard against dropping legacy single-key table with u…
lklimek Jun 10, 2026
01f2bb2
refactor(wallet): consolidate single-key import onto one flow (PROJ-0…
lklimek Jun 10, 2026
690d92b
feat(wallet): restore password-protected single-key wallets post-migr…
lklimek Jun 10, 2026
3a0e590
fix(wallet): address PROJ-007 review — gate predicate, allow-list, ze…
lklimek Jun 10, 2026
9d05ba2
fix(security): stop retaining plaintext single-key private key in the…
lklimek Jun 11, 2026
48d8572
docs(gap-audit): mark 18 triaged findings resolved + record PROJ-016/…
lklimek Jun 11, 2026
b2cab95
fix(security): route single-key Unlock through JIT, stop re-parking p…
lklimek Jun 11, 2026
3b3f936
refactor(wallet): consolidate single-key passphrase validation into m…
lklimek Jun 11, 2026
9e68f88
fix(security): zeroize derived DashPay encryption keys + remembered p…
lklimek Jun 11, 2026
fbf9453
refactor(dashpay): delegate first_associated_wallet_seed_hash (F3b)
lklimek Jun 11, 2026
59756b4
test(wallet): serialize reconnect test to fix pre-existing AlreadyOpe…
lklimek Jun 11, 2026
2706ac9
fix(security): zeroize resolve_private_key_bytes ECDH key + sha2 dige…
lklimek Jun 11, 2026
7123e08
fix(migration): rehydrate wallet backend after cold-start migration s…
lklimek Jun 12, 2026
ff5ffb8
test(migration): cover protected-wallet deferral in cold-start migrat…
lklimek Jun 12, 2026
bd1f81c
fix(cli): make det-cli standalone work with the default empty MCP_API…
lklimek Jun 12, 2026
7f20050
docs(claude): document det-cli smoke testing
lklimek Jun 12, 2026
232ef46
fix(wallet): route Receive New-Address through the SPV-watched upstre…
lklimek Jun 12, 2026
b2787b3
refactor(wallet): drop obsolete legacy BIP44 address-derivation helpers
lklimek Jun 12, 2026
8be9097
fix(wallet): derive asset-lock deposit address from the SPV-watched p…
lklimek Jun 12, 2026
0a64be5
fix(wallet): send platform top-up change to a watched platform-paymen…
lklimek Jun 12, 2026
b3625fb
fix(wallet): source the Receive list from the SPV-watched snapshot, n…
lklimek Jun 12, 2026
be3a0fd
refactor(wallet): typed WalletAddressDerivationFailed; scope the lega…
lklimek Jun 12, 2026
c250fe8
fix(wallet): bound platform-payment derivation to the synced window (…
lklimek Jun 12, 2026
d1f7fdf
refactor(wallet)!: remove the legacy BIP44 address-derivation methods
lklimek Jun 12, 2026
37c2889
fix(shielded): surface shield-from-asset-lock confirmation failures (…
lklimek Jun 15, 2026
58c8170
docs(gap-audit): track PROJ-042 non-identity asset-lock recovery gap
lklimek Jun 15, 2026
700ac22
docs(gap-audit): track PROJ-043 sibling shielded-spend confirmation s…
lklimek Jun 15, 2026
1010828
fix(wallet): route wallet-owned platform-address funding through the …
lklimek Jun 15, 2026
c45ac35
refactor(wallet): gate platform-address funding on upstream pool memb…
lklimek Jun 15, 2026
36aa1f0
docs(wallet): scope the empty-outputs comment to the UI caller (PROJ-…
lklimek Jun 15, 2026
ef9b54f
fix(shielded): propagate post-broadcast confirmation failure in sibli…
lklimek Jun 15, 2026
a428055
fix(wallet): orchestrate fee-from-wallet platform funding via in-pool…
lklimek Jun 15, 2026
ce8af2c
chore(wallet,shielded): consolidate PROJ-042 fee-from-wallet residual…
lklimek Jun 15, 2026
dd3c390
refactor(wallet,shielded): match tested contract to production usage …
lklimek Jun 15, 2026
3c61a65
feat(logging): capture stderr and fatal signals so silent crashes lea…
lklimek Jun 15, 2026
96b61da
test(logging): extract marker_for_signal and should_capture_stderr pr…
lklimek Jun 15, 2026
f318c06
fix(wallet): gate Platform/identity sync on quorum readiness (DAPI ba…
lklimek Jun 15, 2026
9d5c865
test(wallet): guard the quorum-gate Weak capture; fold review findings
lklimek Jun 15, 2026
6463262
merge: consolidate Issue A (quorum-ready sync gate) onto crash-loggin…
lklimek Jun 15, 2026
35f18be
chore(deps)!: repin platform crates to PR #3828 branch (925dfcbf)
lklimek Jun 15, 2026
226db5f
feat(logging): surface a generic startup-failure notice on the terminal
lklimek Jun 16, 2026
9c45d7f
fix(wallet): self-heal stale persistor account-xpub format drift (iss…
lklimek Jun 16, 2026
b466812
refactor(wallet): heal #251 xpub drift via in-place upsert + restart …
lklimek Jun 16, 2026
5e29c8a
test(wallet): guard the fund-routing-gate xpub invariant on fresh wal…
lklimek Jun 16, 2026
81e79af
test(wallet): reproduce + localize the issue #7 fresh-DB xpub mismatc…
lklimek Jun 16, 2026
d26dc6b
test(wallet): drive the issue #7 persist->reload->gate cycle (cold-bo…
lklimek Jun 16, 2026
89378d2
revert: drop the #251 xpub-drift self-heal (wrong fix; real cause is …
lklimek Jun 16, 2026
7c9151d
test(wallet): drive issue #7 through the REAL load_from_persistor_see…
lklimek Jun 16, 2026
447eb1a
test(wallet): drop the scratch issue #7 diagnostic, keep the single r…
lklimek Jun 16, 2026
561bce8
chore(deps): re-pin platform crates to #3828 HEAD (925b109d) for BIP3…
lklimek Jun 16, 2026
44caa89
fix(wallet): register protected wallet on unlock to clear WalletNotLo…
lklimek Jun 16, 2026
f637365
feat(wallet): enable platform-wallet shielded feature + wire lifecycle
lklimek Jun 16, 2026
caa443a
feat(wallet): add WalletBackend shielded op + bind methods (Phase B)
lklimek Jun 16, 2026
62b230d
docs(migration): close PROJ-032 (DashPay never persisted in any relea…
lklimek Jun 16, 2026
18aa6ee
fix(wallet): complete Phase B — internal prover + exhaustive shielded…
lklimek Jun 16, 2026
7df68d7
feat(shielded): Phase C — push balance snapshot, bind on JIT, drop qu…
lklimek Jun 16, 2026
3afdc50
refactor(ui): slim WalletUnlockPopup to thin wrapper around passphras…
lklimek Jun 16, 2026
47c6eeb
feat(wallet): Phase C — repoint UI/MCP balance reads to push snapshot
lklimek Jun 16, 2026
479c8c1
feat(shielded): Phase D — delete DET shielded subsystem, route via up…
lklimek Jun 16, 2026
fa0e46d
feat(shielded): Phase E — shielded sync progress events into Connecti…
lklimek Jun 16, 2026
ad35ad3
test(shielded): Phase F — map_shielded_op_error routing tests + coord…
lklimek Jun 16, 2026
caa0dff
test(shielded): Phase F — assert shielded_balances via sync in backen…
lklimek Jun 16, 2026
63b2e79
feat(mcp): Phase G — det-cli shielded read/control tools for self-ver…
lklimek Jun 16, 2026
971f34c
refactor(ui): adopt module-placement policy — TrackedAssetLockCache→u…
lklimek Jun 16, 2026
fed6bef
refactor(ui): remove legacy ScreenWithWalletUnlock — migrate to Walle…
lklimek Jun 16, 2026
64e69a0
docs(review): add PR860 grumpy-review report
lklimek Jun 16, 2026
56ac2cf
fix(shielded): address grumpy-review findings (secret hygiene, doc ac…
lklimek Jun 16, 2026
3bffd02
docs(qa): add PR860 identity-autodiscovery QA report
lklimek Jun 17, 2026
8645d8e
docs(qa): re-verify PR860 identity-autodiscovery fixes — all 8 resolv…
lklimek Jun 17, 2026
4309088
docs(identity): add locked design for post-migration auto-discovery
lklimek Jun 17, 2026
6048893
feat(identity): add pure rolling gap-limit scan decision (model)
lklimek Jun 17, 2026
9608323
feat(identity): gap-limited discovery with alias preservation and no-…
lklimek Jun 17, 2026
96d2e1e
feat(identity): auto-run all-wallets discovery on Platform readiness
lklimek Jun 17, 2026
988008d
fix(identity): discover identities for a wallet when it is unlocked (…
lklimek Jun 17, 2026
e13082a
refactor(identity): typed errors, real progress total, network guard …
lklimek Jun 17, 2026
0484bcb
fix(identity): bound the By-Wallet search index (QA-008)
lklimek Jun 17, 2026
a11c831
fix(dashpay): register established contacts so incoming payments are …
lklimek Jun 17, 2026
4d84af1
fix(dashpay): register contacts at unlock so SPV watches incoming pay…
lklimek Jun 17, 2026
a21e224
fix(wallet): source platform balance from coordinator push, not direc…
lklimek Jun 17, 2026
a043dc1
fix(dashpay): address QA-020/021/022/023/024 findings on contact regi…
lklimek Jun 17, 2026
ec5de4b
fix(wallets): populate platform_address_info from coordinator push (Q…
lklimek Jun 17, 2026
9620d4a
fix(wallets): sum-then-truncate for selector total, dedupe seed looku…
lklimek Jun 17, 2026
28bac80
docs(wallets): document intentional frame-loop write-lock in apply_pl…
lklimek Jun 17, 2026
d34ffae
fix(dashpay): record sent contact request in local wallet-manager (QA…
lklimek Jun 17, 2026
b2c4736
docs(dashpay): record QA-025 fix in gap-audit document
lklimek Jun 17, 2026
c163b67
fix(dashpay): pre-populate incoming CR before accept to establish in-…
lklimek Jun 17, 2026
d2f4fd8
Merge branch 'fix/wallet-balance-source-of-truth' into docs/platform-…
lklimek Jun 17, 2026
09540cf
fix(wallet): stop SPV run loop on shutdown to fix reconnect AlreadyOpen
lklimek Jun 18, 2026
98bc491
fix(wallet): provision identity funding accounts from seed xpub (watc…
lklimek Jun 18, 2026
b851790
test(wallet): add regression guard for watch-only identity funding ac…
lklimek Jun 18, 2026
acdd133
test(wallet): fix regression guard to use cold-boot scenario for C.7
lklimek Jun 18, 2026
1c4f4dc
refactor(tools): remove masternode-list-diff inspector and Core P2P h…
lklimek Jun 18, 2026
43ede28
test(backend-e2e): add reconnect (B) and cold-boot identity funding (…
lklimek Jun 18, 2026
a98186a
fix(mcp,context): replace ensure_spv_synced poll loop with tokio::wat…
lklimek Jun 18, 2026
976ad0d
fix(context): add persister-release barrier to stop_spv (B-2)
lklimek Jun 18, 2026
0d301d0
feat(overlay): blocking progress overlay + SPV-sync hard-block (#863)
lklimek Jun 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
103 changes: 103 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
# Changelog

All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/).

## [Unreleased]

### Changed

- **Sign-time wallet unlock**: the passphrase is now requested just-in-time, the
moment an operation actually needs your secret (sending funds, registering an
identity, signing). The prompt offers an optional "Keep this wallet unlocked
until I close the app" checkbox so a busy session asks only once. This replaces
the old upfront unlock gate that held the wallet open for the whole session —
the HD seed is no longer kept in memory between operations; it is decrypted on
demand and wiped as soon as the operation finishes.

- **Wallet storage backend**: HD wallet seeds and single-key private keys are now
stored in an upstream `platform-wallet-storage` encrypted vault
(`secrets/det-secrets.pwsvault` in the app data directory) rather than in the legacy
`data.db` SQLite database. Wallet metadata (alias, main flag,
Core wallet name) moves to a new `det-app.sqlite` key-value sidecar. The legacy
`data.db` file is left intact for safety; it is no longer read at runtime.

- **Cold-start migration**: on the first launch after upgrading, DET automatically
migrates wallet seeds, metadata, and imported single-key data from `data.db` into
the new storage layout. A progress banner is shown during migration (typically
under one second on local storage). The migration is idempotent — subsequent
launches skip it via a completion sentinel in `det-app.sqlite`.

- **Identity funding now goes through one spend engine**: registering or topping up
an identity always funds from your wallet balance through the upstream
asset-lock engine, which selects coins and tracks the lock to confirmation. The
separate "fund directly from a specific transaction output" path was removed so
there is a single, double-spend-safe funding flow.

### Known Limitations

- **Single-key wallets — send and balance refresh not available**: importing a
single-key wallet (WIF), viewing it, and signing with it all work in this
release. Sending funds and refreshing the balance or UTXO list are not yet
supported. Your key data is preserved and these actions will be available in a
future update. To send funds now, use an HD (recovery-phrase) wallet.

- **DashPay contacts — non-mainnet / non-account-0 legacy addresses**: this
release drops back-compat for contact-request addresses derived outside mainnet
account 0 under the old DIP-14 scheme (non-mainnet networks, or secondary
account indices). If you used DashPay on testnet or devnet with a non-default
account, existing contact payment addresses for those contacts may not be
reproduced. Re-establishing the contact from both sides restores full
functionality.

### Removed

- Proof log screen (internal developer tool, not part of the public feature set).
- QR-code wallet import flow for identity funding and top-up screens.
- The "fund identity directly from a transaction output" option on the identity
registration and top-up screens (replaced by the single asset-lock funding flow
described under Changed).
- The unused "Memo (optional)" field on the wallet send dialog and the single-key
send screen — the note was never attached to the transaction, so it has been
removed to avoid implying a memo would be saved.
- The "Core Only" wallet refresh option. Core wallet balances and UTXOs now stay
current automatically, so a manual Core-only refresh had nothing to do; refresh
now covers Core plus Platform, or Platform only.
- The unused ZMQ Core-event listener subsystem and the non-functional "Disable ZMQ"
setting. The listener was already gated off and never delivered events, so the
toggle did nothing; both have been removed (the `zmq`, `zeromq`, and
`crossbeam-channel` dependencies are no longer needed).
- The unreachable Dash-Qt launcher and its settings — the executable path, the
overwrite-config option, and the close-on-exit option. There was no way to launch
Dash-Qt from the app, so the controls had no effect and have been removed.

### Fixed

- `WalletBackend` is now initialised eagerly at `AppState` start, eliminating a
retry-loop spam on the SDK connection during cold boot.
- Wallet store is rehydrated on cold start, resolving a regression where wallets
were not visible after the storage migration.
- The Disconnect button on the network settings screen now actually disconnects:
it stops the wallet backend and updates the connection indicator instead of
silently doing nothing. A fast double-click can no longer start two disconnects
at once.
- Shielded balances no longer overstate after upgrading or after using
"Resync Notes": the spent-note scan cursor is reset so previously spent notes
are detected again. Previously a migrated or resynced wallet could show notes as
available that had already been spent, causing later spends to fail.
- The unused-asset-lock picker on the identity registration and top-up screens now
shows a plain-language status and the funding address for each lock, instead of
an internal status name, so you can tell which lock is which.
- A failed wallet-funded identity registration now tells you that your funds are
safe as a funding lock and how to finish: start a new identity and fund it from
your existing asset lock.
- Platform and identity features stay reachable during initial sync. Previously,
on a fresh connection the app contacted Platform network nodes before its local
masternode list had finished syncing; every node it tried was wrongly marked as
failed and set aside, and once all of them were set aside Platform stopped
working until restart. The app now waits for the masternode list to be ready
before contacting those nodes.
- Silent crashes now leave a trace: the app captures stderr output and fatal
signals to its log file, so an unexpected exit can be diagnosed from the logs
instead of vanishing without a record.
51 changes: 51 additions & 0 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -69,6 +69,23 @@ scripts/safe-cargo.sh +nightly fmt --all
* **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.

### DET Module Placement Policy

Code lives by responsibility, not convenience:

- **`model/`** — stateless data types and pure validation (format/length/charset). The single source of truth for validation. No `AppContext`, `Sdk`, DB, or `BackendTask`. All fee estimation goes in `model/fee_estimation.rs` — never inlined elsewhere.
- **`backend_task/`** — async business logic, one submodule per domain; the authoritative enforcement layer. `TaskError` and its typed variants live in `backend_task/error.rs`.
- **`database/`** — SQLite persistence, one module per domain.
- **`context/`** — `AppContext` submodules (`*_db.rs`, lifecycle, settings, status).
- **`wallet_backend/`** — the wallet orchestration seam: adapters, views, backend-side live caches, signers, the secret chokepoint, the event bridge.
- **`ui/<domain>/`** — screens (`ScreenLike`). UI may *call* `model/` validators for instant feedback but never implements its own validation.
- **`ui/components/`** — reusable **Component-pattern widgets ONLY**: a `show()` plus a `ComponentResponse`, a display-only render widget, or component infrastructure. If it does not render egui, it is not a component.
- **`ui/state/`** — non-widget UI state: per-screen view-models and async fetch-state caches (e.g. `TrackedAssetLockCache`). Owned by screens, may return `BackendTask`, render nothing.
- **`src/mcp/tools/`** — MCP tool logic, one file per domain (e.g. `wallet.rs`, `shielded.rs`, `identity.rs`) with multiple tool structs per file; never in `src/bin/det_cli/`.
- **`src/localization.rs`** — localization logic. **`src/ui/theme.rs`** — theme/alignment helpers.

Discriminator for `ui/components/` vs `ui/state/`: *does it render egui (`show`/`ui`/a render fn)?* Yes → component. No → state.

### Error messages

User-facing error messages (shown in `MessageBanner` via `Display`) must follow these rules:
Expand Down Expand Up @@ -118,6 +135,40 @@ User-facing error messages (shown in `MessageBanner` via `Display`) must follow
- **Error type**: `McpToolError` enum (InvalidParam, WalletNotFound, SpvSyncFailed, TaskFailed, Internal) converts to `rmcp::ErrorData` via `From`.
- **Docs**: `docs/MCP.md` (server config, tool reference), `docs/CLI.md` (usage, examples), `docs/MCP_TOOL_DEVELOPMENT.md` (checklist for adding new MCP tools).

### Smoke-testing changes with det-cli

`det-cli` in standalone (stdio, lazy-init) mode is a fast, no-funds, no-GUI smoke test for the **MCP-tool layer + context wiring**. Run these after changes that touch MCP tools (`src/mcp/`), `AppContext` construction, or the wallet-backend boot path — they catch compile/API drift and context-init regressions before any live-network testing.

Build:

```bash
cargo build --bin det-cli --features cli
```

Then, with `MCP_API_KEY` unset (or empty — the default `.env` ships it empty, which means standalone), run the read-only checks. Point `DASH_EVO_DATA_DIR` at a throwaway dir to avoid touching real user data or contending with a running GUI / `det-cli serve` instance:

```bash
DET=$(mktemp -d) && cp .env.example "$DET/.env"
BIN=target/debug/det-cli # or "$CARGO_TARGET_DIR/debug/det-cli" if that env var is set
run() { env -u MCP_API_KEY DASH_EVO_DATA_DIR="$DET" RUST_LOG=off "$BIN" "$@"; }

run network-info # active network as JSON — no SPV sync (network-exempt)
run tools # discovers all tools via tools/list
run tool-describe name=network_info # full schema for one tool (meta tool, network-exempt)
run core-wallets-list # exercises in-process MCP -> tool -> AppContext -> DB; returns {"wallets":[]}
```

What each verifies:

- **`network-info`** — binary starts, lazy-inits `AppContext` (creates `.env`/DB/secret store), reports the active network. No SPV gate, so it's a pure context-wiring check.
- **`tools`** — the in-process MCP server is up and the dynamic `tools/list` discovery path works (catches a tool that fails to register in `tool_router()`).
- **`tool-describe name=...`** — the meta tool returns a tool's JSON schema; confirms tool metadata serializes cleanly.
- **`core-wallets-list`** — drives the full dispatch chain (MCP service → tool invoke → `AppContext` → SQLite) without funds; skips the SPV gate.

`--help`, `<cmd> --help`, and `completion <shell>` work from the on-disk tool cache without any context init.

**Not smoke tests** (need a synced chain / live DAPI — they wait on the SPV gate, up to a 10-min timeout): all fund-moving and balance/withdrawal tools — `core-balances-get`, `core-funds-send`, `platform-addresses-list`, `platform-withdrawals-get`, every `identity-*` and `shielded-*` tool. Don't force these in a no-network smoke run.

### Key Dependencies

- `dash-sdk` - Dash blockchain SDK (git dep from dashpay/platform)
Expand Down
Loading