transactionrecord.h raw

   1  // Copyright (c) 2011-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  #ifndef BITCOIN_QT_TRANSACTIONRECORD_H
   6  #define BITCOIN_QT_TRANSACTIONRECORD_H
   7  
   8  #include <consensus/amount.h>
   9  #include <primitives/transaction_identifier.h>
  10  #include <uint256.h>
  11  
  12  #include <QList>
  13  #include <QString>
  14  
  15  namespace interfaces {
  16  class Node;
  17  class Wallet;
  18  struct WalletTx;
  19  struct WalletTxStatus;
  20  }
  21  
  22  /** UI model for transaction status. The transaction status is the part of a transaction that will change over time.
  23   */
  24  struct TransactionStatus {
  25      enum Status {
  26          Confirmed,          /**< Have 6 or more confirmations (normal tx) or fully mature (mined tx) **/
  27          /// Normal (sent/received) transactions
  28          Unconfirmed,        /**< Not yet mined into a block **/
  29          Confirming,         /**< Confirmed, but waiting for the recommended number of confirmations **/
  30          Conflicted,         /**< Conflicts with other transaction or mempool **/
  31          Abandoned,          /**< Abandoned from the wallet **/
  32          /// Generated (mined) transactions
  33          Immature,           /**< Mined but waiting for maturity */
  34          NotAccepted         /**< Mined but not accepted */
  35      };
  36  
  37      /// Transaction counts towards available balance
  38      bool countsForBalance{false};
  39      /// Sorting key based on status
  40      std::string sortKey;
  41  
  42      /** @name Generated (mined) transactions
  43         @{*/
  44      int matures_in{0};
  45      /**@}*/
  46  
  47      /** @name Reported status
  48         @{*/
  49      Status status{Unconfirmed};
  50      qint64 depth{0};
  51      /**@}*/
  52  
  53      /** Current block hash (to know whether cached status is still valid) */
  54      uint256 m_cur_block_hash{};
  55  
  56      bool needsUpdate{false};
  57  };
  58  
  59  /** UI model for a transaction. A core transaction can be represented by multiple UI transactions if it has
  60      multiple outputs.
  61   */
  62  class TransactionRecord
  63  {
  64  public:
  65      enum Type
  66      {
  67          Other,
  68          Generated,
  69          SendToAddress,
  70          SendToOther,
  71          RecvWithAddress,
  72          RecvFromOther,
  73      };
  74  
  75      /** Number of confirmation recommended for accepting a transaction */
  76      static const int RecommendedNumConfirmations = 6;
  77  
  78      TransactionRecord():
  79              hash(), time(0), type(Other), debit(0), credit(0), idx(0)
  80      {
  81      }
  82  
  83      TransactionRecord(Txid _hash, qint64 _time):
  84              hash(_hash), time(_time), type(Other), debit(0),
  85              credit(0), idx(0)
  86      {
  87      }
  88  
  89      TransactionRecord(Txid _hash, qint64 _time,
  90                  Type _type, const std::string &_address,
  91                  const CAmount& _debit, const CAmount& _credit):
  92              hash(_hash), time(_time), type(_type), address(_address), debit(_debit), credit(_credit),
  93              idx(0)
  94      {
  95      }
  96  
  97      /** Decompose CWallet transaction to model transaction records.
  98       */
  99      static bool showTransaction();
 100      static QList<TransactionRecord> decomposeTransaction(const interfaces::WalletTx& wtx);
 101  
 102      /** @name Immutable transaction attributes
 103        @{*/
 104      Txid hash;
 105      qint64 time;
 106      Type type;
 107      std::string address;
 108      CAmount debit;
 109      CAmount credit;
 110      /**@}*/
 111  
 112      /** Subtransaction index, for sort key */
 113      int idx;
 114  
 115      /** Status: can change with block chain update */
 116      TransactionStatus status;
 117  
 118      /** Return the unique identifier for this transaction (part) */
 119      QString getTxHash() const;
 120  
 121      /** Return the output index of the subtransaction  */
 122      int getOutputIndex() const;
 123  
 124      /** Update status from core wallet tx.
 125       */
 126      void updateStatus(const interfaces::WalletTxStatus& wtx, const uint256& block_hash, int numBlocks, int64_t block_time);
 127  
 128      /** Return whether a status update is needed.
 129       */
 130      bool statusUpdateNeeded(const uint256& block_hash) const;
 131  };
 132  
 133  #endif // BITCOIN_QT_TRANSACTIONRECORD_H
 134