Skip to content

Commit 11bf976

Browse files
committed
refactor: add composite RPC bools to conversion table, deprecate old fn
We cannot simply get rid of `ParseBoolV` because upstream parsing logic is much more stricter, constituting a breaking change. This requires us to therefore follow the deprecation process.
1 parent 53a66ca commit 11bf976

4 files changed

Lines changed: 53 additions & 22 deletions

File tree

src/rpc/client.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,28 +257,41 @@ static const CRPCConvertParam vRPCConvertParams[] =
257257
{ "submitchainlock", 2, "blockHeight" },
258258
{ "mnauth", 0, "nodeId" },
259259
// Compound RPCs (note: index position is offset by one to account for subcommand)
260+
{ "bls generate", 1, "legacy" },
261+
{ "bls fromsecret", 2, "legacy" },
262+
{ "coinjoinsalt generate", 1, "overwrite" },
263+
{ "coinjoinsalt set", 2, "overwrite" },
260264
{ "gobject list-prepared", 1, "count" },
261265
{ "gobject prepare", 2, "revision" },
262266
{ "gobject prepare", 3, "time" },
263267
{ "gobject prepare", 7, "outputIndex" },
264268
{ "gobject submit", 2, "revision" },
265269
{ "gobject submit", 3, "time" },
270+
{ "masternode connect", 2, "v2transport" },
266271
{ "masternode payments", 2, "count" },
267272
{ "masternode winners", 1, "count" },
273+
{ "protx diff", 3, "extended" },
274+
{ "protx list", 2, "detailed" },
268275
{ "protx list", 3, "height" },
269276
{ "protx register", 2, "collateralIndex" },
270277
{ "protx register", 3, "coreP2PAddrs", true },
278+
{ "protx register", 10, "submit" },
271279
{ "protx register_legacy", 2, "collateralIndex" },
272280
{ "protx register_legacy", 3, "coreP2PAddrs", true },
281+
{ "protx register_legacy", 10, "submit" },
273282
{ "protx register_evo", 2, "collateralIndex" },
274283
{ "protx register_evo", 3, "coreP2PAddrs", true },
275284
{ "protx register_evo", 10, "platformP2PAddrs", true },
276285
{ "protx register_evo", 11, "platformHTTPSAddrs", true },
286+
{ "protx register_evo", 13, "submit" },
277287
{ "protx register_fund", 2, "coreP2PAddrs", true },
288+
{ "protx register_fund", 9, "submit" },
278289
{ "protx register_fund_legacy", 2, "coreP2PAddrs", true },
290+
{ "protx register_fund_legacy", 9, "submit" },
279291
{ "protx register_fund_evo", 2, "coreP2PAddrs", true },
280292
{ "protx register_fund_evo", 9, "platformP2PAddrs", true },
281293
{ "protx register_fund_evo", 10, "platformHTTPSAddrs", true },
294+
{ "protx register_fund_evo", 12, "submit" },
282295
{ "protx register_prepare", 2, "collateralIndex" },
283296
{ "protx register_prepare", 3, "coreP2PAddrs", true },
284297
{ "protx register_prepare_legacy", 2, "collateralIndex" },
@@ -288,10 +301,15 @@ static const CRPCConvertParam vRPCConvertParams[] =
288301
{ "protx register_prepare_evo", 10, "platformP2PAddrs", true },
289302
{ "protx register_prepare_evo", 11, "platformHTTPSAddrs", true },
290303
{ "protx revoke", 3, "reason" },
304+
{ "protx revoke", 5, "submit" },
305+
{ "protx update_registrar", 6, "submit" },
306+
{ "protx update_registrar_legacy", 6, "submit" },
291307
{ "protx update_service", 2, "coreP2PAddrs", true },
308+
{ "protx update_service", 6, "submit" },
292309
{ "protx update_service_evo", 2, "coreP2PAddrs", true },
293310
{ "protx update_service_evo", 5, "platformP2PAddrs", true },
294311
{ "protx update_service_evo", 6, "platformHTTPSAddrs", true },
312+
{ "protx update_service_evo", 9, "submit" },
295313
{ "quorum dkgsimerror", 2, "rate" },
296314
{ "quorum dkgstatus", 1, "detail_level" },
297315
{ "quorum getdata", 1, "nodeId" },
@@ -300,13 +318,17 @@ static const CRPCConvertParam vRPCConvertParams[] =
300318
{ "quorum getrecsig", 1, "llmqType" },
301319
{ "quorum hasrecsig", 1, "llmqType" },
302320
{ "quorum info", 1, "llmqType" },
321+
{ "quorum info", 3, "includeSkShare" },
303322
{ "quorum isconflicting", 1, "llmqType" },
304323
{ "quorum listextended", 1, "height" },
305324
{ "quorum list", 1, "count" },
306325
{ "quorum memberof", 2, "scanQuorumsCount" },
326+
{ "quorum platformsign", 4, "submit" },
327+
{ "quorum rotationinfo", 2, "extraShare" },
307328
{ "quorum rotationinfo", 3, "baseBlockHashes" },
308329
{ "quorum selectquorum", 1, "llmqType" },
309330
{ "quorum sign", 1, "llmqType" },
331+
{ "quorum sign", 5, "submit" },
310332
{ "quorum verify", 1, "llmqType" },
311333
{ "quorum verify", 6, "signHeight" },
312334
};

