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/JS.hpp"
32#include "rpc/common/Types.hpp"
33#include "util/JsonUtils.hpp"
34#include "util/Taggable.hpp"
35#include "util/log/Logger.hpp"
36#include "web/Context.hpp"
37
38#include <boost/asio/spawn.hpp>
39#include <boost/json/array.hpp>
40#include <boost/json/object.hpp>
41#include <boost/json/value.hpp>
42#include <boost/regex.hpp>
43#include <boost/regex/v5/regex_fwd.hpp>
44#include <boost/regex/v5/regex_match.hpp>
45#include <fmt/format.h>
46#include <xrpl/basics/Number.h>
47#include <xrpl/basics/base_uint.h>
48#include <xrpl/json/json_value.h>
49#include <xrpl/protocol/AccountID.h>
50#include <xrpl/protocol/Book.h>
51#include <xrpl/protocol/Fees.h>
52#include <xrpl/protocol/Indexes.h>
53#include <xrpl/protocol/Issue.h>
54#include <xrpl/protocol/Keylet.h>
55#include <xrpl/protocol/LedgerFormats.h>
56#include <xrpl/protocol/LedgerHeader.h>
57#include <xrpl/protocol/MPTIssue.h>
58#include <xrpl/protocol/PublicKey.h>
59#include <xrpl/protocol/Rate.h>
60#include <xrpl/protocol/SField.h>
61#include <xrpl/protocol/STAmount.h>
62#include <xrpl/protocol/STBase.h>
63#include <xrpl/protocol/STLedgerEntry.h>
64#include <xrpl/protocol/STObject.h>
65#include <xrpl/protocol/STTx.h>
66#include <xrpl/protocol/SecretKey.h>
67#include <xrpl/protocol/Seed.h>
68#include <xrpl/protocol/Serializer.h>
69#include <xrpl/protocol/TxMeta.h>
70#include <xrpl/protocol/UintTypes.h>
71#include <xrpl/protocol/XRPAmount.h>
72#include <xrpl/protocol/jss.h>
73
74#include <chrono>
75#include <cstddef>
76#include <cstdint>
77#include <functional>
78#include <memory>
79#include <optional>
80#include <string>
81#include <tuple>
82#include <utility>
83#include <vector>
84
85namespace rpc {
86
88enum class NFTokenjson { ENABLE, DISABLE };
89
96std::optional<ripple::AccountID>
97accountFromStringStrict(std::string const& account);
98
106bool
107isOwnedByAccount(ripple::SLE const& sle, ripple::AccountID const& accountID);
108
116std::uint64_t
117getStartHint(ripple::SLE const& sle, ripple::AccountID const& accountID);
118
125std::optional<AccountCursor>
126parseAccountCursor(std::optional<std::string> jsonCursor);
127
128// TODO this function should probably be in a different file and namespace
135std::pair<std::shared_ptr<ripple::STTx const>, std::shared_ptr<ripple::STObject const>>
137
138// TODO this function should probably be in a different file and namespace
146std::pair<std::shared_ptr<ripple::STTx const>, std::shared_ptr<ripple::TxMeta const>>
147deserializeTxPlusMeta(data::TransactionAndMetadata const& blobs, std::uint32_t seq);
148
158std::pair<boost::json::object, boost::json::object>
160 data::TransactionAndMetadata const& blobs,
161 std::uint32_t apiVersion,
162 NFTokenjson nftEnabled = NFTokenjson::DISABLE,
163 std::optional<uint16_t> networkId = std::nullopt
164);
165
173boost::json::object
174toJsonWithBinaryTx(data::TransactionAndMetadata const& txnPlusMeta, std::uint32_t apiVersion);
175
182void
183insertDeliverMaxAlias(boost::json::object& txJson, std::uint32_t apiVersion);
184
194bool
196 boost::json::object& metaJson,
197 std::shared_ptr<ripple::STTx const> const& txn,
198 std::shared_ptr<ripple::TxMeta const> const& meta,
199 uint32_t date
200);
201
209bool
210insertMPTIssuanceID(boost::json::object& txnJson, std::shared_ptr<ripple::TxMeta const> const& meta);
211
218boost::json::object
219toJson(ripple::STBase const& obj);
220
227boost::json::object
228toJson(ripple::SLE const& sle);
229
238boost::json::object
239toJson(ripple::LedgerHeader const& info, bool binary, std::uint32_t apiVersion);
240
247boost::json::object
248toJson(ripple::TxMeta const& meta);
249
250using RippledJson = Json::Value;
251
258boost::json::value
259toBoostJson(RippledJson const& value);
260
270boost::json::object
272 ripple::LedgerHeader const& lgrInfo,
273 ripple::Fees const& fees,
274 std::string const& ledgerRange,
275 std::uint32_t txnCount
276);
277
285std::expected<ripple::LedgerHeader, Status>
286ledgerHeaderFromRequest(std::shared_ptr<data::BackendInterface const> const& backend, web::Context const& ctx);
287
298std::expected<ripple::LedgerHeader, Status>
300 BackendInterface const& backend,
301 boost::asio::yield_context yield,
302 std::optional<std::string> ledgerHash,
303 std::optional<uint32_t> ledgerIndex,
304 uint32_t maxSeq
305);
306
320std::expected<AccountCursor, Status>
322 BackendInterface const& backend,
323 ripple::Keylet const& owner,
324 ripple::uint256 const& hexMarker,
325 std::uint32_t startHint,
326 std::uint32_t sequence,
327 std::uint32_t limit,
328 boost::asio::yield_context yield,
329 std::function<void(ripple::SLE)> atOwnedNode
330);
331
347std::expected<AccountCursor, Status>
349 BackendInterface const& backend,
350 ripple::AccountID const& accountID,
351 std::uint32_t sequence,
352 std::uint32_t limit,
353 std::optional<std::string> jsonCursor,
354 boost::asio::yield_context yield,
355 std::function<void(ripple::SLE)> atOwnedNode,
356 bool nftIncluded = false
357);
358
368std::shared_ptr<ripple::SLE const>
369read(
370 std::shared_ptr<data::BackendInterface const> const& backend,
371 ripple::Keylet const& keylet,
372 ripple::LedgerHeader const& lgrInfo,
373 web::Context const& context
374);
375
382std::vector<ripple::AccountID>
383getAccountsFromTransaction(boost::json::object const& transaction);
384
392std::vector<unsigned char>
393ledgerHeaderToBlob(ripple::LedgerHeader const& info, bool includeHash = false);
394
404bool
406 BackendInterface const& backend,
407 std::uint32_t seq,
408 ripple::AccountID const& issuer,
409 boost::asio::yield_context yield
410);
411
423bool
425 BackendInterface const& backend,
426 std::uint32_t sequence,
427 ripple::AccountID const& account,
428 ripple::Currency const& currency,
429 ripple::AccountID const& issuer,
430 boost::asio::yield_context yield
431);
432
443bool
445 BackendInterface const& backend,
446 std::uint32_t sequence,
447 ripple::Keylet const& keylet,
448 std::vector<std::uint32_t> const& flags,
449 boost::asio::yield_context yield
450);
451
466bool
468 BackendInterface const& backend,
469 std::uint32_t sequence,
470 ripple::AccountID const& account,
471 ripple::Currency const& currency,
472 ripple::AccountID const& issuer,
473 boost::asio::yield_context yield
474);
475
487bool
489 BackendInterface const& backend,
490 std::uint32_t sequence,
491 ripple::AccountID const& account,
492 ripple::Issue const& asset,
493 ripple::Issue const& asset2,
494 boost::asio::yield_context yield
495);
496
508ripple::STAmount
510 BackendInterface const& backend,
511 data::AmendmentCenterInterface const& amendmentCenter,
512 std::uint32_t sequence,
513 ripple::STAmount const& amount,
514 ripple::AccountID const& id,
515 boost::asio::yield_context yield
516);
517
531ripple::STAmount
533 BackendInterface const& backend,
534 data::AmendmentCenterInterface const& amendmentCenter,
535 std::uint32_t sequence,
536 ripple::AccountID const& account,
537 ripple::Currency const& currency,
538 ripple::AccountID const& issuer,
539 bool zeroIfFrozen,
540 boost::asio::yield_context yield
541);
542
555ripple::STAmount
557 BackendInterface const& backend,
558 std::uint32_t sequence,
559 ripple::AccountID const& account,
560 ripple::Currency const& currency,
561 ripple::AccountID const& issuer,
562 bool const zeroIfFrozen,
563 boost::asio::yield_context yield
564);
565
575ripple::Rate
577 BackendInterface const& backend,
578 std::uint32_t sequence,
579 ripple::AccountID const& issuer,
580 boost::asio::yield_context yield
581);
582
592ripple::XRPAmount
594 BackendInterface const& backend,
595 std::uint32_t sequence,
596 ripple::AccountID const& id,
597 boost::asio::yield_context yield
598);
599
612boost::json::array
614 std::vector<data::LedgerObject> const& offers,
615 ripple::Book const& book,
616 ripple::AccountID const& takerID,
617 data::BackendInterface const& backend,
618 data::AmendmentCenterInterface const& amendmentCenter,
619 std::uint32_t ledgerSequence,
620 boost::asio::yield_context yield
621);
622
633std::expected<ripple::Book, Status>
635 ripple::Currency pays,
636 ripple::AccountID payIssuer,
637 ripple::Currency gets,
638 ripple::AccountID getIssuer,
639 std::optional<std::string> const& domain
640);
641
648std::expected<ripple::Book, Status>
649parseBook(boost::json::object const& request);
650
657std::expected<ripple::AccountID, Status>
658parseTaker(boost::json::value const& taker);
659
667ripple::Issue
668parseIssue(boost::json::object const& issue);
669
675bool
676specifiesCurrentOrClosedLedger(boost::json::object const& request);
677
685bool
686isAdminCmd(std::string const& method, boost::json::object const& request);
687
694std::expected<ripple::uint256, Status>
695getNFTID(boost::json::object const& request);
696
705std::optional<std::string>
706encodeCTID(uint32_t ledgerSeq, uint16_t txnIndex, uint16_t networkId) noexcept;
707
715template <typename T>
716inline std::optional<std::tuple<uint32_t, uint16_t, uint16_t>>
717decodeCTID(T const ctid) noexcept
718{
719 auto const getCTID64 = [](T const ctid) noexcept -> std::optional<uint64_t> {
720 if constexpr (std::is_convertible_v<T, std::string>) {
721 std::string const ctidString(ctid);
722 static constexpr std::size_t kCTID_STRING_LENGTH = 16;
723 if (ctidString.length() != kCTID_STRING_LENGTH)
724 return {};
725
726 if (!boost::regex_match(ctidString, boost::regex("^[0-9A-F]+$")))
727 return {};
728
729 return std::stoull(ctidString, nullptr, 16);
730 }
731
732 if constexpr (std::is_same_v<T, uint64_t>)
733 return ctid;
734
735 return {};
736 };
737
738 auto const ctidValue = getCTID64(ctid).value_or(0);
739
740 static constexpr uint64_t kCTID_PREFIX = 0xC000'0000'0000'0000ULL;
741 static constexpr uint64_t kCTID_PREFIX_MASK = 0xF000'0000'0000'0000ULL;
742
743 if ((ctidValue & kCTID_PREFIX_MASK) != kCTID_PREFIX)
744 return {};
745
746 uint32_t const ledgerSeq = (ctidValue >> 32) & 0xFFFF'FFFUL;
747 uint16_t const txnIndex = (ctidValue >> 16) & 0xFFFFU;
748 uint16_t const networkId = ctidValue & 0xFFFFU;
749 return {{ledgerSeq, txnIndex, networkId}};
750}
751
760template <typename DurationType>
761void
762logDuration(boost::json::object const& request, util::BaseTagDecorator const& tag, DurationType const& dur)
763{
764 using boost::json::serialize;
765
766 static util::Logger const log{"RPC"}; // NOLINT(readability-identifier-naming)
767 static constexpr std::int64_t kDURATION_ERROR_THRESHOLD_SECONDS = 10;
768
769 auto const millis = std::chrono::duration_cast<std::chrono::milliseconds>(dur).count();
770 auto const seconds = std::chrono::duration_cast<std::chrono::seconds>(dur).count();
771 auto const msg = fmt::format(
772 "Request processing duration = {} milliseconds. request = {}", millis, 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:36
The interface to the database used by Clio.
Definition BackendInterface.hpp:139
Represents any tag decorator.
Definition Taggable.hpp:74
A simple thread-safe logger for the channel specified in the constructor.
Definition Logger.hpp:87
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::expected< ripple::uint256, Status > getNFTID(boost::json::object const &request)
Get the NFTID from the request.
Definition RPCHelpers.cpp:1541
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:1491
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:307
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:1557
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::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:468
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:762
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:717
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:1311
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
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
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:519
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
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::expected< ripple::AccountID, Status > parseTaker(boost::json::value const &taker)
Parse the taker from the request.
Definition RPCHelpers.cpp:1477
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:88
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 whether the request specifies the current or closed ledger.
Definition RPCHelpers.cpp:1503
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
bool insertMPTIssuanceID(boost::json::object &txnJson, std::shared_ptr< ripple::TxMeta const > const &meta)
Add "mpt_issuance_id" into MPTokenIssuanceCreate transaction json.
Definition RPCHelpers.cpp:369
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::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: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::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:1516
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:590
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