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