Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
415 commits
Select commit Hold shift + click to select a range
b9a9293
feat(rs-platform-wallet/e2e): add wait_for_bank_funded framework gate
lklimek May 5, 2026
7760040
feat(rs-platform-wallet/e2e): gate bank operations on cold-cache filt…
lklimek May 5, 2026
717e6c1
docs(rs-platform-wallet/e2e): document cold-cache scan time on ID-007…
lklimek May 5, 2026
4735964
feat(rs-platform-wallet/e2e): surface dash-spv ManagerError early in …
lklimek May 5, 2026
9c62fd8
docs(rs-platform-wallet/e2e): document mn-list QRInfo stall known issue
lklimek May 5, 2026
32ee2cd
Merge origin/v3.1-dev into feat/rs-platform-wallet-id-007-stub
lklimek May 5, 2026
9df3aa4
docs(rs-platform-wallet/e2e): flip ID-007 to Pass after testnet pass
lklimek May 5, 2026
f3416dc
fix(rs-platform-wallet/e2e): wait_for_core_balance now requires confi…
lklimek May 5, 2026
409d088
docs(rs-platform-wallet/e2e): drop stale BLOCKED parenthetical from I…
lklimek May 5, 2026
1a03112
test(rs-platform-wallet/e2e): invert ID-007 — assert correct behavior…
lklimek May 5, 2026
d368436
docs(rs-platform-wallet/e2e): update ID-007 spec status to FAILING-by…
lklimek May 5, 2026
69ff154
fix(rs-platform-wallet/e2e): CR-003 POST-pin uses credits, not duffs
lklimek May 5, 2026
fa55e64
chore(rs-platform-wallet/e2e): wait_for_core_balance logs which path …
lklimek May 5, 2026
dc186fd
docs(rs-platform-wallet/e2e): flip CR-003 to Pass after units fix ver…
lklimek May 5, 2026
aace4d9
test(rs-platform-wallet/e2e): restore ID-007 — pin intentional not-mo…
lklimek May 5, 2026
8457aa6
merge: ID-007 restoration into integration branch
lklimek May 6, 2026
1bd306a
fix: improve platform wallet UTXO checks and DPNS parsing (#3595)
thepastaclaw May 6, 2026
4616cba
Merge branch 'v3.1-dev' into fix/dpns-case-and-utxo-race-v3.1-dev
lklimek May 6, 2026
23d8943
fix(rs-platform-wallet): defer change-address advance until after rev…
lklimek May 6, 2026
a3a5d96
fix(rs-platform-wallet): typed ConcurrentSpendConflict variant for re…
lklimek May 6, 2026
a8137a8
fix(rs-platform-wallet/e2e): tradeMode in tokens helper is the market…
lklimek May 6, 2026
1216e5d
fix(rs-platform-wallet/e2e): bank Core funding gate default-on (opt o…
lklimek May 6, 2026
a9fed73
test(rs-platform-wallet/e2e): bump DPNS-001 REGISTRATION_FUNDING to 130M
lklimek May 6, 2026
41c9493
fix(rs-sdk): skip DPNS contract fetch when label is empty (CMT-001)
lklimek May 6, 2026
2c7e22a
docs(rs-platform-wallet): rewrite revalidation comment to match build…
lklimek May 6, 2026
97d1532
fix(rs-platform-wallet): structured event for post-broadcast !is_rele…
lklimek May 6, 2026
79843e3
test(rs-platform-wallet): broadcast ordering + rollback contract (CMT…
lklimek May 6, 2026
2cd9a7b
fix(rs-platform-wallet/e2e): release SPV data-dir lock on panic to st…
lklimek May 6, 2026
391768c
docs(rs-platform-wallet): tighten and deduplicate inline comments on …
lklimek May 6, 2026
43e3f9d
fix(rs-platform-wallet): defer change-address commit past broadcast (…
lklimek May 6, 2026
5d4a61b
test(rs-platform-wallet): rename broadcast pass-through tests to matc…
lklimek May 6, 2026
2dec6a6
Merge branch 'v3.1-dev' into fix/rs-platform-wallet-auto-select-inputs
lklimek May 6, 2026
6574b84
Merge branch 'v3.1-dev' into fix/rs-platform-wallet-auto-select-inputs
lklimek May 7, 2026
b2719d3
merge: collapse test/platform-wallet-e2e integration branch into feat…
lklimek May 7, 2026
f33ba2e
merge: v3.1-dev (dpp/drive/swift-sdk fixes)
lklimek May 7, 2026
589b5b2
test(platform-wallet): CR-004 spec — legacy BIP32 account UTXO update…
Claudius-Maginificent May 7, 2026
7af098e
Merge remote-tracking branch 'origin/v3.1-dev' into feat/rs-platform-…
lklimek May 7, 2026
5ef1b44
Merge branch 'v3.1-dev' into fix/rs-platform-wallet-auto-select-inputs
lklimek May 8, 2026
cc2104f
Merge remote-tracking branch 'origin/v3.1-dev' into fix/dpns-case-and…
lklimek May 8, 2026
e46d12a
refactor(platform-wallet/auto_select_inputs): inline helpers, collaps…
lklimek May 8, 2026
6aa4f42
Merge branch 'v3.1-dev' into fix/dpns-case-and-utxo-race-v3.1-dev
lklimek May 8, 2026
e986342
fix(rs-platform-wallet): pin unreachable selector branches with debug…
lklimek May 8, 2026
4dd55d2
fix: close same-UTXO concurrent-selection race in send_to_addresses (…
lklimek May 8, 2026
9e9d289
refactor(rs-platform-wallet): tighten transfer.rs narration, TODO lin…
lklimek May 8, 2026
eb68dba
fix(rs-platform-wallet): NoSelectableInputs Display omits zero-valued…
lklimek May 8, 2026
349b95b
feat(rs-platform-wallet): attach outpoint context to ConcurrentSpendC…
lklimek May 8, 2026
6239fda
chore(rs-platform-wallet): drop CMT-NNN review tombstones from broadc…
lklimek May 8, 2026
4d204cd
fix(rs-platform-wallet): structured tracing fields on wallet-missing …
lklimek May 8, 2026
25e48dd
test(platform-wallet): CR-001 — SPV mn-list sync readiness (#3614)
Claudius-Maginificent May 8, 2026
35f0e98
Merge branch 'v3.1-dev' into fix/rs-platform-wallet-auto-select-inputs
lklimek May 8, 2026
e7adc2f
test(platform-wallet): CR-004 — legacy BIP32 UTXO update after spend …
Claudius-Maginificent May 8, 2026
776cbd7
feat(rs-platform-wallet): output_change_address override on platform-…
lklimek May 8, 2026
22149b0
Merge remote-tracking branch 'origin/v3.1-dev' into fix/rs-platform-w…
lklimek May 8, 2026
ce94389
Merge remote-tracking branch 'origin/fix/rs-platform-wallet-auto-sele…
lklimek May 8, 2026
5c6baab
test(platform-wallet): QA-V6→V26 fixes + parallelism contract (#3609)
Claudius-Maginificent May 11, 2026
0a5aa2e
Merge branch 'v3.1-dev' into fix/rs-platform-wallet-auto-select-inputs
lklimek May 11, 2026
f0ea9ad
Merge branch 'fix/rs-platform-wallet-auto-select-inputs' into feat/rs…
lklimek May 11, 2026
fcbac27
test(rs-platform-wallet): drop CR-004 env-var silent-pass; fail hones…
lklimek May 11, 2026
f6f2702
test(rs-platform-wallet): split bank FUNDING_MUTEX, add nonce-retry b…
lklimek May 11, 2026
c03774b
test(rs-platform-wallet): add wait gates to token ops, raise wait_for…
lklimek May 11, 2026
c51836c
test(rs-platform-wallet): bump DPNS-001 STEP_TIMEOUT 60s → 120s
lklimek May 11, 2026
8966257
chore(rs-platform-wallet): reduce e2e identity funding to 0.001 tDASH…
lklimek May 11, 2026
89e8400
chore(rs-platform-wallet): align e2e identity funding with sweep-floo…
lklimek May 11, 2026
81f54b9
fix(rs-platform-wallet): align e2e funding floors with DPP protocol m…
lklimek May 11, 2026
2d77385
fix(rs-platform-wallet): sweep_identities — refresh balance from chain
lklimek May 11, 2026
ab22eff
test(rs-platform-wallet): add identity-state auto-sync to e2e harness
lklimek May 11, 2026
1e30f63
test(rs-platform-wallet): IdentitySync cadence 3s→15s; add per-tick t…
lklimek May 11, 2026
abc376b
refactor(rs-platform-wallet): consolidate Platform-side bank flows ar…
lklimek May 11, 2026
8ae72fd
fix(rs-platform-wallet): align id_sweep test + auto-provision bank TR…
lklimek May 11, 2026
75f23ea
test(rs-platform-wallet/e2e): assert id_sweep on returned report (QA-…
lklimek May 11, 2026
6e0fab6
test(rs-platform-wallet/e2e): bump TK setup wait + augment wait_for_b…
lklimek May 11, 2026
1472183
test(rs-platform-wallet/e2e): route TK-013 + TK-014 setup through 120…
lklimek May 11, 2026
f71183b
test(rs-platform-wallet/e2e): derive IDENTITY_SWEEP_FLOOR from chain …
lklimek May 11, 2026
7135b4c
test(rs-platform-wallet/e2e): wire IdentitySync graceful teardown + l…
lklimek May 11, 2026
c73ccc5
test(rs-platform-wallet/e2e): role-specific TK funding amounts (peer …
lklimek May 11, 2026
6ac7d62
test(rs-platform-wallet/e2e): remove PA-010 placeholder (blocked test…
lklimek May 11, 2026
3d916e3
test(rs-platform-wallet/e2e): rescope PA-004b + PA-009 trim/assertion…
lklimek May 11, 2026
08bac5e
Revert "test(rs-platform-wallet/e2e): derive IDENTITY_SWEEP_FLOOR fro…
lklimek May 11, 2026
b4d144b
test(rs-platform-wallet/e2e): correct TK funding amounts to cover dyn…
lklimek May 11, 2026
20ac23c
docs(rs-platform-wallet/e2e): remove stale PA-010 references (QA-V42-…
lklimek May 11, 2026
5f955df
docs(rs-platform-wallet/e2e): spec ID-002b — asset-lock-funded top-up…
lklimek May 12, 2026
5f1dbda
docs(rs-platform-wallet/e2e): fix TEST_SPEC.md inconsistencies (DOC-0…
lklimek May 12, 2026
351d52a
docs(rs-platform-wallet/e2e): spec AL-001 — concurrent asset-lock bui…
lklimek May 12, 2026
aa70c1e
docs(rs-platform-wallet/e2e): TEST_SPEC.md updates from upstream audi…
lklimek May 12, 2026
1c4c8a7
test(rs-platform-wallet/e2e): fix CR-004 to use multi-variant next_re…
lklimek May 12, 2026
75ac47b
test(rs-platform-wallet/e2e): implement ID-002b — asset-lock-funded t…
lklimek May 12, 2026
882920a
test(rs-platform-wallet/e2e): implement AL-001 — concurrent asset-loc…
lklimek May 12, 2026
4583794
test(rs-platform-wallet/e2e): implement Found-004 — silent address_in…
lklimek May 12, 2026
26c92c1
test(rs-platform-wallet/e2e): implement Found-006 — topup_index ignored
lklimek May 12, 2026
1c64b2d
test(rs-platform-wallet/e2e): implement Found-008 — LockNotifyHandler…
lklimek May 12, 2026
a3903ea
test(rs-platform-wallet/e2e): implement Found-012 — account-type tunn…
lklimek May 12, 2026
0bd6f7a
test(rs-platform-wallet/e2e): implement Found-013 — recover_asset_loc…
lklimek May 12, 2026
ac9d9c4
test(rs-platform-wallet/e2e): pin Found-008 with #[ignore] so it join…
lklimek May 12, 2026
3411283
test(rs-platform-wallet/e2e): rewrite Found-008 with pre-spawn notify…
lklimek May 12, 2026
1316ab2
fix(rs-platform-wallet/e2e): close QA-004 TOCTOU in teardown_one (sna…
lklimek May 12, 2026
9286e1c
fix(rs-platform-wallet/e2e): correct CR-004 send-all amount so change…
lklimek May 12, 2026
1bee06e
fix(rs-platform-wallet/e2e): provision IdentityTopUp HD accounts befo…
lklimek May 12, 2026
822562d
docs(rs-platform-wallet/e2e): reclassify Found-006 and CR-004 per QA-…
lklimek May 12, 2026
543a8dc
Merge remote-tracking branch 'origin/v3.1-dev' into fix/dpns-case-and…
lklimek May 12, 2026
a689c5b
fix(rs-platform-wallet/e2e): raise CR-004 send-all headroom to 3_000 …
lklimek May 12, 2026
51c1c10
fix(rs-platform-wallet/e2e): pre-split bank UTXO into N+1 coins befor…
lklimek May 12, 2026
16636f0
fix(rs-platform-wallet): ownership guard in post-broadcast ledger upd…
lklimek May 12, 2026
f52d268
test(rs-platform-wallet/e2e): implement Found-024 — V27-007 transfer …
lklimek May 12, 2026
a55a7a0
test(rs-platform-wallet/e2e): rewrite Found-006 per QA-012 — non-sequ…
lklimek May 12, 2026
caae58c
docs(rs-platform-wallet/e2e): spec Found-024 — V27-007 transfer owner…
lklimek May 12, 2026
22cecc1
test(rs-platform-wallet/e2e): QA-013 — tag found_024 with #[ignore] f…
lklimek May 12, 2026
64d3b6d
test(rs-platform-wallet/e2e): QA-015 — reserve 10K duffs for split TX…
lklimek May 12, 2026
ebcddf7
test(rs-platform-wallet/e2e): QA-018 — update stale #[ignore] reasons…
lklimek May 12, 2026
0bacd25
chore: improve error type
lklimek May 12, 2026
e93c5b3
test(rs-platform-wallet/e2e): QA-016/CR-004 — headroom -3_000 → -2_500
lklimek May 12, 2026
55472a3
test(rs-platform-wallet/e2e): QA-014 — sync_balances(None) → full res…
lklimek May 12, 2026
0188fa9
chore: improve docs
lklimek May 12, 2026
25bbb3f
Merge branch 'v3.1-dev' into fix/rs-platform-wallet-auto-select-inputs
lklimek May 12, 2026
92165ec
merge: fix/rs-platform-wallet-auto-select-inputs (PR #3554) into feat…
lklimek May 12, 2026
5cca0fb
test(rs-platform-wallet/e2e): enrich bank funding diagnostics — disam…
lklimek May 12, 2026
1bbe41c
docs(rs-platform-wallet/e2e): spec Found-025 — rs-sdk address-sync si…
lklimek May 12, 2026
cf9b6d2
test(rs-platform-wallet/e2e): implement Found-025 — rs-sdk address-sy…
lklimek May 12, 2026
9902cbd
chore: fix build
lklimek May 12, 2026
403d29c
test(rs-platform-wallet/e2e): AL-001 — wait for split UTXOs SPV-visib…
lklimek May 12, 2026
fe44be5
test(rs-platform-wallet/e2e): reclassify TK wait_for_balance flakes a…
lklimek May 12, 2026
55288c6
chore(cargo): normalize Cargo.lock whitespace + sync rand 0.8.6
lklimek May 12, 2026
e9860be
docs(rs-platform-wallet/e2e): v47 status audit — reconcile all test s…
lklimek May 12, 2026
e85d558
test(rs-platform-wallet/e2e): implement Found-021 — TransactionRecord…
lklimek May 12, 2026
b673a7d
test(rs-platform-wallet/e2e): implement Found-022 — AssetLockBuilder …
lklimek May 12, 2026
0dd5f83
docs(rs-platform-wallet/e2e): reflect Found-021/022 red-by-design status
lklimek May 12, 2026
b66e7dd
chore: fmt
lklimek May 13, 2026
60a2255
Merge branch 'fix/rs-platform-wallet-auto-select-inputs' into feat/rs…
lklimek May 13, 2026
6951523
test(rs-platform-wallet/e2e): TK-011 gate post-purchase reads on wait…
lklimek May 13, 2026
6bb0017
test(rs-platform-wallet/e2e): TK-013 gate post-claim reads on wait_fo…
lklimek May 13, 2026
c00f1d4
test(rs-platform-wallet/e2e): TK-014 gate post-mint reads on wait_for…
lklimek May 13, 2026
262ba34
test(rs-platform-wallet/e2e): retarget Found-022 to pin monitor_revis…
lklimek May 13, 2026
e7e5d6d
test(rs-platform-wallet/e2e): retarget Found-025 — delete fake-pin, d…
lklimek May 13, 2026
ea8dc63
test(rs-platform-wallet): cover reduce_output Phase 1/3 + wrapper Aut…
lklimek May 13, 2026
9a4fc30
docs(rs-platform-wallet): document DeductFromInput contract + trim ve…
lklimek May 13, 2026
047ffca
docs(rs-platform-wallet): clarify donor selection + sub-minimum guard
lklimek May 13, 2026
79c83c6
refactor(rs-platform-wallet): extract saturating_sum + change-addr co…
lklimek May 13, 2026
9ee4e3c
refactor(rs-platform-wallet): remove format_address (duplicates Display)
lklimek May 13, 2026
aba7ca3
refactor(rs-platform-wallet): split NoSelectableInputs into typed var…
lklimek May 13, 2026
4526836
ci: revert tests-rs-workspace.yml disk-cleanup step
lklimek May 13, 2026
72fee50
fix(rs-platform-wallet-ffi): drop stale ptr arg from integration_tests
lklimek May 13, 2026
edd3ea5
chore: cargo fmt
lklimek May 13, 2026
c5511a7
chore(rs-platform-wallet-ffi): use Result::is_err in group_info tests
lklimek May 13, 2026
02cb61b
merge: integrate PR #3585 (UTXO race close via reservations) into fea…
lklimek May 13, 2026
63f039a
refactor(rs-platform-wallet): remove unused PlatformAddressChangeSet:…
lklimek May 13, 2026
371e2c3
fix(rs-platform-wallet): restore defensive post-build UTXO revalidation
lklimek May 13, 2026
bd5eb61
fix(rs-platform-wallet): restore defensive post-build UTXO revalidation
lklimek May 13, 2026
926f0a7
refactor(rs-platform-wallet): drop dead GapLimitExceeded error variant
lklimek May 13, 2026
ff56c56
chore(rs-platform-wallet-ffi): use Result::is_err in group_info tests
lklimek May 13, 2026
fc7e9f8
test(rs-platform-wallet/e2e): ID-003 gate post-transfer reads on wait…
lklimek May 13, 2026
ce0d555
docs(rs-platform-wallet/e2e): fully document AL-001 — Found-008 upstr…
lklimek May 13, 2026
5466501
chore: fmt
lklimek May 13, 2026
30e612b
Merge remote-tracking branch 'origin/v3.1-dev' into fix/rs-platform-w…
lklimek May 14, 2026
e4cf6b3
Merge remote-tracking branch 'origin/v3.1-dev' into fix/dpns-case-and…
lklimek May 14, 2026
116bc8a
Merge remote-tracking branch 'origin/fix/rs-platform-wallet-auto-sele…
lklimek May 14, 2026
f209063
Merge remote-tracking branch 'origin/fix/dpns-case-and-utxo-race-v3.1…
lklimek May 14, 2026
dc5e611
fix(rs-platform-wallet-ffi): map split NoSelectableInputs variants to…
lklimek May 14, 2026
ba1e85e
test(rs-platform-wallet/e2e): update bank.rs nonce-class test to use …
lklimek May 14, 2026
399c40a
docs(rs-platform-wallet/e2e): triage v48 — reclassify PA-003/005b/008…
lklimek May 14, 2026
f112600
docs(rs-platform-wallet/e2e): correct Found-008 location, link to das…
lklimek May 14, 2026
27087f8
docs(rs-platform-wallet/e2e): refresh AL-001 comments — link filed is…
lklimek May 14, 2026
d7ed4af
docs(rs-platform-wallet/e2e): polish Found-021 — pin upstream lines +…
lklimek May 14, 2026
420250d
docs(rs-platform-wallet/e2e): link Found-021 to dashpay/rust-dashcore…
lklimek May 14, 2026
b01be51
docs(rs-platform-wallet/e2e): link Found-022 to dashpay/rust-dashcore…
lklimek May 14, 2026
be0899b
chore: bump rust-dashcore to 5297d61a for chainlock wallet handling
shumkov May 14, 2026
6955138
fix(rs-platform-wallet/e2e): retarget CR-004 — dust threshold 2,730 →…
lklimek May 14, 2026
b1d35e4
docs(rs-platform-wallet): link Found-012/023 to dashpay/platform#3642
lklimek May 14, 2026
668a222
docs(rs-platform-wallet/e2e): delete Found-019 and Found-020 entries …
lklimek May 14, 2026
63ee3ba
fix(rs-platform-wallet/e2e): retarget CR-004 to positive #845 change-…
lklimek May 15, 2026
d3c02ca
fix(rs-platform-wallet/e2e): pin PA-003 fee scaling on real chain-tim…
lklimek May 15, 2026
7651ca8
fix(rs-platform-wallet/e2e): rebaseline PA-005b gap-limit triplet to …
lklimek May 15, 2026
f625f83
fix(rs-platform-wallet/e2e): pin PA-009c via deterministic on-chain r…
lklimek May 15, 2026
f78deda
fix(rs-platform-wallet/e2e): harden TK-001/TK-014 setup gates against…
lklimek May 15, 2026
f5ddda6
docs(rs-platform-wallet/e2e): correct README run flag + flag al_001 F…
lklimek May 15, 2026
c6693df
docs(rs-platform-wallet/e2e): drop al_001 env-mask note (handled out-…
lklimek May 15, 2026
435b972
test(rs-platform-wallet/e2e): add Found-017 red-by-design pin (persis…
lklimek May 15, 2026
91f1ada
fix(rs-sdk): address-sync no longer silently discards balance changes…
lklimek May 15, 2026
d5fb7f5
fix(rs-platform-wallet/e2e): pin Core bank top-up to fixed BIP-44 ind…
lklimek May 15, 2026
1110bd0
fix(rs-platform-wallet/e2e): realistic Core self-refill on setup+tear…
lklimek May 15, 2026
0376706
test(rs-platform-wallet/e2e): swap identity funding gates to chain-co…
lklimek May 15, 2026
db00fbe
test(rs-platform-wallet/e2e): triage 4 v-run findings post-Found-025 …
lklimek May 15, 2026
e6bd370
test(rs-platform-wallet/e2e): swap pa_006b:81 funding precondition to…
lklimek May 15, 2026
7a22f81
fix(rs-platform-wallet/e2e): close #480 funding-precondition gate mis…
lklimek May 15, 2026
e83a43c
docs(rs-platform-wallet/e2e): correct PA-001b TEST_SPEC kept-wait lin…
lklimek May 15, 2026
35400f1
docs(rs-platform-wallet/e2e): reclassify PA-001/002/003 stale-green→F…
lklimek May 18, 2026
c26f451
refactor(rs-platform-wallet): delete SpvRuntime::event_manager(), con…
lklimek May 18, 2026
9e24f1f
fix(rs-platform-wallet/e2e): treat broadcast Lagged as mn-list stall …
lklimek May 18, 2026
0618e6e
fix(rs-platform-wallet): reserve platform receive address on hand-out…
lklimek May 18, 2026
cba5125
fix(rs-platform-wallet/e2e): align slot-0 consumption with native res…
lklimek May 18, 2026
00437db
fix(rs-platform-wallet/e2e): sync wallet cache after chain-confirmed …
lklimek May 18, 2026
0e547b0
fix(rs-platform-wallet): fail-closed on registration persist error (F…
lklimek May 18, 2026
76baafd
docs(rs-platform-wallet/e2e): reclass Found-026/017 fixed + re-spec P…
lklimek May 18, 2026
7e57f72
perf(rs-platform-wallet/e2e): right-size gate timeouts to observed-su…
lklimek May 18, 2026
8309f18
test(rs-platform-wallet/e2e): discriminate QA-001 slot-0 guard messag…
lklimek May 19, 2026
7f28778
test(rs-platform-wallet/e2e): note warm-rerun-recurrence implies genu…
lklimek May 19, 2026
436d38b
Merge branch 'v3.1-dev' into fix/rs-platform-wallet-auto-select-inputs
lklimek May 19, 2026
bb09b9b
Merge remote-tracking branch 'origin/fix/rs-platform-wallet-auto-sele…
lklimek May 19, 2026
9f5518c
test(rs-platform-wallet/e2e): activate Found-017 regression guard + r…
lklimek May 19, 2026
f18fa0e
test(rs-platform-wallet/e2e): reclassify AL-001 stale RED-by-design →…
lklimek May 19, 2026
a8c0df5
test(rs-platform-wallet/e2e): al_001 Found-008-vs-environmental diagn…
lklimek May 19, 2026
e52b534
test(rs-platform-wallet/e2e): derive bank Platform signer from synced…
lklimek May 19, 2026
ad28b83
test(rs-platform-wallet/e2e): fix sweep Platform signer static-window…
lklimek May 19, 2026
2b8eae0
fix(rs-sdk,drive-abci): version-dispatch GetDocumentsRequest + initia…
lklimek May 20, 2026
8d5de89
test(rs-platform-wallet/e2e): seed Sdk initial protocol version to 10…
lklimek May 20, 2026
ced1eb5
refactor(rs-sdk): pass &Sdk through Query::query(); drop protocol_ver…
lklimek May 20, 2026
34e0395
fix(rs-platform-version,rs-sdk): re-pin PV_V1..V10 to V0 query bundle…
lklimek May 20, 2026
d5d2b3d
Merge remote-tracking branch 'origin/v3.1-dev' into fix/rs-platform-w…
lklimek May 20, 2026
5e760dc
Merge branch 'fix/rs-platform-wallet-auto-select-inputs' into feat/rs…
lklimek May 20, 2026
8c0d614
fix(rs-sdk): connect PV-aware encoder to live DocumentQuery::execute_…
lklimek May 20, 2026
fedfce8
refactor(rs-sdk): split Fetch::Query (rich) from Fetch::Request (wire)
lklimek May 20, 2026
6f7b2b1
revert(rs-platform-wallet): drop per-field-max update_sync_state mono…
lklimek May 21, 2026
098484f
fix(platform-wallet): reject sub-minimum change residual pre-broadcast
lklimek May 21, 2026
8ee78a4
docs(platform-wallet): rewrite InputSelection::Auto contract
lklimek May 21, 2026
3aeed87
fix(platform-wallet): include addresses_derived in is_empty_no_records
lklimek May 21, 2026
6c3fb02
fix(platform-wallet): defensively sort selector inputs balance-descen…
lklimek May 21, 2026
e2140bd
fix(platform-wallet): recompute fee against selected count post-Phase-4
lklimek May 21, 2026
b85b6a9
fix(platform-wallet): preserve dust info in OnlyOutputAddressesFunded
lklimek May 21, 2026
cfe3c33
fix(platform-wallet): checked overflow on caller-supplied input sums
lklimek May 21, 2026
9854e38
refactor(platform-wallet)!: take outputs as IndexMap and guard change…
lklimek May 21, 2026
9c136cd
feat(platform-wallet-ffi,swift): typed FFI codes for selector errors
lklimek May 21, 2026
7c7a2ec
docs(platform-wallet): mark QA-007/CMT-004 follow-up TODOs
lklimek May 21, 2026
2957623
style(platform-wallet): cargo fmt after auto-select fixes
lklimek May 21, 2026
94bbb64
Merge branch 'v3.1-dev' into fix/rs-platform-wallet-auto-select-inputs
lklimek May 21, 2026
ceb4fc8
Merge remote-tracking branch 'origin/v3.1-dev' into mb-pr3554
lklimek May 22, 2026
288ea92
Merge fix/rs-platform-wallet-auto-select-inputs (with origin/v3.1-dev…
lklimek May 22, 2026
f6a85e7
chore(rs-platform-wallet): retarget e2e operator config to porter devnet
lklimek May 22, 2026
cda0730
fix(rs-platform-wallet): adapt e2e tests to v3.1-dev API drift
lklimek May 22, 2026
9d9abda
test(rs-platform-wallet): gate e2e suite behind cargo feature, drop #…
lklimek May 22, 2026
8e66cf1
docs(rs-platform-wallet): update TEST_SPEC current-run-mechanism pros…
lklimek May 22, 2026
63e0acf
docs(rs-platform-wallet): fix dpns_001 stale run command in TEST_SPEC…
lklimek May 22, 2026
8e5a995
feat(rs-platform-wallet): wire SPV-backed context provider for e2e (Q…
lklimek May 22, 2026
d381867
docs(rs-platform-wallet): offline bank-address util + porter env/READ…
lklimek May 22, 2026
94478d0
feat(rs-platform-wallet): smart bank fund planner with Core→Platform …
lklimek May 22, 2026
bfcb1d9
docs(rs-platform-wallet): document smart fund planner + new MIN_* knobs
lklimek May 22, 2026
c5e95f9
feat(rs-platform-wallet): pre-seed devnet genesis into SPV storage
lklimek May 22, 2026
15cabcb
fix(rs-platform-wallet-ffi): drop stale ErrorNoSelectableInputs refer…
lklimek May 22, 2026
bebe0fe
docs(rs-platform-wallet): TODO marking the porter SPV P2P handshake b…
lklimek May 22, 2026
a301b6c
feat(platform-wallet): add deprecation-stopgap accessors + migrate e2…
lklimek May 25, 2026
c31dcb7
Merge branch 'v3.1-dev' into feat/rs-platform-wallet-e2e
lklimek May 28, 2026
12af754
Merge remote-tracking branch 'origin/v3.1-dev' into feat/rs-platform-…
lklimek May 29, 2026
a16888c
Merge branch 'v3.1-dev' into feat/rs-platform-wallet-e2e
lklimek Jun 1, 2026
709303d
Revert "fix(rs-sdk): address-sync no longer silently discards balance…
lklimek May 29, 2026
943832b
fix(platform-wallet): reconcile events.rs handler dispatch after v3.1…
lklimek Jun 1, 2026
76369d6
fix(platform-wallet): wire DevnetConfig into e2e SPV client for devnet
lklimek Jun 1, 2026
cf5ff1f
build(deps): point rust-dashcore at PR #797 branch for SML ProTx-v3 d…
lklimek Jun 1, 2026
f9746b9
feat(platform-wallet): self-fund bank-identity bootstrap via Core→Pla…
lklimek Jun 1, 2026
66e361f
fix(platform-wallet): harden bank-bootstrap self-fund (QA-001..007)
lklimek Jun 1, 2026
54bcf8f
fix(platform-wallet): make bank-bootstrap self-fund work live on paloma
lklimek Jun 1, 2026
c5c26b7
fix(platform-wallet): account for asset-lock funding fee in planner E…
lklimek Jun 1, 2026
ba86443
fix(platform-wallet): size planner E5 lock for leaf deficits, not jus…
lklimek Jun 2, 2026
46fe4b8
Merge remote-tracking branch 'origin/v3.1-dev' into feat/rs-platform-…
lklimek Jun 2, 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
520 changes: 390 additions & 130 deletions Cargo.lock

Large diffs are not rendered by default.

16 changes: 8 additions & 8 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -49,14 +49,14 @@ members = [
]

[workspace.dependencies]
dashcore = { git = "https://github.com/dashpay/rust-dashcore", rev = "eb889af13f667ed39c35e8e8a0830eeedf523476" }
dash-network-seeds = { git = "https://github.com/dashpay/rust-dashcore", rev = "eb889af13f667ed39c35e8e8a0830eeedf523476" }
dash-spv = { git = "https://github.com/dashpay/rust-dashcore", rev = "eb889af13f667ed39c35e8e8a0830eeedf523476" }
key-wallet = { git = "https://github.com/dashpay/rust-dashcore", rev = "eb889af13f667ed39c35e8e8a0830eeedf523476" }
key-wallet-ffi = { git = "https://github.com/dashpay/rust-dashcore", rev = "eb889af13f667ed39c35e8e8a0830eeedf523476" }
key-wallet-manager = { git = "https://github.com/dashpay/rust-dashcore", rev = "eb889af13f667ed39c35e8e8a0830eeedf523476" }
dash-network = { git = "https://github.com/dashpay/rust-dashcore", rev = "eb889af13f667ed39c35e8e8a0830eeedf523476" }
dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore", rev = "eb889af13f667ed39c35e8e8a0830eeedf523476" }
dashcore = { git = "https://github.com/dashpay/rust-dashcore", branch = "fix/sml-extnetinfo-v3-decode" }
dash-network-seeds = { git = "https://github.com/dashpay/rust-dashcore", branch = "fix/sml-extnetinfo-v3-decode" }
dash-spv = { git = "https://github.com/dashpay/rust-dashcore", branch = "fix/sml-extnetinfo-v3-decode" }
key-wallet = { git = "https://github.com/dashpay/rust-dashcore", branch = "fix/sml-extnetinfo-v3-decode" }
key-wallet-ffi = { git = "https://github.com/dashpay/rust-dashcore", branch = "fix/sml-extnetinfo-v3-decode" }
key-wallet-manager = { git = "https://github.com/dashpay/rust-dashcore", branch = "fix/sml-extnetinfo-v3-decode" }
dash-network = { git = "https://github.com/dashpay/rust-dashcore", branch = "fix/sml-extnetinfo-v3-decode" }
dashcore-rpc = { git = "https://github.com/dashpay/rust-dashcore", branch = "fix/sml-extnetinfo-v3-decode" }

# Optimize heavy crypto crates even in dev/test builds so that
# Halo 2 proof generation and verification run at near-release speed.
Expand Down
3 changes: 3 additions & 0 deletions packages/rs-platform-wallet-ffi/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,9 @@ bincode = { version = "=2.0.1" }
# Hex used for error diagnostics that include a wallet_id.
hex = "0.4"

# `IndexMap` mirrors `platform-wallet`'s insertion-ordered outputs API.
indexmap = "2.7"

# Persistence loader emits structured warnings for skipped /
# corrupt rows so operators can detect snapshot drift without a
# native debugger attached.
Expand Down
2 changes: 1 addition & 1 deletion packages/rs-platform-wallet-ffi/src/manager.rs
Original file line number Diff line number Diff line change
Expand Up @@ -58,7 +58,7 @@ pub unsafe extern "C" fn platform_wallet_manager_create(
// return and leaves the spawned task running on that runtime.
let _runtime_guard = runtime().enter();

let manager = PlatformWalletManager::new(sdk, persister, handler);
let manager = PlatformWalletManager::new(sdk, persister, vec![handler]);
let handle = PLATFORM_WALLET_MANAGER_STORAGE.insert(manager);
*out_handle = handle;

Expand Down
61 changes: 57 additions & 4 deletions packages/rs-platform-wallet/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,11 @@ arc-swap = "1"

# Collections
bimap = "0.6"
# `IndexMap` powers the insertion-ordered public outputs map on
# `PlatformAddressWallet::transfer` / `transfer_with_change_address`.
# Same crate that dpp and rs-sdk already vendor; pin a workspace-aligned
# minor that satisfies all in-tree requirements.
indexmap = "2.7"

# Async runtime
tokio = { version = "1", features = ["sync", "rt", "time", "macros"] }
Expand Down Expand Up @@ -100,17 +105,57 @@ tokio = { version = "1", features = ["sync", "rt", "time", "macros", "test-util"
# Re-enable the SDK with mocks feature for test-only mock builders;
# the non-test build keeps the leaner default-feature SDK above.
dash-sdk = { path = "../rs-sdk", default-features = false, features = ["dashpay-contract", "dpns-contract", "wallet", "mocks"] }
# Used by `examples/shielded_sync_paloma.rs` to build the SDK against
# a remote devnet that doesn't have Core RPC reachable — supplies
# proof verification via a separate HTTP quorum-list service.
rs-sdk-trusted-context-provider = { path = "../rs-sdk-trusted-context-provider" }

# E2E test framework — see `tests/e2e/` for the integration harness
# that exercises the wallet → SDK → broadcast pipeline against a
# live testnet bank wallet. Pinned to the canonical published crate
# names; cargo normalizes dash/underscore in keys but the published
# name is the source of truth (e.g. `tokio-shared-rt`).
tokio-shared-rt = "0.1"
tempfile = "3"
dotenvy = "0.15"
bip39 = "2"
fs2 = "0.4"
serde = { version = "1", features = ["derive"] }
simple-signer = { path = "../simple-signer", features = ["derive"] }
parking_lot = "0.12"
# `dash-async::block_on` is the runtime-flavor-agnostic bridge used by
# `framework/context_provider.rs` to call `SpvRuntime`'s async API
# from the synchronous `ContextProvider` trait. Handles all three
# tokio runtime scenarios (no runtime, current-thread, multi-thread)
# without the `block_in_place` panic that `tokio::task::block_in_place`
# triggers on a current-thread runtime.
dash-async = { path = "../rs-dash-async" }
# `rt` feature gives us `CancellationToken` for the panic-hook +
# graceful-shutdown wiring described in the e2e plan.
tokio-util = { version = "0.7", features = ["rt"] }
# `TrustedHttpContextProvider` is the e2e harness's current default
# context provider. It backs `Sdk::set_context_provider` with the
# operator-trusted Quorum HTTP endpoint built into the crate (per
# network) so testnet / mainnet runs work without spinning up an
# SPV client. The SPV-backed provider lives in `framework/spv.rs`
# and `framework/context_provider.rs` and is currently disabled
# (see harness.rs) — re-enable when SPV cold-start is stable
# (Task #15). Also used by `examples/shielded_sync_paloma.rs` to run
# against a remote devnet without a reachable Core RPC.
rs-sdk-trusted-context-provider = { path = "../rs-sdk-trusted-context-provider", features = ["dpns-contract"] }
# In-memory test runs (NoPlatformPersistence) need finalized txs retained in RAM.
# Re-declaring here enables the feature for the test target only; production
# builds pay no memory overhead. Per upstream rust-dashcore maintainer guidance.
key-wallet = { workspace = true, features = ["keep-finalized-transactions"] }
key-wallet-manager = { workspace = true, features = ["keep-finalized-transactions"] }

[features]
default = ["bls", "eddsa"]
bls = ["key-wallet/bls", "key-wallet-manager/bls"]
eddsa = ["key-wallet/eddsa", "key-wallet-manager/eddsa"]
shielded = ["dep:grovedb-commitment-tree", "dep:rusqlite", "dep:zip32", "dep:futures", "dash-sdk/shielded", "dpp/shielded-client"]
# Opt-in gate for the live integration suite under `tests/e2e/`. Off by
# default so a stock `cargo test` (and workspace CI) never compiles or
# runs the network-dependent harness. Pulls in `shielded` so an e2e run
# exercises the shielded-pool cases too. Run with:
# `cargo test -p platform-wallet --test e2e --features e2e`.
e2e = ["shielded"]
# Opt-in serde derives on the changeset types. Activates `key-wallet/serde`,
# `key-wallet-manager/serde`, and `dash-sdk/serde`. `dpp` derives serde unconditionally.
serde = [
Expand All @@ -131,3 +176,11 @@ keep-finalized-transactions = [
"key-wallet/keep-finalized-transactions",
"key-wallet-manager/keep-finalized-transactions",
]

# Live integration suite. `required-features` keeps the harness out of a
# stock `cargo test` build entirely — it compiles and runs only under
# `--features e2e`. This replaces the former per-test `#[ignore]` gating.
[[test]]
name = "e2e"
path = "tests/e2e.rs"
required-features = ["e2e"]
2 changes: 1 addition & 1 deletion packages/rs-platform-wallet/examples/basic_usage.rs
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
let event_handler: Arc<dyn PlatformEventHandler> = Arc::new(NoopEventHandler);

// Create a manager
let manager = PlatformWalletManager::new(sdk.clone(), persister, event_handler);
let manager = PlatformWalletManager::new(sdk.clone(), persister, vec![event_handler]);

// Create a wallet from seed bytes
let seed_bytes = [0u8; 64]; // dummy seed for example
Expand Down
17 changes: 17 additions & 0 deletions packages/rs-platform-wallet/src/error.rs
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
use dashcore::OutPoint;
use dpp::address_funds::PlatformAddress;
use dpp::fee::Credits;
use dpp::identifier::Identifier;
Expand Down Expand Up @@ -28,6 +29,16 @@ pub enum PlatformWalletError {
#[error("Invalid identity data: {0}")]
InvalidIdentityData(String),

#[error(
"on-chain {op} succeeded for identity {identity} but local persistence failed: {source}"
)]
PersistedAfterOnChainSuccess {
identity: Identifier,
op: &'static str,
#[source]
source: crate::changeset::PersistenceError,
},

#[error("Contact request not found: {0}")]
ContactRequestNotFound(Identifier),

Expand Down Expand Up @@ -63,6 +74,12 @@ pub enum PlatformWalletError {
#[error("Transaction building failed: {0}")]
TransactionBuild(String),

#[error(
"Transaction builder selected an unavailable UTXO (concurrent spend); retry. \
Selected outpoints: {selected:?}"
)]
ConcurrentSpendConflict { selected: Vec<OutPoint> },

#[error("no spendable inputs available on {account_type} account {account_index}: {context}")]
NoSpendableInputs {
account_type: StandardAccountType,
Expand Down
61 changes: 20 additions & 41 deletions packages/rs-platform-wallet/src/events.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,13 @@
//! platform-specific events. Applications implement this trait to receive
//! all events by reference (no cloning).
//!
//! [`PlatformEventManager`] dispatches events to registered handlers.
//! It implements [`EventHandler`] so it can be passed directly to
//! `DashSpvClient`, and supports dynamic handler registration via
//! lock-free `ArcSwap`.
//! [`PlatformEventManager`] dispatches events to a fixed handler set
//! provided at construction. It implements [`EventHandler`] so it can
//! be passed directly to `DashSpvClient`, mirroring dash-spv's own
//! immutable `event_handlers` model.

use std::sync::Arc;

use arc_swap::ArcSwap;

pub use dash_spv::EventHandler;
pub use key_wallet_manager::WalletEvent;

Expand Down Expand Up @@ -92,40 +90,29 @@ pub trait PlatformEventHandler: EventHandler {
fn on_shielded_tree_progress(&self, _leaves_committed: u64, _total_target: u64) {}
}

/// Dispatches events to all registered [`PlatformEventHandler`]s.
/// Dispatches events to a fixed set of [`PlatformEventHandler`]s.
///
/// Passed to `DashSpvClient` as the `EventHandler` (via `Arc<Self>`).
/// Supports dynamic handler registration via [`add_handler`](Self::add_handler).
///
/// Read path (every event): one atomic pointer load, then iterate.
/// Write path (add_handler): clone Vec + atomic swap — rare, not on SPV hot path.
/// The handler set is supplied once at construction and never mutated,
/// matching the immutable `event_handlers` the wrapped dash-spv layer
/// consumes. Read path (every event): iterate the boxed slice.
pub struct PlatformEventManager {
handlers: ArcSwap<Vec<Arc<dyn PlatformEventHandler>>>,
handlers: Arc<[Arc<dyn PlatformEventHandler>]>,
}

impl PlatformEventManager {
/// Create a new event manager with initial handlers.
/// Create a new event manager with the full handler set.
pub fn new(handlers: Vec<Arc<dyn PlatformEventHandler>>) -> Self {
Self {
handlers: ArcSwap::from_pointee(handlers),
handlers: handlers.into(),
}
}

/// Register an additional handler. Lock-free for readers.
pub fn add_handler(&self, handler: Arc<dyn PlatformEventHandler>) {
self.handlers.rcu(|current| {
let mut new = (**current).clone();
new.push(handler.clone());
new
});
}

/// Dispatch a platform-address sync completion to every handler.
///
/// Not on the SPV hot path — called once per sync pass (~15s).
pub fn on_platform_address_sync_completed(&self, summary: &PlatformAddressSyncSummary) {
let handlers = self.handlers.load();
for h in handlers.iter() {
for h in self.handlers.iter() {
h.on_platform_address_sync_completed(summary);
}
}
Expand All @@ -136,8 +123,7 @@ impl PlatformEventManager {
/// (~60s by default).
#[cfg(feature = "shielded")]
pub fn on_shielded_sync_completed(&self, summary: &ShieldedSyncPassSummary) {
let handlers = self.handlers.load();
for h in handlers.iter() {
for h in self.handlers.iter() {
h.on_shielded_sync_completed(summary);
}
}
Expand All @@ -149,8 +135,7 @@ impl PlatformEventManager {
/// path during a cold sync.
#[cfg(feature = "shielded")]
pub fn on_shielded_sync_progress(&self, cumulative_scanned: u64, block_height: u64) {
let handlers = self.handlers.load();
for h in handlers.iter() {
for h in self.handlers.iter() {
h.on_shielded_sync_progress(cumulative_scanned, block_height);
}
}
Expand All @@ -165,45 +150,39 @@ impl PlatformEventManager {
/// frequent path during a cold sync.
#[cfg(feature = "shielded")]
pub fn on_shielded_tree_progress(&self, leaves_committed: u64, total_target: u64) {
let handlers = self.handlers.load();
for h in handlers.iter() {
for h in self.handlers.iter() {
h.on_shielded_tree_progress(leaves_committed, total_target);
}
}
}

impl EventHandler for PlatformEventManager {
fn on_sync_event(&self, event: &dash_spv::sync::SyncEvent) {
let handlers = self.handlers.load();
for h in handlers.iter() {
for h in self.handlers.iter() {
h.on_sync_event(event);
}
}

fn on_network_event(&self, event: &dash_spv::network::NetworkEvent) {
let handlers = self.handlers.load();
for h in handlers.iter() {
for h in self.handlers.iter() {
h.on_network_event(event);
}
}

fn on_progress(&self, progress: &dash_spv::sync::SyncProgress) {
let handlers = self.handlers.load();
for h in handlers.iter() {
for h in self.handlers.iter() {
h.on_progress(progress);
}
}

fn on_wallet_event(&self, event: &WalletEvent) {
let handlers = self.handlers.load();
for h in handlers.iter() {
for h in self.handlers.iter() {
h.on_wallet_event(event);
}
}

fn on_error(&self, error: &str) {
let handlers = self.handlers.load();
for h in handlers.iter() {
for h in self.handlers.iter() {
h.on_error(error);
}
}
Expand Down
Loading
Loading