Merge #10783: [RPC] Various rpc argument fixes
4dc1915 check for null values in rpc args and handle appropriately (Gregory Sanders) 999ef20 importmulti options are optional (Gregory Sanders) a70d025 fixup some rpc param counting for rpc help (Gregory Sanders) Pull request description: Audited where named args will fail to use correct default values or may fail when additional optional arguments are added. Previously for these parameters, it was fine to omit them as positional arguments, but it would trigger UniValue runtime errors to set them to null, or to omit them while passing named parameters with greater positions (which would internally set earlier missing arguments to null). Now null values are treated the same as missing values so these errors do not occur. Included a few other small fixes while working on it. I didn't bother fixing account-based rpc calls. Tree-SHA512: 8baf781a35bd48de7878d4726850a580dab80323d3416c1c146b4fa9062f8a233c03f37e8ae3f3159e9d04a8f39c326627ca64c14e1cb7ce72538f934ab2ae1e
This commit is contained in:
parent
4a7525da38
commit
9d206814cb
@ -231,7 +231,7 @@ UniValue waitfornewblock(const JSONRPCRequest& request)
|
||||
+ HelpExampleRpc("waitfornewblock", "1000")
|
||||
);
|
||||
int timeout = 0;
|
||||
if (request.params.size() > 0)
|
||||
if (!request.params[0].isNull())
|
||||
timeout = request.params[0].get_int();
|
||||
|
||||
CUpdatedBlock block;
|
||||
@ -273,7 +273,7 @@ UniValue waitforblock(const JSONRPCRequest& request)
|
||||
|
||||
uint256 hash = uint256S(request.params[0].get_str());
|
||||
|
||||
if (request.params.size() > 1)
|
||||
if (!request.params[1].isNull())
|
||||
timeout = request.params[1].get_int();
|
||||
|
||||
CUpdatedBlock block;
|
||||
@ -316,7 +316,7 @@ UniValue waitforblockheight(const JSONRPCRequest& request)
|
||||
|
||||
int height = request.params[0].get_int();
|
||||
|
||||
if (request.params.size() > 1)
|
||||
if (!request.params[1].isNull())
|
||||
timeout = request.params[1].get_int();
|
||||
|
||||
CUpdatedBlock block;
|
||||
@ -457,7 +457,7 @@ UniValue getrawmempool(const JSONRPCRequest& request)
|
||||
);
|
||||
|
||||
bool fVerbose = false;
|
||||
if (request.params.size() > 0)
|
||||
if (!request.params[0].isNull())
|
||||
fVerbose = request.params[0].get_bool();
|
||||
|
||||
return mempoolToJSON(fVerbose);
|
||||
@ -490,7 +490,7 @@ UniValue getmempoolancestors(const JSONRPCRequest& request)
|
||||
}
|
||||
|
||||
bool fVerbose = false;
|
||||
if (request.params.size() > 1)
|
||||
if (!request.params[1].isNull())
|
||||
fVerbose = request.params[1].get_bool();
|
||||
|
||||
uint256 hash = ParseHashV(request.params[0], "parameter 1");
|
||||
@ -554,7 +554,7 @@ UniValue getmempooldescendants(const JSONRPCRequest& request)
|
||||
}
|
||||
|
||||
bool fVerbose = false;
|
||||
if (request.params.size() > 1)
|
||||
if (!request.params[1].isNull())
|
||||
fVerbose = request.params[1].get_bool();
|
||||
|
||||
uint256 hash = ParseHashV(request.params[0], "parameter 1");
|
||||
@ -723,7 +723,7 @@ UniValue getblockheader(const JSONRPCRequest& request)
|
||||
uint256 hash(uint256S(strHash));
|
||||
|
||||
bool fVerbose = true;
|
||||
if (request.params.size() > 1)
|
||||
if (!request.params[1].isNull())
|
||||
fVerbose = request.params[1].get_bool();
|
||||
|
||||
if (mapBlockIndex.count(hash) == 0)
|
||||
@ -979,7 +979,7 @@ UniValue getblock(const JSONRPCRequest& request)
|
||||
uint256 hash(uint256S(strHash));
|
||||
|
||||
int verbosity = 1;
|
||||
if (request.params.size() > 1) {
|
||||
if (!request.params[1].isNull()) {
|
||||
if(request.params[1].isNum())
|
||||
verbosity = request.params[1].get_int();
|
||||
else
|
||||
@ -1222,7 +1222,7 @@ UniValue gettxout(const JSONRPCRequest& request)
|
||||
int n = request.params[1].get_int();
|
||||
COutPoint out(hash, n);
|
||||
bool fMempool = true;
|
||||
if (request.params.size() > 2)
|
||||
if (!request.params[2].isNull())
|
||||
fMempool = request.params[2].get_bool();
|
||||
|
||||
Coin coin;
|
||||
@ -1275,9 +1275,9 @@ UniValue verifychain(const JSONRPCRequest& request)
|
||||
|
||||
LOCK(cs_main);
|
||||
|
||||
if (request.params.size() > 0)
|
||||
if (!request.params[0].isNull())
|
||||
nCheckLevel = request.params[0].get_int();
|
||||
if (request.params.size() > 1)
|
||||
if (!request.params[1].isNull())
|
||||
nCheckDepth = request.params[1].get_int();
|
||||
|
||||
return CVerifyDB().VerifyDB(Params(), pcoinsTip, nCheckLevel, nCheckDepth);
|
||||
|
@ -102,7 +102,7 @@ UniValue getnetworkhashps(const JSONRPCRequest& request)
|
||||
);
|
||||
|
||||
LOCK(cs_main);
|
||||
return GetNetworkHashPS(request.params.size() > 0 ? request.params[0].get_int() : 120, request.params.size() > 1 ? request.params[1].get_int() : -1);
|
||||
return GetNetworkHashPS(!request.params[0].isNull() ? request.params[0].get_int() : 120, !request.params[1].isNull() ? request.params[1].get_int() : -1);
|
||||
}
|
||||
|
||||
#if ENABLE_MINER
|
||||
@ -173,7 +173,7 @@ UniValue generatetoaddress(const JSONRPCRequest& request)
|
||||
|
||||
int nGenerate = request.params[0].get_int();
|
||||
uint64_t nMaxTries = 1000000;
|
||||
if (request.params.size() > 2) {
|
||||
if (!request.params[2].isNull()) {
|
||||
nMaxTries = request.params[2].get_int();
|
||||
}
|
||||
|
||||
@ -386,7 +386,7 @@ UniValue getblocktemplate(const JSONRPCRequest& request)
|
||||
UniValue lpval = NullUniValue;
|
||||
std::set<std::string> setClientRules;
|
||||
int64_t nMaxVersionPreVB = -1;
|
||||
if (request.params.size() > 0)
|
||||
if (!request.params[0].isNull())
|
||||
{
|
||||
const UniValue& oparam = request.params[0].get_obj();
|
||||
const UniValue& modeval = find_value(oparam, "mode");
|
||||
|
@ -312,7 +312,7 @@ UniValue getaddednodeinfo(const JSONRPCRequest& request)
|
||||
|
||||
std::vector<AddedNodeInfo> vInfo = g_connman->GetAddedNodeInfo();
|
||||
|
||||
if (request.params.size() == 1) {
|
||||
if (request.params.size() == 1 && !request.params[0].isNull()) {
|
||||
bool found = false;
|
||||
for (const AddedNodeInfo& info : vInfo) {
|
||||
if (info.strAddedNode == request.params[0].get_str()) {
|
||||
|
@ -179,7 +179,7 @@ UniValue getrawtransaction(const JSONRPCRequest& request)
|
||||
|
||||
// Accept either a bool (true) or a num (>=1) to indicate verbose output.
|
||||
bool fVerbose = false;
|
||||
if (request.params.size() > 1) {
|
||||
if (!request.params[1].isNull()) {
|
||||
if (request.params[1].isNum()) {
|
||||
if (request.params[1].get_int() != 0) {
|
||||
fVerbose = true;
|
||||
@ -258,7 +258,7 @@ UniValue gettxoutproof(const JSONRPCRequest& request)
|
||||
CBlockIndex* pblockindex = NULL;
|
||||
|
||||
uint256 hashBlock;
|
||||
if (request.params.size() > 1)
|
||||
if (!request.params[1].isNull())
|
||||
{
|
||||
hashBlock = uint256S(request.params[1].get_str());
|
||||
if (!mapBlockIndex.count(hashBlock))
|
||||
|
@ -107,12 +107,12 @@ UniValue importprivkey(const JSONRPCRequest& request)
|
||||
|
||||
std::string strSecret = request.params[0].get_str();
|
||||
std::string strLabel = "";
|
||||
if (request.params.size() > 1)
|
||||
if (!request.params[1].isNull())
|
||||
strLabel = request.params[1].get_str();
|
||||
|
||||
// Whether to perform rescan after import
|
||||
bool fRescan = true;
|
||||
if (request.params.size() > 2)
|
||||
if (!request.params[2].isNull())
|
||||
fRescan = request.params[2].get_bool();
|
||||
|
||||
if (fRescan && fPruneMode)
|
||||
@ -246,12 +246,12 @@ UniValue importaddress(const JSONRPCRequest& request)
|
||||
|
||||
|
||||
std::string strLabel = "";
|
||||
if (request.params.size() > 1)
|
||||
if (!request.params[1].isNull())
|
||||
strLabel = request.params[1].get_str();
|
||||
|
||||
// Whether to perform rescan after import
|
||||
bool fRescan = true;
|
||||
if (request.params.size() > 2)
|
||||
if (!request.params[2].isNull())
|
||||
fRescan = request.params[2].get_bool();
|
||||
|
||||
if (fRescan && fPruneMode)
|
||||
@ -259,7 +259,7 @@ UniValue importaddress(const JSONRPCRequest& request)
|
||||
|
||||
// Whether to import a p2sh version, too
|
||||
bool fP2SH = false;
|
||||
if (request.params.size() > 3)
|
||||
if (!request.params[3].isNull())
|
||||
fP2SH = request.params[3].get_bool();
|
||||
|
||||
LOCK2(cs_main, pwallet->cs_wallet);
|
||||
@ -411,12 +411,12 @@ UniValue importpubkey(const JSONRPCRequest& request)
|
||||
|
||||
|
||||
std::string strLabel = "";
|
||||
if (request.params.size() > 1)
|
||||
if (!request.params[1].isNull())
|
||||
strLabel = request.params[1].get_str();
|
||||
|
||||
// Whether to perform rescan after import
|
||||
bool fRescan = true;
|
||||
if (request.params.size() > 2)
|
||||
if (!request.params[2].isNull())
|
||||
fRescan = request.params[2].get_bool();
|
||||
|
||||
if (fRescan && fPruneMode)
|
||||
@ -1235,7 +1235,7 @@ UniValue importmulti(const JSONRPCRequest& mainRequest)
|
||||
// clang-format off
|
||||
if (mainRequest.fHelp || mainRequest.params.size() < 1 || mainRequest.params.size() > 2)
|
||||
throw std::runtime_error(
|
||||
"importmulti \"requests\" \"options\"\n\n"
|
||||
"importmulti \"requests\" ( \"options\" )\n\n"
|
||||
"Import addresses/scripts (with private or public keys, redeem script (P2SH)), rescanning all addresses in one-shot-only (rescan can be disabled via options).\n\n"
|
||||
"Arguments:\n"
|
||||
"1. requests (array, required) Data to be imported\n"
|
||||
@ -1278,7 +1278,7 @@ UniValue importmulti(const JSONRPCRequest& mainRequest)
|
||||
//Default options
|
||||
bool fRescan = true;
|
||||
|
||||
if (mainRequest.params.size() > 1) {
|
||||
if (!mainRequest.params[1].isNull()) {
|
||||
const UniValue& options = mainRequest.params[1];
|
||||
|
||||
if (options.exists("rescan")) {
|
||||
|
@ -146,7 +146,7 @@ UniValue getnewaddress(const JSONRPCRequest& request)
|
||||
|
||||
// Parse the account first so we don't generate a key if there's an error
|
||||
std::string strAccount;
|
||||
if (request.params.size() > 0)
|
||||
if (!request.params[0].isNull())
|
||||
strAccount = AccountFromValue(request.params[0]);
|
||||
|
||||
if (!pwallet->IsLocked(true)) {
|
||||
@ -217,7 +217,7 @@ UniValue getrawchangeaddress(const JSONRPCRequest& request)
|
||||
return NullUniValue;
|
||||
}
|
||||
|
||||
if (request.fHelp || request.params.size() > 1)
|
||||
if (request.fHelp || request.params.size() > 0)
|
||||
throw std::runtime_error(
|
||||
"getrawchangeaddress\n"
|
||||
"\nReturns a new Dash address, for receiving change.\n"
|
||||
@ -490,7 +490,7 @@ UniValue listaddressgroupings(const JSONRPCRequest& request)
|
||||
return NullUniValue;
|
||||
}
|
||||
|
||||
if (request.fHelp)
|
||||
if (request.fHelp || request.params.size() != 0)
|
||||
throw std::runtime_error(
|
||||
"listaddressgroupings\n"
|
||||
"\nLists groups of addresses which have had their common ownership\n"
|
||||
@ -678,7 +678,7 @@ UniValue getreceivedbyaddress(const JSONRPCRequest& request)
|
||||
|
||||
// Minimum confirmations
|
||||
int nMinDepth = 1;
|
||||
if (request.params.size() > 1)
|
||||
if (!request.params[1].isNull())
|
||||
nMinDepth = request.params[1].get_int();
|
||||
bool fAddLocked = (request.params.size() > 2 && request.params[2].get_bool());
|
||||
|
||||
@ -731,7 +731,7 @@ UniValue getreceivedbyaccount(const JSONRPCRequest& request)
|
||||
|
||||
// Minimum confirmations
|
||||
int nMinDepth = 1;
|
||||
if (request.params.size() > 1)
|
||||
if (!request.params[1].isNull())
|
||||
nMinDepth = request.params[1].get_int();
|
||||
bool fAddLocked = (request.params.size() > 2 && request.params[2].get_bool());
|
||||
|
||||
@ -799,11 +799,11 @@ UniValue getbalance(const JSONRPCRequest& request)
|
||||
const std::string* account = account_param != "*" ? &account_param : nullptr;
|
||||
|
||||
int nMinDepth = 1;
|
||||
if (request.params.size() > 1)
|
||||
if (!request.params[1].isNull())
|
||||
nMinDepth = request.params[1].get_int();
|
||||
bool fAddLocked = (request.params.size() > 2 && request.params[2].get_bool());
|
||||
isminefilter filter = ISMINE_SPENDABLE;
|
||||
if(request.params.size() > 3)
|
||||
if(!request.params[3].isNull())
|
||||
if(request.params[3].get_bool())
|
||||
filter = filter | ISMINE_WATCH_ONLY;
|
||||
|
||||
@ -1002,7 +1002,7 @@ UniValue sendmany(const JSONRPCRequest& request)
|
||||
std::string strAccount = AccountFromValue(request.params[0]);
|
||||
UniValue sendTo = request.params[1].get_obj();
|
||||
int nMinDepth = 1;
|
||||
if (request.params.size() > 2)
|
||||
if (!request.params[2].isNull())
|
||||
nMinDepth = request.params[2].get_int();
|
||||
bool fAddLocked = (request.params.size() > 3 && request.params[3].get_bool());
|
||||
|
||||
@ -1148,17 +1148,17 @@ UniValue ListReceived(CWallet * const pwallet, const UniValue& params, bool fByA
|
||||
{
|
||||
// Minimum confirmations
|
||||
int nMinDepth = 1;
|
||||
if (params.size() > 0)
|
||||
if (!params[0].isNull())
|
||||
nMinDepth = params[0].get_int();
|
||||
bool fAddLocked = (params.size() > 1 && params[1].get_bool());
|
||||
|
||||
// Whether to include empty accounts
|
||||
bool fIncludeEmpty = false;
|
||||
if (params.size() > 2)
|
||||
if (!params[2].isNull())
|
||||
fIncludeEmpty = params[2].get_bool();
|
||||
|
||||
isminefilter filter = ISMINE_SPENDABLE;
|
||||
if(params.size() > 3)
|
||||
if(!params[3].isNull())
|
||||
if(params[3].get_bool())
|
||||
filter = filter | ISMINE_WATCH_ONLY;
|
||||
|
||||
@ -1530,16 +1530,16 @@ UniValue listtransactions(const JSONRPCRequest& request)
|
||||
LOCK2(cs_main, pwallet->cs_wallet);
|
||||
|
||||
std::string strAccount = "*";
|
||||
if (request.params.size() > 0)
|
||||
if (!request.params[0].isNull())
|
||||
strAccount = request.params[0].get_str();
|
||||
int nCount = 10;
|
||||
if (request.params.size() > 1)
|
||||
if (!request.params[1].isNull())
|
||||
nCount = request.params[1].get_int();
|
||||
int nFrom = 0;
|
||||
if (request.params.size() > 2)
|
||||
if (!request.params[2].isNull())
|
||||
nFrom = request.params[2].get_int();
|
||||
isminefilter filter = ISMINE_SPENDABLE;
|
||||
if(request.params.size() > 3)
|
||||
if(!request.params[3].isNull())
|
||||
if(request.params[3].get_bool())
|
||||
filter = filter | ISMINE_WATCH_ONLY;
|
||||
|
||||
@ -1681,7 +1681,7 @@ UniValue listsinceblock(const JSONRPCRequest& request)
|
||||
return NullUniValue;
|
||||
}
|
||||
|
||||
if (request.fHelp)
|
||||
if (request.fHelp || request.params.size() > 3)
|
||||
throw std::runtime_error(
|
||||
"listsinceblock ( \"blockhash\" target_confirmations include_watchonly)\n"
|
||||
"\nGet all transactions in blocks since block [blockhash], or all transactions if omitted\n"
|
||||
@ -1729,7 +1729,7 @@ UniValue listsinceblock(const JSONRPCRequest& request)
|
||||
int target_confirms = 1;
|
||||
isminefilter filter = ISMINE_SPENDABLE;
|
||||
|
||||
if (request.params.size() > 0)
|
||||
if (!request.params[0].isNull())
|
||||
{
|
||||
uint256 blockId;
|
||||
|
||||
@ -1750,7 +1750,7 @@ UniValue listsinceblock(const JSONRPCRequest& request)
|
||||
throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid blockhash");
|
||||
}
|
||||
|
||||
if (request.params.size() > 1)
|
||||
if (!request.params[1].isNull())
|
||||
{
|
||||
target_confirms = request.params[1].get_int();
|
||||
|
||||
@ -1843,7 +1843,7 @@ UniValue gettransaction(const JSONRPCRequest& request)
|
||||
hash.SetHex(request.params[0].get_str());
|
||||
|
||||
isminefilter filter = ISMINE_SPENDABLE;
|
||||
if(request.params.size() > 1)
|
||||
if(!request.params[1].isNull())
|
||||
if(request.params[1].get_bool())
|
||||
filter = filter | ISMINE_WATCH_ONLY;
|
||||
|
||||
@ -1965,7 +1965,7 @@ UniValue keypoolrefill(const JSONRPCRequest& request)
|
||||
|
||||
// 0 is interpreted by TopUpKeyPool() as the default keypool size given by -keypool
|
||||
unsigned int kpSize = 0;
|
||||
if (request.params.size() > 0) {
|
||||
if (!request.params[0].isNull()) {
|
||||
if (request.params[0].get_int() < 0)
|
||||
throw JSONRPCError(RPC_INVALID_PARAMETER, "Invalid parameter, expected valid size.");
|
||||
kpSize = (unsigned int)request.params[0].get_int();
|
||||
@ -2708,7 +2708,7 @@ UniValue listunspent(const JSONRPCRequest& request)
|
||||
CAmount nMinimumSumAmount = MAX_MONEY;
|
||||
uint64_t nMaximumCount = 0;
|
||||
|
||||
if (request.params.size() > 4) {
|
||||
if (!request.params[4].isNull()) {
|
||||
const UniValue& options = request.params[4].get_obj();
|
||||
|
||||
if (options.exists("minimumAmount"))
|
||||
@ -2838,7 +2838,7 @@ UniValue fundrawtransaction(const JSONRPCRequest& request)
|
||||
UniValue subtractFeeFromOutputs;
|
||||
std::set<int> setSubtractFeeFromOutputs;
|
||||
|
||||
if (request.params.size() > 1) {
|
||||
if (!request.params[1].isNull()) {
|
||||
if (request.params[1].type() == UniValue::VBOOL) {
|
||||
// backward compatibility bool only fallback
|
||||
includeWatching = request.params[1].get_bool();
|
||||
|
Loading…
Reference in New Issue
Block a user