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