rippled
SetTrust.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 <ripple/app/tx/impl/SetTrust.h>
21 #include <ripple/basics/Log.h>
22 #include <ripple/ledger/View.h>
23 #include <ripple/protocol/Feature.h>
24 #include <ripple/protocol/Indexes.h>
25 #include <ripple/protocol/Quality.h>
26 #include <ripple/protocol/st.h>
27 
28 namespace ripple {
29 
30 NotTEC
32 {
33  if (auto const ret = preflight1(ctx); !isTesSuccess(ret))
34  return ret;
35 
36  auto& tx = ctx.tx;
37  auto& j = ctx.j;
38 
39  std::uint32_t const uTxFlags = tx.getFlags();
40 
41  if (uTxFlags & tfTrustSetMask)
42  {
43  JLOG(j.trace()) << "Malformed transaction: Invalid flags set.";
44  return temINVALID_FLAG;
45  }
46 
47  STAmount const saLimitAmount(tx.getFieldAmount(sfLimitAmount));
48 
49  if (!isLegalNet(saLimitAmount))
50  return temBAD_AMOUNT;
51 
52  if (saLimitAmount.native())
53  {
54  JLOG(j.trace()) << "Malformed transaction: specifies native limit "
55  << saLimitAmount.getFullText();
56  return temBAD_LIMIT;
57  }
58 
59  if (badCurrency() == saLimitAmount.getCurrency())
60  {
61  JLOG(j.trace()) << "Malformed transaction: specifies XRP as IOU";
62  return temBAD_CURRENCY;
63  }
64 
65  if (saLimitAmount < beast::zero)
66  {
67  JLOG(j.trace()) << "Malformed transaction: Negative credit limit.";
68  return temBAD_LIMIT;
69  }
70 
71  // Check if destination makes sense.
72  auto const& issuer = saLimitAmount.getIssuer();
73 
74  if (!issuer || issuer == noAccount())
75  {
76  JLOG(j.trace()) << "Malformed transaction: no destination account.";
77  return temDST_NEEDED;
78  }
79 
80  return preflight2(ctx);
81 }
82 
83 TER
85 {
86  auto const id = ctx.tx[sfAccount];
87 
88  auto const sle = ctx.view.read(keylet::account(id));
89  if (!sle)
90  return terNO_ACCOUNT;
91 
92  std::uint32_t const uTxFlags = ctx.tx.getFlags();
93 
94  bool const bSetAuth = (uTxFlags & tfSetfAuth);
95 
96  if (bSetAuth && !(sle->getFieldU32(sfFlags) & lsfRequireAuth))
97  {
98  JLOG(ctx.j.trace()) << "Retry: Auth not required.";
99  return tefNO_AUTH_REQUIRED;
100  }
101 
102  auto const saLimitAmount = ctx.tx[sfLimitAmount];
103 
104  auto const currency = saLimitAmount.getCurrency();
105  auto const uDstAccountID = saLimitAmount.getIssuer();
106 
108  {
109  if (id == uDstAccountID)
110  return temDST_IS_SRC;
111  }
112  else
113  {
114  if (id == uDstAccountID)
115  {
116  // Prevent trustline to self from being created,
117  // unless one has somehow already been created
118  // (in which case doApply will clean it up).
119  auto const sleDelete =
120  ctx.view.read(keylet::line(id, uDstAccountID, currency));
121 
122  if (!sleDelete)
123  {
124  JLOG(ctx.j.trace())
125  << "Malformed transaction: Can not extend credit to self.";
126  return temDST_IS_SRC;
127  }
128  }
129  }
130 
131  // If the destination has opted to disallow incoming trustlines
132  // then honour that flag
134  {
135  auto const sleDst = ctx.view.read(keylet::account(uDstAccountID));
136 
137  if (!sleDst)
138  return tecNO_DST;
139 
140  auto const dstFlags = sleDst->getFlags();
141  if (dstFlags & lsfDisallowIncomingTrustline)
142  return tecNO_PERMISSION;
143  }
144 
145  return tesSUCCESS;
146 }
147 
148 TER
150 {
151  TER terResult = tesSUCCESS;
152 
153  STAmount const saLimitAmount(ctx_.tx.getFieldAmount(sfLimitAmount));
154  bool const bQualityIn(ctx_.tx.isFieldPresent(sfQualityIn));
155  bool const bQualityOut(ctx_.tx.isFieldPresent(sfQualityOut));
156 
157  Currency const currency(saLimitAmount.getCurrency());
158  AccountID uDstAccountID(saLimitAmount.getIssuer());
159 
160  // true, iff current is high account.
161  bool const bHigh = account_ > uDstAccountID;
162 
163  auto const sle = view().peek(keylet::account(account_));
164  if (!sle)
165  return tefINTERNAL;
166 
167  std::uint32_t const uOwnerCount = sle->getFieldU32(sfOwnerCount);
168 
169  // The reserve that is required to create the line. Note
170  // that although the reserve increases with every item
171  // an account owns, in the case of trust lines we only
172  // *enforce* a reserve if the user owns more than two
173  // items.
174  //
175  // We do this because being able to exchange currencies,
176  // which needs trust lines, is a powerful Ripple feature.
177  // So we want to make it easy for a gateway to fund the
178  // accounts of its users without fear of being tricked.
179  //
180  // Without this logic, a gateway that wanted to have a
181  // new user use its services, would have to give that
182  // user enough XRP to cover not only the account reserve
183  // but the incremental reserve for the trust line as
184  // well. A person with no intention of using the gateway
185  // could use the extra XRP for their own purposes.
186 
187  XRPAmount const reserveCreate(
188  (uOwnerCount < 2) ? XRPAmount(beast::zero)
189  : view().fees().accountReserve(uOwnerCount + 1));
190 
191  std::uint32_t uQualityIn(bQualityIn ? ctx_.tx.getFieldU32(sfQualityIn) : 0);
192  std::uint32_t uQualityOut(
193  bQualityOut ? ctx_.tx.getFieldU32(sfQualityOut) : 0);
194 
195  if (bQualityOut && QUALITY_ONE == uQualityOut)
196  uQualityOut = 0;
197 
198  std::uint32_t const uTxFlags = ctx_.tx.getFlags();
199 
200  bool const bSetAuth = (uTxFlags & tfSetfAuth);
201  bool const bSetNoRipple = (uTxFlags & tfSetNoRipple);
202  bool const bClearNoRipple = (uTxFlags & tfClearNoRipple);
203  bool const bSetFreeze = (uTxFlags & tfSetFreeze);
204  bool const bClearFreeze = (uTxFlags & tfClearFreeze);
205 
206  auto viewJ = ctx_.app.journal("View");
207 
208  // Trust lines to self are impossible but because of the old bug there are
209  // two on 19-02-2022. This code was here to allow those trust lines to be
210  // deleted. The fixTrustLinesToSelf fix amendment will remove them when it
211  // enables so this code will no longer be needed.
213  account_ == uDstAccountID)
214  {
215  return trustDelete(
216  view(),
217  view().peek(keylet::line(account_, uDstAccountID, currency)),
218  account_,
219  uDstAccountID,
220  viewJ);
221  }
222 
223  SLE::pointer sleDst = view().peek(keylet::account(uDstAccountID));
224 
225  if (!sleDst)
226  {
227  JLOG(j_.trace())
228  << "Delay transaction: Destination account does not exist.";
229  return tecNO_DST;
230  }
231 
232  STAmount saLimitAllow = saLimitAmount;
233  saLimitAllow.setIssuer(account_);
234 
235  SLE::pointer sleRippleState =
236  view().peek(keylet::line(account_, uDstAccountID, currency));
237 
238  if (sleRippleState)
239  {
240  STAmount saLowBalance;
241  STAmount saLowLimit;
242  STAmount saHighBalance;
243  STAmount saHighLimit;
244  std::uint32_t uLowQualityIn;
245  std::uint32_t uLowQualityOut;
246  std::uint32_t uHighQualityIn;
247  std::uint32_t uHighQualityOut;
248  auto const& uLowAccountID = !bHigh ? account_ : uDstAccountID;
249  auto const& uHighAccountID = bHigh ? account_ : uDstAccountID;
250  SLE::ref sleLowAccount = !bHigh ? sle : sleDst;
251  SLE::ref sleHighAccount = bHigh ? sle : sleDst;
252 
253  //
254  // Balances
255  //
256 
257  saLowBalance = sleRippleState->getFieldAmount(sfBalance);
258  saHighBalance = -saLowBalance;
259 
260  //
261  // Limits
262  //
263 
264  sleRippleState->setFieldAmount(
265  !bHigh ? sfLowLimit : sfHighLimit, saLimitAllow);
266 
267  saLowLimit =
268  !bHigh ? saLimitAllow : sleRippleState->getFieldAmount(sfLowLimit);
269  saHighLimit =
270  bHigh ? saLimitAllow : sleRippleState->getFieldAmount(sfHighLimit);
271 
272  //
273  // Quality in
274  //
275 
276  if (!bQualityIn)
277  {
278  // Not setting. Just get it.
279 
280  uLowQualityIn = sleRippleState->getFieldU32(sfLowQualityIn);
281  uHighQualityIn = sleRippleState->getFieldU32(sfHighQualityIn);
282  }
283  else if (uQualityIn)
284  {
285  // Setting.
286 
287  sleRippleState->setFieldU32(
288  !bHigh ? sfLowQualityIn : sfHighQualityIn, uQualityIn);
289 
290  uLowQualityIn = !bHigh
291  ? uQualityIn
292  : sleRippleState->getFieldU32(sfLowQualityIn);
293  uHighQualityIn = bHigh
294  ? uQualityIn
295  : sleRippleState->getFieldU32(sfHighQualityIn);
296  }
297  else
298  {
299  // Clearing.
300 
301  sleRippleState->makeFieldAbsent(
302  !bHigh ? sfLowQualityIn : sfHighQualityIn);
303 
304  uLowQualityIn =
305  !bHigh ? 0 : sleRippleState->getFieldU32(sfLowQualityIn);
306  uHighQualityIn =
307  bHigh ? 0 : sleRippleState->getFieldU32(sfHighQualityIn);
308  }
309 
310  if (QUALITY_ONE == uLowQualityIn)
311  uLowQualityIn = 0;
312 
313  if (QUALITY_ONE == uHighQualityIn)
314  uHighQualityIn = 0;
315 
316  //
317  // Quality out
318  //
319 
320  if (!bQualityOut)
321  {
322  // Not setting. Just get it.
323 
324  uLowQualityOut = sleRippleState->getFieldU32(sfLowQualityOut);
325  uHighQualityOut = sleRippleState->getFieldU32(sfHighQualityOut);
326  }
327  else if (uQualityOut)
328  {
329  // Setting.
330 
331  sleRippleState->setFieldU32(
332  !bHigh ? sfLowQualityOut : sfHighQualityOut, uQualityOut);
333 
334  uLowQualityOut = !bHigh
335  ? uQualityOut
336  : sleRippleState->getFieldU32(sfLowQualityOut);
337  uHighQualityOut = bHigh
338  ? uQualityOut
339  : sleRippleState->getFieldU32(sfHighQualityOut);
340  }
341  else
342  {
343  // Clearing.
344 
345  sleRippleState->makeFieldAbsent(
346  !bHigh ? sfLowQualityOut : sfHighQualityOut);
347 
348  uLowQualityOut =
349  !bHigh ? 0 : sleRippleState->getFieldU32(sfLowQualityOut);
350  uHighQualityOut =
351  bHigh ? 0 : sleRippleState->getFieldU32(sfHighQualityOut);
352  }
353 
354  std::uint32_t const uFlagsIn(sleRippleState->getFieldU32(sfFlags));
355  std::uint32_t uFlagsOut(uFlagsIn);
356 
357  if (bSetNoRipple && !bClearNoRipple)
358  {
359  if ((bHigh ? saHighBalance : saLowBalance) >= beast::zero)
360  uFlagsOut |= (bHigh ? lsfHighNoRipple : lsfLowNoRipple);
361 
362  else if (view().rules().enabled(fix1578))
363  // Cannot set noRipple on a negative balance.
364  return tecNO_PERMISSION;
365  }
366  else if (bClearNoRipple && !bSetNoRipple)
367  {
368  uFlagsOut &= ~(bHigh ? lsfHighNoRipple : lsfLowNoRipple);
369  }
370 
371  if (bSetFreeze && !bClearFreeze && !sle->isFlag(lsfNoFreeze))
372  {
373  uFlagsOut |= (bHigh ? lsfHighFreeze : lsfLowFreeze);
374  }
375  else if (bClearFreeze && !bSetFreeze)
376  {
377  uFlagsOut &= ~(bHigh ? lsfHighFreeze : lsfLowFreeze);
378  }
379 
380  if (QUALITY_ONE == uLowQualityOut)
381  uLowQualityOut = 0;
382 
383  if (QUALITY_ONE == uHighQualityOut)
384  uHighQualityOut = 0;
385 
386  bool const bLowDefRipple = sleLowAccount->getFlags() & lsfDefaultRipple;
387  bool const bHighDefRipple =
388  sleHighAccount->getFlags() & lsfDefaultRipple;
389 
390  bool const bLowReserveSet = uLowQualityIn || uLowQualityOut ||
391  ((uFlagsOut & lsfLowNoRipple) == 0) != bLowDefRipple ||
392  (uFlagsOut & lsfLowFreeze) || saLowLimit ||
393  saLowBalance > beast::zero;
394  bool const bLowReserveClear = !bLowReserveSet;
395 
396  bool const bHighReserveSet = uHighQualityIn || uHighQualityOut ||
397  ((uFlagsOut & lsfHighNoRipple) == 0) != bHighDefRipple ||
398  (uFlagsOut & lsfHighFreeze) || saHighLimit ||
399  saHighBalance > beast::zero;
400  bool const bHighReserveClear = !bHighReserveSet;
401 
402  bool const bDefault = bLowReserveClear && bHighReserveClear;
403 
404  bool const bLowReserved = (uFlagsIn & lsfLowReserve);
405  bool const bHighReserved = (uFlagsIn & lsfHighReserve);
406 
407  bool bReserveIncrease = false;
408 
409  if (bSetAuth)
410  {
411  uFlagsOut |= (bHigh ? lsfHighAuth : lsfLowAuth);
412  }
413 
414  if (bLowReserveSet && !bLowReserved)
415  {
416  // Set reserve for low account.
417  adjustOwnerCount(view(), sleLowAccount, 1, viewJ);
418  uFlagsOut |= lsfLowReserve;
419 
420  if (!bHigh)
421  bReserveIncrease = true;
422  }
423 
424  if (bLowReserveClear && bLowReserved)
425  {
426  // Clear reserve for low account.
427  adjustOwnerCount(view(), sleLowAccount, -1, viewJ);
428  uFlagsOut &= ~lsfLowReserve;
429  }
430 
431  if (bHighReserveSet && !bHighReserved)
432  {
433  // Set reserve for high account.
434  adjustOwnerCount(view(), sleHighAccount, 1, viewJ);
435  uFlagsOut |= lsfHighReserve;
436 
437  if (bHigh)
438  bReserveIncrease = true;
439  }
440 
441  if (bHighReserveClear && bHighReserved)
442  {
443  // Clear reserve for high account.
444  adjustOwnerCount(view(), sleHighAccount, -1, viewJ);
445  uFlagsOut &= ~lsfHighReserve;
446  }
447 
448  if (uFlagsIn != uFlagsOut)
449  sleRippleState->setFieldU32(sfFlags, uFlagsOut);
450 
451  if (bDefault || badCurrency() == currency)
452  {
453  // Delete.
454 
455  terResult = trustDelete(
456  view(), sleRippleState, uLowAccountID, uHighAccountID, viewJ);
457  }
458  // Reserve is not scaled by load.
459  else if (bReserveIncrease && mPriorBalance < reserveCreate)
460  {
461  JLOG(j_.trace())
462  << "Delay transaction: Insufficent reserve to add trust line.";
463 
464  // Another transaction could provide XRP to the account and then
465  // this transaction would succeed.
466  terResult = tecINSUF_RESERVE_LINE;
467  }
468  else
469  {
470  view().update(sleRippleState);
471 
472  JLOG(j_.trace()) << "Modify ripple line";
473  }
474  }
475  // Line does not exist.
476  else if (
477  !saLimitAmount && // Setting default limit.
478  (!bQualityIn || !uQualityIn) && // Not setting quality in or setting
479  // default quality in.
480  (!bQualityOut || !uQualityOut) && // Not setting quality out or setting
481  // default quality out.
482  (!bSetAuth))
483  {
484  JLOG(j_.trace())
485  << "Redundant: Setting non-existent ripple line to defaults.";
486  return tecNO_LINE_REDUNDANT;
487  }
488  else if (mPriorBalance < reserveCreate) // Reserve is not scaled by load.
489  {
490  JLOG(j_.trace()) << "Delay transaction: Line does not exist. "
491  "Insufficent reserve to create line.";
492 
493  // Another transaction could create the account and then this
494  // transaction would succeed.
495  terResult = tecNO_LINE_INSUF_RESERVE;
496  }
497  else
498  {
499  // Zero balance in currency.
500  STAmount saBalance({currency, noAccount()});
501 
502  auto const k = keylet::line(account_, uDstAccountID, currency);
503 
504  JLOG(j_.trace()) << "doTrustSet: Creating ripple line: "
505  << to_string(k.key);
506 
507  // Create a new ripple line.
508  terResult = trustCreate(
509  view(),
510  bHigh,
511  account_,
512  uDstAccountID,
513  k.key,
514  sle,
515  bSetAuth,
516  bSetNoRipple && !bClearNoRipple,
517  bSetFreeze && !bClearFreeze,
518  saBalance,
519  saLimitAllow, // Limit for who is being charged.
520  uQualityIn,
521  uQualityOut,
522  viewJ);
523  }
524 
525  return terResult;
526 }
527 
528 } // namespace ripple
ripple::badCurrency
Currency const & badCurrency()
We deliberately disallow the currency that looks like "XRP" because too many people were using it ins...
Definition: UintTypes.cpp:135
ripple::SetTrust::preflight
static NotTEC preflight(PreflightContext const &ctx)
Definition: SetTrust.cpp:31
ripple::sfHighQualityIn
const SF_UINT32 sfHighQualityIn
ripple::sfOwnerCount
const SF_UINT32 sfOwnerCount
ripple::preflight2
NotTEC preflight2(PreflightContext const &ctx)
Checks whether the signature appears valid.
Definition: Transactor.cpp:130
ripple::tefINTERNAL
@ tefINTERNAL
Definition: TER.h:155
ripple::tecINSUF_RESERVE_LINE
@ tecINSUF_RESERVE_LINE
Definition: TER.h:255
ripple::Rules::enabled
bool enabled(uint256 const &feature) const
Returns true if a feature is enabled.
Definition: Rules.cpp:94
std::shared_ptr< STLedgerEntry >
ripple::PreclaimContext::view
ReadView const & view
Definition: Transactor.h:56
ripple::tfTrustSetMask
constexpr std::uint32_t tfTrustSetMask
Definition: TxFlags.h:113
ripple::temBAD_CURRENCY
@ temBAD_CURRENCY
Definition: TER.h:88
ripple::PreclaimContext::j
const beast::Journal j
Definition: Transactor.h:60
beast::Journal::trace
Stream trace() const
Severity stream access functions.
Definition: Journal.h:309
ripple::ApplyView::peek
virtual std::shared_ptr< SLE > peek(Keylet const &k)=0
Prepare to modify the SLE associated with key.
ripple::lsfLowReserve
@ lsfLowReserve
Definition: LedgerFormats.h:252
ripple::Transactor::j_
const beast::Journal j_
Definition: Transactor.h:89
ripple::isTesSuccess
bool isTesSuccess(TER x)
Definition: TER.h:597
ripple::sfQualityOut
const SF_UINT32 sfQualityOut
ripple::lsfLowAuth
@ lsfLowAuth
Definition: LedgerFormats.h:254
ripple::lsfLowNoRipple
@ lsfLowNoRipple
Definition: LedgerFormats.h:256
ripple::tfSetNoRipple
constexpr std::uint32_t tfSetNoRipple
Definition: TxFlags.h:109
ripple::SetTrust::preclaim
static TER preclaim(PreclaimContext const &ctx)
Definition: SetTrust.cpp:84
ripple::sfQualityIn
const SF_UINT32 sfQualityIn
ripple::ApplyView::update
virtual void update(std::shared_ptr< SLE > const &sle)=0
Indicate changes to a peeked SLE.
ripple::isLegalNet
bool isLegalNet(STAmount const &value)
Definition: STAmount.h:446
ripple::STAmount::setIssuer
void setIssuer(AccountID const &uIssuer)
Definition: STAmount.h:433
ripple::PreflightContext::j
const beast::Journal j
Definition: Transactor.h:38
ripple::temDST_IS_SRC
@ temDST_IS_SRC
Definition: TER.h:106
ripple::preflight1
NotTEC preflight1(PreflightContext const &ctx)
Performs early sanity checks on the account and fee fields.
Definition: Transactor.cpp:78
ripple::lsfHighAuth
@ lsfHighAuth
Definition: LedgerFormats.h:255
ripple::ApplyContext::app
Application & app
Definition: ApplyContext.h:47
ripple::STAmount::getIssuer
AccountID const & getIssuer() const
Definition: STAmount.h:359
ripple::base_uint< 160, detail::CurrencyTag >
ripple::sfLowQualityOut
const SF_UINT32 sfLowQualityOut
ripple::sfLimitAmount
const SF_AMOUNT sfLimitAmount
ripple::temINVALID_FLAG
@ temINVALID_FLAG
Definition: TER.h:109
ripple::STAmount::getFullText
std::string getFullText() const override
Definition: STAmount.cpp:548
ripple::sfLowLimit
const SF_AMOUNT sfLowLimit
ripple::lsfRequireAuth
@ lsfRequireAuth
Definition: LedgerFormats.h:226
ripple::adjustOwnerCount
void adjustOwnerCount(ApplyView &view, std::shared_ptr< SLE > const &sle, std::int32_t amount, beast::Journal j)
Adjust the owner count up or down.
Definition: View.cpp:713
ripple::lsfDefaultRipple
@ lsfDefaultRipple
Definition: LedgerFormats.h:232
ripple::keylet::account
Keylet account(AccountID const &id) noexcept
AccountID root.
Definition: Indexes.cpp:133
ripple::featureDisallowIncoming
const uint256 featureDisallowIncoming
ripple::temBAD_LIMIT
@ temBAD_LIMIT
Definition: TER.h:92
ripple::TERSubset< CanCvtToTER >
ripple::sfLowQualityIn
const SF_UINT32 sfLowQualityIn
ripple::SetTrust::doApply
TER doApply() override
Definition: SetTrust.cpp:149
ripple::temDST_NEEDED
@ temDST_NEEDED
Definition: TER.h:107
ripple::tecNO_LINE_REDUNDANT
@ tecNO_LINE_REDUNDANT
Definition: TER.h:260
ripple::STAmount
Definition: STAmount.h:45
ripple::STObject::getFlags
std::uint32_t getFlags() const
Definition: STObject.cpp:481
ripple::tfClearNoRipple
constexpr std::uint32_t tfClearNoRipple
Definition: TxFlags.h:110
ripple::temBAD_AMOUNT
@ temBAD_AMOUNT
Definition: TER.h:87
std::uint32_t
ripple::sfHighLimit
const SF_AMOUNT sfHighLimit
ripple::keylet::line
Keylet line(AccountID const &id0, AccountID const &id1, Currency const &currency) noexcept
The index of a trust line for a given currency.
Definition: Indexes.cpp:193
ripple::trustDelete
TER trustDelete(ApplyView &view, std::shared_ptr< SLE > const &sleRippleState, AccountID const &uLowAccountID, AccountID const &uHighAccountID, beast::Journal j)
Definition: View.cpp:853
ripple::ReadView::read
virtual std::shared_ptr< SLE const > read(Keylet const &k) const =0
Return the state item associated with a key.
ripple::fixTrustLinesToSelf
const uint256 fixTrustLinesToSelf
ripple::PreclaimContext::tx
STTx const & tx
Definition: Transactor.h:58
ripple::lsfHighNoRipple
@ lsfHighNoRipple
Definition: LedgerFormats.h:257
ripple::terNO_ACCOUNT
@ terNO_ACCOUNT
Definition: TER.h:198
ripple::fix1578
const uint256 fix1578
ripple::PreclaimContext
State information when determining if a tx is likely to claim a fee.
Definition: Transactor.h:52
ripple::lsfHighFreeze
@ lsfHighFreeze
Definition: LedgerFormats.h:259
ripple::STAmount::native
bool native() const noexcept
Definition: STAmount.h:329
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::tefNO_AUTH_REQUIRED
@ tefNO_AUTH_REQUIRED
Definition: TER.h:156
ripple::Application::journal
virtual beast::Journal journal(std::string const &name)=0
ripple::trustCreate
TER trustCreate(ApplyView &view, const bool bSrcHigh, AccountID const &uSrcAccountID, AccountID const &uDstAccountID, uint256 const &uIndex, SLE::ref sleAccount, const bool bAuth, const bool bNoRipple, const bool bFreeze, STAmount const &saBalance, STAmount const &saLimit, std::uint32_t uQualityIn, std::uint32_t uQualityOut, beast::Journal j)
Create a trust line.
Definition: View.cpp:739
ripple::tecNO_LINE_INSUF_RESERVE
@ tecNO_LINE_INSUF_RESERVE
Definition: TER.h:259
ripple::Transactor::view
ApplyView & view()
Definition: Transactor.h:107
ripple::tfSetFreeze
constexpr std::uint32_t tfSetFreeze
Definition: TxFlags.h:111
ripple::tfSetfAuth
constexpr std::uint32_t tfSetfAuth
Definition: TxFlags.h:108
ripple::ReadView::rules
virtual Rules const & rules() const =0
Returns the tx processing rules.
ripple::lsfNoFreeze
@ lsfNoFreeze
Definition: LedgerFormats.h:230
ripple::sfFlags
const SF_UINT32 sfFlags
ripple::STObject::isFieldPresent
bool isFieldPresent(SField const &field) const
Definition: STObject.cpp:428
ripple::Transactor::mPriorBalance
XRPAmount mPriorBalance
Definition: Transactor.h:92
ripple::lsfDisallowIncomingTrustline
@ lsfDisallowIncomingTrustline
Definition: LedgerFormats.h:244
ripple::tecNO_PERMISSION
@ tecNO_PERMISSION
Definition: TER.h:272
ripple::sfBalance
const SF_AMOUNT sfBalance
ripple::sfHighQualityOut
const SF_UINT32 sfHighQualityOut
ripple::Transactor::ctx_
ApplyContext & ctx_
Definition: Transactor.h:88
ripple::tfClearFreeze
constexpr std::uint32_t tfClearFreeze
Definition: TxFlags.h:112
ripple::to_string
std::string to_string(Manifest const &m)
Format the specified manifest to a string for debugging purposes.
Definition: app/misc/impl/Manifest.cpp:41
ripple::sfAccount
const SF_ACCOUNT sfAccount
ripple::lsfLowFreeze
@ lsfLowFreeze
Definition: LedgerFormats.h:258
ripple::PreflightContext::tx
STTx const & tx
Definition: Transactor.h:35
ripple::STObject::getFieldU32
std::uint32_t getFieldU32(SField const &field) const
Definition: STObject.cpp:559
ripple::PreflightContext
State information when preflighting a tx.
Definition: Transactor.h:31
ripple::lsfHighReserve
@ lsfHighReserve
Definition: LedgerFormats.h:253
ripple::STAmount::getCurrency
Currency const & getCurrency() const
Definition: STAmount.h:353
ripple::tesSUCCESS
@ tesSUCCESS
Definition: TER.h:222
ripple::Transactor::account_
const AccountID account_
Definition: Transactor.h:91
ripple::STObject::getFieldAmount
STAmount const & getFieldAmount(SField const &field) const
Definition: STObject.cpp:603
ripple::noAccount
AccountID const & noAccount()
A placeholder for empty accounts.
Definition: AccountID.cpp:175
ripple::ApplyContext::tx
STTx const & tx
Definition: ApplyContext.h:48
ripple::tecNO_DST
@ tecNO_DST
Definition: TER.h:257
ripple::XRPAmount
Definition: XRPAmount.h:46
ripple::NotTEC
TERSubset< CanCvtToNotTEC > NotTEC
Definition: TER.h:528