22 #include <validation.h> 28 #include <QLatin1String> 43 return tr(
"conflicted with a transaction with %1 confirmations").arg(-depth);
44 }
else if (depth == 0) {
50 s = tr(
"0/unconfirmed, in memory pool");
55 s = tr(
"0/unconfirmed, not in memory pool");
61 s += QLatin1String(
", ") + tr(
"abandoned");
64 }
else if (depth < 6) {
69 return tr(
"%1/unconfirmed").arg(depth);
74 return tr(
"%1 confirmations").arg(depth);
83 if (pr.find(std::string({0x12, 0x0b}) +
"x509+sha256") != std::string::npos || pr.find(std::string({0x12, 0x09}) +
"x509+sha1") != std::string::npos) {
88 size_t cn_pos = pr.find({0x06, 0x03, 0x55, 0x04, 0x03});
89 if (cn_pos != std::string::npos) {
90 cn_pos = pr.find({0x06, 0x03, 0x55, 0x04, 0x03}, cn_pos + 5);
91 if (cn_pos != std::string::npos) {
93 if (pr[cn_pos] == 0x13 || pr[cn_pos] == 0x0c) {
95 int str_len = pr[cn_pos];
97 merchant = QString::fromUtf8(pr.data() + cn_pos, str_len);
116 strHTML.reserve(4000);
117 strHTML +=
"<html><font face='verdana, arial, helvetica, sans-serif'>";
119 int64_t nTime = wtx.
time;
122 CAmount nNet = nCredit - nDebit;
124 strHTML +=
"<b>" + tr(
"Status") +
":</b> " +
FormatTxStatus(status, inMempool);
134 strHTML +=
"<b>" + tr(
"Source") +
":</b> " + tr(
"Generated") +
"<br>";
151 if (
wallet.getAddress(address, &
name, &ismine,
nullptr))
153 strHTML +=
"<b>" + tr(
"From") +
":</b> " + tr(
"unknown") +
"<br>";
154 strHTML +=
"<b>" + tr(
"To") +
":</b> ";
156 QString addressOwned = ismine ==
ISMINE_SPENDABLE ? tr(
"own address") : tr(
"watch-only");
160 strHTML +=
" (" + addressOwned +
")";
173 std::string strAddress = wtx.
value_map[
"to"];
174 strHTML +=
"<b>" + tr(
"To") +
":</b> ";
178 dest, &
name,
nullptr,
nullptr) && !
name.empty())
192 for (
const CTxOut& txout : wtx.
tx->vout)
194 strHTML +=
"<b>" + tr(
"Credit") +
":</b> ";
198 strHTML +=
"(" + tr(
"not accepted") +
")";
213 if(fAllFromMe > mine) fAllFromMe = mine;
219 if(fAllToMe > mine) fAllToMe = mine;
225 strHTML +=
"<b>" + tr(
"From") +
":</b> " + tr(
"watch-only") +
"<br>";
231 for (
const CTxOut& txout : wtx.
tx->vout)
244 strHTML +=
"<b>" + tr(
"To") +
":</b> ";
247 address, &
name,
nullptr,
nullptr) && !
name.empty())
251 strHTML +=
" (own address)";
253 strHTML +=
" (watch-only)";
267 CAmount nValue = nCredit - nChange;
272 CAmount nTxFee = nDebit - wtx.
tx->GetValueOut();
282 for (
const CTxIn& txin : wtx.
tx->vin) {
288 for (
const CTxOut& txout : wtx.
tx->vout) {
306 strHTML +=
"<b>" + tr(
"Transaction ID") +
":</b> " + rec->
getTxHash() +
"<br>";
307 strHTML +=
"<b>" + tr(
"Transaction total size") +
":</b> " + QString::number(wtx.
tx->GetTotalSize()) +
" bytes<br>";
309 strHTML +=
"<b>" + tr(
"Output index") +
":</b> " + QString::number(rec->
getOutputIndex()) +
"<br>";
312 for (
const std::pair<std::string, std::string>& r : orderForm) {
313 if (r.first ==
"Message")
314 strHTML +=
"<br><b>" + tr(
"Message") +
":</b><br>" +
GUIUtil::HtmlEscape(r.second,
true) +
"<br>";
319 if (r.first ==
"PaymentRequest")
325 merchant += tr(
" (Certificate was not verified)");
327 if (!merchant.isNull()) {
336 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>";
344 strHTML +=
"<hr><br>" + tr(
"Debug information") +
"<br><br>";
345 for (
const CTxIn& txin : wtx.
tx->vin)
346 if(
wallet.txinIsMine(txin))
348 for (
const CTxOut& txout : wtx.
tx->vout)
349 if(
wallet.txoutIsMine(txout))
352 strHTML +=
"<br><b>" + tr(
"Transaction") +
":</b><br>";
355 strHTML +=
"<br><b>" + tr(
"Inputs") +
":</b>";
358 for (
const CTxIn& txin : wtx.
tx->vin)
363 if(
node.getUnspentOutput(prevout, prev))
372 if (
wallet.getAddress(address, &
name,
nullptr,
nullptr) && !
name.empty())
377 strHTML = strHTML +
" IsMine=" + (
wallet.txoutIsMine(vout) &
ISMINE_SPENDABLE ? tr(
"true") : tr(
"false")) +
"</li>";
378 strHTML = strHTML +
" IsWatchOnly=" + (
wallet.txoutIsMine(vout) &
ISMINE_WATCH_ONLY ? tr(
"true") : tr(
"false")) +
"</li>";
386 strHTML +=
"</font></html>";
bool ExtractDestination(const CScript &scriptPubKey, CTxDestination &addressRet)
Parse a standard scriptPubKey for the destination 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)
bool IsValidDestination(const CTxDestination &dest)
Check whether a CTxDestination is a CNoDestination.
CTxOut out
unspent transaction output
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.
An input of a transaction.
isminetype
IsMine() return codes, which depend on ScriptPubKeyMan implementation.
Interface for accessing a wallet.
std::variant< CNoDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, WitnessUnknown > CTxDestination
A txout script template with a specific destination.
An output of a transaction.
An outpoint - a combination of a transaction hash and an index n into its vout.
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)