static std::string TxToRow(const CTransaction& tx, const CScript& Highlight = CScript(), const std::string& Prepend = std::string(), int64_t* pSum = NULL) { std::string InAmounts, InAddresses, OutAmounts, OutAddresses; int64_t Delta = 0; for (unsigned int j = 0; j < tx.vin.size(); j++) { if (tx.IsCoinBase()) { InAmounts += ValueToString(tx.GetValueOut()); InAddresses += "coinbase"; } else { CTxOut PrevOut = getPrevOut(tx.vin[j].prevout); InAmounts += ValueToString(PrevOut.nValue); InAddresses += ScriptToString(PrevOut.scriptPubKey, false, PrevOut.scriptPubKey == Highlight).c_str(); if (PrevOut.scriptPubKey == Highlight) Delta -= PrevOut.nValue; } if (j + 1 != tx.vin.size()) { InAmounts += "<br/>"; InAddresses += "<br/>"; } } for (unsigned int j = 0; j < tx.vout.size(); j++) { CTxOut Out = tx.vout[j]; OutAmounts += ValueToString(Out.nValue); OutAddresses += ScriptToString(Out.scriptPubKey, false, Out.scriptPubKey == Highlight); if (Out.scriptPubKey == Highlight) Delta += Out.nValue; if (j + 1 != tx.vout.size()) { OutAmounts += "<br/>"; OutAddresses += "<br/>"; } } std::string List[8] = { Prepend, makeHRef(tx.GetHash().GetHex()), InAddresses, InAmounts, OutAddresses, OutAmounts, "", ""}; int n = sizeof(List) / sizeof(std::string) - 2; if (!Highlight.empty()) { List[n++] = std::string("<font color=\"") + ((Delta > 0) ? "green" : "red") + "\">" + ValueToString(Delta, true) + "</font>"; *pSum += Delta; List[n++] = ValueToString(*pSum); return makeHTMLTableRow(List, n); } return makeHTMLTableRow(List + 1, n - 1); }
static std::string ScriptToString(const CScript& script, bool l = false, bool highlight = false) { if (script.empty()) return "unknown"; CTxDestination dest; if (ExtractDestination(script, dest)) { if (highlight) return "<span class=\"addr\">" + EncodeDestination(dest) + "</span>"; else return makeHRef(EncodeDestination(dest)); } else return l ? "<pre>" + FormatScript(script) + "</pre>" : _("Non-standard script"); }
static std::string ScriptToString(const CScript& Script, bool Long = false, bool Highlight = false) { if (Script.empty()) return "unknown"; CTxDestination Dest; CBitcoinAddress Address; if (ExtractDestination(Script, Dest) && Address.Set(Dest)) { if (Highlight) return "<span class=\"addr\">" + Address.ToString() + "</span>"; else return makeHRef(Address.ToString()); } else return Long ? "<pre>" + FormatScript(Script) + "</pre>" : _("Non-standard script"); }
std::string TxToString(uint256 BlockHash, const CTransaction& tx) { CAmount Input = 0; CAmount Output = tx.GetValueOut(); std::string InputsContentCells[] = {_("#"), _("Taken from"), _("Address"), _("Amount")}; std::string InputsContent = makeHTMLTableRow(InputsContentCells, sizeof(InputsContentCells) / sizeof(std::string)); std::string OutputsContentCells[] = {_("#"), _("Redeemed in"), _("Address"), _("Amount")}; std::string OutputsContent = makeHTMLTableRow(OutputsContentCells, sizeof(OutputsContentCells) / sizeof(std::string)); if (tx.IsCoinBase()) { std::string InputsContentCells[] = { "0", "coinbase", "-", ValueToString(Output)}; InputsContent += makeHTMLTableRow(InputsContentCells, sizeof(InputsContentCells) / sizeof(std::string)); } else for (unsigned int i = 0; i < tx.vin.size(); i++) { COutPoint Out = tx.vin[i].prevout; CTxOut PrevOut = getPrevOut(tx.vin[i].prevout); if (PrevOut.nValue < 0) Input = -Params().MaxMoneyOut(); else Input += PrevOut.nValue; std::string InputsContentCells[] = { itostr(i), "<span>" + makeHRef(Out.hash.GetHex()) + ":" + itostr(Out.n) + "</span>", ScriptToString(PrevOut.scriptPubKey, true), ValueToString(PrevOut.nValue)}; InputsContent += makeHTMLTableRow(InputsContentCells, sizeof(InputsContentCells) / sizeof(std::string)); } uint256 TxHash = tx.GetHash(); for (unsigned int i = 0; i < tx.vout.size(); i++) { const CTxOut& Out = tx.vout[i]; uint256 HashNext = uint256S("0"); unsigned int nNext = 0; bool fAddrIndex = false; getNextIn(COutPoint(TxHash, i), HashNext, nNext); std::string OutputsContentCells[] = { itostr(i), (HashNext == uint256S("0")) ? (fAddrIndex ? _("no") : _("unknown")) : "<span>" + makeHRef(HashNext.GetHex()) + ":" + itostr(nNext) + "</span>", ScriptToString(Out.scriptPubKey, true), ValueToString(Out.nValue)}; OutputsContent += makeHTMLTableRow(OutputsContentCells, sizeof(OutputsContentCells) / sizeof(std::string)); } InputsContent = table + InputsContent + "</table>"; OutputsContent = table + OutputsContent + "</table>"; std::string Hash = TxHash.GetHex(); std::string Labels[] = { _("In Block"), "", _("Size"), itostr(GetSerializeSize(tx, SER_NETWORK, PROTOCOL_VERSION)), _("Input"), tx.IsCoinBase() ? "-" : ValueToString(Input), _("Output"), ValueToString(Output), _("Fees"), tx.IsCoinBase() ? "-" : ValueToString(Input - Output), _("Timestamp"), "", _("Hash"), "<pre>" + Hash + "</pre>", }; // std::map<uint256, CBlockIndex*>::iterator iter = mapBlockIndex.find(BlockHash); BlockMap::iterator iter = mapBlockIndex.find(BlockHash); if (iter != mapBlockIndex.end()) { CBlockIndex* pIndex = iter->second; Labels[0 * 2 + 1] = makeHRef(itostr(pIndex->nHeight)); Labels[5 * 2 + 1] = TimeToString(pIndex->nTime); } std::string Content; Content += "<h2>" + _("Transaction") + " <span>" + Hash + "</span></h2>"; Content += makeHTMLTable(Labels, sizeof(Labels) / (2 * sizeof(std::string)), 2); Content += "</br>"; Content += "<h3>" + _("Inputs") + "</h3>"; Content += InputsContent; Content += "</br>"; Content += "<h3>" + _("Outputs") + "</h3>"; Content += OutputsContent; return Content; }