19#include <validation.h>
25#include <QLatin1String>
39 return tr(
"conflicted with a transaction with %1 confirmations").arg(-depth);
40 }
else if (depth == 0) {
46 s = tr(
"0/unconfirmed, in memory pool");
51 s = tr(
"0/unconfirmed, not in memory pool");
57 s += QLatin1String(
", ") + tr(
"abandoned");
60 }
else if (depth < 6) {
65 return tr(
"%1/unconfirmed").arg(depth);
70 return tr(
"%1 confirmations").arg(depth);
79 if (pr.find(std::string({0x12, 0x0b}) +
"x509+sha256") != std::string::npos || pr.find(std::string({0x12, 0x09}) +
"x509+sha1") != std::string::npos) {
84 size_t cn_pos = pr.find({0x06, 0x03, 0x55, 0x04, 0x03});
85 if (cn_pos != std::string::npos) {
86 cn_pos = pr.find({0x06, 0x03, 0x55, 0x04, 0x03}, cn_pos + 5);
87 if (cn_pos != std::string::npos) {
89 if (pr[cn_pos] == 0x13 || pr[cn_pos] == 0x0c) {
91 int str_len = pr[cn_pos];
93 merchant = QString::fromUtf8(pr.data() + cn_pos, str_len);
112 strHTML.reserve(4000);
113 strHTML +=
"<html><font face='verdana, arial, helvetica, sans-serif'>";
115 int64_t nTime = wtx.
time;
118 CAmount nNet = nCredit - nDebit;
120 strHTML +=
"<b>" + tr(
"Status") +
":</b> " +
FormatTxStatus(status, inMempool);
130 strHTML +=
"<b>" + tr(
"Source") +
":</b> " + tr(
"Generated") +
"<br>";
147 if (
wallet.getAddress(address, &
name, &ismine,
nullptr))
149 strHTML +=
"<b>" + tr(
"From") +
":</b> " + tr(
"unknown") +
"<br>";
150 strHTML +=
"<b>" + tr(
"To") +
":</b> ";
152 QString addressOwned = tr(
"own address");
156 strHTML +=
" (" + addressOwned +
")";
169 std::string strAddress = wtx.
value_map[
"to"];
170 strHTML +=
"<b>" + tr(
"To") +
":</b> ";
174 dest, &
name,
nullptr,
nullptr) && !
name.empty())
188 for (
const CTxOut& txout : wtx.
tx->vout)
190 strHTML +=
"<b>" + tr(
"Credit") +
":</b> ";
194 strHTML +=
"(" + tr(
"not accepted") +
")";
209 if(fAllFromMe > mine) fAllFromMe = mine;
215 if(fAllToMe > mine) fAllToMe = mine;
223 for (
const CTxOut& txout : wtx.
tx->vout)
236 strHTML +=
"<b>" + tr(
"To") +
":</b> ";
239 address, &
name,
nullptr,
nullptr) && !
name.empty())
243 strHTML +=
" (" + tr(
"own address") +
")";
257 CAmount nValue = nCredit - nChange;
262 CAmount nTxFee = nDebit - wtx.
tx->GetValueOut();
272 for (
const CTxIn& txin : wtx.
tx->vin) {
278 for (
const CTxOut& txout : wtx.
tx->vout) {
296 strHTML +=
"<b>" + tr(
"Transaction ID") +
":</b> " + rec->
getTxHash() +
"<br>";
297 strHTML +=
"<b>" + tr(
"Transaction total size") +
":</b> " + QString::number(wtx.
tx->GetTotalSize()) +
" bytes<br>";
299 strHTML +=
"<b>" + tr(
"Output index") +
":</b> " + QString::number(rec->
getOutputIndex()) +
"<br>";
302 for (
const std::pair<std::string, std::string>& r : orderForm) {
303 if (r.first ==
"Message")
304 strHTML +=
"<br><b>" + tr(
"Message") +
":</b><br>" +
GUIUtil::HtmlEscape(r.second,
true) +
"<br>";
309 if (r.first ==
"PaymentRequest")
315 merchant = tr(
"%1 (Certificate was not verified)").arg(merchant);
317 if (!merchant.isNull()) {
326 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>";
334 strHTML +=
"<hr><br>" + tr(
"Debug information") +
"<br><br>";
335 for (
const CTxIn& txin : wtx.
tx->vin)
336 if(
wallet.txinIsMine(txin))
338 for (
const CTxOut& txout : wtx.
tx->vout)
339 if(
wallet.txoutIsMine(txout))
342 strHTML +=
"<br><b>" + tr(
"Transaction") +
":</b><br>";
345 strHTML +=
"<br><b>" + tr(
"Inputs") +
":</b>";
348 for (
const CTxIn& txin : wtx.
tx->vin)
352 if (
auto prev{
node.getUnspentOutput(prevout)}) {
355 const CTxOut& vout = prev->out;
360 if (
wallet.getAddress(address, &
name,
nullptr,
nullptr) && !
name.empty())
365 strHTML = strHTML +
" IsMine=" + (
wallet.txoutIsMine(vout) &
ISMINE_SPENDABLE ? tr(
"true") : tr(
"false")) +
"</li>";
373 strHTML +=
"</font></html>";
bool ExtractDestination(const CScript &scriptPubKey, CTxDestination &addressRet)
Parse a scriptPubKey for the destination.
bool IsValidDestination(const CTxDestination &dest)
Check whether a CTxDestination corresponds to one with an address.
std::variant< CNoDestination, PubKeyDestination, PKHash, ScriptHash, WitnessV0ScriptHash, WitnessV0KeyHash, WitnessV1Taproot, PayToAnchor, WitnessUnknown > CTxDestination
A txout script categorized into standard templates.
int64_t CAmount
Amount in satoshis (Can be negative)
static QString formatHtmlWithUnit(Unit unit, const CAmount &amount, bool plussign=false, SeparatorStyle separators=SeparatorStyle::STANDARD)
Format as HTML string (with unit)
An outpoint - a combination of a transaction hash and an index n into its vout.
An input of a transaction.
An output of a transaction.
static QString FormatTxStatus(const interfaces::WalletTxStatus &status, bool inMempool)
static QString toHTML(interfaces::Node &node, interfaces::Wallet &wallet, TransactionRecord *rec, BitcoinUnit unit)
UI model for a transaction.
int getOutputIndex() const
Return the output index of the subtransaction
QString getTxHash() const
Return the unique identifier for this transaction (part)
Top-level interface for a bitcoin node (bitcoind process).
Interface for accessing a wallet.
static const int COINBASE_MATURITY
Coinbase transaction outputs can only be spent after this number of new blocks (network rule)
CTxDestination DecodeDestination(const std::string &str, std::string &error_msg, std::vector< int > *error_locations)
std::string EncodeDestination(const CTxDestination &dest)
QString HtmlEscape(const QString &str, bool fMultiLine)
QString dateTimeStr(const QDateTime &date)
std::vector< std::pair< std::string, std::string > > WalletOrderForm
isminetype
IsMine() return codes, which depend on ScriptPubKeyMan implementation.
int64_t GetVirtualTransactionSize(int64_t nWeight, int64_t nSigOpCost, unsigned int bytes_per_sigop)
Compute the virtual transaction size (weight reinterpreted as bytes).
std::vector< wallet::isminetype > txin_is_mine
std::map< std::string, std::string > value_map
std::vector< wallet::isminetype > txout_is_mine
Updated transaction status.
bool GetPaymentRequestMerchant(const std::string &pr, QString &merchant)
is a home for public enum and struct type definitions that are used by internally by wallet code,...