From 5512a7bdcd58203195287c25391d4d93eb8381f0 Mon Sep 17 00:00:00 2001 From: Mayukha Vadari Date: Mon, 29 Jun 2026 12:37:31 -0400 Subject: [PATCH] [still WIP] make more progress --- include/xrpl/ledger/ApplyView.h | 13 ++-- .../xrpl/ledger/helpers/AccountRootHelpers.h | 15 +---- include/xrpl/ledger/helpers/OfferHelpers.h | 2 +- src/libxrpl/ledger/ApplyView.cpp | 14 ++++ .../ledger/helpers/AccountRootHelpers.cpp | 64 +++++++++++-------- src/libxrpl/ledger/helpers/OfferHelpers.cpp | 4 +- src/libxrpl/tx/ApplyContext.cpp | 2 +- 7 files changed, 63 insertions(+), 51 deletions(-) diff --git a/include/xrpl/ledger/ApplyView.h b/include/xrpl/ledger/ApplyView.h index 1ea2a32746..e29135629d 100644 --- a/include/xrpl/ledger/ApplyView.h +++ b/include/xrpl/ledger/ApplyView.h @@ -398,7 +398,7 @@ public: emptyDirDelete(Keylet const& directory); }; -struct ReserveTxContext +struct ReserveContext { AccountID const accountID; SLE::pointer accountSle; @@ -411,7 +411,7 @@ struct ReserveTxContext { XRPL_ASSERT( sponsorID.has_value() == !!sponsorSle, - "ReserveTxContext::isSponsored : sponsor existence matches sponsorSle existence"); + "ReserveContext::isSponsored : sponsor existence matches sponsorSle existence"); return sponsorID.has_value(); } @@ -421,8 +421,8 @@ struct ReserveTxContext return !!sponsorshipSle; } - static ReserveTxContext - make(ApplyView& view, STTx const& tx) + static ReserveContext + makeFromTx(ApplyView& view, STTx const& tx) { auto const account = tx[sfAccount]; auto const sponsor = tx[~sfSponsor]; @@ -435,13 +435,16 @@ struct ReserveTxContext sponsor ? view.peek(keylet::sponsorship(*sponsor, account)) : nullptr, }; } + + static ReserveContext + makeFromObject(ApplyView& view, SLE::ref objectSle, SLE::pointer ownerSle); }; struct ApplyViewContext { ApplyView& view; STTx const& tx; - ReserveTxContext reserveContext; + ReserveContext reserveContext; }; namespace directory { diff --git a/include/xrpl/ledger/helpers/AccountRootHelpers.h b/include/xrpl/ledger/helpers/AccountRootHelpers.h index 7de400c55c..7a14b4368f 100644 --- a/include/xrpl/ledger/helpers/AccountRootHelpers.h +++ b/include/xrpl/ledger/helpers/AccountRootHelpers.h @@ -88,24 +88,11 @@ adjustOwnerCount( void adjustOwnerCountObj( - ApplyView& view, - SLE::ref accountSle, + ApplyViewContext& ctx, SLE::ref objectSle, std::int32_t amount, beast::Journal j = beast::Journal{beast::Journal::getNullSink()}); -inline void -adjustOwnerCountObj( - ApplyView& view, - AccountID const& account, - SLE::ref objectSle, - std::int32_t amount, - beast::Journal j = beast::Journal{beast::Journal::getNullSink()}) -{ - SLE::ref accountSle = view.peek(keylet::account(account)); - adjustOwnerCountObj(view, accountSle, objectSle, amount, j); -} - /** Returns IOU issuer transfer fee as Rate. Rate specifies * the fee as fractions of 1 billion. For example, 1% transfer rate * is represented as 1,010,000,000. diff --git a/include/xrpl/ledger/helpers/OfferHelpers.h b/include/xrpl/ledger/helpers/OfferHelpers.h index fc863dff0a..8a9d73746e 100644 --- a/include/xrpl/ledger/helpers/OfferHelpers.h +++ b/include/xrpl/ledger/helpers/OfferHelpers.h @@ -21,6 +21,6 @@ namespace xrpl { */ // [[nodiscard]] // nodiscard commented out so Flow, BookTip and others compile. TER -offerDelete(ApplyView& view, SLE::ref sle, beast::Journal j); +offerDelete(ApplyViewContext& ctx, SLE::ref sle, beast::Journal j); } // namespace xrpl diff --git a/src/libxrpl/ledger/ApplyView.cpp b/src/libxrpl/ledger/ApplyView.cpp index 8575bc2f52..7d7a19484e 100644 --- a/src/libxrpl/ledger/ApplyView.cpp +++ b/src/libxrpl/ledger/ApplyView.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -415,4 +416,17 @@ ApplyView::dirDelete(Keylet const& directory, std::function const sponsorID = + sponsorSle ? sponsorSle->getAccountID(sfAccount) : std::nullopt; + return + { + ownerSle->getAccountID(sfAccount), ownerSle, sponsorID, sponsorSle, + sponsorID ? view.peek(keylet::sponsorship(*sponsorID, account)) : nullptr, + } +} + } // namespace xrpl diff --git a/src/libxrpl/ledger/helpers/AccountRootHelpers.cpp b/src/libxrpl/ledger/helpers/AccountRootHelpers.cpp index dd4d052542..88582479df 100644 --- a/src/libxrpl/ledger/helpers/AccountRootHelpers.cpp +++ b/src/libxrpl/ledger/helpers/AccountRootHelpers.cpp @@ -226,7 +226,7 @@ transferRate(ReadView const& view, AccountID const& issuer) } static void -adjustOwnerCountHlp( +adjustOwnerCountValue( ApplyView& view, SLE::ref sle, SF_UINT32 const& sfield, @@ -244,14 +244,18 @@ adjustOwnerCountHlp( } void -adjustOwnerCount(ApplyViewContext& ctx, std::int32_t adjustment, beast::Journal j) +adjustOwnerCountImpl( + ApplyView& view, + ReserveContext& reserveCtx, + std::int32_t adjustment, + beast::Journal j) { - auto& accountSle = ctx.reserveContext.accountSle; + auto& accountSle = reserveCtx.accountSle; if (!accountSle) Throw("xrpl::adjustOwnerCount : valid account sle"); - auto const sleType = ctx.reserveContext.accountSle->getType(); - bool const validType = ctx.reserveContext.sponsorSle + auto const sleType = reserveCtx.accountSle->getType(); + bool const validType = reserveCtx.sponsorSle ? sleType == ltACCOUNT_ROOT : sleType == ltLOAN_BROKER || sleType == ltACCOUNT_ROOT; if (!validType) @@ -261,54 +265,54 @@ adjustOwnerCount(ApplyViewContext& ctx, std::int32_t adjustment, beast::Journal if (adjustment == 0) return; - if (ctx.reserveContext.isSponsored()) + if (reserveCtx.isSponsored()) { - if (ctx.reserveContext.sponsorSle->getType() != ltACCOUNT_ROOT) + if (reserveCtx.sponsorSle->getType() != ltACCOUNT_ROOT) Throw("xrpl::adjustOwnerCount : valid sponsor sle type"); - adjustOwnerCountHlp( + adjustOwnerCountValue( ctx.view, - ctx.reserveContext.accountSle, + reserveCtx.accountSle, sfSponsoredOwnerCount, - ctx.reserveContext.accountID, + reserveCtx.accountID, adjustment, j); - adjustOwnerCountHlp( + adjustOwnerCountValue( ctx.view, - ctx.reserveContext.sponsorSle, + reserveCtx.sponsorSle, sfSponsoringOwnerCount, - *ctx.reserveContext.sponsorID, + *reserveCtx.sponsorID, adjustment, j); - if (ctx.reserveContext.sponsorshipSle && adjustment > 0) + if (reserveCtx.sponsorshipSle && adjustment > 0) { // update the pre-funded RemainingOwnerCount on Sponsorship ledger object // Remaining owner count moves opposite to adjustment: // +adjustment => consume reserve (-), - adjustOwnerCountHlp( + adjustOwnerCountValue( ctx.view, - ctx.reserveContext.sponsorshipSle, + reserveCtx.sponsorshipSle, sfRemainingOwnerCount, - *ctx.reserveContext.sponsorID, + *reserveCtx.sponsorID, -adjustment, j, false); } } - adjustOwnerCountHlp( - ctx.view, - ctx.reserveContext.accountSle, - sfOwnerCount, - ctx.reserveContext.accountID, - adjustment, - j); + adjustOwnerCountValue( + ctx.view, reserveCtx.accountSle, sfOwnerCount, reserveCtx.accountID, adjustment, j); +} + +void +adjustOwnerCount(ApplyViewContext& ctx, std::int32_t amount, beast::Journal j) +{ + return adjustOwnerCountImpl(ctx.view, ctx.reserveCtx, amount, j); } void adjustOwnerCountObj( - ApplyViewContext& view, - SLE::ref accountSle, + ApplyViewContext& ctx, SLE::ref objectSle, std::int32_t amount, beast::Journal j) @@ -318,8 +322,12 @@ adjustOwnerCountObj( if (objectSle->getType() == ltACCOUNT_ROOT) Throw("xrpl::adjustOwnerCount : valid object sle type"); - SLE::ref sponsorSle = getLedgerEntryReserveSponsor(view, objectSle); - adjustOwnerCount(view, accountSle, sponsorSle, amount, j); + SLE::ref sponsorSle = getLedgerEntryReserveSponsor(ctx.view, objectSle); + adjustOwnerCountImpl( + ctx.view, + ReserveContext::makeFromObj(ctx.view, objectSle, ctx.reserveCtx.accountSle), + amount, + j); } XRPAmount diff --git a/src/libxrpl/ledger/helpers/OfferHelpers.cpp b/src/libxrpl/ledger/helpers/OfferHelpers.cpp index b7b52e82b9..67d85d8371 100644 --- a/src/libxrpl/ledger/helpers/OfferHelpers.cpp +++ b/src/libxrpl/ledger/helpers/OfferHelpers.cpp @@ -15,7 +15,7 @@ namespace xrpl { TER -offerDelete(ApplyView& view, SLE::ref sle, beast::Journal j) +offerDelete(ApplyViewContext& ctx, SLE::ref sle, beast::Journal j) { if (!sle) return tesSUCCESS; @@ -55,7 +55,7 @@ offerDelete(ApplyView& view, SLE::ref sle, beast::Journal j) } } - adjustOwnerCountObj(view, owner, sle, -1, j); + adjustOwnerCountObj(ctx, sle, -1, j); view.erase(sle); diff --git a/src/libxrpl/tx/ApplyContext.cpp b/src/libxrpl/tx/ApplyContext.cpp index 87f00b633f..224c934d05 100644 --- a/src/libxrpl/tx/ApplyContext.cpp +++ b/src/libxrpl/tx/ApplyContext.cpp @@ -42,7 +42,7 @@ ApplyContext::ApplyContext( , flags_(flags) , view_{std::in_place, &base_, flags_} , parentBatchId_(parentBatchId) - , viewCtx_{.view = *view_, .tx = tx, .reserveContext = ReserveTxContext::make(*view_, tx)} + , viewCtx_{.view = *view_, .tx = tx, .reserveContext = ReserveContext::makeFromTx(*view_, tx)} { XRPL_ASSERT( parentBatchId.has_value() == ((flags_ & TapBatch) == TapBatch),