Skip to content

Commit

Permalink
refactor accountholds
Browse files Browse the repository at this point in the history
  • Loading branch information
shawnxie999 committed Jan 14, 2025
1 parent efa1823 commit 01ce1e3
Showing 1 changed file with 44 additions and 35 deletions.
79 changes: 44 additions & 35 deletions src/xrpld/ledger/detail/View.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -295,53 +295,62 @@ accountHolds(

// IOU: Return balance on trust line modulo freeze
auto const sle = view.read(keylet::line(account, issuer, currency));
if (!sle)
{
amount.clear(Issue{currency, issuer});
}
else if (
(zeroIfFrozen == fhZERO_IF_FROZEN) &&
isFrozen(view, account, currency, issuer))
{
amount.clear(Issue{currency, issuer});
}
else
{
amount = sle->getFieldAmount(sfBalance);
if (account > issuer)
auto const allowBalance = [&]() {
if (!sle)
{
// Put balance in account terms.
amount.negate();
return false;
}
amount.setIssuer(issuer);

// if it's a LPToken, also need to check if issuers of the asset pair
// has frozen holder's trustline
if (view.rules().enabled(fixFrozenLPTokenTransfer) &&
zeroIfFrozen == fhZERO_IF_FROZEN)
if (zeroIfFrozen == fhZERO_IF_FROZEN)
{
auto const sleIssuer = view.read(keylet::account(issuer));
if (!sleIssuer)
if (isFrozen(view, account, currency, issuer))
{
amount.clear(Issue{currency, issuer});
return false;
}
else if (sleIssuer->isFieldPresent(sfAMMID))

if (view.rules().enabled(fixFrozenLPTokenTransfer))
{
auto const sleAmm =
view.read(keylet::amm((*sleIssuer)[sfAMMID]));

if (!sleAmm ||
isLPTokenFrozen(
view,
account,
(*sleAmm)[sfAsset].get<Issue>(),
(*sleAmm)[sfAsset2].get<Issue>()))
auto const sleIssuer = view.read(keylet::account(issuer));
if (!sleIssuer)
{
amount.clear(Issue{currency, issuer});
return false;
}
else if (sleIssuer->isFieldPresent(sfAMMID))
{
auto const sleAmm =
view.read(keylet::amm((*sleIssuer)[sfAMMID]));

if (!sleAmm ||
isLPTokenFrozen(
view,
account,
(*sleAmm)[sfAsset].get<Issue>(),
(*sleAmm)[sfAsset2].get<Issue>()))
{
return false;
}
}
}
}

return true;
}();

if (allowBalance)
{
amount = sle->getFieldAmount(sfBalance);
if (account > issuer)
{
// Put balance in account terms.
amount.negate();
}
amount.setIssuer(issuer);
}
else
{
amount.clear(Issue{currency, issuer});
}

JLOG(j.trace()) << "accountHolds:"
<< " account=" << to_string(account)
<< " amount=" << amount.getFullText();
Expand Down

0 comments on commit 01ce1e3

Please sign in to comment.