1#include <xrpld/rpc/RPCCall.h>
3#include <xrpld/core/Config.h>
4#include <xrpld/rpc/MethodNames.h>
5#include <xrpld/rpc/ServerHandler.h>
7#include <xrpl/basics/ByteUtilities.h>
8#include <xrpl/basics/Log.h>
9#include <xrpl/basics/Slice.h>
10#include <xrpl/basics/StringUtilities.h>
11#include <xrpl/basics/base64.h>
12#include <xrpl/basics/base_uint.h>
13#include <xrpl/basics/contract.h>
14#include <xrpl/beast/core/LexicalCast.h>
15#include <xrpl/beast/utility/Journal.h>
16#include <xrpl/beast/utility/Zero.h>
17#include <xrpl/beast/utility/instrumentation.h>
18#include <xrpl/json/json_forwards.h>
19#include <xrpl/json/json_reader.h>
20#include <xrpl/json/json_value.h>
21#include <xrpl/json/to_string.h>
22#include <xrpl/net/HTTPClient.h>
23#include <xrpl/protocol/AccountID.h>
24#include <xrpl/protocol/ApiVersion.h>
25#include <xrpl/protocol/ErrorCodes.h>
26#include <xrpl/protocol/KeyType.h>
27#include <xrpl/protocol/PublicKey.h>
28#include <xrpl/protocol/RPCErr.h>
29#include <xrpl/protocol/SystemParameters.h>
30#include <xrpl/protocol/jss.h>
31#include <xrpl/protocol/tokens.h>
33#include <boost/algorithm/string/predicate.hpp>
34#include <boost/asio/io_context.hpp>
35#include <boost/asio/streambuf.hpp>
36#include <boost/regex/v5/regex.hpp>
37#include <boost/regex/v5/regex_match.hpp>
38#include <boost/system/detail/error_code.hpp>
79 using Function = json::Value (RPCParser::*)(json::Value
const& jvParams);
87 template <Function Fn>
88 static constexpr Parse
105 operator()(RPCParser& parser, json::Value
const& jvParams)
const;
108 constexpr explicit Parse(Function fn) noexcept : fn_(fn)
126 std::string_view name;
128 unsigned minParams = 0;
129 unsigned maxParams = kUnlimitedParams;
154 s <<
"POST " << (strPath.
empty() ?
"/" : strPath) <<
" HTTP/1.0\r\n"
155 <<
"User-Agent: " <<
systemName() <<
"-json-rpc/v1\r\n"
156 <<
"Host: " << strHost <<
"\r\n"
157 <<
"Content-Type: application/json\r\n"
158 <<
"Content-Length: " << strMsg.
size() <<
"\r\n"
159 <<
"Accept: application/json\r\n";
161 for (
auto const& [k, v] : mapRequestHeaders)
162 s << k <<
": " << v <<
"\r\n";
164 s <<
"\r\n" << strMsg;
180 if (strLedger ==
"current" || strLedger ==
"closed" || strLedger ==
"validated")
182 jvRequest[jss::ledger_index] = strLedger;
184 else if (strLedger.
length() == 64)
187 jvRequest[jss::ledger_hash] = strLedger;
206 static boost::regex
const kReCurIss(
"\\`([][:alnum:]<>(){}[|?!@#$%^&*]{3})(?:/(.+))?\\'");
208 boost::smatch smMatch;
210 if (boost::regex_match(strCurrencyIssuer, smMatch, kReCurIss))
216 jvResult[jss::currency] = strCurrency;
218 if (!strIssuer.
empty())
221 jvResult[jss::issuer] = strIssuer;
228 std::string(
"Invalid currency/issuer '") + strCurrencyIssuer +
"'");
257 v[jss::params] = jvParams;
267 v[jss::internal_command] = jvParams[0u];
271 for (
unsigned i = 1; i < jvParams.
size(); ++i)
272 params.
append(jvParams[i]);
274 v[jss::params] = params;
283 if (jvParams.
size() == 1)
291 jvRequest[jss::public_key] = strPk;
305 unsigned int const iParams = jvParams.
size();
308 jvRequest[jvParams[0u].
asString()] =
true;
320 unsigned int iParams = jvParams.
size();
326 jvRequest[jss::account] =
toBase58(*account);
330 while (!bDone && iParams >= 2)
333 if (jvParams[iParams - 1].asString() == jss::binary)
335 jvRequest[jss::binary] =
true;
338 else if (jvParams[iParams - 1].asString() == jss::count)
340 jvRequest[jss::count] =
true;
343 else if (jvParams[iParams - 1].asString() == jss::descending)
345 jvRequest[jss::descending] =
true;
357 else if (2 == iParams)
367 if (uLedgerMax != -1 && uLedgerMax < uLedgerMin)
374 jvRequest[jss::ledger_index_min] = jvParams[1u].
asInt();
375 jvRequest[jss::ledger_index_max] = jvParams[2u].
asInt();
378 jvRequest[jss::limit] = jvParams[3u].
asInt();
381 jvRequest[jss::offset] = jvParams[4u].
asInt();
405 jvRequest[jss::taker_pays] = jvTakerPays;
412 jvRequest[jss::taker_gets] = jvTakerGets;
414 if (jvParams.
size() >= 3)
416 jvRequest[jss::issuer] = jvParams[2u].
asString();
422 if (jvParams.
size() >= 5)
426 int const iLimit = jvParams[4u].
asInt();
429 jvRequest[jss::limit] = iLimit;
437 if (jvParams.
size() >= 6)
441 int const bProof = jvParams[5u].
asInt();
443 jvRequest[jss::proof] =
true;
451 if (jvParams.
size() == 7)
452 jvRequest[jss::marker] = jvParams[6u];
464 if (jvParams.
size() == 0u)
470 jvRequest[
"can_delete"] = jvParams[0u].
asUInt();
474 jvRequest[
"can_delete"] = input;
487 if (jvParams.
size() == 2)
489 jvRequest[jss::ip] = ip;
490 jvRequest[jss::port] = jvParams[1u].
asUInt();
504 jvRequest[jss::ip] = ip;
515 jvRequest[jss::source_account] = jvParams[0u].
asString();
516 jvRequest[jss::destination_account] = jvParams[1u].
asString();
518 if (jvParams.
size() >= 3)
522 if ((jvParams.
size() >= 4) && (jvParams.
size() <= 11))
525 for (uint32_t i = 3; i < jvParams.
size(); ++i)
526 jvRequest[jss::credentials].append(jvParams[i].asString());
547 if (jvParams.
size() > 0)
548 jvRequest[jss::feature] = jvParams[0u].
asString();
550 if (jvParams.
size() > 1)
552 auto const action = jvParams[1u].
asString();
557 if (boost::iequals(action,
"reject"))
561 else if (boost::iequals(action,
"accept"))
581 if (jvParams.
size() != 0u)
582 jvRequest[jss::min_count] = jvParams[0u].
asUInt();
593 bool const bOffline = 4 == jvParams.
size() && jvParams[3u].
asString() ==
"offline";
595 if (3 == jvParams.
size() || bOffline)
604 jvRequest[jss::account] = jvParams[0u].
asString();
605 jvRequest[jss::secret] = jvParams[1u].
asString();
606 jvRequest[jss::tx_json] = txJSON;
609 jvRequest[jss::offline] =
true;
624 JLOG(
j_.trace()) <<
"RPC method: " << jvParams[0u];
625 JLOG(
j_.trace()) <<
"RPC json: " << jvParams[1u];
632 jvRequest[jss::method] = jvParams[0u];
650 jv.
begin(), jv.
end(), [
this](
auto const& j) { return isValidJson2(j); });
654 if (jv.
isMember(jss::jsonrpc) && jv[jss::jsonrpc] ==
"2.0" &&
655 jv.
isMember(jss::ripplerpc) && jv[jss::ripplerpc] ==
"2.0" &&
659 (jv[jss::params].
isNull() || jv[jss::params].isArray() ||
660 jv[jss::params].isObject());
671 bool const validParse = reader.
parse(jvParams[0u].asString(), jv);
679 auto const& params = jv[jss::params];
680 for (
auto i = params.begin(); i != params.end(); ++i)
681 jv1[i.key().asString()] = *i;
683 jv1[jss::jsonrpc] = jv[jss::jsonrpc];
684 jv1[jss::ripplerpc] = jv[jss::ripplerpc];
685 jv1[jss::id] = jv[jss::id];
686 jv1[jss::method] = jv[jss::method];
693 if (jv[j].isMember(jss::params))
695 auto const& params = jv[j][jss::params];
696 for (
auto i = params.begin(); i != params.end(); ++i)
697 jv1[j][i.key().asString()] = *i;
699 jv1[j][jss::jsonrpc] = jv[j][jss::jsonrpc];
700 jv1[j][jss::ripplerpc] = jv[j][jss::ripplerpc];
701 jv1[j][jss::id] = jv[j][jss::id];
702 jv1[j][jss::method] = jv[j][jss::method];
708 jvError[jss::jsonrpc] = jv[jss::jsonrpc];
710 jvError[jss::ripplerpc] = jv[jss::ripplerpc];
712 jvError[jss::id] = jv[jss::id];
723 if (jvParams.
size() == 0u)
730 if (2 == jvParams.
size())
732 if (jvParams[1u].asString() ==
"full")
734 jvRequest[jss::full] =
true;
736 else if (jvParams[1u].asString() ==
"tx")
738 jvRequest[jss::transactions] =
true;
739 jvRequest[jss::expand] =
true;
755 if (strLedger.
length() == 64)
757 jvRequest[jss::ledger_hash] = strLedger;
774 jvRequest[jss::index] = jvParams[0u].
asString();
792 if (jvParams.
size() == 1)
794 jvRequest[jss::severity] = jvParams[0u].
asString();
796 else if (jvParams.
size() == 2)
798 jvRequest[jss::partition] = jvParams[0u].
asString();
799 jvRequest[jss::severity] = jvParams[1u].
asString();
841 unsigned int index = 0;
843 if (jvParams.
size() == 4)
845 jvRequest[jss::passphrase] = jvParams[index];
850 jvRequest[jss::key_type] = jvParams[index];
855 jvRequest[jss::secret] = jvParams[index];
864 jvRequest[jss::channel_id] =
to_string(channelId);
868 if (!jvParams[index].isString() || !
toUInt64(jvParams[index].asString()))
870 jvRequest[jss::amount] = jvParams[index];
890 jvRequest[jss::public_key] = strPk;
897 jvRequest[jss::channel_id] = jvParams[1u].
asString();
899 if (!jvParams[2u].isString() || !
toUInt64(jvParams[2u].asString()))
901 jvRequest[jss::amount] = jvParams[2u];
903 jvRequest[jss::signature] = jvParams[3u].
asString();
913 auto const nParams = jvParams.
size();
915 for (
auto i = 0; i < nParams; ++i)
920 if (i == 1 && strParam.
empty())
931 jvRequest[accFields[i]] = strParam;
955 unsigned int const iCursor = jvParams.
size();
963 jvRequest[jss::account] = strIdent;
965 if (iCursor == 2 && !
jvParseLedger(jvRequest, jvParams[1u].asString()))
977 if (!
id.parseHex(strVaultID))
981 jvRequest[jss::vault_id] = strVaultID;
983 if (jvParams.
size() > 1)
995 jvRequest[jss::public_key] = jvParams[0u].
asString();
996 if (jvParams.
size() > 1)
998 jvRequest[jss::description] = jvParams[1u].
asString();
1009 jvRequest[jss::public_key] = jvParams[0u].
asString();
1019 bool const bLedger = 2 == jvParams.
size();
1021 JLOG(
j_.trace()) <<
"RPC json: " << jvParams[0u];
1050 jvRequest[jss::tx_json] = txJSON;
1054 jvRequest[jss::tx_blob] = jvParams[0u].
asString();
1057 if (jvParams.
size() == 2)
1059 if (!jvParams[1u].isString() || jvParams[1u].asString() !=
"binary")
1061 jvRequest[jss::binary] =
true;
1078 bool const bOffline = jvParams.
size() >= 3 && jvParams[2u].
asString() ==
"offline";
1081 if (jvParams.
size() < 3)
1082 return std::nullopt;
1083 if (jvParams.
size() < 4 && bOffline)
1084 return std::nullopt;
1089 if (1 == jvParams.
size())
1095 jvRequest[jss::tx_blob] = jvParams[0u].
asString();
1099 if ((jvParams.
size() >= 2 || bOffline) && reader.
parse(jvParams[1u].
asString(), txJSON))
1104 jvRequest[jss::secret] = jvParams[0u].
asString();
1105 jvRequest[jss::tx_json] = txJSON;
1108 jvRequest[jss::offline] =
true;
1111 jvRequest[jss::signature_target] = *field;
1126 if (1 == jvParams.
size())
1133 jvRequest[jss::tx_json] = txJSON;
1148 jvParams.
size() == 2,
"xrpl::RPCParser::parseTransactionEntry : valid parameter count");
1151 if (txHash.
length() != 64)
1155 jvRequest[jss::tx_hash] = txHash;
1161 if (jvRequest.
isMember(jss::ledger_index) && jvRequest[jss::ledger_index] == 0)
1174 if (jvParams.
size() == 2 || jvParams.
size() == 4)
1176 if (jvParams[1u].asString() == jss::binary)
1177 jvRequest[jss::binary] =
true;
1180 if (jvParams.
size() >= 3)
1182 auto const offset = jvParams.
size() == 3 ? 0 : 1;
1184 jvRequest[jss::min_ledger] = jvParams[1u + offset].
asString();
1185 jvRequest[jss::max_ledger] = jvParams[2u + offset].
asString();
1188 if (jvParams[0u].asString().length() == 16)
1190 jvRequest[jss::ctid] = jvParams[0u].
asString();
1194 jvRequest[jss::transaction] = jvParams[0u].
asString();
1207 jvRequest[jss::start] = jvParams[0u].
asUInt();
1224 if (jvParams.
size() != 0u)
1225 jvRequest[jss::secret] = jvParams[0u].
asString();
1239 if (jvParams.
size() != 0u)
1240 jvRequest[jss::passphrase] = jvParams[0u].
asString();
1253 unsigned int index = 0;
1254 unsigned int const size = jvParams.
size();
1262 if (param[0] !=
'r')
1264 if (param.
size() == 64)
1266 jvRequest[jss::ledger_hash] = param;
1270 jvRequest[jss::ledger_index] = param;
1276 param = jvParams[index++].
asString();
1279 jvRequest[jss::account] = param;
1284 while (index < size)
1285 hotWallets.
append(jvParams[index++].asString());
1298 if (jvParams.
size() == 1)
1300 jvRequest[jss::hash] = jvParams[0u].
asString();
1312 if (jvParams.
size() == 1 && jvParams[0u].
asString() ==
"counters")
1313 jvRequest[jss::counters] =
true;
1328 .parse = Parse::of<&RPCParser::parseAccountCurrencies>(),
1334 .parse = Parse::of<&RPCParser::parseAccountItems>(),
1340 .parse = Parse::of<&RPCParser::parseAccountLines>(),
1346 .parse = Parse::of<&RPCParser::parseAccountChannels>(),
1352 .parse = Parse::of<&RPCParser::parseAccountItems>(),
1358 .parse = Parse::of<&RPCParser::parseAccountItems>(),
1364 .parse = Parse::of<&RPCParser::parseAccountItems>(),
1370 .parse = Parse::of<&RPCParser::parseAccountTransactions>(),
1376 .parse = Parse::of<&RPCParser::parseAsIs>(),
1382 .parse = Parse::of<&RPCParser::parseVault>(),
1388 .parse = Parse::of<&RPCParser::parseLedgerId>(),
1394 .parse = Parse::of<&RPCParser::parseBookOffers>(),
1400 .parse = Parse::of<&RPCParser::parseCanDelete>(),
1405 .parse = Parse::of<&RPCParser::parseChannelAuthorize>(),
1411 .parse = Parse::of<&RPCParser::parseChannelVerify>(),
1417 .parse = Parse::of<&RPCParser::parseConnect>(),
1423 .parse = Parse::of<&RPCParser::parseAsIs>(),
1428 .parse = Parse::of<&RPCParser::parseDepositAuthorized>(),
1434 .parse = Parse::of<&RPCParser::parseFeature>(),
1439 .parse = Parse::of<&RPCParser::parseFetchInfo>(),
1444 .parse = Parse::of<&RPCParser::parseGatewayBalances>(),
1449 .parse = Parse::of<&RPCParser::parseGetCounts>(),
1454 .parse = Parse::of<&RPCParser::parseJson>(),
1460 .parse = Parse::of<&RPCParser::parseJson2>(),
1466 .parse = Parse::of<&RPCParser::parseLedger>(),
1471 .parse = Parse::of<&RPCParser::parseAsIs>(),
1476 .parse = Parse::of<&RPCParser::parseAsIs>(),
1481 .parse = Parse::of<&RPCParser::parseAsIs>(),
1486 .parse = Parse::of<&RPCParser::parseLedgerEntry>(),
1492 .parse = Parse::of<&RPCParser::parseLedgerId>(),
1498 .parse = Parse::of<&RPCParser::parseLedgerId>(),
1504 .parse = Parse::of<&RPCParser::parseLogLevel>(),
1509 .parse = Parse::of<&RPCParser::parseAsIs>(),
1514 .parse = Parse::of<&RPCParser::parseManifest>(),
1520 .parse = Parse::of<&RPCParser::parseAccountItems>(),
1526 .parse = Parse::of<&RPCParser::parseAsIs>(),
1531 .parse = Parse::of<&RPCParser::parseAsIs>(),
1536 .parse = Parse::of<&RPCParser::parseAsIs>(),
1541 .parse = Parse::of<&RPCParser::parseAsIs>(),
1546 .parse = Parse::of<&RPCParser::parsePeerReservationsAdd>(),
1552 .parse = Parse::of<&RPCParser::parsePeerReservationsDel>(),
1558 .parse = Parse::of<&RPCParser::parseAsIs>(),
1563 .parse = Parse::of<&RPCParser::parseRipplePathFind>(),
1569 .parse = Parse::of<&RPCParser::parseServerDefinitions>(),
1574 .parse = Parse::of<&RPCParser::parseServerInfo>(),
1579 .parse = Parse::of<&RPCParser::parseServerInfo>(),
1584 .parse = Parse::of<&RPCParser::parseSignSubmit>(),
1590 .parse = Parse::of<&RPCParser::parseSignFor>(),
1596 .parse = Parse::of<&RPCParser::parseAsIs>(),
1601 .parse = Parse::of<&RPCParser::parseSimulate>(),
1607 .parse = Parse::of<&RPCParser::parseSignSubmit>(),
1613 .parse = Parse::of<&RPCParser::parseSubmitMultiSigned>(),
1619 .parse = Parse::of<&RPCParser::parseTransactionEntry>(),
1625 .parse = Parse::of<&RPCParser::parseTx>(),
1631 .parse = Parse::of<&RPCParser::parseTxHistory>(),
1637 .parse = Parse::of<&RPCParser::parseAsIs>(),
1642 .parse = Parse::of<&RPCParser::parseValidationCreate>(),
1647 .parse = Parse::of<&RPCParser::parseAsIs>(),
1652 .parse = Parse::of<&RPCParser::parseAsIs>(),
1657 .parse = Parse::of<&RPCParser::parseWalletPropose>(),
1662 .parse = Parse::of<&RPCParser::parseInternal>(),
1669 .parse = Parse::of<&RPCParser::parseEvented>(),
1673 .parse = Parse::of<&RPCParser::parseEvented>(),
1677 .parse = Parse::of<&RPCParser::parseEvented>(),
1692 "xrpl::RPCParser : kSortedCommands must be sorted");
1726 static constexpr bool
1732 if (command.name.empty() || command.minParams > command.maxParams)
1753 if (
auto stream =
j_.trace())
1755 stream <<
"Method: '" << strMethod <<
"'";
1756 stream <<
"Params: " << jvParams;
1764 if (!allowAnyCommand)
1770 auto const count = jvParams.
size();
1771 if (count < found->minParams || count > found->maxParams)
1773 JLOG(
j_.debug()) <<
"Wrong number of parameters for " << found->name
1774 <<
" minimum=" << found->minParams <<
" maximum=" << found->maxParams
1775 <<
" actual=" << count;
1780 return found->parse(*
this, jvParams);
1788Parse::operator()(RPCParser& parser,
json::Value const& jvParams)
const
1790 return (parser.*fn_)(jvParams);
1798 "xrpl::RPCParser : every command needs a unique name and a valid parameter "
1816 request[jss::method] = strMethod;
1817 request[jss::params] = params;
1818 request[jss::id] = id;
1839 (*jvOutput) = jvInput;
1845 boost::system::error_code
const& ecResult,
1856 if (strData.
empty())
1859 "no response from server. Please "
1860 "ensure that the xrpld server is running in another "
1866 if (strData.
starts_with(
"Unable to parse request") ||
1867 strData.
starts_with(jss::invalid_API_version.cStr()))
1871 if (!reader.
parse(strData, jvReply))
1879 jvResult[
"result"] = jvReply;
1881 callbackFuncP(jvResult);
1894 boost::asio::streambuf& sb,
1898 JLOG(j.
debug()) <<
"requestRPC: strPath='" << strPath <<
"'";
1919 unsigned int apiVersion,
1927 for (
int i = 1; i != args.
size(); i++)
1928 jvRpcParams.
append(args[i]);
1932 retParams[jss::method] = args[0];
1933 retParams[jss::params] = jvRpcParams;
1935 jvRequest = rpParser.parseCommand(args[0], jvRpcParams,
true);
1937 auto insertApiVersion = [apiVersion](
json::Value& jr) {
1938 if (jr.isObject() && !jr.isMember(jss::error) && !jr.isMember(jss::api_version))
1940 jr[jss::api_version] = apiVersion;
1946 insertApiVersion(jvRequest);
1965 unsigned int apiVersion,
1981 if (jvRequest.
isMember(jss::error))
1983 jvOutput = jvRequest;
1984 jvOutput[
"rpc"] = jvRpc;
2016 jvParams.
append(jvRequest);
2021 jvParams.
append(jvRequest[i]);
2025 boost::asio::io_context isService;
2035 if (jvRequest.isMember(jss::method))
2036 return jvRequest[jss::method].asString();
2037 return jvRequest.isArray() ?
"batch" : args[0];
2044 RPCCallImp::callRPCHandler(&jvOutput, jvInput);
2053 jvOutput = jvOutput[
"result"];
2064 jvOutput[
"result"] = jvRpcError;
2070 jvOutput[
"rpc"] = jvRpc;
2071 jvOutput[
"request_sent"] = jvRequest;
2077 jvOutput[jss::status] =
"error";
2078 if (jvOutput.
isMember(jss::error_code))
2080 nRet =
std::stoi(jvOutput[jss::error_code].asString());
2082 else if (jvOutput[jss::error].isMember(jss::error_code))
2084 nRet =
std::stoi(jvOutput[jss::error][jss::error_code].asString());
2095 catch (RequestNotParsable
const& e)
2098 jvOutput[
"error_what"] = e.what();
2104 jvOutput[
"error_what"] = e.what();
2108 return {nRet, std::move(jvOutput)};
2120 std::cout << result.second.toStyledString();
2122 return result.first;
2129 boost::asio::io_context& ioContext,
2143 auto j = logs.
journal(
"HTTPClient");
2148 JLOG(j.info()) << (bSSL ?
"Securely connecting to " :
"Connecting to ") << strIp <<
":"
2153 headers[
"Authorization"] =
2160 constexpr auto kRpcReplyMaxBytes =
megabytes(256);
2162 using namespace std::chrono_literals;
2163 static constexpr auto kRpcWebhookTimeout = 30s;
2170 [strMethod, jvParams, headers, strPath, j](
2171 boost::asio::streambuf& sb,
std::string const& strHost) {
2177 boost::system::error_code
const& ecResult,
int iStatus,
std::string const& strData) {
A generic endpoint for log messages.
Stream trace() const
Severity stream access functions.
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
bool isNull() const
isNull() tests to see if this field is null.
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
std::string asString() const
Returns the unquoted string value.
bool isObjectOrNull() const
bool isMember(char const *key) const
Return true if the object has a member named key.
constexpr bool parseHex(std::string_view sv)
Parse a hex string into a base_uint.
std::optional< beast::ip::Endpoint > rpcIp
static void request(bool bSSL, boost::asio::io_context &ioContext, 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 const &j)
Manages partitions for logging.
beast::Journal journal(std::string const &name)
json::Value parseManifest(json::Value const &jvParams)
json::Value parseJson2(json::Value const &jvParams)
json::Value parseLedgerId(json::Value const &jvParams)
json::Value parseJson(json::Value const &jvParams)
json::Value parseAccountTransactions(json::Value const &jvParams)
json::Value parseSignFor(json::Value const &jvParams)
RPCParser(unsigned apiVersion, beast::Journal j)
json::Value parseLedgerEntry(json::Value const &jvParams)
json::Value parseAccountItems(json::Value const &jvParams)
json::Value parseEvented(json::Value const &jvParams)
static bool validPublicKey(std::string const &strPk, TokenType type=TokenType::AccountPublic)
json::Value parseChannelAuthorize(json::Value const &jvParams)
json::Value parseFeature(json::Value const &jvParams)
json::Value parseChannelVerify(json::Value const &jvParams)
json::Value parseInternal(json::Value const &jvParams)
json::Value parseAccountRaw1(json::Value const &jvParams)
json::Value parseTxHistory(json::Value const &jvParams)
json::Value parseRipplePathFind(json::Value const &jvParams)
json::Value parseValidationCreate(json::Value const &jvParams)
json::Value parseServerDefinitions(json::Value const &jvParams)
json::Value parseServerInfo(json::Value const &jvParams)
json::Value parseCommand(std::string_view strMethod, json::Value const &jvParams, bool allowAnyCommand)
json::Value parseSubmitMultiSigned(json::Value const &jvParams)
json::Value parsePeerReservationsDel(json::Value const &jvParams)
json::Value parseGetCounts(json::Value const &jvParams)
json::Value parseFetchInfo(json::Value const &jvParams)
static std::span< std::string_view const > methodNames()
Names of every method the command line accepts.
json::Value parseLogLevel(json::Value const &jvParams)
static json::Value jvParseCurrencyIssuer(std::string const &strCurrencyIssuer)
json::Value parseWalletPropose(json::Value const &jvParams)
static constexpr auto kSortedCommands
json::Value parseAccountCurrencies(json::Value const &jvParams)
static constexpr bool commandsValid()
Whether the command table is well formed.
static constexpr auto kCommandArray
json::Value parseVault(json::Value const &jvParams)
json::Value parseGatewayBalances(json::Value const &jvParams)
json::Value parseTx(json::Value const &jvParams)
static bool jvParseLedger(json::Value &jvRequest, std::string const &strLedger)
json::Value parseSimulate(json::Value const &jvParams)
json::Value parseConnect(json::Value const &jvParams)
json::Value parseSignSubmit(json::Value const &jvParams)
json::Value parseBookOffers(json::Value const &jvParams)
json::Value parseAccountLines(json::Value const &jvParams)
json::Value parseAccountChannels(json::Value const &jvParams)
json::Value parseTransactionEntry(json::Value const &jvParams)
unsigned const apiVersion_
json::Value parseAsIs(json::Value const &jvParams)
bool isValidJson2(json::Value const &jv)
json::Value parseCanDelete(json::Value const &jvParams)
json::Value parseDepositAuthorized(json::Value const &jvParams)
json::Value(RPCParser::*)(json::Value const &jvParams) ParseFuncPtr
json::Value parsePeerReservationsAdd(json::Value const &jvParams)
json::Value parseLedger(json::Value const &jvParams)
json::Value parseAccountRaw2(json::Value const &jvParams, char const *const acc2Field)
static constexpr auto kCommandNames
T find_first_not_of(T... args)
T find_last_of(T... args)
constexpr Out lexicalCast(In in, Out defaultValue=Out())
Convert from one type to another.
BasicLogstream< char > LogStream
@ Array
array value (ordered list)
@ Object
object value (collection of name/value pairs).
constexpr std::string_view kInternal
constexpr std::string_view kAccountNfts
constexpr std::string_view kPing
constexpr std::string_view kAccountLines
constexpr std::string_view kBookOffers
constexpr std::string_view kAccountOffers
constexpr std::string_view kConnect
constexpr std::string_view kRipplePathFind
constexpr std::string_view kAccountCurrencies
constexpr std::string_view kLedgerCurrent
constexpr std::string_view kPeerReservationsAdd
constexpr std::string_view kChannelAuthorize
constexpr std::string_view kAccountChannels
Names of the RPC methods the server accepts.
constexpr std::string_view kPeerReservationsDel
constexpr std::string_view kLogLevel
constexpr std::string_view kSubmitMultisigned
constexpr std::string_view kWalletPropose
constexpr std::string_view kLedgerAccept
constexpr std::string_view kLedger
constexpr std::string_view kAccountTx
constexpr std::string_view kBookChanges
constexpr std::string_view kValidationCreate
constexpr std::string_view kConsensusInfo
constexpr std::string_view kJson2
constexpr std::string_view kOwnerInfo
constexpr std::string_view kDepositAuthorized
constexpr std::string_view kServerDefinitions
constexpr std::string_view kAmmInfo
constexpr std::string_view kCanDelete
constexpr std::string_view kLogrotate
constexpr std::string_view kLedgerEntry
constexpr std::string_view kChannelVerify
constexpr std::string_view kPeers
constexpr std::string_view kSign
constexpr std::string_view kGetCounts
constexpr std::string_view kVersion
constexpr std::string_view kPathFind
constexpr std::string_view kServerInfo
constexpr std::string_view kAccountObjects
constexpr std::string_view kManifest
constexpr std::string_view kLedgerHeader
constexpr std::string_view kSubmit
constexpr std::string_view kStop
constexpr std::string_view kLedgerClosed
constexpr std::string_view kFetchInfo
constexpr std::string_view kTxHistory
constexpr std::string_view kSubscribe
constexpr std::string_view kValidatorInfo
constexpr std::string_view kTx
constexpr std::string_view kPrint
constexpr std::string_view kTransactionEntry
constexpr std::string_view kVaultInfo
constexpr std::string_view kSimulate
constexpr std::string_view kSignFor
constexpr std::string_view kPeerReservationsList
constexpr std::string_view kFeature
constexpr std::string_view kLedgerRequest
constexpr std::string_view kUnlList
constexpr std::string_view kJson
constexpr std::string_view kRandom
constexpr std::string_view kServerState
constexpr std::string_view kAccountInfo
constexpr std::string_view kUnsubscribe
constexpr std::string_view kGatewayBalances
Processes XRPL RPC calls.
void fromNetwork(boost::asio::io_context &ioContext, 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 makeParamError(std::string const &message)
Returns a new json object that indicates invalid parameters.
json::Value invalidFieldError(std::string const &name)
static constexpr auto kApiCommandLineVersion
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
ServerHandler::Setup setupServerHandler(Config const &config, std::ostream &log)
std::optional< KeyType > keyTypeFromString(std::string const &s)
std::optional< AccountID > parseBase58(std::string const &s)
Parse AccountID from checked, base58 string.
std::string toBase58(AccountID const &v)
Convert AccountID to base58 checked string.
std::string to_string(BaseUInt< Bits, Tag > const &a)
std::string jsonrpcRequest(std::string const &strMethod, json::Value const ¶ms, json::Value const &id)
std::optional< KeyType > publicKeyType(Slice const &slice)
Returns the type of public key.
Slice makeSlice(std::array< T, N > const &a)
json::Value rpcError(ErrorCodeI iError)
json::Value rpcCmdToJson(std::vector< std::string > const &args, json::Value &retParams, unsigned int apiVersion, beast::Journal j)
constexpr auto megabytes(T value) noexcept
std::optional< Blob > strUnHex(std::size_t strSize, Iterator begin, Iterator end)
std::span< std::string_view const > commandLineMethodNames()
Return the names of all methods accepted on the command line.
static std::string const & systemName()
std::string base64Encode(std::uint8_t const *data, std::size_t len)
std::optional< std::uint64_t > toUInt64(std::string const &s)
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.
bool isRpcError(json::Value jvResult)
std::string createHTTPPost(std::string const &strHost, std::string const &strPath, std::string const &strMsg, std::unordered_map< std::string, std::string > const &mapRequestHeaders)
XRPL_NO_SANITIZE_ADDRESS void Throw(Args &&... args)
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 callRPCHandler(json::Value *jvOutput, json::Value const &jvInput)
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 adminPassword