19 #include <validation.h> 24 #include <QLatin1String> 34 return tr(
"conflicted with a transaction with %1 confirmations").arg(-depth);
35 }
else if (depth == 0) {
41 s = tr(
"0/unconfirmed, in memory pool");
46 s = tr(
"0/unconfirmed, not in memory pool");
52 s += QLatin1String(
", ") + tr(
"abandoned");
55 }
else if (depth < 6) {
60 return tr(
"%1/unconfirmed").arg(depth);
65 return tr(
"%1 confirmations").arg(depth);
74 if (pr.find(std::string({0x12, 0x0b}) +
"x509+sha256") != std::string::npos || pr.find(std::string({0x12, 0x09}) +
"x509+sha1") != std::string::npos) {
79 size_t cn_pos = pr.find({0x06, 0x03, 0x55, 0x04, 0x03});
80 if (cn_pos != std::string::npos) {
81 cn_pos = pr.find({0x06, 0x03, 0x55, 0x04, 0x03}, cn_pos + 5);
82 if (cn_pos != std::string::npos) {
84 if (pr[cn_pos] == 0x13 || pr[cn_pos] == 0x0c) {
86 int str_len = pr[cn_pos];
88 merchant = QString::fromUtf8(pr.data() + cn_pos, str_len);
107 strHTML.reserve(4000);
108 strHTML +=
"<html><font face='verdana, arial, helvetica, sans-serif'>";
110 int64_t nTime = wtx.
time;
113 CAmount nNet = nCredit - nDebit;
115 strHTML +=
"<b>" + tr(
"Status") +
":</b> " +
FormatTxStatus(status, inMempool);
125 strHTML +=
"<b>" + tr(
"Source") +
":</b> " + tr(
"Generated") +
"<br>";
141 if (
wallet.getAddress(address, &
name,
nullptr))
143 strHTML +=
"<b>" + tr(
"From") +
":</b> " + tr(
"unknown") +
"<br>";
144 strHTML +=
"<b>" + tr(
"To") +
":</b> ";
146 QString addressOwned = tr(
"own address");
150 strHTML +=
" (" + addressOwned +
")";
163 std::string strAddress = wtx.
value_map[
"to"];
164 strHTML +=
"<b>" + tr(
"To") +
":</b> ";
168 dest, &
name,
nullptr) && !
name.empty())
182 for (
const CTxOut& txout : wtx.
tx->vout)
183 nUnmatured +=
wallet.getCredit(txout);
184 strHTML +=
"<b>" + tr(
"Credit") +
":</b> ";
188 strHTML +=
"(" + tr(
"not accepted") +
")";
208 for (
const CTxOut& txout : wtx.
tx->vout)
211 bool toSelf = *(mine++);
212 if (toSelf && all_from_me)
221 strHTML +=
"<b>" + tr(
"To") +
":</b> ";
224 address, &
name,
nullptr) && !
name.empty())
228 strHTML +=
" (" + tr(
"own address") +
")";
242 CAmount nValue = nCredit - nChange;
247 CAmount nTxFee = nDebit - wtx.
tx->GetValueOut();
257 for (
const CTxIn& txin : wtx.
tx->vin) {
263 for (
const CTxOut& txout : wtx.
tx->vout) {
281 strHTML +=
"<b>" + tr(
"Transaction ID") +
":</b> " + rec->
getTxHash() +
"<br>";
282 strHTML +=
"<b>" + tr(
"Transaction total size") +
":</b> " + QString::number(wtx.
tx->ComputeTotalSize()) +
" bytes<br>";
284 strHTML +=
"<b>" + tr(
"Output index") +
":</b> " + QString::number(rec->
getOutputIndex()) +
"<br>";
287 for (
const std::pair<std::string, std::string>& r : orderForm) {
288 if (r.first ==
"Message")
289 strHTML +=
"<br><b>" + tr(
"Message") +
":</b><br>" +
GUIUtil::HtmlEscape(r.second,
true) +
"<br>";
294 if (r.first ==
"PaymentRequest")
300 merchant = tr(
"%1 (Certificate was not verified)").arg(merchant);
302 if (!merchant.isNull()) {
311 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>";
319 strHTML +=
"<hr><br>" + tr(
"Debug information") +
"<br><br>";
320 for (
const CTxIn& txin : wtx.
tx->vin)
321 if(
wallet.txinIsMine(txin))
323 for (
const CTxOut& txout : wtx.
tx->vout)
324 if(
wallet.txoutIsMine(txout))
327 strHTML +=
"<br><b>" + tr(
"Transaction") +
":</b><br>";
330 strHTML +=
"<br><b>" + tr(
"Inputs") +
":</b>";
333 for (
const CTxIn& txin : wtx.
tx->vin)
337 if (
auto prev{
node.getUnspentOutput(prevout)}) {
340 const CTxOut& vout = prev->out;
350 strHTML = strHTML +
" IsMine=" + (
wallet.txoutIsMine(vout) ? tr(
"true") : tr(
"false")) +
"</li>";
358 strHTML +=
"</font></html>";
bool IsValidDestination(const CTxDestination &dest)
Check whether a CTxDestination corresponds to one with an address.
QString getTxHash() const
Return the unique identifier for this transaction (part)
static QString FormatTxStatus(const interfaces::WalletTxStatus &status, bool inMempool)
std::vector< bool > txout_is_mine
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)
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.
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.
std::vector< bool > txin_is_mine
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)