src/rpc/util.cpp

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
#include <script/signingprovider.h>
1313
#include <tinyformat.h>
1414
#include <util/check.h>
15+
#include <util/std23.h>
1516
#include <util/strencodings.h>
1617
#include <util/string.h>
1718
#include <util/system.h>
@@ -123,22 +124,30 @@ std::vector<unsigned char> ParseHexO(const UniValue& o, std::string strKey)
123124

124125
bool ParseBoolV(const UniValue& v, const std::string &strName)
125126
{
126-
std::string strBool;
127-
if (v.isBool())
128-
return v.get_bool();
129-
else if (v.isNum())
130-
strBool = ToString(v.getInt<int>());
131-
else if (v.isStr())
132-
strBool = v.get_str();
133-
134-
strBool = ToLower(strBool);
127+
if (std23::ranges::contains(gArgs.GetArgs("-deprecatedrpc"), "permissive_bool")) {
128+
std::string strBool;
129+
if (v.isBool())
130+
return v.get_bool();
131+
else if (v.isNum())
132+
strBool = ToString(v.getInt<int>());
133+
else if (v.isStr())
134+
strBool = v.get_str();
135+
136+
strBool = ToLower(strBool);
137+
138+
if (strBool == "true" || strBool == "yes" || strBool == "1") {
139+
return true;
140+
} else if (strBool == "false" || strBool == "no" || strBool == "0") {
141+
return false;
142+
}
143+
throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("%s must be true, false, yes, no, 1 or 0 (not '%s')", strName, strBool));
144+
}
135145

136-
if (strBool == "true" || strBool == "yes" || strBool == "1") {
137-
return true;
138-
} else if (strBool == "false" || strBool == "no" || strBool == "0") {
139-
return false;
146+
if (!v.isBool()) {
147+
throw JSONRPCError(RPC_INVALID_PARAMETER, strprintf("%s must be a JSON boolean. " /* Continued */
148+
"Pass -deprecatedrpc=permissive_bool to allow legacy boolean parsing.", strName));
140149
}
141-
throw JSONRPCError(RPC_INVALID_PARAMETER, strName+" must be true, false, yes, no, 1 or 0 (not '"+strBool+"')");
150+
return v.get_bool();
142151
}
143152

