replace sponsorshipSet checkPermission with macro

This commit is contained in:
yinyiqian1
2026-06-22 20:58:57 -04:00
parent fba4ba6ebd
commit 494391b4ab
5 changed files with 11 additions and 56 deletions

View File

@@ -353,9 +353,6 @@ getAllTxFlags()
inline constexpr FlagValue tfMPTPaymentMask = ~(tfUniversal | tfPartialPayment);
inline constexpr FlagValue tfTrustSetPermissionMask =
~(tfUniversal | tfSetfAuth | tfSetFreeze | tfClearFreeze);
inline constexpr FlagValue tfSponsorshipSetPermissionMask =
~(tfUniversal | tfSponsorshipSetRequireSignForFee | tfSponsorshipSetRequireSignForReserve |
tfSponsorshipClearRequireSignForFee | tfSponsorshipClearRequireSignForReserve);
// MPTokenIssuanceCreate MutableFlags:
// Indicating specific fields or flags may be changed after issuance.

View File

@@ -74,7 +74,14 @@ GRANULAR_PERMISSION(MPTokenIssuanceUnlock, ttMPTOKEN_ISSUANCE_SET, 65548, tfUniv
{sfHolder, SoeOptional}}))
/** This permission grants the delegated account the ability to set SponsorFee. */
GRANULAR_PERMISSION(SponsorFee, ttSPONSORSHIP_SET, 65549)
GRANULAR_PERMISSION(SponsorFee, ttSPONSORSHIP_SET, 65549,
tfUniversal | tfSponsorshipSetRequireSignForFee | tfSponsorshipClearRequireSignForFee,
({{sfSponsee, SoeOptional},
{sfFeeAmount, SoeOptional},
{sfMaxFee, SoeOptional}}))
/** This permission grants the delegated account the ability to set SponsorReserve. */
GRANULAR_PERMISSION(SponsorReserve, ttSPONSORSHIP_SET, 65550)
GRANULAR_PERMISSION(SponsorReserve, ttSPONSORSHIP_SET, 65550,
tfUniversal | tfSponsorshipSetRequireSignForReserve | tfSponsorshipClearRequireSignForReserve,
({{sfSponsee, SoeOptional},
{sfRemainingOwnerCount, SoeOptional}}))

View File

@@ -19,9 +19,6 @@ public:
static NotTEC
preflight(PreflightContext const& ctx);
static NotTEC
checkPermission(ReadView const& view, STTx const& tx);
static TER
preclaim(PreclaimContext const& ctx);

View File

@@ -7,22 +7,18 @@
#include <xrpl/ledger/ApplyView.h>
#include <xrpl/ledger/ReadView.h>
#include <xrpl/ledger/helpers/AccountRootHelpers.h>
#include <xrpl/ledger/helpers/DelegateHelpers.h>
#include <xrpl/ledger/helpers/DirectoryHelpers.h>
#include <xrpl/ledger/helpers/SponsorHelpers.h>
#include <xrpl/protocol/Indexes.h>
#include <xrpl/protocol/LedgerFormats.h>
#include <xrpl/protocol/Permissions.h>
#include <xrpl/protocol/SField.h>
#include <xrpl/protocol/STAmount.h>
#include <xrpl/protocol/TER.h>
#include <xrpl/protocol/TxFlags.h>
#include <xrpl/protocol/TxFormats.h>
#include <xrpl/tx/Transactor.h>
#include <cstdint>
#include <memory>
#include <unordered_set>
namespace xrpl {
@@ -104,48 +100,6 @@ SponsorshipSet::preflight(PreflightContext const& ctx)
return tesSUCCESS;
}
NotTEC
SponsorshipSet::checkPermission(ReadView const& view, STTx const& tx)
{
auto const delegate = tx[~sfDelegate];
if (!delegate)
return tesSUCCESS;
auto const delegateKey = keylet::delegate(tx[sfAccount], *delegate);
auto const sle = view.read(delegateKey);
if (!sle)
return terNO_DELEGATE_PERMISSION;
if (checkTxPermission(sle, tx) == tesSUCCESS)
return tesSUCCESS;
auto const txFlags = tx.getFlags();
// this is added in case more flags will be added for SponsorshipSet
// in the future. Currently unreachable.
if ((txFlags & tfSponsorshipSetPermissionMask) != 0u)
return terNO_DELEGATE_PERMISSION;
std::unordered_set<GranularPermissionType> granularPermissions;
loadGranularPermission(sle, ttSPONSORSHIP_SET, granularPermissions);
auto const sponsoringFee = tx.isFieldPresent(sfFeeAmount) || tx.isFieldPresent(sfMaxFee) ||
((txFlags & (tfSponsorshipSetRequireSignForFee | tfSponsorshipClearRequireSignForFee)) !=
0u);
auto const sponsoringReserve = tx.isFieldPresent(sfRemainingOwnerCount) ||
((txFlags &
(tfSponsorshipSetRequireSignForReserve | tfSponsorshipClearRequireSignForReserve)) != 0u);
if (sponsoringFee && !granularPermissions.contains(SponsorFee))
return terNO_DELEGATE_PERMISSION;
if (sponsoringReserve && !granularPermissions.contains(SponsorReserve))
return terNO_DELEGATE_PERMISSION;
return tesSUCCESS;
}
TER
SponsorshipSet::preclaim(PreclaimContext const& ctx)
{

View File

@@ -5043,10 +5043,10 @@ public:
sponsor::As(sponsor, spfSponsorReserve));
env.close();
auto const sponsorshipSle = env.le(keylet::sponsor(sponsor, alice));
auto const sponsorshipSle = env.le(keylet::sponsorship(sponsor, alice));
if (!BEAST_EXPECT(sponsorshipSle))
return;
BEAST_EXPECT(sponsorshipSle->getFieldU32(sfReserveCount) == 0);
BEAST_EXPECT(sponsorshipSle->getFieldU32(sfRemainingOwnerCount) == 0);
}
BEAST_EXPECT(env.le(vaultKeylet)->getAccountID(sfSponsor) == sponsor.id());