diff --git a/src/libxrpl/ledger/helpers/MPTokenHelpers.cpp b/src/libxrpl/ledger/helpers/MPTokenHelpers.cpp index b78def7db4..bbd5ffcad8 100644 --- a/src/libxrpl/ledger/helpers/MPTokenHelpers.cpp +++ b/src/libxrpl/ledger/helpers/MPTokenHelpers.cpp @@ -133,12 +133,13 @@ addEmptyHolding( beast::Journal journal) { auto const& mptID = mptIssue.getMptID(); - auto const mpt = ctx.view.peek(keylet::mptIssuance(mptID)); + auto& view = ctx.view; + auto const mpt = view.peek(keylet::mptIssuance(mptID)); if (!mpt) return tefINTERNAL; // LCOV_EXCL_LINE if (mpt->isFlag(lsfMPTLocked)) return tefINTERNAL; // LCOV_EXCL_LINE - if (ctx.view.peek(keylet::mptoken(mptID, accountID))) + if (view.peek(keylet::mptoken(mptID, accountID))) return tecDUPLICATE; if (accountID == mptIssue.getIssuer()) return tesSUCCESS; @@ -156,7 +157,8 @@ authorizeMPToken( std::uint32_t flags, std::optional holderID) { - auto const sleAcct = ctx.view.peek(keylet::account(account)); + auto& view = ctx.view; + auto const sleAcct = view.peek(keylet::account(account)); if (!sleAcct) return tecINTERNAL; // LCOV_EXCL_LINE @@ -171,19 +173,19 @@ authorizeMPToken( if ((flags & tfMPTUnauthorize) != 0u) { auto const mptokenKey = keylet::mptoken(mptIssuanceID, account); - auto const sleMpt = ctx.view.peek(mptokenKey); + auto const sleMpt = view.peek(mptokenKey); if (!sleMpt || (*sleMpt)[sfMPTAmount] != 0 || - (ctx.view.rules().enabled(fixCleanup3_1_3) && + (view.rules().enabled(fixCleanup3_1_3) && (*sleMpt)[~sfLockedAmount].valueOr(0) != 0)) return tecINTERNAL; // LCOV_EXCL_LINE - if (!ctx.view.dirRemove( + if (!view.dirRemove( keylet::ownerDir(account), (*sleMpt)[sfOwnerNode], sleMpt->key(), false)) return tecINTERNAL; // LCOV_EXCL_LINE - adjustOwnerCountObj(ctx.view, sleAcct, sleMpt, -1, journal); + adjustOwnerCountObj(view, sleAcct, sleMpt, -1, journal); - ctx.view.erase(sleMpt); + view.erase(sleMpt); return tesSUCCESS; } @@ -204,44 +206,44 @@ authorizeMPToken( // items. This is similar to the reserve requirements of trust lines. // If PreFunded Sponsor, it must be checked whether sufficient // ReserveCount exists. - if (ownerCount(ctx.view, *sponsorSle ? *sponsorSle : sleAcct, journal) >= 2 || + if (ownerCount(view, *sponsorSle ? *sponsorSle : sleAcct, journal) >= 2 || isSponsoredAndPreFunded) { if (auto const ret = checkInsufficientReserve( - ctx.view, ctx.tx, sleAcct, priorBalance, *sponsorSle, 1, 0, journal); + view, ctx.tx, sleAcct, priorBalance, *sponsorSle, 1, 0, journal); !isTesSuccess(ret)) return ret; } // Defensive check before we attempt to create MPToken for the issuer - auto const mpt = ctx.view.read(keylet::mptIssuance(mptIssuanceID)); + auto const mpt = view.read(keylet::mptIssuance(mptIssuanceID)); if (!mpt || mpt->getAccountID(sfIssuer) == account) { // LCOV_EXCL_START UNREACHABLE("xrpl::authorizeMPToken : invalid issuance or issuers token"); - if (ctx.view.rules().enabled(featureLendingProtocol)) + if (view.rules().enabled(featureLendingProtocol)) return tecINTERNAL; // LCOV_EXCL_STOP } auto const mptokenKey = keylet::mptoken(mptIssuanceID, account); auto mptoken = std::make_shared(mptokenKey); - if (auto ter = dirLink(ctx.view, account, mptoken)) + if (auto ter = dirLink(view, account, mptoken)) return ter; // LCOV_EXCL_LINE (*mptoken)[sfAccount] = account; (*mptoken)[sfMPTokenIssuanceID] = mptIssuanceID; (*mptoken)[sfFlags] = 0; - ctx.view.insert(mptoken); + view.insert(mptoken); // Update owner count. - adjustOwnerCount(ctx.view, sleAcct, *sponsorSle, 1, journal); + adjustOwnerCount(view, sleAcct, *sponsorSle, 1, journal); addSponsorToLedgerEntry(mptoken, *sponsorSle); return tesSUCCESS; } - auto const sleMptIssuance = ctx.view.read(keylet::mptIssuance(mptIssuanceID)); + auto const sleMptIssuance = view.read(keylet::mptIssuance(mptIssuanceID)); if (!sleMptIssuance) return tecINTERNAL; // LCOV_EXCL_LINE @@ -251,7 +253,7 @@ authorizeMPToken( if (account != (*sleMptIssuance)[sfIssuer]) return tecINTERNAL; // LCOV_EXCL_LINE - auto const sleMpt = ctx.view.peek(keylet::mptoken(mptIssuanceID, *holderID)); + auto const sleMpt = view.peek(keylet::mptoken(mptIssuanceID, *holderID)); if (!sleMpt) return tecINTERNAL; // LCOV_EXCL_LINE @@ -274,7 +276,7 @@ authorizeMPToken( if (flagsIn != flagsOut) sleMpt->setFieldU32(sfFlags, flagsOut); - ctx.view.update(sleMpt); + view.update(sleMpt); return tesSUCCESS; } @@ -290,7 +292,8 @@ removeEmptyHolding( // a token does exist, it will get deleted. If not, return success. bool const accountIsIssuer = accountID == mptIssue.getIssuer(); auto const& mptID = mptIssue.getMptID(); - auto const mptoken = ctx.view.peek(keylet::mptoken(mptID, accountID)); + auto& view = ctx.view; + auto const mptoken = view.peek(keylet::mptoken(mptID, accountID)); if (!mptoken) return accountIsIssuer ? (TER)tesSUCCESS : (TER)tecOBJECT_NOT_FOUND; // Unlike a trust line, if the account is the issuer, and the token has a @@ -298,7 +301,7 @@ removeEmptyHolding( // accounting out of balance, so fail. Since this should be impossible // anyway, I'm not going to put any effort into it. if (mptoken->at(sfMPTAmount) != 0 || - (ctx.view.rules().enabled(fixCleanup3_1_3) && (*mptoken)[~sfLockedAmount].valueOr(0) != 0)) + (view.rules().enabled(fixCleanup3_1_3) && (*mptoken)[~sfLockedAmount].valueOr(0) != 0)) return tecHAS_OBLIGATIONS; return authorizeMPToken( @@ -417,7 +420,8 @@ enforceMPTokenAuthorization( XRPAmount const& priorBalance, // for MPToken authorization beast::Journal j) { - auto const sleIssuance = ctx.view.read(keylet::mptIssuance(mptIssuanceID)); + auto& view = ctx.view; + auto const sleIssuance = view.read(keylet::mptIssuance(mptIssuanceID)); if (!sleIssuance) return tefINTERNAL; // LCOV_EXCL_LINE @@ -429,7 +433,7 @@ enforceMPTokenAuthorization( return tefINTERNAL; // LCOV_EXCL_LINE auto const keylet = keylet::mptoken(mptIssuanceID, account); - auto const sleToken = ctx.view.read(keylet); // NOTE: might be null + auto const sleToken = view.read(keylet); // NOTE: might be null auto const maybeDomainID = sleIssuance->at(~sfDomainID); bool expired = false; bool const authorizedByDomain = [&]() -> bool { @@ -437,7 +441,7 @@ enforceMPTokenAuthorization( if (!maybeDomainID.has_value()) return false; // LCOV_EXCL_LINE - auto const ter = verifyValidDomain(ctx.view, account, *maybeDomainID, j); + auto const ter = verifyValidDomain(view, account, *maybeDomainID, j); if (isTesSuccess(ter)) return true; if (ter == tecEXPIRED) diff --git a/src/libxrpl/ledger/helpers/RippleStateHelpers.cpp b/src/libxrpl/ledger/helpers/RippleStateHelpers.cpp index d5220860e6..6e1f51316b 100644 --- a/src/libxrpl/ledger/helpers/RippleStateHelpers.cpp +++ b/src/libxrpl/ledger/helpers/RippleStateHelpers.cpp @@ -640,27 +640,28 @@ addEmptyHolding( Issue const& issue, beast::Journal journal) { + auto& view = ctx.view; // Every account can hold XRP. An issuer can issue directly. if (issue.native() || accountID == issue.getIssuer()) return tesSUCCESS; auto const& issuerId = issue.getIssuer(); auto const& currency = issue.currency; - if (isGlobalFrozen(ctx.view, issuerId)) + if (isGlobalFrozen(view, issuerId)) return tecFROZEN; // LCOV_EXCL_LINE auto const& srcId = issuerId; auto const& dstId = accountID; auto const high = srcId > dstId; auto const index = keylet::line(srcId, dstId, currency); - auto const sleSrc = ctx.view.peek(keylet::account(srcId)); - auto const sleDst = ctx.view.peek(keylet::account(dstId)); + auto const sleSrc = view.peek(keylet::account(srcId)); + auto const sleDst = view.peek(keylet::account(dstId)); if (!sleDst || !sleSrc) return tefINTERNAL; // LCOV_EXCL_LINE if (!sleSrc->isFlag(lsfDefaultRipple)) return tecINTERNAL; // LCOV_EXCL_LINE // If the line already exists, don't create it again. - if (ctx.view.read(index)) + if (view.read(index)) return tecDUPLICATE; SLE::pointer sponsorSle; @@ -673,13 +674,13 @@ addEmptyHolding( } // Can the account cover the trust line reserve ? - if (auto const ret = checkInsufficientReserve( - ctx.view, ctx.tx, sleDst, priorBalance, sponsorSle, 1, 0, journal); + if (auto const ret = + checkInsufficientReserve(view, ctx.tx, sleDst, priorBalance, sponsorSle, 1, 0, journal); !isTesSuccess(ret)) return tecNO_LINE_INSUF_RESERVE; return trustCreate( - ctx.view, + view, high, srcId, dstId, @@ -704,9 +705,10 @@ removeEmptyHolding( Issue const& issue, beast::Journal journal) { + auto& view = ctx.view; if (issue.native()) { - auto const sle = ctx.view.read(keylet::account(accountID)); + auto const sle = view.read(keylet::account(accountID)); if (!sle) return tecINTERNAL; // LCOV_EXCL_LINE @@ -721,7 +723,7 @@ removeEmptyHolding( // If the account is the issuer, then no line should exist. Check anyway. // If a line does exist, it will get deleted. If not, return success. bool const accountIsIssuer = accountID == issue.account; - auto const line = ctx.view.peek(keylet::line(accountID, issue)); + auto const line = view.peek(keylet::line(accountID, issue)); if (!line) return accountIsIssuer ? (TER)tesSUCCESS : (TER)tecOBJECT_NOT_FOUND; if (!accountIsIssuer && line->at(sfBalance)->iou() != beast::kZero) @@ -731,13 +733,13 @@ removeEmptyHolding( if (line->isFlag(lsfLowReserve)) { // Clear reserve for low account. - auto sleLowAccount = ctx.view.peek(keylet::account(line->at(sfLowLimit)->getIssuer())); + auto sleLowAccount = view.peek(keylet::account(line->at(sfLowLimit)->getIssuer())); if (!sleLowAccount) return tecINTERNAL; // LCOV_EXCL_LINE - auto const currentLowSponsor = getLedgerEntryReserveSponsor(ctx.view, line, sfLowSponsor); + auto const currentLowSponsor = getLedgerEntryReserveSponsor(view, line, sfLowSponsor); - adjustOwnerCount(ctx.view, sleLowAccount, currentLowSponsor, -1, journal); + adjustOwnerCount(view, sleLowAccount, currentLowSponsor, -1, journal); // It's not really necessary to clear the reserve flag, since the line // is about to be deleted, but this will make the metadata reflect an // accurate state at the time of deletion. @@ -748,13 +750,13 @@ removeEmptyHolding( if (line->isFlag(lsfHighReserve)) { // Clear reserve for high account. - auto sleHighAccount = ctx.view.peek(keylet::account(line->at(sfHighLimit)->getIssuer())); + auto sleHighAccount = view.peek(keylet::account(line->at(sfHighLimit)->getIssuer())); if (!sleHighAccount) return tecINTERNAL; // LCOV_EXCL_LINE - auto const currentHighSponsor = getLedgerEntryReserveSponsor(ctx.view, line, sfHighSponsor); + auto const currentHighSponsor = getLedgerEntryReserveSponsor(view, line, sfHighSponsor); - adjustOwnerCount(ctx.view, sleHighAccount, currentHighSponsor, -1, journal); + adjustOwnerCount(view, sleHighAccount, currentHighSponsor, -1, journal); // It's not really necessary to clear the reserve flag, since the line // is about to be deleted, but this will make the metadata reflect an // accurate state at the time of deletion. @@ -763,11 +765,7 @@ removeEmptyHolding( } return trustDelete( - ctx.view, - line, - line->at(sfLowLimit)->getIssuer(), - line->at(sfHighLimit)->getIssuer(), - journal); + view, line, line->at(sfLowLimit)->getIssuer(), line->at(sfHighLimit)->getIssuer(), journal); } TER