20#include <xrpld/rpc/RPCCall.h> 
   21#include <xrpld/rpc/ServerHandler.h> 
   23#include <xrpl/basics/ByteUtilities.h> 
   24#include <xrpl/basics/Log.h> 
   25#include <xrpl/basics/StringUtilities.h> 
   26#include <xrpl/basics/base64.h> 
   27#include <xrpl/basics/contract.h> 
   28#include <xrpl/beast/core/LexicalCast.h> 
   29#include <xrpl/json/json_forwards.h> 
   30#include <xrpl/json/json_reader.h> 
   31#include <xrpl/json/to_string.h> 
   32#include <xrpl/net/HTTPClient.h> 
   33#include <xrpl/protocol/ApiVersion.h> 
   34#include <xrpl/protocol/ErrorCodes.h> 
   35#include <xrpl/protocol/PublicKey.h> 
   36#include <xrpl/protocol/RPCErr.h> 
   37#include <xrpl/protocol/SystemParameters.h> 
   38#include <xrpl/protocol/UintTypes.h> 
   39#include <xrpl/protocol/jss.h> 
   41#include <boost/algorithm/string/predicate.hpp> 
   42#include <boost/asio/streambuf.hpp> 
   43#include <boost/regex.hpp> 
   74    s << 
"POST " << (strPath.
empty() ? 
"/" : strPath) << 
" HTTP/1.0\r\n" 
   75      << 
"User-Agent: " << 
systemName() << 
"-json-rpc/v1\r\n" 
   76      << 
"Host: " << strHost << 
"\r\n" 
   77      << 
"Content-Type: application/json\r\n" 
   78      << 
"Content-Length: " << strMsg.
size() << 
"\r\n" 
   79      << 
"Accept: application/json\r\n";
 
   81    for (
auto const& [k, v] : mapRequestHeaders)
 
   82        s << k << 
": " << v << 
"\r\n";
 
   84    s << 
"\r\n" << strMsg;
 
 
  100        if (strLedger == 
"current" || strLedger == 
"closed" ||
 
  101            strLedger == 
"validated")
 
  103            jvRequest[jss::ledger_index] = strLedger;
 
  105        else if (strLedger.
length() == 64)
 
  108            jvRequest[jss::ledger_hash] = strLedger;
 
  112            jvRequest[jss::ledger_index] =
 
  113                beast::lexicalCast<std::uint32_t>(strLedger);
 
 
  128        static boost::regex reCurIss(
 
  129            "\\`([][:alnum:]<>(){}[|?!@#$%^&*]{3})(?:/(.+))?\\'");
 
  131        boost::smatch smMatch;
 
  133        if (boost::regex_match(strCurrencyIssuer, smMatch, reCurIss))
 
  139            jvResult[jss::currency] = strCurrency;
 
  144                jvResult[jss::issuer] = strIssuer;
 
  152                std::string(
"Invalid currency/issuer '") + strCurrencyIssuer +
 
 
  162        if (parseBase58<ripple::PublicKey>(type, strPk))
 
 
  185            v[jss::params] = jvParams;
 
 
  194        v[jss::internal_command] = jvParams[0u];
 
  198        for (
unsigned i = 1; i < jvParams.
size(); ++i)
 
  199            params.
append(jvParams[i]);
 
  201        v[jss::params] = params;
 
 
  209        if (jvParams.
size() == 1)
 
  217            jvRequest[jss::public_key] = strPk;
 
 
  230        unsigned int iParams = jvParams.
size();
 
  233            jvRequest[jvParams[0u].
asString()] = 
true;
 
 
  244        unsigned int iParams = jvParams.
size();
 
  246        auto const account = parseBase58<AccountID>(jvParams[0u].asString());
 
  250        jvRequest[jss::account] = 
toBase58(*account);
 
  254        while (!bDone && iParams >= 2)
 
  257            if (jvParams[iParams - 1].asString() == jss::binary)
 
  259                jvRequest[jss::binary] = 
true;
 
  262            else if (jvParams[iParams - 1].asString() == jss::count)
 
  264                jvRequest[jss::count] = 
true;
 
  267            else if (jvParams[iParams - 1].asString() == jss::descending)
 
  269                jvRequest[jss::descending] = 
