add MaxFee test

This commit is contained in:
tequ
2025-09-15 18:52:42 +09:00
parent 1cdf7bb745
commit 110b222579
3 changed files with 108 additions and 23 deletions

View File

@@ -118,24 +118,25 @@ public:
env(sponsor::set(sponsor, sponsor, 0), ter(temMALFORMED));
// Invalid feeAmount
env(sponsor::set(
sponsor, alice, tfSponsorshipClearRequireSignForFee, 0, XRP(1)),
env(sponsor::set_fee(
sponsor, alice, tfSponsorshipClearRequireSignForFee, XRP(1)),
ter(temMALFORMED));
for (auto amt : {XRP(-1), XRP(0), USD(1)})
{
env(sponsor::set(sponsor, alice, 0, 1, amt), ter(temBAD_AMOUNT));
env(sponsor::set_fee(sponsor, alice, 0, amt), ter(temBAD_AMOUNT));
}
// Invalid reserveCount
env(sponsor::set(
env(sponsor::set_reserve(
sponsor, alice, tfSponsorshipClearRequireSignForReserve, 1),
ter(temMALFORMED));
env(sponsor::set(sponsor, alice, 0, 0), ter(temMALFORMED));
env(sponsor::set_reserve(sponsor, alice, 0, 0), ter(temMALFORMED));
// Invalid Delete operation
env(sponsor::set(sponsor, alice, tfDeleteObject, 1), ter(temMALFORMED));
env(sponsor::set(sponsor, alice, tfDeleteObject, std::nullopt, XRP(1)),
env(sponsor::set_reserve(sponsor, alice, tfDeleteObject, 1),
ter(temMALFORMED));
env(sponsor::set_fee(sponsor, alice, tfDeleteObject, XRP(1)),
ter(temMALFORMED));
// TODO: test MaxFee with tfDeleteObject
@@ -590,7 +591,7 @@ public:
BEAST_EXPECT(env.balance(sponsor) == sponsorBalance);
}
env(sponsor::set(sponsor, alice, 0, std::nullopt, XRP(100)));
env(sponsor::set_fee(sponsor, alice, 0, XRP(100)));
env.close();
{
@@ -616,21 +617,51 @@ public:
{
// insufficient balance to pay fee
auto aliceBalance = env.balance(alice);
auto bobBalance = env.balance(bob);
auto sponsorBalance = env.balance(sponsor);
auto sponsorFee = sponsorFeeBalance(sponsor, alice);
{
// > FeeAmount
auto aliceBalance = env.balance(alice);
auto bobBalance = env.balance(bob);
auto sponsorBalance = env.balance(sponsor);
auto sponsorFee = sponsorFeeBalance(sponsor, alice);
env(pay(alice, bob, XRP(100)),
fee(XRP(2000)),
sponsor::as(sponsor, tfSponsorFee),
ter(terINSUF_FEE_B));
env(pay(alice, bob, XRP(100)),
fee(XRP(100) + drops(1)),
sponsor::as(sponsor, tfSponsorFee),
ter(terINSUF_FEE_B));
env.close();
BEAST_EXPECT(env.balance(alice) == aliceBalance);
BEAST_EXPECT(env.balance(bob) == bobBalance);
BEAST_EXPECT(env.balance(sponsor) == sponsorBalance);
BEAST_EXPECT(
sponsorFeeBalance(sponsor, alice) == sponsorFee);
}
// reset FeeAmount and MaxFee
env(sponsor::del(sponsor, alice));
env.close();
env(sponsor::set_fee(sponsor, alice, 0, XRP(10), XRP(1)));
env.close();
BEAST_EXPECT(env.balance(alice) == aliceBalance);
BEAST_EXPECT(env.balance(bob) == bobBalance);
BEAST_EXPECT(env.balance(sponsor) == sponsorBalance);
BEAST_EXPECT(sponsorFeeBalance(sponsor, alice) == sponsorFee);
{
// > MaxFee
auto aliceBalance = env.balance(alice);
auto bobBalance = env.balance(bob);
auto sponsorBalance = env.balance(sponsor);
auto sponsorFee = sponsorFeeBalance(sponsor, alice);
env(pay(alice, bob, XRP(100)),
fee(XRP(1) + drops(1)),
sponsor::as(sponsor, tfSponsorFee),
ter(terINSUF_FEE_B));
env.close();
BEAST_EXPECT(env.balance(alice) == aliceBalance);
BEAST_EXPECT(env.balance(bob) == bobBalance);
BEAST_EXPECT(env.balance(sponsor) == sponsorBalance);
BEAST_EXPECT(
sponsorFeeBalance(sponsor, alice) == sponsorFee);
}
}
{
@@ -640,7 +671,7 @@ public:
auto bobBalance = env.balance(bob);
auto sponsorBalance = env.balance(sponsor);
auto sponsorFee = sponsorFeeBalance(sponsor, alice);
auto const feeAmt = XRP(10);
auto const feeAmt = XRP(1);
env(pay(alice, bob, XRP(20000)),
fee(feeAmt),

View File

@@ -36,7 +36,8 @@ set(jtx::Account const& account,
jtx::Account const& sponsee,
uint32_t flags,
std::optional<uint32_t> reserveCount,
std::optional<STAmount> feeAmount)
std::optional<STAmount> feeAmount,
std::optional<STAmount> maxFee)
{
Json::Value jv;
jv[jss::TransactionType] = jss::SponsorshipSet;
@@ -47,6 +48,43 @@ set(jtx::Account const& account,
jv[sfReserveCount.jsonName] = *reserveCount;
if (feeAmount)
jv[sfFeeAmount.jsonName] = feeAmount->getJson(JsonOptions::none);
if (maxFee)
jv[sfMaxFee.jsonName] = maxFee->getJson(JsonOptions::none);
return jv;
}
Json::Value
set_fee(
jtx::Account const& account,
jtx::Account const& sponsee,
uint32_t flags,
STAmount feeAmount,
std::optional<STAmount> maxFee)
{
Json::Value jv;
jv[jss::TransactionType] = jss::SponsorshipSet;
jv[jss::Account] = account.human();
jv[sfSponsee.jsonName] = sponsee.human();
jv[sfFlags.jsonName] = flags;
jv[sfFeeAmount.jsonName] = feeAmount.getJson(JsonOptions::none);
if (maxFee)
jv[sfMaxFee.jsonName] = maxFee->getJson(JsonOptions::none);
return jv;
}
Json::Value
set_reserve(
jtx::Account const& account,
jtx::Account const& sponsee,
uint32_t flags,
uint32_t reserveCount)
{
Json::Value jv;
jv[jss::TransactionType] = jss::SponsorshipSet;
jv[jss::Account] = account.human();
jv[sfSponsee.jsonName] = sponsee.human();
jv[sfFlags.jsonName] = flags;
jv[sfReserveCount.jsonName] = reserveCount;
return jv;
}

View File

@@ -34,7 +34,23 @@ set(jtx::Account const& account,
jtx::Account const& sponsee,
std::uint32_t flags,
std::optional<std::uint32_t> reserveCount = std::nullopt,
std::optional<STAmount> feeAmount = std::nullopt);
std::optional<STAmount> feeAmount = std::nullopt,
std::optional<STAmount> maxFee = std::nullopt);
Json::Value
set_fee(
jtx::Account const& account,
jtx::Account const& sponsee,
std::uint32_t flags,
STAmount feeAmount,
std::optional<STAmount> maxFee = std::nullopt);
Json::Value
set_reserve(
jtx::Account const& account,
jtx::Account const& sponsee,
std::uint32_t flags,
std::uint32_t reserveCount);
Json::Value
del(jtx::Account const& account, jtx::Account const& sponsee);