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();
200 if (
id == uDstAccountID)
205 if (
id == uDstAccountID)
210 auto const sleDelete =
216 <<
"Malformed transaction: Can not extend credit to self.";
259 if (sleDst->isFieldPresent(sfAMMID))
267 ctx.
view.
read({ltAMM, sleDst->getFieldH256(sfAMMID)}))
269 if (
auto const lpTokens =
270 ammSle->getFieldAmount(sfLPTokenBalance);
271 lpTokens == beast::zero)
273 else if (lpTokens.getCurrency() != saLimitAmount.getCurrency())
279 else if (sleDst->isFieldPresent(sfVaultID))
296 if (bNoFreeze && (bSetFreeze || bSetDeepFreeze))
304 if ((bSetFreeze || bSetDeepFreeze) &&
305 (bClearFreeze || bClearDeepFreeze))
312 bool const bHigh =
id > uDstAccountID;
314 auto const sleRippleState =
317 sleRippleState ? sleRippleState->getFieldU32(sfFlags) : 0u;
319 uFlags = computeFreezeFlags(
329 auto const deepFrozen =
335 if (deepFrozen && !frozen)
357 bool const bHigh =
account_ > uDstAccountID;
363 std::uint32_t const uOwnerCount = sle->getFieldU32(sfOwnerCount);
384 (uOwnerCount < 2) ?
XRPAmount(beast::zero)
391 if (bQualityOut && QUALITY_ONE == uQualityOut)
396 bool const bSetAuth = (uTxFlags &
tfSetfAuth);
426 <<
"Delay transaction: Destination account does not exist.";
430 STAmount saLimitAllow = saLimitAmount;
446 auto const& uLowAccountID = !bHigh ?
account_ : uDstAccountID;
447 auto const& uHighAccountID = bHigh ?
account_ : uDstAccountID;
448 SLE::ref sleLowAccount = !bHigh ? sle : sleDst;
449 SLE::ref sleHighAccount = bHigh ? sle : sleDst;
455 saLowBalance = sleRippleState->getFieldAmount(sfBalance);
456 saHighBalance = -saLowBalance;
462 sleRippleState->setFieldAmount(
463 !bHigh ? sfLowLimit : sfHighLimit, saLimitAllow);
466 !bHigh ? saLimitAllow : sleRippleState->getFieldAmount(sfLowLimit);
468 bHigh ? saLimitAllow : sleRippleState->getFieldAmount(sfHighLimit);
478 uLowQualityIn = sleRippleState->getFieldU32(sfLowQualityIn);
479 uHighQualityIn = sleRippleState->getFieldU32(sfHighQualityIn);
485 sleRippleState->setFieldU32(
486 !bHigh ? sfLowQualityIn : sfHighQualityIn, uQualityIn);
488 uLowQualityIn = !bHigh
490 : sleRippleState->getFieldU32(sfLowQualityIn);
491 uHighQualityIn = bHigh
493 : sleRippleState->getFieldU32(sfHighQualityIn);
499 sleRippleState->makeFieldAbsent(
500 !bHigh ? sfLowQualityIn : sfHighQualityIn);
503 !bHigh ? 0 : sleRippleState->getFieldU32(sfLowQualityIn);
505 bHigh ? 0 : sleRippleState->getFieldU32(sfHighQualityIn);
508 if (QUALITY_ONE == uLowQualityIn)
511 if (QUALITY_ONE == uHighQualityIn)
522 uLowQualityOut = sleRippleState->getFieldU32(sfLowQualityOut);
523 uHighQualityOut = sleRippleState->getFieldU32(sfHighQualityOut);
525 else if (uQualityOut)
529 sleRippleState->setFieldU32(
530 !bHigh ? sfLowQualityOut : sfHighQualityOut, uQualityOut);
532 uLowQualityOut = !bHigh
534 : sleRippleState->getFieldU32(sfLowQualityOut);
535 uHighQualityOut = bHigh
537 : sleRippleState->getFieldU32(sfHighQualityOut);
543 sleRippleState->makeFieldAbsent(
544 !bHigh ? sfLowQualityOut : sfHighQualityOut);
547 !bHigh ? 0 : sleRippleState->getFieldU32(sfLowQualityOut);
549 bHigh ? 0 : sleRippleState->getFieldU32(sfHighQualityOut);
552 std::uint32_t const uFlagsIn(sleRippleState->getFieldU32(sfFlags));
555 if (bSetNoRipple && !bClearNoRipple)
557 if ((bHigh ? saHighBalance : saLowBalance) >= beast::zero)
564 else if (bClearNoRipple && !bSetNoRipple)
571 uFlagsOut = computeFreezeFlags(
580 if (QUALITY_ONE == uLowQualityOut)
583 if (QUALITY_ONE == uHighQualityOut)
587 bool const bHighDefRipple =
590 bool const bLowReserveSet = uLowQualityIn || uLowQualityOut ||
593 saLowBalance > beast::zero;
594 bool const bLowReserveClear = !bLowReserveSet;
596 bool const bHighReserveSet = uHighQualityIn || uHighQualityOut ||
599 saHighBalance > beast::zero;
600 bool const bHighReserveClear = !bHighReserveSet;
602 bool const bDefault = bLowReserveClear && bHighReserveClear;
607 bool bReserveIncrease =
false;
614 if (bLowReserveSet && !bLowReserved)
621 bReserveIncrease =
true;
624 if (bLowReserveClear && bLowReserved)
628 uFlagsOut &= ~lsfLowReserve;
631 if (bHighReserveSet && !bHighReserved)
638 bReserveIncrease =
true;
641 if (bHighReserveClear && bHighReserved)
645 uFlagsOut &= ~lsfHighReserve;
648 if (uFlagsIn != uFlagsOut)
649 sleRippleState->setFieldU32(sfFlags, uFlagsOut);
656 view(), sleRippleState, uLowAccountID, uHighAccountID, viewJ);
661 JLOG(
j_.
trace()) <<
"Delay transaction: Insufficent reserve to "
672 JLOG(
j_.
trace()) <<
"Modify ripple line";
678 (!bQualityIn || !uQualityIn) &&
680 (!bQualityOut || !uQualityOut) &&
685 <<
"Redundant: Setting non-existent ripple line to defaults.";
691 JLOG(
j_.
trace()) <<
"Delay transaction: Line does not exist. "
692 "Insufficent reserve to create line.";
705 JLOG(
j_.
trace()) <<
"doTrustSet: Creating ripple line: "
717 bSetNoRipple && !bClearNoRipple,
718 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.