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  return tesSUCCESS;
132 }
133 
134 TER
136 {
137  TER terResult = tesSUCCESS;
138 
139  STAmount const saLimitAmount(ctx_.tx.getFieldAmount(sfLimitAmount));
140  bool const bQualityIn(ctx_.tx.isFieldPresent(sfQualityIn));
141  bool const bQualityOut(ctx_.tx.isFieldPresent(sfQualityOut));
142 
143  Currency const currency(saLimitAmount.getCurrency());
144  AccountID uDstAccountID(saLimitAmount.getIssuer());
145 
146  // true, iff current is high account.
147  bool const bHigh = account_ > uDstAccountID;
148 
149  auto const sle = view().peek(keylet::account(account_));
150  if (!sle)
151  return tefINTERNAL;
152 
153  std::uint32_t const uOwnerCount = sle->getFieldU32(sfOwnerCount);
154 
155  // The reserve that is required to create the line. Note
156  // that although the reserve increases with every item
157  // an account owns, in the case of trust lines we only
158  // *enforce* a reserve if the user owns more than two
159  // items.
160  //
161  // We do this because being able to exchange currencies,
162  // which needs trust lines, is a powerful Ripple feature.
163  // So we want to make it easy for a gateway to fund the
164  // accounts of its users without fear of being tricked.
165  //
166  // Without this logic, a gateway that wanted to have a
167  // new user use its services, would have to give that
168  // user enough XRP to cover not only the account reserve
169  // but the incremental reserve for the trust line as
170  // well. A person with no intention of using the gateway
171  // could use the extra XRP for their own purposes.
172 
173  XRPAmount const reserveCreate(
174  (uOwnerCount < 2) ? XRPAmount(beast::zero)
175  : view().fees().accountReserve(uOwnerCount + 1));
176 
177  std::uint32_t uQualityIn(bQualityIn ? ctx_.tx.getFieldU32(sfQualityIn) : 0);
178  std::uint32_t uQualityOut(
179  bQualityOut ? ctx_.tx.getFieldU32(sfQualityOut) : 0);
180 
181  if (bQualityOut && QUALITY_ONE == uQualityOut)
182  uQualityOut = 0;
183 
184  std::uint32_t const uTxFlags = ctx_.tx.getFlags();
185 
186  bool const bSetAuth = (uTxFlags & tfSetfAuth);
187  bool const bSetNoRipple = (uTxFlags & tfSetNoRipple);
188  bool const bClearNoRipple = (uTxFlags & tfClearNoRipple);
189  bool const bSetFreeze = (uTxFlags & tfSetFreeze);
190  bool const bClearFreeze = (uTxFlags & tfClearFreeze);
191 
192  auto viewJ = ctx_.app.journal("View");
193 
194  // Trust lines to self are impossible but because of the old bug there are
195  // two on 19-02-2022. This code was here to allow those trust lines to be
196  // deleted. The fixTrustLinesToSelf fix amendment will remove them when it
197  // enables so this code will no longer be needed.
199  account_ == uDstAccountID)
200  {
201  return trustDelete(
202  view(),
203  view().peek(keylet::line(account_, uDstAccountID, currency)),
204  account_,
205  uDstAccountID,
206  viewJ);
207  }
208 
209  SLE::pointer sleDst = view().peek(keylet::account(uDstAccountID));
210 
211  if (!sleDst)
212  {
213  JLOG(j_.trace())
214  << "Delay transaction: Destination account does not exist.";
215  return tecNO_DST;
216  }
217 
218  STAmount saLimitAllow = saLimitAmount;
219  saLimitAllow.setIssuer(account_);
220 
221  SLE::pointer sleRippleState =
222  view().peek(keylet::line(account_, uDstAccountID, currency));
223 
224  if (sleRippleState)
225  {
226  STAmount saLowBalance;
227  STAmount saLowLimit;
228  STAmount saHighBalance;
229  STAmount saHighLimit;
230  std::uint32_t uLowQualityIn;
231  std::uint32_t uLowQualityOut;
232  std::uint32_t uHighQualityIn;
233  std::uint32_t uHighQualityOut;
234  auto const& uLowAccountID = !bHigh ? account_ : uDstAccountID;
235  auto const& uHighAccountID = bHigh ? account_ : uDstAccountID;
236  SLE::ref sleLowAccount = !bHigh ? sle : sleDst;
237  SLE::ref sleHighAccount = bHigh ? sle : sleDst;
238 
239  //
240  // Balances
241  //
242 
243  saLowBalance = sleRippleState->getFieldAmount(sfBalance);
244  saHighBalance = -saLowBalance;
245 
246  //
247  // Limits
248  //
249 
250  sleRippleState->setFieldAmount(
251  !bHigh ? sfLowLimit : sfHighLimit, saLimitAllow);
252 
253  saLowLimit =
254  !bHigh ? saLimitAllow : sleRippleState->getFieldAmount(sfLowLimit);
255  saHighLimit =
256  bHigh ? saLimitAllow : sleRippleState->getFieldAmount(sfHighLimit);
257 
258  //
259  // Quality in
260  //
261 
262  if (!bQualityIn)
263  {
264  // Not setting. Just get it.
265 
266  uLowQualityIn = sleRippleState->getFieldU32(sfLowQualityIn);
267  uHighQualityIn = sleRippleState->getFieldU32(sfHighQualityIn);
268  }
269  else if (uQualityIn)
270  {
271  // Setting.
272 
273  sleRippleState->setFieldU32(
274  !bHigh ? sfLowQualityIn : sfHighQualityIn, uQualityIn);
275 
276  uLowQualityIn = !bHigh
277  ? uQualityIn
278  : sleRippleState->getFieldU32(sfLowQualityIn);
279  uHighQualityIn = bHigh
280  ? uQualityIn
281  : sleRippleState->getFieldU32(sfHighQualityIn);
282  }
283  else
284  {
285  // Clearing.
286 
287  sleRippleState->makeFieldAbsent(
288  !bHigh ? sfLowQualityIn : sfHighQualityIn);
289 
290  uLowQualityIn =
291  !bHigh ? 0 : sleRippleState->getFieldU32(sfLowQualityIn);
292  uHighQualityIn =
293  bHigh ? 0 : sleRippleState->getFieldU32(sfHighQualityIn);
294  }
295 
296  if (QUALITY_ONE == uLowQualityIn)
297  uLowQualityIn = 0;
298 
299  if (QUALITY_ONE == uHighQualityIn)
300  uHighQualityIn = 0;
301 
302  //
303  // Quality out
304  //
305 
306  if (!bQualityOut)
307  {
308  // Not setting. Just get it.
309 
310  uLowQualityOut = sleRippleState->getFieldU32(sfLowQualityOut);
311  uHighQualityOut = sleRippleState->getFieldU32(sfHighQualityOut);
312  }
313  else if (uQualityOut)
314  {
315  // Setting.
316 
317  sleRippleState->setFieldU32(
318  !bHigh ? sfLowQualityOut : sfHighQualityOut, uQualityOut);
319 
320  uLowQualityOut = !bHigh
321  ? uQualityOut
322  : sleRippleState->getFieldU32(sfLowQualityOut);
323  uHighQualityOut = bHigh
324  ? uQualityOut
325  : sleRippleState->getFieldU32(sfHighQualityOut);
326  }
327  else
328  {
329  // Clearing.
330 
331  sleRippleState->makeFieldAbsent(
332  !bHigh ? sfLowQualityOut : sfHighQualityOut);
333 
334  uLowQualityOut =
335  !bHigh ? 0 : sleRippleState->getFieldU32(sfLowQualityOut);
336  uHighQualityOut =
337  bHigh ? 0 : sleRippleState->getFieldU32(sfHighQualityOut);
338  }
339 
340  std::uint32_t const uFlagsIn(sleRippleState->getFieldU32(sfFlags));
341  std::uint32_t uFlagsOut(uFlagsIn);
342 
343  if (bSetNoRipple && !bClearNoRipple)
344  {
345  if ((bHigh ? saHighBalance : saLowBalance) >= beast::zero)
346  uFlagsOut |= (bHigh ? lsfHighNoRipple : lsfLowNoRipple);
347 
348  else if (view().rules().enabled(fix1578))
349  // Cannot set noRipple on a negative balance.
350  return tecNO_PERMISSION;
351  }
352  else if (bClearNoRipple && !bSetNoRipple)
353  {
354  uFlagsOut &= ~(bHigh ? lsfHighNoRipple : lsfLowNoRipple);
355  }
356 
357  if (bSetFreeze && !bClearFreeze && !sle->isFlag(lsfNoFreeze))
358  {
359  uFlagsOut |= (bHigh ? lsfHighFreeze : lsfLowFreeze);
360  }
361  else if (bClearFreeze && !bSetFreeze)
362  {
363  uFlagsOut &= ~(bHigh ? lsfHighFreeze : lsfLowFreeze);
364  }
365 
366  if (QUALITY_ONE == uLowQualityOut)
367  uLowQualityOut = 0;
368 
369  if (QUALITY_ONE == uHighQualityOut)
370  uHighQualityOut = 0;
371 
372  bool const bLowDefRipple = sleLowAccount->getFlags() & lsfDefaultRipple;
373  bool const bHighDefRipple =
374  sleHighAccount->getFlags() & lsfDefaultRipple;
375 
376  bool const bLowReserveSet = uLowQualityIn || uLowQualityOut ||
377  ((uFlagsOut & lsfLowNoRipple) == 0) != bLowDefRipple ||
378  (uFlagsOut & lsfLowFreeze) || saLowLimit ||
379  saLowBalance > beast::zero;
380  bool const bLowReserveClear = !bLowReserveSet;
381 
382  bool const bHighReserveSet = uHighQualityIn || uHighQualityOut ||
383  ((uFlagsOut & lsfHighNoRipple) == 0) != bHighDefRipple ||
384  (uFlagsOut & lsfHighFreeze) || saHighLimit ||
385  saHighBalance > beast::zero;
386  bool const bHighReserveClear = !bHighReserveSet;
387 
388  bool const bDefault = bLowReserveClear && bHighReserveClear;
389 
390  bool const bLowReserved = (uFlagsIn & lsfLowReserve);
391  bool const bHighReserved = (uFlagsIn & lsfHighReserve);
392 
393  bool bReserveIncrease = false;
394 
395  if (bSetAuth)
396  {
397  uFlagsOut |= (bHigh ? lsfHighAuth : lsfLowAuth);
398  }
399 
400  if (bLowReserveSet && !bLowReserved)
401  {
402  // Set reserve for low account.
403  adjustOwnerCount(view(), sleLowAccount, 1, viewJ);
404  uFlagsOut |= lsfLowReserve;
405 
406  if (!bHigh)
407  bReserveIncrease = true;
408  }
409 
410  if (bLowReserveClear && bLowReserved)
411  {
412  // Clear reserve for low account.
413  adjustOwnerCount(view(), sleLowAccount, -1, viewJ);
414  uFlagsOut &= ~lsfLowReserve;
415  }
416 
417  if (bHighReserveSet && !bHighReserved)
418  {
419  // Set reserve for high account.
420  adjustOwnerCount(view(), sleHighAccount, 1, viewJ);
421  uFlagsOut |= lsfHighReserve;
422 
423  if (bHigh)
424  bReserveIncrease = true;
425  }
426 
427  if (bHighReserveClear && bHighReserved)
428  {
429  // Clear reserve for high account.
430  adjustOwnerCount(view(), sleHighAccount, -1, viewJ);
431  uFlagsOut &= ~lsfHighReserve;
432  }
433 
434  if (uFlagsIn != uFlagsOut)
435  sleRippleState->setFieldU32(sfFlags, uFlagsOut);
436 
437  if (bDefault || badCurrency() == currency)
438  {
439  // Delete.
440 
441  terResult = trustDelete(
442  view(), sleRippleState, uLowAccountID, uHighAccountID, viewJ);
443  }
444  // Reserve is not scaled by load.
445  else if (bReserveIncrease && mPriorBalance < reserveCreate)
446  {
447  JLOG(j_.trace())
448  << "Delay transaction: Insufficent reserve to add trust line.";
449 
450  // Another transaction could provide XRP to the account and then
451  // this transaction would succeed.
452  terResult = tecINSUF_RESERVE_LINE;
453  }
454  else
455  {
456  view().update(sleRippleState);
457 
458  JLOG(j_.trace()) << "Modify ripple line";
459  }
460  }
461  // Line does not exist.
462  else if (
463  !saLimitAmount && // Setting default limit.
464  (!bQualityIn || !uQualityIn) && // Not setting quality in or setting
465  // default quality in.
466  (!bQualityOut || !uQualityOut) && // Not setting quality out or setting
467  // default quality out.
468  (!bSetAuth))
469  {
470  JLOG(j_.trace())
471  << "Redundant: Setting non-existent ripple line to defaults.";
472  return tecNO_LINE_REDUNDANT;
473  }
474  else if (mPriorBalance < reserveCreate) // Reserve is not scaled by load.
475  {
476  JLOG(j_.trace()) << "Delay transaction: Line does not exist. "
477  "Insufficent reserve to create line.";
478 
479  // Another transaction could create the account and then this
480  // transaction would succeed.
481  terResult = tecNO_LINE_INSUF_RESERVE;
482  }
483  else
484  {
485  // Zero balance in currency.
486  STAmount saBalance({currency, noAccount()});
487 
488  auto const k = keylet::line(account_, uDstAccountID, currency);
489 
490  JLOG(j_.trace()) << "doTrustSet: Creating ripple line: "
491  << to_string(k.key);
492 
493  // Create a new ripple line.
494  terResult = trustCreate(
495  view(),
496  bHigh,
497  account_,
498  uDstAccountID,
499  k.key,
500  sle,
501  bSetAuth,
502  bSetNoRipple && !bClearNoRipple,
503  bSetFreeze && !bClearFreeze,
504  saBalance,
505  saLimitAllow, // Limit for who is being charged.
506  uQualityIn,
507  uQualityOut,
508  viewJ);
509  }
510 
511  return terResult;
512 }
513 
514 } // 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:109
ripple::tefINTERNAL
@ tefINTERNAL
Definition: TER.h:152
ripple::tecINSUF_RESERVE_LINE
@ tecINSUF_RESERVE_LINE
Definition: TER.h:252
ripple::Rules::enabled
bool enabled(uint256 const &feature) const
Returns true if a feature is enabled.
Definition: Rules.cpp:81
std::shared_ptr< STLedgerEntry >
ripple::PreclaimContext::view
ReadView const & view
Definition: Transactor.h:56
ripple::tfTrustSetMask
constexpr std::uint32_t tfTrustSetMask
Definition: TxFlags.h:104
ripple::temBAD_CURRENCY
@ temBAD_CURRENCY
Definition: TER.h:85
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:241
ripple::Transactor::j_
const beast::Journal j_
Definition: Transactor.h:89
ripple::isTesSuccess
bool isTesSuccess(TER x)
Definition: TER.h:594
ripple::sfQualityOut
const SF_UINT32 sfQualityOut
ripple::lsfLowAuth
@ lsfLowAuth
Definition: LedgerFormats.h:243
ripple::lsfLowNoRipple
@ lsfLowNoRipple
Definition: LedgerFormats.h:245
ripple::tfSetNoRipple
constexpr std::uint32_t tfSetNoRipple
Definition: TxFlags.h:100
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:431
ripple::STAmount::setIssuer
void setIssuer(AccountID const &uIssuer)
Definition: STAmount.h:418
ripple::PreflightContext::j
const beast::Journal j
Definition: Transactor.h:38
ripple::temDST_IS_SRC
@ temDST_IS_SRC
Definition: TER.h:103
ripple::preflight1
NotTEC preflight1(PreflightContext const &ctx)
Performs early sanity checks on the account and fee fields.
Definition: Transactor.cpp:57
ripple::lsfHighAuth
@ lsfHighAuth
Definition: LedgerFormats.h:244
ripple::ApplyContext::app
Application & app
Definition: ApplyContext.h:47
ripple::STAmount::getIssuer
AccountID const & getIssuer() const
Definition: STAmount.h:351
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:106
ripple::STAmount::getFullText
std::string getFullText() const override
Definition: STAmount.cpp:507
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::temBAD_LIMIT
@ temBAD_LIMIT
Definition: TER.h:89
ripple::TERSubset< CanCvtToTER >
ripple::sfLowQualityIn
const SF_UINT32 sfLowQualityIn
ripple::SetTrust::doApply
TER doApply() override
Definition: SetTrust.cpp:135
ripple::temDST_NEEDED
@ temDST_NEEDED
Definition: TER.h:104
ripple::tecNO_LINE_REDUNDANT
@ tecNO_LINE_REDUNDANT
Definition: TER.h:257
ripple::STAmount
Definition: STAmount.h:44
ripple::STObject::getFlags
std::uint32_t getFlags() const
Definition: STObject.cpp:481
ripple::tfClearNoRipple
constexpr std::uint32_t tfClearNoRipple
Definition: TxFlags.h:101
ripple::temBAD_AMOUNT
@ temBAD_AMOUNT
Definition: TER.h:84
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:246
ripple::terNO_ACCOUNT
@ terNO_ACCOUNT
Definition: TER.h:195
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:248
ripple::STAmount::native
bool native() const noexcept
Definition: STAmount.h:321
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:153
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:256
ripple::Transactor::view
ApplyView & view()
Definition: Transactor.h:107
ripple::tfSetFreeze
constexpr std::uint32_t tfSetFreeze
Definition: TxFlags.h:102
ripple::tfSetfAuth
constexpr std::uint32_t tfSetfAuth
Definition: TxFlags.h:99
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::tecNO_PERMISSION
@ tecNO_PERMISSION
Definition: TER.h:269
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:103
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:247
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:242
ripple::STAmount::getCurrency
Currency const & getCurrency() const
Definition: STAmount.h:345
ripple::tesSUCCESS
@ tesSUCCESS
Definition: TER.h:219
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:254
ripple::XRPAmount
Definition: XRPAmount.h:46
ripple::NotTEC
TERSubset< CanCvtToNotTEC > NotTEC
Definition: TER.h:525