17 if (prev && txin.
prevout.
n < prev->
tx->vout.size()) {
35 throw std::runtime_error(std::string(__func__) +
": value out of range");
47 throw std::runtime_error(std::string(__func__) +
": value out of range");
67 if (!
wallet.FindAddressBookEntry(address)) {
83 throw std::runtime_error(std::string(__func__) +
": value out of range");
95 throw std::runtime_error(std::string(__func__) +
": value out of range");
103 if (!amount.IsCached(avoid_reuse)) {
107 return amount.Get(avoid_reuse);
115 if (
wallet.IsTxImmatureCoinBase(wtx))
124 if (wtx.
tx->vin.empty())
140 std::list<COutputEntry>& listReceived,
141 std::list<COutputEntry>& listSent,
CAmount& nFee,
145 listReceived.clear();
152 CAmount nValueOut = wtx.
tx->GetValueOut();
153 nFee = nDebit - nValueOut;
158 for (
unsigned int i = 0; i < wtx.
tx->vout.size(); ++i)
160 const CTxOut& txout = wtx.
tx->vout[i];
161 bool ismine =
wallet.IsMine(txout);
178 wallet.WalletLogPrintf(
"CWalletTx::GetAmounts: Unknown transaction type found, txid %s\n",
187 listSent.push_back(output);
191 listReceived.push_back(output);
207 if (trusted_parents.contains(wtx.
GetHash()))
return true;
218 for (
const CTxIn& txin : wtx.
tx->vin)
222 if (parent ==
nullptr)
return false;
225 if (!
wallet.IsMine(parentOut))
return false;
227 if (trusted_parents.count(parent->
GetHash()))
continue;
230 trusted_parents.insert(parent->
GetHash());
237 std::set<Txid> trusted_parents;
248 std::set<Txid> trusted_parents;
249 for (
const auto& [outpoint, txo] :
wallet.GetTXOs()) {
250 const CWalletTx& wtx = txo.GetWalletTx();
253 const int tx_depth{
wallet.GetTxDepthInMainChain(wtx)};
255 if (!
wallet.IsSpent(outpoint) && (allow_used_addresses || !
wallet.IsSpentKey(txo.GetTxOut().scriptPubKey))) {
257 CAmount credit_mine = txo.GetTxOut().nValue;
261 ret.m_mine_immature += credit_mine;
262 }
else if (is_trusted && tx_depth >= min_depth) {
263 ret.m_mine_trusted += credit_mine;
264 }
else if (!is_trusted && wtx.
InMempool()) {
265 ret.m_mine_untrusted_pending += credit_mine;
275 std::map<CTxDestination, CAmount> balances;
279 std::set<Txid> trusted_parents;
280 for (
const auto& [outpoint, txo] :
wallet.GetTXOs()) {
281 const CWalletTx& wtx = txo.GetWalletTx();
284 if (
wallet.IsTxImmatureCoinBase(wtx))
continue;
286 int nDepth =
wallet.GetTxDepthInMainChain(wtx);
293 CAmount n =
wallet.IsSpent(outpoint) ? 0 : txo.GetTxOut().nValue;
304 std::set< std::set<CTxDestination> > groupings;
305 std::set<CTxDestination> grouping;
307 for (
const auto& walletEntry :
wallet.mapWallet)
309 const CWalletTx& wtx = walletEntry.second;
311 if (wtx.
tx->vin.size() > 0)
313 bool any_mine =
false;
315 for (
const CTxIn& txin : wtx.
tx->vin)
322 grouping.insert(address);
329 for (
const CTxOut& txout : wtx.
tx->vout)
335 grouping.insert(txoutAddr);
338 if (grouping.size() > 0)
340 groupings.insert(grouping);
346 for (
const auto& txout : wtx.
tx->vout)
352 grouping.insert(address);
353 groupings.insert(grouping);
358 std::set< std::set<CTxDestination>* > uniqueGroupings;
359 std::map< CTxDestination, std::set<CTxDestination>* > setmap;
360 for (
const std::set<CTxDestination>& _grouping : groupings)
363 std::set< std::set<CTxDestination>* > hits;
364 std::map< CTxDestination, std::set<CTxDestination>* >::iterator it;
366 if ((it = setmap.find(address)) != setmap.end())
367 hits.insert((*it).second);
370 std::set<CTxDestination>* merged =
new std::set<CTxDestination>(_grouping);
371 for (std::set<CTxDestination>* hit : hits)
373 merged->insert(hit->begin(), hit->end());
374 uniqueGroupings.erase(hit);
377 uniqueGroupings.insert(merged);
381 setmap[element] = merged;
384 std::set< std::set<CTxDestination> >
ret;
385 for (
const std::set<CTxDestination>* uniqueGrouping : uniqueGroupings)
387 ret.insert(*uniqueGrouping);
388 delete uniqueGrouping;
bool ExtractDestination(const CScript &scriptPubKey, CTxDestination &addressRet)
Parse a scriptPubKey for the destination.
std::variant< CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, PayToAnchor, WitnessUnknown > CTxDestination
A txout script categorized into standard templates.
bool MoneyRange(const CAmount &nValue)
int64_t CAmount
Amount in satoshis (Can be negative)
#define Assume(val)
Assume is the identity function.
Serialized script, used inside transaction inputs and outputs.
bool IsUnspendable() const
Returns whether the script is guaranteed to fail at execution, regardless of the initial stack.
The basic transaction that is broadcasted on the network and contained in blocks.
const std::vector< CTxOut > vout
const std::vector< CTxIn > vin
An input of a transaction.
An output of a transaction.
std::string ToString() const
A CWallet maintains a set of transactions and balances, and provides the ability to create new transa...
A transaction with a bunch of additional info that only the owner cares about.
bool isBlockConflicted() const
const Txid & GetHash() const LIFETIMEBOUND
CachableAmount m_amounts[AMOUNTTYPE_ENUM_ELEMENTS]
bool m_is_cache_empty
This flag is true if all m_amounts caches are empty.
bool OutputIsChange(const CWallet &wallet, const CTxOut &txout)
Balance GetBalance(const CWallet &wallet, const int min_depth, bool avoid_reuse)
bool AllInputsMine(const CWallet &wallet, const CTransaction &tx)
Returns whether all of the inputs belong to the wallet.
bool CachedTxIsFromMe(const CWallet &wallet, const CWalletTx &wtx)
CAmount TxGetChange(const CWallet &wallet, const CTransaction &tx)
bool CachedTxIsTrusted(const CWallet &wallet, const CWalletTx &wtx, std::set< Txid > &trusted_parents)
bool ScriptIsChange(const CWallet &wallet, const CScript &script)
CAmount TxGetCredit(const CWallet &wallet, const CTransaction &tx)
static CAmount GetCachableAmount(const CWallet &wallet, const CWalletTx &wtx, CWalletTx::AmountType type, bool avoid_reuse)
CAmount OutputGetChange(const CWallet &wallet, const CTxOut &txout)
CAmount CachedTxGetDebit(const CWallet &wallet, const CWalletTx &wtx, bool avoid_reuse)
CAmount CachedTxGetChange(const CWallet &wallet, const CWalletTx &wtx)
CAmount CachedTxGetCredit(const CWallet &wallet, const CWalletTx &wtx, bool avoid_reuse)
void CachedTxGetAmounts(const CWallet &wallet, const CWalletTx &wtx, std::list< COutputEntry > &listReceived, std::list< COutputEntry > &listSent, CAmount &nFee, bool include_change)
std::map< CTxDestination, CAmount > GetAddressBalances(const CWallet &wallet)
@ WALLET_FLAG_AVOID_REUSE
bool InputIsMine(const CWallet &wallet, const CTxIn &txin)
CAmount OutputGetCredit(const CWallet &wallet, const CTxOut &txout)
std::set< std::set< CTxDestination > > GetAddressGroupings(const CWallet &wallet)
void Set(bool avoid_reuse, CAmount value)