196 auto const id = ctx.
tx[sfAccount];
204 bool const bSetAuth = (uTxFlags &
tfSetfAuth);
208 JLOG(ctx.
j.
trace()) <<
"Retry: Auth not required.";
212 auto const saLimitAmount = ctx.
tx[sfLimitAmount];
214 auto const currency = saLimitAmount.getCurrency();
215 auto const uDstAccountID = saLimitAmount.getIssuer();
219 if (
id == uDstAccountID)
224 if (
id == uDstAccountID)
229 auto const sleDelete =
235 <<
"Malformed transaction: Can not extend credit to self.";
278 if (sleDst->isFieldPresent(sfAMMID))
286 ctx.
view.
read({ltAMM, sleDst->getFieldH256(sfAMMID)}))
288 if (
auto const lpTokens =
289 ammSle->getFieldAmount(sfLPTokenBalance);
290 lpTokens == beast::zero)
292 else if (lpTokens.getCurrency() != saLimitAmount.getCurrency())
298 else if (sleDst->isFieldPresent(sfVaultID))
315 if (bNoFreeze && (bSetFreeze || bSetDeepFreeze))
323 if ((bSetFreeze || bSetDeepFreeze) &&
324 (bClearFreeze || bClearDeepFreeze))
331 bool const bHigh =
id > uDstAccountID;
333 auto const sleRippleState =
336 sleRippleState ? sleRippleState->getFieldU32(sfFlags) : 0u;
338 uFlags = computeFreezeFlags(
348 auto const deepFrozen =
354 if (deepFrozen && !frozen)
376 bool const bHigh =
account_ > uDstAccountID;
382 std::uint32_t const uOwnerCount = sle->getFieldU32(sfOwnerCount);
403 (uOwnerCount < 2) ?
XRPAmount(beast::zero)
410 if (bQualityOut && QUALITY_ONE == uQualityOut)
415 bool const bSetAuth = (uTxFlags &
tfSetfAuth);
445 <<
"Delay transaction: Destination account does not exist.";
449 STAmount saLimitAllow = saLimitAmount;
465 auto const& uLowAccountID = !bHigh ?
account_ : uDstAccountID;
466 auto const& uHighAccountID = bHigh ?
account_ : uDstAccountID;
467 SLE::ref sleLowAccount = !bHigh ? sle : sleDst;
468 SLE::ref sleHighAccount = bHigh ? sle : sleDst;
474 saLowBalance = sleRippleState->getFieldAmount(sfBalance);
475 saHighBalance = -saLowBalance;
481 sleRippleState->setFieldAmount(
482 !bHigh ? sfLowLimit : sfHighLimit, saLimitAllow);
485 !bHigh ? saLimitAllow : sleRippleState->getFieldAmount(sfLowLimit);
487 bHigh ? saLimitAllow : sleRippleState->getFieldAmount(sfHighLimit);
497 uLowQualityIn = sleRippleState->getFieldU32(sfLowQualityIn);
498 uHighQualityIn = sleRippleState->getFieldU32(sfHighQualityIn);
504 sleRippleState->setFieldU32(
505 !bHigh ? sfLowQualityIn : sfHighQualityIn, uQualityIn);
507 uLowQualityIn = !bHigh
509 : sleRippleState->getFieldU32(sfLowQualityIn);
510 uHighQualityIn = bHigh
512 : sleRippleState->getFieldU32(sfHighQualityIn);
518 sleRippleState->makeFieldAbsent(
519 !bHigh ? sfLowQualityIn : sfHighQualityIn);
522 !bHigh ? 0 : sleRippleState->getFieldU32(sfLowQualityIn);
524 bHigh ? 0 : sleRippleState->getFieldU32(sfHighQualityIn);
527 if (QUALITY_ONE == uLowQualityIn)
530 if (QUALITY_ONE == uHighQualityIn)
541 uLowQualityOut = sleRippleState->getFieldU32(sfLowQualityOut);
542 uHighQualityOut = sleRippleState->getFieldU32(sfHighQualityOut);
544 else if (uQualityOut)
548 sleRippleState->setFieldU32(
549 !bHigh ? sfLowQualityOut : sfHighQualityOut, uQualityOut);
551 uLowQualityOut = !bHigh
553 : sleRippleState->getFieldU32(sfLowQualityOut);
554 uHighQualityOut = bHigh
556 : sleRippleState->getFieldU32(sfHighQualityOut);
562 sleRippleState->makeFieldAbsent(
563 !bHigh ? sfLowQualityOut : sfHighQualityOut);
566 !bHigh ? 0 : sleRippleState->getFieldU32(sfLowQualityOut);
568 bHigh ? 0 : sleRippleState->getFieldU32(sfHighQualityOut);
571 std::uint32_t const uFlagsIn(sleRippleState->getFieldU32(sfFlags));
574 if (bSetNoRipple && !bClearNoRipple)
576 if ((bHigh ? saHighBalance : saLowBalance) >= beast::zero)
583 else if (bClearNoRipple && !bSetNoRipple)
590 uFlagsOut = computeFreezeFlags(
599 if (QUALITY_ONE == uLowQualityOut)
602 if (QUALITY_ONE == uHighQualityOut)
606 bool const bHighDefRipple =
609 bool const bLowReserveSet = uLowQualityIn || uLowQualityOut ||
612 saLowBalance > beast::zero;
613 bool const bLowReserveClear = !bLowReserveSet;
615 bool const bHighReserveSet = uHighQualityIn || uHighQualityOut ||
618 saHighBalance > beast::zero;
619 bool const bHighReserveClear = !bHighReserveSet;
621 bool const bDefault = bLowReserveClear && bHighReserveClear;
626 bool bReserveIncrease =
false;
633 if (bLowReserveSet && !bLowReserved)
640 bReserveIncrease =
true;
643 if (bLowReserveClear && bLowReserved)
647 uFlagsOut &= ~lsfLowReserve;
650 if (bHighReserveSet && !bHighReserved)
657 bReserveIncrease =
true;
660 if (bHighReserveClear && bHighReserved)
664 uFlagsOut &= ~lsfHighReserve;
667 if (uFlagsIn != uFlagsOut)
668 sleRippleState->setFieldU32(sfFlags, uFlagsOut);
675 view(), sleRippleState, uLowAccountID, uHighAccountID, viewJ);
680 JLOG(
j_.
trace()) <<
"Delay transaction: Insufficent reserve to "
691 JLOG(
j_.
trace()) <<
"Modify ripple line";
697 (!bQualityIn || !uQualityIn) &&
699 (!bQualityOut || !uQualityOut) &&
704 <<
"Redundant: Setting non-existent ripple line to defaults.";
710 JLOG(
j_.
trace()) <<
"Delay transaction: Line does not exist. "
711 "Insufficent reserve to create line.";
724 JLOG(
j_.
trace()) <<
"doTrustSet: Creating ripple line: "
736 bSetNoRipple && !bClearNoRipple,
737 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.