Clio develop
The XRP Ledger API server.
Loading...
Searching...
No Matches
RPCHelpers.hpp
Go to the documentation of this file.
1//------------------------------------------------------------------------------
2/*
3 This file is part of clio: https://github.com/XRPLF/clio
4 Copyright (c) 2022, the clio developers.
5
6 Permission to use, copy, modify, and distribute this software for any
7 purpose with or without fee is hereby granted, provided that the above
8 copyright notice and this permission notice appear in all copies.
9
10 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17*/
18//==============================================================================
19
21#pragma once
22
23/*
24 * This file contains a variety of utility functions used when executing the handlers.
25 */
26
27#include "data/AmendmentCenterInterface.hpp"
28#include "data/BackendInterface.hpp"
29#include "data/Types.hpp"
30#include "rpc/Errors.hpp"
31#include "rpc/common/Types.hpp"
32#include "util/JsonUtils.hpp"
33#include "util/Taggable.hpp"
34#include "util/log/Logger.hpp"
35#include "web/Context.hpp"
36
37#include <boost/asio/spawn.hpp>
38#include <boost/json/array.hpp>
39#include <boost/json/object.hpp>
40#include <boost/json/value.hpp>
41#include <boost/regex.hpp>
42#include <boost/regex/v5/regex_fwd.hpp>
43#include <boost/regex/v5/regex_match.hpp>
44#include <fmt/core.h>
45#include <xrpl/basics/base_uint.h>
46#include <xrpl/json/json_value.h>
47#include <xrpl/protocol/AccountID.h>
48#include <xrpl/protocol/Book.h>
49#include <xrpl/protocol/Fees.h>
50#include <xrpl/protocol/Indexes.h>
51#include <xrpl/protocol/Issue.h>
52#include <xrpl/protocol/Keylet.h>
53#include <xrpl/protocol/LedgerHeader.h>
54#include <xrpl/protocol/PublicKey.h>
55#include <xrpl/protocol/Rate.h>
56#include <xrpl/protocol/STAmount.h>
57#include <xrpl/protocol/STBase.h>
58#include <xrpl/protocol/STLedgerEntry.h>
59#include <xrpl/protocol/STObject.h>
60#include <xrpl/protocol/STTx.h>
61#include <xrpl/protocol/SecretKey.h>
62#include <xrpl/protocol/Seed.h>
63#include <xrpl/protocol/TxMeta.h>
64#include <xrpl/protocol/UintTypes.h>
65#include <xrpl/protocol/XRPAmount.h>
66
67#include <chrono>
68#include <cstddef>
69#include <cstdint>
70#include <functional>
71#include <memory>
72#include <optional>
73#include <string>
74#include <tuple>
75#include <utility>
76#include <variant>
77#include <vector>
78
79namespace rpc {
80
82enum class NFTokenjson { ENABLE, DISABLE };
83
90std::optional<ripple::AccountID>
91accountFromStringStrict(std::string const& account);
92
100bool
101isOwnedByAccount(ripple::SLE const& sle, ripple::AccountID const& accountID);
102
110std::uint64_t
111getStartHint(ripple::SLE const& sle, ripple::AccountID const& accountID);
112
119std::optional<AccountCursor>
120parseAccountCursor(std::optional<std::string> jsonCursor);
121
122// TODO this function should probably be in a different file and namespace
129std::pair<std::shared_ptr<ripple::STTx const>, std::shared_ptr<ripple::STObject const>>
131
132// TODO this function should probably be in a different file and namespace
140std::pair<std::shared_ptr<ripple::STTx const>, std::shared_ptr<ripple::TxMeta const>>
141deserializeTxPlusMeta(data::TransactionAndMetadata const& blobs, std::uint32_t seq);
142
152std::pair<boost::json::object, boost::json::object>
154 data::TransactionAndMetadata const& blobs,
155 std::uint32_t apiVersion,
156 NFTokenjson nftEnabled = NFTokenjson::DISABLE,
157 std::optional<uint16_t> networkId = std::nullopt
158);
159
167boost::json::object
168toJsonWithBinaryTx(data::TransactionAndMetadata const& txnPlusMeta, std::uint32_t apiVersion);
169
176void
177insertDeliverMaxAlias(boost::json::object& txJson, std::uint32_t apiVersion);
178
188bool
190 boost::json::object& metaJson,
191 std::shared_ptr<ripple::STTx const> const& txn,
192 std::shared_ptr<ripple::TxMeta const> const& meta,
193 uint32_t date
194);
195
204bool
206 boost::json::object& metaJson,
207 std::shared_ptr<ripple::STTx const> const& txn,
208 std::shared_ptr<ripple::TxMeta const> const& meta
209);
210
217boost::json::object
218toJson(ripple::STBase const& obj);
219
226boost::json::object
227toJson(ripple::SLE const& sle);
228
237boost::json::object
238toJson(ripple::LedgerHeader const& info, bool binary, std::uint32_t apiVersion);
239
246boost::json::object
247toJson(ripple::TxMeta const& meta);
248
249using RippledJson = Json::Value;
250
257boost::json::value
258toBoostJson(RippledJson const& value);
259
269boost::json::object
271 ripple::LedgerHeader const& lgrInfo,
272 ripple::Fees const& fees,
273 std::string const& ledgerRange,
274 std::uint32_t txnCount
275);
276
284std::variant<Status, ripple::LedgerHeader>
285ledgerHeaderFromRequest(std::shared_ptr<data::BackendInterface const> const& backend, web::Context const& ctx);
286
297std::variant<Status, ripple::LedgerHeader>
299 BackendInterface const& backend,
300 boost::asio::yield_context yield,
301 std::optional<std::string> ledgerHash,
302 std::optional<uint32_t> ledgerIndex,
303 uint32_t maxSeq
304);
305
319std::variant<Status, AccountCursor>
321 BackendInterface const& backend,
322 ripple::Keylet const& owner,
323 ripple::uint256 const& hexMarker,
324 std::uint32_t startHint,
325 std::uint32_t sequence,
326 std::uint32_t limit,
327 boost::asio::yield_context yield,
328 std::function<void(ripple::SLE)> atOwnedNode
329);
330
346std::variant<Status, AccountCursor>
348 BackendInterface const& backend,
349 ripple::AccountID const& accountID,
350 std::uint32_t sequence,
351 std::uint32_t limit,
352 std::optional<std::string> jsonCursor,
353 boost::asio::yield_context yield,
354 std::function<void(ripple::SLE)> atOwnedNode,
355 bool nftIncluded = false
356);
357
367std::shared_ptr<ripple::SLE const>
368read(
369 std::shared_ptr<data::BackendInterface const> const& backend,
370 ripple::Keylet const& keylet,
371 ripple::LedgerHeader const& lgrInfo,
372 web::Context const& context
373);
374
381std::vector<ripple::AccountID>
382getAccountsFromTransaction(boost::json::object const& transaction);
383
391std::vector<unsigned char>
392ledgerHeaderToBlob(ripple::LedgerHeader const& info, bool includeHash = false);
393
403bool
405 BackendInterface const& backend,
406 std::uint32_t seq,
407 ripple::AccountID const& issuer,
408 boost::asio::yield_context yield
409);
410
422bool
424 BackendInterface const& backend,
425 std::uint32_t sequence,
426 ripple::AccountID const& account,
427 ripple::Currency const& currency,
428 ripple::AccountID const& issuer,
429 boost::asio::yield_context yield
430);
431
442bool
444 BackendInterface const& backend,
445 std::uint32_t sequence,
446 ripple::Keylet const& keylet,
447 std::vector<std::uint32_t> const& flags,
448 boost::asio::yield_context yield
449);
450
465bool
467 BackendInterface const& backend,
468 std::uint32_t sequence,
469 ripple::AccountID const& account,
470 ripple::Currency const& currency,
471 ripple::AccountID const& issuer,
472 boost::asio::yield_context yield
473);
474
486bool
488 BackendInterface const& backend,
489 std::uint32_t sequence,
490 ripple::AccountID const& account,
491 ripple::Issue const& asset,
492 ripple::Issue const& asset2,
493 boost::asio::yield_context yield
494);
495
507ripple::STAmount
509 BackendInterface const& backend,
510 data::AmendmentCenterInterface const& amendmentCenter,
511 std::uint32_t sequence,
512 ripple::STAmount const& amount,
513 ripple::AccountID const& id,
514 boost::asio::yield_context yield
515);
516
530ripple::STAmount
532 BackendInterface const& backend,
533 data::AmendmentCenterInterface const& amendmentCenter,
534 std::uint32_t sequence,
535 ripple::AccountID const& account,
536 ripple::Currency const& currency,
537 ripple::AccountID const& issuer,
538 bool zeroIfFrozen,
539 boost::asio::yield_context yield
540);
541
554ripple::STAmount
556 BackendInterface const& backend,
557 std::uint32_t sequence,
558 ripple::AccountID const& account,
559 ripple::Currency const& currency,
560 ripple::AccountID const& issuer,
561 bool const zeroIfFrozen,
562 boost::asio::yield_context yield
563);
564
574ripple::Rate
576 BackendInterface const& backend,
577 std::uint32_t sequence,
578 ripple::AccountID const& issuer,
579 boost::asio::yield_context yield
580);
581
591ripple::XRPAmount
593 BackendInterface const& backend,
594 std::uint32_t sequence,
595 ripple::AccountID const& id,
596 boost::asio::yield_context yield
597);
598
611boost::json::array
613 std::vector<data::LedgerObject> const& offers,
614 ripple::Book const& book,
615 ripple::AccountID const& takerID,
616 data::BackendInterface const& backend,
617 data::AmendmentCenterInterface const& amendmentCenter,
618 std::uint32_t ledgerSequence,
619 boost::asio::yield_context yield
620);
621
631std::variant<Status, ripple::Book>
632parseBook(ripple::Currency pays, ripple::AccountID payIssuer, ripple::Currency gets, ripple::AccountID getIssuer);
633
640std::variant<Status, ripple::Book>
641parseBook(boost::json::object const& request);
642
649std::variant<Status, ripple::AccountID>
650parseTaker(boost::json::value const& taker);
651
659ripple::Issue
660parseIssue(boost::json::object const& issue);
661
667bool
668specifiesCurrentOrClosedLedger(boost::json::object const& request);
669
677bool
678isAdminCmd(std::string const& method, boost::json::object const& request);
679
686std::variant<ripple::uint256, Status>
687getNFTID(boost::json::object const& request);
688
697std::optional<std::string>
698encodeCTID(uint32_t ledgerSeq, uint16_t txnIndex, uint16_t networkId) noexcept;
699
707template <typename T>
708inline std::optional<std::tuple<uint32_t, uint16_t, uint16_t>>
709decodeCTID(T const ctid) noexcept
710{
711 auto const getCTID64 = [](T const ctid) noexcept -> std::optional<uint64_t> {
712 if constexpr (std::is_convertible_v<T, std::string>) {
713 std::string const ctidString(ctid);
714 static constexpr std::size_t kCTID_STRING_LENGTH = 16;
715 if (ctidString.length() != kCTID_STRING_LENGTH)
716 return {};
717
718 if (!boost::regex_match(ctidString, boost::regex("^[0-9A-F]+$")))
719 return {};
720
721 return std::stoull(ctidString, nullptr, 16);
722 }
723
724 if constexpr (std::is_same_v<T, uint64_t>)
725 return ctid;
726
727 return {};
728 };
729
730 auto const ctidValue = getCTID64(ctid).value_or(0);
731
732 static constexpr uint64_t kCTID_PREFIX = 0xC000'0000'0000'0000ULL;
733 static constexpr uint64_t kCTID_PREFIX_MASK = 0xF000'0000'0000'0000ULL;
734
735 if ((ctidValue & kCTID_PREFIX_MASK) != kCTID_PREFIX)
736 return {};
737
738 uint32_t const ledgerSeq = (ctidValue >> 32) & 0xFFFF'FFFUL;
739 uint16_t const txnIndex = (ctidValue >> 16) & 0xFFFFU;
740 uint16_t const networkId = ctidValue & 0xFFFFU;
741 return {{ledgerSeq, txnIndex, networkId}};
742}
743
752template <typename DurationType>
753void
754logDuration(boost::json::object const& request, util::BaseTagDecorator const& tag, DurationType const& dur)
755{
756 using boost::json::serialize;
757
758 static util::Logger const log{"RPC"}; // NOLINT(readability-identifier-naming)
759 static constexpr std::int64_t kDURATION_ERROR_THRESHOLD_SECONDS = 10;
760
761 auto const millis = std::chrono::duration_cast<std::chrono::milliseconds>(dur).count();
762 auto const seconds = std::chrono::duration_cast<std::chrono::seconds>(dur).count();
763 auto const msg = fmt::format(
764 "Request processing duration = {} milliseconds. request = {}", millis, serialize(util::removeSecret(request))
765 );
766
767 if (seconds > kDURATION_ERROR_THRESHOLD_SECONDS) {
768 LOG(log.error()) << tag << msg;
769 } else if (seconds > 1) {
770 LOG(log.warn()) << tag << msg;
771 } else
772 LOG(log.info()) << tag << msg;
773}
774
781std::optional<ripple::Seed>
782parseRippleLibSeed(boost::json::value const& value);
783
796std::variant<Status, AccountCursor>
798 BackendInterface const& backend,
799 std::uint32_t sequence,
800 ripple::AccountID const& accountID,
801 ripple::uint256 nextPage,
802 std::uint32_t limit,
803 boost::asio::yield_context yield,
804 std::function<void(ripple::SLE)> atOwnedNode
805);
806
813std::optional<std::uint32_t>
814parseStringAsUInt(std::string const& value); // TODO: move to string utils or something?
815
823bool
825 std::shared_ptr<ripple::STTx const> const& txn,
826 std::shared_ptr<ripple::TxMeta const> const& meta
827);
828
838std::optional<ripple::STAmount>
840 std::shared_ptr<ripple::STTx const> const& txn,
841 std::shared_ptr<ripple::TxMeta const> const& meta,
842 std::uint32_t ledgerSequence,
843 uint32_t date
844);
845
846} // namespace rpc
The interface of an amendment center.
Definition AmendmentCenterInterface.hpp:36
The interface to the database used by Clio.
Definition BackendInterface.hpp:140
Represents any tag decorator.
Definition Taggable.hpp:74
A simple thread-safe logger for the channel specified in the constructor.
Definition Logger.hpp:111
This namespace contains all the RPC logic and handlers.
Definition AMMHelpers.cpp:37
std::pair< std::shared_ptr< ripple::STTx const >, std::shared_ptr< ripple::STObject const > > deserializeTxPlusMeta(data::TransactionAndMetadata const &blobs)
Deserialize a TransactionAndMetadata into a pair of STTx and STObject.
Definition RPCHelpers.cpp:210
std::uint64_t getStartHint(ripple::SLE const &sle, ripple::AccountID const &accountID)
Get the start hint for the account.
Definition RPCHelpers.cpp:570
ripple::Issue parseIssue(boost::json::object const &issue)
Parse the json object into a ripple::Issue object.
Definition RPCHelpers.cpp:1462
bool insertMPTIssuanceID(boost::json::object &metaJson, std::shared_ptr< ripple::STTx const > const &txn, std::shared_ptr< ripple::TxMeta const > const &meta)
Add "mpt_issuance_id" into MPTokenIssuanceCreate transaction json.
Definition RPCHelpers.cpp:365
bool isFrozen(BackendInterface const &backend, std::uint32_t sequence, ripple::AccountID const &account, ripple::Currency const &currency, ripple::AccountID const &issuer, boost::asio::yield_context yield)
Whether the account is frozen.
Definition RPCHelpers.cpp:926
bool insertDeliveredAmount(boost::json::object &metaJson, std::shared_ptr< ripple::STTx const > const &txn, std::shared_ptr< ripple::TxMeta const > const &meta, uint32_t date)
Add "DeliveredAmount" to the transaction json object.
Definition RPCHelpers.cpp:304
boost::json::object toJsonWithBinaryTx(data::TransactionAndMetadata const &txnPlusMeta, std::uint32_t const apiVersion)
Convert a TransactionAndMetadata to JSON object containing tx and metadata data in hex format....
Definition RPCHelpers.cpp:1528
bool isDeepFrozen(BackendInterface const &backend, std::uint32_t sequence, ripple::AccountID const &account, ripple::Currency const &currency, ripple::AccountID const &issuer, boost::asio::yield_context yield)
Whether the trustline is deep frozen.
Definition RPCHelpers.cpp:955
std::optional< AccountCursor > parseAccountCursor(std::optional< std::string > jsonCursor)
Parse the account cursor from the JSON.
Definition RPCHelpers.cpp:113
std::variant< Status, ripple::Book > parseBook(ripple::Currency pays, ripple::AccountID payIssuer, ripple::Currency gets, ripple::AccountID getIssuer)
Parse the book from the request.
Definition RPCHelpers.cpp:1310
std::vector< ripple::AccountID > getAccountsFromTransaction(boost::json::object const &transaction)
Get the account associated with a transaction.
Definition RPCHelpers.cpp:864
void logDuration(boost::json::object const &request, util::BaseTagDecorator const &tag, DurationType const &dur)
Log the duration of the request processing.
Definition RPCHelpers.hpp:754
std::variant< Status, ripple::AccountID > parseTaker(boost::json::value const &taker)
Parse the taker from the request.
Definition RPCHelpers.cpp:1448
ripple::STAmount ammAccountHolds(BackendInterface const &backend, std::uint32_t sequence, ripple::AccountID const &account, ripple::Currency const &currency, ripple::AccountID const &issuer, bool const zeroIfFrozen, boost::asio::yield_context yield)
Get the amount that an LPToken owner holds.
Definition RPCHelpers.cpp:1044
std::optional< std::string > encodeCTID(uint32_t ledgerSeq, uint16_t txnIndex, uint16_t networkId) noexcept
Encode CTID as string.
Definition RPCHelpers.cpp:290
boost::json::object generatePubLedgerMessage(ripple::LedgerHeader const &lgrInfo, ripple::Fees const &fees, std::string const &ledgerRange, std::uint32_t txnCount)
Generate a JSON object to publish ledger message.
std::optional< std::tuple< uint32_t, uint16_t, uint16_t > > decodeCTID(T const ctid) noexcept
Decode the CTID from a string or a uint64_t.
Definition RPCHelpers.hpp:709
boost::json::array postProcessOrderBook(std::vector< data::LedgerObject > const &offers, ripple::Book const &book, ripple::AccountID const &takerID, data::BackendInterface const &backend, data::AmendmentCenterInterface const &amendmentCenter, std::uint32_t const ledgerSequence, boost::asio::yield_context yield)
Post process an order book.
Definition RPCHelpers.cpp:1196
std::variant< Status, ripple::LedgerHeader > getLedgerHeaderFromHashOrSeq(BackendInterface const &backend, boost::asio::yield_context yield, std::optional< std::string > ledgerHash, std::optional< uint32_t > ledgerIndex, uint32_t maxSeq)
Get ledger info from hash or sequence.
Definition RPCHelpers.cpp:519
bool isOwnedByAccount(ripple::SLE const &sle, ripple::AccountID const &accountID)
Check whether the SLE is owned by the account.
std::pair< boost::json::object, boost::json::object > toExpandedJson(data::TransactionAndMetadata const &blobs, std::uint32_t const apiVersion, NFTokenjson nftEnabled, std::optional< uint16_t > networkId)
Convert a TransactionAndMetadata to two JSON objects.
Definition RPCHelpers.cpp:254
std::optional< ripple::AccountID > accountFromStringStrict(std::string const &account)
Get a ripple::AccountID from its string representation.
Definition RPCHelpers.cpp:188
ripple::STAmount accountHolds(BackendInterface const &backend, data::AmendmentCenterInterface const &amendmentCenter, std::uint32_t sequence, ripple::AccountID const &account, ripple::Currency const &currency, ripple::AccountID const &issuer, bool const zeroIfFrozen, boost::asio::yield_context yield)
Get the amount that an account holds.
Definition RPCHelpers.cpp:1089
ripple::STAmount accountFunds(BackendInterface const &backend, data::AmendmentCenterInterface const &amendmentCenter, std::uint32_t const sequence, ripple::STAmount const &amount, ripple::AccountID const &id, boost::asio::yield_context yield)
Get the account funds.
Definition RPCHelpers.cpp:1027
boost::json::object toJson(ripple::STBase const &obj)
Convert STBase object to JSON.
Definition RPCHelpers.cpp:246
std::variant< Status, ripple::LedgerHeader > ledgerHeaderFromRequest(std::shared_ptr< data::BackendInterface const > const &backend, web::Context const &ctx)
Get ledger info from the request.
Definition RPCHelpers.cpp:468
ripple::XRPAmount xrpLiquid(BackendInterface const &backend, std::uint32_t sequence, ripple::AccountID const &id, boost::asio::yield_context yield)
Get the XRP liquidity.
Definition RPCHelpers.cpp:992
std::variant< ripple::uint256, Status > getNFTID(boost::json::object const &request)
Get the NFTID from the request.
Definition RPCHelpers.cpp:1512
bool canHaveDeliveredAmount(std::shared_ptr< ripple::STTx const > const &txn, std::shared_ptr< ripple::TxMeta const > const &meta)
Whether the transaction can have a delivered amount.
Definition RPCHelpers.cpp:172
std::shared_ptr< ripple::SLE const > read(std::shared_ptr< data::BackendInterface const > const &backend, ripple::Keylet const &keylet, ripple::LedgerHeader const &lgrInfo, web::Context const &context)
Read SLE from the backend.
Definition RPCHelpers.cpp:829
NFTokenjson
Enum for NFT json manipulation.
Definition RPCHelpers.hpp:82
std::optional< ripple::Seed > parseRippleLibSeed(boost::json::value const &value)
Parse a ripple-lib seed.
Definition RPCHelpers.cpp:844
void insertDeliverMaxAlias(boost::json::object &txJson, std::uint32_t const apiVersion)
Add "DeliverMax" which is the alias of "Amount" for "Payment" transaction to transaction json....
Definition RPCHelpers.cpp:384
bool specifiesCurrentOrClosedLedger(boost::json::object const &request)
Check whethe the request specifies the current or closed ledger.
Definition RPCHelpers.cpp:1474
std::optional< ripple::STAmount > getDeliveredAmount(std::shared_ptr< ripple::STTx const > const &txn, std::shared_ptr< ripple::TxMeta const > const &meta, std::uint32_t const ledgerSequence, uint32_t date)
Get the delivered amount.
Definition RPCHelpers.cpp:144
ripple::Rate transferRate(BackendInterface const &backend, std::uint32_t sequence, ripple::AccountID const &issuer, boost::asio::yield_context yield)
Get the transfer rate.
Definition RPCHelpers.cpp:1174
bool isGlobalFrozen(BackendInterface const &backend, std::uint32_t sequence, ripple::AccountID const &issuer, boost::asio::yield_context yield)
Whether global frozen is set.
Definition RPCHelpers.cpp:883
boost::json::value toBoostJson(Json::Value const &value)
Convert a RippledJson to boost::json::value.
Definition RPCHelpers.cpp:403
std::variant< Status, AccountCursor > traverseOwnedNodes(BackendInterface const &backend, ripple::AccountID const &accountID, std::uint32_t sequence, std::uint32_t limit, std::optional< std::string > jsonCursor, boost::asio::yield_context yield, std::function< void(ripple::SLE)> atOwnedNode, bool nftIncluded)
Traverse nodes owned by an account.
Definition RPCHelpers.cpp:642
bool isLPTokenFrozen(BackendInterface const &backend, std::uint32_t sequence, ripple::AccountID const &account, ripple::Issue const &asset, ripple::Issue const &asset2, boost::asio::yield_context yield)
Whether the account that owns a LPToken is frozen for the assets in the pool.
Definition RPCHelpers.cpp:978
std::variant< Status, AccountCursor > traverseNFTObjects(BackendInterface const &backend, std::uint32_t sequence, ripple::AccountID const &accountID, ripple::uint256 nextPage, std::uint32_t limit, boost::asio::yield_context yield, std::function< void(ripple::SLE)> atOwnedNode)
Traverse NFT objects and call the callback for each owned node.
Definition RPCHelpers.cpp:590
std::optional< std::uint32_t > parseStringAsUInt(std::string const &value)
Parse the string as a uint32_t.
Definition RPCHelpers.cpp:455
bool isAdminCmd(std::string const &method, boost::json::object const &request)
Check whether a request requires administrative privileges on rippled side.
Definition RPCHelpers.cpp:1487
bool fetchAndCheckAnyFlagsExists(BackendInterface const &backend, std::uint32_t sequence, ripple::Keylet const &keylet, std::vector< std::uint32_t > const &flags, boost::asio::yield_context yield)
Fetches a ledger object and checks if any of the specified flag is set on the account.
Definition RPCHelpers.cpp:906
std::vector< unsigned char > ledgerHeaderToBlob(ripple::LedgerHeader const &info, bool includeHash)
Convert a ledger header to a blob.
Definition RPCHelpers.cpp:552
boost::json::object removeSecret(boost::json::object const &object)
Removes any detected secret information from a response JSON object.
Definition JsonUtils.hpp:67
Represents a transaction and its metadata bundled together.
Definition Types.hpp:68
Context that is used by the Webserver to pass around information about an incoming request.
Definition Context.hpp:40