elements/src/wallet
furszy a18085a18b
wallet: fix crash on double block disconnection
The wallet crashes if it processes the same block disconnection event twice in a row due
to an incompatible coinbase transaction state.
This happens because 'disconnectBlock' provides 'TxStateInactive' without the "abandoned"
flag for coinbase transactions to 'SyncTransaction', while 'AddToWallet()' internally
modifies it to retain the abandoned state.

The flow is as follows:
1) On the first disconnection, the transaction state transitions from "confirmed" to
"inactive," bypassing the state equality check since the provided state differs. Then,
'AddToWallet' internally updates the state to "inactive + abandoned"

2) On the second disconnection, as we provide only the "inactive" state
to 'SyncTransaction()', the state equality assertion fails and crashes the wallet.

Github-Pull: #31757
Rebased-From: 9ef429b6ae65f6ad3e9ac11c2d9c0a6c52beb865
2025-06-19 10:39:27 +01:00
..
rpc rpc, doc: update listdescriptors RCP help 2025-06-10 11:31:10 +01:00
test Merge bitcoin/bitcoin#31242: wallet, desc spkm: Return SigningProvider only if we have the privkey 2025-01-16 17:30:36 +00:00
bdb.cpp scripted-diff: LogPrint -> LogDebug 2024-08-29 13:49:57 +02:00
bdb.h wallet: introduce active db txn listeners 2024-10-21 08:29:22 -03:00
CMakeLists.txt cmake: Add systemtap-sdt optional package support 2024-08-16 19:27:41 +01:00
coincontrol.cpp wallet: Explicitly preserve scriptSig and scriptWitness in CreateTransaction 2023-12-08 17:12:19 -05:00
coincontrol.h [wallet, rpc]: add max_tx_weight to tx funding options 2024-06-27 15:31:21 +01:00
coinselection.cpp Remove unused variable assignment 2024-12-13 21:00:07 -06:00
coinselection.h Merge bitcoin/bitcoin#29523: Wallet: Add max_tx_weight to transaction funding options (take 2) 2024-07-17 18:27:59 -04:00
context.cpp
context.h interfaces: Add schedulerMockForward method so mockscheduler RPC can work across processes 2023-10-20 10:30:16 -04:00
crypter.cpp refactor: vector -> span in CCrypter 2024-08-28 19:09:51 +02:00
crypter.h refactor: vector -> span in CCrypter 2024-08-28 19:09:51 +02:00
db.cpp Merge bitcoin/bitcoin#29071: refactor: Remove Span operator==, Use std::ranges::equal 2024-08-28 10:34:47 +01:00
db.h wallet: introduce active db txn listeners 2024-10-21 08:29:22 -03:00
dump.cpp bdb: Be able to make byteswapped databases 2024-05-16 15:03:13 -04:00
dump.h wallettool: Don't create CWallet when dumping DB 2023-12-19 16:54:06 -05:00
external_signer_scriptpubkeyman.cpp util: add TransactionError includes and namespace declarations 2024-05-16 10:16:08 -05:00
external_signer_scriptpubkeyman.h common: Add PSBTError enum 2024-05-16 10:16:08 -05:00
feebumper.cpp scripted-diff: Replace strprintf(Untranslated) with Untranslated(strprintf) 2024-12-04 15:09:05 -04:00
feebumper.h rpc: bumpfee, improve doc for 'reduce_output' arg 2023-09-26 20:17:02 -03:00
fees.cpp
fees.h
init.cpp scripted-diff: drop config/ subdir for bitcoin-config.h, rename to bitcoin-build-config.h 2024-10-10 12:22:12 +02:00
interfaces.cpp gui: Use wallet name for wallet migration rather than WalletModel 2024-08-13 11:25:38 -04:00
load.cpp refactor: Delay translation of _() literals 2025-01-14 19:21:37 +01:00
load.h interfaces: Add schedulerMockForward method so mockscheduler RPC can work across processes 2023-10-20 10:30:16 -04:00
migrate.cpp refactor: Drop unused UCharCast 2025-01-14 19:01:53 +01:00
migrate.h wallet: introduce active db txn listeners 2024-10-21 08:29:22 -03:00
receive.cpp [clang-tidy] Enable the misc-no-recursion check 2024-04-07 14:04:45 +01:00
receive.h wallet: Add wallet/types.h for simple public enum and struct types 2023-04-11 15:52:25 -04:00
salvage.cpp scripted-diff: Replace strprintf(Untranslated) with Untranslated(strprintf) 2024-12-04 15:09:05 -04:00
salvage.h refactor: Move fs.* to util/fs.* 2023-03-23 12:55:18 +01:00
scriptpubkeyman.cpp Merge bitcoin/bitcoin#31495: wallet: Utilize IsMine() and CanProvide() in migration to cover edge cases 2025-02-13 12:30:15 -05:00
scriptpubkeyman.h Merge bitcoin/bitcoin#31495: wallet: Utilize IsMine() and CanProvide() in migration to cover edge cases 2025-02-13 12:30:15 -05:00
spend.cpp tracing: only prepare tracepoint args if attached 2024-10-28 14:27:47 +01:00
spend.h refactor: pass CRecipient to FundTransaction 2024-01-19 15:04:56 +01:00
sqlite.cpp scripted-diff: Rename PACKAGE_* variables to CLIENT_* 2024-10-28 12:36:19 +00:00
sqlite.h wallet: introduce active db txn listeners 2024-10-21 08:29:22 -03:00
transaction.cpp scripted-diff: wallet: s/TxStateConflicted/TxStateBlockConflicted 2024-03-14 17:38:39 -04:00
transaction.h util: Move util/string.h functions to util namespace 2024-05-16 10:16:08 -05:00
types.h util: move error.h TransactionError enum to node/types.h 2024-05-16 10:16:08 -05:00
wallet.cpp wallet: fix crash on double block disconnection 2025-06-19 10:39:27 +01:00
wallet.h wallet: abandon inactive coinbase tx and their descendants during startup 2025-02-04 10:55:19 -05:00
walletdb.cpp walletdb: Log the wallet version after it has been read from disk 2025-05-20 12:29:18 +01:00
walletdb.h Merge bitcoin/bitcoin#28724: wallet: Cleanup accidental encryption keys in watchonly wallets 2025-01-10 15:29:47 +00:00
wallettool.cpp scripted-diff: Rename PACKAGE_* variables to CLIENT_* 2024-10-28 12:36:19 +00:00
wallettool.h
walletutil.cpp descriptors: Change Parse to return vector of descriptors 2024-08-08 12:47:22 -04:00
walletutil.h Merge bitcoin/bitcoin#22838: descriptors: Be able to specify change and receiving in a single descriptor string 2024-08-28 15:56:15 +01:00