QString TransactionDesc::toHTML(CWallet *wallet, CWalletTx &wtx) { QString strHTML; { LOCK(wallet->cs_wallet); strHTML.reserve(4000); strHTML += "<html><font face='verdana, arial, helvetica, sans-serif'>"; int64 nTime = wtx.GetTxTime(); int64 nCredit = wtx.GetCredit(); int64 nDebit = wtx.GetDebit(); int64 nNet = nCredit - nDebit; strHTML += tr("<b>Status:</b> ") + FormatTxStatus(wtx); int nRequests = wtx.GetRequestCount(); if (nRequests != -1) { if (nRequests == 0) strHTML += tr(", has not been successfully broadcast yet"); else if (nRequests == 1) strHTML += tr(", broadcast through %1 node").arg(nRequests); else strHTML += tr(", broadcast through %1 nodes").arg(nRequests); } strHTML += "<br>"; strHTML += tr("<b>Date:</b> ") + (nTime ? GUIUtil::dateTimeStr(nTime) : QString("")) + "<br>"; // // From // if (wtx.IsCoinBase()) { strHTML += tr("<b>Source:</b> Generated<br>"); } else if (wtx.IsCustodianGrant()) { strHTML += tr("<b>Source:</b> Generated currency<br>"); } else if (!wtx.mapValue["from"].empty()) { // Online transaction if (!wtx.mapValue["from"].empty()) strHTML += tr("<b>From:</b> ") + GUIUtil::HtmlEscape(wtx.mapValue["from"]) + "<br>"; } else { // Offline transaction if (nNet > 0) { // Credit BOOST_FOREACH(const CTxOut& txout, wtx.vout) { if (wallet->IsMine(txout)) { CTxDestination address; if (ExtractDestination(txout.scriptPubKey, address) && IsMine(*wallet, address)) { if (wallet->mapAddressBook.count(address)) { strHTML += tr("<b>From:</b> ") + tr("unknown") + "<br>"; strHTML += tr("<b>To:</b> "); strHTML += GUIUtil::HtmlEscape(CBitcoinAddress(address, wtx.cUnit).ToString()); if (!wallet->mapAddressBook[address].empty()) strHTML += tr(" (yours, label: ") + GUIUtil::HtmlEscape(wallet->mapAddressBook[address]) + ")"; else strHTML += tr(" (yours)"); strHTML += "<br>"; } } break; } } } } // // To // string strAddress; if (!wtx.mapValue["to"].empty()) { // Online transaction strAddress = wtx.mapValue["to"]; strHTML += tr("<b>To:</b> "); CTxDestination dest = CBitcoinAddress(strAddress).Get(); if (wallet->mapAddressBook.count(dest) && !wallet->mapAddressBook[dest].empty()) strHTML += GUIUtil::HtmlEscape(wallet->mapAddressBook[dest]) + " "; strHTML += GUIUtil::HtmlEscape(strAddress) + "<br>"; } // // Amount // if (wtx.IsCoinBase() && nCredit == 0) { // // Coinbase // int64 nUnmatured = 0; BOOST_FOREACH(const CTxOut& txout, wtx.vout) nUnmatured += wallet->GetCredit(txout); strHTML += tr("<b>Credit:</b> "); if (wtx.IsInMainChain()) strHTML += tr("(%1 matures in %2 more blocks)") .arg(BitcoinUnits::formatWithUnit(BitcoinUnits::BTC, nUnmatured)) .arg(wtx.GetBlocksToMaturity()); else strHTML += tr("(not accepted)"); strHTML += "<br>"; }