From 1adaeac8a7a2ed22d7156fab25f8dbe1d9cacd11 Mon Sep 17 00:00:00 2001 From: tequ Date: Mon, 23 Mar 2026 12:14:44 +0900 Subject: [PATCH] fix L14 --- src/test/rpc/AccountObjects_test.cpp | 35 +++++++++++++++++++++++ src/xrpld/rpc/handlers/AccountObjects.cpp | 13 ++++++++- 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/src/test/rpc/AccountObjects_test.cpp b/src/test/rpc/AccountObjects_test.cpp index b3a00638cc..9e59197afa 100644 --- a/src/test/rpc/AccountObjects_test.cpp +++ b/src/test/rpc/AccountObjects_test.cpp @@ -1449,6 +1449,41 @@ public: } BEAST_EXPECT(!foundSponsoredTrustLine); } + + // NFT page sponsored filter + { + // Mint an NFT for bob (creates NFT page) + env(token::mint(bob, 0)); + env.close(); + + auto const nftPageKeylet = keylet::nftpage_max(bob); + BEAST_EXPECT(env.le(nftPageKeylet)); + + // Sponsor the NFT page + env(sponsor::transfer(bob, tfSponsorshipCreate, nftPageKeylet.key), + sponsor::as(sponsor1, spfSponsorReserve), + sig(sfSponsorSignature, sponsor1)); + env.close(); + + // Verify NFT page has sponsor field + BEAST_EXPECT(env.le(nftPageKeylet)->isFieldPresent(sfSponsor)); + + // sponsored=true should include the sponsored NFT page + // sponsored=false should NOT include the sponsored NFT page + for (auto const sponsored : {true, false}) + { + auto const resp = acctObjsSponsored(bob.id(), sponsored); + auto const& objs = resp[jss::result][jss::account_objects]; + bool foundNFTPage = false; + for (auto const& obj : objs) + { + if (obj[sfLedgerEntryType.jsonName] == jss::NFTokenPage && + obj.isMember(sfSponsor.jsonName)) + foundNFTPage = true; + } + BEAST_EXPECT(foundNFTPage == sponsored); + } + } } void diff --git a/src/xrpld/rpc/handlers/AccountObjects.cpp b/src/xrpld/rpc/handlers/AccountObjects.cpp index e59c056009..ede0754fc3 100644 --- a/src/xrpld/rpc/handlers/AccountObjects.cpp +++ b/src/xrpld/rpc/handlers/AccountObjects.cpp @@ -239,7 +239,18 @@ getAccountObjects( while (cp) { - jvObjects.append(cp->getJson(JsonOptions::none)); + bool canAppendNFT = true; + if (sponsored.has_value()) + { + std::optional const nftSponsor = + cp->isFieldPresent(sfSponsor) + ? cp->getAccountID(sfSponsor) + : std::optional(std::nullopt); + if (!sponsoredMatchesFilter(sponsored.value(), nftSponsor)) + canAppendNFT = false; + } + if (canAppendNFT) + jvObjects.append(cp->getJson(JsonOptions::none)); auto const npm = (*cp)[~sfNextPageMin]; if (npm) {