diff --git a/src/rpc/misc.cpp b/src/rpc/misc.cpp index e8010ede3..7cb9b6664 100644 --- a/src/rpc/misc.cpp +++ b/src/rpc/misc.cpp @@ -1384,7 +1384,8 @@ UniValue getsnapshot(const UniValue& params, bool fHelp) if (params.size() > 0 && !params[0].isNull()) { top = atoi(params[0].get_str().c_str()); if (top <= 0) - throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, top must be a positive integer"); + //throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, top must be a positive integer"); + top = -1; } if ( fHelp || params.size() > 1) diff --git a/src/txdb.cpp b/src/txdb.cpp index 52bb465e5..4638633ed 100644 --- a/src/txdb.cpp +++ b/src/txdb.cpp @@ -555,6 +555,8 @@ bool CBlockTreeDB::Snapshot2(std::map &addressAmounts, Un return true; } +extern std::vector > vAddressSnapshot; + UniValue CBlockTreeDB::Snapshot(int top) { int topN = 0; @@ -564,11 +566,20 @@ UniValue CBlockTreeDB::Snapshot(int top) UniValue result(UniValue::VOBJ); UniValue addressesSorted(UniValue::VARR); result.push_back(Pair("start_time", (int) time(NULL))); - if ( Snapshot2(addressAmounts,&result) ) + if ( (vAddressSnapshot.size() > 0 && top < 0) || (Snapshot2(addressAmounts,&result) && top > 0) ) { - for (std::pair element : addressAmounts) - vaddr.push_back( make_pair(element.second, element.first) ); - std::sort(vaddr.rbegin(), vaddr.rend()); + if ( top > 0 ) + { + for (std::pair element : addressAmounts) + vaddr.push_back( make_pair(element.second, element.first) ); + std::sort(vaddr.rbegin(), vaddr.rend()); + } + else + { + for ( auto address : vAddressSnapshot ) + vaddr.push_back(make_pair(address.first, CBitcoinAddress(address.second).ToString())); + top = vAddressSnapshot.size(); + } int topN = 0; for (std::vector>::iterator it = vaddr.begin(); it!=vaddr.end(); ++it) {