20#include <xrpld/rpc/DeliveredAmount.h>
22#include <xrpld/app/ledger/LedgerMaster.h>
23#include <xrpld/app/ledger/OpenLedger.h>
24#include <xrpld/app/misc/Transaction.h>
25#include <xrpld/ledger/View.h>
26#include <xrpld/rpc/Context.h>
27#include <xrpld/rpc/detail/RPCHelpers.h>
28#include <xrpl/protocol/AccountID.h>
29#include <xrpl/protocol/Feature.h>
30#include <xrpl/protocol/RPCErr.h>
31#include <boost/algorithm/string/case_conv.hpp>
46template <
class GetLedgerIndex,
class GetCloseTime>
49 GetLedgerIndex
const& getLedgerIndex,
50 GetCloseTime
const& getCloseTime,
52 TxMeta const& transactionMeta)
62 if (serializedTx->isFieldPresent(sfAmount))
64 using namespace std::chrono_literals;
74 if (getLedgerIndex() >= 4594095 ||
77 return serializedTx->getFieldAmount(sfAmount);
86template <
class GetFix1623Enabled>
89 GetFix1623Enabled
const& getFix1623Enabled,
91 TxMeta const& transactionMeta)
97 TxType const tt{serializedTx->getTxnType()};
98 if (tt != ttPAYMENT && tt != ttCHECK_CASH && tt != ttACCOUNT_DELETE)
101 if (tt == ttCHECK_CASH && !getFix1623Enabled())
118 TxMeta const& transactionMeta)
121 auto const getFix1623Enabled = [&context]() ->
bool {
125 return view->rules().enabled(fix1623);
129 getFix1623Enabled, serializedTx, transactionMeta);
137 TxMeta const& transactionMeta)
139 auto const info = ledger.
info();
140 auto const getFix1623Enabled = [&ledger] {
145 getFix1623Enabled, serializedTx, transactionMeta))
147 auto const getLedgerIndex = [&info] {
return info.seq; };
148 auto const getCloseTime = [&info] {
return info.closeTime; };
151 getLedgerIndex, getCloseTime, serializedTx, transactionMeta);
154 meta[jss::delivered_amount] =
161 meta[jss::delivered_amount] =
Json::Value(
"unavailable");
166template <
class GetLedgerIndex>
171 TxMeta const& transactionMeta,
172 GetLedgerIndex
const& getLedgerIndex)
176 auto const getCloseTime =
182 getLedgerIndex, getCloseTime, serializedTx, transactionMeta);
192 TxMeta const& transactionMeta,
196 context, serializedTx, transactionMeta, [&ledgerIndex]() {
206 TxMeta const& transactionMeta)
209 meta, context, transaction->getSTransaction(), transactionMeta);
217 TxMeta const& transactionMeta)
222 context, transaction, transactionMeta, [&transactionMeta]() {
228 meta[jss::delivered_amount] =
235 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