71 if ((uSetFlag != 0) && (uSetFlag == uClearFlag))
73 JLOG(j.trace()) <<
"Malformed transaction: Set and clear same flag.";
80 bool const bSetRequireAuth = tx.isFlag(tfRequireAuth) || (uSetFlag == asfRequireAuth);
81 bool const bClearRequireAuth = tx.isFlag(tfOptionalAuth) || (uClearFlag == asfRequireAuth);
83 if (bSetRequireAuth && bClearRequireAuth)
85 JLOG(j.trace()) <<
"Malformed transaction: Contradictory flags set.";
92 bool const bSetRequireDest = tx.isFlag(tfRequireDestTag) || (uSetFlag == asfRequireDest);
93 bool const bClearRequireDest = tx.isFlag(tfOptionalDestTag) || (uClearFlag == asfRequireDest);
95 if (bSetRequireDest && bClearRequireDest)
97 JLOG(j.trace()) <<
"Malformed transaction: Contradictory flags set.";
104 bool const bSetDisallowXRP = tx.isFlag(tfDisallowXRP) || (uSetFlag == asfDisallowXRP);
105 bool const bClearDisallowXRP = tx.isFlag(tfAllowXRP) || (uClearFlag == asfDisallowXRP);
107 if (bSetDisallowXRP && bClearDisallowXRP)
109 JLOG(j.trace()) <<
"Malformed transaction: Contradictory flags set.";
114 if (tx.isFieldPresent(sfTransferRate))
118 if ((uRate != 0u) && (uRate < QUALITY_ONE))
120 JLOG(j.trace()) <<
"Malformed transaction: Transfer rate too small.";
124 if (uRate > 2 * QUALITY_ONE)
126 JLOG(j.trace()) <<
"Malformed transaction: Transfer rate too large.";
132 if (tx.isFieldPresent(sfTickSize))
134 auto uTickSize = tx[sfTickSize];
135 if ((uTickSize != 0u) &&
138 JLOG(j.trace()) <<
"Malformed transaction: Bad tick size.";
143 if (
auto const mk = tx[~sfMessageKey])
145 if (!mk->empty() && !
publicKeyType({mk->data(), mk->size()}))
147 JLOG(j.trace()) <<
"Invalid message key specified.";
152 if (
auto const domain = tx[~sfDomain]; domain && domain->size() >
kMaxDomainLength)
154 JLOG(j.trace()) <<
"domain too long";
159 if (uSetFlag == asfAuthorizedNFTokenMinter && !tx.isFieldPresent(sfNFTokenMinter))
162 if (uClearFlag == asfAuthorizedNFTokenMinter && tx.isFieldPresent(sfNFTokenMinter))
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)};
246 bool const sigWithMaster{[&tx, &acct =
accountID_]() {
262 if (bSetRequireAuth && !sle->isFlag(lsfRequireAuth))
264 JLOG(
j_.trace()) <<
"Set RequireAuth.";
265 uFlagsOut |= lsfRequireAuth;
268 if (bClearRequireAuth && sle->isFlag(lsfRequireAuth))
270 JLOG(
j_.trace()) <<
"Clear RequireAuth.";
271 uFlagsOut &= ~lsfRequireAuth;
277 if (bSetRequireDest && !sle->isFlag(lsfRequireDestTag))
279 JLOG(
j_.trace()) <<
"Set lsfRequireDestTag.";
280 uFlagsOut |= lsfRequireDestTag;
283 if (bClearRequireDest && sle->isFlag(lsfRequireDestTag))
285 JLOG(
j_.trace()) <<
"Clear lsfRequireDestTag.";
286 uFlagsOut &= ~lsfRequireDestTag;
292 if (bSetDisallowXRP && !sle->isFlag(lsfDisallowXRP))
294 JLOG(
j_.trace()) <<
"Set lsfDisallowXRP.";
295 uFlagsOut |= lsfDisallowXRP;
298 if (bClearDisallowXRP && sle->isFlag(lsfDisallowXRP))
300 JLOG(
j_.trace()) <<
"Clear lsfDisallowXRP.";
301 uFlagsOut &= ~lsfDisallowXRP;
307 if ((uSetFlag == asfDisableMaster) && !sle->isFlag(lsfDisableMaster))
311 JLOG(
j_.trace()) <<
"Must use master key to disable master key.";
321 JLOG(
j_.trace()) <<
"Set lsfDisableMaster.";
322 uFlagsOut |= lsfDisableMaster;
325 if ((uClearFlag == asfDisableMaster) && sle->isFlag(lsfDisableMaster))
327 JLOG(
j_.trace()) <<
"Clear lsfDisableMaster.";
328 uFlagsOut &= ~lsfDisableMaster;
334 if (uSetFlag == asfDefaultRipple)
336 JLOG(
j_.trace()) <<
"Set lsfDefaultRipple.";
337 uFlagsOut |= lsfDefaultRipple;
339 else if (uClearFlag == asfDefaultRipple)
341 JLOG(
j_.trace()) <<
"Clear lsfDefaultRipple.";
342 uFlagsOut &= ~lsfDefaultRipple;
348 if (uSetFlag == asfNoFreeze)
350 if (!sigWithMaster && !sle->isFlag(lsfDisableMaster))
352 JLOG(
j_.trace()) <<
"Must use master key to set NoFreeze.";
356 JLOG(
j_.trace()) <<
"Set NoFreeze flag";
357 uFlagsOut |= lsfNoFreeze;
361 if (uSetFlag == asfGlobalFreeze)
363 JLOG(
j_.trace()) <<
"Set GlobalFreeze flag";
364 uFlagsOut |= lsfGlobalFreeze;
370 if ((uSetFlag != asfGlobalFreeze) && (uClearFlag == asfGlobalFreeze) &&
371 ((uFlagsOut & lsfNoFreeze) == 0))
373 JLOG(
j_.trace()) <<
"Clear GlobalFreeze flag";
374 uFlagsOut &= ~lsfGlobalFreeze;
380 if ((uSetFlag == asfAccountTxnID) && !sle->isFieldPresent(sfAccountTxnID))
382 JLOG(
j_.trace()) <<
"Set AccountTxnID.";
383 sle->makeFieldPresent(sfAccountTxnID);
386 if ((uClearFlag == asfAccountTxnID) && sle->isFieldPresent(sfAccountTxnID))
388 JLOG(
j_.trace()) <<
"Clear AccountTxnID.";
389 sle->makeFieldAbsent(sfAccountTxnID);
395 if (uSetFlag == asfDepositAuth)
397 JLOG(
j_.trace()) <<
"Set lsfDepositAuth.";
398 uFlagsOut |= lsfDepositAuth;
400 else if (uClearFlag == asfDepositAuth)
402 JLOG(
j_.trace()) <<
"Clear lsfDepositAuth.";
403 uFlagsOut &= ~lsfDepositAuth;
415 JLOG(
j_.trace()) <<
"unset email hash";
416 sle->makeFieldAbsent(sfEmailHash);
420 JLOG(
j_.trace()) <<
"set email hash";
421 sle->setFieldH128(sfEmailHash, uHash);
434 JLOG(
j_.trace()) <<
"unset wallet locator";
435 sle->makeFieldAbsent(sfWalletLocator);
439 JLOG(
j_.trace()) <<
"set wallet locator";
440 sle->setFieldH256(sfWalletLocator, uHash);
451 if (messageKey.
empty())
453 JLOG(
j_.debug()) <<
"clear message key";
454 sle->makeFieldAbsent(sfMessageKey);
458 JLOG(
j_.debug()) <<
"set message key";
459 sle->setFieldVL(sfMessageKey, messageKey);
472 JLOG(
j_.trace()) <<
"unset domain";
473 sle->makeFieldAbsent(sfDomain);
477 JLOG(
j_.trace()) <<
"set domain";
478 sle->setFieldVL(sfDomain, domain);
489 if (uRate == 0 || uRate == QUALITY_ONE)
491 JLOG(
j_.trace()) <<
"unset transfer rate";
492 sle->makeFieldAbsent(sfTransferRate);
496 JLOG(
j_.trace()) <<
"set transfer rate";
497 sle->setFieldU32(sfTransferRate, uRate);
506 auto uTickSize = tx[sfTickSize];
509 JLOG(
j_.trace()) <<
"unset tick size";
510 sle->makeFieldAbsent(sfTickSize);
514 JLOG(
j_.trace()) <<
"set tick size";
515 sle->setFieldU8(sfTickSize, uTickSize);
520 if (uSetFlag == asfAuthorizedNFTokenMinter)
521 sle->setAccountID(sfNFTokenMinter,
ctx_.tx[sfNFTokenMinter]);
523 if (uClearFlag == asfAuthorizedNFTokenMinter && sle->isFieldPresent(sfNFTokenMinter))
524 sle->makeFieldAbsent(sfNFTokenMinter);
526 if (uSetFlag == asfDisallowIncomingNFTokenOffer)
528 uFlagsOut |= lsfDisallowIncomingNFTokenOffer;
530 else if (uClearFlag == asfDisallowIncomingNFTokenOffer)
532 uFlagsOut &= ~lsfDisallowIncomingNFTokenOffer;
535 if (uSetFlag == asfDisallowIncomingCheck)
537 uFlagsOut |= lsfDisallowIncomingCheck;
539 else if (uClearFlag == asfDisallowIncomingCheck)
541 uFlagsOut &= ~lsfDisallowIncomingCheck;
544 if (uSetFlag == asfDisallowIncomingPayChan)
546 uFlagsOut |= lsfDisallowIncomingPayChan;
548 else if (uClearFlag == asfDisallowIncomingPayChan)
550 uFlagsOut &= ~lsfDisallowIncomingPayChan;
553 if (uSetFlag == asfDisallowIncomingTrustline)
555 uFlagsOut |= lsfDisallowIncomingTrustline;
557 else if (uClearFlag == asfDisallowIncomingTrustline)
559 uFlagsOut &= ~lsfDisallowIncomingTrustline;
563 if (
ctx_.view().rules().enabled(featureTokenEscrow))
565 if (uSetFlag == asfAllowTrustLineLocking)
567 uFlagsOut |= lsfAllowTrustLineLocking;
569 else if (uClearFlag == asfAllowTrustLineLocking)
571 uFlagsOut &= ~lsfAllowTrustLineLocking;
576 if (uSetFlag == asfAllowTrustLineClawback)
578 JLOG(
j_.trace()) <<
"set allow clawback";
579 uFlagsOut |= lsfAllowTrustLineClawback;
582 if (uFlagsIn != uFlagsOut)
583 sle->setFieldU32(sfFlags, uFlagsOut);
585 ctx_.view().update(sle);
State information when determining if a tx is likely to claim a fee.