157 auto const id = ctx.
tx[sfAccount];
163 bool const bSetAuth = ctx.
tx.
isFlag(tfSetfAuth);
165 if (bSetAuth && !sle->isFlag(lsfRequireAuth))
167 JLOG(ctx.
j.
trace()) <<
"Retry: Auth not required.";
171 auto const saLimitAmount = ctx.
tx[sfLimitAmount];
173 auto const currency = saLimitAmount.get<
Issue>().currency;
174 auto const uDstAccountID = saLimitAmount.
getIssuer();
176 if (
id == uDstAccountID)
187 if (sleDst->isFlag(lsfDisallowIncomingTrustline))
213 if (sleDst->isFieldPresent(sfAMMID))
219 else if (
auto const ammSle = ctx.
view.
read({ltAMM, sleDst->getFieldH256(sfAMMID)}))
221 auto const lpTokens = ammSle->getFieldAmount(sfLPTokenBalance);
222 if (lpTokens == beast::kZero)
236 else if (sleDst->isFieldPresent(sfVaultID) || sleDst->isFieldPresent(sfLoanBrokerID))
251 bool const bNoFreeze = sle->isFlag(lsfNoFreeze);
252 bool const bSetFreeze = ctx.
tx.
isFlag(tfSetFreeze);
253 bool const bSetDeepFreeze = ctx.
tx.
isFlag(tfSetDeepFreeze);
255 if (bNoFreeze && (bSetFreeze || bSetDeepFreeze))
261 bool const bClearFreeze = ctx.
tx.
isFlag(tfClearFreeze);
262 bool const bClearDeepFreeze = ctx.
tx.
isFlag(tfClearDeepFreeze);
263 if ((bSetFreeze || bSetDeepFreeze) && (bClearFreeze || bClearDeepFreeze))
270 bool const bHigh =
id > uDstAccountID;
273 std::uint32_t uFlags = sleRippleState ? sleRippleState->getFieldU32(sfFlags) : 0u;
275 uFlags = computeFreezeFlags(
276 uFlags, bHigh, bNoFreeze, bSetFreeze, bClearFreeze, bSetDeepFreeze, bClearDeepFreeze);
278 auto const frozen = uFlags & (bHigh ? lsfHighFreeze : lsfLowFreeze);
279 auto const deepFrozen = uFlags & (bHigh ? lsfHighDeepFreeze : lsfLowDeepFreeze);
284 if ((deepFrozen != 0u) && (frozen == 0u))
298 STAmount const saLimitAmount(
ctx_.tx.getFieldAmount(sfLimitAmount));
299 bool const bQualityIn(
ctx_.tx.isFieldPresent(sfQualityIn));
300 bool const bQualityOut(
ctx_.tx.isFieldPresent(sfQualityOut));
306 bool const bHigh =
accountID_ > uDstAccountID;
312 std::uint32_t const uOwnerCount = sle->getFieldU32(sfOwnerCount);
333 (uOwnerCount < 2) ?
XRPAmount(beast::kZero)
334 :
view().fees().accountReserve(uOwnerCount + 1));
336 std::uint32_t const uQualityIn(bQualityIn ?
ctx_.tx.getFieldU32(sfQualityIn) : 0);
339 if (bQualityOut && QUALITY_ONE == uQualityOut)
342 bool const bSetAuth =
ctx_.tx.isFlag(tfSetfAuth);
343 bool const bSetNoRipple =
ctx_.tx.isFlag(tfSetNoRipple);
344 bool const bClearNoRipple =
ctx_.tx.isFlag(tfClearNoRipple);
345 bool const bSetFreeze =
ctx_.tx.isFlag(tfSetFreeze);
346 bool const bClearFreeze =
ctx_.tx.isFlag(tfClearFreeze);
347 bool const bSetDeepFreeze =
ctx_.tx.isFlag(tfSetDeepFreeze);
348 bool const bClearDeepFreeze =
ctx_.tx.isFlag(tfClearDeepFreeze);
350 auto viewJ =
ctx_.registry.get().getJournal(
"View");
356 JLOG(
j_.trace()) <<
"Delay transaction: Destination account does not exist.";
360 STAmount saLimitAllow = saLimitAmount;
376 auto const& uLowAccountID = !bHigh ?
accountID_ : uDstAccountID;
377 auto const& uHighAccountID = bHigh ?
accountID_ : uDstAccountID;
378 SLE::ref sleLowAccount = !bHigh ? sle : sleDst;
379 SLE::ref sleHighAccount = bHigh ? sle : sleDst;
385 saLowBalance = sleRippleState->getFieldAmount(sfBalance);
386 saHighBalance = -saLowBalance;
392 sleRippleState->setFieldAmount(!bHigh ? sfLowLimit : sfHighLimit, saLimitAllow);
394 saLowLimit = !bHigh ? saLimitAllow : sleRippleState->getFieldAmount(sfLowLimit);
395 saHighLimit = bHigh ? saLimitAllow : sleRippleState->getFieldAmount(sfHighLimit);
405 uLowQualityIn = sleRippleState->getFieldU32(sfLowQualityIn);
406 uHighQualityIn = sleRippleState->getFieldU32(sfHighQualityIn);
408 else if (uQualityIn != 0u)
412 sleRippleState->setFieldU32(!bHigh ? sfLowQualityIn : sfHighQualityIn, uQualityIn);
414 uLowQualityIn = !bHigh ? uQualityIn : sleRippleState->getFieldU32(sfLowQualityIn);
415 uHighQualityIn = bHigh ? uQualityIn : sleRippleState->getFieldU32(sfHighQualityIn);
421 sleRippleState->makeFieldAbsent(!bHigh ? sfLowQualityIn : sfHighQualityIn);
423 uLowQualityIn = !bHigh ? 0 : sleRippleState->getFieldU32(sfLowQualityIn);
424 uHighQualityIn = bHigh ? 0 : sleRippleState->getFieldU32(sfHighQualityIn);
427 if (QUALITY_ONE == uLowQualityIn)
430 if (QUALITY_ONE == uHighQualityIn)
441 uLowQualityOut = sleRippleState->getFieldU32(sfLowQualityOut);
442 uHighQualityOut = sleRippleState->getFieldU32(sfHighQualityOut);
444 else if (uQualityOut != 0u)
448 sleRippleState->setFieldU32(!bHigh ? sfLowQualityOut : sfHighQualityOut, uQualityOut);
450 uLowQualityOut = !bHigh ? uQualityOut : sleRippleState->getFieldU32(sfLowQualityOut);
451 uHighQualityOut = bHigh ? uQualityOut : sleRippleState->getFieldU32(sfHighQualityOut);
457 sleRippleState->makeFieldAbsent(!bHigh ? sfLowQualityOut : sfHighQualityOut);
459 uLowQualityOut = !bHigh ? 0 : sleRippleState->getFieldU32(sfLowQualityOut);
460 uHighQualityOut = bHigh ? 0 : sleRippleState->getFieldU32(sfHighQualityOut);
463 std::uint32_t const uFlagsIn(sleRippleState->getFieldU32(sfFlags));
466 if (bSetNoRipple && !bClearNoRipple)
468 if ((bHigh ? saHighBalance : saLowBalance) >= beast::kZero)
470 uFlagsOut |= (bHigh ? lsfHighNoRipple : lsfLowNoRipple);
478 else if (bClearNoRipple && !bSetNoRipple)
480 uFlagsOut &= ~(bHigh ? lsfHighNoRipple : lsfLowNoRipple);
484 bool const bNoFreeze = sle->isFlag(lsfNoFreeze);
485 uFlagsOut = computeFreezeFlags(
494 if (QUALITY_ONE == uLowQualityOut)
497 if (QUALITY_ONE == uHighQualityOut)
500 bool const bLowDefRipple = sleLowAccount->isFlag(lsfDefaultRipple);
501 bool const bHighDefRipple = sleHighAccount->isFlag(lsfDefaultRipple);
503 bool const bLowReserveSet = (uLowQualityIn != 0u) || (uLowQualityOut != 0u) ||
504 ((uFlagsOut & lsfLowNoRipple) == 0) != bLowDefRipple ||
505 ((uFlagsOut & lsfLowFreeze) != 0u) || saLowLimit || saLowBalance > beast::kZero;
506 bool const bLowReserveClear = !bLowReserveSet;
508 bool const bHighReserveSet = (uHighQualityIn != 0u) || (uHighQualityOut != 0u) ||
509 ((uFlagsOut & lsfHighNoRipple) == 0) != bHighDefRipple ||
510 ((uFlagsOut & lsfHighFreeze) != 0u) || saHighLimit || saHighBalance > beast::kZero;
511 bool const bHighReserveClear = !bHighReserveSet;
513 bool const bDefault = bLowReserveClear && bHighReserveClear;
515 bool const bLowReserved = sleRippleState->isFlag(lsfLowReserve);
516 bool const bHighReserved = sleRippleState->isFlag(lsfHighReserve);
518 bool bReserveIncrease =
false;
522 uFlagsOut |= (bHigh ? lsfHighAuth : lsfLowAuth);
525 if (bLowReserveSet && !bLowReserved)
529 uFlagsOut |= lsfLowReserve;
532 bReserveIncrease =
true;
535 if (bLowReserveClear && bLowReserved)
539 uFlagsOut &= ~lsfLowReserve;
542 if (bHighReserveSet && !bHighReserved)
546 uFlagsOut |= lsfHighReserve;
549 bReserveIncrease =
true;
552 if (bHighReserveClear && bHighReserved)
556 uFlagsOut &= ~lsfHighReserve;
559 if (uFlagsIn != uFlagsOut)
560 sleRippleState->setFieldU32(sfFlags, uFlagsOut);
566 terResult =
trustDelete(
view(), sleRippleState, uLowAccountID, uHighAccountID, viewJ);
571 JLOG(
j_.trace()) <<
"Delay transaction: Insufficent reserve to "
582 JLOG(
j_.trace()) <<
"Modify ripple line";
588 (!bQualityIn || (uQualityIn == 0u)) &&
590 (!bQualityOut || (uQualityOut == 0u)) &&
594 JLOG(
j_.trace()) <<
"Redundant: Setting non-existent ripple line to defaults.";
600 JLOG(
j_.trace()) <<
"Delay transaction: Line does not exist. "
601 "Insufficent reserve to create line.";
614 JLOG(
j_.trace()) <<
"doTrustSet: Creating ripple line: " <<
to_string(k.key);
625 bSetNoRipple && !bClearNoRipple,
626 bSetFreeze && !bClearFreeze,