You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Found by the 2026-08-19 merged-PR audit (widened by #4373). Two halves:
send_payment reservation stranding / clobbering (fund-safety): a persistence failure after signing leaves the signed inputs reserved with no release path, and the unconditional release on the error path can clobber a NEWER reservation — re-exposing the inputs of a possibly-sent transaction to coin selection. The fix threads a reservation token (the pattern already exists at signed_payment_registry.rs:825) so release is conditional on still owning the reservation.
Suppressed spends never cross the FFI: the unrecorded_spends derivation now covers all phases engine-side, but the host-visible carry is inert on mobile until the SpentOutPointFFI final-spend ABI flag exists — the heal cannot reach the Kotlin/Swift stores yet. This half should ride the planned ABI batch (final-spend flag, get_dpns_name_state vtable slot, fix(platform-wallet): a partial identity scan is never retried once any identity is on file #4365 scan-state persistence).
A complete fix exists on branch fix/payment-reservation-and-txo-heal (former PR #4425, closed to keep the open-PR queue focused on migration-critical work). Reopen as-is when there is review bandwidth — ideally alongside the ABI batch so half 2 activates.
Found by the 2026-08-19 merged-PR audit (widened by #4373). Two halves:
send_paymentreservation stranding / clobbering (fund-safety): a persistence failure after signing leaves the signed inputs reserved with no release path, and the unconditional release on the error path can clobber a NEWER reservation — re-exposing the inputs of a possibly-sent transaction to coin selection. The fix threads a reservation token (the pattern already exists atsigned_payment_registry.rs:825) so release is conditional on still owning the reservation.unrecorded_spendsderivation now covers all phases engine-side, but the host-visible carry is inert on mobile until theSpentOutPointFFIfinal-spend ABI flag exists — the heal cannot reach the Kotlin/Swift stores yet. This half should ride the planned ABI batch (final-spend flag,get_dpns_name_statevtable slot, fix(platform-wallet): a partial identity scan is never retried once any identity is on file #4365 scan-state persistence).A complete fix exists on branch
fix/payment-reservation-and-txo-heal(former PR #4425, closed to keep the open-PR queue focused on migration-critical work). Reopen as-is when there is review bandwidth — ideally alongside the ABI batch so half 2 activates.