199 auto const id = ctx.
tx[sfAccount];
207 bool const bSetAuth = (uTxFlags &
tfSetfAuth);
211 JLOG(ctx.
j.
trace()) <<
"Retry: Auth not required.";
215 auto const saLimitAmount = ctx.
tx[sfLimitAmount];
217 auto const currency = saLimitAmount.getCurrency();
218 auto const uDstAccountID = saLimitAmount.getIssuer();
222 if (
id == uDstAccountID)
227 if (
id == uDstAccountID)
232 auto const sleDelete =
238 <<
"Malformed transaction: Can not extend credit to self.";
281 if (sleDst->isFieldPresent(sfAMMID))
289 ctx.
view.
read({ltAMM, sleDst->getFieldH256(sfAMMID)}))
291 if (
auto const lpTokens =
292 ammSle->getFieldAmount(sfLPTokenBalance);
293 lpTokens == beast::zero)
295 else if (lpTokens.getCurrency() != saLimitAmount.getCurrency())
301 else if (sleDst->isFieldPresent(sfVaultID))
318 if (bNoFreeze && (bSetFreeze || bSetDeepFreeze))
326 if ((bSetFreeze || bSetDeepFreeze) &&
327 (bClearFreeze || bClearDeepFreeze))
334 bool const bHigh =
id > uDstAccountID;
336 auto const sleRippleState =
339 sleRippleState ? sleRippleState->getFieldU32(sfFlags) : 0u;
341 uFlags = computeFreezeFlags(
351 auto const deepFrozen =
357 if (deepFrozen && !frozen)
379 bool const bHigh =
account_ > uDstAccountID;
385 std::uint32_t const uOwnerCount = sle->getFieldU32(sfOwnerCount);
406 (uOwnerCount < 2) ?
XRPAmount(beast::zero)
413 if (bQualityOut && QUALITY_ONE == uQualityOut)
418 bool const bSetAuth = (uTxFlags &
tfSetfAuth);
448 <<
"Delay transaction: Destination account does not exist.";
452 STAmount saLimitAllow = saLimitAmount;
468 auto const& uLowAccountID = !bHigh ?
account_ : uDstAccountID;
469 auto const& uHighAccountID = bHigh ?
account_ : uDstAccountID;
470 SLE::ref sleLowAccount = !bHigh ? sle : sleDst;
471 SLE::ref sleHighAccount = bHigh ? sle : sleDst;
477 saLowBalance = sleRippleState->getFieldAmount(sfBalance);
478 saHighBalance = -saLowBalance;
484 sleRippleState->setFieldAmount(
485 !bHigh ? sfLowLimit : sfHighLimit, saLimitAllow);
488 !bHigh ? saLimitAllow : sleRippleState->getFieldAmount(sfLowLimit);
490 bHigh ? saLimitAllow : sleRippleState->getFieldAmount(sfHighLimit);
500 uLowQualityIn = sleRippleState->getFieldU32(sfLowQualityIn);
501 uHighQualityIn = sleRippleState->getFieldU32(sfHighQualityIn);
507 sleRippleState->setFieldU32(
508 !bHigh ? sfLowQualityIn : sfHighQualityIn, uQualityIn);
510 uLowQualityIn = !bHigh
512 : sleRippleState->getFieldU32(sfLowQualityIn);
513 uHighQualityIn = bHigh
515 : sleRippleState->getFieldU32(sfHighQualityIn);
521 sleRippleState->makeFieldAbsent(
522 !bHigh ? sfLowQualityIn : sfHighQualityIn);
525 !bHigh ? 0 : sleRippleState->getFieldU32(sfLowQualityIn);
527 bHigh ? 0 : sleRippleState->getFieldU32(sfHighQualityIn);
530 if (QUALITY_ONE == uLowQualityIn)
533 if (QUALITY_ONE == uHighQualityIn)
544 uLowQualityOut = sleRippleState->getFieldU32(sfLowQualityOut);
545 uHighQualityOut = sleRippleState->getFieldU32(sfHighQualityOut);
547 else if (uQualityOut)
551 sleRippleState->setFieldU32(
552 !bHigh ? sfLowQualityOut : sfHighQualityOut, uQualityOut);
554 uLowQualityOut = !bHigh
556 : sleRippleState->getFieldU32(sfLowQualityOut);
557 uHighQualityOut = bHigh
559 : sleRippleState->getFieldU32(sfHighQualityOut);
565 sleRippleState->makeFieldAbsent(
566 !bHigh ? sfLowQualityOut : sfHighQualityOut);
569 !bHigh ? 0 : sleRippleState->getFieldU32(sfLowQualityOut);
571 bHigh ? 0 : sleRippleState->getFieldU32(sfHighQualityOut);
574 std::uint32_t const uFlagsIn(sleRippleState->getFieldU32(sfFlags));
577 if (bSetNoRipple && !bClearNoRipple)
579 if ((bHigh ? saHighBalance : saLowBalance) >= beast::zero)
586 else if (bClearNoRipple && !bSetNoRipple)
593 uFlagsOut = computeFreezeFlags(
602 if (QUALITY_ONE == uLowQualityOut)
605 if (QUALITY_ONE == uHighQualityOut)
609 bool const bHighDefRipple =
612 bool const bLowReserveSet = uLowQualityIn || uLowQualityOut ||
615 saLowBalance > beast::zero;
616 bool const bLowReserveClear = !bLowReserveSet;
618 bool const bHighReserveSet = uHighQualityIn || uHighQualityOut ||
621 saHighBalance > beast::zero;
622 bool const bHighReserveClear = !bHighReserveSet;
624 bool const bDefault = bLowReserveClear && bHighReserveClear;
629 bool bReserveIncrease =
false;
636 if (bLowReserveSet && !bLowReserved)
643 bReserveIncrease =
true;
646 if (bLowReserveClear && bLowReserved)
650 uFlagsOut &= ~lsfLowReserve;
653 if (bHighReserveSet && !bHighReserved)
660 bReserveIncrease =
true;
663 if (bHighReserveClear && bHighReserved)
667 uFlagsOut &= ~lsfHighReserve;
670 if (uFlagsIn != uFlagsOut)
671 sleRippleState->setFieldU32(sfFlags, uFlagsOut);
678 view(), sleRippleState, uLowAccountID, uHighAccountID, viewJ);
683 JLOG(
j_.
trace()) <<
"Delay transaction: Insufficent reserve to "
694 JLOG(
j_.
trace()) <<
"Modify ripple line";
700 (!bQualityIn || !uQualityIn) &&
702 (!bQualityOut || !uQualityOut) &&
707 <<
"Redundant: Setting non-existent ripple line to defaults.";
713 JLOG(
j_.
trace()) <<
"Delay transaction: Line does not exist. "
714 "Insufficent reserve to create line.";
727 JLOG(
j_.
trace()) <<
"doTrustSet: Creating ripple line: "
739 bSetNoRipple && !bClearNoRipple,
740 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.