transaction.cpp
1 // Copyright (c) 2021-present 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 #include <wallet/transaction.h> 6 7 #include <interfaces/chain.h> 8 9 using interfaces::FoundBlock; 10 11 namespace wallet { 12 bool CWalletTx::IsEquivalentTo(const CWalletTx& _tx) const 13 { 14 CMutableTransaction tx1 {*this->tx}; 15 CMutableTransaction tx2 {*_tx.tx}; 16 for (auto& txin : tx1.vin) { 17 txin.scriptSig = CScript(); 18 txin.scriptWitness.SetNull(); 19 } 20 for (auto& txin : tx2.vin) { 21 txin.scriptSig = CScript(); 22 txin.scriptWitness.SetNull(); 23 } 24 return CTransaction(tx1) == CTransaction(tx2); 25 } 26 27 bool CWalletTx::InMempool() const 28 { 29 return state<TxStateInMempool>(); 30 } 31 32 int64_t CWalletTx::GetTxTime() const 33 { 34 int64_t n = nTimeSmart; 35 return n ? n : nTimeReceived; 36 } 37 38 void CWalletTx::updateState(interfaces::Chain& chain) 39 { 40 bool active; 41 auto lookup_block = [&](const uint256& hash, int& height, TxState& state) { 42 // If tx block (or conflicting block) was reorged out of chain 43 // while the wallet was shutdown, change tx status to UNCONFIRMED 44 // and reset block height, hash, and index. ABANDONED tx don't have 45 // associated blocks and don't need to be updated. The case where a 46 // transaction was reorged out while online and then reconfirmed 47 // while offline is covered by the rescan logic. 48 if (!chain.findBlock(hash, FoundBlock().inActiveChain(active).height(height)) || !active) { 49 state = TxStateInactive{}; 50 } 51 }; 52 if (auto* conf = state<TxStateConfirmed>()) { 53 lookup_block(conf->confirmed_block_hash, conf->confirmed_block_height, m_state); 54 } else if (auto* conf = state<TxStateBlockConflicted>()) { 55 lookup_block(conf->conflicting_block_hash, conf->conflicting_block_height, m_state); 56 } 57 } 58 59 void CWalletTx::CopyFrom(const CWalletTx& _tx) 60 { 61 *this = _tx; 62 } 63 } // namespace wallet