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>
26#include <xrpl/protocol/Feature.h>
27#include <xrpl/protocol/RPCErr.h>
42template <
class GetLedgerIndex,
class GetCloseTime>
45 GetLedgerIndex
const& getLedgerIndex,
46 GetCloseTime
const& getCloseTime,
48 TxMeta const& transactionMeta)
58 if (serializedTx->isFieldPresent(sfAmount))
60 using namespace std::chrono_literals;
70 if (getLedgerIndex() >= 4594095 ||
73 return serializedTx->getFieldAmount(sfAmount);
82template <
class GetFix1623Enabled>
85 GetFix1623Enabled
const& getFix1623Enabled,
87 TxMeta const& transactionMeta)
93 TxType const tt{serializedTx->getTxnType()};
94 if (tt != ttPAYMENT && tt != ttCHECK_CASH && tt != ttACCOUNT_DELETE)
97 if (tt == ttCHECK_CASH && !getFix1623Enabled())
114 TxMeta const& transactionMeta)
117 auto const getFix1623Enabled = [&context]() ->
bool {
121 return view->rules().enabled(fix1623);
125 getFix1623Enabled, serializedTx, transactionMeta);
133 TxMeta const& transactionMeta)
135 auto const info = ledger.
info();
136 auto const getFix1623Enabled = [&ledger] {
141 getFix1623Enabled, serializedTx, transactionMeta))
143 auto const getLedgerIndex = [&info] {
return info.seq; };
144 auto const getCloseTime = [&info] {
return info.closeTime; };
147 getLedgerIndex, getCloseTime, serializedTx, transactionMeta);
150 meta[jss::delivered_amount] =
157 meta[jss::delivered_amount] =
Json::Value(
"unavailable");
162template <
class GetLedgerIndex>
167 TxMeta const& transactionMeta,
168 GetLedgerIndex
const& getLedgerIndex)
172 auto const getCloseTime =
178 getLedgerIndex, getCloseTime, serializedTx, transactionMeta);
188 TxMeta const& transactionMeta,
192 context, serializedTx, transactionMeta, [&ledgerIndex]() {
202 TxMeta const& transactionMeta)
205 meta, context, transaction->getSTransaction(), transactionMeta);
213 TxMeta const& transactionMeta)
218 context, transaction, transactionMeta, [&transactionMeta]() {
224 meta[jss::delivered_amount] =
231 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