|
|
@ -2159,7 +2159,7 @@ UniValue scantxoutset(const JSONRPCRequest& request)
|
|
|
|
{"", RPCArg::Type::OBJ, RPCArg::Optional::OMITTED, "An object with output descriptor and metadata",
|
|
|
|
{"", RPCArg::Type::OBJ, RPCArg::Optional::OMITTED, "An object with output descriptor and metadata",
|
|
|
|
{
|
|
|
|
{
|
|
|
|
{"desc", RPCArg::Type::STR, RPCArg::Optional::NO, "An output descriptor"},
|
|
|
|
{"desc", RPCArg::Type::STR, RPCArg::Optional::NO, "An output descriptor"},
|
|
|
|
{"range", RPCArg::Type::NUM, /* default */ "1000", "Up to what child index HD chains should be explored"},
|
|
|
|
{"range", RPCArg::Type::RANGE, /* default */ "1000", "The range of HD chain indexes to explore (either end or [begin,end])"},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
@ -2216,7 +2216,7 @@ UniValue scantxoutset(const JSONRPCRequest& request)
|
|
|
|
// loop through the scan objects
|
|
|
|
// loop through the scan objects
|
|
|
|
for (const UniValue& scanobject : request.params[1].get_array().getValues()) {
|
|
|
|
for (const UniValue& scanobject : request.params[1].get_array().getValues()) {
|
|
|
|
std::string desc_str;
|
|
|
|
std::string desc_str;
|
|
|
|
int range = 1000;
|
|
|
|
std::pair<int64_t, int64_t> range = {0, 1000};
|
|
|
|
if (scanobject.isStr()) {
|
|
|
|
if (scanobject.isStr()) {
|
|
|
|
desc_str = scanobject.get_str();
|
|
|
|
desc_str = scanobject.get_str();
|
|
|
|
} else if (scanobject.isObject()) {
|
|
|
|
} else if (scanobject.isObject()) {
|
|
|
@ -2225,8 +2225,8 @@ UniValue scantxoutset(const JSONRPCRequest& request)
|
|
|
|
desc_str = desc_uni.get_str();
|
|
|
|
desc_str = desc_uni.get_str();
|
|
|
|
UniValue range_uni = find_value(scanobject, "range");
|
|
|
|
UniValue range_uni = find_value(scanobject, "range");
|
|
|
|
if (!range_uni.isNull()) {
|
|
|
|
if (!range_uni.isNull()) {
|
|
|
|
range = range_uni.get_int();
|
|
|
|
range = ParseRange(range_uni);
|
|
|
|
if (range < 0 || range > 1000000) throw JSONRPCError(RPC_INVALID_PARAMETER, "range out of range");
|
|
|
|
if (range.first < 0 || (range.second >> 31) != 0 || range.second >= range.first + 1000000) throw JSONRPCError(RPC_INVALID_PARAMETER, "range out of range");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
throw JSONRPCError(RPC_INVALID_PARAMETER, "Scan object needs to be either a string or an object");
|
|
|
|
throw JSONRPCError(RPC_INVALID_PARAMETER, "Scan object needs to be either a string or an object");
|
|
|
@ -2237,8 +2237,11 @@ UniValue scantxoutset(const JSONRPCRequest& request)
|
|
|
|
if (!desc) {
|
|
|
|
if (!desc) {
|
|
|
|
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, strprintf("Invalid descriptor '%s'", desc_str));
|
|
|
|
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, strprintf("Invalid descriptor '%s'", desc_str));
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if (!desc->IsRange()) range = 0;
|
|
|
|
if (!desc->IsRange()) {
|
|
|
|
for (int i = 0; i <= range; ++i) {
|
|
|
|
range.first = 0;
|
|
|
|
|
|
|
|
range.second = 0;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
for (int i = range.first; i <= range.second; ++i) {
|
|
|
|
std::vector<CScript> scripts;
|
|
|
|
std::vector<CScript> scripts;
|
|
|
|
if (!desc->Expand(i, provider, scripts, provider)) {
|
|
|
|
if (!desc->Expand(i, provider, scripts, provider)) {
|
|
|
|
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, strprintf("Cannot derive script without private keys: '%s'", desc_str));
|
|
|
|
throw JSONRPCError(RPC_INVALID_ADDRESS_OR_KEY, strprintf("Cannot derive script without private keys: '%s'", desc_str));
|
|
|
|