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
210bool
212 boost::json::object& metaJson,
213 std::shared_ptr<ripple::STTx const> const& txn,
214 std::shared_ptr<ripple::TxMeta const> const& meta
215);
216
223boost::json::object
224toJson(ripple::STBase const& obj);
225
232boost::json::object
233toJson(ripple::SLE const& sle);
234
243boost::json::object
244toJson(ripple::LedgerHeader const& info, bool binary, std::uint32_t apiVersion);
245
252boost::json::object
253toJson(ripple::TxMeta const& meta);
254
255using RippledJson = Json::Value;
256
263boost::json::value
264toBoostJson(RippledJson const& value);
265
275boost::json::object
277 ripple::LedgerHeader const& lgrInfo,
278 ripple::Fees const& fees,
279 std::string const& ledgerRange,
280 std::uint32_t txnCount
281);
282
290std::expected<ripple::LedgerHeader, Status>
291ledgerHeaderFromRequest(std::shared_ptr<data::BackendInterface const> const& backend, web::Context const& ctx);
292
303std::expected<ripple::LedgerHeader, Status>
305 BackendInterface const& backend,
306 boost::asio::yield_context yield,
307 std::optional<std::string> ledgerHash,
308 std::optional<uint32_t> ledgerIndex,
309 uint32_t maxSeq
310);
311
325std::expected<AccountCursor, Status>
327 BackendInterface const& backend,
328 ripple::Keylet const& owner,
329 ripple::uint256 const& hexMarker,
330 std::uint32_t startHint,
331 std::uint32_t sequence,
332 std::uint32_t limit,
333 boost::asio::yield_context yield,
334 std::function<void(ripple::SLE)> atOwnedNode
335);
336
352std::expected<AccountCursor, Status>
354 BackendInterface const& backend,
355 ripple::AccountID const& accountID,
356 std::uint32_t sequence,
357 std::uint32_t limit,
358 std::optional<std::string> jsonCursor,
359 boost::asio::yield_context yield,
360 std::function<void(ripple::SLE)> atOwnedNode,
361 bool nftIncluded = false
362);
363
373std::shared_ptr<ripple::SLE const>
374read(
375 std::shared_ptr<data::BackendInterface const> const& backend,
376 ripple::Keylet const& keylet,
377 ripple::LedgerHeader const& lgrInfo,
378 web::Context const& context
379);
380
387std::vector<ripple::AccountID>
388getAccountsFromTransaction(boost::json::object const& transaction);
389
397std::vector<unsigned char>
398ledgerHeaderToBlob(ripple::LedgerHeader const& info, bool includeHash = false);
399
409bool
411 BackendInterface const& backend,
412 std::uint32_t seq,
413 ripple::AccountID const& issuer,
414 boost::asio::yield_context yield
415);
416
428bool
430 BackendInterface const& backend,
431 std::uint32_t sequence,
432 ripple::AccountID const& account,
433 ripple::Currency const& currency,
434 ripple::AccountID const& issuer,
435 boost::asio::yield_context yield
436);
437
448bool
450 BackendInterface const& backend,
451 std::uint32_t sequence,
452 ripple::Keylet const& keylet,
453 std::vector<std::uint32_t> const& flags,
454 boost::asio::yield_context yield
455);
456
471bool
473 BackendInterface const& backend,
474 std::uint32_t sequence,
475 ripple::AccountID const& account,
476 ripple::Currency const& currency,
477 ripple::AccountID const& issuer,
478 boost::asio::yield_context yield
479);
480
492bool
494 BackendInterface const& backend,
495 std::uint32_t sequence,
496 ripple::AccountID const& account,
497 ripple::Issue const& asset,
498 ripple::Issue const& asset2,
499 boost::asio::yield_context yield
500);
501
513ripple::STAmount
515 BackendInterface const& backend,
516 data::AmendmentCenterInterface const& amendmentCenter,
517 std::uint32_t sequence,
518 ripple::STAmount const& amount,
519 ripple::AccountID const& id,
520 boost::asio::yield_context yield
521);
522
536ripple::STAmount
538 BackendInterface const& backend,
539 data::AmendmentCenterInterface const& amendmentCenter,
540 std::uint32_t sequence,
541 ripple::AccountID const& account,
542 ripple::Currency const& currency,
543 ripple::AccountID const& issuer,
544 bool zeroIfFrozen,
545 boost::asio::yield_context yield
546);
547
560ripple::STAmount
562 BackendInterface const& backend,
563 std::uint32_t sequence,
564 ripple::AccountID const& account,
565 ripple::Currency const& currency,
566 ripple::AccountID const& issuer,
567 bool const zeroIfFrozen,
568 boost::asio::yield_context yield
569);
570
580ripple::Rate
582 BackendInterface const& backend,
583 std::uint32_t sequence,
584 ripple::AccountID const& issuer,
585 boost::asio::yield_context yield
586);
587
597ripple::XRPAmount
599 BackendInterface const& backend,
600 std::uint32_t sequence,
601 ripple::AccountID const& id,
602 boost::asio::yield_context yield
603);
604
617boost::json::array
619 std::vector<data::LedgerObject> const& offers,
620 ripple::Book const& book,
621 ripple::AccountID const& takerID,
622 data::BackendInterface const& backend,
623 data::AmendmentCenterInterface const& amendmentCenter,
624 std::uint32_t ledgerSequence,
625 boost::asio::yield_context yield
626);
627
638std::expected<ripple::Book, Status>
640 ripple::Currency pays,
641 ripple::AccountID payIssuer,
642 ripple::Currency gets,
643 ripple::AccountID getIssuer,
644 std::optional<std::string> const& domain
645);
646
653std::expected<ripple::Book, Status>
654parseBook(boost::json::object const& request);
655
662std::expected<ripple::AccountID, Status>
663parseTaker(boost::json::value const& taker);
664
672ripple::Issue
673parseIssue(boost::json::object const& issue);
674
680bool
681specifiesCurrentOrClosedLedger(boost::json::object const& request);
682
690bool
691isAdminCmd(std::string const& method, boost::json::object const& request);
692
699std::expected<ripple::uint256, Status>
700getNFTID(boost::json::object const& request);
701
710std::optional<std::string>
711encodeCTID(uint32_t ledgerSeq, uint16_t txnIndex, uint16_t networkId) noexcept;
712
720template <typename T>
721inline std::optional<std::tuple<uint32_t, uint16_t, uint16_t>>
722decodeCTID(T const ctid) noexcept
723{
724 auto const getCTID64 = [](T const ctid) noexcept -> std::optional<uint64_t> {
725 if constexpr (std::is_convertible_v<T, std::string>) {
726 std::string const ctidString(ctid);
727 static constexpr std::size_t kCTID_STRING_LENGTH = 16;
728 if (ctidString.length() != kCTID_STRING_LENGTH)
729 return {};
730
731 if (!boost::regex_match(ctidString, boost::regex("^[0-9A-F]+$")))
732 return {};
733
734 return std::stoull(ctidString, nullptr, 16);
735 }
736
737 if constexpr (std::is_same_v<T, uint64_t>)
738 return ctid;
739
740 return {};
741 };
742
743 auto const ctidValue = getCTID64(ctid).value_or(0);
744
745 static constexpr uint64_t kCTID_PREFIX = 0xC000'0000'0000'0000ULL;
746 static constexpr uint64_t kCTID_PREFIX_MASK = 0xF000'0000'0000'0000ULL;
747
748 if ((ctidValue & kCTID_PREFIX_MASK) != kCTID_PREFIX)
749 return {};
750
751 uint32_t const ledgerSeq = (ctidValue >> 32) & 0xFFFF'FFFUL;
752 uint16_t const txnIndex = (ctidValue >> 16) & 0xFFFFU;
753 uint16_t const networkId = ctidValue & 0xFFFFU;
754 return {{ledgerSeq, txnIndex, networkId}};
755}
756
765template <typename DurationType>
766void
767logDuration(boost::json::object const& request, util::BaseTagDecorator const& tag, DurationType const& dur)
768{
769 using boost::json::serialize;
770
771 static util::Logger const log{"RPC"}; // NOLINT(readability-identifier-naming)
772 static constexpr std::int64_t kDURATION_ERROR_THRESHOLD_SECONDS = 10;
773
774 auto const millis = std::chrono::duration_cast<std::chrono::milliseconds>(dur).count();
775 auto const seconds = std::chrono::duration_cast<std::chrono::seconds>(dur).count();
776 auto const msg = fmt::format(
777 "Request processing duration = {} milliseconds. request = {}", millis, serialize(util::removeSecret(request))
778 );
779
780 if (seconds > kDURATION_ERROR_THRESHOLD_SECONDS) {
781 LOG(log.error()) << tag << msg;
782 } else if (seconds > 1) {
783 LOG(log.warn()) << tag << msg;
784 } else
785 LOG(log.info()) << tag << msg;
786}
787
794std::optional<ripple::Seed>
795parseRippleLibSeed(boost::json::value const& value);
796
809std::expected<AccountCursor, Status>
811 BackendInterface const& backend,
812 std::uint32_t sequence,
813 ripple::AccountID const& accountID,
814 ripple::uint256 nextPage,
815 std::uint32_t limit,
816 boost::asio::yield_context yield,
817 std::function<void(ripple::SLE)> atOwnedNode
818);
819
826std::optional<std::uint32_t>
827parseStringAsUInt(std::string const& value); // TODO: move to string utils or something?
828
836bool
838 std::shared_ptr<ripple::STTx const> const& txn,
839 std::shared_ptr<ripple::TxMeta const> const& meta
840);
841
851std::optional<ripple::STAmount>
853 std::shared_ptr<ripple::STTx const> const& txn,
854 std::shared_ptr<ripple::TxMeta const> const& meta,
855 std::uint32_t ledgerSequence,
856 uint32_t date
857);
858
859} // 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: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:209
std::expected< ripple::uint256, Status > getNFTID(boost::json::object const &request)
Get the NFTID from the request.
Definition RPCHelpers.cpp:1543
std::uint64_t getStartHint(ripple::SLE const &sle, ripple::AccountID const &accountID)
Get the start hint for the account.
Definition RPCHelpers.cpp:572
ripple::Issue parseIssue(boost::json::object const &issue)
Parse the json object into a ripple::Issue object.
Definition RPCHelpers.cpp:1493
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:367
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:928
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:306
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:1559
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:957
std::optional< AccountCursor > parseAccountCursor(std::optional< std::string > jsonCursor)
Parse the account cursor from the JSON.
Definition RPCHelpers.cpp:112
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:470
std::vector< ripple::AccountID > getAccountsFromTransaction(boost::json::object const &transaction)
Get the account associated with a transaction.
Definition RPCHelpers.cpp:866
void logDuration(boost::json::object const &request, util::BaseTagDecorator const &tag, DurationType const &dur)
Log the duration of the request processing.
Definition RPCHelpers.hpp:767
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:1046
std::optional< std::string > encodeCTID(uint32_t ledgerSeq, uint16_t txnIndex, uint16_t networkId) noexcept
Encode CTID as string.
Definition RPCHelpers.cpp:289
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:722
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:1313
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:1198
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:253
std::optional< ripple::AccountID > accountFromStringStrict(std::string const &account)
Get a ripple::AccountID from its string representation.
Definition RPCHelpers.cpp:187
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:1091
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:521
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:1029
boost::json::object toJson(ripple::STBase const &obj)
Convert STBase object to JSON.
Definition RPCHelpers.cpp:245
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:994
std::expected< ripple::AccountID, Status > parseTaker(boost::json::value const &taker)
Parse the taker from the request.
Definition RPCHelpers.cpp:1479
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:171
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:831
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:846
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:386
bool specifiesCurrentOrClosedLedger(boost::json::object const &request)
Check whether the request specifies the current or closed ledger.
Definition RPCHelpers.cpp:1505
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:143
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:1176
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:885
boost::json::value toBoostJson(Json::Value const &value)
Convert a RippledJson to boost::json::value.
Definition RPCHelpers.cpp:405
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:644
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:980
std::optional< std::uint32_t > parseStringAsUInt(std::string const &value)
Parse the string as a uint32_t.
Definition RPCHelpers.cpp:457
bool isAdminCmd(std::string const &method, boost::json::object const &request)
Check whether a request requires administrative privileges on rippled side.
Definition RPCHelpers.cpp:1518
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:592
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:908
std::vector< unsigned char > ledgerHeaderToBlob(ripple::LedgerHeader const &info, bool includeHash)
Convert a ledger header to a blob.
Definition RPCHelpers.cpp:554
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