1#include <xrpld/app/ledger/LedgerMaster.h>
2#include <xrpld/app/ledger/TransactionMaster.h>
3#include <xrpld/app/misc/DeliverMax.h>
4#include <xrpld/app/misc/Transaction.h>
5#include <xrpld/rpc/CTID.h>
6#include <xrpld/rpc/Context.h>
7#include <xrpld/rpc/DeliveredAmount.h>
8#include <xrpld/rpc/MPTokenIssuanceID.h>
9#include <xrpld/rpc/Status.h>
11#include <xrpl/basics/Blob.h>
12#include <xrpl/basics/RangeSet.h>
13#include <xrpl/basics/Slice.h>
14#include <xrpl/basics/base_uint.h>
15#include <xrpl/basics/chrono.h>
16#include <xrpl/basics/strHex.h>
17#include <xrpl/beast/utility/instrumentation.h>
18#include <xrpl/core/NetworkIDService.h>
19#include <xrpl/json/json_value.h>
20#include <xrpl/protocol/ErrorCodes.h>
21#include <xrpl/protocol/NFTSyntheticSerializer.h>
22#include <xrpl/protocol/RPCErr.h>
23#include <xrpl/protocol/SField.h>
24#include <xrpl/protocol/STBase.h>
25#include <xrpl/protocol/TxSearched.h>
26#include <xrpl/protocol/jss.h>
27#include <xrpl/rdb/RelationalDatabase.h>
28#include <xrpl/server/NetworkOPs.h>
80 static constexpr uint16_t kMaxRange = 1000;
125 auto [txn, meta] = std::get<TxPair>(v);
138 if (txn->getLedger() == 0)
146 if (ledger && !ledger->open())
153 result.
meta = meta->getAsObject().getSerializer().getData();
165 if (meta->getAsObject().isFieldPresent(sfTransactionIndex))
167 uint32_t
const lgrSeq = ledger->header().seq;
168 uint32_t
const txnIdx = meta->getAsObject().getFieldU32(sfTransactionIndex);
171 if (txnIdx <= 0xFFFFU && netID < 0xFFFFU && lgrSeq < 0x0FFF'FFFFUL)
208 static constexpr auto kOptionsJson =
213 response[jss::tx_blob] = result.
txn->
getJson(kOptionsJson,
true);
217 response[jss::tx_json] = result.
txn->
getJson(kOptionsJson);
219 response[jss::tx_json], sttx->getTxnType(), context.
apiVersion);
245 XRPL_ASSERT(args.
binary,
"xrpl::populateJsonResponse : binary is set");
246 auto jsonMeta = (context.
apiVersion > 1 ? jss::meta_blob : jss::meta);
256 insertDeliveredAmount(response[jss::meta], context, result.
txn, *meta);
261 response[jss::validated] = result.
validated;
264 response[jss::ctid] = *(result.
ctid);
298 auto const [lgr_seq, txn_idx, net_id] = *ctid;
302 out <<
"Wrong network. You should submit this request to a node "
303 "running on NetworkID: "
307 args.
ctid = {lgr_seq, txn_idx};
std::string asString() const
Returns the unquoted string value.
bool isMember(char const *key) const
Return true if the object has a member named key.
virtual Config & config()=0
constexpr bool parseHex(std::string_view sv)
Parse a hex string into a base_uint.
bool haveLedger(std::uint32_t seq)
std::shared_ptr< Ledger const > getLedgerBySeq(std::uint32_t index)
uint256 getHashBySeq(std::uint32_t index)
Get a ledger's hash by sequence number using the cache.
std::optional< NetClock::time_point > getCloseTimeBySeq(LedgerIndex ledgerIndex)
std::shared_ptr< Ledger const > getValidatedLedger()
std::optional< uint256 > txnIdFromIndex(uint32_t ledgerSeq, uint32_t txnIndex)
virtual std::uint32_t getNetworkID() const noexcept=0
Get the configured network ID.
virtual TransactionMaster & getMasterTransaction()=0
virtual NetworkIDService & getNetworkIDService()=0
virtual LedgerMaster & getLedgerMaster()=0
std::variant< std::pair< std::shared_ptr< Transaction >, std::shared_ptr< TxMeta > >, TxSearched > fetch(uint256 const &, ErrorCodeI &ec)
json::Value getJson(JsonOptions options, bool binary=false) const
LedgerIndex getLedger() const
uint256 const & getID() const
std::shared_ptr< Transaction > pointer
std::shared_ptr< STTx const > const & getSTransaction()
@ Object
object value (collection of name/value pairs).
std::optional< std::string > encodeCTID(uint32_t ledgerSeq, uint32_t txnIndex, uint32_t networkID) noexcept
Encodes ledger sequence, transaction index, and network ID into a CTID string.
void insertMPTokenIssuanceID(json::Value &response, std::shared_ptr< STTx const > const &transaction, TxMeta const &transactionMeta)
void insertDeliverMax(json::Value &txJson, TxType txnType, unsigned int apiVersion)
Copy Amount field to DeliverMax field in transaction output JSON.
json::Value makeError(ErrorCodeI code)
Returns a new json object that reflects the error code.
void insertNFTSyntheticInJson(json::Value &, std::shared_ptr< STTx const > const &, TxMeta const &)
Adds common synthetic fields to transaction-related JSON responses.
std::optional< std::tuple< uint32_t, uint16_t, uint16_t > > decodeCTID(T const ctid) noexcept
Decodes a CTID string or integer into its component parts.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
ClosedInterval< T > range(T low, T high)
Create a closed range interval.
std::string strHex(FwdIt begin, FwdIt end)
static bool isValidated(LedgerMaster &ledgerMaster, std::uint32_t seq, uint256 const &hash)
std::pair< TxResult, RPC::Status > doTxHelp(RPC::Context &context, TxArgs args)
std::string to_string(BaseUInt< Bits, Tag > const &a)
std::string toStringIso(date::sys_time< Duration > tp)
json::Value rpcError(ErrorCodeI iError)
boost::icl::closed_interval< T > ClosedInterval
A closed interval over the domain T.
json::Value populateJsonResponse(std::pair< AccountTxResult, RPC::Status > const &res, AccountTxArgs const &args, RPC::JsonContext const &context)
std::vector< unsigned char > Blob
Storage for linear binary data.
std::enable_if_t< std::is_same_v< T, char >||std::is_same_v< T, unsigned char >, Slice > makeSlice(std::array< T, N > const &a)
json::Value doTxJson(RPC::JsonContext &)
unsigned int underlying_t
The context of information needed to call an RPC.
LedgerMaster & ledgerMaster
Status represents the results of an operation that might fail.
void inject(json::Value &object) const
Apply the Status to a JsonObject.
ErrorCodeI toErrorCode() const
Returns the Status as an error_code_i.
std::optional< std::pair< uint32_t, uint32_t > > ledgerRange
std::optional< std::pair< uint32_t, uint16_t > > ctid
std::optional< uint256 > hash
std::optional< uint256 > ledgerHash
std::optional< NetClock::time_point > closeTime
std::optional< std::string > ctid
std::variant< std::shared_ptr< TxMeta >, Blob > meta