From f7e1d4bbb9f3ac8d1cbf022f57b7a50fb3c9da4d Mon Sep 17 00:00:00 2001 From: tequ Date: Sat, 20 Sep 2025 12:20:29 +0900 Subject: [PATCH] add AccountTx tests for Sponsorship --- src/test/rpc/AccountTx_test.cpp | 82 +++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/src/test/rpc/AccountTx_test.cpp b/src/test/rpc/AccountTx_test.cpp index 82809b5c5b..b27646dc2d 100644 --- a/src/test/rpc/AccountTx_test.cpp +++ b/src/test/rpc/AccountTx_test.cpp @@ -835,6 +835,87 @@ class AccountTx_test : public beast::unit_test::suite checkAliceAcctTx(9, jss::Payment); } + void + testSponsorship() + { + // test all sponsored transactions are in sponsor and sponsee's account + // tx list + testcase("Sponsorship"); + + using namespace test::jtx; + Env env(*this); + Account const alice("alice"); + Account const sponsor("sponsor"); + Account const sponsor2("sponsor2"); + env.fund(XRP(10000), alice, sponsor, sponsor2); + env.close(); + + // check the latest sponsorship-related txn is in account tx list + auto const checkTx = [&](Account const& account, + Json::StaticString txType) { + Json::Value params; + params[jss::account] = account.human(); + params[jss::limit] = 100; + auto const jv = + env.rpc("json", "account_tx", to_string(params))[jss::result]; + + auto const& tx0(jv[jss::transactions][0u][jss::tx]); + BEAST_EXPECT(tx0[jss::TransactionType] == txType); + + std::string const txHash{ + env.tx()->getJson(JsonOptions::none)[jss::hash].asString()}; + BEAST_EXPECT(tx0[jss::hash] == txHash); + }; + + // fee sponsorship + env(noop(alice), + sponsor::as(sponsor, tfSponsorFee), + sponsor::sig(sponsor)); + env.close(); + checkTx(alice, jss::AccountSet); + checkTx(sponsor, jss::AccountSet); + + // set sponsor + env(sponsor::set(sponsor, alice, 0, 100, XRP(100)), ter(tesSUCCESS)); + env.close(); + checkTx(alice, jss::SponsorshipSet); + checkTx(sponsor, jss::SponsorshipSet); + + // create a ticket with sponsor + auto const seq = env.seq(alice); + env(ticket::create(alice, 1), sponsor::as(sponsor, tfSponsorReserve)); + env.close(); + checkTx(alice, jss::TicketCreate); + checkTx(sponsor, jss::TicketCreate); + + // transfer object sponsorship + env(sponsor::transfer(alice, keylet::ticket(alice, seq + 1).key), + sponsor::as(sponsor2, tfSponsorReserve), + sponsor::sig(sponsor2)); + env.close(); + checkTx(alice, jss::SponsorshipTransfer); + checkTx(sponsor, jss::SponsorshipTransfer); + checkTx(sponsor2, jss::SponsorshipTransfer); + + // use a ticket + env(noop(alice), + ticket::use(seq + 1), + sponsor::as(sponsor, tfSponsorFee), + sponsor::sig(sponsor)); + env.close(); + checkTx(alice, jss::AccountSet); + checkTx(sponsor, jss::AccountSet); + checkTx(sponsor2, jss::AccountSet); + + // account sponsorship + env(sponsor::transfer(alice), + sponsor::as(sponsor, tfSponsorReserve), + sponsor::sig(sponsor)); + env.close(); + checkTx(alice, jss::SponsorshipTransfer); + checkTx(sponsor, jss::SponsorshipTransfer); + } + public: void run() override @@ -844,6 +925,7 @@ public: testContents(); testAccountDelete(); testMPT(); + testSponsorship(); } }; BEAST_DEFINE_TESTSUITE(AccountTx, rpc, ripple);