diff --git a/src/xrpld/app/tx/detail/CreateOffer.cpp b/src/xrpld/app/tx/detail/CreateOffer.cpp index 5bd2752222..86750eb51d 100644 --- a/src/xrpld/app/tx/detail/CreateOffer.cpp +++ b/src/xrpld/app/tx/detail/CreateOffer.cpp @@ -56,9 +56,12 @@ CreateOffer::checkExtraFeatures(PreflightContext const& ctx) std::uint32_t CreateOffer::getFlagsMask(PreflightContext const& ctx) { - if (ctx.rules.enabled(featurePermissionedDEX) && - ctx.tx.isFieldPresent(sfDomainID)) + // The tfOfferCreateMask is built assuming that PermissionedDEX is + // enabled + if (ctx.rules.enabled(featurePermissionedDEX)) return tfOfferCreateMask; + // If PermissionedDEX is not enabled, add tfHybrid to the mask, + // indicating it is not allowed. return tfOfferCreateMask | tfHybrid; } @@ -70,6 +73,9 @@ CreateOffer::preflight(PreflightContext const& ctx) std::uint32_t const uTxFlags = tx.getFlags(); + if (tx.isFlag(tfHybrid) && !tx.isFieldPresent(sfDomainID)) + return temINVALID_FLAG; + bool const bImmediateOrCancel(uTxFlags & tfImmediateOrCancel); bool const bFillOrKill(uTxFlags & tfFillOrKill); diff --git a/src/xrpld/app/tx/detail/DeleteAccount.cpp b/src/xrpld/app/tx/detail/DeleteAccount.cpp index 364a53b50b..565d938c83 100644 --- a/src/xrpld/app/tx/detail/DeleteAccount.cpp +++ b/src/xrpld/app/tx/detail/DeleteAccount.cpp @@ -44,8 +44,11 @@ DeleteAccount::checkExtraFeatures(PreflightContext const& ctx) if (!ctx.rules.enabled(featureDeletableAccounts)) return false; - return !ctx.tx.isFieldPresent(sfCredentialIDs) || - ctx.rules.enabled(featureCredentials); + if (ctx.tx.isFieldPresent(sfCredentialIDs) && + !ctx.rules.enabled(featureCredentials)) + return false; + + return true; } NotTEC diff --git a/src/xrpld/app/tx/detail/DepositPreauth.cpp b/src/xrpld/app/tx/detail/DepositPreauth.cpp index bbbec3cbe7..236b59a173 100644 --- a/src/xrpld/app/tx/detail/DepositPreauth.cpp +++ b/src/xrpld/app/tx/detail/DepositPreauth.cpp @@ -36,10 +36,12 @@ DepositPreauth::checkExtraFeatures(PreflightContext const& ctx) bool const authArrPresent = ctx.tx.isFieldPresent(sfAuthorizeCredentials); bool const unauthArrPresent = ctx.tx.isFieldPresent(sfUnauthorizeCredentials); - int const authCredPresent = - static_cast(authArrPresent) + static_cast(unauthArrPresent); + bool const authCredPresent = authArrPresent || unauthArrPresent; - return !authCredPresent || ctx.rules.enabled(featureCredentials); + if (authCredPresent && !ctx.rules.enabled(featureCredentials)) + return false; + + return true; } NotTEC