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