/Users/eugenesiegel/btc/bitcoin/src/wallet/transaction.h
| Line | Count | Source (jump to first uncovered line) | 
| 1 |  | // Copyright (c) 2021-2022 The Bitcoin Core developers | 
| 2 |  | // Distributed under the MIT software license, see the accompanying | 
| 3 |  | // file COPYING or http://www.opensource.org/licenses/mit-license.php. | 
| 4 |  |  | 
| 5 |  | #ifndef BITCOIN_WALLET_TRANSACTION_H | 
| 6 |  | #define BITCOIN_WALLET_TRANSACTION_H | 
| 7 |  |  | 
| 8 |  | #include <attributes.h> | 
| 9 |  | #include <consensus/amount.h> | 
| 10 |  | #include <primitives/transaction.h> | 
| 11 |  | #include <tinyformat.h> | 
| 12 |  | #include <uint256.h> | 
| 13 |  | #include <util/check.h> | 
| 14 |  | #include <util/overloaded.h> | 
| 15 |  | #include <util/strencodings.h> | 
| 16 |  | #include <util/string.h> | 
| 17 |  | #include <wallet/types.h> | 
| 18 |  |  | 
| 19 |  | #include <bitset> | 
| 20 |  | #include <cstdint> | 
| 21 |  | #include <map> | 
| 22 |  | #include <utility> | 
| 23 |  | #include <variant> | 
| 24 |  | #include <vector> | 
| 25 |  |  | 
| 26 |  | namespace interfaces { | 
| 27 |  | class Chain; | 
| 28 |  | } // namespace interfaces | 
| 29 |  |  | 
| 30 |  | namespace wallet { | 
| 31 |  | //! State of transaction confirmed in a block. | 
| 32 |  | struct TxStateConfirmed { | 
| 33 |  |     uint256 confirmed_block_hash; | 
| 34 |  |     int confirmed_block_height; | 
| 35 |  |     int position_in_block; | 
| 36 |  |  | 
| 37 | 0 |     explicit TxStateConfirmed(const uint256& block_hash, int height, int index) : confirmed_block_hash(block_hash), confirmed_block_height(height), position_in_block(index) {} | 
| 38 | 0 |     std::string toString() const { return strprintf("Confirmed (block=%s, height=%i, index=%i)", confirmed_block_hash.ToString(), confirmed_block_height, position_in_block); }| Line | Count | Source |  | 1172 | 0 | #define strprintf tfm::format | 
 | 
| 39 |  | }; | 
| 40 |  |  | 
| 41 |  | //! State of transaction added to mempool. | 
| 42 |  | struct TxStateInMempool { | 
| 43 | 0 |     std::string toString() const { return strprintf("InMempool"); }| Line | Count | Source |  | 1172 | 0 | #define strprintf tfm::format | 
 | 
| 44 |  | }; | 
| 45 |  |  | 
| 46 |  | //! State of rejected transaction that conflicts with a confirmed block. | 
| 47 |  | struct TxStateBlockConflicted { | 
| 48 |  |     uint256 conflicting_block_hash; | 
| 49 |  |     int conflicting_block_height; | 
| 50 |  |  | 
| 51 | 0 |     explicit TxStateBlockConflicted(const uint256& block_hash, int height) : conflicting_block_hash(block_hash), conflicting_block_height(height) {} | 
| 52 | 0 |     std::string toString() const { return strprintf("BlockConflicted (block=%s, height=%i)", conflicting_block_hash.ToString(), conflicting_block_height); }| Line | Count | Source |  | 1172 | 0 | #define strprintf tfm::format | 
 | 
| 53 |  | }; | 
| 54 |  |  | 
| 55 |  | //! State of transaction not confirmed or conflicting with a known block and | 
| 56 |  | //! not in the mempool. May conflict with the mempool, or with an unknown block, | 
| 57 |  | //! or be abandoned, never broadcast, or rejected from the mempool for another | 
| 58 |  | //! reason. | 
| 59 |  | struct TxStateInactive { | 
| 60 |  |     bool abandoned; | 
| 61 |  |  | 
| 62 | 0 |     explicit TxStateInactive(bool abandoned = false) : abandoned(abandoned) {} | 
| 63 | 0 |     std::string toString() const { return strprintf("Inactive (abandoned=%i)", abandoned); }| Line | Count | Source |  | 1172 | 0 | #define strprintf tfm::format | 
 | 
| 64 |  | }; | 
| 65 |  |  | 
| 66 |  | //! State of transaction loaded in an unrecognized state with unexpected hash or | 
| 67 |  | //! index values. Treated as inactive (with serialized hash and index values | 
| 68 |  | //! preserved) by default, but may enter another state if transaction is added | 
| 69 |  | //! to the mempool, or confirmed, or abandoned, or found conflicting. | 
| 70 |  | struct TxStateUnrecognized { | 
| 71 |  |     uint256 block_hash; | 
| 72 |  |     int index; | 
| 73 |  |  | 
| 74 | 0 |     TxStateUnrecognized(const uint256& block_hash, int index) : block_hash(block_hash), index(index) {} | 
| 75 | 0 |     std::string toString() const { return strprintf("Unrecognized (block=%s, index=%i)", block_hash.ToString(), index); }| Line | Count | Source |  | 1172 | 0 | #define strprintf tfm::format | 
 | 
| 76 |  | }; | 
| 77 |  |  | 
| 78 |  | //! All possible CWalletTx states | 
| 79 |  | using TxState = std::variant<TxStateConfirmed, TxStateInMempool, TxStateBlockConflicted, TxStateInactive, TxStateUnrecognized>; | 
| 80 |  |  | 
| 81 |  | //! Subset of states transaction sync logic is implemented to handle. | 
| 82 |  | using SyncTxState = std::variant<TxStateConfirmed, TxStateInMempool, TxStateInactive>; | 
| 83 |  |  | 
| 84 |  | //! Try to interpret deserialized TxStateUnrecognized data as a recognized state. | 
| 85 |  | static inline TxState TxStateInterpretSerialized(TxStateUnrecognized data) | 
| 86 | 0 | { | 
| 87 | 0 |     if (data.block_hash == uint256::ZERO) { | 
| 88 | 0 |         if (data.index == 0) return TxStateInactive{}; | 
| 89 | 0 |     } else if (data.block_hash == uint256::ONE) { | 
| 90 | 0 |         if (data.index == -1) return TxStateInactive{/*abandoned=*/true}; | 
| 91 | 0 |     } else if (data.index >= 0) { | 
| 92 | 0 |         return TxStateConfirmed{data.block_hash, /*height=*/-1, data.index}; | 
| 93 | 0 |     } else if (data.index == -1) { | 
| 94 | 0 |         return TxStateBlockConflicted{data.block_hash, /*height=*/-1}; | 
| 95 | 0 |     } | 
| 96 | 0 |     return data; | 
| 97 | 0 | } Unexecuted instantiation: fees.cpp:_ZN6walletL26TxStateInterpretSerializedENS_19TxStateUnrecognizedEUnexecuted instantiation: scriptpubkeyman.cpp:_ZN6walletL26TxStateInterpretSerializedENS_19TxStateUnrecognizedEUnexecuted instantiation: spend.cpp:_ZN6walletL26TxStateInterpretSerializedENS_19TxStateUnrecognizedEUnexecuted instantiation: dump.cpp:_ZN6walletL26TxStateInterpretSerializedENS_19TxStateUnrecognizedEUnexecuted instantiation: feebumper.cpp:_ZN6walletL26TxStateInterpretSerializedENS_19TxStateUnrecognizedEUnexecuted instantiation: interfaces.cpp:_ZN6walletL26TxStateInterpretSerializedENS_19TxStateUnrecognizedEUnexecuted instantiation: load.cpp:_ZN6walletL26TxStateInterpretSerializedENS_19TxStateUnrecognizedEUnexecuted instantiation: receive.cpp:_ZN6walletL26TxStateInterpretSerializedENS_19TxStateUnrecognizedEUnexecuted instantiation: addresses.cpp:_ZN6walletL26TxStateInterpretSerializedENS_19TxStateUnrecognizedEUnexecuted instantiation: backup.cpp:_ZN6walletL26TxStateInterpretSerializedENS_19TxStateUnrecognizedEUnexecuted instantiation: coins.cpp:_ZN6walletL26TxStateInterpretSerializedENS_19TxStateUnrecognizedEUnexecuted instantiation: encrypt.cpp:_ZN6walletL26TxStateInterpretSerializedENS_19TxStateUnrecognizedEUnexecuted instantiation: signmessage.cpp:_ZN6walletL26TxStateInterpretSerializedENS_19TxStateUnrecognizedEUnexecuted instantiation: transactions.cpp:_ZN6walletL26TxStateInterpretSerializedENS_19TxStateUnrecognizedEUnexecuted instantiation: util.cpp:_ZN6walletL26TxStateInterpretSerializedENS_19TxStateUnrecognizedEUnexecuted instantiation: wallet.cpp:_ZN6walletL26TxStateInterpretSerializedENS_19TxStateUnrecognizedEUnexecuted instantiation: transaction.cpp:_ZN6walletL26TxStateInterpretSerializedENS_19TxStateUnrecognizedEUnexecuted instantiation: walletdb.cpp:_ZN6walletL26TxStateInterpretSerializedENS_19TxStateUnrecognizedEUnexecuted instantiation: init.cpp:_ZN6walletL26TxStateInterpretSerializedENS_19TxStateUnrecognizedE | 
| 98 |  |  | 
| 99 |  | //! Get TxState serialized block hash. Inverse of TxStateInterpretSerialized. | 
| 100 |  | static inline uint256 TxStateSerializedBlockHash(const TxState& state) | 
| 101 | 0 | { | 
| 102 | 0 |     return std::visit(util::Overloaded{ | 
| 103 | 0 |         [](const TxStateInactive& inactive) { return inactive.abandoned ? uint256::ONE : uint256::ZERO; },Unexecuted instantiation: wallet.cpp:_ZZN6walletL26TxStateSerializedBlockHashERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEENKUlRKS5_E_clESB_Unexecuted instantiation: walletdb.cpp:_ZZN6walletL26TxStateSerializedBlockHashERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEENKUlRKS5_E_clESB_ | 
| 104 | 0 |         [](const TxStateInMempool& in_mempool) { return uint256::ZERO; },Unexecuted instantiation: wallet.cpp:_ZZN6walletL26TxStateSerializedBlockHashERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEENKUlRKS3_E_clESB_Unexecuted instantiation: walletdb.cpp:_ZZN6walletL26TxStateSerializedBlockHashERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEENKUlRKS3_E_clESB_ | 
| 105 | 0 |         [](const TxStateConfirmed& confirmed) { return confirmed.confirmed_block_hash; },Unexecuted instantiation: wallet.cpp:_ZZN6walletL26TxStateSerializedBlockHashERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEENKUlRKS2_E_clESB_Unexecuted instantiation: walletdb.cpp:_ZZN6walletL26TxStateSerializedBlockHashERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEENKUlRKS2_E_clESB_ | 
| 106 | 0 |         [](const TxStateBlockConflicted& conflicted) { return conflicted.conflicting_block_hash; },Unexecuted instantiation: wallet.cpp:_ZZN6walletL26TxStateSerializedBlockHashERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEENKUlRKS4_E_clESB_Unexecuted instantiation: walletdb.cpp:_ZZN6walletL26TxStateSerializedBlockHashERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEENKUlRKS4_E_clESB_ | 
| 107 | 0 |         [](const TxStateUnrecognized& unrecognized) { return unrecognized.block_hash; }Unexecuted instantiation: wallet.cpp:_ZZN6walletL26TxStateSerializedBlockHashERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEENKUlRKS6_E_clESB_Unexecuted instantiation: walletdb.cpp:_ZZN6walletL26TxStateSerializedBlockHashERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEENKUlRKS6_E_clESB_ | 
| 108 | 0 |     }, state); | 
| 109 | 0 | } Unexecuted instantiation: fees.cpp:_ZN6walletL26TxStateSerializedBlockHashERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEUnexecuted instantiation: scriptpubkeyman.cpp:_ZN6walletL26TxStateSerializedBlockHashERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEUnexecuted instantiation: spend.cpp:_ZN6walletL26TxStateSerializedBlockHashERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEUnexecuted instantiation: dump.cpp:_ZN6walletL26TxStateSerializedBlockHashERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEUnexecuted instantiation: feebumper.cpp:_ZN6walletL26TxStateSerializedBlockHashERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEUnexecuted instantiation: interfaces.cpp:_ZN6walletL26TxStateSerializedBlockHashERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEUnexecuted instantiation: load.cpp:_ZN6walletL26TxStateSerializedBlockHashERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEUnexecuted instantiation: receive.cpp:_ZN6walletL26TxStateSerializedBlockHashERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEUnexecuted instantiation: addresses.cpp:_ZN6walletL26TxStateSerializedBlockHashERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEUnexecuted instantiation: backup.cpp:_ZN6walletL26TxStateSerializedBlockHashERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEUnexecuted instantiation: coins.cpp:_ZN6walletL26TxStateSerializedBlockHashERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEUnexecuted instantiation: encrypt.cpp:_ZN6walletL26TxStateSerializedBlockHashERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEUnexecuted instantiation: signmessage.cpp:_ZN6walletL26TxStateSerializedBlockHashERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEUnexecuted instantiation: transactions.cpp:_ZN6walletL26TxStateSerializedBlockHashERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEUnexecuted instantiation: util.cpp:_ZN6walletL26TxStateSerializedBlockHashERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEUnexecuted instantiation: wallet.cpp:_ZN6walletL26TxStateSerializedBlockHashERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEUnexecuted instantiation: transaction.cpp:_ZN6walletL26TxStateSerializedBlockHashERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEUnexecuted instantiation: walletdb.cpp:_ZN6walletL26TxStateSerializedBlockHashERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEUnexecuted instantiation: init.cpp:_ZN6walletL26TxStateSerializedBlockHashERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEE | 
| 110 |  |  | 
| 111 |  | //! Get TxState serialized block index. Inverse of TxStateInterpretSerialized. | 
| 112 |  | static inline int TxStateSerializedIndex(const TxState& state) | 
| 113 | 0 | { | 
| 114 | 0 |     return std::visit(util::Overloaded{ | 
| 115 | 0 |         [](const TxStateInactive& inactive) { return inactive.abandoned ? -1 : 0; },Unexecuted instantiation: wallet.cpp:_ZZN6walletL22TxStateSerializedIndexERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEENKUlRKS5_E_clESB_Unexecuted instantiation: walletdb.cpp:_ZZN6walletL22TxStateSerializedIndexERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEENKUlRKS5_E_clESB_ | 
| 116 | 0 |         [](const TxStateInMempool& in_mempool) { return 0; },Unexecuted instantiation: wallet.cpp:_ZZN6walletL22TxStateSerializedIndexERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEENKUlRKS3_E_clESB_Unexecuted instantiation: walletdb.cpp:_ZZN6walletL22TxStateSerializedIndexERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEENKUlRKS3_E_clESB_ | 
| 117 | 0 |         [](const TxStateConfirmed& confirmed) { return confirmed.position_in_block; },Unexecuted instantiation: wallet.cpp:_ZZN6walletL22TxStateSerializedIndexERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEENKUlRKS2_E_clESB_Unexecuted instantiation: walletdb.cpp:_ZZN6walletL22TxStateSerializedIndexERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEENKUlRKS2_E_clESB_ | 
| 118 | 0 |         [](const TxStateBlockConflicted& conflicted) { return -1; },Unexecuted instantiation: wallet.cpp:_ZZN6walletL22TxStateSerializedIndexERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEENKUlRKS4_E_clESB_Unexecuted instantiation: walletdb.cpp:_ZZN6walletL22TxStateSerializedIndexERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEENKUlRKS4_E_clESB_ | 
| 119 | 0 |         [](const TxStateUnrecognized& unrecognized) { return unrecognized.index; }Unexecuted instantiation: wallet.cpp:_ZZN6walletL22TxStateSerializedIndexERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEENKUlRKS6_E_clESB_Unexecuted instantiation: walletdb.cpp:_ZZN6walletL22TxStateSerializedIndexERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEENKUlRKS6_E_clESB_ | 
| 120 | 0 |     }, state); | 
| 121 | 0 | } Unexecuted instantiation: fees.cpp:_ZN6walletL22TxStateSerializedIndexERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEUnexecuted instantiation: scriptpubkeyman.cpp:_ZN6walletL22TxStateSerializedIndexERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEUnexecuted instantiation: spend.cpp:_ZN6walletL22TxStateSerializedIndexERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEUnexecuted instantiation: dump.cpp:_ZN6walletL22TxStateSerializedIndexERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEUnexecuted instantiation: feebumper.cpp:_ZN6walletL22TxStateSerializedIndexERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEUnexecuted instantiation: interfaces.cpp:_ZN6walletL22TxStateSerializedIndexERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEUnexecuted instantiation: load.cpp:_ZN6walletL22TxStateSerializedIndexERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEUnexecuted instantiation: receive.cpp:_ZN6walletL22TxStateSerializedIndexERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEUnexecuted instantiation: addresses.cpp:_ZN6walletL22TxStateSerializedIndexERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEUnexecuted instantiation: backup.cpp:_ZN6walletL22TxStateSerializedIndexERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEUnexecuted instantiation: coins.cpp:_ZN6walletL22TxStateSerializedIndexERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEUnexecuted instantiation: encrypt.cpp:_ZN6walletL22TxStateSerializedIndexERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEUnexecuted instantiation: signmessage.cpp:_ZN6walletL22TxStateSerializedIndexERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEUnexecuted instantiation: transactions.cpp:_ZN6walletL22TxStateSerializedIndexERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEUnexecuted instantiation: util.cpp:_ZN6walletL22TxStateSerializedIndexERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEUnexecuted instantiation: wallet.cpp:_ZN6walletL22TxStateSerializedIndexERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEUnexecuted instantiation: transaction.cpp:_ZN6walletL22TxStateSerializedIndexERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEUnexecuted instantiation: walletdb.cpp:_ZN6walletL22TxStateSerializedIndexERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEUnexecuted instantiation: init.cpp:_ZN6walletL22TxStateSerializedIndexERKNSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEE | 
| 122 |  |  | 
| 123 |  | //! Return TxState or SyncTxState as a string for logging or debugging. | 
| 124 |  | template<typename T> | 
| 125 |  | std::string TxStateString(const T& state) | 
| 126 | 0 | { | 
| 127 | 0 |     return std::visit([](const auto& s) { return s.toString(); }, state);Unexecuted instantiation: _ZZN6wallet13TxStateStringINSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEEENS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKT_ENKUlSH_E_clIS3_EEDaSH_Unexecuted instantiation: _ZZN6wallet13TxStateStringINSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEEENS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKT_ENKUlSH_E_clIS4_EEDaSH_Unexecuted instantiation: _ZZN6wallet13TxStateStringINSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEEENS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKT_ENKUlSH_E_clIS5_EEDaSH_Unexecuted instantiation: _ZZN6wallet13TxStateStringINSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEEENS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKT_ENKUlSH_E_clIS6_EEDaSH_Unexecuted instantiation: _ZZN6wallet13TxStateStringINSt3__17variantIJNS_16TxStateConfirmedENS_16TxStateInMempoolENS_22TxStateBlockConflictedENS_15TxStateInactiveENS_19TxStateUnrecognizedEEEEEENS1_12basic_stringIcNS1_11char_traitsIcEENS1_9allocatorIcEEEERKT_ENKUlSH_E_clIS7_EEDaSH_ | 
| 128 | 0 | } | 
| 129 |  |  | 
| 130 |  | /** | 
| 131 |  |  * Cachable amount subdivided into avoid reuse and all balances | 
| 132 |  |  */ | 
| 133 |  | struct CachableAmount | 
| 134 |  | { | 
| 135 |  |     std::optional<CAmount> m_avoid_reuse_value; | 
| 136 |  |     std::optional<CAmount> m_all_value; | 
| 137 |  |     inline void Reset() | 
| 138 | 0 |     { | 
| 139 | 0 |         m_avoid_reuse_value.reset(); | 
| 140 | 0 |         m_all_value.reset(); | 
| 141 | 0 |     } | 
| 142 |  |     void Set(bool avoid_reuse, CAmount value) | 
| 143 | 0 |     { | 
| 144 | 0 |         if (avoid_reuse) { | 
| 145 | 0 |             m_avoid_reuse_value = value; | 
| 146 | 0 |         } else { | 
| 147 | 0 |             m_all_value = value; | 
| 148 | 0 |         } | 
| 149 | 0 |     } | 
| 150 |  |     CAmount Get(bool avoid_reuse) | 
| 151 | 0 |     { | 
| 152 | 0 |         if (avoid_reuse) { | 
| 153 | 0 |             Assert(m_avoid_reuse_value.has_value()); | Line | Count | Source |  | 106 | 0 | #define Assert(val) inline_assertion_check<true>(val, __FILE__, __LINE__, __func__, #val) | 
 | 
| 154 | 0 |             return m_avoid_reuse_value.value(); | 
| 155 | 0 |         } | 
| 156 | 0 |         Assert(m_all_value.has_value()); | Line | Count | Source |  | 106 | 0 | #define Assert(val) inline_assertion_check<true>(val, __FILE__, __LINE__, __func__, #val) | 
 | 
| 157 | 0 |         return m_all_value.value(); | 
| 158 | 0 |     } | 
| 159 |  |     bool IsCached(bool avoid_reuse) | 
| 160 | 0 |     { | 
| 161 | 0 |         if (avoid_reuse) return m_avoid_reuse_value.has_value(); | 
| 162 | 0 |         return m_all_value.has_value(); | 
| 163 | 0 |     } | 
| 164 |  | }; | 
| 165 |  |  | 
| 166 |  |  | 
| 167 |  | typedef std::map<std::string, std::string> mapValue_t; | 
| 168 |  |  | 
| 169 |  |  | 
| 170 |  | /** Legacy class used for deserializing vtxPrev for backwards compatibility. | 
| 171 |  |  * vtxPrev was removed in commit 93a18a3650292afbb441a47d1fa1b94aeb0164e3, | 
| 172 |  |  * but old wallet.dat files may still contain vtxPrev vectors of CMerkleTxs. | 
| 173 |  |  * These need to get deserialized for field alignment when deserializing | 
| 174 |  |  * a CWalletTx, but the deserialized values are discarded.**/ | 
| 175 |  | class CMerkleTx | 
| 176 |  | { | 
| 177 |  | public: | 
| 178 |  |     template<typename Stream> | 
| 179 |  |     void Unserialize(Stream& s) | 
| 180 | 0 |     { | 
| 181 | 0 |         CTransactionRef tx; | 
| 182 | 0 |         uint256 hashBlock; | 
| 183 | 0 |         std::vector<uint256> vMerkleBranch; | 
| 184 | 0 |         int nIndex; | 
| 185 |  | 
 | 
| 186 | 0 |         s >> TX_WITH_WITNESS(tx) >> hashBlock >> vMerkleBranch >> nIndex; | 
| 187 | 0 |     } | 
| 188 |  | }; | 
| 189 |  |  | 
| 190 |  | /** | 
| 191 |  |  * A transaction with a bunch of additional info that only the owner cares about. | 
| 192 |  |  * It includes any unrecorded transactions needed to link it back to the block chain. | 
| 193 |  |  */ | 
| 194 |  | class CWalletTx | 
| 195 |  | { | 
| 196 |  | public: | 
| 197 |  |     /** | 
| 198 |  |      * Key/value map with information about the transaction. | 
| 199 |  |      * | 
| 200 |  |      * The following keys can be read and written through the map and are | 
| 201 |  |      * serialized in the wallet database: | 
| 202 |  |      * | 
| 203 |  |      *     "comment", "to"   - comment strings provided to sendtoaddress, | 
| 204 |  |      *                         and sendmany wallet RPCs | 
| 205 |  |      *     "replaces_txid"   - txid (as HexStr) of transaction replaced by | 
| 206 |  |      *                         bumpfee on transaction created by bumpfee | 
| 207 |  |      *     "replaced_by_txid" - txid (as HexStr) of transaction created by | 
| 208 |  |      *                         bumpfee on transaction replaced by bumpfee | 
| 209 |  |      *     "from", "message" - obsolete fields that could be set in UI prior to | 
| 210 |  |      *                         2011 (removed in commit 4d9b223) | 
| 211 |  |      * | 
| 212 |  |      * The following keys are serialized in the wallet database, but shouldn't | 
| 213 |  |      * be read or written through the map (they will be temporarily added and | 
| 214 |  |      * removed from the map during serialization): | 
| 215 |  |      * | 
| 216 |  |      *     "fromaccount"     - serialized strFromAccount value | 
| 217 |  |      *     "n"               - serialized nOrderPos value | 
| 218 |  |      *     "timesmart"       - serialized nTimeSmart value | 
| 219 |  |      *     "spent"           - serialized vfSpent value that existed prior to | 
| 220 |  |      *                         2014 (removed in commit 93a18a3) | 
| 221 |  |      */ | 
| 222 |  |     mapValue_t mapValue; | 
| 223 |  |     std::vector<std::pair<std::string, std::string> > vOrderForm; | 
| 224 |  |     unsigned int nTimeReceived; //!< time received by this node | 
| 225 |  |     /** | 
| 226 |  |      * Stable timestamp that never changes, and reflects the order a transaction | 
| 227 |  |      * was added to the wallet. Timestamp is based on the block time for a | 
| 228 |  |      * transaction added as part of a block, or else the time when the | 
| 229 |  |      * transaction was received if it wasn't part of a block, with the timestamp | 
| 230 |  |      * adjusted in both cases so timestamp order matches the order transactions | 
| 231 |  |      * were added to the wallet. More details can be found in | 
| 232 |  |      * CWallet::ComputeTimeSmart(). | 
| 233 |  |      */ | 
| 234 |  |     unsigned int nTimeSmart; | 
| 235 |  |     // Cached value for whether the transaction spends any inputs known to the wallet | 
| 236 |  |     mutable std::optional<bool> m_cached_from_me{std::nullopt}; | 
| 237 |  |     int64_t nOrderPos; //!< position in ordered transaction list | 
| 238 |  |     std::multimap<int64_t, CWalletTx*>::const_iterator m_it_wtxOrdered; | 
| 239 |  |  | 
| 240 |  |     // memory only | 
| 241 |  |     enum AmountType { DEBIT, CREDIT, AMOUNTTYPE_ENUM_ELEMENTS }; | 
| 242 |  |     mutable CachableAmount m_amounts[AMOUNTTYPE_ENUM_ELEMENTS]; | 
| 243 |  |     /** | 
| 244 |  |      * This flag is true if all m_amounts caches are empty. This is particularly | 
| 245 |  |      * useful in places where MarkDirty is conditionally called and the | 
| 246 |  |      * condition can be expensive and thus can be skipped if the flag is true. | 
| 247 |  |      * See MarkDestinationsDirty. | 
| 248 |  |      */ | 
| 249 |  |     mutable bool m_is_cache_empty{true}; | 
| 250 |  |     mutable bool fChangeCached; | 
| 251 |  |     mutable CAmount nChangeCached; | 
| 252 |  |  | 
| 253 | 0 |     CWalletTx(CTransactionRef tx, const TxState& state) : tx(std::move(tx)), m_state(state) | 
| 254 | 0 |     { | 
| 255 | 0 |         Init(); | 
| 256 | 0 |     } | 
| 257 |  |  | 
| 258 |  |     void Init() | 
| 259 | 0 |     { | 
| 260 | 0 |         mapValue.clear(); | 
| 261 | 0 |         vOrderForm.clear(); | 
| 262 | 0 |         nTimeReceived = 0; | 
| 263 | 0 |         nTimeSmart = 0; | 
| 264 | 0 |         fChangeCached = false; | 
| 265 | 0 |         nChangeCached = 0; | 
| 266 | 0 |         nOrderPos = -1; | 
| 267 | 0 |     } | 
| 268 |  |  | 
| 269 |  |     CTransactionRef tx; | 
| 270 |  |     TxState m_state; | 
| 271 |  |  | 
| 272 |  |     // Set of mempool transactions that conflict | 
| 273 |  |     // directly with the transaction, or that conflict | 
| 274 |  |     // with an ancestor transaction. This set will be | 
| 275 |  |     // empty if state is InMempool or Confirmed, but | 
| 276 |  |     // can be nonempty if state is Inactive or | 
| 277 |  |     // BlockConflicted. | 
| 278 |  |     std::set<Txid> mempool_conflicts; | 
| 279 |  |  | 
| 280 |  |     // Track v3 mempool tx that spends from this tx | 
| 281 |  |     // so that we don't try to create another unconfirmed child | 
| 282 |  |     std::optional<Txid> truc_child_in_mempool; | 
| 283 |  |  | 
| 284 |  |     template<typename Stream> | 
| 285 |  |     void Serialize(Stream& s) const | 
| 286 | 0 |     { | 
| 287 | 0 |         mapValue_t mapValueCopy = mapValue; | 
| 288 |  | 
 | 
| 289 | 0 |         mapValueCopy["fromaccount"] = ""; | 
| 290 | 0 |         if (nOrderPos != -1) { | 
| 291 | 0 |             mapValueCopy["n"] = util::ToString(nOrderPos); | 
| 292 | 0 |         } | 
| 293 | 0 |         if (nTimeSmart) { | 
| 294 | 0 |             mapValueCopy["timesmart"] = strprintf("%u", nTimeSmart);| Line | Count | Source |  | 1172 | 0 | #define strprintf tfm::format | 
 | 
| 295 | 0 |         } | 
| 296 |  | 
 | 
| 297 | 0 |         std::vector<uint8_t> dummy_vector1; //!< Used to be vMerkleBranch | 
| 298 | 0 |         std::vector<uint8_t> dummy_vector2; //!< Used to be vtxPrev | 
| 299 | 0 |         bool dummy_bool = false; //!< Used to be fFromMe, and fSpent | 
| 300 | 0 |         uint32_t dummy_int = 0; // Used to be fTimeReceivedIsTxTime | 
| 301 | 0 |         uint256 serializedHash = TxStateSerializedBlockHash(m_state); | 
| 302 | 0 |         int serializedIndex = TxStateSerializedIndex(m_state); | 
| 303 | 0 |         s << TX_WITH_WITNESS(tx) << serializedHash << dummy_vector1 << serializedIndex << dummy_vector2 << mapValueCopy << vOrderForm << dummy_int << nTimeReceived << dummy_bool << dummy_bool; | 
| 304 | 0 |     } | 
| 305 |  |  | 
| 306 |  |     template<typename Stream> | 
| 307 |  |     void Unserialize(Stream& s) | 
| 308 | 0 |     { | 
| 309 | 0 |         Init(); | 
| 310 |  | 
 | 
| 311 | 0 |         std::vector<uint256> dummy_vector1; //!< Used to be vMerkleBranch | 
| 312 | 0 |         std::vector<CMerkleTx> dummy_vector2; //!< Used to be vtxPrev | 
| 313 | 0 |         bool dummy_bool; //! Used to be fFromMe, and fSpent | 
| 314 | 0 |         uint32_t dummy_int; // Used to be fTimeReceivedIsTxTime | 
| 315 | 0 |         uint256 serialized_block_hash; | 
| 316 | 0 |         int serializedIndex; | 
| 317 | 0 |         s >> TX_WITH_WITNESS(tx) >> serialized_block_hash >> dummy_vector1 >> serializedIndex >> dummy_vector2 >> mapValue >> vOrderForm >> dummy_int >> nTimeReceived >> dummy_bool >> dummy_bool; | 
| 318 |  | 
 | 
| 319 | 0 |         m_state = TxStateInterpretSerialized({serialized_block_hash, serializedIndex}); | 
| 320 |  | 
 | 
| 321 | 0 |         const auto it_op = mapValue.find("n"); | 
| 322 | 0 |         nOrderPos = (it_op != mapValue.end()) ? LocaleIndependentAtoi<int64_t>(it_op->second) : -1; | 
| 323 | 0 |         const auto it_ts = mapValue.find("timesmart"); | 
| 324 | 0 |         nTimeSmart = (it_ts != mapValue.end()) ? static_cast<unsigned int>(LocaleIndependentAtoi<int64_t>(it_ts->second)) : 0; | 
| 325 |  | 
 | 
| 326 | 0 |         mapValue.erase("fromaccount"); | 
| 327 | 0 |         mapValue.erase("spent"); | 
| 328 | 0 |         mapValue.erase("n"); | 
| 329 | 0 |         mapValue.erase("timesmart"); | 
| 330 | 0 |     } | 
| 331 |  |  | 
| 332 |  |     void SetTx(CTransactionRef arg) | 
| 333 | 0 |     { | 
| 334 | 0 |         tx = std::move(arg); | 
| 335 | 0 |     } | 
| 336 |  |  | 
| 337 |  |     //! make sure balances are recalculated | 
| 338 |  |     void MarkDirty() | 
| 339 | 0 |     { | 
| 340 | 0 |         m_amounts[DEBIT].Reset(); | 
| 341 | 0 |         m_amounts[CREDIT].Reset(); | 
| 342 | 0 |         fChangeCached = false; | 
| 343 | 0 |         m_is_cache_empty = true; | 
| 344 | 0 |         m_cached_from_me = std::nullopt; | 
| 345 | 0 |     } | 
| 346 |  |  | 
| 347 |  |     /** True if only scriptSigs are different */ | 
| 348 |  |     bool IsEquivalentTo(const CWalletTx& tx) const; | 
| 349 |  |  | 
| 350 |  |     bool InMempool() const; | 
| 351 |  |  | 
| 352 |  |     int64_t GetTxTime() const; | 
| 353 |  |  | 
| 354 | 0 |     template<typename T> const T* state() const { return std::get_if<T>(&m_state); }Unexecuted instantiation: _ZNK6wallet9CWalletTx5stateINS_15TxStateInactiveEEEPKT_vUnexecuted instantiation: _ZNK6wallet9CWalletTx5stateINS_22TxStateBlockConflictedEEEPKT_vUnexecuted instantiation: _ZNK6wallet9CWalletTx5stateINS_16TxStateConfirmedEEEPKT_vUnexecuted instantiation: _ZNK6wallet9CWalletTx5stateINS_16TxStateInMempoolEEEPKT_v | 
| 355 | 0 |     template<typename T> T* state() { return std::get_if<T>(&m_state); }Unexecuted instantiation: _ZN6wallet9CWalletTx5stateINS_16TxStateConfirmedEEEPT_vUnexecuted instantiation: _ZN6wallet9CWalletTx5stateINS_22TxStateBlockConflictedEEEPT_vUnexecuted instantiation: _ZN6wallet9CWalletTx5stateINS_16TxStateInMempoolEEEPT_v | 
| 356 |  |  | 
| 357 |  |     //! Update transaction state when attaching to a chain, filling in heights | 
| 358 |  |     //! of conflicted and confirmed blocks | 
| 359 |  |     void updateState(interfaces::Chain& chain); | 
| 360 |  |  | 
| 361 | 0 |     bool isAbandoned() const { return state<TxStateInactive>() && state<TxStateInactive>()->abandoned; } | 
| 362 | 0 |     bool isMempoolConflicted() const { return !mempool_conflicts.empty(); } | 
| 363 | 0 |     bool isBlockConflicted() const { return state<TxStateBlockConflicted>(); } | 
| 364 | 0 |     bool isInactive() const { return state<TxStateInactive>(); } | 
| 365 | 0 |     bool isUnconfirmed() const { return !isAbandoned() && !isBlockConflicted() && !isMempoolConflicted() && !isConfirmed(); } | 
| 366 | 0 |     bool isConfirmed() const { return state<TxStateConfirmed>(); } | 
| 367 | 0 |     const Txid& GetHash() const LIFETIMEBOUND { return tx->GetHash(); } | 
| 368 | 0 |     const Wtxid& GetWitnessHash() const LIFETIMEBOUND { return tx->GetWitnessHash(); } | 
| 369 | 0 |     bool IsCoinBase() const { return tx->IsCoinBase(); } | 
| 370 |  |  | 
| 371 |  | private: | 
| 372 |  |     // Disable copying of CWalletTx objects to prevent bugs where instances get | 
| 373 |  |     // copied in and out of the mapWallet map, and fields are updated in the | 
| 374 |  |     // wrong copy. | 
| 375 |  |     CWalletTx(const CWalletTx&) = default; | 
| 376 | 0 |     CWalletTx& operator=(const CWalletTx&) = default; | 
| 377 |  | public: | 
| 378 |  |     // Instead have an explicit copy function | 
| 379 |  |     void CopyFrom(const CWalletTx&); | 
| 380 |  | }; | 
| 381 |  |  | 
| 382 |  | struct WalletTxOrderComparator { | 
| 383 |  |     bool operator()(const CWalletTx* a, const CWalletTx* b) const | 
| 384 | 0 |     { | 
| 385 | 0 |         return a->nOrderPos < b->nOrderPos; | 
| 386 | 0 |     } | 
| 387 |  | }; | 
| 388 |  |  | 
| 389 |  | class WalletTXO | 
| 390 |  | { | 
| 391 |  | private: | 
| 392 |  |     const CWalletTx& m_wtx; | 
| 393 |  |     const CTxOut& m_output; | 
| 394 |  |  | 
| 395 |  | public: | 
| 396 |  |     WalletTXO(const CWalletTx& wtx, const CTxOut& output) | 
| 397 | 0 |     : m_wtx(wtx), | 
| 398 | 0 |     m_output(output) | 
| 399 | 0 |     { | 
| 400 | 0 |         Assume(std::ranges::find(wtx.tx->vout, output) != wtx.tx->vout.end()); | Line | Count | Source |  | 118 | 0 | #define Assume(val) inline_assertion_check<false>(val, __FILE__, __LINE__, __func__, #val) | 
 | 
| 401 | 0 |     } | 
| 402 |  |  | 
| 403 | 0 |     const CWalletTx& GetWalletTx() const { return m_wtx; } | 
| 404 |  |  | 
| 405 | 0 |     const CTxOut& GetTxOut() const { return m_output; } | 
| 406 |  | }; | 
| 407 |  | } // namespace wallet | 
| 408 |  |  | 
| 409 |  | #endif // BITCOIN_WALLET_TRANSACTION_H |