Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
290 commits
Select commit Hold shift + click to select a range
5a2b2b5
test(rs-sdk-ffi): make extended_public_key metadata asserts load-bear…
lklimek Jul 1, 2026
56612fd
chore(deps): bump rust-dashcore to a8c57fe (drop Copy, zeroize Extend…
lklimek Jul 1, 2026
374df98
refactor(rs-sdk-ffi): rely on ExtendedPrivKey Drop, drop redundant Ze…
lklimek Jul 1, 2026
35e5c46
Merge remote-tracking branch 'origin/v4.1-dev' into chore/bump-rust-d…
lklimek Jul 2, 2026
71678ad
Merge branch 'v4.1-dev' into feat/platform-wallet-storage-rehydration
lklimek Jul 2, 2026
1aac44a
fix(deps): stage regenerated Cargo.lock for rust-dashcore a8a0968 bump
lklimek Jul 2, 2026
defa249
build: sync Cargo.lock to rust-dashcore a8a0968 (0.45.0)
lklimek Jul 2, 2026
f669691
docs(rs-sdk-ffi): correct ExtendedPrivKey zeroization comments for a8…
lklimek Jul 2, 2026
43b57af
Merge commit 'f669691f7a22f50f4fab7a056036a53ebf781b9b' into chore/bu…
lklimek Jul 2, 2026
5dfd441
fix(deps): bump quinn-proto 0.11.14 -> 0.11.15 (RUSTSEC-2026-0185)
lklimek Jul 2, 2026
0feb7d6
docs(platform-wallet): fix dead doc-links and stale references in reh…
lklimek Jul 2, 2026
59dc04d
fix(platform-wallet-ffi): harden load-outcome FFI surface (findings #…
lklimek Jul 2, 2026
cd6807a
docs(platform-wallet): fix dead MnemonicResolverHandle doc-link in lo…
lklimek Jul 2, 2026
a9d3a76
refactor(platform-wallet-ffi): typed corrupt-kind discriminator + hon…
lklimek Jul 2, 2026
284a3aa
fix(platform-wallet): harden watch-only rehydration guards + document…
lklimek Jul 2, 2026
ee717c8
Merge branch 'fix/3692-b' into fix/3692-consolidated
lklimek Jul 2, 2026
037c7d2
Merge branch 'fix/3692-c' into fix/3692-consolidated
lklimek Jul 2, 2026
f73e40a
Merge branch 'fix/3692-d' into fix/3692-consolidated
lklimek Jul 2, 2026
127c565
Merge branch 'fix/3692-e' into fix/3692-consolidated
lklimek Jul 2, 2026
0b53866
docs(platform-wallet): document manifest-authentication trust boundar…
lklimek Jul 2, 2026
c6d58f0
Merge branch 'v4.1-dev' into feat/platform-wallet-rehydration
lklimek Jul 2, 2026
12979b5
Merge remote-tracking branch 'origin/feat/platform-wallet-rehydration…
lklimek Jul 2, 2026
3a791c2
merge: #3976 Signer::extended_public_key (rs-sdk-ffi) into #3692
lklimek Jul 2, 2026
9dbca2f
fix(platform-wallet): update CoinJoin pool-topology test for key-wall…
lklimek Jul 2, 2026
fa6a031
merge: catch up with #3692's latest (rust-dashcore 0.45 bump + CoinJo…
lklimek Jul 2, 2026
7a2e06e
fix(platform-wallet): preserve persisted wallet state through seedles…
QuantumExplorer Jul 2, 2026
5460c0e
fix(platform-wallet): snapshot identity cross-check + typed persister…
Claudius-Maginificent Jul 2, 2026
0205123
Merge branch 'feat/platform-wallet-rehydration' into feat/platform-wa…
lklimek Jul 3, 2026
8bcb192
Apply suggestions from code review
lklimek Jul 3, 2026
87f4b42
refactor(platform-wallet)!: require core_wallet_info, drop keyless-pr…
lklimek Jul 3, 2026
f36e191
refactor(platform-wallet): drop obsolete non-default-account warn com…
lklimek Jul 3, 2026
ed5fb78
feat(platform-wallet)!: 3-state LoadOutcome, report already-registere…
lklimek Jul 3, 2026
f8504f6
docs(platform-wallet): reframe manifest trust boundary, detail the at…
lklimek Jul 3, 2026
157410a
fix(platform-wallet-ffi): xpub-error classification, overflow guard, …
lklimek Jul 3, 2026
f4ab467
test(platform-wallet): rollback, empty-first-run, and concurrency reg…
lklimek Jul 3, 2026
60d48f6
merge: #3692 triage fix batch (7 waves) into feat/platform-wallet-reh…
lklimek Jul 3, 2026
14d83af
Merge remote-tracking branch 'origin/v4.1-dev' into feat/platform-wal…
lklimek Jul 3, 2026
e65c123
test(platform-wallet-ffi): cover slice_from_raw guard and end-to-end …
lklimek Jul 3, 2026
518c8d1
refactor(platform-wallet): drop latent LoadIncomplete conversion and …
lklimek Jul 3, 2026
3abc385
refactor(platform-wallet): make manager::rehydrate module private
lklimek Jul 3, 2026
f8c9722
merge: QA follow-up fixes for #3692 (test coverage, dead-code cleanup…
lklimek Jul 3, 2026
83d9eff
fix(dpp): drop stale extended_public_key impls broken by rust-dashcor…
lklimek Jul 3, 2026
df6955e
merge: reconcile #3692 with v4.1-dev; preserve ignored/unignored on r…
lklimek Jul 6, 2026
7246946
feat(platform-wallet): add IdentityManagerStartState::merge_contacts_…
lklimek Jul 6, 2026
46f765c
feat(platform-wallet-storage): pre-key identities in SQLite load()
lklimek Jul 6, 2026
3b3b3eb
test(platform-wallet-storage): assert pre-keyed rehydration on Manage…
lklimek Jul 6, 2026
960228e
docs(platform-wallet): trim merge_contacts_and_keys rustdoc
lklimek Jul 6, 2026
0af850a
refactor(platform-wallet): drop dead identity_keys/contacts from Clie…
lklimek Jul 6, 2026
19570ad
Merge remote-tracking branch 'origin/v4.1-dev' into claudius/pr3692-f…
lklimek Jul 6, 2026
cf33f83
fix(platform-wallet-storage): cross-check inner public_key.id() in id…
lklimek Jul 6, 2026
29a3853
docs(platform-wallet): correct apply_contacts_and_keys + FFI build co…
lklimek Jul 6, 2026
d6b789e
docs(platform-wallet-ffi): mark missing end-to-end build_wallet_ident…
lklimek Jul 6, 2026
adec4b7
docs(platform-wallet-ffi): enrich build_wallet_identity_bucket TODO w…
lklimek Jul 6, 2026
a814932
fix(platform-wallet): fund asset-lock test fixtures via confirmed UTX…
lklimek Jul 6, 2026
6436891
Merge commit 'a814932d97' into claudius/pr3692-field-cleanup
lklimek Jul 6, 2026
269449b
Merge #3692 tip (d6b789e865) into #3968 prekeyed-join branch
lklimek Jul 6, 2026
df080ff
Merge commit '6436891518' into claudius/pr3968-prekeyed-join
lklimek Jul 6, 2026
04b93e4
docs(platform-wallet-storage): correct empty-manifest branch comment
lklimek Jul 6, 2026
1a332ad
feat(platform-wallet): snapshot readers + unified V002 schema migrati…
Claudius-Maginificent Jul 6, 2026
4624cec
fix(platform-wallet-storage): DashPay pool PK collision + V002 migrat…
lklimek Jul 6, 2026
05bc921
docs(platform-wallet-storage): mark wallet-row-orphaning as an open p…
lklimek Jul 6, 2026
36d84b6
test(platform-wallet-storage): rewrite pool_reader used-set tests aga…
lklimek Jul 6, 2026
1fa145a
test(platform-wallet-storage): rewrite migration_execution used-set t…
lklimek Jul 6, 2026
d7c6846
Merge branch 'v4.1-dev' into feat/platform-wallet-rehydration
lklimek Jul 6, 2026
f4c2218
Merge branch 'feat/platform-wallet-rehydration' into feat/platform-wa…
lklimek Jul 6, 2026
cec6d3b
Merge remote-tracking branch 'origin/v4.1-dev' into feat/platform-wal…
lklimek Jul 7, 2026
e9e98cc
feat(platform-wallet): deliver typed AddressNonceMismatch error to ca…
lklimek Jul 7, 2026
650c32a
fix(platform-wallet-ffi): deliver AddressNonceMismatch across FFI + r…
lklimek Jul 7, 2026
069ee6a
fix(swift-sdk): mirror ErrorAddressNonceMismatch (=21); pin FFI nonce…
lklimek Jul 7, 2026
6103ab6
Merge branch 'v4.1-dev' into feat/platform-wallet-rehydration
lklimek Jul 7, 2026
062caea
chore(deps): bump rust-dashcore pin to key-wallet asset-lock override…
lklimek Jul 7, 2026
a985d23
chore(deps): switch rust-dashcore pin from PR #850 to PR #851
lklimek Jul 8, 2026
d9ee8d5
Merge branch 'feat/platform-wallet-rehydration' into feat/platform-wa…
lklimek Jul 8, 2026
b70062b
test(swift-sdk): replace removed sendToAddresses with builder+broadcast
lklimek Jul 8, 2026
dc77493
fix(swift-sdk): stop funding core-to-core sends from a Platform-Payme…
lklimek Jul 8, 2026
eb3c7ae
fix(platform-wallet-ffi): surface persister-load retry class across t…
lklimek Jul 8, 2026
ccc95e3
Merge remote-tracking branch 'origin/v4.1-dev' into feat/platform-wal…
lklimek Jul 8, 2026
c8c6a93
refactor(platform-wallet): apply PR #3692 self-review notes
lklimek Jul 8, 2026
f8ee551
Merge branch 'v4.1-dev' into feat/platform-wallet-rehydration
lklimek Jul 8, 2026
eacc851
Merge remote-tracking branch 'origin/feat/platform-wallet-rehydration…
lklimek Jul 8, 2026
0503f80
refactor: move persistance to platform wallet storage - human work
lklimek Jul 8, 2026
ee8390b
Merge branch 'v4.1-dev' into feat/platform-wallet-storage-rehydration
lklimek Jul 9, 2026
4e8a122
fix(platform-wallet-storage): pre-materialization size gate on outpoi…
lklimek Jul 9, 2026
a9c500f
style(platform-wallet-storage): fix doc_lazy_continuation in rehydrat…
lklimek Jul 9, 2026
f503797
fix(platform-wallet-storage): move RUSTSEC-2025-0141 ack to root audi…
lklimek Jul 9, 2026
fa9f337
Merge remote-tracking branch 'origin/v4.1-dev' into feat/platform-wal…
lklimek Jul 9, 2026
4ce099e
style(platform-wallet-storage): satisfy rustfmt in error.rs + wallet.…
lklimek Jul 9, 2026
3629884
fix(platform-wallet-storage): compile rehydration-apply test target
lklimek Jul 9, 2026
dd39ce5
docs(platform-wallet-storage): correct stale rehydration docs post-move
lklimek Jul 9, 2026
79e20d2
fix(swift-sdk): reconcile PlatformWallet load FFI to shipped 1-arg co…
lklimek Jul 9, 2026
47a45f0
test(platform-wallet-storage): sync prepare_cached allow-list to gate…
lklimek Jul 9, 2026
258b184
docs(platform-wallet-storage): correct stale core-attribution rehydra…
lklimek Jul 9, 2026
b68c5a8
docs(platform-wallet-storage): correct empty-manifest rehydration com…
lklimek Jul 9, 2026
8ec2ea3
ci(swift-sdk): tolerate runner with no user default keychain in run_t…
lklimek Jul 9, 2026
728f480
fix(platform-wallet): restore From<PersistenceError> for PlatformWall…
lklimek Jul 9, 2026
a503bd7
ci: accept platform-wallet-storage as a conventional-commit scope
lklimek Jul 9, 2026
2045a36
Merge remote-tracking branch 'origin/v4.1-dev' into feat/platform-wal…
lklimek Jul 9, 2026
f2779ca
chore(deps): bump rust-dashcore pin to #851 head; fix importWallet bi…
lklimek Jul 9, 2026
95d28a6
fix(platform-wallet-storage): route restored UTXOs to their true owni…
lklimek Jul 9, 2026
5283236
fix(platform-wallet-storage): warn on orphaned UTXO owner; add end-to…
lklimek Jul 9, 2026
7cdaa65
fix(platform-wallet-storage): route restored used addresses to their …
lklimek Jul 9, 2026
93b967f
Merge remote-tracking branch 'origin/v4.1-dev' into feat/platform-wal…
lklimek Jul 10, 2026
29bbb14
feat(platform-wallet-storage): add mock SecretStore for fast test KDF…
lklimek Jul 13, 2026
d269017
refactor(platform-wallet-storage): one floor-params definition, one g…
lklimek Jul 13, 2026
ae068f2
perf(workspace): opt-level=3 for argon2 in dev builds (#4111)
lklimek Jul 13, 2026
bc9680e
Merge remote-tracking branch 'origin/v4.1-dev' into feat/platform-wal…
lklimek Jul 13, 2026
ba03c9e
docs(rs-platform-wallet-storage): test case spec for #4113 provider-k…
lklimek Jul 13, 2026
7ac50c9
feat(platform-wallet): add ProviderKeyRegistrationBlob
lklimek Jul 13, 2026
31b0aa2
fix(platform-wallet-storage): persist provider key-material accounts
lklimek Jul 13, 2026
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
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
27 changes: 25 additions & 2 deletions .cargo/audit.toml
Original file line number Diff line number Diff line change
@@ -1,3 +1,26 @@
[advisories]
# TODO Remove it from here
ignore = [ "RUSTSEC-2020-0071"] # advisory IDs to ignore e.g. ["RUSTSEC-2019-0001", ...]
# Advisory IDs to ignore, e.g. ["RUSTSEC-2019-0001", ...]. Each entry
# must point at a live advisory in the resolved graph and carry a dated
# rationale; an entry matching nothing trains reviewers to skim the list.
#
# rustsec/audit-check runs from the repo root (.github/workflows/security-audit-rust.yml)
# and only reads THIS file — a crate-local .cargo/audit.toml is never consulted by CI.
ignore = [
# RUSTSEC-2025-0141 — bincode is unmaintained (informational advisory,
# not an exploitable CVE; published 2025-12-16, no patched release).
# Acknowledged 2026-06-08.
#
# Why this is acceptable for now:
# - The advisory reports maintenance status, not a known exploit.
# - Variable-length wallet decode boundaries are budgeted: storage
# enforces MAX_VALUE_LEN / BLOB_SIZE_LIMIT_BYTES, per-secret write
# caps, and MAX_VAULT_SIZE_BYTES; FFI asset-lock recovery rejects
# proofs over 16 MiB and applies the same bincode decode budget.
# - Malformed or oversized persisted data fails with a typed error.
#
# Residual risk: a future bincode defect would go unpatched upstream.
# Remediation plan: migrate the BLOB codec to a maintained equivalent
# (postcard / bitcode candidates) once the wire format is frozen at
# release; revisit this ignore at that time.
"RUSTSEC-2025-0141",
]
2 changes: 2 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 @@ -113,6 +113,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 @@ -126,6 +133,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
37 changes: 36 additions & 1 deletion packages/rs-platform-wallet-ffi/src/asset_lock/sync.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,20 @@ use std::ffi::CString;
use std::os::raw::c_char;
use std::time::Duration;

const MAX_ASSET_LOCK_PROOF_SIZE_BYTES: usize = 16 * 1024 * 1024;

fn validate_asset_lock_proof_size(proof_len: usize) -> Result<(), PlatformWalletFFIResult> {
if proof_len > MAX_ASSET_LOCK_PROOF_SIZE_BYTES {
return Err(PlatformWalletFFIResult::err(
PlatformWalletFFIResultCode::ErrorInvalidParameter,
format!(
"asset lock proof length {proof_len} exceeds the {MAX_ASSET_LOCK_PROOF_SIZE_BYTES}-byte limit"
),
));
}
Ok(())
}

/// Build an `OutPoint` from a 32-byte raw txid pointer and a vout.
///
/// **FFI invariant:** the `txid` parameter is typed `*const [u8; 32]`,
Expand Down Expand Up @@ -188,10 +202,13 @@ pub unsafe extern "C" fn asset_lock_manager_recover(

// Parse optional proof
let proof = if !proof_bytes.is_null() && proof_len > 0 {
// A proof contains one Core transaction and, at most, one InstantLock;
// 16 MiB is generous while matching the persisted-blob ceiling.
unwrap_result_or_return!(validate_asset_lock_proof_size(proof_len));
let data = std::slice::from_raw_parts(proof_bytes, proof_len);
let (p, _) = unwrap_result_or_return!(dpp::bincode::decode_from_slice(
data,
dpp::bincode::config::standard()
dpp::bincode::config::standard().with_limit::<MAX_ASSET_LOCK_PROOF_SIZE_BYTES>()
));
Some(p)
} else {
Expand All @@ -212,3 +229,21 @@ pub unsafe extern "C" fn asset_lock_manager_recover(
unwrap_option_or_return!(option);
PlatformWalletFFIResult::ok()
}

#[cfg(test)]
mod tests {
use super::*;

#[test]
fn should_reject_oversized_asset_lock_proof_before_decode() {
assert!(validate_asset_lock_proof_size(MAX_ASSET_LOCK_PROOF_SIZE_BYTES).is_ok());

let result = validate_asset_lock_proof_size(MAX_ASSET_LOCK_PROOF_SIZE_BYTES + 1)
.expect_err("oversized proof must fail");

assert_eq!(
result.code,
PlatformWalletFFIResultCode::ErrorInvalidParameter
);
}
}
124 changes: 120 additions & 4 deletions packages/rs-platform-wallet-ffi/src/error.rs
Original file line number Diff line number Diff line change
Expand Up @@ -369,6 +369,16 @@ pub enum PlatformWalletFFIResultCode {
/// shortfall, not a shielded-note shortfall.
ErrorShieldedInsufficientBalance = 41,

// -----------------------------------------------------------------
// Embedded-persister failures (42-43). A fresh contiguous block above
// every current claim, per the registry note above: 28 and 30 are
// nominally free but reusing a vacated slot restarts the churn.
// -----------------------------------------------------------------
/// A persister operation failed transiently; callers may retry.
ErrorPersisterTransient = 42,
/// A persister operation failed permanently; callers must not retry.
ErrorPersisterFatal = 43,

/// The named thing does not exist.
///
/// Originally (and still mostly) the code for every `Option` returned as an
Expand All @@ -390,6 +400,31 @@ pub enum PlatformWalletFFIResultCode {
ErrorUnknown = 99,
}

fn persistence_result_code(
error: &platform_wallet::changeset::PersistenceError,
) -> PlatformWalletFFIResultCode {
if error.is_transient() {
PlatformWalletFFIResultCode::ErrorPersisterTransient
} else {
PlatformWalletFFIResultCode::ErrorPersisterFatal
}
}

fn platform_wallet_persister_result_code(
mut error: &PlatformWalletError,
) -> PlatformWalletFFIResultCode {
loop {
match error {
PlatformWalletError::PersisterLoad(error)
| PlatformWalletError::PersisterStore(error) => {
return persistence_result_code(error);
}
PlatformWalletError::PersisterRestore(inner) => error = inner,
_ => return PlatformWalletFFIResultCode::ErrorPersisterFatal,
}
}
}

/// Must be freed with ['platform_wallet_ffi_result_free']
#[repr(C)]
#[derive(Debug)]
Expand Down Expand Up @@ -621,6 +656,11 @@ impl From<PlatformWalletError> for PlatformWalletFFIResult {
PlatformWalletError::AssetLockFundingMismatch { .. } => {
PlatformWalletFFIResultCode::ErrorAssetLockFundingMismatch
}
PlatformWalletError::PersisterLoad(..)
| PlatformWalletError::PersisterStore(..)
| PlatformWalletError::PersisterRestore(..) => {
platform_wallet_persister_result_code(&error)
}
// A quiesce/drain barrier that did not complete within budget
// (clear/reset paths). The host must fail closed: keep its
// callback context alive and skip any paired persistence wipe.
Expand Down Expand Up @@ -888,10 +928,8 @@ impl From<dpp::platform_value::Error> for PlatformWalletFFIResult {

impl From<platform_wallet::changeset::PersistenceError> for PlatformWalletFFIResult {
fn from(e: platform_wallet::changeset::PersistenceError) -> Self {
Self::err(
PlatformWalletFFIResultCode::ErrorWalletOperation,
format!("persistence error: {e}"),
)
let code = persistence_result_code(&e);
Self::err(code, format!("persistence error: {e}"))
}
}

Expand All @@ -916,6 +954,19 @@ impl From<anyhow::Error> for PlatformWalletFFIResult {
#[cfg(test)]
mod tests {
use super::*;

#[test]
fn result_code_discriminants_remain_stable() {
assert_eq!(
PlatformWalletFFIResultCode::ErrorPersisterTransient as i32,
42
);
assert_eq!(PlatformWalletFFIResultCode::ErrorPersisterFatal as i32, 43);
assert_eq!(
PlatformWalletFFIResultCode::ErrorTransactionBroadcastRejected as i32,
26
);
}
use key_wallet::account::StandardAccountType;
use key_wallet::wallet::managed_wallet_info::transaction_building::AccountTypePreference;

Expand Down Expand Up @@ -955,6 +1006,71 @@ mod tests {
assert!(!r.message.is_null());
}

fn persistence_error(
kind: platform_wallet::changeset::PersistenceErrorKind,
) -> platform_wallet::changeset::PersistenceError {
platform_wallet::changeset::PersistenceError::backend_with_kind(kind, "test failure")
}

#[test]
fn should_map_persistence_errors_by_retry_classification() {
use platform_wallet::changeset::{PersistenceError, PersistenceErrorKind};

let transient: PlatformWalletFFIResult =
persistence_error(PersistenceErrorKind::Transient).into();
assert_eq!(
transient.code,
PlatformWalletFFIResultCode::ErrorPersisterTransient
);

for error in [
persistence_error(PersistenceErrorKind::Fatal),
persistence_error(PersistenceErrorKind::Constraint),
PersistenceError::LockPoisoned,
] {
let result: PlatformWalletFFIResult = error.into();
assert_eq!(
result.code,
PlatformWalletFFIResultCode::ErrorPersisterFatal
);
}
}

#[test]
fn should_map_platform_wallet_persister_errors_by_retry_classification() {
use platform_wallet::changeset::PersistenceErrorKind;

let cases = [
(
PlatformWalletError::PersisterLoad(persistence_error(
PersistenceErrorKind::Transient,
)),
PlatformWalletFFIResultCode::ErrorPersisterTransient,
),
(
PlatformWalletError::PersisterStore(persistence_error(PersistenceErrorKind::Fatal)),
PlatformWalletFFIResultCode::ErrorPersisterFatal,
),
(
PlatformWalletError::PersisterRestore(Box::new(
PlatformWalletError::PersisterStore(persistence_error(
PersistenceErrorKind::Transient,
)),
)),
PlatformWalletFFIResultCode::ErrorPersisterTransient,
),
(
PlatformWalletError::PersisterRestore(Box::new(PlatformWalletError::WalletLocked)),
PlatformWalletFFIResultCode::ErrorPersisterFatal,
),
];

for (error, expected) in cases {
let result: PlatformWalletFFIResult = error.into();
assert_eq!(result.code, expected);
}
}

/// The three "can't-select-inputs" wallet variants (`NoSpendableInputs`,
/// `OnlyOutputAddressesFunded`, `OnlyDustInputs`) all map to the dedicated
/// `ErrorNoSelectableInputs` FFI code rather than flattening to
Expand Down
Loading
Loading