5#ifndef BITCOIN_WALLET_TRANSACTION_H
6#define BITCOIN_WALLET_TRANSACTION_H
79using TxState = std::variant<TxStateConfirmed, TxStateInMempool, TxStateBlockConflicted, TxStateInactive, TxStateUnrecognized>;
82using SyncTxState = std::variant<TxStateConfirmed, TxStateInMempool, TxStateInactive>;
91 }
else if (
data.index >= 0) {
93 }
else if (
data.index == -1) {
105 [](
const TxStateConfirmed& confirmed) {
return confirmed.confirmed_block_hash; },
115 [](
const TxStateInactive& inactive) {
return inactive.abandoned ? -1 : 0; },
117 [](
const TxStateConfirmed& confirmed) {
return confirmed.position_in_block; },
127 return std::visit([](
const auto&
s) {
return s.toString(); }, state);
175 template<
typename Stream>
180 std::vector<uint256> vMerkleBranch;
266 template<
typename Stream>
269 std::map<std::string, std::string> string_values;
276 string_values[
"fromaccount"] =
"";
280 std::vector<std::pair<std::string, std::string>> msgs_reqs;
283 msgs_reqs.emplace_back(
"Message",
msg);
286 msgs_reqs.emplace_back(
"PaymentRequest", req);
289 std::vector<uint8_t> dummy_vector1;
290 std::vector<uint8_t> dummy_vector2;
291 bool dummy_bool =
false;
292 uint32_t dummy_int = 0;
295 s <<
TX_WITH_WITNESS(
tx) << serializedHash << dummy_vector1 << serializedIndex << dummy_vector2 << string_values << msgs_reqs << dummy_int <<
nTimeReceived << dummy_bool << dummy_bool;
298 template<
typename Stream>
303 std::vector<uint256> dummy_vector1;
304 std::vector<CMerkleTx> dummy_vector2;
309 std::map<std::string, std::string> string_values;
310 std::vector<std::pair<std::string, std::string>> msgs_reqs;
311 s >>
TX_WITH_WITNESS(
tx) >> serialized_block_hash >> dummy_vector1 >> serializedIndex >> dummy_vector2 >> string_values >> msgs_reqs >> dummy_int >>
nTimeReceived >> dummy_bool >> dummy_bool;
315 string_values.erase(
"fromaccount");
316 string_values.erase(
"spent");
317 for (
const auto& [key, value] : string_values) {
318 if (key ==
"n")
nOrderPos = LocaleIndependentAtoi<int64_t>(value);
319 else if (key ==
"timesmart")
nTimeSmart = LocaleIndependentAtoi<int64_t>(value);
320 else if (key ==
"from")
m_from = value;
321 else if (key ==
"message")
m_message = value;
322 else if (key ==
"comment")
m_comment = value;
327 throw std::runtime_error(
"Unexpected value in CWalletTx strings value map");
331 for (
const auto& [type,
data] : msgs_reqs) {
335 throw std::runtime_error(
"Unknown type in CWalletTx messages and requests vector");
362 template<
typename T>
const T*
state()
const {
return std::get_if<T>(&
m_state); }
369 bool isAbandoned()
const {
return state<TxStateInactive>() && state<TxStateInactive>()->abandoned; }
408 Assume(std::ranges::find(wtx.
tx->vout, output) != wtx.
tx->vout.end());
int64_t CAmount
Amount in satoshis (Can be negative)
#define Assert(val)
Identity function.
#define Assume(val)
Assume is the identity function.
An output of a transaction.
std::string ToString() const
Interface giving clients (wallet processes, maybe other analysis tools in the future) ability to acce...
static std::optional< transaction_identifier > FromHex(std::string_view hex)
static const uint256 ZERO
Legacy class used for deserializing vtxPrev for backwards compatibility.
void Unserialize(Stream &s)
A transaction with a bunch of additional info that only the owner cares about.
bool isBlockConflicted() const
std::vector< std::string > m_messages
const Txid & GetHash() const LIFETIMEBOUND
bool IsEquivalentTo(const CWalletTx &tx) const
True if only scriptSigs are different.
std::set< Txid > mempool_conflicts
std::optional< Txid > m_replaces_txid
void updateState(interfaces::Chain &chain)
Update transaction state when attaching to a chain, filling in heights of conflicted and confirmed bl...
@ AMOUNTTYPE_ENUM_ELEMENTS
std::optional< std::string > m_comment_to
void Serialize(Stream &s) const
std::optional< std::string > m_message
int64_t nOrderPos
position in ordered transaction list
bool isUnconfirmed() const
void CopyFrom(const CWalletTx &)
std::optional< bool > m_cached_from_me
std::optional< std::string > m_comment
unsigned int nTimeReceived
time received by this node
std::optional< std::string > m_from
std::optional< Txid > m_replaced_by_txid
void Unserialize(Stream &s)
void SetTx(CTransactionRef arg)
bool isMempoolConflicted() const
CachableAmount m_amounts[AMOUNTTYPE_ENUM_ELEMENTS]
CWalletTx & operator=(const CWalletTx &)=default
std::optional< Txid > truc_child_in_mempool
std::vector< std::string > m_payment_requests
int64_t GetTxTime() const
CWalletTx(CTransactionRef tx, const TxState &state)
bool m_is_cache_empty
This flag is true if all m_amounts caches are empty.
std::multimap< int64_t, CWalletTx * >::const_iterator m_it_wtxOrdered
CWalletTx(const CWalletTx &)=default
unsigned int nTimeSmart
Stable timestamp that never changes, and reflects the order a transaction was added to the wallet.
const Wtxid & GetWitnessHash() const LIFETIMEBOUND
void MarkDirty()
make sure balances are recalculated
WalletTXO(const CWalletTx &wtx, const CTxOut &output)
const CWalletTx & GetWalletTx() const
const CTxOut & GetTxOut() const
static const PrecomputedData data
Precomputed COutPoint and CCoins values.
#define T(expected, seed, data)
std::string ToString(const T &t)
Locale-independent version of std::to_string.
std::variant< TxStateConfirmed, TxStateInMempool, TxStateInactive > SyncTxState
Subset of states transaction sync logic is implemented to handle.
std::variant< TxStateConfirmed, TxStateInMempool, TxStateBlockConflicted, TxStateInactive, TxStateUnrecognized > TxState
All possible CWalletTx states.
static int TxStateSerializedIndex(const TxState &state)
Get TxState serialized block index. Inverse of TxStateInterpretSerialized.
static TxState TxStateInterpretSerialized(TxStateUnrecognized data)
Try to interpret deserialized TxStateUnrecognized data as a recognized state.
static uint256 TxStateSerializedBlockHash(const TxState &state)
Get TxState serialized block hash. Inverse of TxStateInterpretSerialized.
std::string TxStateString(const T &state)
Return TxState or SyncTxState as a string for logging or debugging.
static constexpr TransactionSerParams TX_WITH_WITNESS
std::shared_ptr< const CTransaction > CTransactionRef
Overloaded helper for std::visit.
Cachable amount subdivided into avoid reuse and all balances.
std::optional< CAmount > m_avoid_reuse_value
std::optional< CAmount > m_all_value
bool IsCached(bool avoid_reuse)
CAmount Get(bool avoid_reuse)
void Set(bool avoid_reuse, CAmount value)
State of rejected transaction that conflicts with a confirmed block.
std::string toString() const
int conflicting_block_height
uint256 conflicting_block_hash
TxStateBlockConflicted(const uint256 &block_hash, int height)
State of transaction confirmed in a block.
int confirmed_block_height
std::string toString() const
TxStateConfirmed(const uint256 &block_hash, int height, int index)
uint256 confirmed_block_hash
State of transaction added to mempool.
std::string toString() const
State of transaction not confirmed or conflicting with a known block and not in the mempool.
std::string toString() const
TxStateInactive(bool abandoned=false)
State of transaction loaded in an unrecognized state with unexpected hash or index values.
TxStateUnrecognized(const uint256 &block_hash, int index)
std::string toString() const
bool operator()(const CWalletTx *a, const CWalletTx *b) const
is a home for public enum and struct type definitions that are used by internally by wallet code,...