diff --git a/src/wallet/rpcwallet.cpp b/src/wallet/rpcwallet.cpp index 7a1d23eb0..798c5399e 100644 --- a/src/wallet/rpcwallet.cpp +++ b/src/wallet/rpcwallet.cpp @@ -3636,9 +3636,9 @@ UniValue z_getbalances(const UniValue& params, bool fHelp, const CPubKey& mypk) if (!EnsureWalletIsAvailable(fHelp)) return NullUniValue; - if (fHelp || params.size() > 1) + if (fHelp || params.size() > 0) throw runtime_error( - "z_getbalances ( minbal )\n" + "z_getbalances\n" "\nReturns array of addresses with their unspent shielded balances.\n" "Optionally filter to only include addresses with at least minbal HUSH.\n" "Results are an array of Objects, each of which has:\n" @@ -3656,8 +3656,7 @@ UniValue z_getbalances(const UniValue& params, bool fHelp, const CPubKey& mypk) "\nExamples\n" + HelpExampleCli("z_getbalances", "") - + HelpExampleCli("z_getbalances", "0.1") - + HelpExampleRpc("z_getbalances", "555") + + HelpExampleRpc("z_getbalances", "") ); RPCTypeCheck(params, boost::assign::list_of(UniValue::VNUM)); @@ -3672,16 +3671,37 @@ UniValue z_getbalances(const UniValue& params, bool fHelp, const CPubKey& mypk) UniValue results(UniValue::VARR); - //for(auto &entry : zaddrs) { - for(auto &entry : saplingzaddrs) { + int nMinDepth = 1; + int nMaxDepth = 9999999; + std::vector saplingEntries; + pwalletMain->GetFilteredNotes(saplingEntries, zaddrs, nMinDepth); + + std::map mapBalances; + + for (auto & entry : saplingEntries) { + auto zaddr = EncodePaymentAddress(entry.address); + CAmount nBalance = CAmount(entry.note.value()); + if(mapBalances.count(zaddr)) { + mapBalances[zaddr] += nBalance; + } else { + mapBalances[zaddr] = nBalance; + } + } + std::vector> vec; + std::copy(mapBalances.begin(), mapBalances.end(), std::back_inserter>>(vec)); + + std::sort(vec.begin(), vec.end(), [](const std::pair &l, const std::pair &r) + { + if (l.second != r.second) { + return l.second > r.second; + } + return l.first > r.first; + }); + + for (auto & entry : vec) { UniValue obj(UniValue::VOBJ); - CAmount nBalance = 0; - int nMinDepth = 1; - //auto zaddr = DecodePaymentAddress(entry); - auto zaddr = EncodePaymentAddress(entry); - nBalance = getBalanceZaddr(zaddr, nMinDepth, false); - obj.push_back(Pair("address", zaddr)); - obj.push_back(Pair("balance", nBalance)); + obj.push_back(Pair("address", entry.first)); + obj.push_back(Pair("balance", (double) entry.second / (uint64_t) 100000000L )); results.push_back(obj); }