173 auto const id = ctx.
tx[sfAccount];
181 bool const bSetAuth = (uTxFlags & tfSetfAuth) != 0u;
183 if (bSetAuth && ((sle->getFieldU32(sfFlags) & lsfRequireAuth) == 0u))
185 JLOG(ctx.
j.
trace()) <<
"Retry: Auth not required.";
189 auto const saLimitAmount = ctx.
tx[sfLimitAmount];
191 auto const currency = saLimitAmount.getCurrency();
192 auto const uDstAccountID = saLimitAmount.getIssuer();
194 if (
id == uDstAccountID)
205 if ((sleDst->getFlags() & lsfDisallowIncomingTrustline) != 0u)
231 if (sleDst->isFieldPresent(sfAMMID))
237 else if (
auto const ammSle = ctx.
view.
read({ltAMM, sleDst->getFieldH256(sfAMMID)}))
239 auto const lpTokens = ammSle->getFieldAmount(sfLPTokenBalance);
240 if (lpTokens == beast::zero)
244 if (lpTokens.getCurrency() != saLimitAmount.getCurrency())
254 else if (sleDst->isFieldPresent(sfVaultID) || sleDst->isFieldPresent(sfLoanBrokerID))
269 bool const bNoFreeze = sle->isFlag(lsfNoFreeze);
270 bool const bSetFreeze = (uTxFlags & tfSetFreeze) != 0u;
271 bool const bSetDeepFreeze = (uTxFlags & tfSetDeepFreeze) != 0u;
273 if (bNoFreeze && (bSetFreeze || bSetDeepFreeze))
279 bool const bClearFreeze = (uTxFlags & tfClearFreeze) != 0u;
280 bool const bClearDeepFreeze = (uTxFlags & tfClearDeepFreeze) != 0u;
281 if ((bSetFreeze || bSetDeepFreeze) && (bClearFreeze || bClearDeepFreeze))
288 bool const bHigh =
id > uDstAccountID;
291 std::uint32_t uFlags = sleRippleState ? sleRippleState->getFieldU32(sfFlags) : 0u;
293 uFlags = computeFreezeFlags(
294 uFlags, bHigh, bNoFreeze, bSetFreeze, bClearFreeze, bSetDeepFreeze, bClearDeepFreeze);
296 auto const frozen = uFlags & (bHigh ? lsfHighFreeze : lsfLowFreeze);
297 auto const deepFrozen = uFlags & (bHigh ? lsfHighDeepFreeze : lsfLowDeepFreeze);
302 if ((deepFrozen != 0u) && (frozen == 0u))
324 bool const bHigh =
account_ > uDstAccountID;
330 std::uint32_t const uOwnerCount = sle->getFieldU32(sfOwnerCount);
356 if (bQualityOut && QUALITY_ONE == uQualityOut)
361 bool const bSetAuth = (uTxFlags & tfSetfAuth) != 0u;
362 bool const bSetNoRipple = (uTxFlags & tfSetNoRipple) != 0u;
363 bool const bClearNoRipple = (uTxFlags & tfClearNoRipple) != 0u;
364 bool const bSetFreeze = (uTxFlags & tfSetFreeze) != 0u;
365 bool const bClearFreeze = (uTxFlags & tfClearFreeze) != 0u;
366 bool const bSetDeepFreeze = (uTxFlags & tfSetDeepFreeze) != 0u;
367 bool const bClearDeepFreeze = (uTxFlags & tfClearDeepFreeze) != 0u;
375 JLOG(
j_.
trace()) <<
"Delay transaction: Destination account does not exist.";
379 STAmount saLimitAllow = saLimitAmount;
395 auto const& uLowAccountID = !bHigh ?
account_ : uDstAccountID;
396 auto const& uHighAccountID = bHigh ?
account_ : uDstAccountID;
397 SLE::ref sleLowAccount = !bHigh ? sle : sleDst;
398 SLE::ref sleHighAccount = bHigh ? sle : sleDst;
404 saLowBalance = sleRippleState->getFieldAmount(sfBalance);
405 saHighBalance = -saLowBalance;
411 sleRippleState->setFieldAmount(!bHigh ? sfLowLimit : sfHighLimit, saLimitAllow);
413 saLowLimit = !bHigh ? saLimitAllow : sleRippleState->getFieldAmount(sfLowLimit);
414 saHighLimit = bHigh ? saLimitAllow : sleRippleState->getFieldAmount(sfHighLimit);
424 uLowQualityIn = sleRippleState->getFieldU32(sfLowQualityIn);
425 uHighQualityIn = sleRippleState->getFieldU32(sfHighQualityIn);
427 else if (uQualityIn != 0u)
431 sleRippleState->setFieldU32(!bHigh ? sfLowQualityIn : sfHighQualityIn, uQualityIn);
433 uLowQualityIn = !bHigh ? uQualityIn : sleRippleState->getFieldU32(sfLowQualityIn);
434 uHighQualityIn = bHigh ? uQualityIn : sleRippleState->getFieldU32(sfHighQualityIn);
440 sleRippleState->makeFieldAbsent(!bHigh ? sfLowQualityIn : sfHighQualityIn);
442 uLowQualityIn = !bHigh ? 0 : sleRippleState->getFieldU32(sfLowQualityIn);
443 uHighQualityIn = bHigh ? 0 : sleRippleState->getFieldU32(sfHighQualityIn);
446 if (QUALITY_ONE == uLowQualityIn)
449 if (QUALITY_ONE == uHighQualityIn)
460 uLowQualityOut = sleRippleState->getFieldU32(sfLowQualityOut);
461 uHighQualityOut = sleRippleState->getFieldU32(sfHighQualityOut);
463 else if (uQualityOut != 0u)
467 sleRippleState->setFieldU32(!bHigh ? sfLowQualityOut : sfHighQualityOut, uQualityOut);
469 uLowQualityOut = !bHigh ? uQualityOut : sleRippleState->getFieldU32(sfLowQualityOut);
470 uHighQualityOut = bHigh ? uQualityOut : sleRippleState->getFieldU32(sfHighQualityOut);
476 sleRippleState->makeFieldAbsent(!bHigh ? sfLowQualityOut : sfHighQualityOut);
478 uLowQualityOut = !bHigh ? 0 : sleRippleState->getFieldU32(sfLowQualityOut);
479 uHighQualityOut = bHigh ? 0 : sleRippleState->getFieldU32(sfHighQualityOut);
482 std::uint32_t const uFlagsIn(sleRippleState->getFieldU32(sfFlags));
485 if (bSetNoRipple && !bClearNoRipple)
487 if ((bHigh ? saHighBalance : saLowBalance) >= beast::zero)
489 uFlagsOut |= (bHigh ? lsfHighNoRipple : lsfLowNoRipple);
497 else if (bClearNoRipple && !bSetNoRipple)
499 uFlagsOut &= ~(bHigh ? lsfHighNoRipple : lsfLowNoRipple);
503 bool const bNoFreeze = sle->isFlag(lsfNoFreeze);
504 uFlagsOut = computeFreezeFlags(
513 if (QUALITY_ONE == uLowQualityOut)
516 if (QUALITY_ONE == uHighQualityOut)
519 bool const bLowDefRipple = (sleLowAccount->getFlags() & lsfDefaultRipple) != 0u;
520 bool const bHighDefRipple = (sleHighAccount->getFlags() & lsfDefaultRipple) != 0u;
522 bool const bLowReserveSet = (uLowQualityIn != 0u) || (uLowQualityOut != 0u) ||
523 ((uFlagsOut & lsfLowNoRipple) == 0) != bLowDefRipple ||
524 ((uFlagsOut & lsfLowFreeze) != 0u) || saLowLimit || saLowBalance > beast::zero;
525 bool const bLowReserveClear = !bLowReserveSet;
527 bool const bHighReserveSet = (uHighQualityIn != 0u) || (uHighQualityOut != 0u) ||
528 ((uFlagsOut & lsfHighNoRipple) == 0) != bHighDefRipple ||
529 ((uFlagsOut & lsfHighFreeze) != 0u) || saHighLimit || saHighBalance > beast::zero;
530 bool const bHighReserveClear = !bHighReserveSet;
532 bool const bDefault = bLowReserveClear && bHighReserveClear;
534 bool const bLowReserved = (uFlagsIn & lsfLowReserve) != 0u;
535 bool const bHighReserved = (uFlagsIn & lsfHighReserve) != 0u;
537 bool bReserveIncrease =
false;
541 uFlagsOut |= (bHigh ? lsfHighAuth : lsfLowAuth);
544 if (bLowReserveSet && !bLowReserved)
548 uFlagsOut |= lsfLowReserve;
551 bReserveIncrease =
true;
554 if (bLowReserveClear && bLowReserved)
558 uFlagsOut &= ~lsfLowReserve;
561 if (bHighReserveSet && !bHighReserved)
565 uFlagsOut |= lsfHighReserve;
568 bReserveIncrease =
true;
571 if (bHighReserveClear && bHighReserved)
575 uFlagsOut &= ~lsfHighReserve;
578 if (uFlagsIn != uFlagsOut)
579 sleRippleState->setFieldU32(sfFlags, uFlagsOut);
585 terResult =
trustDelete(
view(), sleRippleState, uLowAccountID, uHighAccountID, viewJ);
590 JLOG(
j_.
trace()) <<
"Delay transaction: Insufficent reserve to "
601 JLOG(
j_.
trace()) <<
"Modify ripple line";
607 (!bQualityIn || (uQualityIn == 0u)) &&
609 (!bQualityOut || (uQualityOut == 0u)) &&
613 JLOG(
j_.
trace()) <<
"Redundant: Setting non-existent ripple line to defaults.";
619 JLOG(
j_.
trace()) <<
"Delay transaction: Line does not exist. "
620 "Insufficent reserve to create line.";
633 JLOG(
j_.
trace()) <<
"doTrustSet: Creating ripple line: " <<
to_string(k.key);
644 bSetNoRipple && !bClearNoRipple,
645 bSetFreeze && !bClearFreeze,
State information when determining if a tx is likely to claim a fee.