transaction.cpp raw

   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
  64