177 auto const id = ctx.
tx[sfAccount];
185 bool const bSetAuth = (uTxFlags &
tfSetfAuth);
189 JLOG(ctx.
j.
trace()) <<
"Retry: Auth not required.";
193 auto const saLimitAmount = ctx.
tx[sfLimitAmount];
195 auto const currency = saLimitAmount.getCurrency();
196 auto const uDstAccountID = saLimitAmount.getIssuer();
198 if (
id == uDstAccountID)
238 if (sleDst->isFieldPresent(sfAMMID))
246 ctx.
view.
read({ltAMM, sleDst->getFieldH256(sfAMMID)}))
248 if (
auto const lpTokens =
249 ammSle->getFieldAmount(sfLPTokenBalance);
250 lpTokens == beast::zero)
252 else if (lpTokens.getCurrency() != saLimitAmount.getCurrency())
258 else if (sleDst->isFieldPresent(sfVaultID))
275 if (bNoFreeze && (bSetFreeze || bSetDeepFreeze))
283 if ((bSetFreeze || bSetDeepFreeze) &&
284 (bClearFreeze || bClearDeepFreeze))
291 bool const bHigh =
id > uDstAccountID;
293 auto const sleRippleState =
296 sleRippleState ? sleRippleState->getFieldU32(sfFlags) : 0u;
298 uFlags = computeFreezeFlags(
308 auto const deepFrozen =
314 if (deepFrozen && !frozen)
336 bool const bHigh =
account_ > uDstAccountID;
342 std::uint32_t const uOwnerCount = sle->getFieldU32(sfOwnerCount);
363 (uOwnerCount < 2) ?
XRPAmount(beast::zero)
370 if (bQualityOut && QUALITY_ONE == uQualityOut)
375 bool const bSetAuth = (uTxFlags &
tfSetfAuth);
390 <<
"Delay transaction: Destination account does not exist.";
394 STAmount saLimitAllow = saLimitAmount;
410 auto const& uLowAccountID = !bHigh ?
account_ : uDstAccountID;
411 auto const& uHighAccountID = bHigh ?
account_ : uDstAccountID;
412 SLE::ref sleLowAccount = !bHigh ? sle : sleDst;
413 SLE::ref sleHighAccount = bHigh ? sle : sleDst;
419 saLowBalance = sleRippleState->getFieldAmount(sfBalance);
420 saHighBalance = -saLowBalance;
426 sleRippleState->setFieldAmount(
427 !bHigh ? sfLowLimit : sfHighLimit, saLimitAllow);
430 !bHigh ? saLimitAllow : sleRippleState->getFieldAmount(sfLowLimit);
432 bHigh ? saLimitAllow : sleRippleState->getFieldAmount(sfHighLimit);
442 uLowQualityIn = sleRippleState->getFieldU32(sfLowQualityIn);
443 uHighQualityIn = sleRippleState->getFieldU32(sfHighQualityIn);
449 sleRippleState->setFieldU32(
450 !bHigh ? sfLowQualityIn : sfHighQualityIn, uQualityIn);
452 uLowQualityIn = !bHigh
454 : sleRippleState->getFieldU32(sfLowQualityIn);
455 uHighQualityIn = bHigh
457 : sleRippleState->getFieldU32(sfHighQualityIn);
463 sleRippleState->makeFieldAbsent(
464 !bHigh ? sfLowQualityIn : sfHighQualityIn);
467 !bHigh ? 0 : sleRippleState->getFieldU32(sfLowQualityIn);
469 bHigh ? 0 : sleRippleState->getFieldU32(sfHighQualityIn);
472 if (QUALITY_ONE == uLowQualityIn)
475 if (QUALITY_ONE == uHighQualityIn)
486 uLowQualityOut = sleRippleState->getFieldU32(sfLowQualityOut);
487 uHighQualityOut = sleRippleState->getFieldU32(sfHighQualityOut);
489 else if (uQualityOut)
493 sleRippleState->setFieldU32(
494 !bHigh ? sfLowQualityOut : sfHighQualityOut, uQualityOut);
496 uLowQualityOut = !bHigh
498 : sleRippleState->getFieldU32(sfLowQualityOut);
499 uHighQualityOut = bHigh
501 : sleRippleState->getFieldU32(sfHighQualityOut);
507 sleRippleState->makeFieldAbsent(
508 !bHigh ? sfLowQualityOut : sfHighQualityOut);
511 !bHigh ? 0 : sleRippleState->getFieldU32(sfLowQualityOut);
513 bHigh ? 0 : sleRippleState->getFieldU32(sfHighQualityOut);
516 std::uint32_t const uFlagsIn(sleRippleState->getFieldU32(sfFlags));
519 if (bSetNoRipple && !bClearNoRipple)
521 if ((bHigh ? saHighBalance : saLowBalance) >= beast::zero)
528 else if (bClearNoRipple && !bSetNoRipple)
535 uFlagsOut = computeFreezeFlags(
544 if (QUALITY_ONE == uLowQualityOut)
547 if (QUALITY_ONE == uHighQualityOut)
551 bool const bHighDefRipple =
554 bool const bLowReserveSet = uLowQualityIn || uLowQualityOut ||
557 saLowBalance > beast::zero;
558 bool const bLowReserveClear = !bLowReserveSet;
560 bool const bHighReserveSet = uHighQualityIn || uHighQualityOut ||
563 saHighBalance > beast::zero;
564 bool const bHighReserveClear = !bHighReserveSet;
566 bool const bDefault = bLowReserveClear && bHighReserveClear;
571 bool bReserveIncrease =
false;
578 if (bLowReserveSet && !bLowReserved)
585 bReserveIncrease =
true;
588 if (bLowReserveClear && bLowReserved)
592 uFlagsOut &= ~lsfLowReserve;
595 if (bHighReserveSet && !bHighReserved)
602 bReserveIncrease =
true;
605 if (bHighReserveClear && bHighReserved)
609 uFlagsOut &= ~lsfHighReserve;
612 if (uFlagsIn != uFlagsOut)
613 sleRippleState->setFieldU32(sfFlags, uFlagsOut);
620 view(), sleRippleState, uLowAccountID, uHighAccountID, viewJ);
625 JLOG(
j_.
trace()) <<
"Delay transaction: Insufficent reserve to "
636 JLOG(
j_.
trace()) <<
"Modify ripple line";
642 (!bQualityIn || !uQualityIn) &&
644 (!bQualityOut || !uQualityOut) &&
649 <<
"Redundant: Setting non-existent ripple line to defaults.";
655 JLOG(
j_.
trace()) <<
"Delay transaction: Line does not exist. "
656 "Insufficent reserve to create line.";
669 JLOG(
j_.
trace()) <<
"doTrustSet: Creating ripple line: "
681 bSetNoRipple && !bClearNoRipple,
682 bSetFreeze && !bClearFreeze,
TER trustCreate(ApplyView &view, bool const bSrcHigh, AccountID const &uSrcAccountID, AccountID const &uDstAccountID, uint256 const &uIndex, SLE::ref sleAccount, bool const bAuth, bool const bNoRipple, bool const bFreeze, bool bDeepFreeze, STAmount const &saBalance, STAmount const &saLimit, std::uint32_t uSrcQualityIn, std::uint32_t uSrcQualityOut, beast::Journal j)
Create a trust line.
State information when determining if a tx is likely to claim a fee.