-
Notifications
You must be signed in to change notification settings - Fork 57
fix(platform-wallet): act on swept transactions at the persistence seam #4406
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Open
romchornyi
wants to merge
102
commits into
v4.2-dev
Choose a base branch
from
chore/bump-rust-dashcore-dev-961
base: v4.2-dev
Could not load branches
Branch not found: {{ refName }}
Loading
Could not load tags
Nothing to show
Loading
Are you sure you want to change the base?
Some commits from the old base branch may be removed from the timeline,
and old review comments may become outdated.
Open
Changes from all commits
Commits
Show all changes
102 commits
Select commit
Hold shift + click to select a range
171e4cb
chore: bump rust-dashcore to the latest dev revision
jeanpierreroma d325049
fix(swift-sdk): delete the mirror of a transaction the wallet swept
jeanpierreroma 49e5a5f
fix: address review — keep the winner's coin spent, fail a sweep that…
jeanpierreroma f435dcc
fix: hold a swept loser's inputs when the winner is not in the store
jeanpierreroma b57fb20
fix: carry the outpoints a sweep released instead of inferring them
jeanpierreroma 4e0bd3a
fix(kotlin-sdk): do not free a coin a later transaction already re-cl…
jeanpierreroma 6060cb4
fix(platform-wallet-storage): apply transaction sweeps in the SQLite …
jeanpierreroma b172c0a
fix(platform-wallet-storage): defer a release to a surviving record's…
jeanpierreroma 04a76c4
fix: keep sweeps as ordered batches instead of one folded release set
jeanpierreroma 0d81ce1
fix: let a record arriving after its sweep reinstate the transaction
jeanpierreroma 46f74e9
fix: keep a sweep's releases when only one of its losers is reinstated
jeanpierreroma 73852a9
fix: keep a sweep's claim durable when its funding TXO is still unknown
jeanpierreroma 8b58966
fix(kotlin-sdk): declare the tombstone column's default so the upgrad…
jeanpierreroma 4b38b64
fix: repoint chained-sweep tombstones instead of losing them
jeanpierreroma 253ed2b
fix: fail closed when a persister has not attested sweep-removal support
jeanpierreroma f503cd5
fix: release JNI local references per sweep batch
jeanpierreroma 78fd059
fix: withhold the watermark from the round whose sweep cannot be applied
jeanpierreroma a23f132
perf(platform-wallet-storage): hoist the invariant sweep claim sets
jeanpierreroma fe594eb
fix(swift-sdk): fail the round when the sweep's wallet lookup throws
jeanpierreroma 38b5f7b
perf(platform-wallet-storage): skip the survivor set on a sweepless r…
jeanpierreroma eff8209
fix: scope a swept transaction's per-input decisions to the owning wa…
jeanpierreroma 3a87366
fix: make a swept transaction's exclusion durable in every wallet's c…
jeanpierreroma 6a30295
test(swift-sdk): pin the throwing wallet-lookup branch with a real seam
jeanpierreroma 7bfa701
fix(kotlin-sdk): re-export v12 so the schema records the tombstone de…
jeanpierreroma b73e4c9
chore: repin rust-dashcore to the merged sweep-released-outpoints commit
jeanpierreroma 83982b8
fix(swift-sdk): reinstate a swept transaction when a later record rev…
jeanpierreroma 32010a5
fix(kotlin-sdk): reinstate a swept transaction when a later record re…
jeanpierreroma 15579f0
fix(rs-unified-sdk-jni): emit an account's transactions before its UTXOs
jeanpierreroma de8879c
fix(rs-unified-sdk-jni): add onWalletChangesetTransactionsSwept to th…
jeanpierreroma 33758cf
test(rs-platform-wallet): bound a_coalesced_sweep_and_watermark_never…
jeanpierreroma ea8a193
fix(swift-sdk): reconcile detached sweep tombstones when the winner r…
jeanpierreroma df88cda
fix(platform-wallet-ffi): carry sweeps on the size-tagged extension, …
jeanpierreroma c4c8a1f
fix(platform-wallet-ffi): require an atomic round before attesting sw…
jeanpierreroma ab2da2b
fix(platform-wallet): default `sweeps` when deserializing a pre-sweep…
jeanpierreroma ecfefdc
fix(swift-sdk): disable autosave so the atomic round is actually atomic
jeanpierreroma 8e3c0aa
fix(platform-wallet-ffi): expose the sweep arrays as *const, not *mut
jeanpierreroma fab1a46
fix(platform-wallet-ffi): allow the manager entry point its argument …
jeanpierreroma b3aeb1c
fix(swift-sdk): follow the sweep arrays' const-ness into the test helper
jeanpierreroma ada626a
fix(kotlin-sdk): keep the sweep's SQL arity fixed regardless of relea…
jeanpierreroma 5e6d4d4
perf(swift-sdk): index the open round's unsaved inserts
jeanpierreroma 1fdc3fa
fix(kotlin-sdk): build the sweep's release set once, and free release…
jeanpierreroma 363a330
fix(swift-sdk): free a released pending input instead of leaving it a…
jeanpierreroma ab54e0c
fix(kotlin-sdk): keep the sweep tombstone when the winner's own pendi…
jeanpierreroma 8d3b37c
fix(swift-sdk): keep the sweep tombstone when the winner's own pendin…
jeanpierreroma 5f8ea5f
fix(kotlin-sdk): clear a released coin's supersededByTxid with the ho…
jeanpierreroma 4a14991
fix(swift-sdk): apply sweep releases by outpoint, clearing the dead w…
jeanpierreroma f4f6882
fix(kotlin-sdk): stamp the winner on a sweep hold so re-delivery cann…
jeanpierreroma ac36707
fix(swift-sdk): stamp the winner on a sweep hold so re-delivery canno…
jeanpierreroma cda18de
fix(kotlin-sdk): keep a stamped hold spent when the winner's own spen…
jeanpierreroma d35021f
fix(swift-sdk): stop the winner's own unconfirmed arrival downgrading…
jeanpierreroma 24f7ef4
fix(platform-wallet-storage): apply a sweep's releases even when the …
jeanpierreroma d120e4a
fix(platform-wallet-storage): don't resurrect a co-swept parent's out…
jeanpierreroma 55bf35e
fix(platform-wallet): cascade a sweep into the tracked asset locks it…
jeanpierreroma af55994
fix(platform-wallet): fail a sent DashPay payment whose transaction w…
jeanpierreroma 7b5514f
fix(kotlin-sdk): make a hand-declared sweep capability fail structura…
jeanpierreroma 679fb31
fix(platform-wallet-storage): scope the co-swept skip to parents whos…
jeanpierreroma 7597157
style(platform-wallet): fold the sent-payment eligibility match into …
jeanpierreroma c6f801d
refactor(platform-wallet): share the fault-and-freeze bookkeeping bet…
jeanpierreroma 010c1a8
refactor(platform-wallet-ffi): single-source the negotiated slot gate…
jeanpierreroma 817608a
test(kotlin-sdk): pin the two-wallet released-pending deadlock the Sw…
jeanpierreroma aeac2cd
docs(kotlin-sdk): drop references to the SQL repoint helpers the bind…
jeanpierreroma 1308279
docs(swift-sdk): stop describing the autosave fallback this branch di…
jeanpierreroma 6e458d1
test(swift-sdk): pin the record-pass downgrade guard independently of…
jeanpierreroma d3cedc0
fix(platform-wallet): let a reinstating asset-lock upsert cancel a fo…
jeanpierreroma 86568b4
fix(platform-wallet-storage): delete a co-swept parent's output outri…
jeanpierreroma 56ae3c3
perf(swift-sdk): stop rescanning the round's unsaved inserts once per…
jeanpierreroma 5cfca15
fix(platform-wallet): retry a swept payment's failure persist instead…
jeanpierreroma 0414469
docs(platform-wallet): define CORE_SWEEP_REMOVAL by observable durabi…
jeanpierreroma 1c8909e
perf(platform-wallet): hash the swept-txid set once before scanning t…
jeanpierreroma f99789b
fix(platform-wallet): ride the swept payment's Failed flip on the swe…
jeanpierreroma 78bb226
fix(platform-wallet): retract a reinstated txid's payment flip from t…
jeanpierreroma 45c70ec
fix(platform-wallet): stop stale reconcile evidence terminally confir…
jeanpierreroma fbf8eec
test(platform-wallet-storage): pin the synthetic-spent-row route into…
jeanpierreroma f9f3e66
fix(kotlin-sdk): give the asset-lock removal the consumed-row guard t…
jeanpierreroma 0b1e705
chore(platform-wallet): route the invitation outpoint through the one…
jeanpierreroma c9becb9
fix(kotlin-sdk): delete a co-swept loser's pending claims instead of …
jeanpierreroma e4c940d
fix(swift-sdk): delete a co-swept loser's pending claims instead of t…
jeanpierreroma aab4998
fix(platform-wallet): withhold the sweep's payment flip from a backen…
jeanpierreroma a4dc829
fix(kotlin-sdk): keep a Consumed asset lock terminal through the upse…
jeanpierreroma 7e676ec
chore: repin rust-dashcore to the merged linear-retain revision
jeanpierreroma 559475d
fix(platform-wallet): re-validate staged payment flips against live m…
jeanpierreroma 53d74e1
perf(platform-wallet): index superseded payment keys before filtering…
jeanpierreroma 3918f86
perf(platform-wallet): scope the revalidation lock hold to the store …
jeanpierreroma 1e709a8
fix(platform-wallet): ride the reinstatement confirmation on the rein…
jeanpierreroma be5afc3
fix(platform-wallet): give DASHPAY_PAYMENTS a name in the diagnostics…
jeanpierreroma 6e6c30b
chore: repin rust-dashcore to the linear descendant-closure revision
jeanpierreroma 5698419
Merge remote-tracking branch 'origin/v4.2-dev' into chore/bump-rust-d…
jeanpierreroma 80ec1cb
fix(platform-wallet): require the atomic round before staging payment…
jeanpierreroma 57a88e2
fix(platform-wallet-storage): bound the lifetime of unmaterialised sw…
jeanpierreroma 1d16f59
fix(kotlin-sdk): bound the lifetime of swept pending-input tombstones
jeanpierreroma 78ae25d
test(platform-wallet-storage): keep the re-point fixture inside the c…
jeanpierreroma 1753535
fix(swift-sdk): bound the lifetime of swept pending-input tombstones
jeanpierreroma 16e8891
refactor(platform-wallet): extract the sweep's payment-flip coupling …
jeanpierreroma 59d5023
perf(unified-sdk-jni): allocate the sweep winner once per batch, not …
jeanpierreroma 98bc011
fix(platform-wallet): never drop balance snapshots under wallets-map …
jeanpierreroma 29a0f91
Merge remote-tracking branch 'origin/v4.2-dev' into chore/bump-rust-d…
jeanpierreroma 81f6acf
fix(platform-wallet): key sweep-tombstone lifetime on the winner's mi…
jeanpierreroma d18f961
Merge remote-tracking branch 'origin/v4.2-dev' into chore/bump-rust-d…
jeanpierreroma 1505912
fix(platform-wallet): preserve an unstamped tombstone for mempool-con…
jeanpierreroma 1c02faf
docs(platform-wallet): state the ordered, non-commutative changeset m…
jeanpierreroma a76bc79
docs(platform-wallet-storage): align the V007 contract with unstamped…
jeanpierreroma 4a02bf8
docs(kotlin-sdk): define CORE_SWEEP_REMOVAL as ordered exclusion, not…
jeanpierreroma File filter
Filter by extension
Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Oops, something went wrong.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.
Oops, something went wrong.
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
🔴 Blocking: Do not release coins spent by pruned finalized transactions
The pinned key-wallet implementation computes each sweep's released outpoints from the removed losers and protects an outpoint only when a surviving full transaction record still claims it. With the default
keep-finalized-transactionsfeature disabled, a chainlocked transaction is reduced to its txid, so its inputs are absent from that survivor set; the pinnedWalletEvent::TransactionsSweptdocumentation explicitly records this limitation. A wallet-relevant transaction L can therefore arrive after finalized transaction F was pruned, include an output paying this wallet, and reuse both an outpoint already consumed by F and an attacker-owned input. If final transaction W later conflicts with L on the attacker-owned input, sweeping L reports F's input as released even though it remains spent on-chain. All persistence backends trust that release; SQLite sets the materialized UTXO tospent = 0, so after restart it is restored as spendable and coin selection can construct a guaranteed double spend. Preserve settled-input attribution after record pruning, retain the full finalized records, or repin to an upstream implementation that tracks which transaction established each spent mark.source: ['codex']
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Resolved in this update — Do not release coins spent by pruned finalized transactions no longer present.
Auto-resolved by the review system based on the latest commit diff. If you believe this was closed in error, reopen the thread.