Skip to content

Commit

Permalink
[RPC] listunspent: pre-filter coins by destination in AvailableCoins
Browse files Browse the repository at this point in the history
  • Loading branch information
random-zebra committed Dec 14, 2021
1 parent ac52d73 commit 275f931
Showing 1 changed file with 6 additions and 10 deletions.
16 changes: 6 additions & 10 deletions src/wallet/rpcwallet.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -3760,6 +3760,8 @@ UniValue listunspent(const JSONRPCRequest& request)
nMaxDepth = request.params[1].get_int();
}

CWallet::AvailableCoinsFilter coinFilter;

std::set<CTxDestination> destinations;
if (request.params.size() > 2) {
RPCTypeCheckArgument(request.params[2], UniValue::VARR);
Expand All @@ -3773,6 +3775,7 @@ UniValue listunspent(const JSONRPCRequest& request)
throw JSONRPCError(RPC_INVALID_PARAMETER, std::string("Invalid parameter, duplicated address: ") + input.get_str());
destinations.insert(dest);
}
coinFilter.onlyFilteredDest = &destinations;
}

// List watch only utxo
Expand All @@ -3784,7 +3787,6 @@ UniValue listunspent(const JSONRPCRequest& request)
nWatchonlyConfig = 1;
}

CWallet::AvailableCoinsFilter coinFilter;
if (request.params.size() > 4) {
const UniValue& options = request.params[4].get_obj();

Expand Down Expand Up @@ -3828,19 +3830,13 @@ UniValue listunspent(const JSONRPCRequest& request)
if (out.nDepth < nMinDepth || out.nDepth > nMaxDepth)
continue;

CTxDestination address;
const CScript& scriptPubKey = out.tx->tx->vout[out.i].scriptPubKey;
bool fValidAddress = ExtractDestination(scriptPubKey, address);

if (!destinations.empty() && (!fValidAddress || !destinations.count(address))) {
continue;
}

UniValue entry(UniValue::VOBJ);
entry.pushKV("txid", out.tx->GetHash().GetHex());
entry.pushKV("vout", out.i);
entry.pushKV("generated", out.tx->IsCoinStake() || out.tx->IsCoinBase());
if (fValidAddress) {
CTxDestination address;
const CScript& scriptPubKey = out.tx->tx->vout[out.i].scriptPubKey;
if (ExtractDestination(scriptPubKey, address)) {
entry.pushKV("address", EncodeDestination(address));
if (pwallet->HasAddressBook(address)) {
entry.pushKV("label", pwallet->GetNameForAddressBookEntry(address));
Expand Down

0 comments on commit 275f931

Please sign in to comment.