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#include <xrpld/ledger/View.h>
24
25#include <xrpl/basics/Log.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 Logs& l,
57 Input const* const pInputs)
58{
59 Output flowOut;
60 PaymentSandbox flowSB(&view);
61 auto j = l.journal("Flow");
62
63 if (!view.rules().enabled(featureFlow))
64 {
65 // The new payment engine was enabled several years ago. New transaction
66 // should never use the old rules. Assume this is a replay
67 j.fatal()
68 << "Old payment rules are required for this transaction. Assuming "
69 "this is a replay and running with the new rules.";
70 }
71
72 {
73 bool const defaultPaths =
74 !pInputs ? true : pInputs->defaultPathsAllowed;
75
76 bool const partialPayment =
77 !pInputs ? false : pInputs->partialPaymentAllowed;
78
79 auto const limitQuality = [&]() -> std::optional<Quality> {
80 if (pInputs && pInputs->limitQuality &&
81 saMaxAmountReq > beast::zero)
82 return Quality{Amounts(saMaxAmountReq, saDstAmountReq)};
83 return std::nullopt;
84 }();
85
86 auto const sendMax = [&]() -> std::optional<STAmount> {
87 if (saMaxAmountReq >= beast::zero ||
88 saMaxAmountReq.getCurrency() != saDstAmountReq.getCurrency() ||
89 saMaxAmountReq.getIssuer() != uSrcAccountID)
90 {
91 return saMaxAmountReq;
92 }
93 return std::nullopt;
94 }();
95
96 bool const ownerPaysTransferFee =
97 view.rules().enabled(featureOwnerPaysFee);
98
99 try
100 {
101 flowOut = flow(
102 flowSB,
103 saDstAmountReq,
104 uSrcAccountID,
105 uDstAccountID,
106 spsPaths,
107 defaultPaths,
108 partialPayment,
109 ownerPaysTransferFee,
111 limitQuality,
112 sendMax,
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:51
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:493
AccountID const & getIssuer() const
Definition: STAmount.h:499
Rules const & rules() const override
Returns the tx processing rules.
PaymentSandbox & view
Definition: RippleCalc.h:118
static Output rippleCalculate(PaymentSandbox &view, STAmount const &saMaxAmountReq, STAmount const &saDstAmountReq, AccountID const &uDstAccountID, AccountID const &uSrcAccountID, STPathSet const &spsPaths, Logs &l, Input const *const pInputs=nullptr)
Definition: RippleCalc.cpp:32
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: algorithm.h:26
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:44
@ tecINTERNAL
Definition: TER.h:297
void setResult(TER const value)
Definition: RippleCalc.h:83
T what(T... args)