From 2fd8e1be3c81ed816f3b808314b626c707a32d47 Mon Sep 17 00:00:00 2001 From: tequ Date: Wed, 18 Feb 2026 15:55:10 +0900 Subject: [PATCH] audit 12 --- .../Sponsor/SponsorshipTransfer.cpp | 4 +- src/test/app/Sponsor_test.cpp | 49 +++++++++++++++++++ 2 files changed, 51 insertions(+), 2 deletions(-) diff --git a/src/libxrpl/tx/transactors/Sponsor/SponsorshipTransfer.cpp b/src/libxrpl/tx/transactors/Sponsor/SponsorshipTransfer.cpp index 2d13c1c1f8..a11891d8c8 100644 --- a/src/libxrpl/tx/transactors/Sponsor/SponsorshipTransfer.cpp +++ b/src/libxrpl/tx/transactors/Sponsor/SponsorshipTransfer.cpp @@ -346,7 +346,7 @@ SponsorshipTransfer::doApply() else { // dissolve object sponsor - auto const oldSponsor = objSle->getAccountID(sfSponsor); + auto const oldSponsor = objSle->getAccountID(sponsorField); auto const oldSponsorSle = view().peek(keylet::account(oldSponsor)); if (!oldSponsorSle) return tefINTERNAL; // LCOV_EXCL_LINE @@ -367,7 +367,7 @@ SponsorshipTransfer::doApply() return ter; // remove sponsor from object - objSle->makeFieldAbsent(sfSponsor); + objSle->makeFieldAbsent(sponsorField); view().update(objSle); } } diff --git a/src/test/app/Sponsor_test.cpp b/src/test/app/Sponsor_test.cpp index 6a619830f7..a40a56436f 100644 --- a/src/test/app/Sponsor_test.cpp +++ b/src/test/app/Sponsor_test.cpp @@ -873,6 +873,55 @@ public: BEAST_EXPECT(sponsor2Sle->getFieldU32(sfReserveCount) == 100); // paybacked } + { + // sponsor trustline + Account const alice("alice"); + Account const bob("bob"); + Account const sponsor("sponsor"); + + auto const& highAcc = alice > bob ? alice : bob; + auto const& lowAcc = alice > bob ? bob : alice; + + for (bool isIssuerHigh : {false, true}) + { + Env env{*this, testable_amendments()}; + env.fund(XRP(10000), alice, bob, sponsor); + env.close(); + + auto const& issuer = isIssuerHigh ? highAcc : lowAcc; + auto const& user = isIssuerHigh ? lowAcc : highAcc; + + auto const USD = issuer["USD"]; + auto const currency = USD.currency; + + env(trust(user, issuer["USD"](100))); + env.close(); + + auto const trustId = keylet::line(user, issuer, currency); + BEAST_EXPECT(env.le(trustId)); + + // transfer sponsor + env(sponsor::transfer(user, trustId.key), + sponsor::as(sponsor, tfSponsorReserve), + sig(sfSponsorSignature, sponsor)); + env.close(); + + BEAST_EXPECT(env.le(trustId)); + + BEAST_EXPECT( + env.le(trustId)->getAccountID(isIssuerHigh ? sfLowSponsor : sfHighSponsor) == sponsor.id()); + BEAST_EXPECT(!env.le(trustId)->isFieldPresent(isIssuerHigh ? sfHighSponsor : sfLowSponsor)); + + // dissolve sponsor + env(sponsor::transfer(user, trustId.key)); + env.close(); + + BEAST_EXPECT(env.le(trustId)); + BEAST_EXPECT(!env.le(trustId)->isFieldPresent(isIssuerHigh ? sfLowSponsor : sfHighSponsor)); + BEAST_EXPECT(!env.le(trustId)->isFieldPresent(isIssuerHigh ? sfHighSponsor : sfLowSponsor)); + } + } + { // invalid transfer Env env{*this, testable_amendments()};