add tests fro SponsorshipTransfer

This commit is contained in:
tequ
2025-11-10 22:22:32 +09:00
parent 3f9673510a
commit af9d91bc72
2 changed files with 79 additions and 37 deletions

View File

@@ -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));
}

View File

@@ -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);
}
}