144153
namespace {

src/test/rpc_tests.cpp

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -529,12 +529,12 @@ BOOST_AUTO_TEST_CASE(rpc_bls)
529529
BOOST_CHECK_NO_THROW(r = CallRPC(std::string("bls generate")));
530530
BOOST_CHECK_EQUAL(r.get_obj().find_value("scheme").get_str(), "basic");
531531

532-
BOOST_CHECK_NO_THROW(r = CallRPC(std::string("bls generate 1")));
532+
BOOST_CHECK_NO_THROW(r = CallRPC(std::string("bls generate true")));
533533
BOOST_CHECK_EQUAL(r.get_obj().find_value("scheme").get_str(), "legacy");
534534
std::string secret_legacy = r.get_obj().find_value("secret").get_str();
535535
std::string public_legacy = r.get_obj().find_value("public").get_str();
536536

537-
BOOST_CHECK_NO_THROW(r = CallRPC(std::string("bls generate 0")));
537+
BOOST_CHECK_NO_THROW(r = CallRPC(std::string("bls generate false")));
538538
BOOST_CHECK_EQUAL(r.get_obj().find_value("scheme").get_str(), "basic");
539539
std::string secret_basic = r.get_obj().find_value("secret").get_str();
540540
std::string public_basic = r.get_obj().find_value("public").get_str();
@@ -543,24 +543,24 @@ BOOST_AUTO_TEST_CASE(rpc_bls)
543543
BOOST_CHECK_EQUAL(r.get_obj().find_value("scheme").get_str(), "basic");
544544
BOOST_CHECK_EQUAL(r.get_obj().find_value("public").get_str(), public_basic);
545545

546-
BOOST_CHECK_NO_THROW(r = CallRPC(std::string("bls fromsecret ") + secret_legacy + std::string(" 1")));
546+
BOOST_CHECK_NO_THROW(r = CallRPC(std::string("bls fromsecret ") + secret_legacy + std::string(" true")));
547547
BOOST_CHECK_EQUAL(r.get_obj().find_value("scheme").get_str(), "legacy");
548548
BOOST_CHECK_EQUAL(r.get_obj().find_value("public").get_str(), public_legacy);
549549

550-
BOOST_CHECK_NO_THROW(r = CallRPC(std::string("bls fromsecret ") + secret_basic + std::string(" 0")));
550+
BOOST_CHECK_NO_THROW(r = CallRPC(std::string("bls fromsecret ") + secret_basic + std::string(" false")));
551551
BOOST_CHECK_EQUAL(r.get_obj().find_value("scheme").get_str(), "basic");
552552
BOOST_CHECK(r.get_obj().find_value("public").get_str() != public_legacy);
553553

554-
BOOST_CHECK_NO_THROW(r = CallRPC(std::string("bls fromsecret ") + secret_basic + std::string(" 0")));
554+
BOOST_CHECK_NO_THROW(r = CallRPC(std::string("bls fromsecret ") + secret_basic + std::string(" false")));
555555
BOOST_CHECK_EQUAL(r.get_obj().find_value("scheme").get_str(), "basic");
556556
BOOST_CHECK_EQUAL(r.get_obj().find_value("public").get_str(), public_basic);
557557

558-
BOOST_CHECK_NO_THROW(r = CallRPC(std::string("bls fromsecret ") + secret_basic + std::string(" 1")));
558+
BOOST_CHECK_NO_THROW(r = CallRPC(std::string("bls fromsecret ") + secret_basic + std::string(" true")));
559559
BOOST_CHECK_EQUAL(r.get_obj().find_value("scheme").get_str(), "legacy");
560560
BOOST_CHECK(r.get_obj().find_value("public").get_str() != public_basic);
561561

562562
std::string secret = "0b072b1b8b28335b0460aa695ee8ce1f60dc01e6eb12655ece2a877379dfdb51";
563-
BOOST_CHECK_NO_THROW(r = CallRPC(std::string("bls fromsecret ") + secret + " 1"));
563+
BOOST_CHECK_NO_THROW(r = CallRPC(std::string("bls fromsecret ") + secret + " true"));
564564
BOOST_CHECK_EQUAL(r.get_obj().find_value("scheme").get_str(), "legacy");
565565
BOOST_CHECK_EQUAL(r.get_obj().find_value("public").get_str(), "9379c28e0f50546906fe733f1222c8f7e39574d513790034f1fec1476286eb652a350c8c0e630cd2cc60d10c26d6f6ee");
566566
BOOST_CHECK_NO_THROW(r = CallRPC(std::string("bls fromsecret ") + secret));

test/functional/feature_llmq_connections.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ def get_mn_connection_count(self, node):
148148

149149
def get_mn_probe_count(self, node, q, check_peers):
150150
count = 0
151-
mnList = node.protx('list', 'registered', 1)
151+
mnList = node.protx('list', 'registered', True)
152152
peerList = node.getpeerinfo()
153153
mnMap = {}
154154
peerMap = {}

0 commit comments

Comments
 (0)