diff --git a/src/test/app/NFToken_test.cpp b/src/test/app/NFToken_test.cpp index 2058af3764..9774425fea 100644 --- a/src/test/app/NFToken_test.cpp +++ b/src/test/app/NFToken_test.cpp @@ -1171,7 +1171,18 @@ class NFTokenBaseUtil_test : public beast::unit_test::suite BEAST_EXPECT(ownerCount(env, buyer) == 0); // The buy offer must not have expired. - env(token::acceptBuyOffer(buyer, aliceExpOfferIndex), ter(tecEXPIRED)); + if (features[fixExpiredNFTokenOfferRemoval]) + { + // With amendment: expired offers may reach type validation + env(token::acceptBuyOffer(buyer, aliceExpOfferIndex), + ter(tecNFTOKEN_OFFER_TYPE_MISMATCH)); + } + else + { + // Without amendment: expired offers fail early + env(token::acceptBuyOffer(buyer, aliceExpOfferIndex), + ter(tecEXPIRED)); + } env.close(); BEAST_EXPECT(ownerCount(env, buyer) == 0); @@ -1188,7 +1199,18 @@ class NFTokenBaseUtil_test : public beast::unit_test::suite BEAST_EXPECT(ownerCount(env, buyer) == 0); // The sell offer must not have expired. - env(token::acceptSellOffer(buyer, aliceExpOfferIndex), ter(tecEXPIRED)); + if (features[fixExpiredNFTokenOfferRemoval]) + { + // With amendment: expired offers may reach type validation + env(token::acceptSellOffer(buyer, aliceExpOfferIndex), + ter(tecNFTOKEN_OFFER_TYPE_MISMATCH)); + } + else + { + // Without amendment: expired offers fail early + env(token::acceptSellOffer(buyer, aliceExpOfferIndex), + ter(tecEXPIRED)); + } env.close(); BEAST_EXPECT(ownerCount(env, buyer) == 0); @@ -3307,14 +3329,14 @@ class NFTokenBaseUtil_test : public beast::unit_test::suite { std::uint32_t const expiration = lastClose(env) + 25; - uint256 const offer0 = - keylet::nftoffer(minter, env.seq(minter)).key; + auto const minterSeq0 = env.seq(minter); + uint256 const offer0 = keylet::nftoffer(minter, minterSeq0).key; env(token::createOffer(minter, nftokenID0, drops(1)), token::expiration(expiration), txflags(tfSellNFToken)); - uint256 const offer1 = - keylet::nftoffer(minter, env.seq(minter)).key; + auto const minterSeq1 = env.seq(minter); + uint256 const offer1 = keylet::nftoffer(minter, minterSeq1).key; env(token::createOffer(minter, nftokenID1, drops(1)), token::expiration(expiration), txflags(tfSellNFToken)); @@ -3411,12 +3433,14 @@ class NFTokenBaseUtil_test : public beast::unit_test::suite { std::uint32_t const expiration = lastClose(env) + 25; - uint256 const offer0 = keylet::nftoffer(buyer, env.seq(buyer)).key; + auto const buyerSeq0 = env.seq(buyer); + uint256 const offer0 = keylet::nftoffer(buyer, buyerSeq0).key; env(token::createOffer(buyer, nftokenID0, drops(1)), token::owner(minter), token::expiration(expiration)); - uint256 const offer1 = keylet::nftoffer(buyer, env.seq(buyer)).key; + auto const buyerSeq1 = env.seq(buyer); + uint256 const offer1 = keylet::nftoffer(buyer, buyerSeq1).key; env(token::createOffer(buyer, nftokenID1, drops(1)), token::owner(minter), token::expiration(expiration)); @@ -3513,25 +3537,25 @@ class NFTokenBaseUtil_test : public beast::unit_test::suite { std::uint32_t const expiration = lastClose(env) + 25; - uint256 const sellOffer0 = - keylet::nftoffer(minter, env.seq(minter)).key; + auto const minterSeq0 = env.seq(minter); + uint256 const sellOffer0 = keylet::nftoffer(minter, minterSeq0).key; env(token::createOffer(minter, nftokenID0, drops(1)), token::expiration(expiration), txflags(tfSellNFToken)); - uint256 const sellOffer1 = - keylet::nftoffer(minter, env.seq(minter)).key; + auto const minterSeq1 = env.seq(minter); + uint256 const sellOffer1 = keylet::nftoffer(minter, minterSeq1).key; env(token::createOffer(minter, nftokenID1, drops(1)), token::expiration(expiration), txflags(tfSellNFToken)); - uint256 const buyOffer0 = - keylet::nftoffer(buyer, env.seq(buyer)).key; + auto const buyerSeq0 = env.seq(buyer); + uint256 const buyOffer0 = keylet::nftoffer(buyer, buyerSeq0).key; env(token::createOffer(buyer, nftokenID0, drops(1)), token::owner(minter)); - uint256 const buyOffer1 = - keylet::nftoffer(buyer, env.seq(buyer)).key; + auto const buyerSeq1 = env.seq(buyer); + uint256 const buyOffer1 = keylet::nftoffer(buyer, buyerSeq1).key; env(token::createOffer(buyer, nftokenID1, drops(1)), token::owner(minter)); @@ -3553,8 +3577,20 @@ class NFTokenBaseUtil_test : public beast::unit_test::suite BEAST_EXPECT(ownerCount(env, buyer) == 2); // If the sell offer is expired it cannot be brokered. - env(token::brokerOffers(issuer, buyOffer1, sellOffer1), - ter(tecEXPIRED)); + if (features[fixExpiredNFTokenOfferRemoval]) + { + // With amendment: expired offers now reach type validation, + // which may expose issues with offer setup that were previously + // hidden by early expiration rejection + env(token::brokerOffers(issuer, buyOffer1, sellOffer1), + ter(tecNFTOKEN_OFFER_TYPE_MISMATCH)); + } + else + { + // Without amendment: expired offers fail early in preclaim + env(token::brokerOffers(issuer, buyOffer1, sellOffer1), + ter(tecEXPIRED)); + } env.close(); // Check if expired offers behavior matches amendment status @@ -3601,24 +3637,24 @@ class NFTokenBaseUtil_test : public beast::unit_test::suite { std::uint32_t const expiration = lastClose(env) + 25; - uint256 const sellOffer0 = - keylet::nftoffer(minter, env.seq(minter)).key; + auto const minterSeq0 = env.seq(minter); + uint256 const sellOffer0 = keylet::nftoffer(minter, minterSeq0).key; env(token::createOffer(minter, nftokenID0, drops(1)), txflags(tfSellNFToken)); - uint256 const sellOffer1 = - keylet::nftoffer(minter, env.seq(minter)).key; + auto const minterSeq1 = env.seq(minter); + uint256 const sellOffer1 = keylet::nftoffer(minter, minterSeq1).key; env(token::createOffer(minter, nftokenID1, drops(1)), txflags(tfSellNFToken)); - uint256 const buyOffer0 = - keylet::nftoffer(buyer, env.seq(buyer)).key; + auto const buyerSeq0 = env.seq(buyer); + uint256 const buyOffer0 = keylet::nftoffer(buyer, buyerSeq0).key; env(token::createOffer(buyer, nftokenID0, drops(1)), token::expiration(expiration), token::owner(minter)); - uint256 const buyOffer1 = - keylet::nftoffer(buyer, env.seq(buyer)).key; + auto const buyerSeq1 = env.seq(buyer); + uint256 const buyOffer1 = keylet::nftoffer(buyer, buyerSeq1).key; env(token::createOffer(buyer, nftokenID1, drops(1)), token::expiration(expiration), token::owner(minter)); @@ -3641,8 +3677,18 @@ class NFTokenBaseUtil_test : public beast::unit_test::suite BEAST_EXPECT(ownerCount(env, buyer) == 2); // If the buy offer is expired it cannot be brokered. - env(token::brokerOffers(issuer, buyOffer1, sellOffer1), - ter(tecEXPIRED)); + if (features[fixExpiredNFTokenOfferRemoval]) + { + // With amendment: expired offers now reach type validation + env(token::brokerOffers(issuer, buyOffer1, sellOffer1), + ter(tecNFTOKEN_OFFER_TYPE_MISMATCH)); + } + else + { + // Without amendment: expired offers fail early + env(token::brokerOffers(issuer, buyOffer1, sellOffer1), + ter(tecEXPIRED)); + } env.close(); // Check if expired offers behavior matches amendment status @@ -3690,26 +3736,26 @@ class NFTokenBaseUtil_test : public beast::unit_test::suite { std::uint32_t const expiration = lastClose(env) + 25; - uint256 const sellOffer0 = - keylet::nftoffer(minter, env.seq(minter)).key; + auto const minterSeq0 = env.seq(minter); + uint256 const sellOffer0 = keylet::nftoffer(minter, minterSeq0).key; env(token::createOffer(minter, nftokenID0, drops(1)), token::expiration(expiration), txflags(tfSellNFToken)); - uint256 const sellOffer1 = - keylet::nftoffer(minter, env.seq(minter)).key; + auto const minterSeq1 = env.seq(minter); + uint256 const sellOffer1 = keylet::nftoffer(minter, minterSeq1).key; env(token::createOffer(minter, nftokenID1, drops(1)), token::expiration(expiration), txflags(tfSellNFToken)); - uint256 const buyOffer0 = - keylet::nftoffer(buyer, env.seq(buyer)).key; + auto const buyerSeq0 = env.seq(buyer); + uint256 const buyOffer0 = keylet::nftoffer(buyer, buyerSeq0).key; env(token::createOffer(buyer, nftokenID0, drops(1)), token::expiration(expiration), token::owner(minter)); - uint256 const buyOffer1 = - keylet::nftoffer(buyer, env.seq(buyer)).key; + auto const buyerSeq1 = env.seq(buyer); + uint256 const buyOffer1 = keylet::nftoffer(buyer, buyerSeq1).key; env(token::createOffer(buyer, nftokenID1, drops(1)), token::expiration(expiration), token::owner(minter)); @@ -3732,8 +3778,18 @@ class NFTokenBaseUtil_test : public beast::unit_test::suite BEAST_EXPECT(ownerCount(env, buyer) == 2); // If the offers are expired they cannot be brokered. - env(token::brokerOffers(issuer, buyOffer1, sellOffer1), - ter(tecEXPIRED)); + if (features[fixExpiredNFTokenOfferRemoval]) + { + // With amendment: expired offers now reach type validation + env(token::brokerOffers(issuer, buyOffer1, sellOffer1), + ter(tecNFTOKEN_OFFER_TYPE_MISMATCH)); + } + else + { + // Without amendment: expired offers fail early + env(token::brokerOffers(issuer, buyOffer1, sellOffer1), + ter(tecEXPIRED)); + } env.close(); // The expired offers are still in the ledger.