Add address filtering to listreceivedbyaddress
This commit is contained in:
parent
f13d756cdd
commit
8ee08120de
2 changed files with 39 additions and 9 deletions
|
@ -43,6 +43,7 @@ static const CRPCConvertParam vRPCConvertParams[] =
|
||||||
{ "listreceivedbyaddress", 0, "minconf" },
|
{ "listreceivedbyaddress", 0, "minconf" },
|
||||||
{ "listreceivedbyaddress", 1, "include_empty" },
|
{ "listreceivedbyaddress", 1, "include_empty" },
|
||||||
{ "listreceivedbyaddress", 2, "include_watchonly" },
|
{ "listreceivedbyaddress", 2, "include_watchonly" },
|
||||||
|
{ "listreceivedbyaddress", 3, "address_filter" },
|
||||||
{ "listreceivedbyaccount", 0, "minconf" },
|
{ "listreceivedbyaccount", 0, "minconf" },
|
||||||
{ "listreceivedbyaccount", 1, "include_empty" },
|
{ "listreceivedbyaccount", 1, "include_empty" },
|
||||||
{ "listreceivedbyaccount", 2, "include_watchonly" },
|
{ "listreceivedbyaccount", 2, "include_watchonly" },
|
||||||
|
|
|
@ -1403,6 +1403,16 @@ UniValue ListReceived(CWallet * const pwallet, const UniValue& params, bool fByA
|
||||||
if(params[2].get_bool())
|
if(params[2].get_bool())
|
||||||
filter = filter | ISMINE_WATCH_ONLY;
|
filter = filter | ISMINE_WATCH_ONLY;
|
||||||
|
|
||||||
|
bool has_filtered_address = false;
|
||||||
|
CTxDestination filtered_address = CNoDestination();
|
||||||
|
if (!fByAccounts && params.size() > 3) {
|
||||||
|
if (!IsValidDestinationString(params[3].get_str())) {
|
||||||
|
throw JSONRPCError(RPC_WALLET_ERROR, "address_filter parameter was invalid");
|
||||||
|
}
|
||||||
|
filtered_address = DecodeDestination(params[3].get_str());
|
||||||
|
has_filtered_address = true;
|
||||||
|
}
|
||||||
|
|
||||||
// Tally
|
// Tally
|
||||||
std::map<CTxDestination, tallyitem> mapTally;
|
std::map<CTxDestination, tallyitem> mapTally;
|
||||||
for (const std::pair<uint256, CWalletTx>& pairWtx : pwallet->mapWallet) {
|
for (const std::pair<uint256, CWalletTx>& pairWtx : pwallet->mapWallet) {
|
||||||
|
@ -1421,6 +1431,10 @@ UniValue ListReceived(CWallet * const pwallet, const UniValue& params, bool fByA
|
||||||
if (!ExtractDestination(txout.scriptPubKey, address))
|
if (!ExtractDestination(txout.scriptPubKey, address))
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
if (has_filtered_address && !(filtered_address == address)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
isminefilter mine = IsMine(*pwallet, address);
|
isminefilter mine = IsMine(*pwallet, address);
|
||||||
if(!(mine & filter))
|
if(!(mine & filter))
|
||||||
continue;
|
continue;
|
||||||
|
@ -1437,10 +1451,24 @@ UniValue ListReceived(CWallet * const pwallet, const UniValue& params, bool fByA
|
||||||
// Reply
|
// Reply
|
||||||
UniValue ret(UniValue::VARR);
|
UniValue ret(UniValue::VARR);
|
||||||
std::map<std::string, tallyitem> mapAccountTally;
|
std::map<std::string, tallyitem> mapAccountTally;
|
||||||
for (const std::pair<CTxDestination, CAddressBookData>& item : pwallet->mapAddressBook) {
|
|
||||||
const CTxDestination& dest = item.first;
|
// Create mapAddressBook iterator
|
||||||
const std::string& strAccount = item.second.name;
|
// If we aren't filtering, go from begin() to end()
|
||||||
std::map<CTxDestination, tallyitem>::iterator it = mapTally.find(dest);
|
auto start = pwallet->mapAddressBook.begin();
|
||||||
|
auto end = pwallet->mapAddressBook.end();
|
||||||
|
// If we are filtering, find() the applicable entry
|
||||||
|
if (has_filtered_address) {
|
||||||
|
start = pwallet->mapAddressBook.find(filtered_address);
|
||||||
|
if (start != end) {
|
||||||
|
end = std::next(start);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto item_it = start; item_it != end; ++item_it)
|
||||||
|
{
|
||||||
|
const CTxDestination& address = item_it->first;
|
||||||
|
const std::string& strAccount = item_it->second.name;
|
||||||
|
auto it = mapTally.find(address);
|
||||||
if (it == mapTally.end() && !fIncludeEmpty)
|
if (it == mapTally.end() && !fIncludeEmpty)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
|
@ -1466,7 +1494,7 @@ UniValue ListReceived(CWallet * const pwallet, const UniValue& params, bool fByA
|
||||||
UniValue obj(UniValue::VOBJ);
|
UniValue obj(UniValue::VOBJ);
|
||||||
if(fIsWatchonly)
|
if(fIsWatchonly)
|
||||||
obj.pushKV("involvesWatchonly", true);
|
obj.pushKV("involvesWatchonly", true);
|
||||||
obj.pushKV("address", EncodeDestination(dest));
|
obj.pushKV("address", EncodeDestination(address));
|
||||||
obj.pushKV("account", strAccount);
|
obj.pushKV("account", strAccount);
|
||||||
obj.pushKV("amount", ValueFromAmount(nAmount));
|
obj.pushKV("amount", ValueFromAmount(nAmount));
|
||||||
obj.pushKV("confirmations", (nConf == std::numeric_limits<int>::max() ? 0 : nConf));
|
obj.pushKV("confirmations", (nConf == std::numeric_limits<int>::max() ? 0 : nConf));
|
||||||
|
@ -1511,15 +1539,15 @@ UniValue listreceivedbyaddress(const JSONRPCRequest& request)
|
||||||
return NullUniValue;
|
return NullUniValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (request.fHelp || request.params.size() > 3)
|
if (request.fHelp || request.params.size() > 4)
|
||||||
throw std::runtime_error(
|
throw std::runtime_error(
|
||||||
"listreceivedbyaddress ( minconf include_empty include_watchonly)\n"
|
"listreceivedbyaddress ( minconf include_empty include_watchonly address_filter )\n"
|
||||||
"\nList balances by receiving address.\n"
|
"\nList balances by receiving address.\n"
|
||||||
"\nArguments:\n"
|
"\nArguments:\n"
|
||||||
"1. minconf (numeric, optional, default=1) The minimum number of confirmations before payments are included.\n"
|
"1. minconf (numeric, optional, default=1) The minimum number of confirmations before payments are included.\n"
|
||||||
"2. include_empty (bool, optional, default=false) Whether to include addresses that haven't received any payments.\n"
|
"2. include_empty (bool, optional, default=false) Whether to include addresses that haven't received any payments.\n"
|
||||||
"3. include_watchonly (bool, optional, default=false) Whether to include watch-only addresses (see 'importaddress').\n"
|
"3. include_watchonly (bool, optional, default=false) Whether to include watch-only addresses (see 'importaddress').\n"
|
||||||
|
"4. address_filter (string, optional) If present, only return information on this address.\n"
|
||||||
"\nResult:\n"
|
"\nResult:\n"
|
||||||
"[\n"
|
"[\n"
|
||||||
" {\n"
|
" {\n"
|
||||||
|
@ -1541,6 +1569,7 @@ UniValue listreceivedbyaddress(const JSONRPCRequest& request)
|
||||||
+ HelpExampleCli("listreceivedbyaddress", "")
|
+ HelpExampleCli("listreceivedbyaddress", "")
|
||||||
+ HelpExampleCli("listreceivedbyaddress", "6 true")
|
+ HelpExampleCli("listreceivedbyaddress", "6 true")
|
||||||
+ HelpExampleRpc("listreceivedbyaddress", "6, true, true")
|
+ HelpExampleRpc("listreceivedbyaddress", "6, true, true")
|
||||||
|
+ HelpExampleRpc("listreceivedbyaddress", "6, true, true, \"1M72Sfpbz1BPpXFHz9m3CdqATR44Jvaydd\"")
|
||||||
);
|
);
|
||||||
|
|
||||||
ObserveSafeMode();
|
ObserveSafeMode();
|
||||||
|
@ -3837,7 +3866,7 @@ static const CRPCCommand commands[] =
|
||||||
{ "wallet", "listaddressgroupings", &listaddressgroupings, {} },
|
{ "wallet", "listaddressgroupings", &listaddressgroupings, {} },
|
||||||
{ "wallet", "listlockunspent", &listlockunspent, {} },
|
{ "wallet", "listlockunspent", &listlockunspent, {} },
|
||||||
{ "wallet", "listreceivedbyaccount", &listreceivedbyaccount, {"minconf","include_empty","include_watchonly"} },
|
{ "wallet", "listreceivedbyaccount", &listreceivedbyaccount, {"minconf","include_empty","include_watchonly"} },
|
||||||
{ "wallet", "listreceivedbyaddress", &listreceivedbyaddress, {"minconf","include_empty","include_watchonly"} },
|
{ "wallet", "listreceivedbyaddress", &listreceivedbyaddress, {"minconf","include_empty","include_watchonly","address_filter"} },
|
||||||
{ "wallet", "listsinceblock", &listsinceblock, {"blockhash","target_confirmations","include_watchonly","include_removed"} },
|
{ "wallet", "listsinceblock", &listsinceblock, {"blockhash","target_confirmations","include_watchonly","include_removed"} },
|
||||||
{ "wallet", "listtransactions", &listtransactions, {"account","count","skip","include_watchonly"} },
|
{ "wallet", "listtransactions", &listtransactions, {"account","count","skip","include_watchonly"} },
|
||||||
{ "wallet", "listunspent", &listunspent, {"minconf","maxconf","addresses","include_unsafe","query_options"} },
|
{ "wallet", "listunspent", &listunspent, {"minconf","maxconf","addresses","include_unsafe","query_options"} },
|
||||||
|
|
Loading…
Reference in a new issue