fixup! Implement transitive feature enabling for SAV

This commit is contained in:
Ed Hennis
2025-09-30 12:44:24 -04:00
parent 85a80f4b22
commit d7d3741e1e
3 changed files with 50 additions and 26 deletions

View File

@@ -58,7 +58,8 @@ private:
{},
0,
{},
{testable_amendments() - featureSingleAssetVault});
{testable_amendments() - featureSingleAssetVault -
featureLendingProtocol});
// IOU to IOU
testAMM(
@@ -7499,7 +7500,9 @@ private:
};
testCase(
"tecDUPLICATE", testable_amendments() - featureSingleAssetVault);
"tecDUPLICATE",
testable_amendments() - featureSingleAssetVault -
featureLendingProtocol);
testCase(
"terADDRESS_COLLISION",
testable_amendments() | featureSingleAssetVault);
@@ -7881,6 +7884,8 @@ private:
run() override
{
FeatureBitset const all{jtx::testable_amendments()};
FeatureBitset const featuresNoSAV =
all - featureSingleAssetVault - featureLendingProtocol;
testInvalidInstance();
testInstanceCreate();
testInvalidDeposit(all);
@@ -7931,8 +7936,8 @@ private:
testLPTokenBalance(all - fixAMMv1_3);
testLPTokenBalance(all - fixAMMv1_1 - fixAMMv1_3);
testAMMClawback(all);
testAMMClawback(all - featureSingleAssetVault);
testAMMClawback(all - featureAMMClawback - featureSingleAssetVault);
testAMMClawback(featuresNoSAV);
testAMMClawback(featuresNoSAV - featureAMMClawback);
testAMMClawback(all - featureAMMClawback);
testAMMClawback(all - fixAMMv1_1 - fixAMMv1_3 - featureAMMClawback);
testAMMDepositWithFrozenAssets(all);

View File

@@ -1692,17 +1692,33 @@ class Delegate_test : public beast::unit_test::suite
}
}
/// This class only adds a non-explicit ctor for uint256's to FeatureBitset
class BitsetWrapper : public FeatureBitset
{
public:
BitsetWrapper() = default;
template <class... Fs>
BitsetWrapper(uint256 const& f, Fs&&... fs)
: FeatureBitset(f, std::forward<Fs>(fs)...)
{
}
};
void
testTxReqireFeatures(FeatureBitset features)
{
testcase("test delegate disabled tx");
using namespace jtx;
BitsetWrapper const featuresSAV{
featureSingleAssetVault, featureLendingProtocol};
// map of tx and required feature.
// non-delegatable tx are not included.
// NFTokenMint, NFTokenBurn, NFTokenCreateOffer, NFTokenCancelOffer,
// NFTokenAcceptOffer are not included, they are tested separately.
std::unordered_map<std::string, uint256> txRequiredFeatures{
std::unordered_map<std::string, BitsetWrapper> txRequiredFeatures{
{"TicketCreate", featureTicketBatch},
{"CheckCreate", featureChecks},
{"CheckCash", featureChecks},
@@ -1739,12 +1755,12 @@ class Delegate_test : public beast::unit_test::suite
{"NFTokenModify", featureDynamicNFT},
{"PermissionedDomainSet", featurePermissionedDomains},
{"PermissionedDomainDelete", featurePermissionedDomains},
{"VaultCreate", featureSingleAssetVault},
{"VaultSet", featureSingleAssetVault},
{"VaultDelete", featureSingleAssetVault},
{"VaultDeposit", featureSingleAssetVault},
{"VaultWithdraw", featureSingleAssetVault},
{"VaultClawback", featureSingleAssetVault}};
{"VaultCreate", featuresSAV},
{"VaultSet", featuresSAV},
{"VaultDelete", featuresSAV},
{"VaultDeposit", featuresSAV},
{"VaultWithdraw", featuresSAV},
{"VaultClawback", featuresSAV}};
// Can not delegate tx if any required feature disabled.
{
@@ -1762,8 +1778,8 @@ class Delegate_test : public beast::unit_test::suite
env(delegate::set(alice, bob, {tx}), ter(temMALFORMED));
};
for (auto const& tx : txRequiredFeatures)
txAmendmentDisabled(features, tx.first);
for (auto const& required : txRequiredFeatures)
txAmendmentDisabled(features, required.first);
}
// if all the required features in txRequiredFeatures are enabled, will
@@ -1780,8 +1796,8 @@ class Delegate_test : public beast::unit_test::suite
env(delegate::set(alice, bob, {tx}));
};
for (auto const& tx : txRequiredFeatures)
txAmendmentEnabled(tx.first);
for (auto const& required : txRequiredFeatures)
txAmendmentEnabled(required.first);
}
}

View File

@@ -3613,33 +3613,36 @@ public:
using namespace test::jtx;
FeatureBitset const all{testable_amendments()};
auto const featuresNoSAV =
all - featureSingleAssetVault - featureLendingProtocol;
auto const featuresNoDomains = all - featurePermissionedDomains;
// MPTokenIssuanceCreate
testCreateValidation(all - featureSingleAssetVault);
testCreateValidation(all - featurePermissionedDomains);
testCreateValidation(featuresNoSAV);
testCreateValidation(featuresNoDomains);
testCreateValidation(all);
testCreateEnabled(all - featureSingleAssetVault);
testCreateEnabled(featuresNoSAV);
testCreateEnabled(all);
// MPTokenIssuanceDestroy
testDestroyValidation(all - featureSingleAssetVault);
testDestroyValidation(featuresNoSAV);
testDestroyValidation(all);
testDestroyEnabled(all - featureSingleAssetVault);
testDestroyEnabled(featuresNoSAV);
testDestroyEnabled(all);
// MPTokenAuthorize
testAuthorizeValidation(all - featureSingleAssetVault);
testAuthorizeValidation(featuresNoSAV);
testAuthorizeValidation(all);
testAuthorizeEnabled(all - featureSingleAssetVault);
testAuthorizeEnabled(featuresNoSAV);
testAuthorizeEnabled(all);
// MPTokenIssuanceSet
testSetValidation(all - featureSingleAssetVault - featureDynamicMPT);
testSetValidation(all - featureSingleAssetVault);
testSetValidation(featuresNoSAV - featureDynamicMPT);
testSetValidation(featuresNoSAV);
testSetValidation(all - featureDynamicMPT);
testSetValidation(all - featurePermissionedDomains);
testSetValidation(featuresNoDomains);
testSetValidation(all);
testSetEnabled(all - featureSingleAssetVault);
testSetEnabled(featuresNoSAV);
testSetEnabled(all);
// MPT clawback