git / moonbite-core / src/wallet/txrecord.h · raw
#pragma once#include <amount.h>#include <primitives/transaction.h>#include <univalue.h>#include <boost/optional.hpp>#include <boost/variant.hpp>// Forward Declarationsclass CWallet;class CWalletTx;struct PegoutIndex{ // The ID of the kernel containing the pegout. mw::Hash kernel_id; // The position of the PegOutCoin within the kernel. // Ex: If a kernel has 3 pegouts, the last one will have a pos of 2. size_t pos;};struct WalletTxStatus{ enum Status { Confirmed, /**< Have 6 or more confirmations (normal tx) or fully mature (mined tx) **/ /// Normal (sent/received) transactions OpenUntilDate, /**< Transaction not yet final, waiting for date */ OpenUntilBlock, /**< Transaction not yet final, waiting for block */ Unconfirmed, /**< Not yet mined into a block **/ Confirming, /**< Confirmed, but waiting for the recommended number of confirmations **/ Conflicted, /**< Conflicts with other transaction or mempool **/ Abandoned, /**< Abandoned from the wallet **/ /// Generated (mined) transactions Immature, /**< Mined but waiting for maturity */ NotAccepted /**< Mined but not accepted */ }; /// Transaction counts towards available balance bool countsForBalance; /// Sorting key based on status std::string sortKey; /** @name Generated (mined) transactions @{*/ int matures_in; /**@}*/ /** @name Reported status @{*/ Status status; int64_t depth; int64_t open_for; /**< Timestamp if status==OpenUntilDate, otherwise number of additional blocks that need to be mined before finalization */ /**@}*/ /** Current block hash (to know whether cached status is still valid) */ uint256 m_cur_block_hash{}; bool needsUpdate;};class WalletTxRecord{public: WalletTxRecord(const CWallet* pWallet, const CWalletTx* wtx, const OutputIndex& output_index) : m_pWallet(pWallet), m_wtx(wtx) { if (output_index.type() == typeid(mw::Hash)) { index = boost::make_optional(boost::get<mw::Hash>(output_index)); } else { index = boost::make_optional((int)boost::get<COutPoint>(output_index).n); } } WalletTxRecord(const CWallet* pWallet, const CWalletTx* wtx, const PegoutIndex& pegout_index) : m_pWallet(pWallet), m_wtx(wtx), index(boost::make_optional(pegout_index)) {} WalletTxRecord(const CWallet* pWallet, const CWalletTx* wtx) : m_pWallet(pWallet), m_wtx(wtx), index(boost::none) {} static const int RecommendedNumConfirmations = 6; enum Type { Other, Generated, SendToAddress, SendToOther, RecvWithAddress, RecvFromOther, SendToSelf, }; Type type{Type::Other}; std::string address{}; CAmount debit{0}; CAmount credit{0}; CAmount fee{0}; bool involvesWatchAddress{false}; // Cached status attributes WalletTxStatus status; // Updates the transaction record's cached status attributes. bool UpdateStatusIfNeeded(const uint256& block_hash); const CWalletTx& GetWTX() const noexcept { return *m_wtx; } const uint256& GetTxHash() const; std::string GetTxString() const; int64_t GetTxTime() const; CAmount GetAmount() const noexcept { return credit > 0 ? credit : debit; } //CAmount GetAmount() const noexcept { return credit + debit; } CAmount GetNet() const noexcept { return credit + debit + fee; } UniValue ToUniValue() const; // Returns the formatted component index. std::string GetComponentIndex() const;private: // Pointer to the CWallet instance const CWallet* m_pWallet; // The actual CWalletTx const CWalletTx* m_wtx; // The index of the transaction component this record is for. boost::optional<boost::variant<int, mw::Hash, PegoutIndex>> index; std::string GetType() const;};