xrpld
Loading...
Searching...
No Matches
libxrpl/tx/transactors/account/AccountSet.cpp
1#include <xrpl/tx/transactors/account/AccountSet.h>
2
3#include <xrpl/basics/Blob.h>
4#include <xrpl/basics/Log.h>
5#include <xrpl/basics/Slice.h>
6#include <xrpl/basics/base_uint.h>
7#include <xrpl/ledger/ApplyView.h>
8#include <xrpl/ledger/ReadView.h>
9#include <xrpl/ledger/helpers/DirectoryHelpers.h>
10#include <xrpl/protocol/Feature.h>
11#include <xrpl/protocol/Indexes.h>
12#include <xrpl/protocol/LedgerFormats.h>
13#include <xrpl/protocol/Permissions.h>
14#include <xrpl/protocol/Protocol.h>
15#include <xrpl/protocol/PublicKey.h>
16#include <xrpl/protocol/Quality.h>
17#include <xrpl/protocol/SField.h>
18#include <xrpl/protocol/STLedgerEntry.h>
19#include <xrpl/protocol/STTx.h>
20#include <xrpl/protocol/TER.h>
21#include <xrpl/protocol/TxFlags.h>
22#include <xrpl/protocol/XRPAmount.h>
23#include <xrpl/tx/Transactor.h>
24#include <xrpl/tx/applySteps.h>
25
26#include <cstdint>
27
28namespace xrpl {
29
32{
33 // The AccountSet may be a blocker, but only if it sets or clears
34 // specific account flags.
35 auto getTxConsequencesCategory = [](STTx const& tx) {
36 if (std::uint32_t const uTxFlags = tx.getFlags();
37 uTxFlags & (tfRequireAuth | tfOptionalAuth))
39
40 if (auto const uSetFlag = tx[~sfSetFlag]; uSetFlag &&
41 (*uSetFlag == asfRequireAuth || *uSetFlag == asfDisableMaster ||
42 *uSetFlag == asfAccountTxnID))
44
45 if (auto const uClearFlag = tx[~sfClearFlag]; uClearFlag &&
46 (*uClearFlag == asfRequireAuth || *uClearFlag == asfDisableMaster ||
47 *uClearFlag == asfAccountTxnID))
49
51 };
52
53 return TxConsequences{ctx.tx, getTxConsequencesCategory(ctx.tx)};
54}
55
58{
59 return tfAccountSetMask;
60}
61
64{
65 auto& tx = ctx.tx;
66 auto& j = ctx.j;
67
68 std::uint32_t const uSetFlag = tx.getFieldU32(sfSetFlag);
69 std::uint32_t const uClearFlag = tx.getFieldU32(sfClearFlag);
70
71 if ((uSetFlag != 0) && (uSetFlag == uClearFlag))
72 {
73 JLOG(j.trace()) << "Malformed transaction: Set and clear same flag.";
74 return temINVALID_FLAG;
75 }
76
77 //
78 // RequireAuth
79 //
80 bool const bSetRequireAuth = tx.isFlag(tfRequireAuth) || (uSetFlag == asfRequireAuth);
81 bool const bClearRequireAuth = tx.isFlag(tfOptionalAuth) || (uClearFlag == asfRequireAuth);
82
83 if (bSetRequireAuth && bClearRequireAuth)
84 {
85 JLOG(j.trace()) << "Malformed transaction: Contradictory flags set.";
86 return temINVALID_FLAG;
87 }
88
89 //
90 // RequireDestTag
91 //
92 bool const bSetRequireDest = tx.isFlag(tfRequireDestTag) || (uSetFlag == asfRequireDest);
93 bool const bClearRequireDest = tx.isFlag(tfOptionalDestTag) || (uClearFlag == asfRequireDest);
94
95 if (bSetRequireDest && bClearRequireDest)
96 {
97 JLOG(j.trace()) << "Malformed transaction: Contradictory flags set.";
98 return temINVALID_FLAG;
99 }
100
101 //
102 // DisallowXRP
103 //
104 bool const bSetDisallowXRP = tx.isFlag(tfDisallowXRP) || (uSetFlag == asfDisallowXRP);
105 bool const bClearDisallowXRP = tx.isFlag(tfAllowXRP) || (uClearFlag == asfDisallowXRP);
106
107 if (bSetDisallowXRP && bClearDisallowXRP)
108 {
109 JLOG(j.trace()) << "Malformed transaction: Contradictory flags set.";
110 return temINVALID_FLAG;
111 }
112
113 // TransferRate
114 if (tx.isFieldPresent(sfTransferRate))
115 {
116 std::uint32_t const uRate = tx.getFieldU32(sfTransferRate);
117
118 if ((uRate != 0u) && (uRate < QUALITY_ONE))
119 {
120 JLOG(j.trace()) << "Malformed transaction: Transfer rate too small.";
122 }
123
124 if (uRate > 2 * QUALITY_ONE)
125 {
126 JLOG(j.trace()) << "Malformed transaction: Transfer rate too large.";
128 }
129 }
130
131 // TickSize
132 if (tx.isFieldPresent(sfTickSize))
133 {
134 auto uTickSize = tx[sfTickSize];
135 if ((uTickSize != 0u) &&
136 ((uTickSize < Quality::kMinTickSize) || (uTickSize > Quality::kMaxTickSize)))
137 {
138 JLOG(j.trace()) << "Malformed transaction: Bad tick size.";
139 return temBAD_TICK_SIZE;
140 }
141 }
142
143 if (auto const mk = tx[~sfMessageKey])
144 {
145 if (!mk->empty() && !publicKeyType({mk->data(), mk->size()}))
146 {
147 JLOG(j.trace()) << "Invalid message key specified.";
148 return telBAD_PUBLIC_KEY;
149 }
150 }
151
152 if (auto const domain = tx[~sfDomain]; domain && domain->size() > kMaxDomainLength)
153 {
154 JLOG(j.trace()) << "domain too long";
155 return telBAD_DOMAIN;
156 }
157
158 // Configure authorized minting account:
159 if (uSetFlag == asfAuthorizedNFTokenMinter && !tx.isFieldPresent(sfNFTokenMinter))
160 return temMALFORMED;
161
162 if (uClearFlag == asfAuthorizedNFTokenMinter && tx.isFieldPresent(sfNFTokenMinter))
163 return temMALFORMED;
164
165 return tesSUCCESS;
166}
167
168TER
170{
171 auto const id = ctx.tx[sfAccount];
172
173 auto const sle = ctx.view.read(keylet::account(id));
174 if (!sle)
175 return terNO_ACCOUNT;
176
177 std::uint32_t const uSetFlag = ctx.tx.getFieldU32(sfSetFlag);
178
179 // legacy AccountSet flags
180 bool const bSetRequireAuth = ctx.tx.isFlag(tfRequireAuth) || (uSetFlag == asfRequireAuth);
181
182 //
183 // RequireAuth
184 //
185 if (bSetRequireAuth && !sle->isFlag(lsfRequireAuth))
186 {
187 if (!dirIsEmpty(ctx.view, keylet::ownerDir(id)))
188 {
189 JLOG(ctx.j.trace()) << "Retry: Owner directory not empty.";
190 return ((ctx.flags & TapRetry) != 0u) ? TER{terOWNERS} : TER{tecOWNERS};
191 }
192 }
193
194 //
195 // Clawback
196 //
197 if (uSetFlag == asfAllowTrustLineClawback)
198 {
199 if (sle->isFlag(lsfNoFreeze))
200 {
201 JLOG(ctx.j.trace()) << "Can't set Clawback if NoFreeze is set";
202 return tecNO_PERMISSION;
203 }
204
205 if (!dirIsEmpty(ctx.view, keylet::ownerDir(id)))
206 {
207 JLOG(ctx.j.trace()) << "Owner directory not empty.";
208 return tecOWNERS;
209 }
210 }
211 else if (uSetFlag == asfNoFreeze)
212 {
213 // Cannot set NoFreeze if clawback is enabled
214 if (sle->isFlag(lsfAllowTrustLineClawback))
215 {
216 JLOG(ctx.j.trace()) << "Can't set NoFreeze if clawback is enabled";
217 return tecNO_PERMISSION;
218 }
219 }
220
221 return tesSUCCESS;
222}
223
224TER
226{
227 auto const sle = view().peek(keylet::account(accountID_));
228 if (!sle)
229 return tefINTERNAL; // LCOV_EXCL_LINE
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 bool const bSetRequireDest{tx.isFlag(tfRequireDestTag) || (uSetFlag == asfRequireDest)};
240 bool const bClearRequireDest{tx.isFlag(tfOptionalDestTag) || (uClearFlag == asfRequireDest)};
241 bool const bSetRequireAuth{tx.isFlag(tfRequireAuth) || (uSetFlag == asfRequireAuth)};
242 bool const bClearRequireAuth{tx.isFlag(tfOptionalAuth) || (uClearFlag == asfRequireAuth)};
243 bool const bSetDisallowXRP{tx.isFlag(tfDisallowXRP) || (uSetFlag == asfDisallowXRP)};
244 bool const bClearDisallowXRP{tx.isFlag(tfAllowXRP) || (uClearFlag == asfDisallowXRP)};
245
246 bool const sigWithMaster{[&tx, &acct = accountID_]() {
247 auto const spk = tx.getSigningPubKey();
248
249 if (publicKeyType(makeSlice(spk)))
250 {
251 PublicKey const signingPubKey(makeSlice(spk));
252
253 if (calcAccountID(signingPubKey) == acct)
254 return true;
255 }
256 return false;
257 }()};
258
259 //
260 // RequireAuth
261 //
262 if (bSetRequireAuth && !sle->isFlag(lsfRequireAuth))
263 {
264 JLOG(j_.trace()) << "Set RequireAuth.";
265 uFlagsOut |= lsfRequireAuth;
266 }
267
268 if (bClearRequireAuth && sle->isFlag(lsfRequireAuth))
269 {
270 JLOG(j_.trace()) << "Clear RequireAuth.";
271 uFlagsOut &= ~lsfRequireAuth;
272 }
273
274 //
275 // RequireDestTag
276 //
277 if (bSetRequireDest && !sle->isFlag(lsfRequireDestTag))
278 {
279 JLOG(j_.trace()) << "Set lsfRequireDestTag.";
280 uFlagsOut |= lsfRequireDestTag;
281 }
282
283 if (bClearRequireDest && sle->isFlag(lsfRequireDestTag))
284 {
285 JLOG(j_.trace()) << "Clear lsfRequireDestTag.";
286 uFlagsOut &= ~lsfRequireDestTag;
287 }
288
289 //
290 // DisallowXRP
291 //
292 if (bSetDisallowXRP && !sle->isFlag(lsfDisallowXRP))
293 {
294 JLOG(j_.trace()) << "Set lsfDisallowXRP.";
295 uFlagsOut |= lsfDisallowXRP;
296 }
297
298 if (bClearDisallowXRP && sle->isFlag(lsfDisallowXRP))
299 {
300 JLOG(j_.trace()) << "Clear lsfDisallowXRP.";
301 uFlagsOut &= ~lsfDisallowXRP;
302 }
303
304 //
305 // DisableMaster
306 //
307 if ((uSetFlag == asfDisableMaster) && !sle->isFlag(lsfDisableMaster))
308 {
309 if (!sigWithMaster)
310 {
311 JLOG(j_.trace()) << "Must use master key to disable master key.";
312 return tecNEED_MASTER_KEY;
313 }
314
315 if ((!sle->isFieldPresent(sfRegularKey)) && (!view().peek(keylet::signerList(accountID_))))
316 {
317 // Account has no regular key or multi-signer signer list.
319 }
320
321 JLOG(j_.trace()) << "Set lsfDisableMaster.";
322 uFlagsOut |= lsfDisableMaster;
323 }
324
325 if ((uClearFlag == asfDisableMaster) && sle->isFlag(lsfDisableMaster))
326 {
327 JLOG(j_.trace()) << "Clear lsfDisableMaster.";
328 uFlagsOut &= ~lsfDisableMaster;
329 }
330
331 //
332 // DefaultRipple
333 //
334 if (uSetFlag == asfDefaultRipple)
335 {
336 JLOG(j_.trace()) << "Set lsfDefaultRipple.";
337 uFlagsOut |= lsfDefaultRipple;
338 }
339 else if (uClearFlag == asfDefaultRipple)
340 {
341 JLOG(j_.trace()) << "Clear lsfDefaultRipple.";
342 uFlagsOut &= ~lsfDefaultRipple;
343 }
344
345 //
346 // NoFreeze
347 //
348 if (uSetFlag == asfNoFreeze)
349 {
350 if (!sigWithMaster && !sle->isFlag(lsfDisableMaster))
351 {
352 JLOG(j_.trace()) << "Must use master key to set NoFreeze.";
353 return tecNEED_MASTER_KEY;
354 }
355
356 JLOG(j_.trace()) << "Set NoFreeze flag";
357 uFlagsOut |= lsfNoFreeze;
358 }
359
360 // Anyone may set global freeze
361 if (uSetFlag == asfGlobalFreeze)
362 {
363 JLOG(j_.trace()) << "Set GlobalFreeze flag";
364 uFlagsOut |= lsfGlobalFreeze;
365 }
366
367 // If you have set NoFreeze, you may not clear GlobalFreeze
368 // This prevents those who have set NoFreeze from using
369 // GlobalFreeze strategically.
370 if ((uSetFlag != asfGlobalFreeze) && (uClearFlag == asfGlobalFreeze) &&
371 ((uFlagsOut & lsfNoFreeze) == 0))
372 {
373 JLOG(j_.trace()) << "Clear GlobalFreeze flag";
374 uFlagsOut &= ~lsfGlobalFreeze;
375 }
376
377 //
378 // Track transaction IDs signed by this account in its root
379 //
380 if ((uSetFlag == asfAccountTxnID) && !sle->isFieldPresent(sfAccountTxnID))
381 {
382 JLOG(j_.trace()) << "Set AccountTxnID.";
383 sle->makeFieldPresent(sfAccountTxnID);
384 }
385
386 if ((uClearFlag == asfAccountTxnID) && sle->isFieldPresent(sfAccountTxnID))
387 {
388 JLOG(j_.trace()) << "Clear AccountTxnID.";
389 sle->makeFieldAbsent(sfAccountTxnID);
390 }
391
392 //
393 // DepositAuth
394 //
395 if (uSetFlag == asfDepositAuth)
396 {
397 JLOG(j_.trace()) << "Set lsfDepositAuth.";
398 uFlagsOut |= lsfDepositAuth;
399 }
400 else if (uClearFlag == asfDepositAuth)
401 {
402 JLOG(j_.trace()) << "Clear lsfDepositAuth.";
403 uFlagsOut &= ~lsfDepositAuth;
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()) << "clear 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 const 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::kMaxTickSize))
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 // Configure authorized minting account:
520 if (uSetFlag == asfAuthorizedNFTokenMinter)
521 sle->setAccountID(sfNFTokenMinter, ctx_.tx[sfNFTokenMinter]);
522
523 if (uClearFlag == asfAuthorizedNFTokenMinter && sle->isFieldPresent(sfNFTokenMinter))
524 sle->makeFieldAbsent(sfNFTokenMinter);
525
526 if (uSetFlag == asfDisallowIncomingNFTokenOffer)
527 {
528 uFlagsOut |= lsfDisallowIncomingNFTokenOffer;
529 }
530 else if (uClearFlag == asfDisallowIncomingNFTokenOffer)
531 {
532 uFlagsOut &= ~lsfDisallowIncomingNFTokenOffer;
533 }
534
535 if (uSetFlag == asfDisallowIncomingCheck)
536 {
537 uFlagsOut |= lsfDisallowIncomingCheck;
538 }
539 else if (uClearFlag == asfDisallowIncomingCheck)
540 {
541 uFlagsOut &= ~lsfDisallowIncomingCheck;
542 }
543
544 if (uSetFlag == asfDisallowIncomingPayChan)
545 {
546 uFlagsOut |= lsfDisallowIncomingPayChan;
547 }
548 else if (uClearFlag == asfDisallowIncomingPayChan)
549 {
550 uFlagsOut &= ~lsfDisallowIncomingPayChan;
551 }
552
553 if (uSetFlag == asfDisallowIncomingTrustline)
554 {
555 uFlagsOut |= lsfDisallowIncomingTrustline;
556 }
557 else if (uClearFlag == asfDisallowIncomingTrustline)
558 {
559 uFlagsOut &= ~lsfDisallowIncomingTrustline;
560 }
561
562 // Set or clear flags for disallowing escrow
563 if (ctx_.view().rules().enabled(featureTokenEscrow))
564 {
565 if (uSetFlag == asfAllowTrustLineLocking)
566 {
567 uFlagsOut |= lsfAllowTrustLineLocking;
568 }
569 else if (uClearFlag == asfAllowTrustLineLocking)
570 {
571 uFlagsOut &= ~lsfAllowTrustLineLocking;
572 }
573 }
574
575 // Set flag for clawback
576 if (uSetFlag == asfAllowTrustLineClawback)
577 {
578 JLOG(j_.trace()) << "set allow clawback";
579 uFlagsOut |= lsfAllowTrustLineClawback;
580 }
581
582 if (uFlagsIn != uFlagsOut)
583 sle->setFieldU32(sfFlags, uFlagsOut);
584
585 ctx_.view().update(sle);
586
587 return tesSUCCESS;
588}
589
590void
592{
593 // No transaction-specific invariants yet (future work).
594}
595
596bool
598{
599 // No transaction-specific invariants yet (future work).
600 return true;
601}
602
603} // namespace xrpl
A generic endpoint for log messages.
Definition Journal.h:38
Stream trace() const
Severity stream access functions.
Definition Journal.h:291
bool finalizeInvariants(STTx const &tx, TER result, XRPAmount fee, ReadView const &view, beast::Journal const &j) override
Check transaction-specific post-conditions after all entries have been visited.
static NotTEC preflight(PreflightContext const &ctx)
static std::uint32_t getFlagsMask(PreflightContext const &ctx)
void visitInvariantEntry(bool isDelete, SLE::const_ref before, SLE::const_ref after) override
Inspect a single ledger entry modified by this transaction.
static TER preclaim(PreclaimContext const &ctx)
static TxConsequences makeTxConsequences(PreflightContext const &ctx)
virtual SLE::pointer peek(Keylet const &k)=0
Prepare to modify the SLE associated with key.
A public key.
Definition PublicKey.h:42
static int const kMaxTickSize
Definition Quality.h:98
static int const kMinTickSize
Definition Quality.h:97
A view into a ledger.
Definition ReadView.h:31
virtual SLE::const_pointer read(Keylet const &k) const =0
Return the state item associated with a key.
std::shared_ptr< STLedgerEntry const > const & const_ref
Blob getFieldVL(SField const &field) const
Definition STObject.cpp:639
uint128 getFieldH128(SField const &field) const
Definition STObject.cpp:603
std::uint32_t getFieldU32(SField const &field) const
Definition STObject.cpp:591
bool isFlag(std::uint32_t) const
Definition STObject.cpp:501
bool isFieldPresent(SField const &field) const
Definition STObject.cpp:454
uint256 getFieldH256(SField const &field) const
Definition STObject.cpp:621
Blob getSigningPubKey() const
Definition STTx.h:194
beast::Journal const j_
Definition Transactor.h:118
ApplyView & view()
Definition Transactor.h:136
AccountID const accountID_
Definition Transactor.h:120
ApplyContext & ctx_
Definition Transactor.h:116
Class describing the consequences to the account of applying a transaction if the transaction consume...
Definition applySteps.h:38
@ Normal
Moves currency around, creates offers, etc.
Definition applySteps.h:44
@ Blocker
Affects the ability of subsequent transactions to claim a fee.
Definition applySteps.h:47
T empty(T... args)
Keylet signerList(AccountID const &account) noexcept
A SignerList.
Definition Indexes.cpp:316
Keylet ownerDir(AccountID const &id) noexcept
The root page of an account's directory.
Definition Indexes.cpp:357
Keylet account(AccountID const &id) noexcept
AccountID root.
Definition Indexes.cpp:186
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:5
@ telBAD_DOMAIN
Definition TER.h:37
@ telBAD_PUBLIC_KEY
Definition TER.h:39
@ terOWNERS
Definition TER.h:212
@ terNO_ACCOUNT
Definition TER.h:209
bool dirIsEmpty(ReadView const &view, Keylet const &k)
Returns true if the directory is empty.
@ tefINTERNAL
Definition TER.h:163
BaseUInt< 128 > uint128
Definition base_uint.h:560
std::optional< KeyType > publicKeyType(Slice const &slice)
Returns the type of public key.
TERSubset< CanCvtToNotTEC > NotTEC
Definition TER.h:594
AccountID calcAccountID(PublicKey const &pk)
@ TapRetry
Definition ApplyView.h:21
@ temINVALID_FLAG
Definition TER.h:97
@ temMALFORMED
Definition TER.h:73
@ temBAD_TRANSFER_RATE
Definition TER.h:93
@ temBAD_TICK_SIZE
Definition TER.h:104
TERSubset< CanCvtToTER > TER
Definition TER.h:634
@ tecNEED_MASTER_KEY
Definition TER.h:306
@ tecNO_ALTERNATIVE_KEY
Definition TER.h:294
@ tecOWNERS
Definition TER.h:296
@ tecNO_PERMISSION
Definition TER.h:303
std::vector< unsigned char > Blob
Storage for linear binary data.
Definition Blob.h:10
BaseUInt< 256 > uint256
Definition base_uint.h:562
@ tesSUCCESS
Definition TER.h:240
constexpr std::size_t kMaxDomainLength
The maximum length of a domain.
Definition Protocol.h:219
std::enable_if_t< std::is_same_v< T, char >||std::is_same_v< T, unsigned char >, Slice > makeSlice(std::array< T, N > const &a)
Definition Slice.h:215
State information when determining if a tx is likely to claim a fee.
Definition Transactor.h:61
ReadView const & view
Definition Transactor.h:64
beast::Journal const j
Definition Transactor.h:69
State information when preflighting a tx.
Definition Transactor.h:18
beast::Journal const j
Definition Transactor.h:25