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