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
214bool
216 boost::json::object& txnJson,
217 std::shared_ptr<ripple::STTx const> const& txn,
218 boost::json::object& metaJson,
219 std::shared_ptr<ripple::TxMeta const> const& meta
220);
221
228boost::json::object
229toJson(ripple::STBase const& obj);
230
237boost::json::object
238toJson(ripple::SLE const& sle);
239
248boost::json::object
249toJson(ripple::LedgerHeader const& info, bool binary, std::uint32_t apiVersion);
250
257boost::json::object
258toJson(ripple::TxMeta const& meta);
259
260using RippledJson = Json::Value;
261
268boost::json::value
269toBoostJson(RippledJson const& value);
270
280boost::json::object
282 ripple::LedgerHeader const& lgrInfo,
283 ripple::Fees const& fees,
284 std::string const& ledgerRange,
285 std::uint32_t txnCount
286);
287
295std::expected<ripple::LedgerHeader, Status>
297 std::shared_ptr<data::BackendInterface const> const& backend,
298 web::Context const& ctx
299);
300
311std::expected<ripple::LedgerHeader, Status>
313 BackendInterface const& backend,
314 boost::asio::yield_context yield,
315 std::optional<std::string> ledgerHash,
316 std::optional<uint32_t> ledgerIndex,
317 uint32_t maxSeq
318);
319
333std::expected<AccountCursor, Status>
335 BackendInterface const& backend,
336 ripple::Keylet const& owner,
337 ripple::uint256 const& hexMarker,
338 std::uint32_t startHint,
339 std::uint32_t sequence,
340 std::uint32_t limit,
341 boost::asio::yield_context yield,
342 std::function<void(ripple::SLE)> atOwnedNode
343);
344
360std::expected<AccountCursor, Status>
362 BackendInterface const& backend,
363 ripple::AccountID const& accountID,
364 std::uint32_t sequence,
365 std::uint32_t limit,
366 std::optional<std::string> jsonCursor,
367 boost::asio::yield_context yield,
368 std::function<void(ripple::SLE)> atOwnedNode,
369 bool nftIncluded = false
370);
371
381std::shared_ptr<ripple::SLE const>
382read(
383 std::shared_ptr<data::BackendInterface const> const& backend,
384 ripple::Keylet const& keylet,
385 ripple::LedgerHeader const& lgrInfo,
386 web::Context const& context
387);
388
395std::vector<ripple::AccountID>
396getAccountsFromTransaction(boost::json::object const& transaction);
397
405std::vector<unsigned char>
406ledgerHeaderToBlob(ripple::LedgerHeader const& info, bool includeHash = false);
407
417bool
419 BackendInterface const& backend,
420 std::uint32_t seq,
421 ripple::AccountID const& issuer,
422 boost::asio::yield_context yield
423);
424
436bool
438 BackendInterface const& backend,
439 std::uint32_t sequence,
440 ripple::AccountID const& account,
441 ripple::Currency const& currency,
442 ripple::AccountID const& issuer,
443 boost::asio::yield_context yield
444);
445
456bool
458 BackendInterface const& backend,
459 std::uint32_t sequence,
460 ripple::Keylet const& keylet,
461 std::vector<std::uint32_t> const& flags,
462 boost::asio::yield_context yield
463);
464
479bool
481 BackendInterface const& backend,
482 std::uint32_t sequence,
483 ripple::AccountID const& account,
484 ripple::Currency const& currency,
485 ripple::AccountID const& issuer,
486 boost::asio::yield_context yield
487);
488
500bool
502 BackendInterface const& backend,
503 std::uint32_t sequence,
504 ripple::AccountID const& account,
505 ripple::Issue const& asset,
506 ripple::Issue const& asset2,
507 boost::asio::yield_context yield
508);
509
521ripple::STAmount
523 BackendInterface const& backend,
524 data::AmendmentCenterInterface const& amendmentCenter,
525 std::uint32_t sequence,
526 ripple::STAmount const& amount,
527 ripple::AccountID const& id,
528 boost::asio::yield_context yield
529);
530
544ripple::STAmount
546 BackendInterface const& backend,
547 data::AmendmentCenterInterface const& amendmentCenter,
548 std::uint32_t sequence,
549 ripple::AccountID const& account,
550 ripple::Currency const& currency,
551 ripple::AccountID const& issuer,
552 bool zeroIfFrozen,
553 boost::asio::yield_context yield
554);
555
568ripple::STAmount
570 BackendInterface const& backend,
571 std::uint32_t sequence,
572 ripple::AccountID const& account,
573 ripple::Currency const& currency,
574 ripple::AccountID const& issuer,
575 bool const zeroIfFrozen,
576 boost::asio::yield_context yield
577);
578
588ripple::Rate
590 BackendInterface const& backend,
591 std::uint32_t sequence,
592 ripple::AccountID const& issuer,
593 boost::asio::yield_context yield
594);
595
605ripple::XRPAmount
607 BackendInterface const& backend,
608 std::uint32_t sequence,
609 ripple::AccountID const& id,
610 boost::asio::yield_context yield
611);
612
625boost::json::array
627 std::vector<data::LedgerObject> const& offers,
628 ripple::Book const& book,
629 ripple::AccountID const& takerID,
630 data::BackendInterface const& backend,
631 data::AmendmentCenterInterface const& amendmentCenter,
632 std::uint32_t ledgerSequence,
633 boost::asio::yield_context yield
634);
635
646std::expected<ripple::Book, Status>
648 ripple::Currency pays,
649 ripple::AccountID payIssuer,
650 ripple::Currency gets,
651 ripple::AccountID getIssuer,
652 std::optional<std::string> const& domain
653);
654
661std::expected<ripple::Book, Status>
662parseBook(boost::json::object const& request);
663
670std::expected<ripple::AccountID, Status>
671parseTaker(boost::json::value const& taker);
672
680ripple::Issue
681parseIssue(boost::json::object const& issue);
682
688bool
689specifiesCurrentOrClosedLedger(boost::json::object const& request);
690
698bool
699isAdminCmd(std::string const& method, boost::json::object const& request);
700
707std::expected<ripple::uint256, Status>
708getNFTID(boost::json::object const& request);
709
718std::optional<std::string>
719encodeCTID(uint32_t ledgerSeq, uint16_t txnIndex, uint16_t networkId) noexcept;
720
728template <typename T>
729inline std::optional<std::tuple<uint32_t, uint16_t, uint16_t>>
730decodeCTID(T const ctid) noexcept
731{
732 auto const getCTID64 = [](T const ctid) noexcept -> std::optional<uint64_t> {
733 if constexpr (std::is_convertible_v<T, std::string>) {
734 std::string const ctidString(ctid);
735 static constexpr std::size_t kCTID_STRING_LENGTH = 16;
736 if (ctidString.length() != kCTID_STRING_LENGTH)
737 return {};
738
739 if (!boost::regex_match(ctidString, boost::regex("^[0-9A-F]+$")))
740 return {};
741
742 return std::stoull(ctidString, nullptr, 16);
743 }
744
745 if constexpr (std::is_same_v<T, uint64_t>)
746 return ctid;
747
748 return {};
749 };
750
751 auto const ctidValue = getCTID64(ctid).value_or(0);
752
753 static constexpr uint64_t kCTID_PREFIX = 0xC000'0000'0000'0000ULL;
754 static constexpr uint64_t kCTID_PREFIX_MASK = 0xF000'0000'0000'0000ULL;
755
756 if ((ctidValue & kCTID_PREFIX_MASK) != kCTID_PREFIX)
757 return {};
758
759 uint32_t const ledgerSeq = (ctidValue >> 32) & 0xFFFF'FFFUL;
760 uint16_t const txnIndex = (ctidValue >> 16) & 0xFFFFU;
761 uint16_t const networkId = ctidValue & 0xFFFFU;
762 return {{ledgerSeq, txnIndex, networkId}};
763}
764
773template <typename DurationType>
774void
776 boost::json::object const& request,
777 util::BaseTagDecorator const& tag,
778 DurationType const& dur
779)
780{
781 using boost::json::serialize;
782
783 static util::Logger const log{"RPC"}; // NOLINT(readability-identifier-naming)
784 static constexpr std::int64_t kDURATION_ERROR_THRESHOLD_SECONDS = 10;
785
786 auto const millis = std::chrono::duration_cast<std::chrono::milliseconds>(dur).count();
787 auto const seconds = std::chrono::duration_cast<std::chrono::seconds>(dur).count();
788 auto const msg = fmt::format(
789 "Request processing duration = {} milliseconds. request = {}",
790 millis,
791 serialize(util::removeSecret(request))
792 );
793
794 if (seconds > kDURATION_ERROR_THRESHOLD_SECONDS) {
795 LOG(log.error()) << tag << msg;
796 } else if (seconds > 1) {
797 LOG(log.warn()) << tag << msg;
798 } else
799 LOG(log.info()) << tag << msg;
800}
801
808std::optional<ripple::Seed>
809parseRippleLibSeed(boost::json::value const& value);
810
823std::expected<AccountCursor, Status>
825 BackendInterface const& backend,
826 std::uint32_t sequence,
827 ripple::AccountID const& accountID,
828 ripple::uint256 nextPage,
829 std::uint32_t limit,
830 boost::asio::yield_context yield,
831 std::function<void(ripple::SLE)> atOwnedNode
832);
833
840std::optional<std::uint32_t>
841parseStringAsUInt(std::string const& value); // TODO: move to string utils or something?
842
850bool
852 std::shared_ptr<ripple::STTx const> const& txn,
853 std::shared_ptr<ripple::TxMeta const> const& meta
854);
855
865std::optional<ripple::STAmount>
867 std::shared_ptr<ripple::STTx const> const& txn,
868 std::shared_ptr<ripple::TxMeta const> const& meta,
869 std::uint32_t ledgerSequence,
870 uint32_t date
871);
872
873} // namespace rpc
The interface of an amendment center.
Definition AmendmentCenterInterface.hpp:36
The interface to the database used by Clio.
Definition BackendInterface.hpp:144
Represents any tag decorator.
Definition Taggable.hpp:74
A simple thread-safe logger for the channel specified in the constructor.
Definition Logger.hpp:96
Pump warn(SourceLocationType const &loc=CURRENT_SRC_LOCATION) const
Interface for logging at Severity::WRN severity.
Definition Logger.cpp:512
Pump error(SourceLocationType const &loc=CURRENT_SRC_LOCATION) const
Interface for logging at Severity::ERR severity.
Definition Logger.cpp:517
Pump info(SourceLocationType const &loc=CURRENT_SRC_LOCATION) const
Interface for logging at Severity::NFO severity.
Definition Logger.cpp:507
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:204
std::expected< ripple::uint256, Status > getNFTID(boost::json::object const &request)
Get the NFTID from the request.
Definition RPCHelpers.cpp:1641
std::uint64_t getStartHint(ripple::SLE const &sle, ripple::AccountID const &accountID)
Get the start hint for the account.
Definition RPCHelpers.cpp:587
ripple::Issue parseIssue(boost::json::object const &issue)
Parse the json object into a ripple::Issue object.
Definition RPCHelpers.cpp:1589
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:969
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:1657
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:998
std::optional< AccountCursor > parseAccountCursor(std::optional< std::string > jsonCursor)
Parse the account cursor from the JSON.
Definition RPCHelpers.cpp:108
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:482
std::vector< ripple::AccountID > getAccountsFromTransaction(boost::json::object const &transaction)
Get the account associated with a transaction.
Definition RPCHelpers.cpp:905
void logDuration(boost::json::object const &request, util::BaseTagDecorator const &tag, DurationType const &dur)
Log the duration of the request processing.
Definition RPCHelpers.hpp:775
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:1100
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:730
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:1378
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:1258
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:181
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:1145
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:536
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:1074
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:1039
std::expected< ripple::AccountID, Status > parseTaker(boost::json::value const &taker)
Parse the taker from the request.
Definition RPCHelpers.cpp:1575
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:168
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:865
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:883
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:395
bool specifiesCurrentOrClosedLedger(boost::json::object const &request)
Check whether the request specifies the current or closed ledger.
Definition RPCHelpers.cpp:1601
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:139
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:1236
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:926
boost::json::value toBoostJson(Json::Value const &value)
Convert a RippledJson to boost::json::value.
Definition RPCHelpers.cpp:415
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:659
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:1025
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:369
std::optional< std::uint32_t > parseStringAsUInt(std::string const &value)
Parse the string as a uint32_t.
Definition RPCHelpers.cpp:469
bool isAdminCmd(std::string const &method, boost::json::object const &request)
Check whether a request requires administrative privileges on rippled side.
Definition RPCHelpers.cpp:1614
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:607
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:949
std::vector< unsigned char > ledgerHeaderToBlob(ripple::LedgerHeader const &info, bool includeHash)
Convert a ledger header to a blob.
Definition RPCHelpers.cpp:569
boost::json::object removeSecret(boost::json::object const &object)
Removes any detected secret information from a response JSON object.
Definition JsonUtils.hpp:74
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:41