171 auto const id = ctx.
tx[sfAccount];
179 bool const bSetAuth = (uTxFlags &
tfSetfAuth);
183 JLOG(ctx.
j.
trace()) <<
"Retry: Auth not required.";
187 auto const saLimitAmount = ctx.
tx[sfLimitAmount];
189 auto const currency = saLimitAmount.getCurrency();
190 auto const uDstAccountID = saLimitAmount.getIssuer();
192 if (
id == uDstAccountID)
226 if (sleDst->isFieldPresent(sfAMMID))
232 else if (
auto const ammSle = ctx.
view.
read({ltAMM, sleDst->getFieldH256(sfAMMID)}))
234 if (
auto const lpTokens = ammSle->getFieldAmount(sfLPTokenBalance); lpTokens == beast::zero)
236 else if (lpTokens.getCurrency() != saLimitAmount.getCurrency())
242 else if (sleDst->isFieldPresent(sfVaultID) || sleDst->isFieldPresent(sfLoanBrokerID))
259 if (bNoFreeze && (bSetFreeze || bSetDeepFreeze))
267 if ((bSetFreeze || bSetDeepFreeze) && (bClearFreeze || bClearDeepFreeze))
274 bool const bHigh =
id > uDstAccountID;
277 std::uint32_t uFlags = sleRippleState ? sleRippleState->getFieldU32(sfFlags) : 0u;
280 computeFreezeFlags(uFlags, bHigh, bNoFreeze, bSetFreeze, bClearFreeze, bSetDeepFreeze, bClearDeepFreeze);
288 if (deepFrozen && !frozen)
310 bool const bHigh =
account_ > uDstAccountID;
316 std::uint32_t const uOwnerCount = sle->getFieldU32(sfOwnerCount);
342 if (bQualityOut && QUALITY_ONE == uQualityOut)
347 bool const bSetAuth = (uTxFlags &
tfSetfAuth);
361 JLOG(
j_.
trace()) <<
"Delay transaction: Destination account does not exist.";
365 STAmount saLimitAllow = saLimitAmount;
380 auto const& uLowAccountID = !bHigh ?
account_ : uDstAccountID;
381 auto const& uHighAccountID = bHigh ?
account_ : uDstAccountID;
382 SLE::ref sleLowAccount = !bHigh ? sle : sleDst;
383 SLE::ref sleHighAccount = bHigh ? sle : sleDst;
389 saLowBalance = sleRippleState->getFieldAmount(sfBalance);
390 saHighBalance = -saLowBalance;
396 sleRippleState->setFieldAmount(!bHigh ? sfLowLimit : sfHighLimit, saLimitAllow);
398 saLowLimit = !bHigh ? saLimitAllow : sleRippleState->getFieldAmount(sfLowLimit);
399 saHighLimit = bHigh ? saLimitAllow : sleRippleState->getFieldAmount(sfHighLimit);
409 uLowQualityIn = sleRippleState->getFieldU32(sfLowQualityIn);
410 uHighQualityIn = sleRippleState->getFieldU32(sfHighQualityIn);
416 sleRippleState->setFieldU32(!bHigh ? sfLowQualityIn : sfHighQualityIn, uQualityIn);
418 uLowQualityIn = !bHigh ? uQualityIn : sleRippleState->getFieldU32(sfLowQualityIn);
419 uHighQualityIn = bHigh ? uQualityIn : sleRippleState->getFieldU32(sfHighQualityIn);
425 sleRippleState->makeFieldAbsent(!bHigh ? sfLowQualityIn : sfHighQualityIn);
427 uLowQualityIn = !bHigh ? 0 : sleRippleState->getFieldU32(sfLowQualityIn);
428 uHighQualityIn = bHigh ? 0 : sleRippleState->getFieldU32(sfHighQualityIn);
431 if (QUALITY_ONE == uLowQualityIn)
434 if (QUALITY_ONE == uHighQualityIn)
445 uLowQualityOut = sleRippleState->getFieldU32(sfLowQualityOut);
446 uHighQualityOut = sleRippleState->getFieldU32(sfHighQualityOut);
448 else if (uQualityOut)
452 sleRippleState->setFieldU32(!bHigh ? sfLowQualityOut : sfHighQualityOut, uQualityOut);
454 uLowQualityOut = !bHigh ? uQualityOut : sleRippleState->getFieldU32(sfLowQualityOut);
455 uHighQualityOut = bHigh ? uQualityOut : sleRippleState->getFieldU32(sfHighQualityOut);
461 sleRippleState->makeFieldAbsent(!bHigh ? sfLowQualityOut : sfHighQualityOut);
463 uLowQualityOut = !bHigh ? 0 : sleRippleState->getFieldU32(sfLowQualityOut);
464 uHighQualityOut = bHigh ? 0 : sleRippleState->getFieldU32(sfHighQualityOut);
467 std::uint32_t const uFlagsIn(sleRippleState->getFieldU32(sfFlags));
470 if (bSetNoRipple && !bClearNoRipple)
472 if ((bHigh ? saHighBalance : saLowBalance) >= beast::zero)
479 else if (bClearNoRipple && !bSetNoRipple)
487 computeFreezeFlags(uFlagsOut, bHigh, bNoFreeze, bSetFreeze, bClearFreeze, bSetDeepFreeze, bClearDeepFreeze);
489 if (QUALITY_ONE == uLowQualityOut)
492 if (QUALITY_ONE == uHighQualityOut)
498 bool const bLowReserveSet = uLowQualityIn || uLowQualityOut ||
500 saLowBalance > beast::zero;
501 bool const bLowReserveClear = !bLowReserveSet;
503 bool const bHighReserveSet = uHighQualityIn || uHighQualityOut ||
505 saHighBalance > beast::zero;
506 bool const bHighReserveClear = !bHighReserveSet;
508 bool const bDefault = bLowReserveClear && bHighReserveClear;
513 bool bReserveIncrease =
false;
520 if (bLowReserveSet && !bLowReserved)
527 bReserveIncrease =
true;
530 if (bLowReserveClear && bLowReserved)
534 uFlagsOut &= ~lsfLowReserve;
537 if (bHighReserveSet && !bHighReserved)
544 bReserveIncrease =
true;
547 if (bHighReserveClear && bHighReserved)
551 uFlagsOut &= ~lsfHighReserve;
554 if (uFlagsIn != uFlagsOut)
555 sleRippleState->setFieldU32(sfFlags, uFlagsOut);
561 terResult =
trustDelete(
view(), sleRippleState, uLowAccountID, uHighAccountID, viewJ);
566 JLOG(
j_.
trace()) <<
"Delay transaction: Insufficent reserve to "
577 JLOG(
j_.
trace()) <<
"Modify ripple line";
583 (!bQualityIn || !uQualityIn) &&
585 (!bQualityOut || !uQualityOut) &&
589 JLOG(
j_.
trace()) <<
"Redundant: Setting non-existent ripple line to defaults.";
595 JLOG(
j_.
trace()) <<
"Delay transaction: Line does not exist. "
596 "Insufficent reserve to create line.";
609 JLOG(
j_.
trace()) <<
"doTrustSet: Creating ripple line: " <<
to_string(k.key);
620 bSetNoRipple && !bClearNoRipple,
621 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.