From 5cd3b1fb598ce70debc6637d32caee9bae7df4ca Mon Sep 17 00:00:00 2001 From: Bronek Kozicki Date: Thu, 24 Apr 2025 13:26:20 +0100 Subject: [PATCH] Add check in preclaim and extra tests --- src/test/app/MPToken_test.cpp | 9 +++++++++ src/xrpld/app/tx/detail/MPTokenAuthorize.cpp | 8 ++++++-- 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/src/test/app/MPToken_test.cpp b/src/test/app/MPToken_test.cpp index d66d051d65..52b2d7dad8 100644 --- a/src/test/app/MPToken_test.cpp +++ b/src/test/app/MPToken_test.cpp @@ -412,6 +412,9 @@ class MPToken_test : public beast::unit_test::suite // bob creates a mptoken mptAlice.authorize({.account = bob, .holderCount = 1}); + mptAlice.authorize( + {.account = bob, .holderCount = 1, .err = tecDUPLICATE}); + // bob deletes his mptoken mptAlice.authorize( {.account = bob, .holderCount = 0, .flags = tfMPTUnauthorize}); @@ -2303,15 +2306,21 @@ public: // MPTokenIssuanceCreate testCreateValidation(all); + testCreateValidation(all | featureSingleAssetVault); testCreateEnabled(all); + testCreateEnabled(all | featureSingleAssetVault); // MPTokenIssuanceDestroy testDestroyValidation(all); + testDestroyValidation(all | featureSingleAssetVault); testDestroyEnabled(all); + testDestroyEnabled(all | featureSingleAssetVault); // MPTokenAuthorize testAuthorizeValidation(all); + testAuthorizeValidation(all | featureSingleAssetVault); testAuthorizeEnabled(all); + testAuthorizeEnabled(all | featureSingleAssetVault); // MPTokenIssuanceSet testSetValidation(all); diff --git a/src/xrpld/app/tx/detail/MPTokenAuthorize.cpp b/src/xrpld/app/tx/detail/MPTokenAuthorize.cpp index aec5b0f760..ef594bd6c7 100644 --- a/src/xrpld/app/tx/detail/MPTokenAuthorize.cpp +++ b/src/xrpld/app/tx/detail/MPTokenAuthorize.cpp @@ -83,6 +83,10 @@ MPTokenAuthorize::preclaim(PreclaimContext const& ctx) return tecHAS_OBLIGATIONS; } + if (ctx.view.rules().enabled(featureSingleAssetVault) && + sleMpt->isFlag(lsfMPTLocked)) + return tecNO_PERMISSION; + return tesSUCCESS; } @@ -165,7 +169,7 @@ MPTokenAuthorize::authorize( if ((*sleMpt)[sfMPTAmount] != 0) return tecHAS_OBLIGATIONS; if (view.rules().enabled(featureSingleAssetVault) && - (sleMpt->getFlags() & lsfMPTLocked)) + sleMpt->isFlag(lsfMPTLocked)) return tecNO_PERMISSION; if (!view.dirRemove( @@ -199,7 +203,7 @@ MPTokenAuthorize::authorize( return tecINSUFFICIENT_RESERVE; if (sleMpt) - return tecDUPLICATE; + return tecDUPLICATE; // Also returned in preclaim sleMpt = std::make_shared(mptokenKey); if (auto ter = dirLink(view, args.accountID, sleMpt))