38 testcase(
"VaultDeposit IOU freeze checks");
45 env.fund(XRP(100'000), issuer, owner);
46 env(fset(issuer, asfAllowTrustLineClawback));
49 env.trust(asset(1'000'000), owner);
50 env(pay(issuer, owner, asset(100'000)));
53 auto [tx,
keylet] = vault.create({.owner = owner, .asset = asset});
56 auto const vaultAcct =
Account(
"vault", env.le(
keylet)->at(sfAccount));
59 env(vault.deposit({.depositor = owner, .id = keylet.key, .amount = asset(100)}));
62 auto runTests = [&]() {
63 auto const fix330Enabled = env.current()->rules().enabled(fixCleanup3_3_0);
67 testcase(
"VaultDeposit IOU global freeze");
68 env(fset(issuer, asfGlobalFreeze));
69 env(vault.deposit({.depositor = owner, .id = keylet.key, .amount = asset(1)}),
71 env(fclear(issuer, asfGlobalFreeze));
76 testcase(
"VaultDeposit IOU depositor freeze");
77 env(trust(issuer, asset(0), owner, tfSetFreeze));
78 env(vault.deposit({.depositor = owner, .id = keylet.key, .amount = asset(1)}),
80 env(trust(issuer, asset(0), owner, tfClearFreeze));
85 testcase(
"VaultDeposit IOU depositor deep freeze");
86 env(trust(issuer, asset(0), owner, tfSetFreeze | tfSetDeepFreeze));
87 env(vault.deposit({.depositor = owner, .id = keylet.key, .amount = asset(1)}),
89 env(trust(issuer, asset(0), owner, tfClearFreeze | tfClearDeepFreeze));
97 testcase(
"VaultDeposit IOU pseudo-account freeze");
98 auto trustSet = [&]() {
100 jv[jss::Account] = issuer.human();
102 auto& ja = jv[jss::LimitAmount] =
104 ja[jss::issuer] =
toBase58(vaultAcct.id());
106 jv[jss::TransactionType] = jss::TrustSet;
110 trustSet[jss::Flags] = tfSetFreeze;
115 env(vault.deposit({.depositor = owner, .id = keylet.key, .amount = asset(1)}),
118 trustSet[jss::Flags] = tfClearFreeze;
125 testcase(
"VaultDeposit IOU pseudo-account deep freeze");
126 auto trustSet = [&]() {
128 jv[jss::Account] = issuer.human();
130 auto& ja = jv[jss::LimitAmount] =
132 ja[jss::issuer] =
toBase58(vaultAcct.id());
134 jv[jss::TransactionType] = jss::TrustSet;
138 trustSet[jss::Flags] = tfSetFreeze | tfSetDeepFreeze;
142 env(vault.deposit({.depositor = owner, .id = keylet.key, .amount = asset(1)}),
145 trustSet[jss::Flags] = tfClearFreeze | tfClearDeepFreeze;
152 testcase(
"VaultDeposit IOU freeze clawback unaffected");
153 env(fset(issuer, asfGlobalFreeze));
155 {.issuer = issuer, .id = keylet.key, .holder = owner, .amount = asset(1)}));
156 env(fclear(issuer, asfGlobalFreeze));
157 env(vault.deposit({.depositor = owner, .id = keylet.key, .amount = asset(1)}));
163 env.disableFeature(fixCleanup3_3_0);
165 env.enableFeature(fixCleanup3_3_0);
172 testcase(
"VaultDeposit MPT lock checks");
174 Account const issuer{
"issuer"};
179 env.fund(XRP(100'000), issuer, owner);
182 MPTTester mptt{env, issuer, kMptInitNoFund};
184 {.flags = tfMPTCanClawback | tfMPTCanTransfer | tfMPTCanLock | tfMPTRequireAuth});
187 mptt.authorize({.account = owner});
188 mptt.authorize({.account = issuer, .holder = owner});
190 env(pay(issuer, owner, mpt(100'000)));
193 auto [tx,
keylet] = vault.create({.owner = owner, .asset = mpt});
196 auto const vaultAcctID = env.le(
keylet)->at(sfAccount);
197 Account const vaultAcct(
"vault", vaultAcctID);
199 env(vault.deposit({.depositor = owner, .id = keylet.key, .amount = mpt(100)}));
204 auto runTests = [&]() {
207 testcase(
"VaultDeposit MPT global lock");
208 mptt.set({.flags = tfMPTLock});
210 env(vault.deposit({.depositor = owner, .id = keylet.key, .amount = mpt(1)}),
212 mptt.set({.flags = tfMPTUnlock});
218 testcase(
"VaultDeposit MPT depositor lock");
219 mptt.set({.holder = owner, .flags = tfMPTLock});
221 env(vault.deposit({.depositor = owner, .id = keylet.key, .amount = mpt(1)}),
223 mptt.set({.holder = owner, .flags = tfMPTUnlock});
229 testcase(
"VaultDeposit MPT pseudo-account lock");
230 mptt.set({.holder = vaultAcct, .flags = tfMPTLock});
232 env(vault.deposit({.depositor = owner, .id = keylet.key, .amount = mpt(1)}),
234 mptt.set({.holder = vaultAcct, .flags = tfMPTUnlock});
240 testcase(
"VaultDeposit MPT lock clawback unaffected");
241 mptt.set({.flags = tfMPTLock});
244 {.issuer = issuer, .id = keylet.key, .holder = owner, .amount = mpt(1)}));
245 mptt.set({.flags = tfMPTUnlock});
247 env(vault.deposit({.depositor = owner, .id = keylet.key, .amount = mpt(1)}));
253 env.disableFeature(fixCleanup3_3_0);
255 env.enableFeature(fixCleanup3_3_0);
262 testcase(
"VaultWithdraw IOU freeze checks");
264 Account const issuer{
"issuer"};
267 Vault const vault{env};
269 env.fund(XRP(100'000), issuer, owner);
270 env(fset(issuer, asfAllowTrustLineClawback));
273 env.trust(asset(1'000'000), owner);
274 env(pay(issuer, owner, asset(100'000)));
277 auto [tx,
keylet] = vault.create({.owner = owner, .asset = asset});
280 auto const vaultAcct =
Account(
"vault", env.le(
keylet)->at(sfAccount));
282 env(vault.deposit({.depositor = owner, .id = keylet.key, .amount = asset(100)}));
285 Account const charlie{
"charlie"};
286 env.fund(XRP(10'000), charlie);
287 env.trust(asset(1'000'000), charlie);
290 auto runTests = [&]() {
291 auto const fix330Enabled = env.current()->rules().enabled(fixCleanup3_3_0);
294 testcase(
"VaultWithdraw IOU global freeze");
295 env(fset(issuer, asfGlobalFreeze));
296 env(vault.withdraw({.depositor = owner, .id = keylet.key, .amount = asset(1)}),
300 auto withdrawToCharlie =
301 vault.withdraw({.depositor = owner, .id =
keylet.key, .amount = asset(1)});
302 withdrawToCharlie[sfDestination] = charlie.human();
305 env(fclear(issuer, asfGlobalFreeze));
310 testcase(
"VaultWithdraw IOU pseudo-account freeze");
311 auto trustSet = [&]() {
313 jv[jss::Account] = issuer.human();
315 auto& ja = jv[jss::LimitAmount] =
317 ja[jss::issuer] =
toBase58(vaultAcct.id());
319 jv[jss::TransactionType] = jss::TrustSet;
323 trustSet[jss::Flags] = tfSetFreeze;
330 env(vault.withdraw({.depositor = owner, .id = keylet.key, .amount = asset(1)}),
334 auto withdrawToCharlie =
335 vault.withdraw({.depositor = owner, .id =
keylet.key, .amount = asset(1)});
336 withdrawToCharlie[sfDestination] = charlie.human();
337 env(withdrawToCharlie, Ter(terExpected));
339 trustSet[jss::Flags] = tfClearFreeze;
346 testcase(
"VaultWithdraw IOU self-withdraw freeze check");
347 env(trust(issuer, asset(0), owner, tfSetFreeze));
351 env(vault.withdraw({.depositor = owner, .id = keylet.key, .amount = asset(1)}),
356 vault.withdraw({.depositor = owner, .id =
keylet.key, .amount = asset(1)});
357 withdrawTo3rd[sfDestination] = charlie.human();
364 env(trust(issuer, asset(0), owner, tfClearFreeze));
368 env(vault.deposit({.depositor = owner, .id = keylet.key, .amount = asset(1)}));
375 testcase(
"VaultWithdraw IOU depositor deep freeze");
376 env(trust(issuer, asset(0), owner, tfSetFreeze | tfSetDeepFreeze));
378 env(vault.withdraw({.depositor = owner, .id = keylet.key, .amount = asset(1)}),
381 env(trust(issuer, asset(0), owner, tfClearFreeze | tfClearDeepFreeze));
386 testcase(
"VaultWithdraw IOU freeze withdraw to 3rd party");
388 env(trust(issuer, asset(0), charlie, tfSetFreeze));
391 env(vault.withdraw({.depositor = owner, .id = keylet.key, .amount = asset(1)}));
393 auto withdrawToCharlie =
394 vault.withdraw({.depositor = owner, .id =
keylet.key, .amount = asset(1)});
395 withdrawToCharlie[sfDestination] = charlie.human();
401 env(trust(issuer, asset(0), charlie, tfClearFreeze));
407 .amount = asset(fix330Enabled ? 2 : 1)}));
413 testcase(
"VaultWithdraw IOU deep freeze withdraw to 3rd party");
415 env(trust(issuer, asset(0), charlie, tfSetFreeze | tfSetDeepFreeze));
417 auto withdrawToCharlie =
418 vault.withdraw({.depositor = owner, .id =
keylet.key, .amount = asset(1)});
419 withdrawToCharlie[sfDestination] = charlie.human();
423 env(vault.withdraw({.depositor = owner, .id = keylet.key, .amount = asset(1)}));
425 env(trust(issuer, asset(0), charlie, tfClearFreeze | tfClearDeepFreeze));
426 env(vault.deposit({.depositor = owner, .id = keylet.key, .amount = asset(1)}));
432 testcase(
"VaultWithdraw IOU freeze clawback unaffected");
433 env(fset(issuer, asfGlobalFreeze));
436 {.issuer = issuer, .id = keylet.key, .holder = owner, .amount = asset(1)}));
438 env(fclear(issuer, asfGlobalFreeze));
439 env(vault.deposit({.depositor = owner, .id = keylet.key, .amount = asset(1)}));
445 env.disableFeature(fixCleanup3_3_0);
447 env.enableFeature(fixCleanup3_3_0);
454 testcase(
"VaultWithdraw MPT lock checks");
456 Account const issuer{
"issuer"};
461 env.fund(XRP(100'000), issuer, owner);
464 MPTTester mptt{env, issuer, kMptInitNoFund};
466 {.flags = tfMPTCanClawback | tfMPTCanTransfer | tfMPTCanLock | tfMPTRequireAuth});
469 mptt.authorize({.account = owner});
470 mptt.authorize({.account = issuer, .holder = owner});
472 env(pay(issuer, owner, mpt(100'000)));
475 auto [tx,
keylet] = vault.create({.owner = owner, .asset = mpt});
478 Account const vaultAcct(
"vault", env.le(
keylet)->at(sfAccount));
480 env(vault.deposit({.depositor = owner, .id = keylet.key, .amount = mpt(100)}));
483 Account const charlie{
"charlie"};
484 env.fund(XRP(10'000), charlie);
486 mptt.authorize({.account = charlie});
487 mptt.authorize({.account = issuer, .holder = charlie});
490 auto runTests = [&]() {
491 auto const fix330Enabled = env.current()->rules().enabled(fixCleanup3_3_0);
495 testcase(
"VaultWithdraw MPT global lock");
496 mptt.set({.flags = tfMPTLock});
498 env(vault.withdraw({.depositor = owner, .id = keylet.key, .amount = mpt(1)}),
506 auto withdrawToIssuer =
507 vault.withdraw({.depositor = owner, .id =
keylet.key, .amount = mpt(1)});
508 withdrawToIssuer[sfDestination] = issuer.human();
511 mptt.set({.flags = tfMPTUnlock});
515 env(vault.deposit({.depositor = owner, .id = keylet.key, .amount = mpt(1)}));
522 testcase(
"VaultWithdraw MPT pseudo-account lock");
523 mptt.set({.holder = vaultAcct, .flags = tfMPTLock});
525 env(vault.withdraw({.depositor = owner, .id = keylet.key, .amount = mpt(1)}),
527 mptt.set({.holder = vaultAcct, .flags = tfMPTUnlock});
534 testcase(
"VaultWithdraw MPT depositor lock");
535 mptt.set({.holder = owner, .flags = tfMPTLock});
537 env(vault.withdraw({.depositor = owner, .id = keylet.key, .amount = mpt(1)}),
541 auto withdrawToCharlie =
542 vault.withdraw({.depositor = owner, .id =
keylet.key, .amount = mpt(1)});
543 withdrawToCharlie[sfDestination] = charlie.human();
551 auto withdrawToIssuer =
552 vault.withdraw({.depositor = owner, .id =
keylet.key, .amount = mpt(1)});
553 withdrawToIssuer[sfDestination] = issuer.human();
556 mptt.set({.holder = owner, .flags = tfMPTUnlock});
560 env(vault.deposit({.depositor = owner, .id = keylet.key, .amount = mpt(1)}));
567 testcase(
"VaultWithdraw MPT 3rd party destination lock");
568 mptt.set({.holder = charlie, .flags = tfMPTLock});
571 auto withdrawToCharlie =
572 vault.withdraw({.depositor = owner, .id =
keylet.key, .amount = mpt(1)});
573 withdrawToCharlie[sfDestination] = charlie.human();
577 env(vault.withdraw({.depositor = owner, .id = keylet.key, .amount = mpt(1)}));
578 mptt.set({.holder = charlie, .flags = tfMPTUnlock});
580 env(vault.deposit({.depositor = owner, .id = keylet.key, .amount = mpt(1)}));
586 testcase(
"VaultWithdraw MPT lock clawback unaffected");
587 mptt.set({.flags = tfMPTLock});
590 {.issuer = issuer, .id = keylet.key, .holder = owner, .amount = mpt(1)}));
591 mptt.set({.flags = tfMPTUnlock});
593 env(vault.deposit({.depositor = owner, .id = keylet.key, .amount = mpt(1)}));
599 env.disableFeature(fixCleanup3_3_0);
601 env.enableFeature(fixCleanup3_3_0);
616 testcase(
"VaultWithdraw IOU self-withdrawal while individually frozen");
620 Account const issuer{
"issuer"};
622 Account const charlie{
"charlie"};
626 env.fund(XRP(100'000), issuer, owner, charlie);
627 env(fset(issuer, asfAllowTrustLineClawback));
631 env.trust(asset(1'000'000), owner);
632 env.trust(asset(1'000'000), charlie);
633 env(pay(issuer, owner, asset(100'000)));
636 auto [tx,
keylet] = vault.create({.owner = owner, .asset = asset});
640 env(vault.deposit({.depositor = owner, .id = keylet.key, .amount = asset(10)}));
643 auto runTests = [&]() {
644 auto const fix330Enabled = env.current()->rules().enabled(fixCleanup3_3_0);
647 env(trust(issuer, asset(0), owner, tfSetFreeze));
653 env(vault.withdraw({.depositor = owner, .id = keylet.key, .amount = asset(1)}),
659 auto withdrawToCharlie =
660 vault.withdraw({.depositor = owner, .id =
keylet.key, .amount = asset(1)});
661 withdrawToCharlie[sfDestination] = charlie.human();
667 env(trust(issuer, asset(0), owner, tfClearFreeze));
672 env.disableFeature(fixCleanup3_3_0);
674 env.enableFeature(fixCleanup3_3_0);