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/common/Types.hpp"
13#include "util/JsonUtils.hpp"
14#include "util/Taggable.hpp"
15#include "util/log/Logger.hpp"
16#include "web/Context.hpp"
17
18#include <boost/asio/spawn.hpp>
19#include <boost/json/array.hpp>
20#include <boost/json/object.hpp>
21#include <boost/json/value.hpp>
22#include <boost/regex.hpp>
23#include <boost/regex/v5/regex_match.hpp>
24#include <fmt/format.h>
25#include <rpcspec/Ledger.hpp>
26#include <xrpl/basics/Number.h>
27#include <xrpl/basics/base_uint.h>
28#include <xrpl/json/json_value.h>
29#include <xrpl/protocol/AccountID.h>
30#include <xrpl/protocol/Asset.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 <string_view>
63#include <tuple>
64#include <utility>
65#include <vector>
66
67namespace rpc {
68
72enum class NFTokenjson { ENABLE, DISABLE };
73
80std::optional<xrpl::AccountID>
81accountFromStringStrict(std::string const& account);
82
90bool
91isOwnedByAccount(xrpl::SLE const& sle, xrpl::AccountID const& accountID);
92
100std::uint64_t
101getStartHint(xrpl::SLE const& sle, xrpl::AccountID const& accountID);
102
109std::optional<AccountCursor>
110parseAccountCursor(std::optional<std::string> jsonCursor);
111
112// TODO this function should probably be in a different file and namespace
119std::pair<std::shared_ptr<xrpl::STTx const>, std::shared_ptr<xrpl::STObject const>>
121
122// TODO this function should probably be in a different file and namespace
130std::pair<std::shared_ptr<xrpl::STTx const>, std::shared_ptr<xrpl::TxMeta const>>
131deserializeTxPlusMeta(data::TransactionAndMetadata const& blobs, std::uint32_t seq);
132
142std::pair<boost::json::object, boost::json::object>
144 data::TransactionAndMetadata const& blobs,
145 std::uint32_t apiVersion,
146 NFTokenjson nftEnabled = NFTokenjson::DISABLE,
147 std::optional<uint32_t> networkId = std::nullopt
148);
149
157boost::json::object
158toJsonWithBinaryTx(data::TransactionAndMetadata const& txnPlusMeta, std::uint32_t apiVersion);
159
166void
167insertDeliverMaxAlias(boost::json::object& txJson, std::uint32_t apiVersion);
168
178bool
180 boost::json::object& metaJson,
181 std::shared_ptr<xrpl::STTx const> const& txn,
182 std::shared_ptr<xrpl::TxMeta const> const& meta,
183 uint32_t date
184);
185
198bool
200 boost::json::object& txnJson,
201 std::shared_ptr<xrpl::STTx const> const& txn,
202 boost::json::object& metaJson,
203 std::shared_ptr<xrpl::TxMeta const> const& meta
204);
205
212boost::json::object
213toJson(xrpl::STBase const& obj);
214
221boost::json::object
222toJson(xrpl::SLE const& sle);
223
232boost::json::object
233toJson(xrpl::LedgerHeader const& info, bool binary, std::uint32_t apiVersion);
234
241boost::json::object
242toJson(xrpl::TxMeta const& meta);
243
244using RippledJson = json::Value;
245
252boost::json::value
253toBoostJson(RippledJson const& value);
254
264boost::json::object
266 xrpl::LedgerHeader const& lgrInfo,
267 xrpl::Fees const& fees,
268 std::string const& ledgerRange,
269 std::uint32_t txnCount
270);
271
279std::expected<xrpl::LedgerHeader, Status>
281 std::shared_ptr<data::BackendInterface const> const& backend,
282 web::Context const& ctx
283);
284
295std::expected<xrpl::LedgerHeader, Status>
297 BackendInterface const& backend,
298 boost::asio::yield_context yield,
299 std::optional<std::string> ledgerHash,
300 std::optional<uint32_t> ledgerIndex,
301 uint32_t maxSeq
302);
303
329std::expected<xrpl::LedgerHeader, Status>
331 BackendInterface const& backend,
332 boost::asio::yield_context yield,
333 rpc::spec::LedgerSpecifier const& ledger,
334 uint32_t maxSeq
335);
336
350std::expected<AccountCursor, Status>
352 BackendInterface const& backend,
353 xrpl::Keylet const& owner,
354 xrpl::uint256 const& hexMarker,
355 std::uint32_t startHint,
356 std::uint32_t sequence,
357 std::uint32_t limit,
358 boost::asio::yield_context yield,
359 std::function<void(xrpl::SLE)> atOwnedNode
360);
361
377std::expected<AccountCursor, Status>
379 BackendInterface const& backend,
380 xrpl::AccountID const& accountID,
381 std::uint32_t sequence,
382 std::uint32_t limit,
383 std::optional<std::string> jsonCursor,
384 boost::asio::yield_context yield,
385 std::function<void(xrpl::SLE)> atOwnedNode,
386 bool nftIncluded = false
387);
388
398std::shared_ptr<xrpl::SLE const>
399read(
400 std::shared_ptr<data::BackendInterface const> const& backend,
401 xrpl::Keylet const& keylet,
402 xrpl::LedgerHeader const& lgrInfo,
403 web::Context const& context
404);
405
412std::vector<xrpl::AccountID>
413getAccountsFromTransaction(boost::json::object const& transaction);
414
422std::vector<unsigned char>
423ledgerHeaderToBlob(xrpl::LedgerHeader const& info, bool includeHash = false);
424
434bool
436 BackendInterface const& backend,
437 std::uint32_t seq,
438 xrpl::AccountID const& issuer,
439 boost::asio::yield_context yield
440);
441
453bool
455 BackendInterface const& backend,
456 std::uint32_t sequence,
457 xrpl::AccountID const& account,
458 xrpl::Currency const& currency,
459 xrpl::AccountID const& issuer,
460 boost::asio::yield_context yield
461);
462
473bool
475 BackendInterface const& backend,
476 std::uint32_t sequence,
477 xrpl::Keylet const& keylet,
478 std::vector<std::uint32_t> const& flags,
479 boost::asio::yield_context yield
480);
481
496bool
498 BackendInterface const& backend,
499 std::uint32_t sequence,
500 xrpl::AccountID const& account,
501 xrpl::Currency const& currency,
502 xrpl::AccountID const& issuer,
503 boost::asio::yield_context yield
504);
505
517bool
519 BackendInterface const& backend,
520 std::uint32_t sequence,
521 xrpl::AccountID const& account,
522 xrpl::Issue const& asset,
523 xrpl::Issue const& asset2,
524 boost::asio::yield_context yield
525);
526
538xrpl::STAmount
540 BackendInterface const& backend,
541 data::AmendmentCenterInterface const& amendmentCenter,
542 std::uint32_t sequence,
543 xrpl::STAmount const& amount,
544 xrpl::AccountID const& id,
545 boost::asio::yield_context yield
546);
547
561xrpl::STAmount
563 BackendInterface const& backend,
564 data::AmendmentCenterInterface const& amendmentCenter,
565 std::uint32_t sequence,
566 xrpl::AccountID const& account,
567 xrpl::Currency const& currency,
568 xrpl::AccountID const& issuer,
569 bool zeroIfFrozen,
570 boost::asio::yield_context yield
571);
572
585xrpl::STAmount
587 BackendInterface const& backend,
588 std::uint32_t sequence,
589 xrpl::AccountID const& account,
590 xrpl::Currency const& currency,
591 xrpl::AccountID const& issuer,
592 bool const zeroIfFrozen,
593 boost::asio::yield_context yield
594);
595
605xrpl::Rate
607 BackendInterface const& backend,
608 std::uint32_t sequence,
609 xrpl::AccountID const& issuer,
610 boost::asio::yield_context yield
611);
612
634xrpl::STAmount
636 BackendInterface const& backend,
637 std::uint32_t sequence,
638 xrpl::AccountID const& account,
639 xrpl::MPTIssue const& mptIssue,
640 bool zeroIfFrozen,
641 boost::asio::yield_context yield
642);
643
653xrpl::XRPAmount
655 BackendInterface const& backend,
656 std::uint32_t sequence,
657 xrpl::AccountID const& id,
658 boost::asio::yield_context yield
659);
660
673boost::json::array
675 std::vector<data::LedgerObject> const& offers,
676 xrpl::Book const& book,
677 xrpl::AccountID const& takerID,
678 data::BackendInterface const& backend,
679 data::AmendmentCenterInterface const& amendmentCenter,
680 std::uint32_t ledgerSequence,
681 boost::asio::yield_context yield
682);
683
694std::expected<xrpl::Book, Status>
696 xrpl::Currency pays,
697 xrpl::AccountID payIssuer,
698 xrpl::Currency gets,
699 xrpl::AccountID getIssuer,
700 std::optional<std::string> const& domain
701);
702
711std::expected<xrpl::Book, Status>
713 xrpl::Asset const& pays,
714 xrpl::Asset const& gets,
715 std::optional<std::string> const& domain
716);
717
724std::expected<xrpl::Book, Status>
725parseBook(boost::json::object const& request);
726
733std::expected<xrpl::AccountID, Status>
734parseTaker(boost::json::value const& taker);
735
743xrpl::Issue
744parseIssue(boost::json::object const& issue);
745
751bool
752specifiesCurrentOrClosedLedger(boost::json::object const& request);
753
761bool
762isAdminCmd(std::string const& method, boost::json::object const& request);
763
770std::expected<xrpl::uint256, Status>
771getNFTID(boost::json::object const& request);
772
781std::optional<std::string>
782encodeCTID(uint32_t ledgerSeq, uint16_t txnIndex, uint32_t networkId) noexcept;
783
791template <typename T>
792inline std::optional<std::tuple<uint32_t, uint16_t, uint16_t>>
793decodeCTID(T const ctid) noexcept
794{
795 auto const getCTID64 = [](T const ctid) noexcept -> std::optional<uint64_t> {
796 if constexpr (std::is_convertible_v<T, std::string>) {
797 std::string const ctidString(ctid);
798 static constexpr std::size_t kCtidStringLength = 16;
799 if (ctidString.length() != kCtidStringLength)
800 return {};
801
802 if (!boost::regex_match(ctidString, boost::regex("^[0-9A-F]+$")))
803 return {};
804
805 return std::stoull(ctidString, nullptr, 16);
806 }
807
808 if constexpr (std::is_same_v<T, uint64_t>)
809 return ctid;
810
811 return {};
812 };
813
814 auto const ctidValue = getCTID64(ctid).value_or(0);
815
816 static constexpr uint64_t kCtidPrefix = 0xC000'0000'0000'0000ULL;
817 static constexpr uint64_t kCtidPrefixMask = 0xF000'0000'0000'0000ULL;
818
819 if ((ctidValue & kCtidPrefixMask) != kCtidPrefix)
820 return {};
821
822 uint32_t const ledgerSeq = (ctidValue >> 32) & 0xFFFF'FFFUL;
823 uint16_t const txnIndex = (ctidValue >> 16) & 0xFFFFU;
824 uint16_t const networkId = ctidValue & 0xFFFFU;
825 return {{ledgerSeq, txnIndex, networkId}};
826}
827
836template <typename DurationType>
837void
839 boost::json::object const& request,
840 util::BaseTagDecorator const& tag,
841 DurationType const& dur
842)
843{
844 using boost::json::serialize;
845
846 static util::Logger const log{"RPC"}; // NOLINT(readability-identifier-naming)
847 static constexpr std::int64_t kDurationErrorThresholdSeconds = 10;
848
849 auto const millis = std::chrono::duration_cast<std::chrono::milliseconds>(dur).count();
850 auto const seconds = std::chrono::duration_cast<std::chrono::seconds>(dur).count();
851 auto const msg = fmt::format(
852 "Request processing duration = {} milliseconds. request = {}",
853 millis,
854 serialize(util::removeSecret(request))
855 );
856
857 if (seconds > kDurationErrorThresholdSeconds) {
858 LOG(log.error()) << tag << msg;
859 } else if (seconds > 1) {
860 LOG(log.warn()) << tag << msg;
861 } else {
862 LOG(log.info()) << tag << msg;
863 }
864}
865
872std::optional<xrpl::Seed>
873parseRippleLibSeed(boost::json::value const& value);
874
887std::expected<AccountCursor, Status>
889 BackendInterface const& backend,
890 std::uint32_t sequence,
891 xrpl::AccountID const& accountID,
892 xrpl::uint256 nextPage,
893 std::uint32_t limit,
894 boost::asio::yield_context yield,
895 std::function<void(xrpl::SLE)> atOwnedNode
896);
897
904std::optional<std::uint32_t>
905parseStringAsUInt(std::string const& value); // TODO: move to string utils or something?
906
914bool
916 std::shared_ptr<xrpl::STTx const> const& txn,
917 std::shared_ptr<xrpl::TxMeta const> const& meta
918);
919
929std::optional<xrpl::STAmount>
931 std::shared_ptr<xrpl::STTx const> const& txn,
932 std::shared_ptr<xrpl::TxMeta const> const& meta,
933 std::uint32_t ledgerSequence,
934 uint32_t date
935);
936
937} // namespace rpc
The interface of an amendment center.
Definition AmendmentCenterInterface.hpp:17
The interface to the database used by Clio.
Definition BackendInterface.hpp:211
Represents any tag decorator.
Definition Taggable.hpp:55
A simple thread-safe logger for the channel specified in the constructor.
Definition Logger.hpp:78
Pump info(std::source_location const &loc=std::source_location::current()) const
Interface for logging at Severity::NFO severity.
Definition Logger.cpp:502
Pump error(std::source_location const &loc=std::source_location::current()) const
Interface for logging at Severity::ERR severity.
Definition Logger.cpp:512
Pump warn(std::source_location const &loc=std::source_location::current()) const
Interface for logging at Severity::WRN severity.
Definition Logger.cpp:507
This namespace contains all the RPC logic and handlers.
Definition AMMHelpers.cpp:17
boost::json::object generatePubLedgerMessage(xrpl::LedgerHeader const &lgrInfo, xrpl::Fees const &fees, std::string const &ledgerRange, std::uint32_t txnCount)
Generate a JSON object to publish ledger message.
std::pair< boost::json::object, boost::json::object > toExpandedJson(data::TransactionAndMetadata const &blobs, std::uint32_t const apiVersion, NFTokenjson nftEnabled, std::optional< uint32_t > networkId)
Convert a TransactionAndMetadata to two JSON objects.
Definition RPCHelpers.cpp:235
std::expected< AccountCursor, Status > traverseOwnedNodes(BackendInterface const &backend, xrpl::AccountID const &accountID, std::uint32_t sequence, std::uint32_t limit, std::optional< std::string > jsonCursor, boost::asio::yield_context yield, std::function< void(xrpl::SLE)> atOwnedNode, bool nftIncluded)
Traverse nodes owned by an account.
Definition RPCHelpers.cpp:686
bool isGlobalFrozen(BackendInterface const &backend, std::uint32_t sequence, xrpl::AccountID const &issuer, boost::asio::yield_context yield)
Whether global frozen is set.
Definition RPCHelpers.cpp:954
xrpl::STAmount accountHoldsMPT(BackendInterface const &backend, std::uint32_t sequence, xrpl::AccountID const &account, xrpl::MPTIssue const &mptIssue, bool zeroIfFrozen, boost::asio::yield_context yield)
Get the amount that an account holds in MPT.
Definition RPCHelpers.cpp:1289
bool isFrozen(BackendInterface const &backend, std::uint32_t sequence, xrpl::AccountID const &account, xrpl::Currency const &currency, xrpl::AccountID const &issuer, boost::asio::yield_context yield)
Whether the account is frozen.
Definition RPCHelpers.cpp:997
bool canHaveDeliveredAmount(std::shared_ptr< xrpl::STTx const > const &txn, std::shared_ptr< xrpl::TxMeta const > const &meta)
Whether the transaction can have a delivered amount.
Definition RPCHelpers.cpp:150
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:1774
xrpl::STAmount accountFunds(BackendInterface const &backend, data::AmendmentCenterInterface const &amendmentCenter, std::uint32_t const sequence, xrpl::STAmount const &amount, xrpl::AccountID const &id, boost::asio::yield_context yield)
Get the account funds.
Definition RPCHelpers.cpp:1105
std::optional< AccountCursor > parseAccountCursor(std::optional< std::string > jsonCursor)
Parse the account cursor from the JSON.
Definition RPCHelpers.cpp:91
void logDuration(boost::json::object const &request, util::BaseTagDecorator const &tag, DurationType const &dur)
Log the duration of the request processing.
Definition RPCHelpers.hpp:838
std::expected< xrpl::uint256, Status > getNFTID(boost::json::object const &request)
Get the NFTID from the request.
Definition RPCHelpers.cpp:1758
std::optional< xrpl::STAmount > getDeliveredAmount(std::shared_ptr< xrpl::STTx const > const &txn, std::shared_ptr< xrpl::TxMeta const > const &meta, std::uint32_t const ledgerSequence, uint32_t date)
Get the delivered amount.
Definition RPCHelpers.cpp:122
bool insertMPTIssuanceID(boost::json::object &txnJson, std::shared_ptr< xrpl::STTx const > const &txn, boost::json::object &metaJson, std::shared_ptr< xrpl::TxMeta const > const &meta)
Add "mpt_issuance_id" into various MPTToken transaction json.
Definition RPCHelpers.cpp:351
std::shared_ptr< xrpl::SLE const > read(std::shared_ptr< data::BackendInterface const > const &backend, xrpl::Keylet const &keylet, xrpl::LedgerHeader const &lgrInfo, web::Context const &context)
Read SLE from the backend.
Definition RPCHelpers.cpp:894
bool isDeepFrozen(BackendInterface const &backend, std::uint32_t sequence, xrpl::AccountID const &account, xrpl::Currency const &currency, xrpl::AccountID const &issuer, boost::asio::yield_context yield)
Whether the trustline is deep frozen.
Definition RPCHelpers.cpp:1026
std::vector< xrpl::AccountID > getAccountsFromTransaction(boost::json::object const &transaction)
Get the account associated with a transaction.
Definition RPCHelpers.cpp:933
std::vector< unsigned char > ledgerHeaderToBlob(xrpl::LedgerHeader const &info, bool includeHash)
Convert a ledger header to a blob.
Definition RPCHelpers.cpp:594
boost::json::object toJson(xrpl::STBase const &obj)
Convert STBase object to JSON.
Definition RPCHelpers.cpp:226
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:793
xrpl::Issue parseIssue(boost::json::object const &issue)
Parse the json object into a xrpl::Issue object.
Definition RPCHelpers.cpp:1706
std::expected< AccountCursor, Status > traverseNFTObjects(BackendInterface const &backend, std::uint32_t sequence, xrpl::AccountID const &accountID, xrpl::uint256 nextPage, std::uint32_t limit, boost::asio::yield_context yield, std::function< void(xrpl::SLE)> atOwnedNode)
Traverse NFT objects and call the callback for each owned node.
Definition RPCHelpers.cpp:632
xrpl::XRPAmount xrpLiquid(BackendInterface const &backend, std::uint32_t sequence, xrpl::AccountID const &id, boost::asio::yield_context yield)
Get the XRP liquidity.
Definition RPCHelpers.cpp:1063
bool fetchAndCheckAnyFlagsExists(BackendInterface const &backend, std::uint32_t sequence, xrpl::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:977
std::optional< xrpl::Seed > parseRippleLibSeed(boost::json::value const &value)
Parse a ripple-lib seed.
Definition RPCHelpers.cpp:912
std::expected< xrpl::LedgerHeader, Status > getLedgerHeaderFromLedgerSpecifier(BackendInterface const &backend, boost::asio::yield_context yield, rpc::spec::LedgerSpecifier const &ledger, uint32_t maxSeq)
Get ledger header from a spec-library ledger specifier.
Definition RPCHelpers.cpp:553
bool isOwnedByAccount(xrpl::SLE const &sle, xrpl::AccountID const &accountID)
Check whether the SLE is owned by the account.
std::optional< std::string > encodeCTID(uint32_t ledgerSeq, uint16_t txnIndex, uint32_t networkId) noexcept
Encode CTID as string.
Definition RPCHelpers.cpp:272
NFTokenjson
Enum for NFT json manipulation.
Definition RPCHelpers.hpp:72
std::expected< xrpl::AccountID, Status > parseTaker(boost::json::value const &taker)
Parse the taker from the request.
Definition RPCHelpers.cpp:1692
std::expected< xrpl::LedgerHeader, Status > ledgerHeaderFromRequest(std::shared_ptr< data::BackendInterface const > const &backend, web::Context const &ctx)
Get ledger info from the request.
Definition RPCHelpers.cpp:466
std::optional< xrpl::AccountID > accountFromStringStrict(std::string const &account)
Get a xrpl::AccountID from its string representation.
Definition RPCHelpers.cpp:163
std::expected< xrpl::Book, Status > parseBook(xrpl::Currency pays, xrpl::AccountID payIssuer, xrpl::Currency gets, xrpl::AccountID getIssuer, std::optional< std::string > const &domain)
Parse the book from the request.
Definition RPCHelpers.cpp:1484
std::expected< xrpl::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:520
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:379
bool specifiesCurrentOrClosedLedger(boost::json::object const &request)
Check whether the request specifies the current or closed ledger.
Definition RPCHelpers.cpp:1718
xrpl::STAmount accountHolds(BackendInterface const &backend, data::AmendmentCenterInterface const &amendmentCenter, std::uint32_t sequence, xrpl::AccountID const &account, xrpl::Currency const &currency, xrpl::AccountID const &issuer, bool const zeroIfFrozen, boost::asio::yield_context yield)
Get the amount that an account holds.
Definition RPCHelpers.cpp:1176
std::pair< std::shared_ptr< xrpl::STTx const >, std::shared_ptr< xrpl::STObject const > > deserializeTxPlusMeta(data::TransactionAndMetadata const &blobs)
Deserialize a TransactionAndMetadata into a pair of STTx and STObject.
Definition RPCHelpers.cpp:186
bool isLPTokenFrozen(BackendInterface const &backend, std::uint32_t sequence, xrpl::AccountID const &account, xrpl::Issue const &asset, xrpl::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:1049
std::uint64_t getStartHint(xrpl::SLE const &sle, xrpl::AccountID const &accountID)
Get the start hint for the account.
Definition RPCHelpers.cpp:612
boost::json::value toBoostJson(json::Value const &value)
Convert a RippledJson to boost::json::value.
Definition RPCHelpers.cpp:399
boost::json::array postProcessOrderBook(std::vector< data::LedgerObject > const &offers, xrpl::Book const &book, xrpl::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:1349
xrpl::Rate transferRate(BackendInterface const &backend, std::uint32_t sequence, xrpl::AccountID const &issuer, boost::asio::yield_context yield)
Get the transfer rate.
Definition RPCHelpers.cpp:1267
xrpl::STAmount ammAccountHolds(BackendInterface const &backend, std::uint32_t sequence, xrpl::AccountID const &account, xrpl::Currency const &currency, xrpl::AccountID const &issuer, bool const zeroIfFrozen, boost::asio::yield_context yield)
Get the amount that an LPToken owner holds.
Definition RPCHelpers.cpp:1131
bool insertDeliveredAmount(boost::json::object &metaJson, std::shared_ptr< xrpl::STTx const > const &txn, std::shared_ptr< xrpl::TxMeta const > const &meta, uint32_t date)
Add "DeliveredAmount" to the transaction json object.
Definition RPCHelpers.cpp:289
std::optional< std::uint32_t > parseStringAsUInt(std::string const &value)
Parse the string as a uint32_t.
Definition RPCHelpers.cpp:453
bool isAdminCmd(std::string const &method, boost::json::object const &request)
Check whether a request requires administrative privileges on rippled side.
Definition RPCHelpers.cpp:1731
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