Clio  develop
The XRP Ledger API server.
Loading...
Searching...
No Matches
RPCHelpers.hpp
Go to the documentation of this file.
1
2#pragma once
3
4/*
5 * This file contains a variety of utility functions used when executing the handlers.
6 */
7
8#include "data/AmendmentCenterInterface.hpp"
9#include "data/BackendInterface.hpp"
10#include "data/Types.hpp"
11#include "rpc/Errors.hpp"
12#include "rpc/JS.hpp"
13#include "rpc/common/Types.hpp"
14#include "util/JsonUtils.hpp"
15#include "util/Taggable.hpp"
16#include "util/log/Logger.hpp"
17#include "web/Context.hpp"
18
19#include <boost/asio/spawn.hpp>
20#include <boost/json/array.hpp>
21#include <boost/json/object.hpp>
22#include <boost/json/value.hpp>
23#include <boost/regex.hpp>
24#include <boost/regex/v5/regex_fwd.hpp>
25#include <boost/regex/v5/regex_match.hpp>
26#include <fmt/format.h>
27#include <xrpl/basics/Number.h>
28#include <xrpl/basics/base_uint.h>
29#include <xrpl/json/json_value.h>
30#include <xrpl/protocol/AccountID.h>
31#include <xrpl/protocol/Book.h>
32#include <xrpl/protocol/Fees.h>
33#include <xrpl/protocol/Indexes.h>
34#include <xrpl/protocol/Issue.h>
35#include <xrpl/protocol/Keylet.h>
36#include <xrpl/protocol/LedgerFormats.h>
37#include <xrpl/protocol/LedgerHeader.h>
38#include <xrpl/protocol/MPTIssue.h>
39#include <xrpl/protocol/PublicKey.h>
40#include <xrpl/protocol/Rate.h>
41#include <xrpl/protocol/SField.h>
42#include <xrpl/protocol/STAmount.h>
43#include <xrpl/protocol/STBase.h>
44#include <xrpl/protocol/STLedgerEntry.h>
45#include <xrpl/protocol/STObject.h>
46#include <xrpl/protocol/STTx.h>
47#include <xrpl/protocol/SecretKey.h>
48#include <xrpl/protocol/Seed.h>
49#include <xrpl/protocol/Serializer.h>
50#include <xrpl/protocol/TxMeta.h>
51#include <xrpl/protocol/UintTypes.h>
52#include <xrpl/protocol/XRPAmount.h>
53#include <xrpl/protocol/jss.h>
54
55#include <chrono>
56#include <cstddef>
57#include <cstdint>
58#include <functional>
59#include <memory>
60#include <optional>
61#include <string>
62#include <tuple>
63#include <utility>
64#include <vector>
65
66namespace rpc {
67
69enum class NFTokenjson { ENABLE, DISABLE };
70
77std::optional<ripple::AccountID>
78accountFromStringStrict(std::string const& account);
79
87bool
88isOwnedByAccount(ripple::SLE const& sle, ripple::AccountID const& accountID);
89
97std::uint64_t
98getStartHint(ripple::SLE const& sle, ripple::AccountID const& accountID);
99
106std::optional<AccountCursor>
107parseAccountCursor(std::optional<std::string> jsonCursor);
108
109// TODO this function should probably be in a different file and namespace
116std::pair<std::shared_ptr<ripple::STTx const>, std::shared_ptr<ripple::STObject const>>
118
119// TODO this function should probably be in a different file and namespace
127std::pair<std::shared_ptr<ripple::STTx const>, std::shared_ptr<ripple::TxMeta const>>
128deserializeTxPlusMeta(data::TransactionAndMetadata const& blobs, std::uint32_t seq);
129
139std::pair<boost::json::object, boost::json::object>
141 data::TransactionAndMetadata const& blobs,
142 std::uint32_t apiVersion,
143 NFTokenjson nftEnabled = NFTokenjson::DISABLE,
144 std::optional<uint16_t> networkId = std::nullopt
145);
146
154boost::json::object
155toJsonWithBinaryTx(data::TransactionAndMetadata const& txnPlusMeta, std::uint32_t apiVersion);
156
163void
164insertDeliverMaxAlias(boost::json::object& txJson, std::uint32_t apiVersion);
165
175bool
177 boost::json::object& metaJson,
178 std::shared_ptr<ripple::STTx const> const& txn,
179 std::shared_ptr<ripple::TxMeta const> const& meta,
180 uint32_t date
181);
182
195bool
197 boost::json::object& txnJson,
198 std::shared_ptr<ripple::STTx const> const& txn,
199 boost::json::object& metaJson,
200 std::shared_ptr<ripple::TxMeta const> const& meta
201);
202
209boost::json::object
210toJson(ripple::STBase const& obj);
211
218boost::json::object
219toJson(ripple::SLE const& sle);
220
229boost::json::object
230toJson(ripple::LedgerHeader const& info, bool binary, std::uint32_t apiVersion);
231
238boost::json::object
239toJson(ripple::TxMeta const& meta);
240
241using RippledJson = Json::Value;
242
249boost::json::value
250toBoostJson(RippledJson const& value);
251
261boost::json::object
263 ripple::LedgerHeader const& lgrInfo,
264 ripple::Fees const& fees,
265 std::string const& ledgerRange,
266 std::uint32_t txnCount
267);
268
276std::expected<ripple::LedgerHeader, Status>
278 std::shared_ptr<data::BackendInterface const> const& backend,
279 web::Context const& ctx
280);
281
292std::expected<ripple::LedgerHeader, Status>
294 BackendInterface const& backend,
295 boost::asio::yield_context yield,
296 std::optional<std::string> ledgerHash,
297 std::optional<uint32_t> ledgerIndex,
298 uint32_t maxSeq
299);
300
314std::expected<AccountCursor, Status>
316 BackendInterface const& backend,
317 ripple::Keylet const& owner,
318 ripple::uint256 const& hexMarker,
319 std::uint32_t startHint,
320 std::uint32_t sequence,
321 std::uint32_t limit,
322 boost::asio::yield_context yield,
323 std::function<void(ripple::SLE)> atOwnedNode
324);
325
341std::expected<AccountCursor, Status>
343 BackendInterface const& backend,
344 ripple::AccountID const& accountID,
345 std::uint32_t sequence,
346 std::uint32_t limit,
347 std::optional<std::string> jsonCursor,
348 boost::asio::yield_context yield,
349 std::function<void(ripple::SLE)> atOwnedNode,
350 bool nftIncluded = false
351);
352
362std::shared_ptr<ripple::SLE const>
363read(
364 std::shared_ptr<data::BackendInterface const> const& backend,
365 ripple::Keylet const& keylet,
366 ripple::LedgerHeader const& lgrInfo,
367 web::Context const& context
368);
369
376std::vector<ripple::AccountID>
377getAccountsFromTransaction(boost::json::object const& transaction);
378
386std::vector<unsigned char>
387ledgerHeaderToBlob(ripple::LedgerHeader const& info, bool includeHash = false);
388
398bool
400 BackendInterface const& backend,
401 std::uint32_t seq,
402 ripple::AccountID const& issuer,
403 boost::asio::yield_context yield
404);
405
417bool
419 BackendInterface const& backend,
420 std::uint32_t sequence,
421 ripple::AccountID const& account,
422 ripple::Currency const& currency,
423 ripple::AccountID const& issuer,
424 boost::asio::yield_context yield
425);
426
437bool
439 BackendInterface const& backend,
440 std::uint32_t sequence,
441 ripple::Keylet const& keylet,
442 std::vector<std::uint32_t> const& flags,
443 boost::asio::yield_context yield
444);
445
460bool
462 BackendInterface const& backend,
463 std::uint32_t sequence,
464 ripple::AccountID const& account,
465 ripple::Currency const& currency,
466 ripple::AccountID const& issuer,
467 boost::asio::yield_context yield
468);
469
481bool
483 BackendInterface const& backend,
484 std::uint32_t sequence,
485 ripple::AccountID const& account,
486 ripple::Issue const& asset,
487 ripple::Issue const& asset2,
488 boost::asio::yield_context yield
489);
490
502ripple::STAmount
504 BackendInterface const& backend,
505 data::AmendmentCenterInterface const& amendmentCenter,
506 std::uint32_t sequence,
507 ripple::STAmount const& amount,
508 ripple::AccountID const& id,
509 boost::asio::yield_context yield
510);
511
525ripple::STAmount
527 BackendInterface const& backend,
528 data::AmendmentCenterInterface const& amendmentCenter,
529 std::uint32_t sequence,
530 ripple::AccountID const& account,
531 ripple::Currency const& currency,
532 ripple::AccountID const& issuer,
533 bool zeroIfFrozen,
534 boost::asio::yield_context yield
535);
536
549ripple::STAmount
551 BackendInterface const& backend,
552 std::uint32_t sequence,
553 ripple::AccountID const& account,
554 ripple::Currency const& currency,
555 ripple::AccountID const& issuer,
556 bool const zeroIfFrozen,
557 boost::asio::yield_context yield
558);
559
569ripple::Rate
571 BackendInterface const& backend,
572 std::uint32_t sequence,
573 ripple::AccountID const& issuer,
574 boost::asio::yield_context yield
575);
576
586ripple::XRPAmount
588 BackendInterface const& backend,
589 std::uint32_t sequence,
590 ripple::AccountID const& id,
591 boost::asio::yield_context yield
592);
593
606boost::json::array
608 std::vector<data::LedgerObject> const& offers,
609 ripple::Book const& book,
610 ripple::AccountID const& takerID,
611 data::BackendInterface const& backend,
612 data::AmendmentCenterInterface const& amendmentCenter,
613 std::uint32_t ledgerSequence,
614 boost::asio::yield_context yield
615);
616
627std::expected<ripple::Book, Status>
629 ripple::Currency pays,
630 ripple::AccountID payIssuer,
631 ripple::Currency gets,
632 ripple::AccountID getIssuer,
633 std::optional<std::string> const& domain
634);
635
642std::expected<ripple::Book, Status>
643parseBook(boost::json::object const& request);
644
651std::expected<ripple::AccountID, Status>
652parseTaker(boost::json::value const& taker);
653
661ripple::Issue
662parseIssue(boost::json::object const& issue);
663
669bool
670specifiesCurrentOrClosedLedger(boost::json::object const& request);
671
679bool
680isAdminCmd(std::string const& method, boost::json::object const& request);
681
688std::expected<ripple::uint256, Status>
689getNFTID(boost::json::object const& request);
690
699std::optional<std::string>
700encodeCTID(uint32_t ledgerSeq, uint16_t txnIndex, uint16_t networkId) noexcept;
701
709template <typename T>
710inline std::optional<std::tuple<uint32_t, uint16_t, uint16_t>>
711decodeCTID(T const ctid) noexcept
712{
713 auto const getCTID64 = [](T const ctid) noexcept -> std::optional<uint64_t> {
714 if constexpr (std::is_convertible_v<T, std::string>) {
715 std::string const ctidString(ctid);
716 static constexpr std::size_t kCTID_STRING_LENGTH = 16;
717 if (ctidString.length() != kCTID_STRING_LENGTH)
718 return {};
719
720 if (!boost::regex_match(ctidString, boost::regex("^[0-9A-F]+$")))
721 return {};
722
723 return std::stoull(ctidString, nullptr, 16);
724 }
725
726 if constexpr (std::is_same_v<T, uint64_t>)
727 return ctid;
728
729 return {};
730 };
731
732 auto const ctidValue = getCTID64(ctid).value_or(0);
733
734 static constexpr uint64_t kCTID_PREFIX = 0xC000'0000'0000'0000ULL;
735 static constexpr uint64_t kCTID_PREFIX_MASK = 0xF000'0000'0000'0000ULL;
736
737 if ((ctidValue & kCTID_PREFIX_MASK) != kCTID_PREFIX)
738 return {};
739
740 uint32_t const ledgerSeq = (ctidValue >> 32) & 0xFFFF'FFFUL;
741 uint16_t const txnIndex = (ctidValue >> 16) & 0xFFFFU;
742 uint16_t const networkId = ctidValue & 0xFFFFU;
743 return {{ledgerSeq, txnIndex, networkId}};
744}
745
754template <typename DurationType>
755void
757 boost::json::object const& request,
758 util::BaseTagDecorator const& tag,
759 DurationType const& dur
760)
761{
762 using boost::json::serialize;
763
764 static util::Logger const log{"RPC"}; // NOLINT(readability-identifier-naming)
765 static constexpr std::int64_t kDURATION_ERROR_THRESHOLD_SECONDS = 10;
766
767 auto const millis = std::chrono::duration_cast<std::chrono::milliseconds>(dur).count();
768 auto const seconds = std::chrono::duration_cast<std::chrono::seconds>(dur).count();
769 auto const msg = fmt::format(
770 "Request processing duration = {} milliseconds. request = {}",
771 millis,
772 serialize(util::removeSecret(request))
773 );
774
775 if (seconds > kDURATION_ERROR_THRESHOLD_SECONDS) {
776 LOG(log.error()) << tag << msg;
777 } else if (seconds > 1) {
778 LOG(log.warn()) << tag << msg;
779 } else
780 LOG(log.info()) << tag << msg;
781}
782
789std::optional<ripple::Seed>
790parseRippleLibSeed(boost::json::value const& value);
791
804std::expected<AccountCursor, Status>
806 BackendInterface const& backend,
807 std::uint32_t sequence,
808 ripple::AccountID const& accountID,
809 ripple::uint256 nextPage,
810 std::uint32_t limit,
811 boost::asio::yield_context yield,
812 std::function<void(ripple::SLE)> atOwnedNode
813);
814
821std::optional<std::uint32_t>
822parseStringAsUInt(std::string const& value); // TODO: move to string utils or something?
823
831bool
833 std::shared_ptr<ripple::STTx const> const& txn,
834 std::shared_ptr<ripple::TxMeta const> const& meta
835);
836
846std::optional<ripple::STAmount>
848 std::shared_ptr<ripple::STTx const> const& txn,
849 std::shared_ptr<ripple::TxMeta const> const& meta,
850 std::uint32_t ledgerSequence,
851 uint32_t date
852);
853
854} // namespace rpc
The interface of an amendment center.
Definition AmendmentCenterInterface.hpp:17
The interface to the database used by Clio.
Definition BackendInterface.hpp:125
Represents any tag decorator.
Definition Taggable.hpp:55
A simple thread-safe logger for the channel specified in the constructor.
Definition Logger.hpp:77
Pump warn(SourceLocationType const &loc=CURRENT_SRC_LOCATION) const
Interface for logging at Severity::WRN severity.
Definition Logger.cpp:493
Pump error(SourceLocationType const &loc=CURRENT_SRC_LOCATION) const
Interface for logging at Severity::ERR severity.
Definition Logger.cpp:498
Pump info(SourceLocationType const &loc=CURRENT_SRC_LOCATION) const
Interface for logging at Severity::NFO severity.
Definition Logger.cpp:488
This namespace contains all the RPC logic and handlers.
Definition AMMHelpers.cpp:18
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:185
std::expected< ripple::uint256, Status > getNFTID(boost::json::object const &request)
Get the NFTID from the request.
Definition RPCHelpers.cpp:1631
std::uint64_t getStartHint(ripple::SLE const &sle, ripple::AccountID const &accountID)
Get the start hint for the account.
Definition RPCHelpers.cpp:568
ripple::Issue parseIssue(boost::json::object const &issue)
Parse the json object into a ripple::Issue object.
Definition RPCHelpers.cpp:1579
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:952
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:288
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:1647
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:981
std::optional< AccountCursor > parseAccountCursor(std::optional< std::string > jsonCursor)
Parse the account cursor from the JSON.
Definition RPCHelpers.cpp:89
std::expected< ripple::LedgerHeader, Status > ledgerHeaderFromRequest(std::shared_ptr< data::BackendInterface const > const &backend, web::Context const &ctx)
Get ledger info from the request.
Definition RPCHelpers.cpp:463
std::vector< ripple::AccountID > getAccountsFromTransaction(boost::json::object const &transaction)
Get the account associated with a transaction.
Definition RPCHelpers.cpp:888
void logDuration(boost::json::object const &request, util::BaseTagDecorator const &tag, DurationType const &dur)
Log the duration of the request processing.
Definition RPCHelpers.hpp:756
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:1083
std::optional< std::string > encodeCTID(uint32_t ledgerSeq, uint16_t txnIndex, uint16_t networkId) noexcept
Encode CTID as string.
Definition RPCHelpers.cpp:271
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:711
std::expected< ripple::Book, Status > parseBook(ripple::Currency pays, ripple::AccountID payIssuer, ripple::Currency gets, ripple::AccountID getIssuer, std::optional< std::string > const &domain)
Parse the book from the request.
Definition RPCHelpers.cpp:1361
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:1241
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:235
std::optional< ripple::AccountID > accountFromStringStrict(std::string const &account)
Get a ripple::AccountID from its string representation.
Definition RPCHelpers.cpp:162
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:1128
std::expected< ripple::LedgerHeader, Status > 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:517
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:1057
boost::json::object toJson(ripple::STBase const &obj)
Convert STBase object to JSON.
Definition RPCHelpers.cpp:226
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:1022
std::expected< ripple::AccountID, Status > parseTaker(boost::json::value const &taker)
Parse the taker from the request.
Definition RPCHelpers.cpp:1565
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:149
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:848
NFTokenjson
Enum for NFT json manipulation.
Definition RPCHelpers.hpp:69
std::optional< ripple::Seed > parseRippleLibSeed(boost::json::value const &value)
Parse a ripple-lib seed.
Definition RPCHelpers.cpp:866
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:376
bool specifiesCurrentOrClosedLedger(boost::json::object const &request)
Check whether the request specifies the current or closed ledger.
Definition RPCHelpers.cpp:1591
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:120
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:1219
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:909
boost::json::value toBoostJson(Json::Value const &value)
Convert a RippledJson to boost::json::value.
Definition RPCHelpers.cpp:396
std::expected< AccountCursor, Status > 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:640
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:1008
bool insertMPTIssuanceID(boost::json::object &txnJson, std::shared_ptr< ripple::STTx const > const &txn, boost::json::object &metaJson, std::shared_ptr< ripple::TxMeta const > const &meta)
Add "mpt_issuance_id" into various MPTToken transaction json.
Definition RPCHelpers.cpp:350
std::optional< std::uint32_t > parseStringAsUInt(std::string const &value)
Parse the string as a uint32_t.
Definition RPCHelpers.cpp:450
bool isAdminCmd(std::string const &method, boost::json::object const &request)
Check whether a request requires administrative privileges on rippled side.
Definition RPCHelpers.cpp:1604
std::expected< AccountCursor, Status > 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:588
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:932
std::vector< unsigned char > ledgerHeaderToBlob(ripple::LedgerHeader const &info, bool includeHash)
Convert a ledger header to a blob.
Definition RPCHelpers.cpp:550
boost::json::object removeSecret(boost::json::object const &object)
Removes any detected secret information from a response JSON object.
Definition JsonUtils.hpp:55
Represents a transaction and its metadata bundled together.
Definition Types.hpp:49
Context that is used by the Webserver to pass around information about an incoming request.
Definition Context.hpp:22