Skip to content
Merged
Show file tree
Hide file tree
Changes from 250 commits
Commits
Show all changes
399 commits
Select commit Hold shift + click to select a range
610179f
docs(rs-platform-wallet-storage): log V002-V004 in SCHEMA.md migratio…
lklimek Jul 13, 2026
8fd222c
docs(qa): adversarial review of #4113 provider-key persistence (Marvin)
lklimek Jul 13, 2026
c1349e6
fix(platform-wallet-storage): never delete pre-derived platform-node …
lklimek Jul 13, 2026
1df6169
fix(platform-wallet-storage): validate provider entries at write time
lklimek Jul 13, 2026
33d18ac
test(platform-wallet-storage): adversarial recheck of #4113 union/con…
lklimek Jul 13, 2026
7b56929
fix(platform-wallet-storage): reject conflicting keys at one node-key…
lklimek Jul 13, 2026
ad0164c
docs: design for asset-lock proof blob rehydration fix (#4133)
lklimek Jul 15, 2026
8f9c5f7
fix(platform-wallet-storage): tighten secrets/ error diagnostics & lo…
lklimek Jul 15, 2026
59f65e7
fix(platform-wallet-storage): log SqlitePersister open() and delete d…
lklimek Jul 15, 2026
081d055
fix(platform-wallet): retry transient persister failures in register_…
lklimek Jul 15, 2026
f7ab81f
fix(platform-wallet-storage): surface provider node keys and guard xp…
lklimek Jul 15, 2026
38ea7c9
fix(platform-wallet-storage): close error-handling gaps in sqlite sch…
lklimek Jul 15, 2026
da92ee9
docs(platform-wallet): make store()'s transient-failure retry contrac…
lklimek Jul 15, 2026
8417dc8
fix(platform-wallet-storage): rehydrate asset-lock proof blobs via wi…
lklimek Jul 15, 2026
ae01482
fix(platform-wallet): release wallet-event adapter on failed load; ty…
lklimek Jul 15, 2026
bdc7bf5
fix(platform-wallet-storage): route third from_script site through Ad…
lklimek Jul 15, 2026
95742a0
test(platform-wallet-storage): fully-populate both proof variants; dr…
lklimek Jul 15, 2026
66cea08
revert(platform-wallet-storage): drop the V004 migration — no pre-rel…
lklimek Jul 15, 2026
2878bd5
docs(dpp): pin the internally-tagged serde/bincode hazard at its defi…
lklimek Jul 15, 2026
40c08c5
merge: fold in secrets/ error-handling-coverage fixes (PR #3968)
lklimek Jul 15, 2026
fde795b
merge: fold in sqlite/schema/ error-handling-coverage fixes (PR #3968)
lklimek Jul 15, 2026
ee2b5d7
merge: fold in persister/orchestration-layer error-handling-coverage …
lklimek Jul 15, 2026
d210cae
Merge branch 'feat/platform-wallet-storage-rehydration' of https://gi…
lklimek Jul 15, 2026
d18020f
test(platform-wallet,dpp): QA-002/003/004 — honest Drop-release seman…
lklimek Jul 15, 2026
c992523
Merge remote-tracking branch 'origin/v4.1-dev' into feat/platform-wal…
lklimek Jul 15, 2026
a111e37
fix(platform-wallet-storage): resolve v4.1-dev merge fallout
lklimek Jul 15, 2026
1ce14ec
fix(platform-wallet-storage): resolve v4.1-dev merge fallout (content)
lklimek Jul 15, 2026
884a6cd
Merge remote-tracking branch 'origin/feat/platform-wallet-storage-reh…
lklimek Jul 15, 2026
77278e7
fix(platform-wallet-storage): lift provider node keys onto the persis…
lklimek Jul 15, 2026
fd26d4e
test(platform-wallet-storage): regenerate V001 fixture, fix remaining…
lklimek Jul 15, 2026
3f2092c
fix(platform-wallet-storage): fail loud on unread FFI provider node keys
lklimek Jul 15, 2026
b7f3af9
Merge remote-tracking branch 'origin/feat/platform-wallet-storage-reh…
lklimek Jul 15, 2026
7956bb8
style(platform-wallet-storage): fix rustfmt violation in sqlite_versi…
lklimek Jul 15, 2026
b361e11
fix(platform-wallet-storage): persist typed public keys on core addre…
lklimek Jul 15, 2026
a536a26
chore(platform-wallet): rustfmt reflow of changeset re-export list
lklimek Jul 15, 2026
769deaf
docs(qa): mark qa-review-4113.md superseded by the #4127 pivot
lklimek Jul 15, 2026
83a28f7
fix(platform-wallet-storage): reject conflicting typed pool-key writes
lklimek Jul 15, 2026
3c26fc1
refactor(platform-wallet): share platform-node pool-insert logic
lklimek Jul 15, 2026
42da594
fix(platform-wallet-storage): reject untyped/malformed typed pool-key…
lklimek Jul 20, 2026
04c71e2
fix(platform-wallet): restore used platform-node pool bookkeeping on …
lklimek Jul 20, 2026
25e50bb
Merge branch 'v4.1-dev' into feat/platform-wallet-storage-rehydration
lklimek Jul 21, 2026
91cd3e3
fix(platform-wallet-storage): persist provider key accounts and platf…
Claudius-Maginificent Jul 21, 2026
8eacd6b
merge: forward-port outstanding PR #4117 review-feedback fixes onto P…
claude Jul 21, 2026
1980a10
build(deps): pin rust-dashcore to the dash-evo-tool integration branch
claude Jul 21, 2026
c01f74f
fix(wallet): migrate address pool state bookkeeping
lklimek Jul 21, 2026
69b4803
fix(wallet): reserve platform receive addresses
lklimek Jul 21, 2026
f376d32
merge: reconcile with origin/feat/platform-wallet-storage-rehydration…
claude Jul 21, 2026
1ce7be0
Merge remote-tracking branch 'origin/v4.1-dev' into merge-base/3968-v…
lklimek Jul 21, 2026
be76265
build(deps): refresh lockfile for rust-dashcore pin
lklimek Jul 21, 2026
fabcbf0
style(wallet): format merge resolutions
lklimek Jul 21, 2026
267599d
fix(wallet-storage): remove stale merge import
lklimek Jul 21, 2026
1662b3a
test(wallet): migrate payment checks to address state
lklimek Jul 21, 2026
6304208
fix(platform-wallet-storage): persist AddressState::Reserved timestamp
lklimek Jul 21, 2026
fe71552
fix(platform-wallet): retry transient startup load, fix stale used-bo…
lklimek Jul 21, 2026
a864315
fix(platform-wallet-ffi): dedicated transient/fatal codes for persist…
lklimek Jul 21, 2026
9fcee37
fix(platform-wallet-storage): parent-dir permission gate, shared id32…
lklimek Jul 21, 2026
2c9996a
Merge branch 'fix/3968-wallet-review-findings' into fix/3968-storage-…
lklimek Jul 21, 2026
154b696
Merge branch 'fix/3968-ffi-review-findings' into fix/3968-storage-rev…
lklimek Jul 21, 2026
904e549
Merge remote-tracking branch 'origin/v4.1-dev' into fix/3968-storage-…
lklimek Jul 21, 2026
ebbd15c
Merge remote-tracking branch 'origin/v4.1-dev' into fix/3968-storage-…
lklimek Jul 22, 2026
40fedf1
fix(platform-wallet-storage): gate identity BLOB columns before mater…
lklimek Jul 22, 2026
74d4fee
docs(platform-wallet-storage): disclose vault-header corruption ambig…
lklimek Jul 22, 2026
ed74114
fix(platform-wallet-storage): make connection-mutex poisoning permane…
lklimek Jul 22, 2026
032f791
test(platform-wallet-storage): exercise account-zero fallback through…
lklimek Jul 22, 2026
9d7cfea
refactor(platform-wallet-storage): drop dead core_utxos.account_index…
lklimek Jul 22, 2026
2830822
docs(platform-wallet-storage): fix stale capability rationale, disclo…
lklimek Jul 22, 2026
5e20040
fix(platform-wallet-storage): require minimum passphrase length
lklimek Jul 22, 2026
0cc257f
docs(platform-wallet-storage): clarify floor-target and passphrase-gu…
lklimek Jul 22, 2026
cb0f647
docs(platform-wallet-storage): resolve V001-mutability contradiction …
lklimek Jul 22, 2026
c19a4db
fix(platform-wallet-storage): correct CLI exit-code classification
lklimek Jul 22, 2026
e4bbd96
docs(platform-wallet-storage): strip ephemeral review-finding IDs fro…
lklimek Jul 22, 2026
9964031
fix(platform-wallet-storage): exclude plain readers during restore, h…
lklimek Jul 22, 2026
63e160b
feat(platform-wallet-storage): persist shielded viewing keys natively
lklimek Jul 22, 2026
e75f259
feat(platform-wallet): add delete_wallet to PlatformWalletPersistence…
lklimek Jul 22, 2026
be89caa
chore(deps): bump rust-dashcore pin to dash-evo-tool branch head (18c…
lklimek Jul 23, 2026
4a1ba64
Merge remote-tracking branch 'origin/v4.1-dev' into merge/v4.1-dev-in…
lklimek Jul 23, 2026
e9c9b74
fix(platform): reconcile confirmed UTXO height after wallet restart (…
Claudius-Maginificent Jul 24, 2026
3bd0cc5
Merge remote-tracking branch 'origin/v4.1-dev' into feat/platform-wal…
lklimek Jul 24, 2026
0e644e8
Merge branch 'feat/platform-wallet-storage-rehydration' of https://gi…
lklimek Jul 24, 2026
288a6ca
Merge remote-tracking branch 'origin/v4.1-dev' into feat/platform-wal…
lklimek Jul 24, 2026
3636aff
Merge remote-tracking branch 'origin/v4.1-dev' into feat/platform-wal…
lklimek Jul 27, 2026
0ed8b4d
Merge remote-tracking branch 'origin/v4.2-dev' into feat/platform-wal…
lklimek Jul 28, 2026
debf67b
Merge remote-tracking branch 'origin/v4.2-dev' into feat/platform-wal…
lklimek Jul 28, 2026
4ca05f5
chore(deps): update rust-dashcore dash-evo-tool branch
lklimek Jul 30, 2026
a15b680
fix(platform-wallet): thread AssetLockFundingAccount/drain into build…
lklimek Jul 30, 2026
a18bd15
test(platform-wallet): scope broadcaster mutex guard to satisfy clipp…
lklimek Jul 30, 2026
762c66c
fix(platform-wallet-storage): stop one bad script row from bricking a…
lklimek Jul 31, 2026
65bdbb1
fix(platform-wallet-storage): park duplicate-index identities instead…
lklimek Jul 31, 2026
d78c4bd
docs(platform-wallet): document the parked-identity exception to the …
lklimek Jul 31, 2026
3cab9f5
Revert "docs(platform-wallet): document the parked-identity exception…
lklimek Jul 31, 2026
a402a88
Revert "fix(platform-wallet-storage): park duplicate-index identities…
lklimek Jul 31, 2026
6cb7f97
Revert "fix(platform-wallet-storage): stop one bad script row from br…
lklimek Jul 31, 2026
eec7c4d
fix(platform-wallet): derive spent UTXO scripts from the input's address
lklimek Jul 31, 2026
8c5ca08
fix(platform-wallet-storage): name auto-backups after their source da…
lklimek Jul 31, 2026
4b92230
fix(platform-wallet-storage): enforce key/identity co-ownership at th…
lklimek Jul 31, 2026
ae42330
fix(platform-wallet-storage): narrow identity_keys key to (identity_i…
lklimek Aug 1, 2026
0b5e2e1
feat(platform-wallet-storage): allow NULL identity_keys.wallet_id, gu…
lklimek Aug 1, 2026
3eb021a
feat(platform-wallet-storage): add load_unowned_identities accessor
lklimek Aug 1, 2026
c33807b
test(platform-wallet-storage): pin the unowned-scope guards nothing held
lklimek Aug 1, 2026
5931df7
chore(deps): update rust-dashcore dash-evo-tool branch
lklimek Aug 1, 2026
9d0dd5a
Merge remote-tracking branch 'origin/v4.2-dev' into feat/platform-wal…
lklimek Aug 20, 2026
026b1cb
chore(platform-wallet-storage): drop changes outside the storage crate
lklimek Aug 20, 2026
c5ff761
fix(platform-wallet): make the Drop-backstop wait valid on a multi-th…
lklimek Aug 20, 2026
69d21e3
test(platform-wallet): assert synchronous persister release on the gr…
lklimek Aug 20, 2026
69ed03b
revert(platform-wallet): stop reserving in next_unused_receive_address
lklimek Aug 20, 2026
125aff1
feat(platform-wallet-storage): add LoadPolicy, LoadCtx, and recovery-…
lklimek Aug 20, 2026
16a93e3
feat(platform-wallet-storage): make a recovery-mode persister read-only
lklimek Aug 20, 2026
9160fc4
refactor(platform-wallet-storage): thread &LoadCtx through the load r…
lklimek Aug 20, 2026
a5f054c
feat(platform-wallet-storage): fail closed on chain-lock and core-tx …
lklimek Aug 20, 2026
6bc2c64
feat(platform-wallet-storage): fail closed on an undecodable shielded…
lklimek Aug 20, 2026
7645953
feat(platform-wallet-storage): fail closed on orphaned identity rows
lklimek Aug 20, 2026
0296a7b
feat(platform-wallet-storage): fail closed on rehydration derivation …
lklimek Aug 20, 2026
386d1bb
feat(platform-wallet-storage): count the two ambiguous sites and prob…
lklimek Aug 20, 2026
3690837
docs(platform-wallet-storage): document the load policy across rustdo…
lklimek Aug 20, 2026
278b5c3
fix(platform-wallet-storage): stop inventing a derivation index for t…
lklimek Aug 20, 2026
d2e90d3
docs(platform-wallet-storage): state the load contract once, where it…
lklimek Aug 20, 2026
984007a
docs(platform-wallet-storage): mark the gap-limit derivation site as …
lklimek Aug 20, 2026
7fff2d3
fix(platform-wallet-storage): cap the implied work of a rehydration g…
lklimek Aug 20, 2026
06a1408
docs(platform-wallet-storage): reunite the address-reuse regression t…
lklimek Aug 20, 2026
92f6f04
refactor(platform-wallet-storage): split the stringly-typed rehydrati…
lklimek Aug 20, 2026
90df897
fix(platform-wallet-storage): put the remedy in the message the user …
lklimek Aug 20, 2026
1f411d9
fix(platform-wallet-storage): count tombstoned orphan rows one per row
lklimek Aug 20, 2026
c1fde0c
fix(platform-wallet-storage): make a tolerated site one joinable log …
lklimek Aug 20, 2026
8f18e94
fix(platform-wallet-storage): make one incident greppable under one name
lklimek Aug 20, 2026
c73f44d
refactor(platform-wallet-storage): give LoadDegradation's invariants …
lklimek Aug 20, 2026
a9ef3b6
refactor(platform-wallet-storage): stop exporting a type no caller ca…
lklimek Aug 20, 2026
a416a86
test(platform-wallet-storage): pin the unimplemented-table probe to t…
lklimek Aug 20, 2026
743b7ca
docs(platform-wallet-storage): say that a point read's tally is dropped
lklimek Aug 20, 2026
b4b540a
docs(platform-wallet-storage): mark the two unseedable sites NOTE, no…
lklimek Aug 20, 2026
1958a27
fix(platform-wallet-storage): cost an empty address pool as empty
lklimek Aug 20, 2026
f3ac199
fix(platform-wallet-storage): count every address a degraded site aff…
lklimek Aug 20, 2026
6bf10b8
test(platform-wallet-storage): pin the three snapshot promises nothin…
lklimek Aug 20, 2026
72395da
fix(platform-wallet-storage): reject duplicate (wallet_id, identity_i…
Claudius-Maginificent Aug 21, 2026
993584a
Merge branch 'v4.2-dev' into feat/platform-wallet-storage-rehydration
lklimek Aug 21, 2026
05f6616
fix(platform-wallet-storage): let a store() own the flush of its own …
lklimek Aug 21, 2026
616963e
fix(platform-wallet-storage): keep pending writes when a delete abort…
lklimek Aug 21, 2026
7031fae
fix(platform-wallet-storage): judge identity slots on the state a cha…
lklimek Aug 21, 2026
2148788
docs(platform-wallet-storage): document that store_flush_seam is not …
lklimek Aug 21, 2026
86b4dd1
Merge remote-tracking branch 'origin/feat/platform-wallet-storage-reh…
lklimek Aug 21, 2026
17c022a
fix(platform-wallet-storage): purge legacy empty-script spent UTXO rows
lklimek Aug 21, 2026
4784de0
docs(platform-wallet): correct the derive_spent_utxos field notes
lklimek Aug 21, 2026
c86d237
Merge remote-tracking branch 'origin/v4.2-dev' into feat/platform-wal…
lklimek Aug 25, 2026
53c3d2d
fix(platform-wallet): keep the shielded changeset slot in every featu…
lklimek Aug 25, 2026
378d45a
fix(platform-wallet): surface unclean worker shutdown on rehydration …
lklimek Aug 25, 2026
4f0fd09
fix(platform-wallet-storage): drop the stale wallet_meta module decla…
lklimek Aug 25, 2026
cfc5c10
fix(platform-wallet): use dash-spv's own acceptance timeout instead o…
lklimek Aug 25, 2026
4dbf38f
Merge branch 'v4.2-dev' into feat/platform-wallet-storage-rehydration
lklimek Aug 25, 2026
396977b
Merge branch 'fix/platform-wallet-broadcast-acceptance-timeout' into …
lklimek Aug 25, 2026
92f9681
fix(platform-wallet-storage): resolve two silent regressions from the…
lklimek Aug 26, 2026
aaab997
Merge branch 'v4.2-dev' into feat/platform-wallet-storage-rehydration
lklimek Aug 27, 2026
e250391
fix(platform-wallet-storage): close six read-path and verification ga…
lklimek Aug 27, 2026
a844aec
docs(platform-wallet-storage): correct the duplicate-slot load claim
lklimek Aug 27, 2026
3f40708
fix(platform-wallet-storage): stop secret drop aborting on a shared l…
lklimek Aug 31, 2026
082f203
fix(platform-wallet-storage)!: give every secret its own guarded page…
lklimek Aug 31, 2026
62ee946
fix(platform-wallet-storage)!: close the memsec rework's review findings
lklimek Aug 31, 2026
67d4ef3
feat(platform-wallet-storage): let SecretString be edited in place
lklimek Aug 31, 2026
4a51102
Merge remote-tracking branch 'origin/v4.2-dev' into feat/platform-wal…
lklimek Sep 1, 2026
707ade4
fix(platform-wallet): move Drop impl above the test module
lklimek Sep 1, 2026
5ed3c58
fix(platform-wallet): retry a transient identity-scan verdict persist
lklimek Sep 1, 2026
8c141ba
fix(platform-wallet-storage): clear four clippy denials in test code
lklimek Sep 1, 2026
1931a76
feat(platform-wallet-storage): persist and restore the identity-scan …
lklimek Sep 1, 2026
a88b949
docs(rs-platform-wallet-ffi): fix non-ancestor merge SHAs in error-co…
lklimek Sep 1, 2026
6bc43a8
docs(rs-platform-wallet-storage): reconcile SecretStoreError enumerat…
lklimek Sep 1, 2026
7e1c9c4
docs(rs-platform-wallet-storage): fix identity_keys PK/FK/nullability…
lklimek Sep 1, 2026
3a4e2c9
docs(rs-platform-wallet-storage): reconcile SCHEMA.md gap disclaimer,…
lklimek Sep 1, 2026
0d88d9c
docs(rs-platform-wallet-storage): rename secret-serde to serde in SEC…
lklimek Sep 1, 2026
aa3b7fb
fix(platform-wallet-storage): refuse a host whose pages blow the lock…
lklimek Sep 1, 2026
3df58dd
refactor(platform-wallet-storage)!: drop three redundant Cargo features
lklimek Sep 1, 2026
135ebad
fix(platform-wallet): derive the shield-capacity regression fixture f…
lklimek Sep 1, 2026
efab0da
fix(platform-wallet-storage): raise the assumed page size to 16 KiB a…
lklimek Sep 1, 2026
68cb256
docs(rs-platform-wallet-storage): restate the locked-memory budget at…
lklimek Sep 1, 2026
b51cddc
chore(platform-wallet-storage): trim PR to storage-crate-only scope
lklimek Sep 2, 2026
c34e707
chore(platform-wallet-storage): drop asset-lock size gate, now its ow…
lklimek Sep 2, 2026
8fc62e0
docs(platform-wallet-storage): correct SCHEMA/SECRETS/README against …
lklimek Sep 3, 2026
1479d14
refactor(platform-wallet)!: drop delete_wallet from the persistence t…
lklimek Sep 3, 2026
ef32f6f
fix(platform-wallet-storage)!: rename retired Domain labels with a V0…
lklimek Sep 3, 2026
b9901bb
docs(platform-wallet-storage): state the database trust model and dro…
lklimek Sep 3, 2026
31eb272
Merge branch 'fix/3968-domain-label-rename' into chore/3968-integrate
lklimek Sep 3, 2026
e8df5ba
Merge branch 'docs/3968-schema-doc-accuracy' into chore/3968-integrate
lklimek Sep 3, 2026
d338055
fix(platform-wallet-storage): reject foreign-owned vaults and make se…
lklimek Sep 3, 2026
6ad7104
docs(platform-wallet-storage): fix the manifest feature wiring and st…
lklimek Sep 3, 2026
2b36843
fix(platform-wallet-storage): stop URI filename smuggling and harden …
lklimek Sep 3, 2026
07b1c1a
Merge branch 'fix/3968-secrets-hygiene' into chore/3968-integrate
lklimek Sep 3, 2026
3e75327
Merge branch 'fix/3968-misc-hygiene' into chore/3968-integrate
lklimek Sep 3, 2026
8c838bd
Merge branch 'docs/3968-schema-doc-accuracy' into chore/3968-integrate
lklimek Sep 3, 2026
201eaf3
fix(platform-wallet-storage): separate the fused load sites and stop …
lklimek Sep 3, 2026
dd60d32
Merge branch 'fix/3968-load-policy-cluster' into chore/3968-integrate
lklimek Sep 3, 2026
e280ffa
fix(platform-wallet-storage): tolerate an undecodable provider-pool s…
lklimek Sep 3, 2026
add5926
Merge branch 'fix/3968-load-policy-cluster' into feat/platform-wallet…
lklimek Sep 3, 2026
771a9e5
docs(platform-wallet-storage): correct apply_persisted_core_state cha…
lklimek Sep 4, 2026
cab6960
test(platform-wallet-storage): cover LoadSite::RehydrationMaintainGap…
lklimek Sep 4, 2026
36dc213
refactor(platform-wallet-storage): move rehydration engine out of util
lklimek Sep 4, 2026
2969cf7
refactor(platform-wallet-storage): wire up sqlite::rehydrate module
lklimek Sep 4, 2026
90a232d
fix(platform-wallet-storage): expose LoadSite explanations and render…
lklimek Sep 4, 2026
7e2698a
fix(platform-wallet-storage): wipe the Argon2 block matrix instead of…
lklimek Sep 4, 2026
bde4ce1
fix(platform-wallet-storage): pin the Tier-2 read ceiling to wire-sta…
lklimek Sep 4, 2026
0c52823
fix(platform-wallet-storage): stop rekey silently downgrading a harde…
lklimek Sep 4, 2026
e92b951
style(platform-wallet-storage): rustfmt the rekey header-ratchet test
lklimek Sep 4, 2026
122f167
fix(platform-wallet-storage): zeroize scheme-0 plaintext on every fai…
lklimek Sep 4, 2026
144a962
fix(platform-wallet-storage): close the write-path gaps that make a w…
lklimek Sep 4, 2026
7c5837e
merge: expose LoadSite explanations and render the CLI's full error c…
lklimek Sep 4, 2026
a6fb87c
merge: close the write-path gaps that make a wallet file un-loadable
lklimek Sep 4, 2026
84b20ff
merge: correct the chainlock rustdoc, cover the gap-limit site, move …
lklimek Sep 4, 2026
acf4c77
merge: wipe the Argon2 matrix, decouple the read ceiling, stop rekey …
lklimek Sep 4, 2026
35516cb
style(platform-wallet-storage): drop ephemeral review-finding IDs fro…
lklimek Sep 4, 2026
f7d7874
merge: bring feat/platform-wallet-storage-rehydration up to date with…
lklimek Sep 4, 2026
a32f408
fix(platform-wallet-storage): guard rehydration gap-limit input and e…
lklimek Sep 4, 2026
155a017
Merge branch 'v4.2-dev' into feat/platform-wallet-storage-rehydration
lklimek Sep 4, 2026
8b635ac
Merge branch 'v4.2-dev' into feat/platform-wallet-storage-rehydration
lklimek Sep 7, 2026
25fa274
Merge remote-tracking branch 'origin/v4.2-dev' into feat/platform-wal…
lklimek Sep 7, 2026
eafcff3
fix(platform-wallet-storage): stop reusing published migration versions
lklimek Sep 7, 2026
b3bba39
fix(platform-wallet-storage): restore published migrations and append…
lklimek Sep 7, 2026
ed1d93e
fix(platform-wallet-storage): admit the pre-split standard label inst…
lklimek Sep 7, 2026
894ac00
test(platform-wallet-storage): pin that a legacy standard row is not …
lklimek Sep 7, 2026
68bc412
fix(platform-wallet-storage): reconcile the pre-split standard row in…
lklimek Sep 7, 2026
9b32f1c
docs(platform-wallet-storage): state the reconciliation's real cost p…
lklimek Sep 7, 2026
28837e3
fix(platform-wallet-storage): isolate a failed wallet from the rest o…
lklimek Sep 7, 2026
9992476
fix(platform-wallet-storage): put the identity-key and contact reader…
lklimek Sep 7, 2026
33fb59c
fix(platform-wallet-storage): count the tables load() abandons instea…
lklimek Sep 7, 2026
095cf6d
fix(platform-wallet-storage): degrade balance-bearing rows by wallet,…
lklimek Sep 7, 2026
27cc030
fix(platform-wallet-storage): re-arm the compile-time guard on the ac…
lklimek Sep 7, 2026
c9c40d3
docs(platform-wallet-storage): name the subsystem and the constants t…
lklimek Sep 7, 2026
2cf9b46
test(platform-wallet-storage): name the colliding keys instead of dum…
lklimek Sep 7, 2026
23399c3
fix(platform-wallet-storage): restore InstantSend locks at load inste…
lklimek Sep 7, 2026
ef89a2b
refactor(platform-wallet-storage): make the public surface match what…
lklimek Sep 7, 2026
08252d1
fix(platform-wallet-storage): close four at-rest and open-path gaps i…
lklimek Sep 7, 2026
dbb8583
test(platform-wallet-storage): drop test-case IDs whose document the …
lklimek Sep 7, 2026
4e3a774
Merge fix/3968-round5 (2cf9b46773) into fix/3968-round5-wave3
lklimek Sep 7, 2026
5ec4761
Merge fix/3968-round5-wave3 into fix/3968-round5
lklimek Sep 7, 2026
41a2b2b
fix(platform-wallet-storage): make the secure-delete guard check the …
lklimek Sep 7, 2026
a3722d8
Merge wave 3's secure-delete guard fix into fix/3968-round5
lklimek Sep 7, 2026
64f763c
chore(ci): mark the dependency-audit gate as unreachable from pull re…
lklimek Sep 7, 2026
c887ef7
chore(platform-wallet-storage): merge v4.2-dev into rehydration branch
lklimek Sep 8, 2026
5690a07
Merge branch 'v4.2-dev' into feat/platform-wallet-storage-rehydration
lklimek Sep 8, 2026
84d5335
test(platform-wallet-storage): make lock refusal coverage deterministic
lklimek Sep 8, 2026
a1efa24
test(platform-wallet): move platform-node pool entry tests to a follo…
lklimek Sep 8, 2026
3e0b232
test(platform-wallet): cover insert_platform_node_pool_entry and its …
lklimek Sep 8, 2026
4af855d
fix(wallet-storage): preserve legacy state during atomic migrations
lklimek Sep 8, 2026
c3cb94c
chore: merge latest PR branch into migration fixes
lklimek Sep 8, 2026
c01d229
refactor(wallet-storage): own provider rehydration helpers
lklimek Sep 8, 2026
3cab3e5
test(wallet-storage): adapt pool tests to updated storage base
lklimek Sep 8, 2026
459e062
Merge branch 'v4.2-dev' into feat/platform-wallet-storage-rehydration
lklimek Sep 9, 2026
8fab915
chore: cargo fmt
lklimek Sep 9, 2026
ec1e26f
fix(platform-wallet): align disabled shielded changeset traits
lklimek Sep 9, 2026
827d759
fix(platform-wallet-storage): reject unknown pool account labels
lklimek Sep 9, 2026
ee41927
refactor(platform-wallet-storage): use Zeroizing for Argon2 memory
lklimek Sep 9, 2026
0a61080
chore(platform-wallet): merge updated storage base into pool tests
lklimek Sep 9, 2026
31c8f94
chore(platform-wallet-storage): merge v4.2-dev persistence updates
lklimek Sep 9, 2026
16e0d47
chore(platform-wallet): merge latest typed persistence base into pool…
lklimek Sep 9, 2026
041a9d3
chore(platform-wallet): merge v4.2-dev after #3968 squash-merge
lklimek Sep 9, 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
10 changes: 8 additions & 2 deletions .cargo/audit.toml
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
[advisories]
# TODO Remove it from here
ignore = [ "RUSTSEC-2020-0071"] # advisory IDs to ignore e.g. ["RUSTSEC-2019-0001", ...]
# CI reads audit configuration from the workspace root.
# TODO: enable PR audits once existing workspace advisories are resolved.
ignore = [
# Acknowledged 2026-06-08: bincode is unmaintained; no known exploit in this advisory.
# Storage decodes are size-bounded; the FFI asset-lock size gate is tracked in #4585.
# Replace the codec with a maintained alternative and revisit this exception.
"RUSTSEC-2025-0141",
]
16 changes: 12 additions & 4 deletions .github/workflows/tests-rs-wallet.yml
Original file line number Diff line number Diff line change
Expand Up @@ -201,9 +201,16 @@ jobs:
--locked \
-- --no-deps -D warnings

# Mirrors the workspace job's non-shielded step for the wallet crates:
# same package subset, same `not test(~shield)` filter (shielded wallet
# tests are not run there either).
# The shielded-wallet suite (Orchard proving, viewing-key binds, note
# scans) is excluded by MODULE PATH, not by the word "shield". A
# `test(~shield)` substring match also swept up ~47 pure-logic tests
# across the three crates — input selection, FFI error codes, memo
# encoding, SQLite viewing-key rows — that cost a tenth of a second and
# have no compensating job anywhere.
#
# `--no-tests fail` is the zero-match guard: a filter that stops
# selecting anything must fail the step, not pass green. Pinned rather
# than left to nextest's default, which is a default and not a promise.
- name: Run wallet tests (non-shielded)
run: |
cargo nextest run \
Expand All @@ -212,7 +219,8 @@ jobs:
--package platform-wallet-ffi \
--all-features \
--locked \
-E 'not test(~shield)'
--no-tests fail \
-E 'not test(~wallet::shielded::)'
env:
RUST_MIN_STACK: 4194304
CARGO_PROFILE_DEV_DEBUG: "0"
Expand Down
16 changes: 16 additions & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

9 changes: 9 additions & 0 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -112,6 +112,13 @@ opt-level = 3
opt-level = 3
[profile.dev.package.grovedb-commitment-tree]
opt-level = 3
# Same reasoning for Argon2id: a debug-built KDF is memory-hard by design, so
# an unoptimized one costs seconds per derivation and dominates any test that
# unlocks a `platform-wallet-storage` vault. `platform-wallet-storage` is the
# only workspace member that compiles argon2, so this override touches nothing
# else here despite the workspace-global syntax.
[profile.dev.package.argon2]
opt-level = 3

[profile.test.package.halo2_proofs]
opt-level = 3
Expand All @@ -125,6 +132,8 @@ opt-level = 3
opt-level = 3
[profile.test.package.grovedb-commitment-tree]
opt-level = 3
[profile.test.package.argon2]
opt-level = 3

[workspace.package]

Expand Down
100 changes: 89 additions & 11 deletions packages/rs-platform-wallet-storage/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -28,8 +28,8 @@ hex = "0.4"
# `dpp` types reach the persister via `IdentityPublicKey` (identity_keys
# writer), `AssetLockProof` (asset_locks writer) and `Identifier`
# (dashpay writer). `dash-sdk` is here for the `AddressFunds` re-export
# in `schema/platform_addrs.rs`. Feature set mirrors sibling
# `rs-platform-wallet` so the resolver picks identical hashes.
# in `schema/platform_addrs.rs`. Storage declares only the features it uses
# directly; `platform-wallet` adds `dash-sdk/wallet` to Cargo's unified set.
platform-wallet = { path = "../rs-platform-wallet", features = [
"serde",
], optional = true }
Expand All @@ -46,11 +46,16 @@ rusqlite = { version = "0.38", features = [
"backup",
"blob",
"hooks",
"limits",
"trace",
], optional = true }
refinery = { version = "0.9", default-features = false, features = [
refinery = { version = "=0.9.2", default-features = false, features = [
"rusqlite",
], optional = true }
# The migration adapter uses refinery's supported synchronous driver traits.
# Match refinery's driver traits and applied-history timestamp types.
refinery-core = { version = "=0.9.2", default-features = false, optional = true }
time = { version = "=0.3.49", features = ["parsing"], optional = true }
# bincode 2 is required directly: we encode `dpp::IdentityPublicKey`
# (which derives bincode 2 `Encode`/`Decode`) and decode
# `dpp::AssetLockProof` from the asset-lock blob column. Exact-pinned to
Expand All @@ -60,7 +65,17 @@ tempfile = { version = "3", optional = true }
chrono = { version = "0.4", default-features = false, features = [
"clock",
], optional = true }
# Backs the migration-set fingerprint helpers in `sqlite::migrations`, which
# are test-only (`cfg(test)` / `__test-helpers`). Kept optional and pulled in
# by `__test-helpers` alone, so a shipping build does not compile a hash
# crate it never calls.
sha2 = { version = "0.10", optional = true }
# `JsonSchema` for `SecretString`, enabled by `secrets` (the only feature
# under which the type exists). Reuses the workspace-locked 1.2.1.
# `default-features = false` drops the `derive` feature (we hand-write the
# impl), matching the crate's existing derive-free schemars usage so the
# lock gains no `schemars_derive` entry.
schemars = { version = "1", optional = true, default-features = false }

# Secret-storage deps (gated by the `secrets` feature). RustSec-clean
# pins (Smythe §7); `aes-gcm` is deliberately omitted. `keyring`'s
Expand All @@ -73,14 +88,36 @@ subtle = { version = "=2.6.1", optional = true }
# CSPRNG for AEAD nonces and the vault salt; exact-pinned like the rest
# of the crypto stack so the random source is not the loose one.
getrandom = { version = "=0.2.17", optional = true }
# Guarded allocator for `secrets::SecretString`/`SecretBytes`: every
# secret gets page-aligned, guard-paged, canary-checked, mlocked memory,
# so two live secrets can never share a page. Pure Rust (libc /
# windows-sys), no C toolchain or libsodium. Its `getrandom 0.2` and
# `windows-sys 0.45` deps are already in the workspace lock, so it adds
# no transitive crates. Exact-pinned like the rest of the
# soundness-critical stack: it holds seeds and xprivs, so a version
# change deserves a human reading the diff, not an automatic pickup.
memsec = { version = "=0.7.0", optional = true }
# Safe, cross-platform query for the host's memory page size, so
# `secrets::guarded` can refuse a host on which `memsec`'s runtime page
# rounding would blow the crate's locked-memory budget. Chosen over
# `page_size` because it is already in `Cargo.lock` (it backs the
# page-isolation tests), so this adds no new crate to the graph, and over
# a raw `libc::sysconf` because the query stays safe on Windows too.
region = { version = "=3.0.2", optional = true }
keyring-core = { version = "=1.0.0", optional = true }
# Cross-process advisory file lock for the vault read-modify-write.
# `fd-lock` 4.x is pure-rustix and replaces the `fs2`/`fs4` family that
# was removed from the sqlite arm — those tests grep for `fs2`/`fs4`
# literals in this crate's source/manifest and would re-trigger on the
# older crates. `fd-lock` has no such collision.
fd-lock = { version = "4.0.4", optional = true }
# LOCAL-FS ONLY: flock/LockFileEx interlock processes only on local
# filesystems; over NFS/CIFS the lock does not interlock, so a vault file
# must not be shared across hosts — steer multi-host to the OS-keyring arm.
# Exact-pinned (`=`) like the rest of the soundness-critical stack: the
# `VaultLock` unsafe drop-order argument in `secrets/file/mod.rs` is
# calibrated to fd-lock 4.0.4's guard internals; any bump must re-verify
# that the guard releases the OS lock before the backing `RwLock` frees.
fd-lock = { version = "=4.0.4", optional = true }

# CLI deps (gated by the `cli` feature)
clap = { version = "4", features = ["derive"], optional = true }
Expand Down Expand Up @@ -124,19 +161,26 @@ filetime = "0.2"
# Test-only: construct the `Zeroizing<[u8; 32]>` secret on an
# `IdentityKeyEntry` to prove the on-disk wire shape drops it. The
# production `zeroize` dep is gated behind the `secrets` feature, which
# the off-state CI build disables, so the test surface needs its own.
# the off-state build disables, so the test surface needs its own.
# NOTE: that off-state build (`--no-default-features --features
# sqlite,cli`) is a local/manual check, NOT a CI gate — no workflow runs
# it today. Keep this dev-dep regardless: it is what lets the off-state
# build succeed when someone does run it.
zeroize = { version = "=1.8.2", features = ["derive"] }
tracing-test = { version = "0.2", features = ["no-env-filter"] }
serial_test = "3"
# `default-features = false` so the off-state CI invocation
# (`--no-default-features --features sqlite,cli`) actually exercises a
# `default-features = false` so the off-state build
# (`--no-default-features --features sqlite,cli`, a local/manual check —
# see the note above; no CI job runs it) actually exercises a
# build with `secrets`/`kv` disabled — otherwise the dev-dep view would
# silently re-enable the default feature set for every integration test.
# Test surface is opted into explicitly: `secrets` and `kv` are listed
# so the plain `cargo test -p platform-wallet-storage` invocation runs
# both feature paths (the `kv`-gated `sqlite_object_metadata.rs`
# integration test and the `secrets`-gated unit tests).
platform-wallet-storage = { path = ".", default-features = false, features = ["sqlite", "cli", "secrets", "kv", "__test-helpers"] }
# integration test and the `secrets`-gated unit tests). `test-util` is here
# so `secrets_mock_store_test_util.rs` proves the feature gate from the
# outside — `cfg(test)` alone would satisfy it from within the crate.
platform-wallet-storage = { path = ".", default-features = false, features = ["sqlite", "cli", "secrets", "kv", "__test-helpers", "test-util"] }
tempfile = "3"
# `sqlite_hardening_3625.rs`, `sqlite_persist_roundtrip.rs`, and
# `sqlite_load_reconstruction.rs` import `dash_sdk::platform::address_sync::AddressFunds`.
Expand All @@ -154,6 +198,7 @@ dash-sdk = { path = "../rs-sdk", default-features = false, features = [
default = ["sqlite", "cli", "secrets", "kv"]
# SQLite-backed persister (`platform_wallet_storage::sqlite`).
sqlite = [
"dep:libc",
"dep:platform-wallet",
"dep:serde",
"dep:key-wallet",
Expand All @@ -162,10 +207,11 @@ sqlite = [
"dep:dash-sdk",
"dep:rusqlite",
"dep:refinery",
"dep:refinery-core",
"dep:time",
"dep:bincode",
"dep:tempfile",
"dep:chrono",
"dep:sha2",
]
# Maintenance CLI binary. Requires `sqlite` because the only subcommands
# in scope today operate on the SQLite persister.
Expand All @@ -184,17 +230,34 @@ cli = [
# crate without the crypto graph.
secrets = [
"dep:argon2",
# Enable argon2's `zeroize` feature so the KDF wipes its sensitive
# intermediate state (`initial_hash`/`blockhash`) on drop, and so
# `impl Zeroize for Block` is compiled in — `derive_key` in
# `secrets/file/crypto.rs` owns the block matrix itself and relies on
# it, because argon2 0.5.3 does NOT wipe that matrix on its own. Keep
# it in the feature list (not a `default-features = false` rewrite) so
# argon2's own default features stay intact.
"argon2/zeroize",
# bincode is the producer for the Tier-2 envelope wire format and the
# three AAD encodings (`Tier2Aad`/`EntryAad`/`VerifyAad`) — see
# `secrets/wire/`. `=2.0.1` is the workspace-wide pin.
"dep:bincode",
"dep:chacha20poly1305",
# secrets uses serde directly (vault format + crypto envelope derive
# `Serialize`/`Deserialize`); declare the dep here so
# `--no-default-features --features secrets` builds without leaning
# on the `sqlite` feature also having `dep:serde`.
"dep:serde",
# `JsonSchema` for `SecretString` is unconditional under `secrets`: the
# schema is a bare `"type": "string"` carrying no length policy and no
# value, so there is nothing for a consumer to opt out of.
"dep:schemars",
"dep:serde_json",
"dep:tempfile",
"dep:zeroize",
"dep:subtle",
"dep:getrandom",
"dep:memsec",
"dep:region",
"dep:keyring-core",
"dep:fd-lock",
Expand All @@ -203,6 +266,11 @@ secrets = [
"dep:apple-native-keyring-store",
"dep:windows-native-keyring-store",
]
# `Deserialize` for `SecretString`. Deliberately DEFAULT-OFF even though
# `secrets` already pulls the `serde` DEP in: this gates the IMPL, not the
# dep, so a config type can only grow a secret field when the consumer asks
# for it. NO `Serialize` is ever provided, under any feature combination.
serde = ["dep:serde"]
# Per-object-type key/value metadata API
# (`platform_wallet_storage::{KvStore, KvError, ObjectId}`) plus the
# SQLite-backed impl. Requires `sqlite` because the only shipped backend
Expand All @@ -215,4 +283,14 @@ kv = ["sqlite"]
# the write connection. The double-underscore prefix follows Cargo's
# convention for "MUST NOT enable from downstream" features
# (https://doc.rust-lang.org/cargo/reference/features.html#feature-resolver-version-2).
__test-helpers = ["sqlite"]
__test-helpers = ["sqlite", "dep:sha2"]
# Exposes `SecretStore::file_mock` / `EncryptedFileStore::open_mock` — vault
# constructors that use the Argon2id floor for fresh-vault creation and
# per-secret wrapping; existing vaults retain their header parameters. Enable
# it in `[dev-dependencies]` ONLY. The constructors panic outside debug builds
# and this crate's own test harness.
test-util = []
# Persists and restores Orchard viewing keys from the
# `PlatformWalletChangeSet::shielded` field. Other shielded state remains in
# the host-provided `ShieldedStore`.
shielded = ["sqlite", "platform-wallet?/shielded"]
Loading
Loading