57 if ((uSetFlag != 0) && (uSetFlag == uClearFlag))
59 JLOG(j.trace()) <<
"Malformed transaction: Set and clear same flag.";
66 bool const bSetRequireAuth = ((uTxFlags & tfRequireAuth) != 0u) || (uSetFlag == asfRequireAuth);
67 bool const bClearRequireAuth =
68 ((uTxFlags & tfOptionalAuth) != 0u) || (uClearFlag == asfRequireAuth);
70 if (bSetRequireAuth && bClearRequireAuth)
72 JLOG(j.trace()) <<
"Malformed transaction: Contradictory flags set.";
79 bool const bSetRequireDest =
80 ((uTxFlags & tfRequireDestTag) != 0u) || (uSetFlag == asfRequireDest);
81 bool const bClearRequireDest =
82 ((uTxFlags & tfOptionalDestTag) != 0u) || (uClearFlag == asfRequireDest);
84 if (bSetRequireDest && bClearRequireDest)
86 JLOG(j.trace()) <<
"Malformed transaction: Contradictory flags set.";
93 bool const bSetDisallowXRP = ((uTxFlags & tfDisallowXRP) != 0u) || (uSetFlag == asfDisallowXRP);
94 bool const bClearDisallowXRP =
95 ((uTxFlags & tfAllowXRP) != 0u) || (uClearFlag == asfDisallowXRP);
97 if (bSetDisallowXRP && bClearDisallowXRP)
99 JLOG(j.trace()) <<
"Malformed transaction: Contradictory flags set.";
104 if (tx.isFieldPresent(sfTransferRate))
108 if ((uRate != 0u) && (uRate < QUALITY_ONE))
110 JLOG(j.trace()) <<
"Malformed transaction: Transfer rate too small.";
114 if (uRate > 2 * QUALITY_ONE)
116 JLOG(j.trace()) <<
"Malformed transaction: Transfer rate too large.";
122 if (tx.isFieldPresent(sfTickSize))
124 auto uTickSize = tx[sfTickSize];
125 if ((uTickSize != 0u) &&
126 ((uTickSize < Quality::minTickSize) || (uTickSize > Quality::maxTickSize)))
128 JLOG(j.trace()) <<
"Malformed transaction: Bad tick size.";
133 if (
auto const mk = tx[~sfMessageKey])
135 if (!mk->empty() && !
publicKeyType({mk->data(), mk->size()}))
137 JLOG(j.trace()) <<
"Invalid message key specified.";
142 if (
auto const domain = tx[~sfDomain]; domain && domain->size() >
maxDomainLength)
144 JLOG(j.trace()) <<
"domain too long";
149 if (uSetFlag == asfAuthorizedNFTokenMinter && !tx.isFieldPresent(sfNFTokenMinter))
152 if (uClearFlag == asfAuthorizedNFTokenMinter && tx.isFieldPresent(sfNFTokenMinter))
286 bool const bSetRequireDest{
287 ((uTxFlags & tfRequireDestTag) != 0u) || (uSetFlag == asfRequireDest)};
288 bool const bClearRequireDest{
289 ((uTxFlags & tfOptionalDestTag) != 0u) || (uClearFlag == asfRequireDest)};
290 bool const bSetRequireAuth{((uTxFlags & tfRequireAuth) != 0u) || (uSetFlag == asfRequireAuth)};
291 bool const bClearRequireAuth{
292 ((uTxFlags & tfOptionalAuth) != 0u) || (uClearFlag == asfRequireAuth)};
293 bool const bSetDisallowXRP{((uTxFlags & tfDisallowXRP) != 0u) || (uSetFlag == asfDisallowXRP)};
294 bool const bClearDisallowXRP{((uTxFlags & tfAllowXRP) != 0u) || (uClearFlag == asfDisallowXRP)};
296 bool const sigWithMaster{[&tx, &acct =
account_]() {
297 auto const spk = tx.getSigningPubKey();
312 if (bSetRequireAuth && ((uFlagsIn & lsfRequireAuth) == 0u))
314 JLOG(
j_.
trace()) <<
"Set RequireAuth.";
315 uFlagsOut |= lsfRequireAuth;
318 if (bClearRequireAuth && ((uFlagsIn & lsfRequireAuth) != 0u))
320 JLOG(
j_.
trace()) <<
"Clear RequireAuth.";
321 uFlagsOut &= ~lsfRequireAuth;
327 if (bSetRequireDest && ((uFlagsIn & lsfRequireDestTag) == 0u))
329 JLOG(
j_.
trace()) <<
"Set lsfRequireDestTag.";
330 uFlagsOut |= lsfRequireDestTag;
333 if (bClearRequireDest && ((uFlagsIn & lsfRequireDestTag) != 0u))
335 JLOG(
j_.
trace()) <<
"Clear lsfRequireDestTag.";
336 uFlagsOut &= ~lsfRequireDestTag;
342 if (bSetDisallowXRP && ((uFlagsIn & lsfDisallowXRP) == 0u))
344 JLOG(
j_.
trace()) <<
"Set lsfDisallowXRP.";
345 uFlagsOut |= lsfDisallowXRP;
348 if (bClearDisallowXRP && ((uFlagsIn & lsfDisallowXRP) != 0u))
350 JLOG(
j_.
trace()) <<
"Clear lsfDisallowXRP.";
351 uFlagsOut &= ~lsfDisallowXRP;
357 if ((uSetFlag == asfDisableMaster) && ((uFlagsIn & lsfDisableMaster) == 0u))
361 JLOG(
j_.
trace()) <<
"Must use master key to disable master key.";
371 JLOG(
j_.
trace()) <<
"Set lsfDisableMaster.";
372 uFlagsOut |= lsfDisableMaster;
375 if ((uClearFlag == asfDisableMaster) && ((uFlagsIn & lsfDisableMaster) != 0u))
377 JLOG(
j_.
trace()) <<
"Clear lsfDisableMaster.";
378 uFlagsOut &= ~lsfDisableMaster;
384 if (uSetFlag == asfDefaultRipple)
386 JLOG(
j_.
trace()) <<
"Set lsfDefaultRipple.";
387 uFlagsOut |= lsfDefaultRipple;
389 else if (uClearFlag == asfDefaultRipple)
391 JLOG(
j_.
trace()) <<
"Clear lsfDefaultRipple.";
392 uFlagsOut &= ~lsfDefaultRipple;
398 if (uSetFlag == asfNoFreeze)
400 if (!sigWithMaster && ((uFlagsIn & lsfDisableMaster) == 0u))
402 JLOG(
j_.
trace()) <<
"Must use master key to set NoFreeze.";
406 JLOG(
j_.
trace()) <<
"Set NoFreeze flag";
407 uFlagsOut |= lsfNoFreeze;
411 if (uSetFlag == asfGlobalFreeze)
413 JLOG(
j_.
trace()) <<
"Set GlobalFreeze flag";
414 uFlagsOut |= lsfGlobalFreeze;
420 if ((uSetFlag != asfGlobalFreeze) && (uClearFlag == asfGlobalFreeze) &&
421 ((uFlagsOut & lsfNoFreeze) == 0))
423 JLOG(
j_.
trace()) <<
"Clear GlobalFreeze flag";
424 uFlagsOut &= ~lsfGlobalFreeze;
430 if ((uSetFlag == asfAccountTxnID) && !sle->isFieldPresent(sfAccountTxnID))
432 JLOG(
j_.
trace()) <<
"Set AccountTxnID.";
433 sle->makeFieldPresent(sfAccountTxnID);
436 if ((uClearFlag == asfAccountTxnID) && sle->isFieldPresent(sfAccountTxnID))
438 JLOG(
j_.
trace()) <<
"Clear AccountTxnID.";
439 sle->makeFieldAbsent(sfAccountTxnID);
445 if (uSetFlag == asfDepositAuth)
447 JLOG(
j_.
trace()) <<
"Set lsfDepositAuth.";
448 uFlagsOut |= lsfDepositAuth;
450 else if (uClearFlag == asfDepositAuth)
452 JLOG(
j_.
trace()) <<
"Clear lsfDepositAuth.";
453 uFlagsOut &= ~lsfDepositAuth;
459 if (tx.isFieldPresent(sfEmailHash))
461 uint128 const uHash = tx.getFieldH128(sfEmailHash);
465 JLOG(
j_.
trace()) <<
"unset email hash";
466 sle->makeFieldAbsent(sfEmailHash);
470 JLOG(
j_.
trace()) <<
"set email hash";
471 sle->setFieldH128(sfEmailHash, uHash);
478 if (tx.isFieldPresent(sfWalletLocator))
480 uint256 const uHash = tx.getFieldH256(sfWalletLocator);
484 JLOG(
j_.
trace()) <<
"unset wallet locator";
485 sle->makeFieldAbsent(sfWalletLocator);
489 JLOG(
j_.
trace()) <<
"set wallet locator";
490 sle->setFieldH256(sfWalletLocator, uHash);
497 if (tx.isFieldPresent(sfMessageKey))
499 Blob const messageKey = tx.getFieldVL(sfMessageKey);
501 if (messageKey.
empty())
503 JLOG(
j_.
debug()) <<
"clear message key";
504 sle->makeFieldAbsent(sfMessageKey);
508 JLOG(
j_.
debug()) <<
"set message key";
509 sle->setFieldVL(sfMessageKey, messageKey);
516 if (tx.isFieldPresent(sfDomain))
518 Blob const domain = tx.getFieldVL(sfDomain);
522 JLOG(
j_.
trace()) <<
"unset domain";
523 sle->makeFieldAbsent(sfDomain);
527 JLOG(
j_.
trace()) <<
"set domain";
528 sle->setFieldVL(sfDomain, domain);
535 if (tx.isFieldPresent(sfTransferRate))
539 if (uRate == 0 || uRate == QUALITY_ONE)
541 JLOG(
j_.
trace()) <<
"unset transfer rate";
542 sle->makeFieldAbsent(sfTransferRate);
546 JLOG(
j_.
trace()) <<
"set transfer rate";
547 sle->setFieldU32(sfTransferRate, uRate);
554 if (tx.isFieldPresent(sfTickSize))
556 auto uTickSize = tx[sfTickSize];
557 if ((uTickSize == 0) || (uTickSize == Quality::maxTickSize))
559 JLOG(
j_.
trace()) <<
"unset tick size";
560 sle->makeFieldAbsent(sfTickSize);
564 JLOG(
j_.
trace()) <<
"set tick size";
565 sle->setFieldU8(sfTickSize, uTickSize);
570 if (uSetFlag == asfAuthorizedNFTokenMinter)
571 sle->setAccountID(sfNFTokenMinter,
ctx_.
tx[sfNFTokenMinter]);
573 if (uClearFlag == asfAuthorizedNFTokenMinter && sle->isFieldPresent(sfNFTokenMinter))
574 sle->makeFieldAbsent(sfNFTokenMinter);
576 if (uSetFlag == asfDisallowIncomingNFTokenOffer)
578 uFlagsOut |= lsfDisallowIncomingNFTokenOffer;
580 else if (uClearFlag == asfDisallowIncomingNFTokenOffer)
582 uFlagsOut &= ~lsfDisallowIncomingNFTokenOffer;
585 if (uSetFlag == asfDisallowIncomingCheck)
587 uFlagsOut |= lsfDisallowIncomingCheck;
589 else if (uClearFlag == asfDisallowIncomingCheck)
591 uFlagsOut &= ~lsfDisallowIncomingCheck;
594 if (uSetFlag == asfDisallowIncomingPayChan)
596 uFlagsOut |= lsfDisallowIncomingPayChan;
598 else if (uClearFlag == asfDisallowIncomingPayChan)
600 uFlagsOut &= ~lsfDisallowIncomingPayChan;
603 if (uSetFlag == asfDisallowIncomingTrustline)
605 uFlagsOut |= lsfDisallowIncomingTrustline;
607 else if (uClearFlag == asfDisallowIncomingTrustline)
609 uFlagsOut &= ~lsfDisallowIncomingTrustline;
615 if (uSetFlag == asfAllowTrustLineLocking)
617 uFlagsOut |= lsfAllowTrustLineLocking;
619 else if (uClearFlag == asfAllowTrustLineLocking)
621 uFlagsOut &= ~lsfAllowTrustLineLocking;
628 JLOG(
j_.
trace()) <<
"set allow clawback";
629 uFlagsOut |= lsfAllowTrustLineClawback;
632 if (uFlagsIn != uFlagsOut)
633 sle->setFieldU32(sfFlags, uFlagsOut);