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