true;
 
  281        else if (2 == iParams)
 
  291            if (uLedgerMax != -1 && uLedgerMax < uLedgerMin)
 
  298            jvRequest[jss::ledger_index_min] = jvParams[1u].
asInt();
 
  299            jvRequest[jss::ledger_index_max] = jvParams[2u].
asInt();
 
  302                jvRequest[jss::limit] = jvParams[3u].
asInt();
 
  305                jvRequest[jss::offset] = jvParams[4u].
asInt();
 
 
  331            jvRequest[jss::taker_pays] = jvTakerPays;
 
  340            jvRequest[jss::taker_gets] = jvTakerGets;
 
  343        if (jvParams.
size() >= 3)
 
  345            jvRequest[jss::issuer] = jvParams[2u].
asString();
 
  348        if (jvParams.
size() >= 4 &&
 
  352        if (jvParams.
size() >= 5)
 
  354            int iLimit = jvParams[5u].
asInt();
 
  357                jvRequest[jss::limit] = iLimit;
 
  360        if (jvParams.
size() >= 6 && jvParams[5u].
asInt())
 
  362            jvRequest[jss::proof] = 
true;
 
  365        if (jvParams.
size() == 7)
 
  366            jvRequest[jss::marker] = jvParams[6u];
 
 
  377        if (!jvParams.
size())
 
  382            jvRequest[
"can_delete"] = jvParams[0u].
asUInt();
 
  384            jvRequest[
"can_delete"] = input;
 
 
  395        if (jvParams.
size() == 2)
 
  397            jvRequest[jss::ip] = ip;
 
  398            jvRequest[jss::port] = jvParams[1u].
asUInt();
 
  407            jvRequest[jss::port] =
 
  413        jvRequest[jss::ip] = ip;
 
 
  423        jvRequest[jss::source_account] = jvParams[0u].
asString();
 
  424        jvRequest[jss::destination_account] = jvParams[1u].
asString();
 
  426        if (jvParams.
size() >= 3)
 
  430        if ((jvParams.
size() >= 4) && (jvParams.
size() <= 11))
 
  433            for (uint32_t i = 3; i < jvParams.
size(); ++i)
 
  434                jvRequest[jss::credentials].append(jvParams[i].asString());
 
 
  453        if (jvParams.
size() > 0)
 
  454            jvRequest[jss::feature] = jvParams[0u].
asString();
 
  456        if (jvParams.
size() > 1)
 
  458            auto const action = jvParams[1u].
asString();
 
  463            if (boost::iequals(action, 
"reject"))
 
  465            else if (boost::iequals(action, 
"accept"))
 
 
  481            jvRequest[jss::min_count] = jvParams[0u].
asUInt();
 
 
  491        bool const bOffline =
 
  492            4 == jvParams.
size() && jvParams[3u].
asString() == 
"offline";
 
  494        if (3 == jvParams.
size() || bOffline)
 
  503                jvRequest[jss::account] = jvParams[0u].
asString();
 
  504                jvRequest[jss::secret] = jvParams[1u].
asString();
 
  505                jvRequest[jss::tx_json] = txJSON;
 
  508                    jvRequest[jss::offline] = 
true;
 
 
  523        JLOG(
j_.
trace()) << 
"RPC method: " << jvParams[0u];
 
  524        JLOG(
j_.
trace()) << 
"RPC json: " << jvParams[1u];
 
  531            jvRequest[jss::method] = jvParams[0u];
 
 
  546            for (
auto const& j : jv)
 
  555            if (jv.
isMember(jss::jsonrpc) && jv[jss::jsonrpc] == 
"2.0" &&
 
  556                jv.
isMember(jss::ripplerpc) && jv[jss::ripplerpc] == 
"2.0" &&
 
 
  574        bool valid_parse = reader.
parse(jvParams[0u].asString(), jv);
 
  582                    auto const& params = jv[jss::params];
 
  583                    for (
auto i = params.begin(); i != params.end(); ++i)
 
  584                        jv1[i.key().asString()] = *i;
 
  586                jv1[jss::jsonrpc] = jv[jss::jsonrpc];
 
  587                jv1[jss::ripplerpc] = jv[jss::ripplerpc];
 
  588                jv1[jss::id] = jv[jss::id];
 
  589                jv1[jss::method] = jv[jss::method];
 
  596                if (jv[j].isMember(jss::params))
 
  598                    auto const& params = jv[j][jss::params];
 
  599                    for (
auto i = params.begin(); i != params.end(); ++i)
 
  600                        jv1[j][i.key().asString()] = *i;
 
  602                jv1[j][jss::jsonrpc] = jv[j][jss::jsonrpc];
 
  603                jv1[j][jss::ripplerpc] = jv[j][jss::ripplerpc];
 
  604                jv1[j][jss::id] = jv[j][jss::id];
 
  605                jv1[j][jss::method] = jv[j][jss::method];
 
  611            jv_error[jss::jsonrpc] = jv[jss::jsonrpc];
 
  613            jv_error[jss::ripplerpc] = jv[jss::ripplerpc];
 
  615            jv_error[jss::id] = jv[jss::id];
 
 
  625        if (!jvParams.
size())
 
  632        if (2 == jvParams.
size())
 
  634            if (jvParams[1u].asString() == 
"full")
 
  636                jvRequest[jss::full] = 
true;
 
  638            else if (jvParams[1u].asString() == 
"tx")
 
  640                jvRequest[jss::transactions] = 
true;
 
  641                jvRequest[jss::expand] = 
true;
 
 
  656        if (strLedger.
length() == 64)
 
  658            jvRequest[jss::ledger_hash] = strLedger;
 
  662            jvRequest[jss::ledger_index] =
 
  663                beast::lexicalCast<std::uint32_t>(strLedger);
 
 
  675        jvRequest[jss::index] = jvParams[0u].
asString();
 
  677        if (jvParams.
size() == 2 &&
 
 
  693        if (jvParams.
size() == 1)
 
  695            jvRequest[jss::severity] = jvParams[0u].
asString();
 
  697        else if (jvParams.
size() == 2)
 
  699            jvRequest[jss::partition] = jvParams[0u].
asString();
 
  700            jvRequest[jss::severity] = jvParams[1u].
asString();
 
 
  741        unsigned int index = 0;
 
  743        if (jvParams.
size() == 4)
 
  745            jvRequest[jss::passphrase] = jvParams[index];
 
  750            jvRequest[jss::key_type] = jvParams[index];
 
  755            jvRequest[jss::secret] = jvParams[index];
 
  764            jvRequest[jss::channel_id] = 
to_string(channelId);
 
  768        if (!jvParams[index].isString() ||
 
  771        jvRequest[jss::amount] = jvParams[index];
 
 
  790        jvRequest[jss::public_key] = strPk;
 
  797        jvRequest[jss::channel_id] = jvParams[1u].
asString();
 
  799        if (!jvParams[2u].isString() || !
to_uint64(jvParams[2u].asString()))
 
  801        jvRequest[jss::amount] = jvParams[2u];
 
  803        jvRequest[jss::signature] = jvParams[3u].
asString();
 
 
  812        auto const nParams = jvParams.
size();
 
  814        for (
auto i = 0; i < nParams; ++i)
 
  818            if (i == 1 && strParam.
empty())
 
  824                if (parseBase58<AccountID>(strParam))
 
  826                    jvRequest[accFields[i]] = std::move(strParam);
 
 
  849        unsigned int iCursor = jvParams.
size();
 
  851        if (!parseBase58<AccountID>(strIdent))
 
  857        jvRequest[jss::account] = strIdent;
 
  859        if (iCursor == 2 && !
jvParseLedger(jvRequest, jvParams[1u].asString()))
 
 
  870        if (!
id.parseHex(strVaultID))
 
  874        jvRequest[jss::vault_id] = strVaultID;
 
  876        if (jvParams.
size() > 1)
 
 
  887        jvRequest[jss::public_key] = jvParams[0u].
asString();
 
  888        if (jvParams.
size() > 1)
 
  890            jvRequest[jss::description] = jvParams[1u].
asString();
 
 
  900        jvRequest[jss::public_key] = jvParams[0u].
asString();
 
 
  910        bool bLedger = 2 == jvParams.
size();
 
  912        JLOG(
j_.
trace()) << 
"RPC json: " << jvParams[0u];
 
 
  940            jvRequest[jss::tx_json] = txJSON;
 
  944            jvRequest[jss::tx_blob] = jvParams[0u].
asString();
 
  947        if (jvParams.
size() == 2)
 
  949            if (!jvParams[1u].isString() || jvParams[1u].asString() != 
"binary")
 
  951            jvRequest[jss::binary] = 
true;
 
 
  967        bool const bOffline =
 
  968            jvParams.
size() >= 3 && jvParams[2u].
asString() == 
"offline";
 
  971            if (jvParams.
size() < 3)
 
  973            if (jvParams.
size() < 4 && bOffline)
 
  979        if (1 == jvParams.
size())
 
  985            jvRequest[jss::tx_blob] = jvParams[0u].
asString();
 
  990            (jvParams.
size() >= 2 || bOffline) &&
 
  996            jvRequest[jss::secret] = jvParams[0u].
asString();
 
  997            jvRequest[jss::tx_json] = txJSON;
 
 1000                jvRequest[jss::offline] = 
true;
 
 1003                jvRequest[jss::signature_target] = *field;
 
 
 1017        if (1 == jvParams.
size())
 
 1024                jvRequest[jss::tx_json] = txJSON;
 
 
 1038            jvParams.
size() == 2,
 
 1039            "ripple::RPCParser::parseTransactionEntry : valid parameter count");
 
 1042        if (txHash.
length() != 64)
 
 1046        jvRequest[jss::tx_hash] = txHash;
 
 1052        if (jvRequest.isMember(jss::ledger_index) &&
 
 1053            jvRequest[jss::ledger_index] == 0)
 
 
 1065        if (jvParams.
size() == 2 || jvParams.
size() == 4)
 
 1067            if (jvParams[1u].asString() == jss::binary)
 
 1068                jvRequest[jss::binary] = 
true;
 
 1071        if (jvParams.
size() >= 3)
 
 1073            auto const offset = jvParams.
size() == 3 ? 0 : 1;
 
 1075            jvRequest[jss::min_ledger] = jvParams[1u + offset].
asString();
 
 1076            jvRequest[jss::max_ledger] = jvParams[2u + offset].
asString();
 
 1079        if (jvParams[0u].asString().length() == 16)
 
 1080            jvRequest[jss::ctid] = jvParams[0u].
asString();
 
 1082            jvRequest[jss::transaction] = jvParams[0u].
asString();
 
 
 1093        jvRequest[jss::start] = jvParams[0u].
asUInt();
 
 
 1109        if (jvParams.
size())
 
 1110            jvRequest[jss::secret] = jvParams[0u].
asString();
 
 
 1123        if (jvParams.
size())
 
 1124            jvRequest[jss::passphrase] = jvParams[0u].
asString();
 
 
 1136        unsigned int index = 0;
 
 1137        unsigned int const size = jvParams.
size();
 
 1145        if (param[0] != 
'r')
 
 1147            if (param.
size() == 64)
 
 1148                jvRequest[jss::ledger_hash] = param;
 
 1150                jvRequest[jss::ledger_index] = param;
 
 1155            param = jvParams[index++].
asString();
 
 1158        jvRequest[jss::account] = param;
 
 1164            while (index < size)
 
 1165                hotWallets.
append(jvParams[index++].asString());
 
 
 1177        if (jvParams.
size() == 1)
 
 1179            jvRequest[jss::hash] = jvParams[0u].
asString();
 
 
 1190        if (jvParams.
size() == 1 && jvParams[0u].
asString() == 
"counters")
 
 1191            jvRequest[jss::counters] = 
true;
 
 
 1211        bool allowAnyCommand)
 
 1215            stream << 
"Method: '" << strMethod << 
"'";
 
 1216            stream << 
"Params: " << jvParams;
 
 1227        static constexpr Command commands[] = {
 
 1272            {
"peer_reservations_add",
 
 1276            {
"peer_reservations_del",
 
 1307        auto const count = jvParams.
size();
 
 1309        for (
auto const& command : commands)
 
 1311            if (strMethod == command.name)
 
 1313                if ((command.minParams >= 0 && count < command.minParams) ||
 
 1314                    (command.maxParams >= 0 && count > command.maxParams))
 
 1317                        << 
"Wrong number of parameters for " << command.name
 
 1318                        << 
" minimum=" << command.minParams
 
 1319                        << 
" maximum=" << command.maxParams
 
 1320                        << 
" actual=" << count;
 
 1325                return (this->*(command.parse))(jvParams);
 
 1330        if (!allowAnyCommand)
 
 
 
 1355    request[jss::method] = strMethod;
 
 1356    request[jss::params] = params;
 
 1357    request[jss::id] = id;
 
 
 1378        (*jvOutput) = jvInput;
 
 
 1384        boost::system::error_code 
const& ecResult,
 
 1395            if (strData.
empty())
 
 1396                Throw<std::runtime_error>(
 
 1397                    "no response from server. Please " 
 1398                    "ensure that the rippled server is running in another " 
 1403            if (strData.
find(
"Unable to parse request") == 0 ||
 
 1404                strData.
find(jss::invalid_API_version.c_str()) == 0)
 
 1405                Throw<RequestNotParseable>(strData);
 
 1408            if (!reader.
parse(strData, jvReply))
 
 1409                Throw<std::runtime_error>(
"couldn't parse reply from server");
 
 1412                Throw<std::runtime_error>(
 
 1413                    "expected reply to have result, error and id properties");
 
 1417            jvResult[
"result"] = jvReply;
 
 1419            (callbackFuncP)(jvResult);
 
 
 1432        boost::asio::streambuf& sb,
 
 1436        JLOG(j.
debug()) << 
"requestRPC: strPath='" << strPath << 
"'";
 
 
 
 1454    unsigned int apiVersion,
 
 1462    for (
int i = 1; i != args.
size(); i++)
 
 1463        jvRpcParams.
append(args[i]);
 
 1467    retParams[jss::method] = args[0];
 
 1468    retParams[jss::params] = jvRpcParams;
 
 1470    jvRequest = rpParser.
parseCommand(args[0], jvRpcParams, 
true);
 
 1472    auto insert_api_version = [apiVersion](
Json::Value& jr) {
 
 1473        if (jr.isObject() && !jr.isMember(jss::error) &&
 
 1474            !jr.isMember(jss::api_version))
 
 1476            jr[jss::api_version] = apiVersion;
 
 1481        insert_api_version(jvRequest);
 
 
 1496    unsigned int apiVersion,
 
 1501        "Expect specific rpc enum values.");
 
 1515        if (jvRequest.
isMember(jss::error))
 
 1517            jvOutput = jvRequest;
 
 1518            jvOutput[
"rpc"] = jvRpc;
 
 1550                jvParams.
append(jvRequest);
 
 1554                    jvParams.
append(jvRequest[i]);
 
 1558                boost::asio::io_context isService;
 
 1568                        ? jvRequest[jss::method].
asString()
 
 1569                        : jvRequest.
isArray() ? 
"batch" : args[0],
 
 1577                        std::placeholders::_1),
 
 1585                jvOutput = jvOutput[
"result"];
 
 1596                jvOutput[
"result"] = jvRpcError;
 
 1604                jvOutput[
"request_sent"] =
 
 1611            jvOutput[jss::status] = 
"error";
 
 1612            if (jvOutput.
isMember(jss::error_code))
 
 1613                nRet = 
std::stoi(jvOutput[jss::error_code].asString());
 
 1614            else if (jvOutput[jss::error].isMember(jss::error_code))
 
 1616                    std::stoi(jvOutput[jss::error][jss::error_code].asString());
 
 1624    catch (RequestNotParseable& e)
 
 1627        jvOutput[
"error_what"] = e.what();
 
 1633        jvOutput[
"error_what"] = e.what();
 
 1637    return {nRet, std::move(jvOutput)};
 
 
 1653    std::cout << result.second.toStyledString();
 
 1655    return result.first;
 
 
 1662    boost::asio::io_context& io_context,
 
 1676    auto j = logs.
journal(
"HTTPClient");
 
 1681        JLOG(j.info()) << (bSSL ? 
"Securely connecting to " : 
"Connecting to ")
 
 1686    headers[
"Authorization"] =
 
 1693    constexpr auto RPC_REPLY_MAX_BYTES = 
megabytes(256);
 
 1695    using namespace std::chrono_literals;
 
 1696    auto constexpr RPC_WEBHOOK_TIMEOUT = 30s;
 
 1709            std::placeholders::_1,
 
 1710            std::placeholders::_2,
 
 1712        RPC_REPLY_MAX_BYTES,
 
 1713        RPC_WEBHOOK_TIMEOUT,
 
 1717            std::placeholders::_1,
 
 1718            std::placeholders::_2,
 
 1719            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 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