Much fast z_getbalances, such wow

This commit is contained in:
Duke Leto
2021-04-13 23:18:40 -04:00
parent 1063b9090a
commit ab934fd094

View File

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