All pastes #1910564 Raw Edit

bitcoin listtransactions v3

public diff v1 · immutable
#1910564 ·published 2010-07-29 00:47 UTC
rendered paste body
Index: rpc.cpp===================================================================--- rpc.cpp	(revision 117)+++ rpc.cpp	(working copy)@@ -342,7 +342,86 @@     return "sent"; } +struct txnitem+{+    uint160 hash160;+    int64 nAmount;+    int nConf;+    txnitem()+    {+	hash160 = 0;+        nAmount = 0;+        nConf = INT_MAX;+    }+}; +bool txnitem_cmp(const txnitem& a, const txnitem &b)+{+	return a.nConf < b.nConf;+}++Value ListTransactions(int64 nCount, bool fGenerated)+{+    vector<txnitem> tv;+    CRITICAL_BLOCK(cs_mapWallet)+    {+        for (map<uint256, CWalletTx>::iterator it = mapWallet.begin(); it != mapWallet.end(); ++it)+        {+            const CWalletTx& wtx = (*it).second;+            if (wtx.IsCoinBase() || !wtx.IsFinal())+                continue;++            int nDepth = wtx.GetDepthInMainChain();++            foreach(const CTxOut& txout, wtx.vout)+            {+                // Only counting our own bitcoin addresses and not ip addresses+                uint160 hash160 = txout.scriptPubKey.GetBitcoinAddressHash160();++#if 0+                if (hash160 == 0 || !mapPubKeys.count(hash160)) // IsMine+                    continue;+#endif++                txnitem item;+                item.nAmount = txout.nValue;+                item.nConf = min(item.nConf, nDepth);+		item.hash160 = hash160;++		tv.push_back(item);+            }+        }+    }++    std::sort(tv.begin(), tv.end(), txnitem_cmp);++    // Reply+    Array ret;+    CRITICAL_BLOCK(cs_mapAddressBook)+    {+        foreach(const txnitem& txn, tv)+	{+	    string strAddress = Hash160ToAddress(txn.hash160);+	    string strLabel;+            int64 nAmount = txn.nAmount;+            int nConf = txn.nConf;++	    map<string, string>::iterator mi = mapAddressBook.find(strAddress);+	    if (mi != mapAddressBook.end())+		strLabel = (*mi).second;++            Object obj;+            obj.push_back(Pair("address",       strAddress));+            obj.push_back(Pair("label",         strLabel));+            obj.push_back(Pair("amount",        (double)nAmount / (double)COIN));+            obj.push_back(Pair("confirmations", (nConf == INT_MAX ? 0 : nConf)));+            ret.push_back(obj);+        }+    }++    return ret;+}+ Value listtransactions(const Array& params, bool fHelp) {     if (fHelp || params.size() > 2)@@ -357,10 +436,7 @@     if (params.size() > 1)         fGenerated = params[1].get_bool(); -    Array ret;-    //// not finished-    ret.push_back("not implemented yet");-    return ret;+    return ListTransactions(nCount, fGenerated); }  @@ -638,6 +714,7 @@     make_pair("getreceivedbylabel",    &getreceivedbylabel),     make_pair("listreceivedbyaddress", &listreceivedbyaddress),     make_pair("listreceivedbylabel",   &listreceivedbylabel),+    make_pair("listtransactions",      &listtransactions), }; map<string, rpcfn_type> mapCallTable(pCallTable, pCallTable + sizeof(pCallTable)/sizeof(pCallTable[0]));