rippled
Loading...
Searching...
No Matches
RippleCalc.cpp
1//------------------------------------------------------------------------------
2/*
3 This file is part of rippled: https://github.com/ripple/rippled
4 Copyright (c) 2012, 2013 Ripple Labs Inc.
5
6 Permission to use, copy, modify, and/or distribute this software for any
7 purpose with or without fee is hereby granted, provided that the above
8 copyright notice and this permission notice appear in all copies.
9
10 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 ANY SPECIAL , DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17*/
18//==============================================================================
19
20#include <xrpld/app/paths/Flow.h>
21#include <xrpld/app/paths/RippleCalc.h>
22#include <xrpld/app/paths/detail/FlowDebugInfo.h>
23
24#include <xrpl/basics/Log.h>
25#include <xrpl/ledger/View.h>
26#include <xrpl/protocol/Feature.h>
27
28namespace ripple {
29namespace path {
30
31RippleCalc::Output
33 PaymentSandbox& view,
34
35 // Compute paths using this ledger entry set. Up to caller to actually
36 // apply to ledger.
37
38 // Issuer:
39 // XRP: xrpAccount()
40 // non-XRP: uSrcAccountID (for any issuer) or another account with
41 // trust node.
42 STAmount const& saMaxAmountReq, // --> -1 = no limit.
43
44 // Issuer:
45 // XRP: xrpAccount()
46 // non-XRP: uDstAccountID (for any issuer) or another account with
47 // trust node.
48 STAmount const& saDstAmountReq,
49
50 AccountID const& uDstAccountID,
51 AccountID const& uSrcAccountID,
52
53 // A set of paths that are included in the transaction that we'll
54 // explore for liquidity.
55 STPathSet const& spsPaths,
56
57 std::optional<uint256> const& domainID,
58 Logs& l,
59 Input const* const pInputs)
60{
61 Output flowOut;
62 PaymentSandbox flowSB(&view);
63 auto j = l.journal("Flow");
64
65 if (!view.rules().enabled(featureFlow))
66 {
67 // The new payment engine was enabled several years ago. New transaction
68 // should never use the old rules. Assume this is a replay
69 j.fatal()
70 << "Old payment rules are required for this transaction. Assuming "
71 "this is a replay and running with the new rules.";
72 }
73
74 {
75 bool const defaultPaths =
76 !pInputs ? true : pInputs->defaultPathsAllowed;
77
78 bool const partialPayment =
79 !pInputs ? false : pInputs->partialPaymentAllowed;
80
81 auto const limitQuality = [&]() -> std::optional<Quality> {
82 if (pInputs && pInputs->limitQuality &&
83 saMaxAmountReq > beast::zero)
84 return Quality{Amounts(saMaxAmountReq, saDstAmountReq)};
85 return std::nullopt;
86 }();
87
88 auto const sendMax = [&]() -> std::optional<STAmount> {
89 if (saMaxAmountReq >= beast::zero ||
90 saMaxAmountReq.getCurrency() != saDstAmountReq.getCurrency() ||
91 saMaxAmountReq.getIssuer() != uSrcAccountID)
92 {
93 return saMaxAmountReq;
94 }
95 return std::nullopt;
96 }();
97
98 try
99 {
100 flowOut = flow(
101 flowSB,
102 saDstAmountReq,
103 uSrcAccountID,
104 uDstAccountID,
105 spsPaths,
106 defaultPaths,
107 partialPayment,
108 false,
110 limitQuality,
111 sendMax,
112 domainID,
113 j,
114 nullptr);
115 }
116 catch (std::exception& e)
117 {
118 JLOG(j.error()) << "Exception from flow: " << e.what();
119
120 // return a tec so the tx is stored
121 path::RippleCalc::Output exceptResult;
122 exceptResult.setResult(tecINTERNAL);
123 return exceptResult;
124 }
125 }
126
127 j.debug() << "RippleCalc Result> "
128 << " actualIn: " << flowOut.actualAmountIn
129 << ", actualOut: " << flowOut.actualAmountOut
130 << ", result: " << flowOut.result()
131 << ", dstAmtReq: " << saDstAmountReq
132 << ", sendMax: " << saMaxAmountReq;
133
134 flowSB.apply(view);
135 return flowOut;
136}
137
138} // namespace path
139} // namespace ripple
Stream fatal() const
Definition Journal.h:352
Manages partitions for logging.
Definition Log.h:52
beast::Journal journal(std::string const &name)
Definition Log.cpp:160
A wrapper which makes credits unavailable to balances.
void apply(RawView &to)
Apply changes to base view.
bool enabled(uint256 const &feature) const
Returns true if a feature is enabled.
Definition Rules.cpp:130
Currency const & getCurrency() const
Definition STAmount.h:502
AccountID const & getIssuer() const
Definition STAmount.h:508
Rules const & rules() const override
Returns the tx processing rules.
PaymentSandbox & view
Definition RippleCalc.h:119
static Output rippleCalculate(PaymentSandbox &view, STAmount const &saMaxAmountReq, STAmount const &saDstAmountReq, AccountID const &uDstAccountID, AccountID const &uSrcAccountID, STPathSet const &spsPaths, std::optional< uint256 > const &domainID, Logs &l, Input const *const pInputs=nullptr)
T is_same_v
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:25
StrandResult< TInAmt, TOutAmt > flow(PaymentSandbox const &baseView, Strand const &strand, std::optional< TInAmt > const &maxIn, TOutAmt const &out, beast::Journal j)
Request out amount from a strand.
Definition StrandFlow.h:105
@ no
Definition Steps.h:45
@ tecINTERNAL
Definition TER.h:310
void setResult(TER const value)
Definition RippleCalc.h:82
T what(T... args)