/ src / wallet / transaction.cpp
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