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