diff --git a/include/xrpl/ledger/helpers/SponsorHelpers.h b/include/xrpl/ledger/helpers/SponsorHelpers.h index 525f109484..f4ab37177a 100644 --- a/include/xrpl/ledger/helpers/SponsorHelpers.h +++ b/include/xrpl/ledger/helpers/SponsorHelpers.h @@ -12,6 +12,12 @@ namespace xrpl { +inline bool +isFeeSponsored(STTx const& tx) +{ + return (tx.getFieldU32(sfSponsorFlags) & spfSponsorFee) != 0u; +} + inline bool isReserveSponsored(STTx const& tx) { @@ -125,13 +131,4 @@ removeSponsorFromLedgerEntry(SLE::ref sle, SF_ACCOUNT const& field = sfSponsor) sle->makeFieldAbsent(field); } -// namespace sponsor -// { -// // Accessing the ledger to check if provided sponsor is valid. -// [[nodiscard]] TER -// valid(ReadView const& view, STTx const& tx, beast::Journal j) -// { -// } -// } - } // namespace xrpl diff --git a/include/xrpl/protocol/TxFlags.h b/include/xrpl/protocol/TxFlags.h index d61e4fc09c..212063b9db 100644 --- a/include/xrpl/protocol/TxFlags.h +++ b/include/xrpl/protocol/TxFlags.h @@ -458,6 +458,7 @@ getAsfFlagMap() inline constexpr FlagValue spfSponsorFee = 1; inline constexpr FlagValue spfSponsorReserve = 2; +inline constexpr FlagValue spfSponsorFlagMask = ~(spfSponsorFee | spfSponsorReserve); } // namespace xrpl diff --git a/src/libxrpl/tx/Transactor.cpp b/src/libxrpl/tx/Transactor.cpp index d0fa4ed3e1..cd92bc4eae 100644 --- a/src/libxrpl/tx/Transactor.cpp +++ b/src/libxrpl/tx/Transactor.cpp @@ -180,13 +180,6 @@ preflight1Sponsor(PreflightContext const& ctx, AccountID const& id) if ((hasSponsor || hasSponsorFlags || hasSponsorSig) && !ctx.rules.enabled(featureSponsor)) return temDISABLED; - if (hasSponsorFlags && - ((ctx.tx.getFieldU32(sfSponsorFlags) & ~(spfSponsorFee | spfSponsorReserve)) != 0u)) - { - JLOG(ctx.j.debug()) << "preflight1: invalid sponsor flags"; - return temINVALID_FLAG; - } - if (!hasSponsor) { if (hasSponsorFlags) @@ -204,7 +197,7 @@ preflight1Sponsor(PreflightContext const& ctx, AccountID const& id) else if (hasSponsorFlags) { auto const sponsorFlags = ctx.tx.getFieldU32(sfSponsorFlags); - if (((sponsorFlags & ~(spfSponsorFee | spfSponsorReserve)) != 0u) || sponsorFlags == 0) + if (((sponsorFlags & spfSponsorFlagMask) != 0u) || sponsorFlags == 0) { JLOG(ctx.j.debug()) << "preflight1: invalid sponsor flags"; return temINVALID_FLAG; @@ -420,14 +413,10 @@ Transactor::checkSponsor(ReadView const& view, STTx const& tx) if (!sponsorshipSle) return terNO_SPONSORSHIP; - auto const sponsorFlags = tx.getFieldU32(sfSponsorFlags); - - if (((sponsorFlags & spfSponsorFee) != 0u) && - sponsorshipSle->isFlag(lsfSponsorshipRequireSignForFee)) + if (isFeeSponsored(tx) && sponsorshipSle->isFlag(lsfSponsorshipRequireSignForFee)) return terNO_SPONSORSHIP; - if (((sponsorFlags & spfSponsorReserve) != 0u) && - sponsorshipSle->isFlag(lsfSponsorshipRequireSignForReserve)) + if (isReserveSponsored(tx) && sponsorshipSle->isFlag(lsfSponsorshipRequireSignForReserve)) return terNO_SPONSORSHIP; return tesSUCCESS; @@ -1324,7 +1313,7 @@ Transactor::reset(XRPAmount fee) FeePayer Transactor::getFeePayer(ReadView const& view, STTx const& tx) { - if (tx.isFieldPresent(sfSponsor) && ((tx.getFieldU32(sfSponsorFlags) & spfSponsorFee) != 0u)) + if (tx.isFieldPresent(sfSponsor) && isFeeSponsored(tx)) { auto const sponsorID = tx.getAccountID(sfSponsor); auto const sponseeID = tx.getAccountID(sfAccount); diff --git a/src/libxrpl/tx/transactors/system/Batch.cpp b/src/libxrpl/tx/transactors/system/Batch.cpp index adddd9de7c..279e2b1ec1 100644 --- a/src/libxrpl/tx/transactors/system/Batch.cpp +++ b/src/libxrpl/tx/transactors/system/Batch.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -214,8 +215,7 @@ Batch::preflight(PreflightContext const& ctx) if (ctx.tx.isFieldPresent(sfSponsorFlags)) { - auto const sponsorFlags = ctx.tx.getFieldU32(sfSponsorFlags); - if ((sponsorFlags & spfSponsorReserve) != 0u) + if (isReserveSponsored(ctx.tx)) { JLOG(ctx.j.debug()) << "BatchTrace[" << parentBatchId << "]:" << "spfSponsorReserve is not allowed on outer Batch.";