1#include <xrpld/rpc/RPCCall.h>
2#include <xrpld/rpc/ServerHandler.h>
4#include <xrpl/basics/ByteUtilities.h>
5#include <xrpl/basics/Log.h>
6#include <xrpl/basics/StringUtilities.h>
7#include <xrpl/basics/base64.h>
8#include <xrpl/basics/contract.h>
9#include <xrpl/beast/core/LexicalCast.h>
10#include <xrpl/json/json_forwards.h>
11#include <xrpl/json/json_reader.h>
12#include <xrpl/json/to_string.h>
13#include <xrpl/net/HTTPClient.h>
14#include <xrpl/protocol/ApiVersion.h>
15#include <xrpl/protocol/ErrorCodes.h>
16#include <xrpl/protocol/PublicKey.h>
17#include <xrpl/protocol/RPCErr.h>
18#include <xrpl/protocol/SystemParameters.h>
19#include <xrpl/protocol/UintTypes.h>
20#include <xrpl/protocol/jss.h>
22#include <boost/algorithm/string/predicate.hpp>
23#include <boost/asio/streambuf.hpp>
24#include <boost/regex.hpp>
55 s <<
"POST " << (strPath.
empty() ?
"/" : strPath) <<
" HTTP/1.0\r\n"
56 <<
"User-Agent: " <<
systemName() <<
"-json-rpc/v1\r\n"
57 <<
"Host: " << strHost <<
"\r\n"
58 <<
"Content-Type: application/json\r\n"
59 <<
"Content-Length: " << strMsg.
size() <<
"\r\n"
60 <<
"Accept: application/json\r\n";
62 for (
auto const& [k, v] : mapRequestHeaders)
63 s << k <<
": " << v <<
"\r\n";
65 s <<
"\r\n" << strMsg;
81 if (strLedger ==
"current" || strLedger ==
"closed" ||
82 strLedger ==
"validated")
84 jvRequest[jss::ledger_index] = strLedger;
86 else if (strLedger.
length() == 64)
89 jvRequest[jss::ledger_hash] = strLedger;
93 jvRequest[jss::ledger_index] =
94 beast::lexicalCast<std::uint32_t>(strLedger);
109 static boost::regex reCurIss(
110 "\\`([][:alnum:]<>(){}[|?!@#$%^&*]{3})(?:/(.+))?\\'");
112 boost::smatch smMatch;
114 if (boost::regex_match(strCurrencyIssuer, smMatch, reCurIss))
120 jvResult[jss::currency] = strCurrency;
125 jvResult[jss::issuer] = strIssuer;
133 std::string(
"Invalid currency/issuer '") + strCurrencyIssuer +
143 if (parseBase58<ripple::PublicKey>(type, strPk))
166 v[jss::params] = jvParams;
175 v[jss::internal_command] = jvParams[0u];
179 for (
unsigned i = 1; i < jvParams.
size(); ++i)
180 params.
append(jvParams[i]);
182 v[jss::params] = params;
190 if (jvParams.
size() == 1)
198 jvRequest[jss::public_key] = strPk;
211 unsigned int iParams = jvParams.
size();
214 jvRequest[jvParams[0u].
asString()] =
true;
225 unsigned int iParams = jvParams.
size();
227 auto const account = parseBase58<AccountID>(jvParams[0u].asString());
231 jvRequest[jss::account] =
toBase58(*account);
235 while (!bDone && iParams >= 2)
238 if (jvParams[iParams - 1].asString() == jss::binary)
240 jvRequest[jss::binary] =
true;
243 else if (jvParams[iParams - 1].asString() == jss::count)
245 jvRequest[jss::count] =
true;
248 else if (jvParams[iParams - 1].asString() == jss::descending)
250 jvRequest[jss::descending] =
true;
262 else if (2 == iParams)
272 if (uLedgerMax != -1 && uLedgerMax < uLedgerMin)
279 jvRequest[jss::ledger_index_min] = jvParams[1u].
asInt();
280 jvRequest[jss::ledger_index_max] = jvParams[2u].
asInt();
283 jvRequest[jss::limit] = jvParams[3u].
asInt();
286 jvRequest[jss::offset] = jvParams[4u].
asInt();
312 jvRequest[jss::taker_pays] = jvTakerPays;
321 jvRequest[jss::taker_gets] = jvTakerGets;
324 if (jvParams.
size() >= 3)
326 jvRequest[jss::issuer] = jvParams[2u].
asString();
329 if (jvParams.
size() >= 4 &&
333 if (jvParams.
size() >= 5)
337 int iLimit = jvParams[4u].
asInt();
340 jvRequest[jss::limit] = iLimit;
348 if (jvParams.
size() >= 6)
352 int bProof = jvParams[5u].
asInt();
354 jvRequest[jss::proof] =
true;
362 if (jvParams.
size() == 7)
363 jvRequest[jss::marker] = jvParams[6u];
374 if (!jvParams.
size())
379 jvRequest[
"can_delete"] = jvParams[0u].
asUInt();
381 jvRequest[
"can_delete"] = input;
392 if (jvParams.
size() == 2)
394 jvRequest[jss::ip] = ip;
395 jvRequest[jss::port] = jvParams[1u].
asUInt();
404 jvRequest[jss::port] =
410 jvRequest[jss::ip] = ip;
420 jvRequest[jss::source_account] = jvParams[0u].
asString();
421 jvRequest[jss::destination_account] = jvParams[1u].
asString();
423 if (jvParams.
size() >= 3)
427 if ((jvParams.
size() >= 4) && (jvParams.
size() <= 11))
430 for (uint32_t i = 3; i < jvParams.
size(); ++i)
431 jvRequest[jss::credentials].append(jvParams[i].asString());
450 if (jvParams.
size() > 0)
451 jvRequest[jss::feature] = jvParams[0u].
asString();
453 if (jvParams.
size() > 1)
455 auto const action = jvParams[1u].
asString();
460 if (boost::iequals(action,
"reject"))
462 else if (boost::iequals(action,
"accept"))
478 jvRequest[jss::min_count] = jvParams[0u].
asUInt();
488 bool const bOffline =
489 4 == jvParams.
size() && jvParams[3u].
asString() ==
"offline";
491 if (3 == jvParams.
size() || bOffline)
500 jvRequest[jss::account] = jvParams[0u].
asString();
501 jvRequest[jss::secret] = jvParams[1u].
asString();
502 jvRequest[jss::tx_json] = txJSON;
505 jvRequest[jss::offline] =
true;
520 JLOG(
j_.
trace()) <<
"RPC method: " << jvParams[0u];
521 JLOG(
j_.
trace()) <<
"RPC json: " << jvParams[1u];
528 jvRequest[jss::method] = jvParams[0u];
543 for (
auto const& j : jv)
552 if (jv.
isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0" &&
553 jv.
isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0" &&
571 bool valid_parse = reader.
parse(jvParams[0u].asString(), jv);
579 auto const& params = jv[jss::params];
580 for (
auto i = params.begin(); i != params.end(); ++i)
581 jv1[i.key().asString()] = *i;
583 jv1[jss::jsonrpc] = jv[jss::jsonrpc];
584 jv1[jss::ripplerpc] = jv[jss::ripplerpc];
585 jv1[jss::id] = jv[jss::id];
586 jv1[jss::method] = jv[jss::method];
593 if (jv[j].isMember(jss::params))
595 auto const& params = jv[j][jss::params];
596 for (
auto i = params.begin(); i != params.end(); ++i)
597 jv1[j][i.key().asString()] = *i;
599 jv1[j][jss::jsonrpc] = jv[j][jss::jsonrpc];
600 jv1[j][jss::ripplerpc] = jv[j][jss::ripplerpc];
601 jv1[j][jss::id] = jv[j][jss::id];
602 jv1[j][jss::method] = jv[j][jss::method];
608 jv_error[jss::jsonrpc] = jv[jss::jsonrpc];
610 jv_error[jss::ripplerpc] = jv[jss::ripplerpc];
612 jv_error[jss::id] = jv[jss::id];
622 if (!jvParams.
size())
629 if (2 == jvParams.
size())
631 if (jvParams[1u].asString() ==
"full")
633 jvRequest[jss::full] =
true;
635 else if (jvParams[1u].asString() ==
"tx")
637 jvRequest[jss::transactions] =
true;
638 jvRequest[jss::expand] =
true;
653 if (strLedger.
length() == 64)
655 jvRequest[jss::ledger_hash] = strLedger;
659 jvRequest[jss::ledger_index] =
660 beast::lexicalCast<std::uint32_t>(strLedger);
672 jvRequest[jss::index] = jvParams[0u].
asString();
674 if (jvParams.
size() == 2 &&
690 if (jvParams.
size() == 1)
692 jvRequest[jss::severity] = jvParams[0u].
asString();
694 else if (jvParams.
size() == 2)
696 jvRequest[jss::partition] = jvParams[0u].
asString();
697 jvRequest[jss::severity] = jvParams[1u].
asString();
738 unsigned int index = 0;
740 if (jvParams.
size() == 4)
742 jvRequest[jss::passphrase] = jvParams[index];
747 jvRequest[jss::key_type] = jvParams[index];
752 jvRequest[jss::secret] = jvParams[index];
761 jvRequest[jss::channel_id] =
to_string(channelId);
765 if (!jvParams[index].isString() ||
768 jvRequest[jss::amount] = jvParams[index];
787 jvRequest[jss::public_key] = strPk;
794 jvRequest[jss::channel_id] = jvParams[1u].
asString();
796 if (!jvParams[2u].isString() || !
to_uint64(jvParams[2u].asString()))
798 jvRequest[jss::amount] = jvParams[2u];
800 jvRequest[jss::signature] = jvParams[3u].
asString();
809 auto const nParams = jvParams.
size();
811 for (
auto i = 0; i < nParams; ++i)
815 if (i == 1 && strParam.
empty())
821 if (parseBase58<AccountID>(strParam))
823 jvRequest[accFields[i]] = std::move(strParam);
846 unsigned int iCursor = jvParams.
size();
848 if (!parseBase58<AccountID>(strIdent))
854 jvRequest[jss::account] = strIdent;
856 if (iCursor == 2 && !
jvParseLedger(jvRequest, jvParams[1u].asString()))
867 if (!
id.parseHex(strVaultID))
871 jvRequest[jss::vault_id] = strVaultID;
873 if (jvParams.
size() > 1)
884 jvRequest[jss::public_key] = jvParams[0u].
asString();
885 if (jvParams.
size() > 1)
887 jvRequest[jss::description] = jvParams[1u].
asString();
897 jvRequest[jss::public_key] = jvParams[0u].
asString();
907 bool bLedger = 2 == jvParams.
size();
909 JLOG(
j_.
trace()) <<
"RPC json: " << jvParams[0u];
937 jvRequest[jss::tx_json] = txJSON;
941 jvRequest[jss::tx_blob] = jvParams[0u].
asString();
944 if (jvParams.
size() == 2)
946 if (!jvParams[1u].isString() || jvParams[1u].asString() !=
"binary")
948 jvRequest[jss::binary] =
true;
964 bool const bOffline =
965 jvParams.
size() >= 3 && jvParams[2u].
asString() ==
"offline";
968 if (jvParams.
size() < 3)
970 if (jvParams.
size() < 4 && bOffline)
976 if (1 == jvParams.
size())
982 jvRequest[jss::tx_blob] = jvParams[0u].
asString();
987 (jvParams.
size() >= 2 || bOffline) &&
993 jvRequest[jss::secret] = jvParams[0u].
asString();
994 jvRequest[jss::tx_json] = txJSON;
997 jvRequest[jss::offline] =
true;
1000 jvRequest[jss::signature_target] = *field;
1014 if (1 == jvParams.
size())
1021 jvRequest[jss::tx_json] = txJSON;
1035 jvParams.
size() == 2,
1036 "ripple::RPCParser::parseTransactionEntry : valid parameter count");
1039 if (txHash.
length() != 64)
1043 jvRequest[jss::tx_hash] = txHash;
1049 if (jvRequest.isMember(jss::ledger_index) &&
1050 jvRequest[jss::ledger_index] == 0)
1062 if (jvParams.
size() == 2 || jvParams.
size() == 4)
1064 if (jvParams[1u].asString() == jss::binary)
1065 jvRequest[jss::binary] =
true;
1068 if (jvParams.
size() >= 3)
1070 auto const offset = jvParams.
size() == 3 ? 0 : 1;
1072 jvRequest[jss::min_ledger] = jvParams[1u + offset].
asString();
1073 jvRequest[jss::max_ledger] = jvParams[2u + offset].
asString();
1076 if (jvParams[0u].asString().length() == 16)
1077 jvRequest[jss::ctid] = jvParams[0u].
asString();
1079 jvRequest[jss::transaction] = jvParams[0u].
asString();
1090 jvRequest[jss::start] = jvParams[0u].
asUInt();
1106 if (jvParams.
size())
1107 jvRequest[jss::secret] = jvParams[0u].
asString();
1120 if (jvParams.
size())
1121 jvRequest[jss::passphrase] = jvParams[0u].
asString();
1133 unsigned int index = 0;
1134 unsigned int const size = jvParams.
size();
1142 if (param[0] !=
'r')
1144 if (param.
size() == 64)
1145 jvRequest[jss::ledger_hash] = param;
1147 jvRequest[jss::ledger_index] = param;
1152 param = jvParams[index++].
asString();
1155 jvRequest[jss::account] = param;
1161 while (index < size)
1162 hotWallets.
append(jvParams[index++].asString());
1174 if (jvParams.
size() == 1)
1176 jvRequest[jss::hash] = jvParams[0u].
asString();
1187 if (jvParams.
size() == 1 && jvParams[0u].
asString() ==
"counters")
1188 jvRequest[jss::counters] =
true;
1208 bool allowAnyCommand)
1212 stream <<
"Method: '" << strMethod <<
"'";
1213 stream <<
"Params: " << jvParams;
1224 static constexpr Command commands[] = {
1269 {
"peer_reservations_add",
1273 {
"peer_reservations_del",
1304 auto const count = jvParams.
size();
1306 for (
auto const& command : commands)
1308 if (strMethod == command.name)
1310 if ((command.minParams >= 0 && count < command.minParams) ||
1311 (command.maxParams >= 0 && count > command.maxParams))
1314 <<
"Wrong number of parameters for " << command.name
1315 <<
" minimum=" << command.minParams
1316 <<
" maximum=" << command.maxParams
1317 <<
" actual=" << count;
1322 return (this->*(command.parse))(jvParams);
1327 if (!allowAnyCommand)
1352 request[jss::method] = strMethod;
1353 request[jss::params] = params;
1354 request[jss::id] = id;
1375 (*jvOutput) = jvInput;
1381 boost::system::error_code
const& ecResult,
1392 if (strData.
empty())
1393 Throw<std::runtime_error>(
1394 "no response from server. Please "
1395 "ensure that the rippled server is running in another "
1400 if (strData.
find(
"Unable to parse request") == 0 ||
1401 strData.
find(jss::invalid_API_version.c_str()) == 0)
1402 Throw<RequestNotParseable>(strData);
1405 if (!reader.
parse(strData, jvReply))
1406 Throw<std::runtime_error>(
"couldn't parse reply from server");
1409 Throw<std::runtime_error>(
1410 "expected reply to have result, error and id properties");
1414 jvResult[
"result"] = jvReply;
1416 (callbackFuncP)(jvResult);
1429 boost::asio::streambuf& sb,
1433 JLOG(j.
debug()) <<
"requestRPC: strPath='" << strPath <<
"'";
1451 unsigned int apiVersion,
1459 for (
int i = 1; i != args.
size(); i++)
1460 jvRpcParams.
append(args[i]);
1464 retParams[jss::method] = args[0];
1465 retParams[jss::params] = jvRpcParams;
1467 jvRequest = rpParser.
parseCommand(args[0], jvRpcParams,
true);
1469 auto insert_api_version = [apiVersion](
Json::Value& jr) {
1470 if (jr.isObject() && !jr.isMember(jss::error) &&
1471 !jr.isMember(jss::api_version))
1473 jr[jss::api_version] = apiVersion;
1478 insert_api_version(jvRequest);
1493 unsigned int apiVersion,
1498 "Expect specific rpc enum values.");
1512 if (jvRequest.
isMember(jss::error))
1514 jvOutput = jvRequest;
1515 jvOutput[
"rpc"] = jvRpc;
1547 jvParams.
append(jvRequest);
1551 jvParams.
append(jvRequest[i]);
1555 boost::asio::io_context isService;
1565 ? jvRequest[jss::method].
asString()
1566 : jvRequest.
isArray() ?
"batch" : args[0],
1574 std::placeholders::_1),
1582 jvOutput = jvOutput[
"result"];
1593 jvOutput[
"result"] = jvRpcError;
1601 jvOutput[
"request_sent"] =
1608 jvOutput[jss::status] =
"error";
1609 if (jvOutput.
isMember(jss::error_code))
1610 nRet =
std::stoi(jvOutput[jss::error_code].asString());
1611 else if (jvOutput[jss::error].isMember(jss::error_code))
1613 std::stoi(jvOutput[jss::error][jss::error_code].asString());
1621 catch (RequestNotParseable& e)
1624 jvOutput[
"error_what"] = e.what();
1630 jvOutput[
"error_what"] = e.what();
1634 return {nRet, std::move(jvOutput)};
1650 std::cout << result.second.toStyledString();
1652 return result.first;
1659 boost::asio::io_context& io_context,
1673 auto j = logs.
journal(
"HTTPClient");
1678 JLOG(j.info()) << (bSSL ?
"Securely connecting to " :
"Connecting to ")
1683 headers[
"Authorization"] =
1690 constexpr auto RPC_REPLY_MAX_BYTES =
megabytes(256);
1692 using namespace std::chrono_literals;
1693 auto constexpr RPC_WEBHOOK_TIMEOUT = 30s;
1706 std::placeholders::_1,
1707 std::placeholders::_2,
1709 RPC_REPLY_MAX_BYTES,
1710 RPC_WEBHOOK_TIMEOUT,
1714 std::placeholders::_1,
1715 std::placeholders::_2,
1716 std::placeholders::_3,
Unserialize a JSON document into a Value.
bool parse(std::string const &document, Value &root)
Read a Value from a JSON document.
const_iterator begin() const
Value & append(Value const &value)
Append value to array at the end.
UInt size() const
Number of values in array or object.
const_iterator end() const
bool isObjectOrNull() const
std::string asString() const
Returns the unquoted string value.
bool isNull() const
isNull() tests to see if this field is null.
bool isMember(char const *key) const
Return true if the object has a member named key.
A generic endpoint for log messages.
Stream trace() const
Severity stream access functions.
std::optional< beast::IP::Endpoint > rpc_ip
static void request(bool bSSL, boost::asio::io_context &io_context, std::string strSite, unsigned short const port, std::function< void(boost::asio::streambuf &sb, std::string const &strHost)> build, std::size_t responseMax, std::chrono::seconds timeout, std::function< bool(boost::system::error_code const &ecResult, int iStatus, std::string const &strData)> complete, beast::Journal &j)
Manages partitions for logging.
beast::Journal journal(std::string const &name)
Json::Value parseLedger(Json::Value const &jvParams)
Json::Value parseValidationCreate(Json::Value const &jvParams)
Json::Value parseBookOffers(Json::Value const &jvParams)
Json::Value parseTxHistory(Json::Value const &jvParams)
Json::Value parseLedgerId(Json::Value const &jvParams)
Json::Value parseCommand(std::string strMethod, Json::Value jvParams, bool allowAnyCommand)
Json::Value parseGatewayBalances(Json::Value const &jvParams)
RPCParser(unsigned apiVersion, beast::Journal j)
Json::Value parseAccountItems(Json::Value const &jvParams)
unsigned const apiVersion_
Json::Value parseJson(Json::Value const &jvParams)
Json::Value parseAccountRaw1(Json::Value const &jvParams)
Json::Value parseFetchInfo(Json::Value const &jvParams)
Json::Value parseSubmitMultiSigned(Json::Value const &jvParams)
Json::Value parseAccountChannels(Json::Value const &jvParams)
Json::Value parseInternal(Json::Value const &jvParams)
static Json::Value jvParseCurrencyIssuer(std::string const &strCurrencyIssuer)
Json::Value parseSimulate(Json::Value const &jvParams)
Json::Value parseEvented(Json::Value const &jvParams)
Json::Value parseDepositAuthorized(Json::Value const &jvParams)
Json::Value parseAccountTransactions(Json::Value const &jvParams)
Json::Value parseChannelVerify(Json::Value const &jvParams)
Json::Value parseGetCounts(Json::Value const &jvParams)
Json::Value parseLogLevel(Json::Value const &jvParams)
bool isValidJson2(Json::Value const &jv)
Json::Value parseConnect(Json::Value const &jvParams)
static bool validPublicKey(std::string const &strPk, TokenType type=TokenType::AccountPublic)
Json::Value(RPCParser::*)(Json::Value const &jvParams) parseFuncPtr
Json::Value parseCanDelete(Json::Value const &jvParams)
Json::Value parseWalletPropose(Json::Value const &jvParams)
Json::Value parseJson2(Json::Value const &jvParams)
Json::Value parseChannelAuthorize(Json::Value const &jvParams)
Json::Value parseAccountCurrencies(Json::Value const &jvParams)
Json::Value parsePeerReservationsDel(Json::Value const &jvParams)
Json::Value parseVault(Json::Value const &jvParams)
Json::Value parseLedgerEntry(Json::Value const &jvParams)
Json::Value parseTx(Json::Value const &jvParams)
Json::Value parseServerInfo(Json::Value const &jvParams)
Json::Value parseAsIs(Json::Value const &jvParams)
Json::Value parsePeerReservationsAdd(Json::Value const &jvParams)
Json::Value parseRipplePathFind(Json::Value const &jvParams)
Json::Value parseServerDefinitions(Json::Value const &jvParams)
Json::Value parseTransactionEntry(Json::Value const &jvParams)
Json::Value parseFeature(Json::Value const &jvParams)
Json::Value parseManifest(Json::Value const &jvParams)
Json::Value parseAccountRaw2(Json::Value const &jvParams, char const *const acc2Field)
static bool jvParseLedger(Json::Value &jvRequest, std::string const &strLedger)
Json::Value parseSignSubmit(Json::Value const &jvParams)
Json::Value parseAccountLines(Json::Value const &jvParams)
Json::Value parseSignFor(Json::Value const &jvParams)
constexpr bool parseHex(std::string_view sv)
Parse a hex string into a base_uint.
T find_first_not_of(T... args)
T find_last_of(T... args)
JSON (JavaScript Object Notation).
@ arrayValue
array value (ordered list)
@ objectValue
object value (collection of name/value pairs).
void fromNetwork(boost::asio::io_context &io_context, std::string const &strIp, std::uint16_t const iPort, std::string const &strUsername, std::string const &strPassword, std::string const &strPath, std::string const &strMethod, Json::Value const &jvParams, bool const bSSL, bool const quiet, Logs &logs, std::function< void(Json::Value const &jvInput)> callbackFuncP, std::unordered_map< std::string, std::string > headers)
int fromCommandLine(Config const &config, std::vector< std::string > const &vCmd, Logs &logs)
Json::Value invalid_field_error(std::string const &name)
Json::Value make_param_error(std::string const &message)
Returns a new json object that indicates invalid parameters.
static constexpr auto apiCommandLineVersion
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
std::optional< KeyType > keyTypeFromString(std::string const &s)
std::string toBase58(AccountID const &v)
Convert AccountID to base58 checked string.
constexpr auto megabytes(T value) noexcept
std::pair< int, Json::Value > rpcClient(std::vector< std::string > const &args, Config const &config, Logs &logs, unsigned int apiVersion, std::unordered_map< std::string, std::string > const &headers)
Internal invocation of RPC client.
static std::string const & systemName()
std::optional< Blob > strUnHex(std::size_t strSize, Iterator begin, Iterator end)
std::string createHTTPPost(std::string const &strHost, std::string const &strPath, std::string const &strMsg, std::unordered_map< std::string, std::string > const &mapRequestHeaders)
@ rpcCHANNEL_AMT_MALFORMED
std::optional< std::uint64_t > to_uint64(std::string const &s)
Json::Value rpcError(int iError)
std::optional< KeyType > publicKeyType(Slice const &slice)
Returns the type of public key.
bool isRpcError(Json::Value jvResult)
std::enable_if_t< std::is_same< T, char >::value||std::is_same< T, unsigned char >::value, Slice > makeSlice(std::array< T, N > const &a)
ServerHandler::Setup setup_ServerHandler(Config const &config, std::ostream &&log)
std::string base64_encode(std::uint8_t const *data, std::size_t len)
std::string JSONRPCRequest(std::string const &strMethod, Json::Value const ¶ms, Json::Value const &id)
Json::Value rpcCmdToJson(std::vector< std::string > const &args, Json::Value &retParams, unsigned int apiVersion, beast::Journal j)
std::string to_string(base_uint< Bits, Tag > const &a)
static void callRPCHandler(Json::Value *jvOutput, Json::Value const &jvInput)
static bool onResponse(std::function< void(Json::Value const &jvInput)> callbackFuncP, boost::system::error_code const &ecResult, int iStatus, std::string const &strData, beast::Journal j)
static void onRequest(std::string const &strMethod, Json::Value const &jvParams, std::unordered_map< std::string, std::string > const &headers, std::string const &strPath, boost::asio::streambuf &sb, std::string const &strHost, beast::Journal j)
std::string admin_password