1#include <xrpl/protocol/Feature.h>
2#include <xrpl/protocol/LedgerFormats.h>
3#include <xrpl/protocol/TxFlags.h>
4#include <xrpl/tx/transactors/delegate/DelegateUtils.h>
5#include <xrpl/tx/transactors/token/MPTokenIssuanceSet.h>
20 return tfMPTokenIssuanceSetMask;
44 auto const mutableFlags = ctx.
tx[~sfMutableFlags];
45 auto const metadata = ctx.
tx[~sfMPTokenMetadata];
46 auto const transferFee = ctx.
tx[~sfTransferFee];
47 auto const isMutate = mutableFlags || metadata || transferFee;
58 if (((txFlags & tfMPTLock) != 0u) && ((txFlags & tfMPTUnlock) != 0u))
61 auto const accountID = ctx.
tx[sfAccount];
62 auto const holderID = ctx.
tx[~sfHolder];
63 if (holderID && accountID == holderID)
76 if (isMutate && holderID)
98 [mutableFlags](
auto const& f) {
99 return (*mutableFlags & f.setFlag) && (*mutableFlags & f.clearFlag);
116 auto const delegate = tx[~sfDelegate];
121 auto const sle =
view.
read(delegateKey);
133 if ((txFlags & tfMPTokenIssuanceSetMask) != 0u)
139 if (((txFlags & tfMPTLock) != 0u) && !granularPermissions.
contains(MPTokenIssuanceLock))
142 if (((txFlags & tfMPTUnlock) != 0u) && !granularPermissions.
contains(MPTokenIssuanceUnlock))
156 if (!sleMptIssuance->isFlag(lsfMPTCanLock))
171 if ((*sleMptIssuance)[sfIssuer] != ctx.
tx[sfAccount])
174 if (
auto const holderID = ctx.
tx[~sfHolder])
185 if (
auto const domain = ctx.
tx[~sfDomainID])
187 if (not sleMptIssuance->isFlag(lsfMPTRequireAuth))
190 if (*domain != beast::zero)
200 auto const currentMutableFlags = sleMptIssuance->getFieldU32(sfMutableFlags);
202 auto isMutableFlag = [&](
std::uint32_t mutableFlag) ->
bool {
203 return currentMutableFlags & mutableFlag;
206 if (
auto const mutableFlags = ctx.
tx[~sfMutableFlags])
211 [mutableFlags, &isMutableFlag](
auto const& f) {
212 return !isMutableFlag(f.canMutateFlag) &&
213 ((*mutableFlags & (f.setFlag | f.clearFlag)));
218 if (!isMutableFlag(lsmfMPTCanMutateMetadata) && ctx.
tx.
isFieldPresent(sfMPTokenMetadata))
221 if (
auto const fee = ctx.
tx[~sfTransferFee])
227 if (fee > 0u && !sleMptIssuance->isFlag(lsfMPTCanTransfer))
230 if (!isMutableFlag(lsmfMPTCanMutateTransferFee))
240 auto const mptIssuanceID =
ctx_.
tx[sfMPTokenIssuanceID];
242 auto const holderID =
ctx_.
tx[~sfHolder];
243 auto const domainID =
ctx_.
tx[~sfDomainID];
261 if ((txFlags & tfMPTLock) != 0u)
263 flagsOut |= lsfMPTLocked;
265 else if ((txFlags & tfMPTUnlock) != 0u)
267 flagsOut &= ~lsfMPTLocked;
270 if (
auto const mutableFlags =
ctx_.
tx[~sfMutableFlags].value_or(0))
274 if ((mutableFlags & f.setFlag) != 0u)
276 flagsOut |= f.canMutateFlag;
278 else if ((mutableFlags & f.clearFlag) != 0u)
280 flagsOut &= ~f.canMutateFlag;
288 sle->makeFieldAbsent(sfTransferFee);
292 if (flagsIn != flagsOut)
293 sle->setFieldU32(sfFlags, flagsOut);
295 if (
auto const transferFee =
ctx_.
tx[~sfTransferFee])
301 if (transferFee == 0)
303 sle->makeFieldAbsent(sfTransferFee);
307 sle->setFieldU16(sfTransferFee, *transferFee);
311 if (
auto const metadata =
ctx_.
tx[~sfMPTokenMetadata])
313 if (metadata->empty())
315 sle->makeFieldAbsent(sfMPTokenMetadata);
319 sle->setFieldVL(sfMPTokenMetadata, *metadata);
327 sle->getType() == ltMPTOKEN_ISSUANCE,
328 "MPTokenIssuanceSet::doApply : modifying MPTokenIssuance");
330 if (*domainID != beast::zero)
332 sle->setFieldH256(sfDomainID, *domainID);
336 if (sle->isFieldPresent(sfDomainID))
337 sle->makeFieldAbsent(sfDomainID);
virtual void update(std::shared_ptr< SLE > const &sle)=0
Indicate changes to a peeked SLE.
virtual std::shared_ptr< SLE > peek(Keylet const &k)=0
Prepare to modify the SLE associated with key.
static NotTEC preflight(PreflightContext const &ctx)
static bool checkExtraFeatures(PreflightContext const &ctx)
static TER preclaim(PreclaimContext const &ctx)
static std::uint32_t getFlagsMask(PreflightContext const &ctx)
static NotTEC checkPermission(ReadView const &view, STTx const &tx)
virtual Rules const & rules() const =0
Returns the tx processing rules.
virtual bool exists(Keylet const &k) const =0
Determine if a state item exists.
virtual std::shared_ptr< SLE const > read(Keylet const &k) const =0
Return the state item associated with a key.
bool enabled(uint256 const &feature) const
Returns true if a feature is enabled.
bool isFlag(std::uint32_t) const
bool isFieldPresent(SField const &field) const
std::uint32_t getFlags() const
Keylet mptIssuance(std::uint32_t seq, AccountID const &issuer) noexcept
Keylet mptoken(MPTID const &issuanceID, AccountID const &holder) noexcept
Keylet delegate(AccountID const &account, AccountID const &authorizedAccount) noexcept
A keylet for Delegate object.
Keylet account(AccountID const &id) noexcept
AccountID root.
Keylet permissionedDomain(AccountID const &account, std::uint32_t seq) noexcept
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
@ terNO_DELEGATE_PERMISSION
constexpr FlagValue tmfMPTSetCanLock
constexpr FlagValue tmfMPTSetCanClawback
static constexpr std::array< MPTMutabilityFlags, 6 > mptMutabilityFlags
constexpr FlagValue tmfMPTClearCanTrade
std::size_t constexpr maxMPTokenMetadataLength
The maximum length of MPTokenMetadata.
constexpr FlagValue tmfMPTSetCanTrade
constexpr FlagValue tmfMPTClearCanLock
constexpr FlagValue tmfMPTClearCanEscrow
void loadGranularPermission(std::shared_ptr< SLE const > const &delegate, TxType const &type, std::unordered_set< GranularPermissionType > &granularPermissions)
Load the granular permissions granted to the delegate account for the specified transaction type.
constexpr FlagValue tmfMPTSetCanTransfer
constexpr FlagValue tmfMPTSetCanEscrow
constexpr FlagValue tmfMPTClearCanTransfer
NotTEC checkTxPermission(std::shared_ptr< SLE const > const &delegate, STTx const &tx)
Check if the delegate account has permission to execute the transaction.
constexpr FlagValue tmfMPTokenIssuanceSetMutableMask
bool isTesSuccess(TER x) noexcept
constexpr FlagValue tmfMPTClearRequireAuth
std::uint16_t constexpr maxTransferFee
The maximum token transfer fee allowed.
TERSubset< CanCvtToNotTEC > NotTEC
constexpr FlagValue tmfMPTClearCanClawback
constexpr FlagValue tfUniversalMask
constexpr FlagValue tmfMPTSetRequireAuth
std::uint32_t canMutateFlag
State information when determining if a tx is likely to claim a fee.
State information when preflighting a tx.