diff --git a/src/ripple/app/tx/impl/NFTokenAcceptOffer.cpp b/src/ripple/app/tx/impl/NFTokenAcceptOffer.cpp index fb5f51c72..07fe9957a 100644 --- a/src/ripple/app/tx/impl/NFTokenAcceptOffer.cpp +++ b/src/ripple/app/tx/impl/NFTokenAcceptOffer.cpp @@ -67,6 +67,9 @@ NFTokenAcceptOffer::preclaim(PreclaimContext const& ctx) -> std::pair, TER> { if (id) { + if (id->isZero()) + return {nullptr, tecOBJECT_NOT_FOUND}; + auto offerSLE = ctx.view.read(keylet::nftoffer(*id)); if (!offerSLE) diff --git a/src/test/app/NFToken_test.cpp b/src/test/app/NFToken_test.cpp index ac86bf749..2fb27f8a3 100644 --- a/src/test/app/NFToken_test.cpp +++ b/src/test/app/NFToken_test.cpp @@ -1130,6 +1130,12 @@ class NFToken_test : public beast::unit_test::suite //---------------------------------------------------------------------- // preclaim + // The buy offer must be non-zero. + env(token::acceptBuyOffer(buyer, beast::zero), + ter(tecOBJECT_NOT_FOUND)); + env.close(); + BEAST_EXPECT(ownerCount(env, buyer) == 0); + // The buy offer must be present in the ledger. uint256 const missingOfferIndex = keylet::nftoffer(alice, 1).key; env(token::acceptBuyOffer(buyer, missingOfferIndex), @@ -1142,6 +1148,12 @@ class NFToken_test : public beast::unit_test::suite env.close(); BEAST_EXPECT(ownerCount(env, buyer) == 0); + // The sell offer must be non-zero. + env(token::acceptSellOffer(buyer, beast::zero), + ter(tecOBJECT_NOT_FOUND)); + env.close(); + BEAST_EXPECT(ownerCount(env, buyer) == 0); + // The sell offer must be present in the ledger. env(token::acceptSellOffer(buyer, missingOfferIndex), ter(tecOBJECT_NOT_FOUND));