20#include <xrpld/app/ledger/LedgerMaster.h>
21#include <xrpld/app/ledger/OpenLedger.h>
22#include <xrpld/app/misc/Transaction.h>
23#include <xrpld/rpc/Context.h>
24#include <xrpld/rpc/DeliveredAmount.h>
25#include <xrpl/protocol/Feature.h>
26#include <xrpl/protocol/RPCErr.h>
41template <
class GetLedgerIndex,
class GetCloseTime>
44 GetLedgerIndex
const& getLedgerIndex,
45 GetCloseTime
const& getCloseTime,
47 TxMeta const& transactionMeta)
57 if (serializedTx->isFieldPresent(sfAmount))
59 using namespace std::chrono_literals;
69 if (getLedgerIndex() >= 4594095 ||
72 return serializedTx->getFieldAmount(sfAmount);
81template <
class GetFix1623Enabled>
84 GetFix1623Enabled
const& getFix1623Enabled,
86 TxMeta const& transactionMeta)
92 TxType const tt{serializedTx->getTxnType()};
93 if (tt != ttPAYMENT && tt != ttCHECK_CASH && tt != ttACCOUNT_DELETE)
96 if (tt == ttCHECK_CASH && !getFix1623Enabled())
113 TxMeta const& transactionMeta)
116 auto const getFix1623Enabled = [&context]() ->
bool {
120 return view->rules().enabled(fix1623);
124 getFix1623Enabled, serializedTx, transactionMeta);
132 TxMeta const& transactionMeta)
134 auto const info = ledger.
info();
135 auto const getFix1623Enabled = [&ledger] {
140 getFix1623Enabled, serializedTx, transactionMeta))
142 auto const getLedgerIndex = [&info] {
return info.seq; };
143 auto const getCloseTime = [&info] {
return info.closeTime; };
146 getLedgerIndex, getCloseTime, serializedTx, transactionMeta);
149 meta[jss::delivered_amount] =
156 meta[jss::delivered_amount] =
Json::Value(
"unavailable");
161template <
class GetLedgerIndex>
166 TxMeta const& transactionMeta,
167 GetLedgerIndex
const& getLedgerIndex)
171 auto const getCloseTime =
177 getLedgerIndex, getCloseTime, serializedTx, transactionMeta);
187 TxMeta const& transactionMeta,
191 context, serializedTx, transactionMeta, [&ledgerIndex]() {
201 TxMeta const& transactionMeta)
204 meta, context, transaction->getSTransaction(), transactionMeta);
212 TxMeta const& transactionMeta)
217 context, transaction, transactionMeta, [&transactionMeta]() {
223 meta[jss::delivered_amount] =
230 meta[jss::delivered_amount] =
Json::Value(
"unavailable");
virtual OpenLedger & openLedger()=0
std::optional< NetClock::time_point > getCloseTimeBySeq(LedgerIndex ledgerIndex)
std::shared_ptr< OpenView const > current() const
Returns a view to the current open ledger.
virtual LedgerInfo const & info() const =0
Returns information about the ledger.
virtual Rules const & rules() const =0
Returns the tx processing rules.
bool enabled(uint256 const &feature) const
Returns true if a feature is enabled.
bool canHaveDeliveredAmount(RPC::Context const &context, std::shared_ptr< STTx const > const &serializedTx, TxMeta const &transactionMeta)
bool canHaveDeliveredAmountHelp(GetFix1623Enabled const &getFix1623Enabled, std::shared_ptr< STTx const > const &serializedTx, TxMeta const &transactionMeta)
std::optional< STAmount > getDeliveredAmount(RPC::Context const &context, std::shared_ptr< STTx const > const &serializedTx, TxMeta const &transactionMeta, LedgerIndex const &ledgerIndex)
void insertDeliveredAmount(Json::Value &meta, ReadView const &, std::shared_ptr< STTx const > const &serializedTx, TxMeta const &)
Add a delivered_amount field to the meta input/output parameter.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
TxType
Transaction type identifiers.
The context of information needed to call an RPC.
LedgerMaster & ledgerMaster