20 #include <ripple/app/paths/Credit.h>
21 #include <ripple/app/paths/impl/AmountSpec.h>
22 #include <ripple/app/paths/impl/Steps.h>
23 #include <ripple/app/paths/impl/StepChecks.h>
24 #include <ripple/basics/IOUAmount.h>
25 #include <ripple/basics/Log.h>
26 #include <ripple/basics/XRPAmount.h>
27 #include <ripple/ledger/PaymentSandbox.h>
28 #include <ripple/protocol/Feature.h>
29 #include <ripple/protocol/Quality.h>
31 #include <boost/container/flat_set.hpp>
38 template <
class TDerived>
40 XRPAmount, XRPAmount, XRPEndpointStep<TDerived>>
52 boost::optional<EitherAmount>
73 boost::optional<std::pair<AccountID,AccountID>>
81 boost::optional<EitherAmount>
87 boost::optional<EitherAmount>
106 boost::container::flat_set<uint256>& ofrsToRm,
113 boost::container::flat_set<uint256>& ofrsToRm,
151 return ! (lhs == rhs);
237 template <
class TDerived>
244 template <
class TDerived>
253 template <
class TDerived>
258 boost::container::flat_set<uint256>& ofrsToRm,
261 auto const balance =
static_cast<TDerived const*
>(
this)->
xrpLiquid (sb);
266 auto& receiver = isLast_ ? acc_ :
xrpAccount();
271 cache_.emplace (result);
272 return {result, result};
275 template <
class TDerived>
280 boost::container::flat_set<uint256>& ofrsToRm,
284 auto const balance =
static_cast<TDerived const*
>(
this)->
xrpLiquid (sb);
286 auto const result = isLast_ ?
in :
std::min (balance,
in);
289 auto& receiver = isLast_ ? acc_ :
xrpAccount();
294 cache_.emplace (result);
295 return {result, result};
298 template <
class TDerived>
307 JLOG (j_.
error()) <<
"Expected valid cache in validFwd";
313 auto const& xrpIn =
in.xrp;
314 auto const balance =
static_cast<TDerived const*
>(
this)->
xrpLiquid (sb);
316 if (!isLast_ && balance < xrpIn)
318 JLOG (j_.
warn()) <<
"XRPEndpointStep: Strand re-execute check failed."
319 <<
" Insufficient balance: " <<
to_string (balance)
324 if (xrpIn != *cache_)
326 JLOG (j_.
warn()) <<
"XRPEndpointStep: Strand re-execute check failed."
327 <<
" ExpectedIn: " <<
to_string (*cache_)
333 template <
class TDerived>
339 JLOG (j_.
debug()) <<
"XRPEndpointStep: specified bad account.";
346 JLOG (j_.
warn()) <<
"XRPEndpointStep: can't send or receive XRP from "
347 "non-existent account: "
365 auto const issuesIndex = isLast_ ? 0 : 1;
369 <<
"XRPEndpointStep: loop detected: Index: " << ctx.
strandSize
388 return xs->acc () == acc;
405 auto offerCrossingStep =
406 std::make_unique<XRPEndpointOfferCrossingStep> (ctx, acc);
407 ter = offerCrossingStep->check (ctx);
408 r = std::move (offerCrossingStep);
413 std::make_unique<XRPEndpointPaymentStep> (ctx, acc);
414 ter = paymentStep->check (ctx);
415 r = std::move (paymentStep);
418 return {ter,
nullptr};
Context needed to build Strand Steps and for error checking.
const size_t strandSize
Length of Strand.
static std::int32_t computeReserveReduction(StrandContext const &ctx, AccountID const &acc)
boost::optional< EitherAmount > cachedOut() const override
XRPEndpointOfferCrossingStep(StrandContext const &ctx, AccountID const &acc)
std::pair< XRPAmount, XRPAmount > fwdImp(PaymentSandbox &sb, ApplyView &afView, boost::container::flat_set< uint256 > &ofrsToRm, XRPAmount const &in)
const Issue strandDeliver
Issue strand delivers.
A wrapper which makes credits unavailable to balances.
AccountID const & acc() const
friend bool operator!=(XRPEndpointStep const &lhs, XRPEndpointStep const &rhs)
std::string to_string(ListDisposition disposition)
Writeable view to a ledger, for applying a transaction.
const std::int32_t reserveReduction_
bool operator==(Manifest const &lhs, Manifest const &rhs)
ReadView const & view
Current ReadView.
const bool offerCrossing
true if offer crossing, not payment
static const account_t account
bool equal(Step const &rhs) const override
friend bool operator==(XRPEndpointStep< P > const &lhs, XRPEndpointStep< P > const &rhs)
STAmount toSTAmount(IOUAmount const &iou, Issue const &iss)
std::pair< TER, std::unique_ptr< Step > > make_XRPEndpointStep(StrandContext const &ctx, AccountID const &acc)
std::string logStringImpl(char const *name) const
A step in a payment path.
std::string logString() const override
XRPAmount xrpLiquid(ReadView &sb) const
boost::optional< EitherAmount > cachedIn() const override
TER accountSend(ApplyView &view, AccountID const &uSenderID, AccountID const &uReceiverID, STAmount const &saAmount, beast::Journal j)
XRPEndpointStep(StrandContext const &ctx, AccountID const &acc)
AccountID const & xrpAccount()
Compute AccountID from public key.
XRPAmount xrpLiquid(ReadView const &view, AccountID const &id, std::int32_t ownerCountAdj, beast::Journal j)
XRPAmount xrpLiquid(ReadView &sb) const
XRPAmount xrpLiquidImpl(ReadView &sb, std::int32_t reserveReduction) const
const bool isLast
true if Step is last in Strand
A generic endpoint for log messages.
bool enabled(uint256 const &id) const
Returns true if a feature is enabled.
virtual std::shared_ptr< SLE const > read(Keylet const &k) const =0
Return the state item associated with a key.
boost::optional< std::pair< AccountID, AccountID > > directStepAccts() const override
boost::optional< EitherAmount > cached() const
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
virtual Rules const & rules() const =0
Returns the tx processing rules.
TER check(StrandContext const &ctx) const
const bool isFirst
true if Step is first in Strand
Issue const & xrpIssue()
Returns an asset specifier that represents XRP.
TER checkFreeze(ReadView const &view, AccountID const &src, AccountID const &dst, Currency const ¤cy)
std::pair< bool, EitherAmount > validFwd(PaymentSandbox &sb, ApplyView &afView, EitherAmount const &in) override
std::pair< boost::optional< Quality >, DebtDirection > qualityUpperBound(ReadView const &v, DebtDirection prevStepDir) const override
bool xrpEndpointStepEqual(Step const &step, AccountID const &acc)
std::string logString() const override
std::pair< XRPAmount, XRPAmount > revImp(PaymentSandbox &sb, ApplyView &afView, boost::container::flat_set< uint256 > &ofrsToRm, XRPAmount const &out)
std::array< boost::container::flat_set< Issue >, 2 > & seenDirectIssues
A strand may not include the same account node more than once in the same currency.
DebtDirection debtDirection(ReadView const &sb, StrandDirection dir) const override
Currency const & xrpCurrency()
XRP currency.
boost::optional< XRPAmount > cache_
static const std::uint64_t uRateOne