@@ -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