Skip to content

Commit af3233c

Browse files
committed
add a temp amendment & fix warning
1 parent 73cea92 commit af3233c

File tree

3 files changed

+19
-4
lines changed

3 files changed

+19
-4
lines changed

include/xrpl/protocol/detail/features.macro

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
// Add new amendments to the top of this list.
1717
// Keep it sorted in reverse chronological order.
1818

19+
XRPL_FIX (MPTLockedAmount, Supported::no, VoteBehavior::DefaultNo)
1920
XRPL_FIX (PermissionedDomainInvariant, Supported::yes, VoteBehavior::DefaultNo)
2021
XRPL_FIX (ExpiredNFTokenOfferRemoval, Supported::yes, VoteBehavior::DefaultNo)
2122
XRPL_FIX (BatchInnerSigs, Supported::no, VoteBehavior::DefaultNo)

src/libxrpl/ledger/helpers/MPTokenHelpers.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,8 @@ authorizeMPToken(
154154
auto const mptokenKey = keylet::mptoken(mptIssuanceID, account);
155155
auto const sleMpt = view.peek(mptokenKey);
156156
if (!sleMpt || (*sleMpt)[sfMPTAmount] != 0 ||
157-
(*sleMpt)[~sfLockedAmount].value_or(0) != 0)
157+
(view.rules().enabled(fixMPTLockedAmount) &&
158+
(*sleMpt)[~sfLockedAmount].value_or(0) != 0))
158159
return tecINTERNAL; // LCOV_EXCL_LINE
159160

160161
if (!view.dirRemove(
@@ -267,7 +268,8 @@ removeEmptyHolding(
267268
// balance, it can not just be deleted, because that will throw the issuance
268269
// accounting out of balance, so fail. Since this should be impossible
269270
// anyway, I'm not going to put any effort into it.
270-
if (mptoken->at(sfMPTAmount) != 0 || (*mptoken)[~sfLockedAmount].value_or(0) != 0)
271+
if (mptoken->at(sfMPTAmount) != 0 ||
272+
(view.rules().enabled(fixMPTLockedAmount) && (*mptoken)[~sfLockedAmount].value_or(0) != 0))
271273
return tecHAS_OBLIGATIONS;
272274

273275
return authorizeMPToken(

src/test/app/Vault_test.cpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5237,15 +5237,20 @@ class Vault_test : public beast::unit_test::suite
52375237
testcase("removeEmptyHolding deletes MPToken with sfLockedAmount");
52385238
using namespace test::jtx;
52395239
using namespace std::literals;
5240-
Env env{*this, testable_amendments() | featureSingleAssetVault};
5240+
5241+
Env env{*this, testable_amendments() | featureSingleAssetVault | fixMPTLockedAmount};
52415242
auto const baseFee = env.current()->fees().base;
5243+
52425244
Account const issuer{"issuer"};
52435245
Account const owner{"owner"};
52445246
Account const depositor{"depositor"};
52455247
Account const bob{"bob"};
5248+
52465249
env.fund(XRP(100000), issuer, owner, depositor, bob);
52475250
env.close();
5251+
52485252
Vault vault{env};
5253+
52495254
// Create an MPT asset for the vault
52505255
MPTTester mptt{env, issuer, mptInitNoFund};
52515256
mptt.create({.flags = tfMPTCanTransfer | tfMPTCanLock});
@@ -5254,42 +5259,49 @@ class Vault_test : public beast::unit_test::suite
52545259
mptt.authorize({.account = depositor});
52555260
env(pay(issuer, depositor, asset(1000)));
52565261
env.close();
5262+
52575263
// Create vault
52585264
auto [tx, keylet] = vault.create({.owner = owner, .asset = asset});
52595265
env(tx);
52605266
env.close();
5267+
52615268
auto const vaultSle = env.le(keylet);
52625269
BEAST_EXPECT(vaultSle != nullptr);
52635270
auto const shareMptID = vaultSle->at(sfShareMPTID);
52645271
MPTIssue const shareIssue{shareMptID};
5272+
52655273
// Depositor deposits 1000 asset units into vault, receiving shares
52665274
env(vault.deposit({.depositor = depositor, .id = keylet.key, .amount = asset(1000)}));
52675275
env.close();
5276+
52685277
// Check depositor has shares
52695278
{
52705279
auto const sleMpt = env.le(keylet::mptoken(shareMptID, depositor));
52715280
BEAST_EXPECT(sleMpt != nullptr);
52725281
BEAST_EXPECT(sleMpt->at(sfMPTAmount) == 1000);
52735282
}
5283+
52745284
// Escrow 500 of those shares
5275-
auto const escrowSeq = env.seq(depositor);
52765285
env(escrow::create(depositor, bob, STAmount{shareIssue, 500}),
52775286
escrow::condition(escrow::cb1),
52785287
escrow::finish_time(env.now() + 1s),
52795288
fee(baseFee * 150),
52805289
ter(tesSUCCESS));
52815290
env.close();
5291+
52825292
// Verify: sfMPTAmount=500, sfLockedAmount=500
52835293
{
52845294
auto const sleMpt = env.le(keylet::mptoken(shareMptID, depositor));
52855295
BEAST_EXPECT(sleMpt != nullptr);
52865296
BEAST_EXPECT(sleMpt->at(sfLockedAmount) == 500);
52875297
BEAST_EXPECT(sleMpt->at(sfMPTAmount) == 500);
52885298
}
5299+
52895300
// Withdraw remaining spendable shares — triggers removeEmptyHolding
52905301
env(vault.withdraw({.depositor = depositor, .id = keylet.key, .amount = asset(500)}),
52915302
ter(tesSUCCESS));
52925303
env.close();
5304+
52935305
// With the fix applied, MPToken must still exist with sfLockedAmount > 0
52945306
auto const sleMptAfter = env.le(keylet::mptoken(shareMptID, depositor));
52955307
BEAST_EXPECT(sleMptAfter != nullptr);

0 commit comments

Comments
 (0)