diff --git a/src/libxrpl/tx/transactors/Sponsor/SponsorshipTransfer.cpp b/src/libxrpl/tx/transactors/Sponsor/SponsorshipTransfer.cpp index cd5dc05560..79995c07a9 100644 --- a/src/libxrpl/tx/transactors/Sponsor/SponsorshipTransfer.cpp +++ b/src/libxrpl/tx/transactors/Sponsor/SponsorshipTransfer.cpp @@ -363,7 +363,7 @@ SponsorshipTransfer::preclaim(PreclaimContext const& ctx) } TER -adjustReserveCount( +reduceReserveCount( ApplyView& view, AccountID const& account, AccountID const& sponsor, @@ -371,6 +371,9 @@ adjustReserveCount( { if (delta == 0) return tesSUCCESS; + if (delta > 0) + return tefINTERNAL; // LCOV_EXCL_LINE + auto const sponsorKeylet = keylet::sponsor(sponsor, account); auto const sponsorSle = view.peek(sponsorKeylet); if (!sponsorSle) @@ -459,7 +462,7 @@ SponsorshipTransfer::doApply() if (!hasSignature) { // use ReserveCount for pre-funded sponsoring - if (auto const ter = adjustReserveCount( + if (auto const ter = reduceReserveCount( view(), sponseeAccountID, newSponsorAccountID, -ownerCountDelta); !isTesSuccess(ter)) return ter; @@ -496,22 +499,11 @@ SponsorshipTransfer::doApply() if (!hasSignature) { // use ReserveCount for pre-funded sponsoring - if (auto const ter = adjustReserveCount( + if (auto const ter = reduceReserveCount( view(), sponseeAccountID, newSponsorAccountID, -ownerCountDelta); !isTesSuccess(ter)) return ter; } - - // payback the reserve count if ltSponsorship exists - if (auto const sponsorSle = - view().exists(keylet::sponsor(oldSponsorAccountID, sponseeAccountID)); - sponsorSle) - { - if (auto const ter = adjustReserveCount( - view(), sponseeAccountID, oldSponsorAccountID, ownerCountDelta); - !isTesSuccess(ter)) - return ter; - } } else if (ctx_.tx.isFlag(tfSponsorshipEnd)) { @@ -530,17 +522,6 @@ SponsorshipTransfer::doApply() setSponsorFieldU32(oldSponsorSle, sfSponsoringOwnerCount, -ownerCountDelta); view().update(oldSponsorSle); - // payback the reserve count if ltSponsorship exists - if (auto const sponsorSle = - view().exists(keylet::sponsor(oldSponsorAccountID, sponseeAccountID)); - sponsorSle) - { - if (auto const ter = adjustReserveCount( - view(), sponseeAccountID, oldSponsorAccountID, ownerCountDelta); - !isTesSuccess(ter)) - return ter; - } - // remove sponsor from object objSle->makeFieldAbsent(sponsorField); view().update(objSle); diff --git a/src/test/app/Sponsor_test.cpp b/src/test/app/Sponsor_test.cpp index 511aa55006..c7d2da84fa 100644 --- a/src/test/app/Sponsor_test.cpp +++ b/src/test/app/Sponsor_test.cpp @@ -1223,7 +1223,7 @@ public: BEAST_EXPECT(checkSle->isFieldPresent(sfSponsor)); BEAST_EXPECT(checkSle->getAccountID(sfSponsor) == sponsor2.id()); sponsor1Sle = env.le(keylet::sponsor(sponsor1, alice)); - BEAST_EXPECT(sponsor1Sle->getFieldU32(sfReserveCount) == 100); // paybacked + BEAST_EXPECT(sponsor1Sle->getFieldU32(sfReserveCount) == 99); auto sponsor2Sle = env.le(keylet::sponsor(sponsor2, alice)); BEAST_EXPECT(sponsor2Sle->getFieldU32(sfReserveCount) == 99); @@ -1246,7 +1246,7 @@ public: checkSle = env.le(keylet::unchecked(checkId)); BEAST_EXPECT(!checkSle->isFieldPresent(sfSponsor)); sponsor2Sle = env.le(keylet::sponsor(sponsor2, alice)); - BEAST_EXPECT(sponsor2Sle->getFieldU32(sfReserveCount) == 100); // paybacked + BEAST_EXPECT(sponsor2Sle->getFieldU32(sfReserveCount) == 99); } { @@ -1333,7 +1333,7 @@ public: BEAST_EXPECT(sponsoredOwnerCount(env, alice) == 0); BEAST_EXPECT(sponsoringOwnerCount(env, sponsor) == 0); BEAST_EXPECT( - env.le(keylet::sponsor(sponsor, alice))->getFieldU32(sfReserveCount) == 101); + env.le(keylet::sponsor(sponsor, alice))->getFieldU32(sfReserveCount) == 100); } {