diff --git a/LedgerFormats_8h_source.html b/LedgerFormats_8h_source.html index 4878ea9b4c..c1e0ac43a4 100644 --- a/LedgerFormats_8h_source.html +++ b/LedgerFormats_8h_source.html @@ -206,14 +206,14 @@ $(document).ready(function() { init_codefold(0); });
188 lsfMPTCanTransfer = 0x00000020,
189 lsfMPTCanClawback = 0x00000040,
190
-
191 lmfMPTCanMutateCanLock = 0x00000002,
-
192 lmfMPTCanMutateRequireAuth = 0x00000004,
-
193 lmfMPTCanMutateCanEscrow = 0x00000008,
-
194 lmfMPTCanMutateCanTrade = 0x00000010,
-
195 lmfMPTCanMutateCanTransfer = 0x00000020,
-
196 lmfMPTCanMutateCanClawback = 0x00000040,
-
197 lmfMPTCanMutateMetadata = 0x00010000,
-
198 lmfMPTCanMutateTransferFee = 0x00020000,
+
191 lsmfMPTCanMutateCanLock = 0x00000002,
+
192 lsmfMPTCanMutateRequireAuth = 0x00000004,
+
193 lsmfMPTCanMutateCanEscrow = 0x00000008,
+
194 lsmfMPTCanMutateCanTrade = 0x00000010,
+
195 lsmfMPTCanMutateCanTransfer = 0x00000020,
+
196 lsmfMPTCanMutateCanClawback = 0x00000040,
+
197 lsmfMPTCanMutateMetadata = 0x00010000,
+
198 lsmfMPTCanMutateTransferFee = 0x00020000,
199
200 // ltMPTOKEN
201 lsfMPTAuthorized = 0x00000002,
@@ -251,8 +251,11 @@ $(document).ready(function() { init_codefold(0); });
ripple
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Definition algorithm.h:25
ripple::LedgerSpecificFlags
LedgerSpecificFlags
Definition LedgerFormats.h:123
ripple::lsfHighDeepFreeze
@ lsfHighDeepFreeze
Definition LedgerFormats.h:168
+
ripple::lsmfMPTCanMutateRequireAuth
@ lsmfMPTCanMutateRequireAuth
Definition LedgerFormats.h:192
ripple::lsfMPTCanTransfer
@ lsfMPTCanTransfer
Definition LedgerFormats.h:188
+
ripple::lsmfMPTCanMutateCanTransfer
@ lsmfMPTCanMutateCanTransfer
Definition LedgerFormats.h:195
ripple::lsfMPTCanTrade
@ lsfMPTCanTrade
Definition LedgerFormats.h:187
+
ripple::lsmfMPTCanMutateCanTrade
@ lsmfMPTCanMutateCanTrade
Definition LedgerFormats.h:194
ripple::lsfRequireDestTag
@ lsfRequireDestTag
Definition LedgerFormats.h:126
ripple::lsfMPTCanEscrow
@ lsfMPTCanEscrow
Definition LedgerFormats.h:186
ripple::lsfOneOwnerCount
@ lsfOneOwnerCount
Definition LedgerFormats.h:173
@@ -266,17 +269,16 @@ $(document).ready(function() { init_codefold(0); });
ripple::lsfAllowTrustLineClawback
@ lsfAllowTrustLineClawback
Definition LedgerFormats.h:150
ripple::lsfLowNoRipple
@ lsfLowNoRipple
Definition LedgerFormats.h:163
ripple::lsfNFTokenBuyOffers
@ lsfNFTokenBuyOffers
Definition LedgerFormats.h:176
-
ripple::lmfMPTCanMutateMetadata
@ lmfMPTCanMutateMetadata
Definition LedgerFormats.h:197
+
ripple::lsmfMPTCanMutateCanEscrow
@ lsmfMPTCanMutateCanEscrow
Definition LedgerFormats.h:193
ripple::lsfMPTCanClawback
@ lsfMPTCanClawback
Definition LedgerFormats.h:189
-
ripple::lmfMPTCanMutateCanTransfer
@ lmfMPTCanMutateCanTransfer
Definition LedgerFormats.h:195
+
ripple::lsmfMPTCanMutateCanClawback
@ lsmfMPTCanMutateCanClawback
Definition LedgerFormats.h:196
ripple::lsfNFTokenSellOffers
@ lsfNFTokenSellOffers
Definition LedgerFormats.h:177
-
ripple::lmfMPTCanMutateTransferFee
@ lmfMPTCanMutateTransferFee
Definition LedgerFormats.h:198
ripple::lsfDisableMaster
@ lsfDisableMaster
Definition LedgerFormats.h:131
ripple::lsfHighReserve
@ lsfHighReserve
Definition LedgerFormats.h:160
-
ripple::lmfMPTCanMutateCanClawback
@ lmfMPTCanMutateCanClawback
Definition LedgerFormats.h:196
+
ripple::lsmfMPTCanMutateMetadata
@ lsmfMPTCanMutateMetadata
Definition LedgerFormats.h:197
ripple::lsfVaultPrivate
@ lsfVaultPrivate
Definition LedgerFormats.h:207
+
ripple::lsmfMPTCanMutateCanLock
@ lsmfMPTCanMutateCanLock
Definition LedgerFormats.h:191
ripple::lsfDepositAuth
@ lsfDepositAuth
Definition LedgerFormats.h:136
-
ripple::lmfMPTCanMutateRequireAuth
@ lmfMPTCanMutateRequireAuth
Definition LedgerFormats.h:192
ripple::lsfAMMNode
@ lsfAMMNode
Definition LedgerFormats.h:169
ripple::lsfDisallowIncomingPayChan
@ lsfDisallowIncomingPayChan
Definition LedgerFormats.h:144
ripple::lsfMPTRequireAuth
@ lsfMPTRequireAuth
Definition LedgerFormats.h:185
@@ -285,18 +287,16 @@ $(document).ready(function() { init_codefold(0); });
ripple::lsfDisallowIncomingNFTokenOffer
@ lsfDisallowIncomingNFTokenOffer
Definition LedgerFormats.h:140
ripple::lsfHybrid
@ lsfHybrid
Definition LedgerFormats.h:156
ripple::lsfMPTAuthorized
@ lsfMPTAuthorized
Definition LedgerFormats.h:201
-
ripple::lmfMPTCanMutateCanLock
@ lmfMPTCanMutateCanLock
Definition LedgerFormats.h:191
ripple::lsfSell
@ lsfSell
Definition LedgerFormats.h:155
ripple::lsfNoFreeze
@ lsfNoFreeze
Definition LedgerFormats.h:132
ripple::lsfGlobalFreeze
@ lsfGlobalFreeze
Definition LedgerFormats.h:133
ripple::lsfLowReserve
@ lsfLowReserve
Definition LedgerFormats.h:159
+
ripple::lsmfMPTCanMutateTransferFee
@ lsmfMPTCanMutateTransferFee
Definition LedgerFormats.h:198
ripple::lsfLowFreeze
@ lsfLowFreeze
Definition LedgerFormats.h:165
ripple::lsfAccepted
@ lsfAccepted
Definition LedgerFormats.h:204
ripple::lsfMPTLocked
@ lsfMPTLocked
Definition LedgerFormats.h:183
ripple::lsfLowDeepFreeze
@ lsfLowDeepFreeze
Definition LedgerFormats.h:167
-
ripple::lmfMPTCanMutateCanEscrow
@ lmfMPTCanMutateCanEscrow
Definition LedgerFormats.h:193
ripple::lsfHighAuth
@ lsfHighAuth
Definition LedgerFormats.h:162
-
ripple::lmfMPTCanMutateCanTrade
@ lmfMPTCanMutateCanTrade
Definition LedgerFormats.h:194
ripple::lsfSellNFToken
@ lsfSellNFToken
Definition LedgerFormats.h:180
ripple::lsfLowAuth
@ lsfLowAuth
Definition LedgerFormats.h:161
ripple::lsfPassive
@ lsfPassive
Definition LedgerFormats.h:154
diff --git a/MPTokenIssuanceSet_8cpp_source.html b/MPTokenIssuanceSet_8cpp_source.html index bb75099479..3754a7bedd 100644 --- a/MPTokenIssuanceSet_8cpp_source.html +++ b/MPTokenIssuanceSet_8cpp_source.html @@ -141,326 +141,330 @@ $(document).ready(function() { init_codefold(0); });
52
53static constexpr std::array<MPTMutabilityFlags, 6> mptMutabilityFlags = {
-
54 {{tmfMPTSetCanLock, tmfMPTClearCanLock, lmfMPTCanMutateCanLock},
-
55 {tmfMPTSetRequireAuth, tmfMPTClearRequireAuth, lmfMPTCanMutateRequireAuth},
-
56 {tmfMPTSetCanEscrow, tmfMPTClearCanEscrow, lmfMPTCanMutateCanEscrow},
-
57 {tmfMPTSetCanTrade, tmfMPTClearCanTrade, lmfMPTCanMutateCanTrade},
-
58 {tmfMPTSetCanTransfer, tmfMPTClearCanTransfer, lmfMPTCanMutateCanTransfer},
-
59 {tmfMPTSetCanClawback,
-
60 tmfMPTClearCanClawback,
-
61 lmfMPTCanMutateCanClawback}}};
+
54 {{tmfMPTSetCanLock, tmfMPTClearCanLock, lsmfMPTCanMutateCanLock},
+
55 {tmfMPTSetRequireAuth,
+
56 tmfMPTClearRequireAuth,
+
57 lsmfMPTCanMutateRequireAuth},
+
58 {tmfMPTSetCanEscrow, tmfMPTClearCanEscrow, lsmfMPTCanMutateCanEscrow},
+
59 {tmfMPTSetCanTrade, tmfMPTClearCanTrade, lsmfMPTCanMutateCanTrade},
+
60 {tmfMPTSetCanTransfer,
+
61 tmfMPTClearCanTransfer,
+
62 lsmfMPTCanMutateCanTransfer},
+
63 {tmfMPTSetCanClawback,
+
64 tmfMPTClearCanClawback,
+
65 lsmfMPTCanMutateCanClawback}}};
-
62
-
63NotTEC
-
-
64MPTokenIssuanceSet::preflight(PreflightContext const& ctx)
-
65{
-
66 auto const mutableFlags = ctx.tx[~sfMutableFlags];
-
67 auto const metadata = ctx.tx[~sfMPTokenMetadata];
-
68 auto const transferFee = ctx.tx[~sfTransferFee];
-
69 auto const isMutate = mutableFlags || metadata || transferFee;
-
70
-
71 if (isMutate && !ctx.rules.enabled(featureDynamicMPT))
-
72 return temDISABLED;
-
73
-
74 if (ctx.tx.isFieldPresent(sfDomainID) && ctx.tx.isFieldPresent(sfHolder))
-
75 return temMALFORMED;
-
76
-
77 auto const txFlags = ctx.tx.getFlags();
-
78
-
79 // fails if both flags are set
-
80 if ((txFlags & tfMPTLock) && (txFlags & tfMPTUnlock))
-
81 return temINVALID_FLAG;
+
66
+
67NotTEC
+
+ +
69{
+
70 auto const mutableFlags = ctx.tx[~sfMutableFlags];
+
71 auto const metadata = ctx.tx[~sfMPTokenMetadata];
+
72 auto const transferFee = ctx.tx[~sfTransferFee];
+
73 auto const isMutate = mutableFlags || metadata || transferFee;
+
74
+
75 if (isMutate && !ctx.rules.enabled(featureDynamicMPT))
+
76 return temDISABLED;
+
77
+
78 if (ctx.tx.isFieldPresent(sfDomainID) && ctx.tx.isFieldPresent(sfHolder))
+
79 return temMALFORMED;
+
80
+
81 auto const txFlags = ctx.tx.getFlags();
82
-
83 auto const accountID = ctx.tx[sfAccount];
-
84 auto const holderID = ctx.tx[~sfHolder];
-
85 if (holderID && accountID == holderID)
-
86 return temMALFORMED;
-
87
-
88 if (ctx.rules.enabled(featureSingleAssetVault) ||
-
89 ctx.rules.enabled(featureDynamicMPT))
-
90 {
-
91 // Is this transaction actually changing anything ?
-
92 if (txFlags == 0 && !ctx.tx.isFieldPresent(sfDomainID) && !isMutate)
-
93 return temMALFORMED;
-
94 }
-
95
-
96 if (ctx.rules.enabled(featureDynamicMPT))
-
97 {
-
98 // Holder field is not allowed when mutating MPTokenIssuance
-
99 if (isMutate && holderID)
-
100 return temMALFORMED;
-
101
-
102 // Can not set flags when mutating MPTokenIssuance
-
103 if (isMutate && (txFlags & tfUniversalMask))
+
83 // fails if both flags are set
+
84 if ((txFlags & tfMPTLock) && (txFlags & tfMPTUnlock))
+
85 return temINVALID_FLAG;
+
86
+
87 auto const accountID = ctx.tx[sfAccount];
+
88 auto const holderID = ctx.tx[~sfHolder];
+
89 if (holderID && accountID == holderID)
+
90 return temMALFORMED;
+
91
+
92 if (ctx.rules.enabled(featureSingleAssetVault) ||
+
93 ctx.rules.enabled(featureDynamicMPT))
+
94 {
+
95 // Is this transaction actually changing anything ?
+
96 if (txFlags == 0 && !ctx.tx.isFieldPresent(sfDomainID) && !isMutate)
+
97 return temMALFORMED;
+
98 }
+
99
+
100 if (ctx.rules.enabled(featureDynamicMPT))
+
101 {
+
102 // Holder field is not allowed when mutating MPTokenIssuance
+
103 if (isMutate && holderID)
104 return temMALFORMED;
105
-
106 if (transferFee && *transferFee > maxTransferFee)
-
107 return temBAD_TRANSFER_FEE;
-
108
-
109 if (metadata && metadata->length() > maxMPTokenMetadataLength)
-
110 return temMALFORMED;
-
111
-
112 if (mutableFlags)
-
113 {
-
114 if (!*mutableFlags ||
-
115 (*mutableFlags & tmfMPTokenIssuanceSetMutableMask))
-
116 return temINVALID_FLAG;
-
117
-
118 // Can not set and clear the same flag
-
119 if (std::any_of(
-
120 mptMutabilityFlags.begin(),
-
121 mptMutabilityFlags.end(),
-
122 [mutableFlags](auto const& f) {
-
123 return (*mutableFlags & f.setFlag) &&
-
124 (*mutableFlags & f.clearFlag);
-
125 }))
-
126 return temINVALID_FLAG;
-
127
-
128 // Trying to set a non-zero TransferFee and clear MPTCanTransfer
-
129 // in the same transaction is not allowed.
-
130 if (transferFee.value_or(0) &&
-
131 (*mutableFlags & tmfMPTClearCanTransfer))
-
132 return temMALFORMED;
-
133 }
-
134 }
-
135
-
136 return tesSUCCESS;
-
137}
+
106 // Can not set flags when mutating MPTokenIssuance
+
107 if (isMutate && (txFlags & tfUniversalMask))
+
108 return temMALFORMED;
+
109
+
110 if (transferFee && *transferFee > maxTransferFee)
+
111 return temBAD_TRANSFER_FEE;
+
112
+
113 if (metadata && metadata->length() > maxMPTokenMetadataLength)
+
114 return temMALFORMED;
+
115
+
116 if (mutableFlags)
+
117 {
+
118 if (!*mutableFlags ||
+
119 (*mutableFlags & tmfMPTokenIssuanceSetMutableMask))
+
120 return temINVALID_FLAG;
+
121
+
122 // Can not set and clear the same flag
+
123 if (std::any_of(
+
124 mptMutabilityFlags.begin(),
+
125 mptMutabilityFlags.end(),
+
126 [mutableFlags](auto const& f) {
+
127 return (*mutableFlags & f.setFlag) &&
+
128 (*mutableFlags & f.clearFlag);
+
129 }))
+
130 return temINVALID_FLAG;
+
131
+
132 // Trying to set a non-zero TransferFee and clear MPTCanTransfer
+
133 // in the same transaction is not allowed.
+
134 if (transferFee.value_or(0) &&
+
135 (*mutableFlags & tmfMPTClearCanTransfer))
+
136 return temMALFORMED;
+
137 }
+
138 }
+
139
+
140 return tesSUCCESS;
+
141}
-
138
-
139TER
-
- -
141{
-
142 auto const delegate = tx[~sfDelegate];
-
143 if (!delegate)
-
144 return tesSUCCESS;
-
145
-
146 auto const delegateKey = keylet::delegate(tx[sfAccount], *delegate);
-
147 auto const sle = view.read(delegateKey);
-
148
-
149 if (!sle)
- -
151
-
152 if (checkTxPermission(sle, tx) == tesSUCCESS)
-
153 return tesSUCCESS;
-
154
-
155 auto const txFlags = tx.getFlags();
-
156
-
157 // this is added in case more flags will be added for MPTokenIssuanceSet
-
158 // in the future. Currently unreachable.
- -
160 return tecNO_DELEGATE_PERMISSION; // LCOV_EXCL_LINE
-
161
- -
163 loadGranularPermission(sle, ttMPTOKEN_ISSUANCE_SET, granularPermissions);
-
164
-
165 if (txFlags & tfMPTLock &&
-
166 !granularPermissions.contains(MPTokenIssuanceLock))
- +
142
+
143TER
+
+ +
145{
+
146 auto const delegate = tx[~sfDelegate];
+
147 if (!delegate)
+
148 return tesSUCCESS;
+
149
+
150 auto const delegateKey = keylet::delegate(tx[sfAccount], *delegate);
+
151 auto const sle = view.read(delegateKey);
+
152
+
153 if (!sle)
+ +
155
+
156 if (checkTxPermission(sle, tx) == tesSUCCESS)
+
157 return tesSUCCESS;
+
158
+
159 auto const txFlags = tx.getFlags();
+
160
+
161 // this is added in case more flags will be added for MPTokenIssuanceSet
+
162 // in the future. Currently unreachable.
+ +
164 return tecNO_DELEGATE_PERMISSION; // LCOV_EXCL_LINE
+
165
+ +
167 loadGranularPermission(sle, ttMPTOKEN_ISSUANCE_SET, granularPermissions);
168
-
169 if (txFlags & tfMPTUnlock &&
-
170 !granularPermissions.contains(MPTokenIssuanceUnlock))
+
169 if (txFlags & tfMPTLock &&
+
170 !granularPermissions.contains(MPTokenIssuanceLock))
172
-
173 return tesSUCCESS;
-
174}
+
173 if (txFlags & tfMPTUnlock &&
+
174 !granularPermissions.contains(MPTokenIssuanceUnlock))
+ +
176
+
177 return tesSUCCESS;
+
178}
-
175
-
176TER
-
- -
178{
-
179 // ensure that issuance exists
-
180 auto const sleMptIssuance =
-
181 ctx.view.read(keylet::mptIssuance(ctx.tx[sfMPTokenIssuanceID]));
-
182 if (!sleMptIssuance)
-
183 return tecOBJECT_NOT_FOUND;
-
184
-
185 if (!sleMptIssuance->isFlag(lsfMPTCanLock))
-
186 {
-
187 // For readability two separate `if` rather than `||` of two conditions
-
188 if (!ctx.view.rules().enabled(featureSingleAssetVault) &&
-
189 !ctx.view.rules().enabled(featureDynamicMPT))
-
190 return tecNO_PERMISSION;
-
191 else if (ctx.tx.isFlag(tfMPTLock) || ctx.tx.isFlag(tfMPTUnlock))
-
192 return tecNO_PERMISSION;
-
193 }
-
194
-
195 // ensure it is issued by the tx submitter
-
196 if ((*sleMptIssuance)[sfIssuer] != ctx.tx[sfAccount])
-
197 return tecNO_PERMISSION;
+
179
+
180TER
+
+ +
182{
+
183 // ensure that issuance exists
+
184 auto const sleMptIssuance =
+
185 ctx.view.read(keylet::mptIssuance(ctx.tx[sfMPTokenIssuanceID]));
+
186 if (!sleMptIssuance)
+
187 return tecOBJECT_NOT_FOUND;
+
188
+
189 if (!sleMptIssuance->isFlag(lsfMPTCanLock))
+
190 {
+
191 // For readability two separate `if` rather than `||` of two conditions
+
192 if (!ctx.view.rules().enabled(featureSingleAssetVault) &&
+
193 !ctx.view.rules().enabled(featureDynamicMPT))
+
194 return tecNO_PERMISSION;
+
195 else if (ctx.tx.isFlag(tfMPTLock) || ctx.tx.isFlag(tfMPTUnlock))
+
196 return tecNO_PERMISSION;
+
197 }
198
-
199 if (auto const holderID = ctx.tx[~sfHolder])
-
200 {
-
201 // make sure holder account exists
-
202 if (!ctx.view.exists(keylet::account(*holderID)))
-
203 return tecNO_DST;
-
204
-
205 // the mptoken must exist
-
206 if (!ctx.view.exists(
-
207 keylet::mptoken(ctx.tx[sfMPTokenIssuanceID], *holderID)))
-
208 return tecOBJECT_NOT_FOUND;
-
209 }
-
210
-
211 if (auto const domain = ctx.tx[~sfDomainID])
-
212 {
-
213 if (not sleMptIssuance->isFlag(lsfMPTRequireAuth))
-
214 return tecNO_PERMISSION;
-
215
-
216 if (*domain != beast::zero)
-
217 {
-
218 auto const sleDomain =
- -
220 if (!sleDomain)
-
221 return tecOBJECT_NOT_FOUND;
-
222 }
-
223 }
-
224
-
225 // sfMutableFlags is soeDEFAULT, defaulting to 0 if not specified on
-
226 // the ledger.
-
227 auto const currentMutableFlags =
-
228 sleMptIssuance->getFieldU32(sfMutableFlags);
-
229
-
230 auto isMutableFlag = [&](std::uint32_t mutableFlag) -> bool {
-
231 return currentMutableFlags & mutableFlag;
-
232 };
+
199 // ensure it is issued by the tx submitter
+
200 if ((*sleMptIssuance)[sfIssuer] != ctx.tx[sfAccount])
+
201 return tecNO_PERMISSION;
+
202
+
203 if (auto const holderID = ctx.tx[~sfHolder])
+
204 {
+
205 // make sure holder account exists
+
206 if (!ctx.view.exists(keylet::account(*holderID)))
+
207 return tecNO_DST;
+
208
+
209 // the mptoken must exist
+
210 if (!ctx.view.exists(
+
211 keylet::mptoken(ctx.tx[sfMPTokenIssuanceID], *holderID)))
+
212 return tecOBJECT_NOT_FOUND;
+
213 }
+
214
+
215 if (auto const domain = ctx.tx[~sfDomainID])
+
216 {
+
217 if (not sleMptIssuance->isFlag(lsfMPTRequireAuth))
+
218 return tecNO_PERMISSION;
+
219
+
220 if (*domain != beast::zero)
+
221 {
+
222 auto const sleDomain =
+ +
224 if (!sleDomain)
+
225 return tecOBJECT_NOT_FOUND;
+
226 }
+
227 }
+
228
+
229 // sfMutableFlags is soeDEFAULT, defaulting to 0 if not specified on
+
230 // the ledger.
+
231 auto const currentMutableFlags =
+
232 sleMptIssuance->getFieldU32(sfMutableFlags);
233
-
234 if (auto const mutableFlags = ctx.tx[~sfMutableFlags])
-
235 {
-
236 if (std::any_of(
-
237 mptMutabilityFlags.begin(),
-
238 mptMutabilityFlags.end(),
-
239 [mutableFlags, &isMutableFlag](auto const& f) {
-
240 return !isMutableFlag(f.canMutateFlag) &&
-
241 ((*mutableFlags & (f.setFlag | f.clearFlag)));
-
242 }))
-
243 return tecNO_PERMISSION;
-
244 }
-
245
-
246 if (!isMutableFlag(lmfMPTCanMutateMetadata) &&
-
247 ctx.tx.isFieldPresent(sfMPTokenMetadata))
-
248 return tecNO_PERMISSION;
+
234 auto isMutableFlag = [&](std::uint32_t mutableFlag) -> bool {
+
235 return currentMutableFlags & mutableFlag;
+
236 };
+
237
+
238 if (auto const mutableFlags = ctx.tx[~sfMutableFlags])
+
239 {
+
240 if (std::any_of(
+
241 mptMutabilityFlags.begin(),
+
242 mptMutabilityFlags.end(),
+
243 [mutableFlags, &isMutableFlag](auto const& f) {
+
244 return !isMutableFlag(f.canMutateFlag) &&
+
245 ((*mutableFlags & (f.setFlag | f.clearFlag)));
+
246 }))
+
247 return tecNO_PERMISSION;
+
248 }
249
-
250 if (auto const fee = ctx.tx[~sfTransferFee])
-
251 {
-
252 // A non-zero TransferFee is only valid if the lsfMPTCanTransfer flag
-
253 // was previously enabled (at issuance or via a prior mutation). Setting
-
254 // it by tmfMPTSetCanTransfer in the current transaction does not meet
-
255 // this requirement.
-
256 if (fee > 0u && !sleMptIssuance->isFlag(lsfMPTCanTransfer))
-
257 return tecNO_PERMISSION;
-
258
-
259 if (!isMutableFlag(lmfMPTCanMutateTransferFee))
-
260 return tecNO_PERMISSION;
-
261 }
+
250 if (!isMutableFlag(lsmfMPTCanMutateMetadata) &&
+
251 ctx.tx.isFieldPresent(sfMPTokenMetadata))
+
252 return tecNO_PERMISSION;
+
253
+
254 if (auto const fee = ctx.tx[~sfTransferFee])
+
255 {
+
256 // A non-zero TransferFee is only valid if the lsfMPTCanTransfer flag
+
257 // was previously enabled (at issuance or via a prior mutation). Setting
+
258 // it by tmfMPTSetCanTransfer in the current transaction does not meet
+
259 // this requirement.
+
260 if (fee > 0u && !sleMptIssuance->isFlag(lsfMPTCanTransfer))
+
261 return tecNO_PERMISSION;
262
-
263 return tesSUCCESS;
-
264}
+
263 if (!isMutableFlag(lsmfMPTCanMutateTransferFee))
+
264 return tecNO_PERMISSION;
+
265 }
+
266
+
267 return tesSUCCESS;
+
268}
-
265
-
266TER
-
- -
268{
-
269 auto const mptIssuanceID = ctx_.tx[sfMPTokenIssuanceID];
-
270 auto const txFlags = ctx_.tx.getFlags();
-
271 auto const holderID = ctx_.tx[~sfHolder];
-
272 auto const domainID = ctx_.tx[~sfDomainID];
- -
274
-
275 if (holderID)
-
276 sle = view().peek(keylet::mptoken(mptIssuanceID, *holderID));
-
277 else
-
278 sle = view().peek(keylet::mptIssuance(mptIssuanceID));
-
279
-
280 if (!sle)
-
281 return tecINTERNAL;
-
282
-
283 std::uint32_t const flagsIn = sle->getFieldU32(sfFlags);
-
284 std::uint32_t flagsOut = flagsIn;
-
285
-
286 if (txFlags & tfMPTLock)
-
287 flagsOut |= lsfMPTLocked;
-
288 else if (txFlags & tfMPTUnlock)
-
289 flagsOut &= ~lsfMPTLocked;
-
290
-
291 if (auto const mutableFlags = ctx_.tx[~sfMutableFlags].value_or(0))
-
292 {
-
293 for (auto const& f : mptMutabilityFlags)
-
294 {
-
295 if (mutableFlags & f.setFlag)
-
296 flagsOut |= f.canMutateFlag;
-
297 else if (mutableFlags & f.clearFlag)
-
298 flagsOut &= ~f.canMutateFlag;
-
299 }
-
300
-
301 if (mutableFlags & tmfMPTClearCanTransfer)
-
302 {
-
303 // If the lsfMPTCanTransfer flag is being cleared, then also clear
-
304 // the TransferFee field.
-
305 sle->makeFieldAbsent(sfTransferFee);
-
306 }
-
307 }
-
308
-
309 if (flagsIn != flagsOut)
-
310 sle->setFieldU32(sfFlags, flagsOut);
-
311
-
312 if (auto const transferFee = ctx_.tx[~sfTransferFee])
-
313 {
-
314 // TransferFee uses soeDEFAULT style:
-
315 // - If the field is absent, it is interpreted as 0.
-
316 // - If the field is present, it must be non-zero.
-
317 // Therefore, when TransferFee is 0, the field should be removed.
-
318 if (transferFee == 0)
-
319 sle->makeFieldAbsent(sfTransferFee);
-
320 else
-
321 sle->setFieldU16(sfTransferFee, *transferFee);
-
322 }
-
323
-
324 if (auto const metadata = ctx_.tx[~sfMPTokenMetadata])
-
325 {
-
326 if (metadata->empty())
-
327 sle->makeFieldAbsent(sfMPTokenMetadata);
-
328 else
-
329 sle->setFieldVL(sfMPTokenMetadata, *metadata);
-
330 }
-
331
-
332 if (domainID)
-
333 {
-
334 // This is enforced in preflight.
-
335 XRPL_ASSERT(
-
336 sle->getType() == ltMPTOKEN_ISSUANCE,
-
337 "MPTokenIssuanceSet::doApply : modifying MPTokenIssuance");
-
338
-
339 if (*domainID != beast::zero)
-
340 {
-
341 sle->setFieldH256(sfDomainID, *domainID);
-
342 }
-
343 else
+
269
+
270TER
+
+ +
272{
+
273 auto const mptIssuanceID = ctx_.tx[sfMPTokenIssuanceID];
+
274 auto const txFlags = ctx_.tx.getFlags();
+
275 auto const holderID = ctx_.tx[~sfHolder];
+
276 auto const domainID = ctx_.tx[~sfDomainID];
+ +
278
+
279 if (holderID)
+
280 sle = view().peek(keylet::mptoken(mptIssuanceID, *holderID));
+
281 else
+
282 sle = view().peek(keylet::mptIssuance(mptIssuanceID));
+
283
+
284 if (!sle)
+
285 return tecINTERNAL;
+
286
+
287 std::uint32_t const flagsIn = sle->getFieldU32(sfFlags);
+
288 std::uint32_t flagsOut = flagsIn;
+
289
+
290 if (txFlags & tfMPTLock)
+
291 flagsOut |= lsfMPTLocked;
+
292 else if (txFlags & tfMPTUnlock)
+
293 flagsOut &= ~lsfMPTLocked;
+
294
+
295 if (auto const mutableFlags = ctx_.tx[~sfMutableFlags].value_or(0))
+
296 {
+
297 for (auto const& f : mptMutabilityFlags)
+
298 {
+
299 if (mutableFlags & f.setFlag)
+
300 flagsOut |= f.canMutateFlag;
+
301 else if (mutableFlags & f.clearFlag)
+
302 flagsOut &= ~f.canMutateFlag;
+
303 }
+
304
+
305 if (mutableFlags & tmfMPTClearCanTransfer)
+
306 {
+
307 // If the lsfMPTCanTransfer flag is being cleared, then also clear
+
308 // the TransferFee field.
+
309 sle->makeFieldAbsent(sfTransferFee);
+
310 }
+
311 }
+
312
+
313 if (flagsIn != flagsOut)
+
314 sle->setFieldU32(sfFlags, flagsOut);
+
315
+
316 if (auto const transferFee = ctx_.tx[~sfTransferFee])
+
317 {
+
318 // TransferFee uses soeDEFAULT style:
+
319 // - If the field is absent, it is interpreted as 0.
+
320 // - If the field is present, it must be non-zero.
+
321 // Therefore, when TransferFee is 0, the field should be removed.
+
322 if (transferFee == 0)
+
323 sle->makeFieldAbsent(sfTransferFee);
+
324 else
+
325 sle->setFieldU16(sfTransferFee, *transferFee);
+
326 }
+
327
+
328 if (auto const metadata = ctx_.tx[~sfMPTokenMetadata])
+
329 {
+
330 if (metadata->empty())
+
331 sle->makeFieldAbsent(sfMPTokenMetadata);
+
332 else
+
333 sle->setFieldVL(sfMPTokenMetadata, *metadata);
+
334 }
+
335
+
336 if (domainID)
+
337 {
+
338 // This is enforced in preflight.
+
339 XRPL_ASSERT(
+
340 sle->getType() == ltMPTOKEN_ISSUANCE,
+
341 "MPTokenIssuanceSet::doApply : modifying MPTokenIssuance");
+
342
+
343 if (*domainID != beast::zero)
344 {
-
345 if (sle->isFieldPresent(sfDomainID))
-
346 sle->makeFieldAbsent(sfDomainID);
-
347 }
-
348 }
-
349
-
350 view().update(sle);
-
351
-
352 return tesSUCCESS;
-
353}
+
345 sle->setFieldH256(sfDomainID, *domainID);
+
346 }
+
347 else
+
348 {
+
349 if (sle->isFieldPresent(sfDomainID))
+
350 sle->makeFieldAbsent(sfDomainID);
+
351 }
+
352 }
+
353
+
354 view().update(sle);
+
355
+
356 return tesSUCCESS;
+
357}
-
354
-
355} // namespace ripple
+
358
+
359} // namespace ripple
T any_of(T... args)
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 TER preclaim(PreclaimContext const &ctx)
-
static NotTEC preflight(PreflightContext const &ctx)
-
static TER checkPermission(ReadView const &view, STTx const &tx)
- +
static TER preclaim(PreclaimContext const &ctx)
+
static NotTEC preflight(PreflightContext const &ctx)
+
static TER checkPermission(ReadView const &view, STTx const &tx)
+
static std::uint32_t getFlagsMask(PreflightContext const &ctx)
static bool checkExtraFeatures(PreflightContext const &ctx)
A view into a ledger.
Definition ReadView.h:51
@@ -492,18 +496,18 @@ $(document).ready(function() { init_codefold(0); });
constexpr std::uint32_t const tmfMPTSetRequireAuth
Definition TxFlags.h:185
constexpr std::uint32_t const tmfMPTClearCanTrade
Definition TxFlags.h:190
constexpr std::uint32_t const tfMPTUnlock
Definition TxFlags.h:177
+
@ lsmfMPTCanMutateRequireAuth
@ lsfMPTCanTransfer
+
@ lsmfMPTCanMutateCanTransfer
+
@ lsmfMPTCanMutateCanTrade
-
@ lmfMPTCanMutateMetadata
-
@ lmfMPTCanMutateCanTransfer
-
@ lmfMPTCanMutateTransferFee
-
@ lmfMPTCanMutateCanClawback
-
@ lmfMPTCanMutateRequireAuth
+
@ lsmfMPTCanMutateCanEscrow
+
@ lsmfMPTCanMutateCanClawback
+
@ lsmfMPTCanMutateMetadata
+
@ lsmfMPTCanMutateCanLock
@ lsfMPTRequireAuth
-
@ lmfMPTCanMutateCanLock
+
@ lsmfMPTCanMutateTransferFee
-
@ lmfMPTCanMutateCanEscrow
-
@ lmfMPTCanMutateCanTrade
constexpr std::uint32_t const tmfMPTClearRequireAuth
Definition TxFlags.h:186
std::uint16_t constexpr maxTransferFee
The maximum token transfer fee allowed.
Definition Protocol.h:82
constexpr std::uint32_t const tmfMPTSetCanLock
Definition TxFlags.h:183
diff --git a/MPTokenIssuanceSet_8h_source.html b/MPTokenIssuanceSet_8h_source.html index 9b18fca571..1c8c58b5b4 100644 --- a/MPTokenIssuanceSet_8h_source.html +++ b/MPTokenIssuanceSet_8h_source.html @@ -144,11 +144,11 @@ $(document).ready(function() { init_codefold(0); });
57#endif
State information when applying a tx.
-
static TER preclaim(PreclaimContext const &ctx)
-
static NotTEC preflight(PreflightContext const &ctx)
+
static TER preclaim(PreclaimContext const &ctx)
+
static NotTEC preflight(PreflightContext const &ctx)
MPTokenIssuanceSet(ApplyContext &ctx)
-
static TER checkPermission(ReadView const &view, STTx const &tx)
- +
static TER checkPermission(ReadView const &view, STTx const &tx)
+
static std::uint32_t getFlagsMask(PreflightContext const &ctx)
static bool checkExtraFeatures(PreflightContext const &ctx)
static constexpr ConsequencesFactoryType ConsequencesFactory
diff --git a/TxFlags_8h_source.html b/TxFlags_8h_source.html index f319d5c811..3974e05687 100644 --- a/TxFlags_8h_source.html +++ b/TxFlags_8h_source.html @@ -212,14 +212,14 @@ $(document).ready(function() { init_codefold(0); });
156
157// MPTokenIssuanceCreate MutableFlags:
158// Indicating specific fields or flags may be changed after issuance.
- - - - - - - - + + + + + + + + @@ -386,21 +386,21 @@ $(document).ready(function() { init_codefold(0); });
constexpr std::uint32_t const tfSellNFToken
Definition TxFlags.h:230
constexpr std::uint32_t const tfNFTokenMintMaskWithMutable
Definition TxFlags.h:226
constexpr std::uint32_t tfOptionalDestTag
Definition TxFlags.h:67
+
@ lsmfMPTCanMutateRequireAuth
@ lsfMPTCanTransfer
+
@ lsmfMPTCanMutateCanTransfer
+
@ lsmfMPTCanMutateCanTrade
@ lsfMPTCanEscrow
-
@ lmfMPTCanMutateMetadata
+
@ lsmfMPTCanMutateCanEscrow
@ lsfMPTCanClawback
-
@ lmfMPTCanMutateCanTransfer
-
@ lmfMPTCanMutateTransferFee
-
@ lmfMPTCanMutateCanClawback
+
@ lsmfMPTCanMutateCanClawback
+
@ lsmfMPTCanMutateMetadata
@ lsfVaultPrivate
-
@ lmfMPTCanMutateRequireAuth
+
@ lsmfMPTCanMutateCanLock
@ lsfMPTRequireAuth
-
@ lmfMPTCanMutateCanLock
-
@ lmfMPTCanMutateCanEscrow
-
@ lmfMPTCanMutateCanTrade
+
@ lsmfMPTCanMutateTransferFee
constexpr std::uint32_t const tfMPTokenIssuanceCreateMask
Definition TxFlags.h:154
constexpr std::uint32_t tfAccountSetMask
Definition TxFlags.h:72
constexpr std::uint32_t const tfNFTokenMintOldMask
Definition TxFlags.h:219
diff --git a/classripple_1_1MPTokenIssuanceSet.html b/classripple_1_1MPTokenIssuanceSet.html index ae3490073d..7348c1ba36 100644 --- a/classripple_1_1MPTokenIssuanceSet.html +++ b/classripple_1_1MPTokenIssuanceSet.html @@ -498,7 +498,7 @@ Static Private Member Functions
-

Definition at line 64 of file MPTokenIssuanceSet.cpp.

+

Definition at line 68 of file MPTokenIssuanceSet.cpp.

@@ -536,7 +536,7 @@ Static Private Member Functions
-

Definition at line 140 of file MPTokenIssuanceSet.cpp.

+

Definition at line 144 of file MPTokenIssuanceSet.cpp.

@@ -564,7 +564,7 @@ Static Private Member Functions
-

Definition at line 177 of file MPTokenIssuanceSet.cpp.

+

Definition at line 181 of file MPTokenIssuanceSet.cpp.

@@ -593,7 +593,7 @@ Static Private Member Functions

Implements ripple::Transactor.

-

Definition at line 267 of file MPTokenIssuanceSet.cpp.

+

Definition at line 271 of file MPTokenIssuanceSet.cpp.

diff --git a/namespacemembers_eval_l.html b/namespacemembers_eval_l.html index 825a45fa9b..795faafb19 100644 --- a/namespacemembers_eval_l.html +++ b/namespacemembers_eval_l.html @@ -74,14 +74,6 @@ $(function() {

- l -