277 Account const gwF{
"gatewayFrozen"};
281 Env env{*
this, features};
283 STAmount const startBalance{XRP(1'000).value()};
284 env.fund(startBalance, gw1, gwF, alice, bob);
286 auto usdm = MPTTester({.env = env, .issuer = gw1, .flags = kMptDexFlags | tfMPTCanLock});
287 MPT
const usd = usdm;
290 env(check::create(alice, bob, usd(50)), Fee(drops(-10)), Ter(
temBAD_FEE));
294 env(check::create(alice, bob, usd(50)), Txflags(tfImmediateOrCancel), Ter(
temINVALID_FLAG));
298 env(check::create(alice, alice, XRP(10)), Ter(
temREDUNDANT));
302 env(check::create(alice, bob, drops(-1)), Ter(
temBAD_AMOUNT));
305 env(check::create(alice, bob, drops(0)), Ter(
temBAD_AMOUNT));
308 env(check::create(alice, bob, drops(1)));
317 env(check::create(alice, bob, usd(1)));
326 env(check::create(alice, bob, usd(50)),
333 env(check::create(alice, bogie, usd(50)), Ter(
tecNO_DST));
337 env(fset(bob, asfRequireDest));
343 env(check::create(alice, bob, usd(50)), DestTag(11));
346 env(fclear(bob, asfRequireDest));
352 MPTTester({.env = env, .issuer = gwF, .flags = kMptDexFlags | tfMPTCanLock});
353 MPT
const usf = usfm;
354 usfm.set({.flags = tfMPTLock});
356 env(check::create(alice, bob, usf(50)), Ter(
tecLOCKED));
359 usfm.set({.flags = tfMPTUnlock});
361 env(check::create(alice, bob, usf(50)));
367 usdm.authorizeHolders({alice, bob});
368 env(pay(gw1, alice, usd(25)));
369 env(pay(gw1, bob, usd(25)));
372 usdm.set({.holder = alice, .flags = tfMPTLock});
377 env(check::create(alice, bob, usd(50)), Ter(
tecLOCKED));
384 env(check::create(bob, alice, usd(50)), Ter(
tecLOCKED));
388 env(check::create(gw1, alice, usd(50)), Ter(
tecLOCKED));
390 env(pay(gw1, alice, usd(1)));
394 usdm.set({.holder = alice, .flags = tfMPTUnlock});
395 env(check::create(alice, bob, usd(50)));
397 env(check::create(bob, alice, usd(50)));
399 env(check::create(gw1, alice, usd(50)));
404 env(check::create(alice, bob, usd(50)), Expiration(env.now()), Ter(
tecEXPIRED));
407 using namespace std::chrono_literals;
408 env(check::create(alice, bob, usd(50)), Expiration(env.now() + 1s));
413 env.fund(env.current()->fees().accountReserve(1, 1) - drops(1), cheri);
415 env(check::create(cheri, bob, usd(50)),
416 Fee(drops(env.current()->fees().base)),
420 env(pay(bob, cheri, drops(env.current()->fees().base + 1)));
423 env(check::create(cheri, bob, usd(50)));
440 Env env{*
this, features};
442 env.fund(XRP(1'000), gw, alice, bob);
445 MPTTester({.env = env, .issuer = gw, .holders = {alice}, .maxAmt = 105});
448 uint256 const chkId1{getCheckIndex(alice, env.seq(alice))};
449 env(check::create(alice, bob, usd(100)));
457 env(pay(gw, alice, usd(95)));
463 env(pay(gw, alice, usd(5)));
473 env(check::cash(bob, chkId1, usd(100)));
475 env.require(Balance(alice, usd(0)));
476 env.require(Balance(bob, usd(100)));
483 env(check::cash(bob, chkId1, usd(100)), Ter(
tecNO_ENTRY));
487 env(pay(bob, alice, usd(70)));
490 uint256 const chkId2{getCheckIndex(alice, env.seq(alice))};
491 env(check::create(alice, bob, usd(70)));
498 env(check::cash(bob, chkId2, usd(50)));
500 env.require(Balance(alice, usd(20)));
501 env.require(Balance(bob, usd(80)));
509 uint256 const chkId3{getCheckIndex(alice, env.seq(alice))};
510 env(check::create(alice, bob, usd(20)));
512 uint256 const chkId4{getCheckIndex(alice, env.seq(alice))};
513 env(check::create(alice, bob, usd(20)));
519 env(check::cash(bob, chkId4, usd(20)));
521 env.require(Balance(alice, usd(0)));
522 env.require(Balance(bob, usd(100)));
532 env.require(Balance(alice, usd(0)));
533 env.require(Balance(bob, usd(100)));
550 uint256 const chkId20{getCheckIndex(gw, env.seq(gw))};
551 env(check::create(gw, bob, usd(200)));
557 env.require(Balance(bob, usd(100)));
561 env(pay(bob, gw, usd(100)));
562 env(check::cancel(bob, chkId20));
566 env(check::cancel(bob, chkId3));
568 env.require(Balance(alice, usd(0)));
569 env.require(Balance(bob, usd(0)));
577 Env env{*
this, features};
579 env.fund(XRP(1'000), gw, alice, bob);
582 MPTTester({.env = env, .issuer = gw, .holders = {alice, bob}, .maxAmt = 20});
584 env(pay(gw, alice, usd(8)));
588 uint256 const chkId9{getCheckIndex(alice, env.seq(alice))};
589 env(check::create(alice, bob, usd(9)));
591 uint256 const chkId8{getCheckIndex(alice, env.seq(alice))};
592 env(check::create(alice, bob, usd(8)));
594 uint256 const chkId7{getCheckIndex(alice, env.seq(alice))};
595 env(check::create(alice, bob, usd(7)));
597 uint256 const chkId6{getCheckIndex(alice, env.seq(alice))};
598 env(check::create(alice, bob, usd(6)));
603 env(check::cash(bob, chkId9, check::DeliverMin(usd(9))), Ter(
tecPATH_PARTIAL));
607 env(check::cash(bob, chkId9, check::DeliverMin(usd(7))));
609 env.require(Balance(alice, usd(0)));
610 env.require(Balance(bob, usd(8)));
617 env(pay(bob, alice, usd(7)));
622 env(check::cash(bob, chkId7, check::DeliverMin(usd(7))));
624 env.require(Balance(alice, usd(0)));
625 env.require(Balance(bob, usd(8)));
632 env(pay(bob, alice, usd(8)));
637 env(check::cash(bob, chkId6, check::DeliverMin(usd(4))));
639 env.require(Balance(alice, usd(2)));
640 env.require(Balance(bob, usd(6)));
648 env(check::cash(bob, chkId8, check::DeliverMin(usd(2))));
650 env.require(Balance(alice, usd(0)));
651 env.require(Balance(bob, usd(8)));
659 Env env{*
this, features};
661 env.fund(XRP(1'000), gw, alice, bob);
665 MPT
const usd = MPTTester(
666 {.env = env, .issuer = gw, .holders = {alice, bob}, .maxAmt =
kMaxMpTokenAmount});
668 env(pay(gw, alice, usd(deliverMin)));
671 uint256 const chkId{getCheckIndex(alice, env.seq(alice))};
672 env(check::create(alice, bob, usd(deliverMin)));
675 env(check::cash(bob, chkId, check::DeliverMin(usd(deliverMin))));
677 env.require(Balance(alice, usd(0)));
678 env.require(Balance(bob, usd(deliverMin)));
685 Env env(*
this, features);
687 env.fund(XRP(1000), gw, alice, bob);
688 auto usdm = MPTTester(
692 .flags = kMptDexFlags | tfMPTRequireAuth,
694 MPT
const usd = usdm;
695 usdm.authorize({.holder = alice});
697 env(pay(gw, alice, usd(8)));
702 uint256 const chkId{getCheckIndex(alice, env.seq(alice))};
703 env(check::create(alice, bob, usd(7)));
706 env(check::cash(bob, chkId, usd(7)), Ter(
tecNO_AUTH));
711 usdm.authorize({.account = bob});
714 env(check::cash(bob, chkId, usd(7)), Ter(
tecNO_AUTH));
718 usdm.authorize({.holder = bob});
721 env(check::cash(bob, chkId, check::DeliverMin(usd(4))));
724 env.require(Balance(alice, usd(8) - bobGot));
725 env.require(Balance(bob, bobGot));
734 Env env{*
this, features};
736 env.fund(XRP(1'000), gw, alice, bob);
739 MPTTester({.env = env, .issuer = gw, .holders = {alice, bob}, .maxAmt = 20});
742 uint256 const chkId1{getCheckIndex(alice, env.seq(alice))};
743 env(check::create(alice, bob, usd(1)));
746 uint256 const chkId2{getCheckIndex(alice, env.seq(alice))};
747 env(check::create(alice, bob, usd(2)));
750 env(pay(gw, alice, usd(8)));
755 env(regkey(bob, bobby));
760 env(signers(bob, 2, {{bogie, 1}, {demon, 1}}), Sig(bobby));
763 int const signersCount = 1;
764 BEAST_EXPECT(
ownerCount(env, bob) == signersCount + 1);
767 env(check::cash(bob, chkId1, (usd(1))), Sig(bobby));
769 env.require(Balance(alice, usd(7)));
770 env.require(Balance(bob, usd(1)));
774 BEAST_EXPECT(
ownerCount(env, bob) == signersCount + 1);
777 XRPAmount const baseFeeDrops{env.current()->fees().base};
778 env(check::cash(bob, chkId2, (usd(2))), Msig(bogie, demon), Fee(3 * baseFeeDrops));
780 env.require(Balance(alice, usd(5)));
781 env.require(Balance(bob, usd(3)));
785 BEAST_EXPECT(
ownerCount(env, bob) == signersCount + 1);
879 Env env(*
this, features);
881 env.fund(XRP(1000), gw, alice, bob, zoe);
883 auto usdm = MPTTester(
887 .flags = kMptDexFlags | tfMPTCanLock,
889 MPT
const usd = usdm;
891 env(pay(gw, alice, usd(20)));
894 usdm.authorize({.account = bob});
898 uint256 const chkId{getCheckIndex(alice, env.seq(alice))};
899 env(check::cash(bob, chkId, usd(20)), Ter(
tecNO_ENTRY));
904 uint256 const chkIdU{getCheckIndex(alice, env.seq(alice))};
905 env(check::create(alice, bob, usd(20)));
908 uint256 const chkIdX{getCheckIndex(alice, env.seq(alice))};
909 env(check::create(alice, bob, XRP(10)));
912 using namespace std::chrono_literals;
913 uint256 const chkIdExp{getCheckIndex(alice, env.seq(alice))};
914 env(check::create(alice, bob, XRP(10)), Expiration(env.now() + 1s));
917 uint256 const chkIdFroz1{getCheckIndex(alice, env.seq(alice))};
918 env(check::create(alice, bob, usd(1)));
921 uint256 const chkIdFroz2{getCheckIndex(alice, env.seq(alice))};
922 env(check::create(alice, bob, usd(2)));
925 uint256 const chkIdFroz3{getCheckIndex(alice, env.seq(alice))};
926 env(check::create(alice, bob, usd(3)));
929 uint256 const chkIdNoDest1{getCheckIndex(alice, env.seq(alice))};
930 env(check::create(alice, bob, usd(1)));
933 uint256 const chkIdHasDest2{getCheckIndex(alice, env.seq(alice))};
934 env(check::create(alice, bob, usd(2)), DestTag(7));
938 auto failingCases = [&env, &gw, &alice, &bob](
941 env(check::cash(bob, chkId, amount), Fee(drops(-10)), Ter(
temBAD_FEE));
945 env(check::cash(bob, chkId, amount),
946 Txflags(tfImmediateOrCancel),
971 env(check::cash(bob, chkId, amount.zeroed()), Ter(
temBAD_AMOUNT));
976 if (!amount.native())
993 MPT
const eur = MPTTester({.env = env, .issuer = gw});
994 STAmount const badAmount{eur, amount};
995 env(check::cash(bob, chkId, badAmount), Ter(
temMALFORMED));
1007 env(check::cash(bob, chkId, check::DeliverMin(amount + amount)), Ter(
tecPATH_PARTIAL));
1011 failingCases(chkIdX, XRP(10));
1012 failingCases(chkIdU, usd(20));
1015 env(check::cash(bob, chkIdU, usd(20)));
1017 env(check::cash(bob, chkIdX, check::DeliverMin(XRP(10))));
1021 env(check::cash(bob, chkIdExp, XRP(10)), Ter(
tecEXPIRED));
1025 env(check::cancel(zoe, chkIdExp));
1030 env(pay(bob, alice, usd(20)));
1032 env.require(Balance(alice, usd(20)));
1033 env.require(Balance(bob, usd(0)));
1036 usdm.set({.flags = tfMPTLock});
1041 env(check::cash(bob, chkIdFroz1, check::DeliverMin(usd(1))), Ter(
tecPATH_PARTIAL));
1044 usdm.set({.flags = tfMPTUnlock});
1047 env(check::cash(bob, chkIdFroz1, usd(1)));
1049 env.require(Balance(alice, usd(19)));
1050 env.require(Balance(bob, usd(1)));
1053 usdm.set({.holder = alice, .flags = tfMPTLock});
1056 env(check::cash(bob, chkIdFroz2, check::DeliverMin(usd(1))), Ter(
tecPATH_PARTIAL));
1060 usdm.set({.holder = alice, .flags = tfMPTUnlock});
1061 env(check::cash(bob, chkIdFroz2, usd(2)));
1063 env.require(Balance(alice, usd(17)));
1064 env.require(Balance(bob, usd(3)));
1067 usdm.set({.holder = bob, .flags = tfMPTLock});
1068 env(check::cash(bob, chkIdFroz3, usd(3)), Ter(
tecLOCKED));
1070 env(check::cash(bob, chkIdFroz3, check::DeliverMin(usd(1))), Ter(
tecLOCKED));
1074 usdm.set({.holder = bob, .flags = tfMPTUnlock});
1076 env(check::cash(bob, chkIdFroz3, check::DeliverMin(usd(1))));
1078 env.require(Balance(alice, usd(14)));
1079 env.require(Balance(bob, usd(6)));
1084 env(fset(bob, asfRequireDest));
1088 env(check::cash(bob, chkIdNoDest1, check::DeliverMin(usd(1))), Ter(
tecDST_TAG_NEEDED));
1092 env(check::cash(bob, chkIdHasDest2, usd(2)));
1095 env.require(Balance(alice, usd(12)));
1096 env.require(Balance(bob, usd(8)));
1100 env(fclear(bob, asfRequireDest));
1102 env(check::cash(bob, chkIdNoDest1, usd(1)));
1104 env.require(Balance(alice, usd(11)));
1105 env.require(Balance(bob, usd(9)));
1111 BEAST_EXPECT(env.balance(gw, usdm) == usdm(-maxAmt));
1113 uint256 const chkId{getCheckIndex(gw, env.seq(gw))};
1114 env(check::create(gw, bob, usdm(10)));
1122 env(pay(alice, gw, usdm(9)));
1145 Env env{*
this, features};
1147 env.fund(XRP(1'000), gw, alice, bob, zoe);
1149 MPT
const usd = MPTTester({.env = env, .issuer = gw});
1153 uint256 const chkId1{getCheckIndex(alice, env.seq(alice))};
1154 env(check::create(alice, bob, usd(10)));
1157 uint256 const chkId2{getCheckIndex(alice, env.seq(alice))};
1158 env(check::create(alice, bob, XRP(10)));
1161 uint256 const chkId3{getCheckIndex(alice, env.seq(alice))};
1162 env(check::create(alice, bob, usd(10)));
1166 using namespace std::chrono_literals;
1167 uint256 const chkIdNotExp1{getCheckIndex(alice, env.seq(alice))};
1168 env(check::create(alice, bob, XRP(10)), Expiration(env.now() + 600s));
1171 uint256 const chkIdNotExp2{getCheckIndex(alice, env.seq(alice))};
1172 env(check::create(alice, bob, usd(10)), Expiration(env.now() + 600s));
1175 uint256 const chkIdNotExp3{getCheckIndex(alice, env.seq(alice))};
1176 env(check::create(alice, bob, XRP(10)), Expiration(env.now() + 600s));
1180 uint256 const chkIdExp1{getCheckIndex(alice, env.seq(alice))};
1181 env(check::create(alice, bob, usd(10)), Expiration(env.now() + 1s));
1184 uint256 const chkIdExp2{getCheckIndex(alice, env.seq(alice))};
1185 env(check::create(alice, bob, XRP(10)), Expiration(env.now() + 1s));
1188 uint256 const chkIdExp3{getCheckIndex(alice, env.seq(alice))};
1189 env(check::create(alice, bob, usd(10)), Expiration(env.now() + 1s));
1193 uint256 const chkIdReg{getCheckIndex(alice, env.seq(alice))};
1194 env(check::create(alice, bob, usd(10)));
1197 uint256 const chkIdMSig{getCheckIndex(alice, env.seq(alice))};
1198 env(check::create(alice, bob, XRP(10)));
1204 env(check::cancel(alice, chkId1));
1209 env(check::cancel(bob, chkId2));
1220 env(check::cancel(alice, chkIdNotExp1));
1225 env(check::cancel(bob, chkIdNotExp2));
1236 env(check::cancel(alice, chkIdExp1));
1241 env(check::cancel(bob, chkIdExp2));
1246 env(check::cancel(zoe, chkIdExp3));
1253 env(regkey(alice, alie));
1258 env(signers(alice, 2, {{bogie, 1}, {demon, 1}}), Sig(alie));
1261 int const signersCount{1};
1264 env(check::cancel(alice, chkIdReg), Sig(alie));
1267 BEAST_EXPECT(
ownerCount(env, alice) == signersCount + 3);
1270 XRPAmount const baseFeeDrops{env.current()->fees().base};
1271 env(check::cancel(alice, chkIdMSig), Msig(bogie, demon), Fee(3 * baseFeeDrops));
1274 BEAST_EXPECT(
ownerCount(env, alice) == signersCount + 2);
1277 env(check::cancel(alice, chkId3), Sig(alice));
1280 BEAST_EXPECT(
ownerCount(env, alice) == signersCount + 1);
1282 env(check::cancel(bob, chkIdNotExp3));
1285 BEAST_EXPECT(
ownerCount(env, alice) == signersCount + 0);
1300 Env env{*
this, features};
1301 env.fund(XRP(1'000), gw, alice, bob);
1305 MPTTester({.env = env, .issuer = gw, .holders = {alice, bob}, .maxAmt = 1'000});
1311 env(ticket::create(alice, 10));
1315 env(ticket::create(bob, 10));
1320 env.require(Owners(alice, 11));
1321 env.require(Owners(bob, 11));
1323 env.require(tickets(alice, env.seq(alice) - aliceTicketSeq));
1324 BEAST_EXPECT(env.seq(alice) == aliceSeq);
1326 env.require(tickets(bob, env.seq(bob) - bobTicketSeq));
1327 BEAST_EXPECT(env.seq(bob) == bobSeq);
1329 env(pay(gw, alice, usd(900)));
1334 uint256 const chkIdXrp1{getCheckIndex(alice, aliceTicketSeq)};
1335 env(check::create(alice, bob, XRP(200)), ticket::Use(aliceTicketSeq++));
1337 uint256 const chkIdXrp2{getCheckIndex(alice, aliceTicketSeq)};
1338 env(check::create(alice, bob, XRP(300)), ticket::Use(aliceTicketSeq++));
1340 uint256 const chkIdUsd1{getCheckIndex(alice, aliceTicketSeq)};
1341 env(check::create(alice, bob, usd(200)), ticket::Use(aliceTicketSeq++));
1343 uint256 const chkIdUsd2{getCheckIndex(alice, aliceTicketSeq)};
1344 env(check::create(alice, bob, usd(300)), ticket::Use(aliceTicketSeq++));
1348 env.require(Owners(alice, 11));
1349 env.require(tickets(alice, env.seq(alice) - aliceTicketSeq));
1351 BEAST_EXPECT(env.seq(alice) == aliceSeq);
1353 env.require(Owners(bob, 11));
1354 BEAST_EXPECT(env.seq(bob) == bobSeq);
1357 env(check::cancel(bob, chkIdXrp1), ticket::Use(bobTicketSeq++));
1358 env(check::cancel(bob, chkIdUsd2), ticket::Use(bobTicketSeq++));
1361 env.require(Owners(alice, 9));
1362 env.require(tickets(alice, env.seq(alice) - aliceTicketSeq));
1364 BEAST_EXPECT(env.seq(alice) == aliceSeq);
1366 env.require(Owners(bob, 9));
1367 BEAST_EXPECT(env.seq(bob) == bobSeq);
1370 env(check::cash(bob, chkIdXrp2, XRP(300)), ticket::Use(bobTicketSeq++));
1371 env(check::cash(bob, chkIdUsd1, usd(200)), ticket::Use(bobTicketSeq++));
1374 auto const baseFee = env.current()->fees().base;
1375 env.require(Owners(alice, 7));
1376 env.require(tickets(alice, env.seq(alice) - aliceTicketSeq));
1378 BEAST_EXPECT(env.seq(alice) == aliceSeq);
1379 env.require(Balance(alice, usd(700)));
1380 env.require(Balance(alice, XRP(700) - 6 * baseFee));
1381 env.require(Owners(bob, 7));
1382 BEAST_EXPECT(env.seq(bob) == bobSeq);
1383 env.require(Balance(bob, usd(200)));
1384 env.require(Balance(bob, XRP(1'300) - 6 * baseFee));
1396 Env env{*
this, features};
1401 using iterator = hash_map<std::string, MPTTester>::iterator;
1407 bool const isIssuer;
1429 ownerCount(env, acct) == owners,
"Owner count mismatch", __FILE__, line);
1452 if (
auto const& it = mpts.
find(s); it != mpts.
end())
1453 return it->second[s];
1454 auto flags = kMptDexFlags | tfMPTCanLock;
1456 flags |= tfMPTRequireAuth;
1458 mpts.
emplace(s, MPTTester({.env = env, .issuer = acct, .flags = flags}));
1462 return it->second[s];
1466 getIt(MPT
const& mpt)
1470 auto it = mpts.
find(mpt.name);
1471 if (it == mpts.
end())
1479 auto it = getIt(mpt);
1480 it->second.set({.flags = flag});
1484 authorize(MPT
const& mpt, AccountOwns&
id)
1486 auto it = getIt(mpt);
1487 it->second.authorize({.account =
id});
1492 cleanup(MPT
const& mpt, AccountOwns&
id)
1494 auto it = getIt(mpt);
1496 if (
auto const redeem = it->second.getBalance(
id))
1497 pay(it,
id, acct, redeem);
1499 it->second.authorize({.account = id, .flags = tfMPTUnauthorize});
1508 env(fclear(dst, asfDepositAuth));
1509 it->second.pay(src, dst, amount);
1510 env(fset(dst, asfDepositAuth));
1514 it->second.pay(src, dst, amount);
1521 auto it = getIt(amount.name());
1522 pay(it, src, dst, amount.value().mpt().value());
1526 AccountOwns alice{*
this, env,
"alice",
false};
1527 AccountOwns bob{*
this, env,
"bob",
false};
1528 AccountOwns gw1{*
this, env,
"gw1",
true};
1531 env.fund(XRP(5000), noripple(alice, bob));
1540 env.fund(XRP(5'000), noripple(gw1));
1543 MPT
const cK8 = gw1[
"CK8"];
1544 gw1.verifyOwners(__LINE__);
1551 env.fund(XRP(200), yui);
1554 uint256 const chkId{getCheckIndex(gw1, env.seq(gw1))};
1555 env(check::create(gw1, yui, cK8(99)));
1560 alice.verifyOwners(__LINE__);
1564 env(pay(env.master, yui, XRP(51)));
1566 env(check::cash(yui, chkId, cK8(99)));
1573 gw1.verifyOwners(__LINE__);
1588 BEAST_EXPECT((*env.le(gw1))[sfFlags] == 0);
1589 BEAST_EXPECT((*env.le(alice))[sfFlags] == 0);
1590 BEAST_EXPECT((*env.le(bob))[sfFlags] == 0);
1593 MPT
const oF1 = gw1[
"OF1"];
1594 env(offer(gw1, XRP(98), oF1(98)));
1596 BEAST_EXPECT(env.le(
keylet::mptoken(oF1.issuanceID, alice)) ==
nullptr);
1597 env(offer(alice, oF1(98), XRP(98)));
1604 gw1.verifyOwners(__LINE__);
1607 alice.verifyOwners(__LINE__);
1610 MPT
const cK1 = gw1[
"CK1"];
1611 uint256 const chkId{getCheckIndex(gw1, env.seq(gw1))};
1612 env(check::create(gw1, alice, cK1(98)));
1614 BEAST_EXPECT(env.le(
keylet::mptoken(cK1.issuanceID, alice)) ==
nullptr);
1615 env(check::cash(alice, chkId, cK1(98)));
1623 gw1.verifyOwners(__LINE__);
1626 alice.verifyOwners(__LINE__);
1637 MPT
const oF1 = gw1[
"OF1"];
1638 env(offer(alice, XRP(97), oF1(97)));
1641 env(offer(bob, oF1(97), XRP(97)));
1646 env.require(Balance(alice, oF1(1)));
1647 env.require(Balance(bob, oF1(97)));
1650 gw1.verifyOwners(__LINE__);
1651 alice.verifyOwners(__LINE__);
1652 bob.verifyOwners(__LINE__);
1660 MPT
const cK1 = gw1[
"CK1"];
1661 uint256 const chkId{getCheckIndex(alice, env.seq(alice))};
1662 env(check::create(alice, bob, cK1(97)));
1665 env(check::cash(bob, chkId, cK1(97)));
1671 gw1.verifyOwners(__LINE__);
1672 alice.verifyOwners(__LINE__);
1673 bob.verifyOwners(__LINE__);
1680 env(fset(gw1, asfDefaultRipple));
1684 MPT
const oF2 = gw1[
"OF2"];
1685 env(offer(gw1, XRP(96), oF2(96)));
1688 env(offer(alice, oF2(96), XRP(96)));
1694 gw1.verifyOwners(__LINE__);
1697 alice.verifyOwners(__LINE__);
1700 MPT
const cK2 = gw1[
"CK2"];
1701 uint256 const chkId{getCheckIndex(gw1, env.seq(gw1))};
1702 env(check::create(gw1, alice, cK2(96)));
1705 env(check::cash(alice, chkId, cK2(96)));
1713 gw1.verifyOwners(__LINE__);
1716 alice.verifyOwners(__LINE__);
1725 MPT
const oF2 = gw1[
"OF2"];
1726 env(offer(alice, XRP(95), oF2(95)));
1730 env(offer(bob, oF2(95), XRP(95)));
1735 gw1.verifyOwners(__LINE__);
1736 alice.verifyOwners(__LINE__);
1737 bob.verifyOwners(__LINE__);
1740 MPT
const cK2 = gw1[
"CK2"];
1741 uint256 const chkId{getCheckIndex(alice, env.seq(alice))};
1742 env(check::create(alice, bob, cK2(95)));
1745 env(check::cash(bob, chkId, cK2(95)));
1751 gw1.verifyOwners(__LINE__);
1752 alice.verifyOwners(__LINE__);
1753 bob.verifyOwners(__LINE__);
1764 env(fset(gw1, asfDepositAuth));
1765 env(fset(alice, asfDepositAuth));
1766 env(fset(bob, asfDepositAuth));
1770 MPT
const oF3 = gw1[
"OF3"];
1771 env(offer(gw1, XRP(94), oF3(94)));
1774 env(offer(alice, oF3(94), XRP(94)));
1781 gw1.verifyOwners(__LINE__);
1784 alice.verifyOwners(__LINE__);
1787 MPT
const cK3 = gw1[
"CK3"];
1788 uint256 const chkId{getCheckIndex(gw1, env.seq(gw1))};
1789 env(check::create(gw1, alice, cK3(94)));
1792 env(check::cash(alice, chkId, cK3(94)));
1800 gw1.verifyOwners(__LINE__);
1803 alice.verifyOwners(__LINE__);
1812 MPT
const oF3 = gw1[
"OF3"];
1813 env(offer(alice, XRP(93), oF3(93)));
1816 env(offer(bob, oF3(93), XRP(93)));
1821 gw1.verifyOwners(__LINE__);
1822 alice.verifyOwners(__LINE__);
1823 bob.verifyOwners(__LINE__);
1826 MPT
const cK3 = gw1[
"CK3"];
1827 uint256 const chkId{getCheckIndex(alice, env.seq(alice))};
1828 env(check::create(alice, bob, cK3(93)));
1831 env(check::cash(bob, chkId, cK3(93)));
1837 gw1.verifyOwners(__LINE__);
1838 alice.verifyOwners(__LINE__);
1839 bob.verifyOwners(__LINE__);
1846 env(fset(gw1, asfGlobalFreeze));
1850 MPT
const oF4 = gw1[
"OF4"];
1851 env(offer(gw1, XRP(92), oF4(92)));
1854 env(offer(alice, oF4(92), XRP(92)));
1859 gw1.verifyOwners(__LINE__);
1860 alice.verifyOwners(__LINE__);
1861 bob.verifyOwners(__LINE__);
1864 MPT
const cK4 = gw1[
"CK4"];
1865 uint256 const chkId{getCheckIndex(gw1, env.seq(gw1))};
1866 env(check::create(gw1, bob, cK4(92)));
1869 env(check::cash(bob, chkId, cK4(92)));
1875 gw1.verifyOwners(__LINE__);
1876 alice.verifyOwners(__LINE__);
1877 bob.verifyOwners(__LINE__);
1880 gw1.cleanup(oF4, alice);
1881 gw1.cleanup(cK4, bob);
1890 MPT
const oF4 = gw1[
"OF4"];
1891 gw1.set(oF4, tfMPTLock);
1892 env(offer(gw1, XRP(92), oF4(92)), Ter(
tecLOCKED));
1895 env(offer(alice, oF4(92), XRP(92)), Ter(
tecLOCKED));
1899 gw1.verifyOwners(__LINE__);
1900 alice.verifyOwners(__LINE__);
1901 bob.verifyOwners(__LINE__);
1904 MPT
const cK4 = gw1[
"CK4"];
1905 gw1.set(cK4, tfMPTLock);
1906 uint256 const chkId{getCheckIndex(gw1, env.seq(gw1))};
1907 env(check::create(gw1, alice, cK4(92)), Ter(
tecLOCKED));
1910 env(check::cash(alice, chkId, cK4(92)), Ter(
tecNO_ENTRY));
1914 gw1.verifyOwners(__LINE__);
1915 alice.verifyOwners(__LINE__);
1916 bob.verifyOwners(__LINE__);
1924 gw1.set(oF4, tfMPTUnlock);
1925 gw1.set(cK4, tfMPTUnlock);
1934 MPT
const oF4 = gw1[
"OF4"];
1935 gw1.authorize(oF4, alice);
1936 gw1.pay(gw1, alice, oF4(91));
1937 env(offer(alice, XRP(91), oF4(91)));
1940 env(offer(bob, oF4(91), XRP(91)));
1946 gw1.verifyOwners(__LINE__);
1947 alice.verifyOwners(__LINE__);
1948 bob.verifyOwners(__LINE__);
1951 MPT
const cK4 = gw1[
"CK4"];
1952 uint256 const chkId{getCheckIndex(alice, env.seq(alice))};
1953 env(check::create(alice, bob, cK4(91)));
1956 gw1.authorize(cK4, alice);
1957 gw1.pay(gw1, alice, cK4(91));
1958 env(check::cash(bob, chkId, cK4(91)));
1964 gw1.verifyOwners(__LINE__);
1965 alice.verifyOwners(__LINE__);
1966 bob.verifyOwners(__LINE__);
1969 gw1.cleanup(oF4, alice);
1970 gw1.cleanup(cK4, alice);
1971 gw1.cleanup(oF4, bob);
1972 gw1.cleanup(cK4, bob);
1981 MPT
const oF4 = gw1[
"OF4"];
1982 gw1.set(oF4, tfMPTLock);
1983 env(offer(alice, XRP(91), oF4(91)), Ter(
tecLOCKED));
1986 env(offer(bob, oF4(91), XRP(91)), Ter(
tecLOCKED));
1990 gw1.verifyOwners(__LINE__);
1991 alice.verifyOwners(__LINE__);
1992 bob.verifyOwners(__LINE__);
1995 MPT
const cK4 = gw1[
"CK4"];
1996 gw1.set(cK4, tfMPTLock);
1997 uint256 const chkId{getCheckIndex(alice, env.seq(alice))};
1998 env(check::create(alice, bob, cK4(91)), Ter(
tecLOCKED));
2001 env(check::cash(bob, chkId, cK4(91)), Ter(
tecNO_ENTRY));
2005 gw1.verifyOwners(__LINE__);
2006 alice.verifyOwners(__LINE__);
2007 bob.verifyOwners(__LINE__);
2014 gw1.set(oF4, tfMPTUnlock);
2015 gw1.set(cK4, tfMPTUnlock);
2023 AccountOwns gw2{*
this, env,
"gw2",
true};
2025 env.fund(XRP(5'000), gw2);
2030 env(fset(gw2, asfRequireAuth));
2034 MPT
const oF5 = gw2[
"OF5"];
2035 env(offer(gw2, XRP(92), oF5(92)));
2038 env(offer(alice, oF5(92), XRP(92)));
2043 gw2.verifyOwners(__LINE__);
2044 alice.verifyOwners(__LINE__);
2045 bob.verifyOwners(__LINE__);
2048 MPT
const cK5 = gw2[
"CK5"];
2049 uint256 const chkId{getCheckIndex(gw2, env.seq(gw2))};
2050 env(check::create(gw2, alice, cK5(92)));
2053 env(check::cash(alice, chkId, cK5(92)));
2059 gw2.verifyOwners(__LINE__);
2060 alice.verifyOwners(__LINE__);
2061 bob.verifyOwners(__LINE__);
2064 gw2.cleanup(oF5, alice);
2065 gw2.cleanup(cK5, alice);
2070 AccountOwns gw3{*
this, env,
"gw3",
true,
true};
2072 env.fund(XRP(5'000), gw3);
2075 MPT
const oF5 = gw3[
"OF5"];
2077 env(offer(gw3, XRP(92), oF5(92)));
2081 env(offer(alice, oF5(92), XRP(92)), Ter(
tecNO_AUTH));
2086 gw3.verifyOwners(__LINE__);
2087 alice.verifyOwners(__LINE__);
2088 bob.verifyOwners(__LINE__);
2091 env(offerCancel(gw3, gw3OfferSeq));
2094 gw3.verifyOwners(__LINE__);
2097 MPT
const cK5 = gw3[
"CK5"];
2098 uint256 const chkId{getCheckIndex(gw3, env.seq(gw3))};
2099 env(check::create(gw3, alice, cK5(92)));
2103 env(check::cash(alice, chkId, cK5(92)), Ter(
tecNO_AUTH));
2108 gw3.verifyOwners(__LINE__);
2109 alice.verifyOwners(__LINE__);
2110 bob.verifyOwners(__LINE__);
2118 env(check::cancel(gw3, chkId));
2121 gw3.verifyOwners(__LINE__);
2130 MPT
const oF5 = gw2[
"OF5"];
2131 gw2.authorize(oF5, alice);
2132 gw2.pay(gw2, alice, oF5(91));
2133 env(offer(alice, XRP(91), oF5(91)));
2135 env(offer(bob, oF5(91), XRP(91)));
2140 gw2.verifyOwners(__LINE__);
2141 alice.verifyOwners(__LINE__);
2142 bob.verifyOwners(__LINE__);
2145 MPT
const cK5 = gw2[
"CK5"];
2146 gw2.authorize(cK5, alice);
2147 gw2.pay(gw2, alice, cK5(91));
2148 uint256 const chkId{getCheckIndex(alice, env.seq(alice))};
2149 env(check::create(alice, bob, cK5(91)));
2152 env(check::cash(bob, chkId, cK5(91)));
2157 gw2.verifyOwners(__LINE__);
2158 alice.verifyOwners(__LINE__);
2159 bob.verifyOwners(__LINE__);
2169 MPT
const oF5 = gw3[
"OF5"];
2172 env(offer(bob, oF5(91), XRP(91)), Ter(
tecNO_AUTH));
2176 gw3.verifyOwners(__LINE__);
2177 alice.verifyOwners(__LINE__);
2178 bob.verifyOwners(__LINE__);
2181 MPT
const cK5 = gw3[
"CK5"];
2182 uint256 const chkId{getCheckIndex(alice, env.seq(alice))};
2183 env(check::create(alice, bob, cK5(91)));
2190 env(check::cancel(alice, chkId));
2194 gw3.verifyOwners(__LINE__);
2195 alice.verifyOwners(__LINE__);
2196 bob.verifyOwners(__LINE__);