[Claude] make progress

This commit is contained in:
Mayukha Vadari
2025-08-21 19:58:39 -04:00
parent ab71cfb206
commit b5a94445aa

View File

@@ -1171,18 +1171,10 @@ class NFTokenBaseUtil_test : public beast::unit_test::suite
BEAST_EXPECT(ownerCount(env, buyer) == 0); BEAST_EXPECT(ownerCount(env, buyer) == 0);
// The buy offer must not have expired. // The buy offer must not have expired.
if (features[fixExpiredNFTokenOfferRemoval]) // Note: aliceExpOfferIndex is a sell offer, so this should fail with
{ // type mismatch
// With amendment: expired offers may reach type validation env(token::acceptBuyOffer(buyer, aliceExpOfferIndex),
env(token::acceptBuyOffer(buyer, aliceExpOfferIndex), ter(tecNFTOKEN_OFFER_TYPE_MISMATCH));
ter(tecNFTOKEN_OFFER_TYPE_MISMATCH));
}
else
{
// Without amendment: expired offers fail early
env(token::acceptBuyOffer(buyer, aliceExpOfferIndex),
ter(tecEXPIRED));
}
env.close(); env.close();
BEAST_EXPECT(ownerCount(env, buyer) == 0); BEAST_EXPECT(ownerCount(env, buyer) == 0);
@@ -1201,9 +1193,9 @@ class NFTokenBaseUtil_test : public beast::unit_test::suite
// The sell offer must not have expired. // The sell offer must not have expired.
if (features[fixExpiredNFTokenOfferRemoval]) if (features[fixExpiredNFTokenOfferRemoval])
{ {
// With amendment: expired offers may reach type validation // With amendment: expired offers are deleted and return tecEXPIRED
env(token::acceptSellOffer(buyer, aliceExpOfferIndex), env(token::acceptSellOffer(buyer, aliceExpOfferIndex),
ter(tecNFTOKEN_OFFER_TYPE_MISMATCH)); ter(tecEXPIRED));
} }
else else
{ {
@@ -1224,7 +1216,16 @@ class NFTokenBaseUtil_test : public beast::unit_test::suite
env.close(); env.close();
env(pay(gw, buyer, gwAUD(30))); env(pay(gw, buyer, gwAUD(30)));
env.close(); env.close();
BEAST_EXPECT(ownerCount(env, alice) == 7); // Alice's count is 7 without amendment (expired offer still exists),
// 6 with amendment (expired offer was deleted)
if (features[fixExpiredNFTokenOfferRemoval])
{
BEAST_EXPECT(ownerCount(env, alice) == 6);
}
else
{
BEAST_EXPECT(ownerCount(env, alice) == 7);
}
BEAST_EXPECT(ownerCount(env, buyer) == 1); BEAST_EXPECT(ownerCount(env, buyer) == 1);
// We're about to exercise offer brokering, so we need // We're about to exercise offer brokering, so we need
@@ -1314,7 +1315,14 @@ class NFTokenBaseUtil_test : public beast::unit_test::suite
env(token::acceptBuyOffer(buyer, plainOfferIndex), env(token::acceptBuyOffer(buyer, plainOfferIndex),
ter(tecNFTOKEN_OFFER_TYPE_MISMATCH)); ter(tecNFTOKEN_OFFER_TYPE_MISMATCH));
env.close(); env.close();
BEAST_EXPECT(ownerCount(env, alice) == 7); if (features[fixExpiredNFTokenOfferRemoval])
{
BEAST_EXPECT(ownerCount(env, alice) == 6);
}
else
{
BEAST_EXPECT(ownerCount(env, alice) == 7);
}
// An account can't accept its own offer. // An account can't accept its own offer.
env(token::acceptBuyOffer(buyer, buyerOfferIndex), env(token::acceptBuyOffer(buyer, buyerOfferIndex),
@@ -1340,7 +1348,14 @@ class NFTokenBaseUtil_test : public beast::unit_test::suite
env.close(); env.close();
env(token::acceptSellOffer(gw, offerIndex)); env(token::acceptSellOffer(gw, offerIndex));
env.close(); env.close();
BEAST_EXPECT(ownerCount(env, alice) == 7); if (features[fixExpiredNFTokenOfferRemoval])
{
BEAST_EXPECT(ownerCount(env, alice) == 6);
}
else
{
BEAST_EXPECT(ownerCount(env, alice) == 7);
}
} }
env(pay(gw, buyer, gwAUD(30))); env(pay(gw, buyer, gwAUD(30)));
env.close(); env.close();
@@ -1371,7 +1386,14 @@ class NFTokenBaseUtil_test : public beast::unit_test::suite
env(token::acceptSellOffer(alice, buyerOfferIndex), env(token::acceptSellOffer(alice, buyerOfferIndex),
ter(tecNFTOKEN_OFFER_TYPE_MISMATCH)); ter(tecNFTOKEN_OFFER_TYPE_MISMATCH));
env.close(); env.close();
BEAST_EXPECT(ownerCount(env, alice) == 7); if (features[fixExpiredNFTokenOfferRemoval])
{
BEAST_EXPECT(ownerCount(env, alice) == 6);
}
else
{
BEAST_EXPECT(ownerCount(env, alice) == 7);
}
// An account can't accept its own offer. // An account can't accept its own offer.
env(token::acceptSellOffer(alice, plainOfferIndex), env(token::acceptSellOffer(alice, plainOfferIndex),
@@ -1397,7 +1419,14 @@ class NFTokenBaseUtil_test : public beast::unit_test::suite
env.close(); env.close();
env(token::acceptSellOffer(alice, offerIndex)); env(token::acceptSellOffer(alice, offerIndex));
env.close(); env.close();
BEAST_EXPECT(ownerCount(env, alice) == 7); if (features[fixExpiredNFTokenOfferRemoval])
{
BEAST_EXPECT(ownerCount(env, alice) == 6);
}
else
{
BEAST_EXPECT(ownerCount(env, alice) == 7);
}
} }
env(pay(buyer, gw, gwAUD(30))); env(pay(buyer, gw, gwAUD(30)));
env.close(); env.close();
@@ -3579,11 +3608,10 @@ class NFTokenBaseUtil_test : public beast::unit_test::suite
// If the sell offer is expired it cannot be brokered. // If the sell offer is expired it cannot be brokered.
if (features[fixExpiredNFTokenOfferRemoval]) if (features[fixExpiredNFTokenOfferRemoval])
{ {
// With amendment: expired offers now reach type validation, // With amendment: expired offers are deleted and return
// which may expose issues with offer setup that were previously // tecEXPIRED
// hidden by early expiration rejection
env(token::brokerOffers(issuer, buyOffer1, sellOffer1), env(token::brokerOffers(issuer, buyOffer1, sellOffer1),
ter(tecNFTOKEN_OFFER_TYPE_MISMATCH)); ter(tecEXPIRED));
} }
else else
{ {
@@ -3663,7 +3691,7 @@ class NFTokenBaseUtil_test : public beast::unit_test::suite
BEAST_EXPECT(lastClose(env) < expiration); BEAST_EXPECT(lastClose(env) < expiration);
BEAST_EXPECT(ownerCount(env, issuer) == 0); BEAST_EXPECT(ownerCount(env, issuer) == 0);
BEAST_EXPECT(ownerCount(env, minter) == 3); BEAST_EXPECT(ownerCount(env, minter) == 3);
BEAST_EXPECT(ownerCount(env, buyer) == 2); BEAST_EXPECT(ownerCount(env, buyer) == 3);
// An unexpired offer can be brokered. // An unexpired offer can be brokered.
env(token::brokerOffers(issuer, buyOffer0, sellOffer0)); env(token::brokerOffers(issuer, buyOffer0, sellOffer0));
@@ -3679,9 +3707,10 @@ class NFTokenBaseUtil_test : public beast::unit_test::suite
// If the buy offer is expired it cannot be brokered. // If the buy offer is expired it cannot be brokered.
if (features[fixExpiredNFTokenOfferRemoval]) if (features[fixExpiredNFTokenOfferRemoval])
{ {
// With amendment: expired offers now reach type validation // With amendment: expired offers are deleted and return
// tecEXPIRED
env(token::brokerOffers(issuer, buyOffer1, sellOffer1), env(token::brokerOffers(issuer, buyOffer1, sellOffer1),
ter(tecNFTOKEN_OFFER_TYPE_MISMATCH)); ter(tecEXPIRED));
} }
else else
{ {
@@ -3780,9 +3809,10 @@ class NFTokenBaseUtil_test : public beast::unit_test::suite
// If the offers are expired they cannot be brokered. // If the offers are expired they cannot be brokered.
if (features[fixExpiredNFTokenOfferRemoval]) if (features[fixExpiredNFTokenOfferRemoval])
{ {
// With amendment: expired offers now reach type validation // With amendment: expired offers are deleted and return
// tecEXPIRED
env(token::brokerOffers(issuer, buyOffer1, sellOffer1), env(token::brokerOffers(issuer, buyOffer1, sellOffer1),
ter(tecNFTOKEN_OFFER_TYPE_MISMATCH)); ter(tecEXPIRED));
} }
else else
{ {
@@ -8454,20 +8484,25 @@ public:
static FeatureBitset const all{testable_amendments()}; static FeatureBitset const all{testable_amendments()};
static FeatureBitset const fixNFTDir{fixNFTokenDirV1}; static FeatureBitset const fixNFTDir{fixNFTokenDirV1};
static std::array<FeatureBitset, 8> const feats{ static std::array<FeatureBitset, 9> const feats{
all - fixNFTDir - fixNonFungibleTokensV1_2 - fixNFTokenRemint - all - fixNFTDir - fixNonFungibleTokensV1_2 - fixNFTokenRemint -
fixNFTokenReserve - featureNFTokenMintOffer - featureDynamicNFT, fixNFTokenReserve - featureNFTokenMintOffer -
featureDynamicNFT - fixExpiredNFTokenOfferRemoval,
all - disallowIncoming - fixNonFungibleTokensV1_2 - all - disallowIncoming - fixNonFungibleTokensV1_2 -
fixNFTokenRemint - fixNFTokenReserve - featureNFTokenMintOffer - fixNFTokenRemint - fixNFTokenReserve - featureNFTokenMintOffer -
featureDynamicNFT, featureDynamicNFT - fixExpiredNFTokenOfferRemoval,
all - fixNonFungibleTokensV1_2 - fixNFTokenRemint - all - fixNonFungibleTokensV1_2 - fixNFTokenRemint -
fixNFTokenReserve - featureNFTokenMintOffer - featureDynamicNFT, fixNFTokenReserve - featureNFTokenMintOffer -
featureDynamicNFT - fixExpiredNFTokenOfferRemoval,
all - fixNFTokenRemint - fixNFTokenReserve - all - fixNFTokenRemint - fixNFTokenReserve -
featureNFTokenMintOffer - featureDynamicNFT, featureNFTokenMintOffer - featureDynamicNFT -
fixExpiredNFTokenOfferRemoval,
all - fixNFTokenReserve - featureNFTokenMintOffer - all - fixNFTokenReserve - featureNFTokenMintOffer -
featureDynamicNFT, featureDynamicNFT - fixExpiredNFTokenOfferRemoval,
all - featureNFTokenMintOffer - featureDynamicNFT, all - featureNFTokenMintOffer - featureDynamicNFT -
all - featureDynamicNFT, fixExpiredNFTokenOfferRemoval,
all - featureDynamicNFT - fixExpiredNFTokenOfferRemoval,
all - fixExpiredNFTokenOfferRemoval,
all}; all};
if (BEAST_EXPECT(instance < feats.size())) if (BEAST_EXPECT(instance < feats.size()))
@@ -8538,12 +8573,21 @@ class NFTokenWOModify_test : public NFTokenBaseUtil_test
} }
}; };
class NFTokenWOExpiredOfferRemoval_test : public NFTokenBaseUtil_test
{
void
run() override
{
NFTokenBaseUtil_test::run(7);
}
};
class NFTokenAllFeatures_test : public NFTokenBaseUtil_test class NFTokenAllFeatures_test : public NFTokenBaseUtil_test
{ {
void void
run() override run() override
{ {
NFTokenBaseUtil_test::run(7, true); NFTokenBaseUtil_test::run(8, true);
} }
}; };
@@ -8554,6 +8598,7 @@ BEAST_DEFINE_TESTSUITE_PRIO(NFTokenWOTokenRemint, app, ripple, 2);
BEAST_DEFINE_TESTSUITE_PRIO(NFTokenWOTokenReserve, app, ripple, 2); BEAST_DEFINE_TESTSUITE_PRIO(NFTokenWOTokenReserve, app, ripple, 2);
BEAST_DEFINE_TESTSUITE_PRIO(NFTokenWOMintOffer, app, ripple, 2); BEAST_DEFINE_TESTSUITE_PRIO(NFTokenWOMintOffer, app, ripple, 2);
BEAST_DEFINE_TESTSUITE_PRIO(NFTokenWOModify, app, ripple, 2); BEAST_DEFINE_TESTSUITE_PRIO(NFTokenWOModify, app, ripple, 2);
BEAST_DEFINE_TESTSUITE_PRIO(NFTokenWOExpiredOfferRemoval, app, ripple, 2);
BEAST_DEFINE_TESTSUITE_PRIO(NFTokenAllFeatures, app, ripple, 2); BEAST_DEFINE_TESTSUITE_PRIO(NFTokenAllFeatures, app, ripple, 2);
} // namespace ripple } // namespace ripple