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)
234 if (sleDst->isFieldPresent(sfAMMID))
242 ctx.
view.
read({ltAMM, sleDst->getFieldH256(sfAMMID)}))
244 if (
auto const lpTokens =
245 ammSle->getFieldAmount(sfLPTokenBalance);
246 lpTokens == beast::zero)
248 else if (lpTokens.getCurrency() != saLimitAmount.getCurrency())
255 sleDst->isFieldPresent(sfVaultID) ||
256 sleDst->isFieldPresent(sfLoanBrokerID))
273 if (bNoFreeze && (bSetFreeze || bSetDeepFreeze))
281 if ((bSetFreeze || bSetDeepFreeze) &&
282 (bClearFreeze || bClearDeepFreeze))
289 bool const bHigh =
id > uDstAccountID;
291 auto const sleRippleState =
294 sleRippleState ? sleRippleState->getFieldU32(sfFlags) : 0u;
296 uFlags = computeFreezeFlags(
306 auto const deepFrozen =
312 if (deepFrozen && !frozen)
334 bool const bHigh =
account_ > uDstAccountID;
340 std::uint32_t const uOwnerCount = sle->getFieldU32(sfOwnerCount);
361 (uOwnerCount < 2) ?
XRPAmount(beast::zero)
368 if (bQualityOut && QUALITY_ONE == uQualityOut)
373 bool const bSetAuth = (uTxFlags &
tfSetfAuth);
388 <<
"Delay transaction: Destination account does not exist.";
392 STAmount saLimitAllow = saLimitAmount;
408 auto const& uLowAccountID = !bHigh ?
account_ : uDstAccountID;
409 auto const& uHighAccountID = bHigh ?
account_ : uDstAccountID;
410 SLE::ref sleLowAccount = !bHigh ? sle : sleDst;
411 SLE::ref sleHighAccount = bHigh ? sle : sleDst;
417 saLowBalance = sleRippleState->getFieldAmount(sfBalance);
418 saHighBalance = -saLowBalance;
424 sleRippleState->setFieldAmount(
425 !bHigh ? sfLowLimit : sfHighLimit, saLimitAllow);
428 !bHigh ? saLimitAllow : sleRippleState->getFieldAmount(sfLowLimit);
430 bHigh ? saLimitAllow : sleRippleState->getFieldAmount(sfHighLimit);
440 uLowQualityIn = sleRippleState->getFieldU32(sfLowQualityIn);
441 uHighQualityIn = sleRippleState->getFieldU32(sfHighQualityIn);
447 sleRippleState->setFieldU32(
448 !bHigh ? sfLowQualityIn : sfHighQualityIn, uQualityIn);
450 uLowQualityIn = !bHigh
452 : sleRippleState->getFieldU32(sfLowQualityIn);
453 uHighQualityIn = bHigh
455 : sleRippleState->getFieldU32(sfHighQualityIn);
461 sleRippleState->makeFieldAbsent(
462 !bHigh ? sfLowQualityIn : sfHighQualityIn);
465 !bHigh ? 0 : sleRippleState->getFieldU32(sfLowQualityIn);
467 bHigh ? 0 : sleRippleState->getFieldU32(sfHighQualityIn);
470 if (QUALITY_ONE == uLowQualityIn)
473 if (QUALITY_ONE == uHighQualityIn)
484 uLowQualityOut = sleRippleState->getFieldU32(sfLowQualityOut);
485 uHighQualityOut = sleRippleState->getFieldU32(sfHighQualityOut);
487 else if (uQualityOut)
491 sleRippleState->setFieldU32(
492 !bHigh ? sfLowQualityOut : sfHighQualityOut, uQualityOut);
494 uLowQualityOut = !bHigh
496 : sleRippleState->getFieldU32(sfLowQualityOut);
497 uHighQualityOut = bHigh
499 : sleRippleState->getFieldU32(sfHighQualityOut);
505 sleRippleState->makeFieldAbsent(
506 !bHigh ? sfLowQualityOut : sfHighQualityOut);
509 !bHigh ? 0 : sleRippleState->getFieldU32(sfLowQualityOut);
511 bHigh ? 0 : sleRippleState->getFieldU32(sfHighQualityOut);
514 std::uint32_t const uFlagsIn(sleRippleState->getFieldU32(sfFlags));
517 if (bSetNoRipple && !bClearNoRipple)
519 if ((bHigh ? saHighBalance : saLowBalance) >= beast::zero)
526 else if (bClearNoRipple && !bSetNoRipple)
533 uFlagsOut = computeFreezeFlags(
542 if (QUALITY_ONE == uLowQualityOut)
545 if (QUALITY_ONE == uHighQualityOut)
549 bool const bHighDefRipple =
552 bool const bLowReserveSet = uLowQualityIn || uLowQualityOut ||
555 saLowBalance > beast::zero;
556 bool const bLowReserveClear = !bLowReserveSet;
558 bool const bHighReserveSet = uHighQualityIn || uHighQualityOut ||
561 saHighBalance > beast::zero;
562 bool const bHighReserveClear = !bHighReserveSet;
564 bool const bDefault = bLowReserveClear && bHighReserveClear;
569 bool bReserveIncrease =
false;
576 if (bLowReserveSet && !bLowReserved)
583 bReserveIncrease =
true;
586 if (bLowReserveClear && bLowReserved)
590 uFlagsOut &= ~lsfLowReserve;
593 if (bHighReserveSet && !bHighReserved)
600 bReserveIncrease =
true;
603 if (bHighReserveClear && bHighReserved)
607 uFlagsOut &= ~lsfHighReserve;
610 if (uFlagsIn != uFlagsOut)
611 sleRippleState->setFieldU32(sfFlags, uFlagsOut);
618 view(), sleRippleState, uLowAccountID, uHighAccountID, viewJ);
623 JLOG(
j_.
trace()) <<
"Delay transaction: Insufficent reserve to "
634 JLOG(
j_.
trace()) <<
"Modify ripple line";
640 (!bQualityIn || !uQualityIn) &&
642 (!bQualityOut || !uQualityOut) &&
647 <<
"Redundant: Setting non-existent ripple line to defaults.";
653 JLOG(
j_.
trace()) <<
"Delay transaction: Line does not exist. "
654 "Insufficent reserve to create line.";
667 JLOG(
j_.
trace()) <<
"doTrustSet: Creating ripple line: "
679 bSetNoRipple && !bClearNoRipple,
680 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.