rippled
SetAccount.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/SetAccount.h>
21 #include <ripple/basics/Log.h>
22 #include <ripple/core/Config.h>
23 #include <ripple/ledger/View.h>
24 #include <ripple/protocol/Feature.h>
25 #include <ripple/protocol/Indexes.h>
26 #include <ripple/protocol/PublicKey.h>
27 #include <ripple/protocol/Quality.h>
28 #include <ripple/protocol/st.h>
29 
30 namespace ripple {
31 
32 TxConsequences
34 {
35  // The SetAccount may be a blocker, but only if it sets or clears
36  // specific account flags.
37  auto getTxConsequencesCategory = [](STTx const& tx) {
38  if (std::uint32_t const uTxFlags = tx.getFlags();
39  uTxFlags & (tfRequireAuth | tfOptionalAuth))
41 
42  if (auto const uSetFlag = tx[~sfSetFlag]; uSetFlag &&
43  (*uSetFlag == asfRequireAuth || *uSetFlag == asfDisableMaster ||
44  *uSetFlag == asfAccountTxnID))
46 
47  if (auto const uClearFlag = tx[~sfClearFlag]; uClearFlag &&
48  (*uClearFlag == asfRequireAuth || *uClearFlag == asfDisableMaster ||
49  *uClearFlag == asfAccountTxnID))
51 
53  };
54 
55  return TxConsequences{ctx.tx, getTxConsequencesCategory(ctx.tx)};
56 }
57 
58 NotTEC
60 {
61  auto const ret = preflight1(ctx);
62  if (!isTesSuccess(ret))
63  return ret;
64 
65  auto& tx = ctx.tx;
66  auto& j = ctx.j;
67 
68  std::uint32_t const uTxFlags = tx.getFlags();
69 
70  if (uTxFlags & tfAccountSetMask)
71  {
72  JLOG(j.trace()) << "Malformed transaction: Invalid flags set.";
73  return temINVALID_FLAG;
74  }
75 
76  std::uint32_t const uSetFlag = tx.getFieldU32(sfSetFlag);
77  std::uint32_t const uClearFlag = tx.getFieldU32(sfClearFlag);
78 
79  if ((uSetFlag != 0) && (uSetFlag == uClearFlag))
80  {
81  JLOG(j.trace()) << "Malformed transaction: Set and clear same flag.";
82  return temINVALID_FLAG;
83  }
84 
85  //
86  // RequireAuth
87  //
88  bool bSetRequireAuth =
89  (uTxFlags & tfRequireAuth) || (uSetFlag == asfRequireAuth);
90  bool bClearRequireAuth =
91  (uTxFlags & tfOptionalAuth) || (uClearFlag == asfRequireAuth);
92 
93  if (bSetRequireAuth && bClearRequireAuth)
94  {
95  JLOG(j.trace()) << "Malformed transaction: Contradictory flags set.";
96  return temINVALID_FLAG;
97  }
98 
99  //
100  // RequireDestTag
101  //
102  bool bSetRequireDest =
103  (uTxFlags & TxFlag::requireDestTag) || (uSetFlag == asfRequireDest);
104  bool bClearRequireDest =
105  (uTxFlags & tfOptionalDestTag) || (uClearFlag == asfRequireDest);
106 
107  if (bSetRequireDest && bClearRequireDest)
108  {
109  JLOG(j.trace()) << "Malformed transaction: Contradictory flags set.";
110  return temINVALID_FLAG;
111  }
112 
113  //
114  // DisallowXRP
115  //
116  bool bSetDisallowXRP =
117  (uTxFlags & tfDisallowXRP) || (uSetFlag == asfDisallowXRP);
118  bool bClearDisallowXRP =
119  (uTxFlags & tfAllowXRP) || (uClearFlag == asfDisallowXRP);
120 
121  if (bSetDisallowXRP && bClearDisallowXRP)
122  {
123  JLOG(j.trace()) << "Malformed transaction: Contradictory flags set.";
124  return temINVALID_FLAG;
125  }
126 
127  // TransferRate
128  if (tx.isFieldPresent(sfTransferRate))
129  {
130  std::uint32_t uRate = tx.getFieldU32(sfTransferRate);
131 
132  if (uRate && (uRate < QUALITY_ONE))
133  {
134  JLOG(j.trace())
135  << "Malformed transaction: Transfer rate too small.";
136  return temBAD_TRANSFER_RATE;
137  }
138 
139  if (uRate > 2 * QUALITY_ONE)
140  {
141  JLOG(j.trace())
142  << "Malformed transaction: Transfer rate too large.";
143  return temBAD_TRANSFER_RATE;
144  }
145  }
146 
147  // TickSize
148  if (tx.isFieldPresent(sfTickSize))
149  {
150  auto uTickSize = tx[sfTickSize];
151  if (uTickSize &&
152  ((uTickSize < Quality::minTickSize) ||
153  (uTickSize > Quality::maxTickSize)))
154  {
155  JLOG(j.trace()) << "Malformed transaction: Bad tick size.";
156  return temBAD_TICK_SIZE;
157  }
158  }
159 
160  if (auto const mk = tx[~sfMessageKey])
161  {
162  if (mk->size() && !publicKeyType({mk->data(), mk->size()}))
163  {
164  JLOG(j.trace()) << "Invalid message key specified.";
165  return telBAD_PUBLIC_KEY;
166  }
167  }
168 
169  auto const domain = tx[~sfDomain];
170  if (domain && domain->size() > DOMAIN_BYTES_MAX)
171  {
172  JLOG(j.trace()) << "domain too long";
173  return telBAD_DOMAIN;
174  }
175 
176  return preflight2(ctx);
177 }
178 
179 TER
181 {
182  auto const id = ctx.tx[sfAccount];
183 
184  std::uint32_t const uTxFlags = ctx.tx.getFlags();
185 
186  auto const sle = ctx.view.read(keylet::account(id));
187  if (!sle)
188  return terNO_ACCOUNT;
189 
190  std::uint32_t const uFlagsIn = sle->getFieldU32(sfFlags);
191 
192  std::uint32_t const uSetFlag = ctx.tx.getFieldU32(sfSetFlag);
193 
194  // legacy AccountSet flags
195  bool bSetRequireAuth =
196  (uTxFlags & tfRequireAuth) || (uSetFlag == asfRequireAuth);
197 
198  //
199  // RequireAuth
200  //
201  if (bSetRequireAuth && !(uFlagsIn & lsfRequireAuth))
202  {
203  if (!dirIsEmpty(ctx.view, keylet::ownerDir(id)))
204  {
205  JLOG(ctx.j.trace()) << "Retry: Owner directory not empty.";
206  return (ctx.flags & tapRETRY) ? TER{terOWNERS} : TER{tecOWNERS};
207  }
208  }
209 
210  return tesSUCCESS;
211 }
212 
213 TER
215 {
216  auto const sle = view().peek(keylet::account(account_));
217  if (!sle)
218  return tefINTERNAL;
219 
220  std::uint32_t const uFlagsIn = sle->getFieldU32(sfFlags);
221  std::uint32_t uFlagsOut = uFlagsIn;
222 
223  STTx const& tx{ctx_.tx};
224  std::uint32_t const uSetFlag{tx.getFieldU32(sfSetFlag)};
225  std::uint32_t const uClearFlag{tx.getFieldU32(sfClearFlag)};
226 
227  // legacy AccountSet flags
228  std::uint32_t const uTxFlags{tx.getFlags()};
229  bool const bSetRequireDest{
230  (uTxFlags & TxFlag::requireDestTag) || (uSetFlag == asfRequireDest)};
231  bool const bClearRequireDest{
232  (uTxFlags & tfOptionalDestTag) || (uClearFlag == asfRequireDest)};
233  bool const bSetRequireAuth{
234  (uTxFlags & tfRequireAuth) || (uSetFlag == asfRequireAuth)};
235  bool const bClearRequireAuth{
236  (uTxFlags & tfOptionalAuth) || (uClearFlag == asfRequireAuth)};
237  bool const bSetDisallowXRP{
238  (uTxFlags & tfDisallowXRP) || (uSetFlag == asfDisallowXRP)};
239  bool const bClearDisallowXRP{
240  (uTxFlags & tfAllowXRP) || (uClearFlag == asfDisallowXRP)};
241 
242  bool const sigWithMaster{[&tx, &acct = account_]() {
243  auto const spk = tx.getSigningPubKey();
244 
245  if (publicKeyType(makeSlice(spk)))
246  {
247  PublicKey const signingPubKey(makeSlice(spk));
248 
249  if (calcAccountID(signingPubKey) == acct)
250  return true;
251  }
252  return false;
253  }()};
254 
255  //
256  // RequireAuth
257  //
258  if (bSetRequireAuth && !(uFlagsIn & lsfRequireAuth))
259  {
260  JLOG(j_.trace()) << "Set RequireAuth.";
261  uFlagsOut |= lsfRequireAuth;
262  }
263 
264  if (bClearRequireAuth && (uFlagsIn & lsfRequireAuth))
265  {
266  JLOG(j_.trace()) << "Clear RequireAuth.";
267  uFlagsOut &= ~lsfRequireAuth;
268  }
269 
270  //
271  // RequireDestTag
272  //
273  if (bSetRequireDest && !(uFlagsIn & lsfRequireDestTag))
274  {
275  JLOG(j_.trace()) << "Set lsfRequireDestTag.";
276  uFlagsOut |= lsfRequireDestTag;
277  }
278 
279  if (bClearRequireDest && (uFlagsIn & lsfRequireDestTag))
280  {
281  JLOG(j_.trace()) << "Clear lsfRequireDestTag.";
282  uFlagsOut &= ~lsfRequireDestTag;
283  }
284 
285  //
286  // DisallowXRP
287  //
288  if (bSetDisallowXRP && !(uFlagsIn & lsfDisallowXRP))
289  {
290  JLOG(j_.trace()) << "Set lsfDisallowXRP.";
291  uFlagsOut |= lsfDisallowXRP;
292  }
293 
294  if (bClearDisallowXRP && (uFlagsIn & lsfDisallowXRP))
295  {
296  JLOG(j_.trace()) << "Clear lsfDisallowXRP.";
297  uFlagsOut &= ~lsfDisallowXRP;
298  }
299 
300  //
301  // DisableMaster
302  //
303  if ((uSetFlag == asfDisableMaster) && !(uFlagsIn & lsfDisableMaster))
304  {
305  if (!sigWithMaster)
306  {
307  JLOG(j_.trace()) << "Must use master key to disable master key.";
308  return tecNEED_MASTER_KEY;
309  }
310 
311  if ((!sle->isFieldPresent(sfRegularKey)) &&
312  (!view().peek(keylet::signers(account_))))
313  {
314  // Account has no regular key or multi-signer signer list.
315  return tecNO_ALTERNATIVE_KEY;
316  }
317 
318  JLOG(j_.trace()) << "Set lsfDisableMaster.";
319  uFlagsOut |= lsfDisableMaster;
320  }
321 
322  if ((uClearFlag == asfDisableMaster) && (uFlagsIn & lsfDisableMaster))
323  {
324  JLOG(j_.trace()) << "Clear lsfDisableMaster.";
325  uFlagsOut &= ~lsfDisableMaster;
326  }
327 
328  //
329  // DefaultRipple
330  //
331  if (uSetFlag == asfDefaultRipple)
332  {
333  JLOG(j_.trace()) << "Set lsfDefaultRipple.";
334  uFlagsOut |= lsfDefaultRipple;
335  }
336  else if (uClearFlag == asfDefaultRipple)
337  {
338  JLOG(j_.trace()) << "Clear lsfDefaultRipple.";
339  uFlagsOut &= ~lsfDefaultRipple;
340  }
341 
342  //
343  // NoFreeze
344  //
345  if (uSetFlag == asfNoFreeze)
346  {
347  if (!sigWithMaster && !(uFlagsIn & lsfDisableMaster))
348  {
349  JLOG(j_.trace()) << "Must use master key to set NoFreeze.";
350  return tecNEED_MASTER_KEY;
351  }
352 
353  JLOG(j_.trace()) << "Set NoFreeze flag";
354  uFlagsOut |= lsfNoFreeze;
355  }
356 
357  // Anyone may set global freeze
358  if (uSetFlag == asfGlobalFreeze)
359  {
360  JLOG(j_.trace()) << "Set GlobalFreeze flag";
361  uFlagsOut |= lsfGlobalFreeze;
362  }
363 
364  // If you have set NoFreeze, you may not clear GlobalFreeze
365  // This prevents those who have set NoFreeze from using
366  // GlobalFreeze strategically.
367  if ((uSetFlag != asfGlobalFreeze) && (uClearFlag == asfGlobalFreeze) &&
368  ((uFlagsOut & lsfNoFreeze) == 0))
369  {
370  JLOG(j_.trace()) << "Clear GlobalFreeze flag";
371  uFlagsOut &= ~lsfGlobalFreeze;
372  }
373 
374  //
375  // Track transaction IDs signed by this account in its root
376  //
377  if ((uSetFlag == asfAccountTxnID) && !sle->isFieldPresent(sfAccountTxnID))
378  {
379  JLOG(j_.trace()) << "Set AccountTxnID.";
380  sle->makeFieldPresent(sfAccountTxnID);
381  }
382 
383  if ((uClearFlag == asfAccountTxnID) && sle->isFieldPresent(sfAccountTxnID))
384  {
385  JLOG(j_.trace()) << "Clear AccountTxnID.";
386  sle->makeFieldAbsent(sfAccountTxnID);
387  }
388 
389  //
390  // DepositAuth
391  //
392  if (view().rules().enabled(featureDepositAuth))
393  {
394  if (uSetFlag == asfDepositAuth)
395  {
396  JLOG(j_.trace()) << "Set lsfDepositAuth.";
397  uFlagsOut |= lsfDepositAuth;
398  }
399  else if (uClearFlag == asfDepositAuth)
400  {
401  JLOG(j_.trace()) << "Clear lsfDepositAuth.";
402  uFlagsOut &= ~lsfDepositAuth;
403  }
404  }
405 
406  //
407  // EmailHash
408  //
409  if (tx.isFieldPresent(sfEmailHash))
410  {
411  uint128 const uHash = tx.getFieldH128(sfEmailHash);
412 
413  if (!uHash)
414  {
415  JLOG(j_.trace()) << "unset email hash";
416  sle->makeFieldAbsent(sfEmailHash);
417  }
418  else
419  {
420  JLOG(j_.trace()) << "set email hash";
421  sle->setFieldH128(sfEmailHash, uHash);
422  }
423  }
424 
425  //
426  // WalletLocator
427  //
428  if (tx.isFieldPresent(sfWalletLocator))
429  {
430  uint256 const uHash = tx.getFieldH256(sfWalletLocator);
431 
432  if (!uHash)
433  {
434  JLOG(j_.trace()) << "unset wallet locator";
435  sle->makeFieldAbsent(sfWalletLocator);
436  }
437  else
438  {
439  JLOG(j_.trace()) << "set wallet locator";
440  sle->setFieldH256(sfWalletLocator, uHash);
441  }
442  }
443 
444  //
445  // MessageKey
446  //
447  if (tx.isFieldPresent(sfMessageKey))
448  {
449  Blob const messageKey = tx.getFieldVL(sfMessageKey);
450 
451  if (messageKey.empty())
452  {
453  JLOG(j_.debug()) << "set message key";
454  sle->makeFieldAbsent(sfMessageKey);
455  }
456  else
457  {
458  JLOG(j_.debug()) << "set message key";
459  sle->setFieldVL(sfMessageKey, messageKey);
460  }
461  }
462 
463  //
464  // Domain
465  //
466  if (tx.isFieldPresent(sfDomain))
467  {
468  Blob const domain = tx.getFieldVL(sfDomain);
469 
470  if (domain.empty())
471  {
472  JLOG(j_.trace()) << "unset domain";
473  sle->makeFieldAbsent(sfDomain);
474  }
475  else
476  {
477  JLOG(j_.trace()) << "set domain";
478  sle->setFieldVL(sfDomain, domain);
479  }
480  }
481 
482  //
483  // TransferRate
484  //
485  if (tx.isFieldPresent(sfTransferRate))
486  {
487  std::uint32_t uRate = tx.getFieldU32(sfTransferRate);
488 
489  if (uRate == 0 || uRate == QUALITY_ONE)
490  {
491  JLOG(j_.trace()) << "unset transfer rate";
492  sle->makeFieldAbsent(sfTransferRate);
493  }
494  else
495  {
496  JLOG(j_.trace()) << "set transfer rate";
497  sle->setFieldU32(sfTransferRate, uRate);
498  }
499  }
500 
501  //
502  // TickSize
503  //
504  if (tx.isFieldPresent(sfTickSize))
505  {
506  auto uTickSize = tx[sfTickSize];
507  if ((uTickSize == 0) || (uTickSize == Quality::maxTickSize))
508  {
509  JLOG(j_.trace()) << "unset tick size";
510  sle->makeFieldAbsent(sfTickSize);
511  }
512  else
513  {
514  JLOG(j_.trace()) << "set tick size";
515  sle->setFieldU8(sfTickSize, uTickSize);
516  }
517  }
518 
519  if (uFlagsIn != uFlagsOut)
520  sle->setFieldU32(sfFlags, uFlagsOut);
521 
522  return tesSUCCESS;
523 }
524 
525 } // namespace ripple
ripple::keylet::ownerDir
Keylet ownerDir(AccountID const &id) noexcept
The root page of an account's directory.
Definition: Indexes.cpp:304
ripple::preflight2
NotTEC preflight2(PreflightContext const &ctx)
Checks whether the signature appears valid.
Definition: Transactor.cpp:108
ripple::tfRequireAuth
const std::uint32_t tfRequireAuth
Definition: TxFlags.h:56
ripple::makeSlice
std::enable_if_t< std::is_same< T, char >::value||std::is_same< T, unsigned char >::value, Slice > makeSlice(std::array< T, N > const &a)
Definition: Slice.h:240
ripple::tefINTERNAL
@ tefINTERNAL
Definition: TER.h:151
ripple::lsfGlobalFreeze
@ lsfGlobalFreeze
Definition: LedgerFormats.h:111
ripple::PreclaimContext::view
ReadView const & view
Definition: Transactor.h:57
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::publicKeyType
boost::optional< KeyType > publicKeyType(Slice const &slice)
Returns the type of public key.
Definition: PublicKey.cpp:203
ripple::ApplyView::peek
virtual std::shared_ptr< SLE > peek(Keylet const &k)=0
Prepare to modify the SLE associated with key.
ripple::lsfDisableMaster
@ lsfDisableMaster
Definition: LedgerFormats.h:109
ripple::tecOWNERS
@ tecOWNERS
Definition: TER.h:260
ripple::Transactor::j_
const beast::Journal j_
Definition: Transactor.h:90
ripple::isTesSuccess
bool isTesSuccess(TER x)
Definition: TER.h:581
ripple::sfRegularKey
const SF_ACCOUNT sfRegularKey
ripple::asfGlobalFreeze
const std::uint32_t asfGlobalFreeze
Definition: TxFlags.h:71
std::vector< unsigned char >
ripple::sfWalletLocator
const SF_HASH256 sfWalletLocator
ripple::telBAD_DOMAIN
@ telBAD_DOMAIN
Definition: TER.h:52
ripple::asfDefaultRipple
const std::uint32_t asfDefaultRipple
Definition: TxFlags.h:72
ripple::featureDepositAuth
const uint256 featureDepositAuth
Definition: Feature.cpp:171
ripple::sfSetFlag
const SF_UINT32 sfSetFlag
ripple::asfDepositAuth
const std::uint32_t asfDepositAuth
Definition: TxFlags.h:73
ripple::sfEmailHash
const SF_HASH128 sfEmailHash
ripple::asfDisallowXRP
const std::uint32_t asfDisallowXRP
Definition: TxFlags.h:67
ripple::tfOptionalDestTag
const std::uint32_t tfOptionalDestTag
Definition: TxFlags.h:55
ripple::SetAccount::DOMAIN_BYTES_MAX
static const std::size_t DOMAIN_BYTES_MAX
Definition: SetAccount.h:34
ripple::TxFlag::requireDestTag
static const std::uint32_t requireDestTag
Definition: TxFlags.h:43
ripple::temBAD_TRANSFER_RATE
@ temBAD_TRANSFER_RATE
Definition: TER.h:102
ripple::PreflightContext::j
const beast::Journal j
Definition: Transactor.h:39
ripple::asfAccountTxnID
const std::uint32_t asfAccountTxnID
Definition: TxFlags.h:69
ripple::preflight1
NotTEC preflight1(PreflightContext const &ctx)
Performs early sanity checks on the account and fee fields.
Definition: Transactor.cpp:56
ripple::lsfDepositAuth
@ lsfDepositAuth
Definition: LedgerFormats.h:114
ripple::base_uint
Integers of any length that is a multiple of 32-bits.
Definition: base_uint.h:73
ripple::tfDisallowXRP
const std::uint32_t tfDisallowXRP
Definition: TxFlags.h:58
ripple::temINVALID_FLAG
@ temINVALID_FLAG
Definition: TER.h:106
ripple::tfAllowXRP
const std::uint32_t tfAllowXRP
Definition: TxFlags.h:59
ripple::lsfRequireAuth
@ lsfRequireAuth
Definition: LedgerFormats.h:106
ripple::lsfDefaultRipple
@ lsfDefaultRipple
Definition: LedgerFormats.h:112
ripple::tecNO_ALTERNATIVE_KEY
@ tecNO_ALTERNATIVE_KEY
Definition: TER.h:258
ripple::asfRequireAuth
const std::uint32_t asfRequireAuth
Definition: TxFlags.h:66
ripple::PublicKey
A public key.
Definition: PublicKey.h:59
ripple::keylet::account
Keylet account(AccountID const &id) noexcept
AccountID root.
Definition: Indexes.cpp:134
ripple::TxConsequences::blocker
@ blocker
Affects the ability of subsequent transactions to claim a fee.
Definition: applySteps.h:55
ripple::TERSubset
Definition: TER.h:327
ripple::calcAccountID
AccountID calcAccountID(PublicKey const &pk)
Definition: AccountID.cpp:80
ripple::SetAccount::doApply
TER doApply() override
Definition: SetAccount.cpp:214
ripple::terOWNERS
@ terOWNERS
Definition: TER.h:196
ripple::STObject::getFlags
std::uint32_t getFlags() const
Definition: STObject.cpp:454
ripple::STTx
Definition: STTx.h:42
ripple::sfTransferRate
const SF_UINT32 sfTransferRate
ripple::sfTickSize
const SF_UINT8 sfTickSize
std::uint32_t
ripple::sfClearFlag
const SF_UINT32 sfClearFlag
ripple::ReadView::read
virtual std::shared_ptr< SLE const > read(Keylet const &k) const =0
Return the state item associated with a key.
ripple::tecNEED_MASTER_KEY
@ tecNEED_MASTER_KEY
Definition: TER.h:270
ripple::PreclaimContext::tx
STTx const & tx
Definition: Transactor.h:59
ripple::asfRequireDest
const std::uint32_t asfRequireDest
Definition: TxFlags.h:65
ripple::lsfRequireDestTag
@ lsfRequireDestTag
Definition: LedgerFormats.h:104
ripple::SetAccount::makeTxConsequences
static TxConsequences makeTxConsequences(PreflightContext const &ctx)
Definition: SetAccount.cpp:33
ripple::terNO_ACCOUNT
@ terNO_ACCOUNT
Definition: TER.h:193
ripple::PreclaimContext
State information when determining if a tx is likely to claim a fee.
Definition: Transactor.h:53
ripple::tapRETRY
@ tapRETRY
Definition: ApplyView.h:39
ripple::asfDisableMaster
const std::uint32_t asfDisableMaster
Definition: TxFlags.h:68
ripple::dirIsEmpty
bool dirIsEmpty(ReadView const &view, Keylet const &k)
Returns true if the directory is empty.
Definition: View.cpp:469
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition: RCLCensorshipDetector.h:29
ripple::asfNoFreeze
const std::uint32_t asfNoFreeze
Definition: TxFlags.h:70
ripple::tfOptionalAuth
const std::uint32_t tfOptionalAuth
Definition: TxFlags.h:57
ripple::Transactor::view
ApplyView & view()
Definition: Transactor.h:108
ripple::sfAccountTxnID
const SF_HASH256 sfAccountTxnID
ripple::lsfNoFreeze
@ lsfNoFreeze
Definition: LedgerFormats.h:110
ripple::sfFlags
const SF_UINT32 sfFlags
ripple::SetAccount::preflight
static NotTEC preflight(PreflightContext const &ctx)
Definition: SetAccount.cpp:59
ripple::PreclaimContext::flags
ApplyFlags flags
Definition: Transactor.h:60
ripple::tfAccountSetMask
const std::uint32_t tfAccountSetMask
Definition: TxFlags.h:60
ripple::telBAD_PUBLIC_KEY
@ telBAD_PUBLIC_KEY
Definition: TER.h:54
std::vector::empty
T empty(T... args)
ripple::sfMessageKey
const SF_VL sfMessageKey
ripple::Transactor::ctx_
ApplyContext & ctx_
Definition: Transactor.h:89
beast::Journal::debug
Stream debug() const
Definition: Journal.h:315
ripple::lsfDisallowXRP
@ lsfDisallowXRP
Definition: LedgerFormats.h:108
ripple::sfAccount
const SF_ACCOUNT sfAccount
ripple::TxConsequences::normal
@ normal
Moves currency around, creates offers, etc.
Definition: applySteps.h:52
ripple::PreflightContext::tx
STTx const & tx
Definition: Transactor.h:36
ripple::temBAD_TICK_SIZE
@ temBAD_TICK_SIZE
Definition: TER.h:113
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::sfDomain
const SF_VL sfDomain
ripple::keylet::signers
static Keylet signers(AccountID const &account, std::uint32_t page) noexcept
Definition: Indexes.cpp:269
ripple::TxConsequences
Class describing the consequences to the account of applying a transaction if the transaction consume...
Definition: applySteps.h:45
ripple::tesSUCCESS
@ tesSUCCESS
Definition: TER.h:217
ripple::Transactor::account_
const AccountID account_
Definition: Transactor.h:92
ripple::ApplyContext::tx
STTx const & tx
Definition: ApplyContext.h:48
ripple::SetAccount::preclaim
static TER preclaim(PreclaimContext const &ctx)
Definition: SetAccount.cpp:180