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/protocol/Feature.h>
23 #include <ripple/protocol/Quality.h>
24 #include <ripple/protocol/Indexes.h>
25 #include <ripple/protocol/st.h>
26 #include <ripple/ledger/View.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()) <<
45  "Malformed transaction: Invalid flags set.";
46  return temINVALID_FLAG;
47  }
48 
49  STAmount const saLimitAmount (tx.getFieldAmount (sfLimitAmount));
50 
51  if (!isLegalNet (saLimitAmount))
52  return temBAD_AMOUNT;
53 
54  if (saLimitAmount.native ())
55  {
56  JLOG(j.trace()) <<
57  "Malformed transaction: specifies native limit " <<
58  saLimitAmount.getFullText ();
59  return temBAD_LIMIT;
60  }
61 
62  if (badCurrency() == saLimitAmount.getCurrency ())
63  {
64  JLOG(j.trace()) <<
65  "Malformed transaction: specifies XRP as IOU";
66  return temBAD_CURRENCY;
67  }
68 
69  if (saLimitAmount < beast::zero)
70  {
71  JLOG(j.trace()) <<
72  "Malformed transaction: Negative credit limit.";
73  return temBAD_LIMIT;
74  }
75 
76  // Check if destination makes sense.
77  auto const& issuer = saLimitAmount.getIssuer ();
78 
79  if (!issuer || issuer == noAccount())
80  {
81  JLOG(j.trace()) <<
82  "Malformed transaction: no destination account.";
83  return temDST_NEEDED;
84  }
85 
86  return preflight2 (ctx);
87 }
88 
89 TER
91 {
92  auto const id = ctx.tx[sfAccount];
93 
94  auto const sle = ctx.view.read(
95  keylet::account(id));
96  if (! sle)
97  return terNO_ACCOUNT;
98 
99  std::uint32_t const uTxFlags = ctx.tx.getFlags();
100 
101  bool const bSetAuth = (uTxFlags & tfSetfAuth);
102 
103  if (bSetAuth && !(sle->getFieldU32(sfFlags) & lsfRequireAuth))
104  {
105  JLOG(ctx.j.trace()) <<
106  "Retry: Auth not required.";
107  return tefNO_AUTH_REQUIRED;
108  }
109 
110  auto const saLimitAmount = ctx.tx[sfLimitAmount];
111 
112  auto const currency = saLimitAmount.getCurrency();
113  auto const uDstAccountID = saLimitAmount.getIssuer();
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 = ctx.view.read(
121  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  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(
151  if (! sle)
152  return tefINTERNAL;
153 
154  std::uint32_t const uOwnerCount = sle->getFieldU32 (sfOwnerCount);
155 
156  // The reserve that is required to create the line. Note
157  // that although the reserve increases with every item
158  // an account owns, in the case of trust lines we only
159  // *enforce* a reserve if the user owns more than two
160  // items.
161  //
162  // We do this because being able to exchange currencies,
163  // which needs trust lines, is a powerful Ripple feature.
164  // So we want to make it easy for a gateway to fund the
165  // accounts of its users without fear of being tricked.
166  //
167  // Without this logic, a gateway that wanted to have a
168  // new user use its services, would have to give that
169  // user enough XRP to cover not only the account reserve
170  // but the incremental reserve for the trust line as
171  // well. A person with no intention of using the gateway
172  // could use the extra XRP for their own purposes.
173 
174  XRPAmount const reserveCreate ((uOwnerCount < 2)
175  ? XRPAmount (beast::zero)
176  : view().fees().accountReserve(uOwnerCount + 1));
177 
178  std::uint32_t uQualityIn (bQualityIn ? ctx_.tx.getFieldU32 (sfQualityIn) : 0);
179  std::uint32_t uQualityOut (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  if (account_ == uDstAccountID)
195  {
196  // The only purpose here is to allow a mistakenly created
197  // trust line to oneself to be deleted. If no such trust
198  // lines exist now, why not remove this code and simply
199  // return an error?
200  SLE::pointer sleDelete = view().peek (
201  keylet::line(account_, uDstAccountID, currency));
202 
203  JLOG(j_.warn()) <<
204  "Clearing redundant line.";
205 
206  return trustDelete (view(),
207  sleDelete, account_, uDstAccountID, viewJ);
208  }
209 
210  SLE::pointer sleDst =
211  view().peek (keylet::account(uDstAccountID));
212 
213  if (!sleDst)
214  {
215  JLOG(j_.trace()) <<
216  "Delay transaction: Destination account does not exist.";
217  return tecNO_DST;
218  }
219 
220  STAmount saLimitAllow = saLimitAmount;
221  saLimitAllow.setIssuer (account_);
222 
223  SLE::pointer sleRippleState = view().peek (
224  keylet::line(account_, uDstAccountID, currency));
225 
226  if (sleRippleState)
227  {
228  STAmount saLowBalance;
229  STAmount saLowLimit;
230  STAmount saHighBalance;
231  STAmount saHighLimit;
232  std::uint32_t uLowQualityIn;
233  std::uint32_t uLowQualityOut;
234  std::uint32_t uHighQualityIn;
235  std::uint32_t uHighQualityOut;
236  auto const& uLowAccountID = !bHigh ? account_ : uDstAccountID;
237  auto const& uHighAccountID = bHigh ? account_ : uDstAccountID;
238  SLE::ref sleLowAccount = !bHigh ? sle : sleDst;
239  SLE::ref sleHighAccount = bHigh ? sle : sleDst;
240 
241  //
242  // Balances
243  //
244 
245  saLowBalance = sleRippleState->getFieldAmount (sfBalance);
246  saHighBalance = -saLowBalance;
247 
248  //
249  // Limits
250  //
251 
252  sleRippleState->setFieldAmount (!bHigh ? sfLowLimit : sfHighLimit, saLimitAllow);
253 
254  saLowLimit = !bHigh ? saLimitAllow : sleRippleState->getFieldAmount (sfLowLimit);
255  saHighLimit = bHigh ? saLimitAllow : sleRippleState->getFieldAmount (sfHighLimit);
256 
257  //
258  // Quality in
259  //
260 
261  if (!bQualityIn)
262  {
263  // Not setting. Just get it.
264 
265  uLowQualityIn = sleRippleState->getFieldU32 (sfLowQualityIn);
266  uHighQualityIn = sleRippleState->getFieldU32 (sfHighQualityIn);
267  }
268  else if (uQualityIn)
269  {
270  // Setting.
271 
272  sleRippleState->setFieldU32 (!bHigh ? sfLowQualityIn : sfHighQualityIn, uQualityIn);
273 
274  uLowQualityIn = !bHigh ? uQualityIn : sleRippleState->getFieldU32 (sfLowQualityIn);
275  uHighQualityIn = bHigh ? uQualityIn : sleRippleState->getFieldU32 (sfHighQualityIn);
276  }
277  else
278  {
279  // Clearing.
280 
281  sleRippleState->makeFieldAbsent (!bHigh ? sfLowQualityIn : sfHighQualityIn);
282 
283  uLowQualityIn = !bHigh ? 0 : sleRippleState->getFieldU32 (sfLowQualityIn);
284  uHighQualityIn = bHigh ? 0 : sleRippleState->getFieldU32 (sfHighQualityIn);
285  }
286 
287  if (QUALITY_ONE == uLowQualityIn) uLowQualityIn = 0;
288 
289  if (QUALITY_ONE == uHighQualityIn) uHighQualityIn = 0;
290 
291  //
292  // Quality out
293  //
294 
295  if (!bQualityOut)
296  {
297  // Not setting. Just get it.
298 
299  uLowQualityOut = sleRippleState->getFieldU32 (sfLowQualityOut);
300  uHighQualityOut = sleRippleState->getFieldU32 (sfHighQualityOut);
301  }
302  else if (uQualityOut)
303  {
304  // Setting.
305 
306  sleRippleState->setFieldU32 (!bHigh ? sfLowQualityOut : sfHighQualityOut, uQualityOut);
307 
308  uLowQualityOut = !bHigh ? uQualityOut : sleRippleState->getFieldU32 (sfLowQualityOut);
309  uHighQualityOut = bHigh ? uQualityOut : sleRippleState->getFieldU32 (sfHighQualityOut);
310  }
311  else
312  {
313  // Clearing.
314 
315  sleRippleState->makeFieldAbsent (!bHigh ? sfLowQualityOut : sfHighQualityOut);
316 
317  uLowQualityOut = !bHigh ? 0 : sleRippleState->getFieldU32 (sfLowQualityOut);
318  uHighQualityOut = bHigh ? 0 : sleRippleState->getFieldU32 (sfHighQualityOut);
319  }
320 
321  std::uint32_t const uFlagsIn (sleRippleState->getFieldU32 (sfFlags));
322  std::uint32_t uFlagsOut (uFlagsIn);
323 
324  if (bSetNoRipple && !bClearNoRipple)
325  {
326  if ((bHigh ? saHighBalance : saLowBalance) >= beast::zero)
327  uFlagsOut |= (bHigh ? lsfHighNoRipple : lsfLowNoRipple);
328 
329  else if (view().rules().enabled(fix1578))
330  // Cannot set noRipple on a negative balance.
331  return tecNO_PERMISSION;
332  }
333  else if (bClearNoRipple && !bSetNoRipple)
334  {
335  uFlagsOut &= ~(bHigh ? lsfHighNoRipple : lsfLowNoRipple);
336  }
337 
338  if (bSetFreeze && !bClearFreeze && !sle->isFlag (lsfNoFreeze))
339  {
340  uFlagsOut |= (bHigh ? lsfHighFreeze : lsfLowFreeze);
341  }
342  else if (bClearFreeze && !bSetFreeze)
343  {
344  uFlagsOut &= ~(bHigh ? lsfHighFreeze : lsfLowFreeze);
345  }
346 
347  if (QUALITY_ONE == uLowQualityOut) uLowQualityOut = 0;
348 
349  if (QUALITY_ONE == uHighQualityOut) uHighQualityOut = 0;
350 
351  bool const bLowDefRipple = sleLowAccount->getFlags() & lsfDefaultRipple;
352  bool const bHighDefRipple = sleHighAccount->getFlags() & lsfDefaultRipple;
353 
354  bool const bLowReserveSet = uLowQualityIn || uLowQualityOut ||
355  ((uFlagsOut & lsfLowNoRipple) == 0) != bLowDefRipple ||
356  (uFlagsOut & lsfLowFreeze) ||
357  saLowLimit || saLowBalance > beast::zero;
358  bool const bLowReserveClear = !bLowReserveSet;
359 
360  bool const bHighReserveSet = uHighQualityIn || uHighQualityOut ||
361  ((uFlagsOut & lsfHighNoRipple) == 0) != bHighDefRipple ||
362  (uFlagsOut & lsfHighFreeze) ||
363  saHighLimit || saHighBalance > beast::zero;
364  bool const bHighReserveClear = !bHighReserveSet;
365 
366  bool const bDefault = bLowReserveClear && bHighReserveClear;
367 
368  bool const bLowReserved = (uFlagsIn & lsfLowReserve);
369  bool const bHighReserved = (uFlagsIn & lsfHighReserve);
370 
371  bool bReserveIncrease = false;
372 
373  if (bSetAuth)
374  {
375  uFlagsOut |= (bHigh ? lsfHighAuth : lsfLowAuth);
376  }
377 
378  if (bLowReserveSet && !bLowReserved)
379  {
380  // Set reserve for low account.
382  sleLowAccount, 1, viewJ);
383  uFlagsOut |= lsfLowReserve;
384 
385  if (!bHigh)
386  bReserveIncrease = true;
387  }
388 
389  if (bLowReserveClear && bLowReserved)
390  {
391  // Clear reserve for low account.
393  sleLowAccount, -1, viewJ);
394  uFlagsOut &= ~lsfLowReserve;
395  }
396 
397  if (bHighReserveSet && !bHighReserved)
398  {
399  // Set reserve for high account.
401  sleHighAccount, 1, viewJ);
402  uFlagsOut |= lsfHighReserve;
403 
404  if (bHigh)
405  bReserveIncrease = true;
406  }
407 
408  if (bHighReserveClear && bHighReserved)
409  {
410  // Clear reserve for high account.
412  sleHighAccount, -1, viewJ);
413  uFlagsOut &= ~lsfHighReserve;
414  }
415 
416  if (uFlagsIn != uFlagsOut)
417  sleRippleState->setFieldU32 (sfFlags, uFlagsOut);
418 
419  if (bDefault || badCurrency() == currency)
420  {
421  // Delete.
422 
423  terResult = trustDelete (view(),
424  sleRippleState, uLowAccountID, uHighAccountID, viewJ);
425  }
426  // Reserve is not scaled by load.
427  else if (bReserveIncrease && mPriorBalance < reserveCreate)
428  {
429  JLOG(j_.trace()) <<
430  "Delay transaction: Insufficent reserve to add trust line.";
431 
432  // Another transaction could provide XRP to the account and then
433  // this transaction would succeed.
434  terResult = tecINSUF_RESERVE_LINE;
435  }
436  else
437  {
438  view().update (sleRippleState);
439 
440  JLOG(j_.trace()) << "Modify ripple line";
441  }
442  }
443  // Line does not exist.
444  else if (! saLimitAmount && // Setting default limit.
445  (! bQualityIn || ! uQualityIn) && // Not setting quality in or setting default quality in.
446  (! bQualityOut || ! uQualityOut) && // Not setting quality out or setting default quality out.
447  (! bSetAuth))
448  {
449  JLOG(j_.trace()) <<
450  "Redundant: Setting non-existent ripple line to defaults.";
451  return tecNO_LINE_REDUNDANT;
452  }
453  else if (mPriorBalance < reserveCreate) // Reserve is not scaled by load.
454  {
455  JLOG(j_.trace()) <<
456  "Delay transaction: Line does not exist. Insufficent reserve to create line.";
457 
458  // Another transaction could create the account and then this transaction would succeed.
459  terResult = tecNO_LINE_INSUF_RESERVE;
460  }
461  else
462  {
463  // Zero balance in currency.
464  STAmount saBalance ({currency, noAccount()});
465 
467  account_, uDstAccountID, currency));
468 
469  JLOG(j_.trace()) <<
470  "doTrustSet: Creating ripple line: " <<
471  to_string (index);
472 
473  // Create a new ripple line.
474  terResult = trustCreate (view(),
475  bHigh,
476  account_,
477  uDstAccountID,
478  index,
479  sle,
480  bSetAuth,
481  bSetNoRipple && !bClearNoRipple,
482  bSetFreeze && !bClearFreeze,
483  saBalance,
484  saLimitAllow, // Limit for who is being charged.
485  uQualityIn,
486  uQualityOut, viewJ);
487  }
488 
489  return terResult;
490 }
491 
492 }
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:123
ripple::SetTrust::preflight
static NotTEC preflight(PreflightContext const &ctx)
Definition: SetTrust.cpp:31
ripple::sfHighQualityIn
const SF_U32 sfHighQualityIn(access, STI_UINT32, 16, "HighQualityIn")
Definition: SField.h:353
ripple::preflight2
NotTEC preflight2(PreflightContext const &ctx)
Checks whether the signature appears valid.
Definition: Transactor.cpp:90
ripple::tefINTERNAL
@ tefINTERNAL
Definition: TER.h:153
ripple::tecINSUF_RESERVE_LINE
@ tecINSUF_RESERVE_LINE
Definition: TER.h:253
std::shared_ptr< STLedgerEntry >
ripple::PreclaimContext::view
ReadView const & view
Definition: Transactor.h:53
ripple::temBAD_CURRENCY
@ temBAD_CURRENCY
Definition: TER.h:88
ripple::PreclaimContext::j
const beast::Journal j
Definition: Transactor.h:57
beast::Journal::trace
Stream trace() const
Severity stream access functions.
Definition: Journal.h:287
ripple::ApplyView::peek
virtual std::shared_ptr< SLE > peek(Keylet const &k)=0
Prepare to modify the SLE associated with key.
ripple::sfQualityIn
const SF_U32 sfQualityIn(access, STI_UINT32, 20, "QualityIn")
Definition: SField.h:357
ripple::lsfLowReserve
@ lsfLowReserve
Definition: LedgerFormats.h:147
ripple::Transactor::j_
const beast::Journal j_
Definition: Transactor.h:82
ripple::isTesSuccess
bool isTesSuccess(TER x)
Definition: TER.h:501
ripple::lsfLowAuth
@ lsfLowAuth
Definition: LedgerFormats.h:149
ripple::lsfLowNoRipple
@ lsfLowNoRipple
Definition: LedgerFormats.h:151
ripple::tfTrustSetMask
const std::uint32_t tfTrustSetMask
Definition: TxFlags.h:94
ripple::sfAccount
const SF_Account sfAccount(access, STI_ACCOUNT, 1, "Account")
Definition: SField.h:460
ripple::sfFlags
const SF_U32 sfFlags(access, STI_UINT32, 2, "Flags")
Definition: SField.h:338
ripple::SetTrust::preclaim
static TER preclaim(PreclaimContext const &ctx)
Definition: SetTrust.cpp:90
beast::Journal::warn
Stream warn() const
Definition: Journal.h:302
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:325
ripple::to_string
std::string to_string(ListDisposition disposition)
Definition: ValidatorList.cpp:41
ripple::STAmount::setIssuer
void setIssuer(AccountID const &uIssuer)
Definition: STAmount.h:243
ripple::tfClearFreeze
const std::uint32_t tfClearFreeze
Definition: TxFlags.h:93
ripple::sfOwnerCount
const SF_U32 sfOwnerCount(access, STI_UINT32, 13, "OwnerCount")
Definition: SField.h:349
ripple::PreflightContext::j
const beast::Journal j
Definition: Transactor.h:39
ripple::temDST_IS_SRC
@ temDST_IS_SRC
Definition: TER.h:106
ripple::sfLimitAmount
const SF_Amount sfLimitAmount(access, STI_AMOUNT, 3, "LimitAmount")
Definition: SField.h:425
ripple::sfHighLimit
const SF_Amount sfHighLimit(access, STI_AMOUNT, 7, "HighLimit")
Definition: SField.h:429
ripple::preflight1
NotTEC preflight1(PreflightContext const &ctx)
Performs early sanity checks on the account and fee fields.
Definition: Transactor.cpp:56
ripple::sfLowLimit
const SF_Amount sfLowLimit(access, STI_AMOUNT, 6, "LowLimit")
Definition: SField.h:428
ripple::lsfHighAuth
@ lsfHighAuth
Definition: LedgerFormats.h:150
ripple::ApplyContext::app
Application & app
Definition: ApplyContext.h:44
ripple::base_uint< 160, detail::CurrencyTag >
ripple::temINVALID_FLAG
@ temINVALID_FLAG
Definition: TER.h:109
ripple::STAmount::getFullText
std::string getFullText() const override
Definition: STAmount.cpp:469
ripple::lsfRequireAuth
@ lsfRequireAuth
Definition: LedgerFormats.h:134
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:629
ripple::lsfDefaultRipple
@ lsfDefaultRipple
Definition: LedgerFormats.h:139
ripple::keylet::line
static const line_t line
Definition: Indexes.h:176
ripple::keylet::account
static const account_t account
Definition: Indexes.h:116
ripple::temBAD_LIMIT
@ temBAD_LIMIT
Definition: TER.h:92
ripple::TERSubset< CanCvtToTER >
ripple::getRippleStateIndex
uint256 getRippleStateIndex(AccountID const &a, AccountID const &b, Currency const &currency)
Definition: Indexes.cpp:151
ripple::SetTrust::doApply
TER doApply() override
Definition: SetTrust.cpp:135
ripple::temDST_NEEDED
@ temDST_NEEDED
Definition: TER.h:107
ripple::tecNO_LINE_REDUNDANT
@ tecNO_LINE_REDUNDANT
Definition: TER.h:258
ripple::STAmount
Definition: STAmount.h:42
ripple::STObject::getFlags
std::uint32_t getFlags() const
Definition: STObject.cpp:439
ripple::temBAD_AMOUNT
@ temBAD_AMOUNT
Definition: TER.h:87
ripple::sfLowQualityOut
const SF_U32 sfLowQualityOut(access, STI_UINT32, 19, "LowQualityOut")
Definition: SField.h:356
std::uint32_t
ripple::Rules::enabled
bool enabled(uint256 const &id) const
Returns true if a feature is enabled.
Definition: ReadView.cpp:107
ripple::tfSetFreeze
const std::uint32_t tfSetFreeze
Definition: TxFlags.h:92
ripple::trustDelete
TER trustDelete(ApplyView &view, std::shared_ptr< SLE > const &sleRippleState, AccountID const &uLowAccountID, AccountID const &uHighAccountID, beast::Journal j)
Definition: View.cpp:830
ripple::tfClearNoRipple
const std::uint32_t tfClearNoRipple
Definition: TxFlags.h:91
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:55
ripple::sfQualityOut
const SF_U32 sfQualityOut(access, STI_UINT32, 21, "QualityOut")
Definition: SField.h:358
ripple::STAmount::getCurrency
Currency const & getCurrency() const
Definition: STAmount.h:159
ripple::lsfHighNoRipple
@ lsfHighNoRipple
Definition: LedgerFormats.h:152
ripple::STAmount::getIssuer
AccountID const & getIssuer() const
Definition: STAmount.h:160
ripple::terNO_ACCOUNT
@ terNO_ACCOUNT
Definition: TER.h:195
ripple::fix1578
const uint256 fix1578
Definition: Feature.cpp:171
ripple::PreclaimContext
State information when determining if a tx is likely to claim a fee.
Definition: Transactor.h:49
ripple::lsfHighFreeze
@ lsfHighFreeze
Definition: LedgerFormats.h:154
ripple::STAmount::native
bool native() const noexcept
Definition: STAmount.h:153
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:154
ripple::tfSetNoRipple
const std::uint32_t tfSetNoRipple
Definition: TxFlags.h:90
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:723
ripple::tecNO_LINE_INSUF_RESERVE
@ tecNO_LINE_INSUF_RESERVE
Definition: TER.h:257
ripple::sfLowQualityIn
const SF_U32 sfLowQualityIn(access, STI_UINT32, 18, "LowQualityIn")
Definition: SField.h:355
ripple::sfBalance
const SF_Amount sfBalance(access, STI_AMOUNT, 2, "Balance")
Definition: SField.h:424
ripple::Transactor::view
ApplyView & view()
Definition: Transactor.h:98
ripple::ReadView::rules
virtual Rules const & rules() const =0
Returns the tx processing rules.
ripple::lsfNoFreeze
@ lsfNoFreeze
Definition: LedgerFormats.h:137
ripple::STObject::isFieldPresent
bool isFieldPresent(SField const &field) const
Definition: STObject.cpp:392
ripple::Transactor::mPriorBalance
XRPAmount mPriorBalance
Definition: Transactor.h:85
ripple::tecNO_PERMISSION
@ tecNO_PERMISSION
Definition: TER.h:270
ripple::Transactor::ctx_
ApplyContext & ctx_
Definition: Transactor.h:81
ripple::Transactor::account_
AccountID account_
Definition: Transactor.h:84
ripple::lsfLowFreeze
@ lsfLowFreeze
Definition: LedgerFormats.h:153
ripple::PreflightContext::tx
STTx const & tx
Definition: Transactor.h:36
ripple::STObject::getFieldU32
std::uint32_t getFieldU32(SField const &field) const
Definition: STObject.cpp:512
ripple::PreflightContext
State information when preflighting a tx.
Definition: Transactor.h:32
ripple::tfSetfAuth
const std::uint32_t tfSetfAuth
Definition: TxFlags.h:89
ripple::lsfHighReserve
@ lsfHighReserve
Definition: LedgerFormats.h:148
ripple::sfHighQualityOut
const SF_U32 sfHighQualityOut(access, STI_UINT32, 17, "HighQualityOut")
Definition: SField.h:354
ripple::tesSUCCESS
@ tesSUCCESS
Definition: TER.h:219
ripple::STObject::getFieldAmount
STAmount const & getFieldAmount(SField const &field) const
Definition: STObject.cpp:549
ripple::noAccount
AccountID const & noAccount()
A placeholder for empty accounts.
Definition: AccountID.cpp:156
ripple::ApplyContext::tx
STTx const & tx
Definition: ApplyContext.h:45
ripple::tecNO_DST
@ tecNO_DST
Definition: TER.h:255
ripple::XRPAmount
Definition: XRPAmount.h:46
ripple::NotTEC
TERSubset< CanCvtToNotTEC > NotTEC
Definition: TER.h:461