19 #include <validation.h> 25 #include <QLatin1String> 40 return tr(
"conflicted with a transaction with %1 confirmations").arg(-depth);
41 }
else if (depth == 0) {
47 s = tr(
"0/unconfirmed, in memory pool");
52 s = tr(
"0/unconfirmed, not in memory pool");
58 s += QLatin1String(
", ") + tr(
"abandoned");
61 }
else if (depth < 6) {
66 return tr(
"%1/unconfirmed").arg(depth);
71 return tr(
"%1 confirmations").arg(depth);
80 if (pr.find(std::string({0x12, 0x0b}) +
"x509+sha256") != std::string::npos || pr.find(std::string({0x12, 0x09}) +
"x509+sha1") != std::string::npos) {
85 size_t cn_pos = pr.find({0x06, 0x03, 0x55, 0x04, 0x03});
86 if (cn_pos != std::string::npos) {
87 cn_pos = pr.find({0x06, 0x03, 0x55, 0x04, 0x03}, cn_pos + 5);
88 if (cn_pos != std::string::npos) {
90 if (pr[cn_pos] == 0x13 || pr[cn_pos] == 0x0c) {
92 int str_len = pr[cn_pos];
94 merchant = QString::fromUtf8(pr.data() + cn_pos, str_len);
113 strHTML.reserve(4000);
114 strHTML +=
"<html><font face='verdana, arial, helvetica, sans-serif'>";
116 int64_t nTime = wtx.
time;
119 CAmount nNet = nCredit - nDebit;
121 strHTML +=
"<b>" + tr(
"Status") +
":</b> " +
FormatTxStatus(status, inMempool);
131 strHTML +=
"<b>" + tr(
"Source") +
":</b> " + tr(
"Generated") +
"<br>";
148 if (
wallet.getAddress(address, &
name, &ismine,
nullptr))
150 strHTML +=
"<b>" + tr(
"From") +
":</b> " + tr(
"unknown") +
"<br>";
151 strHTML +=
"<b>" + tr(
"To") +
":</b> ";
153 QString addressOwned = ismine ==
ISMINE_SPENDABLE ? tr(
"own address") : tr(
"watch-only");
157 strHTML +=
" (" + addressOwned +
")";
170 std::string strAddress = wtx.
value_map[
"to"];
171 strHTML +=
"<b>" + tr(
"To") +
":</b> ";
175 dest, &
name,
nullptr,
nullptr) && !
name.empty())
189 for (
const CTxOut& txout : wtx.
tx->vout)
191 strHTML +=
"<b>" + tr(
"Credit") +
":</b> ";
195 strHTML +=
"(" + tr(
"not accepted") +
")";
210 if(fAllFromMe > mine) fAllFromMe = mine;
216 if(fAllToMe > mine) fAllToMe = mine;
222 strHTML +=
"<b>" + tr(
"From") +
":</b> " + tr(
"watch-only") +
"<br>";
228 for (
const CTxOut& txout : wtx.
tx->vout)
241 strHTML +=
"<b>" + tr(
"To") +
":</b> ";
244 address, &
name,
nullptr,
nullptr) && !
name.empty())
248 strHTML +=
" (" + tr(
"own address") +
")";
250 strHTML +=
" (" + tr(
"watch-only") +
")";
264 CAmount nValue = nCredit - nChange;
269 CAmount nTxFee = nDebit - wtx.
tx->GetValueOut();
279 for (
const CTxIn& txin : wtx.
tx->vin) {
285 for (
const CTxOut& txout : wtx.
tx->vout) {
303 strHTML +=
"<b>" + tr(
"Transaction ID") +
":</b> " + rec->
getTxHash() +
"<br>";
304 strHTML +=
"<b>" + tr(
"Transaction total size") +
":</b> " + QString::number(wtx.
tx->GetTotalSize()) +
" bytes<br>";
306 strHTML +=
"<b>" + tr(
"Output index") +
":</b> " + QString::number(rec->
getOutputIndex()) +
"<br>";
309 for (
const std::pair<std::string, std::string>& r : orderForm) {
310 if (r.first ==
"Message")
311 strHTML +=
"<br><b>" + tr(
"Message") +
":</b><br>" +
GUIUtil::HtmlEscape(r.second,
true) +
"<br>";
316 if (r.first ==
"PaymentRequest")
322 merchant = tr(
"%1 (Certificate was not verified)").arg(merchant);
324 if (!merchant.isNull()) {
333 strHTML +=
"<br>" + tr(
"Generated coins must mature %1 blocks before they can be spent. When you generated this block, it was broadcast to the network to be added to the block chain. If it fails to get into the chain, its state will change to \"not accepted\" and it won't be spendable. This may occasionally happen if another node generates a block within a few seconds of yours.").arg(QString::number(numBlocksToMaturity)) +
"<br>";
341 strHTML +=
"<hr><br>" + tr(
"Debug information") +
"<br><br>";
342 for (
const CTxIn& txin : wtx.
tx->vin)
343 if(
wallet.txinIsMine(txin))
345 for (
const CTxOut& txout : wtx.
tx->vout)
346 if(
wallet.txoutIsMine(txout))
349 strHTML +=
"<br><b>" + tr(
"Transaction") +
":</b><br>";
352 strHTML +=
"<br><b>" + tr(
"Inputs") +
":</b>";
355 for (
const CTxIn& txin : wtx.
tx->vin)
359 if (
auto prev{
node.getUnspentOutput(prevout)}) {
362 const CTxOut& vout = prev->out;
367 if (
wallet.getAddress(address, &
name,
nullptr,
nullptr) && !
name.empty())
372 strHTML = strHTML +
" IsMine=" + (
wallet.txoutIsMine(vout) &
ISMINE_SPENDABLE ? tr(
"true") : tr(
"false")) +
"</li>";
373 strHTML = strHTML +
" IsWatchOnly=" + (
wallet.txoutIsMine(vout) &
ISMINE_WATCH_ONLY ? tr(
"true") : tr(
"false")) +
"</li>";
381 strHTML +=
"</font></html>";
bool IsValidDestination(const CTxDestination &dest)
Check whether a CTxDestination corresponds to one with an address.
std::vector< wallet::isminetype > txin_is_mine
QString getTxHash() const
Return the unique identifier for this transaction (part)
static QString FormatTxStatus(const interfaces::WalletTxStatus &status, bool inMempool)
QString dateTimeStr(const QDateTime &date)
static const int COINBASE_MATURITY
Coinbase transaction outputs can only be spent after this number of new blocks (network rule) ...
QString HtmlEscape(const QString &str, bool fMultiLine)
int64_t GetVirtualTransactionSize(int64_t nWeight, int64_t nSigOpCost, unsigned int bytes_per_sigop)
Compute the virtual transaction size (weight reinterpreted as bytes).
int64_t CAmount
Amount in satoshis (Can be negative)
std::vector< wallet::isminetype > txout_is_mine
int getOutputIndex() const
Return the output index of the subtransaction.
UI model for a transaction.
bool ExtractDestination(const CScript &scriptPubKey, CTxDestination &addressRet)
Parse a scriptPubKey for the destination.
An input of a transaction.
isminetype
IsMine() return codes, which depend on ScriptPubKeyMan implementation.
Interface for accessing a wallet.
An output of a transaction.
An outpoint - a combination of a transaction hash and an index n into its vout.
is a home for public enum and struct type definitions that are used by internally by wallet code...
std::variant< CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, PayToAnchor, WitnessUnknown > CTxDestination
A txout script categorized into standard templates.
std::vector< std::pair< std::string, std::string > > WalletOrderForm
std::string EncodeDestination(const CTxDestination &dest)
bool GetPaymentRequestMerchant(const std::string &pr, QString &merchant)
static QString formatHtmlWithUnit(Unit unit, const CAmount &amount, bool plussign=false, SeparatorStyle separators=SeparatorStyle::STANDARD)
Format as HTML string (with unit)
std::map< std::string, std::string > value_map
CTxDestination DecodeDestination(const std::string &str, std::string &error_msg, std::vector< int > *error_locations)
Top-level interface for a bitcoin node (bitcoind process).
Updated transaction status.
static QString toHTML(interfaces::Node &node, interfaces::Wallet &wallet, TransactionRecord *rec, BitcoinUnit unit)