From af9d91bc72fb4881c40e411349508acd5b3a486a Mon Sep 17 00:00:00 2001 From: tequ Date: Mon, 10 Nov 2025 22:22:32 +0900 Subject: [PATCH] add tests fro SponsorshipTransfer --- src/test/app/Sponsor_test.cpp | 75 +++++++++++++------ .../app/tx/detail/SponsorshipTransfer.cpp | 41 ++++++---- 2 files changed, 79 insertions(+), 37 deletions(-) diff --git a/src/test/app/Sponsor_test.cpp b/src/test/app/Sponsor_test.cpp index e293cafad9..e464ff2c70 100644 --- a/src/test/app/Sponsor_test.cpp +++ b/src/test/app/Sponsor_test.cpp @@ -10,6 +10,12 @@ namespace ripple { namespace test { +static STAmount +accountReserve(jtx::Env& env, std::uint32_t count = 1) +{ + return env.current()->fees().reserve * count; +} + static STAmount reserve(jtx::Env& env, std::uint32_t count) { @@ -538,18 +544,19 @@ public: Account const bob("bob"); Account const sponsor1("sponsor1"); Account const sponsor2("sponsor2"); - env.fund(XRP(10000), alice, bob); - env.fund(env.current()->fees().reserve * 2 - 1, sponsor1, sponsor2); - env.close(); + env.fund(XRP(10000), alice, bob, sponsor1, sponsor2); + + adjustAccountXRPBalance( + env, sponsor1, accountReserve(env, 2) - drops(1)); env(sponsor::transfer(alice), sponsor::as(sponsor1, tfSponsorReserve), sig(sfSponsorSignature, sponsor1), ter(tecINSUFFICIENT_RESERVE)); - - env(pay(alice, sponsor1, drops(1))); env.close(); + adjustAccountXRPBalance(env, sponsor1, accountReserve(env, 2)); + env(sponsor::transfer(alice), sponsor::as(sponsor1, tfSponsorReserve), sig(sfSponsorSignature, sponsor1)); @@ -566,14 +573,17 @@ public: BEAST_EXPECT(sle1->getAccountID(sfSponsorAccount) == sponsor1.id()); // transfer sponsor + adjustAccountXRPBalance( + env, sponsor2, accountReserve(env, 2) - drops(1)); + env(sponsor::transfer(alice), sponsor::as(sponsor2, tfSponsorReserve), sig(sfSponsorSignature, sponsor2), ter(tecINSUFFICIENT_RESERVE)); - - env(pay(alice, sponsor2, drops(1))); env.close(); + adjustAccountXRPBalance(env, sponsor2, accountReserve(env, 2)); + env(sponsor::transfer(alice), sponsor::as(sponsor2, tfSponsorReserve), sig(sfSponsorSignature, sponsor2)); @@ -588,29 +598,27 @@ public: BEAST_EXPECT(sponsoringAccountCount(env, alice) == 0); BEAST_EXPECT(sponsoringAccountCount(env, sponsor1) == 0); BEAST_EXPECT(sponsoringAccountCount(env, sponsor2) == 1); + BEAST_EXPECT(!env.le(keylet::account(sponsor1)) + ->isFieldPresent(sfSponsoringAccountCount)); auto const sle2 = env.le(keylet::account(alice)); BEAST_EXPECT(sle2->isFieldPresent(sfSponsorAccount)); BEAST_EXPECT(sle2->getAccountID(sfSponsorAccount) == sponsor2.id()); - // dissolve sponsor - env(pay(alice, - sponsor2, - (env.balance(alice).value() - - env.current()->fees().reserve - XRP(1) + drops(1))), - fee(XRP(1))); + // sponsor 2 accounts + adjustAccountXRPBalance(env, sponsor2, accountReserve(env, 3)); + env(sponsor::transfer(bob), + sponsor::as(sponsor2, tfSponsorReserve), + sig(sfSponsorSignature, sponsor2)); env.close(); - BEAST_EXPECT( - env.balance(alice) == env.current()->fees().reserve - drops(1)); + // dissolve sponsors + adjustAccountXRPBalance( + env, alice, accountReserve(env, 1) - drops(1)); + env(sponsor::transfer(alice), ter(tecINSUFFICIENT_RESERVE)); env.close(); - env(pay(sponsor2, alice, XRP(1))); - env.close(); - - // not sponsored - env(sponsor::transfer(bob), ter(tecNO_PERMISSION)); - env.close(); + adjustAccountXRPBalance(env, alice, accountReserve(env, 1)); env(sponsor::transfer(alice)); env.close(); @@ -623,9 +631,30 @@ public: BEAST_EXPECT(sponsoringOwnerCount(env, sponsor2) == 0); BEAST_EXPECT(sponsoringAccountCount(env, alice) == 0); BEAST_EXPECT(sponsoringAccountCount(env, sponsor1) == 0); - BEAST_EXPECT(sponsoringAccountCount(env, sponsor2) == 0); + BEAST_EXPECT(sponsoringAccountCount(env, sponsor2) == 1); auto const sle3 = env.le(keylet::account(alice)); BEAST_EXPECT(!sle3->isFieldPresent(sfSponsorAccount)); + + env(sponsor::transfer(bob)); + env.close(); + + BEAST_EXPECT(sponsoredOwnerCount(env, bob) == 0); + BEAST_EXPECT(sponsoredOwnerCount(env, sponsor1) == 0); + BEAST_EXPECT(sponsoredOwnerCount(env, sponsor2) == 0); + BEAST_EXPECT(sponsoringOwnerCount(env, bob) == 0); + BEAST_EXPECT(sponsoringOwnerCount(env, sponsor1) == 0); + BEAST_EXPECT(sponsoringOwnerCount(env, sponsor2) == 0); + BEAST_EXPECT(sponsoringAccountCount(env, bob) == 0); + BEAST_EXPECT(sponsoringAccountCount(env, sponsor1) == 0); + BEAST_EXPECT(sponsoringAccountCount(env, sponsor2) == 0); + BEAST_EXPECT(!env.le(keylet::account(sponsor2)) + ->isFieldPresent(sfSponsoringAccountCount)); + auto const sle4 = env.le(keylet::account(bob)); + BEAST_EXPECT(!sle4->isFieldPresent(sfSponsorAccount)); + + // not sponsored + env(sponsor::transfer(bob), ter(tecNO_PERMISSION)); + env.close(); } { // sponsor object @@ -748,6 +777,8 @@ public: BEAST_EXPECT(sponsoringAccountCount(env, alice) == 0); BEAST_EXPECT(sponsoringAccountCount(env, sponsor1) == 0); BEAST_EXPECT(sponsoringAccountCount(env, sponsor2) == 0); + BEAST_EXPECT(!env.le(keylet::account(sponsor2)) + ->isFieldPresent(sfSponsoringOwnerCount)); auto const sle3 = env.le(keylet::unchecked(checkId)); BEAST_EXPECT(!sle3->isFieldPresent(sfSponsorAccount)); } diff --git a/src/xrpld/app/tx/detail/SponsorshipTransfer.cpp b/src/xrpld/app/tx/detail/SponsorshipTransfer.cpp index 6b59f3860a..adde989093 100644 --- a/src/xrpld/app/tx/detail/SponsorshipTransfer.cpp +++ b/src/xrpld/app/tx/detail/SponsorshipTransfer.cpp @@ -294,18 +294,18 @@ SponsorshipTransfer::doApply() else { // update owner's sponsored count - ownerSle->setFieldU32( - sfSponsoredOwnerCount, + auto const newCount = ownerSle->getFieldU32(sfSponsoredOwnerCount) + - ownerCountDelta); + ownerCountDelta; + ownerSle->setFieldU32(sfSponsoredOwnerCount, newCount); view().update(ownerSle); } // increment new sponsoring count auto const newSponsorSle = view().peek(keylet::account(newSponsor)); - newSponsorSle->setFieldU32( - sfSponsoringOwnerCount, + auto const newCount = newSponsorSle->getFieldU32(sfSponsoringOwnerCount) + - ownerCountDelta); + ownerCountDelta; + newSponsorSle->setFieldU32(sfSponsoringOwnerCount, newCount); view().update(newSponsorSle); objSle->setAccountID(sponsorField, newSponsor); @@ -328,10 +328,14 @@ SponsorshipTransfer::doApply() if (auto const oldSponsorSle = view().peek(keylet::account(oldSponsor))) { - oldSponsorSle->setFieldU32( - sfSponsoringOwnerCount, + auto const newCount = oldSponsorSle->getFieldU32(sfSponsoringOwnerCount) - - ownerCountDelta); + ownerCountDelta; + if (newCount == 0) + oldSponsorSle->makeFieldAbsent(sfSponsoringOwnerCount); + else + oldSponsorSle->setFieldU32( + sfSponsoringOwnerCount, newCount); view().update(oldSponsorSle); } @@ -360,9 +364,13 @@ SponsorshipTransfer::doApply() auto const oldSponsor = accSle->getAccountID(sfSponsorAccount); auto const oldSponsorSle = view().peek(keylet::account(oldSponsor)); - oldSponsorSle->setFieldU32( - sfSponsoringAccountCount, - oldSponsorSle->getFieldU32(sfSponsoringAccountCount) - 1); + auto const newCount = + oldSponsorSle->getFieldU32(sfSponsoringAccountCount) - 1; + if (newCount == 0) + oldSponsorSle->makeFieldAbsent(sfSponsoringAccountCount); + else + oldSponsorSle->setFieldU32( + sfSponsoringAccountCount, newCount); view().update(oldSponsorSle); } accSle->setAccountID(sfSponsorAccount, newSponsor); @@ -375,9 +383,12 @@ SponsorshipTransfer::doApply() accSle->makeFieldAbsent(sfSponsorAccount); // decrement account sponsoring count auto const oldSponsorSle = view().peek(keylet::account(oldSponsor)); - oldSponsorSle->setFieldU32( - sfSponsoringAccountCount, - oldSponsorSle->getFieldU32(sfSponsoringAccountCount) - 1); + auto const newCount = + oldSponsorSle->getFieldU32(sfSponsoringAccountCount) - 1; + if (newCount == 0) + oldSponsorSle->makeFieldAbsent(sfSponsoringAccountCount); + else + oldSponsorSle->setFieldU32(sfSponsoringAccountCount, newCount); view().update(oldSponsorSle); } }