312 Account const gwF{
"gatewayFrozen"};
315 IOU
const usd{gw1[
"USD"]};
317 Env env{*
this, features};
319 STAmount const startBalance{XRP(1000).value()};
320 env.fund(startBalance, gw1, gwF, alice, bob);
324 env(check::create(alice, bob, usd(50)), Fee(drops(-10)), Ter(
temBAD_FEE));
328 env(check::create(alice, bob, usd(50)), Txflags(tfImmediateOrCancel), Ter(
temINVALID_FLAG));
332 env(check::create(alice, alice, XRP(10)), Ter(
temREDUNDANT));
336 env(check::create(alice, bob, drops(-1)), Ter(
temBAD_AMOUNT));
339 env(check::create(alice, bob, drops(0)), Ter(
temBAD_AMOUNT));
342 env(check::create(alice, bob, drops(1)));
351 env(check::create(alice, bob, usd(1)));
360 env(check::create(alice, bob, usd(50)),
367 env(check::create(alice, bogie, usd(50)), Ter(
tecNO_DST));
371 env(fset(bob, asfRequireDest));
377 env(check::create(alice, bob, usd(50)), DestTag(11));
380 env(fclear(bob, asfRequireDest));
384 IOU
const usf{gwF[
"USF"]};
385 env(fset(gwF, asfGlobalFreeze));
388 env(check::create(alice, bob, usf(50)), Ter(
tecFROZEN));
391 env(check::create(gwF, bob, usf(50)), Ter(
tecFROZEN));
394 env(fclear(gwF, asfGlobalFreeze));
397 env(check::create(alice, bob, usf(50)));
400 env(check::create(gwF, bob, usf(50)));
406 env.trust(usd(1000), alice);
407 env.trust(usd(1000), bob);
409 env(pay(gw1, alice, usd(25)));
410 env(pay(gw1, bob, usd(25)));
416 env(trust(gw1, alice[
"USD"](0), tfSetFreeze));
418 env(check::create(alice, bob, usd(50)), Ter(
tecFROZEN));
422 env(check::create(bob, alice, usd(50)));
424 env(pay(bob, alice, usd(1)));
426 env(check::create(gw1, alice, usd(50)));
428 env(pay(gw1, alice, usd(1)));
432 env(trust(gw1, alice[
"USD"](0), tfClearFreeze));
434 env(check::create(alice, bob, usd(50)));
436 env(check::create(bob, alice, usd(50)));
438 env(check::create(gw1, alice, usd(50)));
444 env(trust(alice, usd(0), tfSetFreeze));
446 env(check::create(alice, bob, usd(50)));
448 env(pay(alice, bob, usd(1)));
450 env(check::create(bob, alice, usd(50)), Ter(
tecFROZEN));
454 env(check::create(gw1, alice, usd(50)), Ter(
tecFROZEN));
460 env(trust(alice, usd(0), tfClearFreeze));
465 env(check::create(alice, bob, usd(50)), Expiration(env.now()), Ter(
tecEXPIRED));
468 using namespace std::chrono_literals;
469 env(check::create(alice, bob, usd(50)), Expiration(env.now() + 1s));
474 env.fund(env.current()->fees().accountReserve(1, 1) - drops(1), cheri);
477 env(check::create(cheri, bob, usd(50)),
478 Fee(drops(env.current()->fees().base)),
482 env(pay(bob, cheri, drops(env.current()->fees().base + 1)));
485 env(check::create(cheri, bob, usd(50)));
500 Env env{*
this, features};
502 XRPAmount const baseFeeDrops{env.current()->fees().base};
503 STAmount const startBalance{XRP(300).value()};
504 env.fund(startBalance, alice, bob);
509 env(check::create(alice, bob, XRP(10)));
511 env.require(Balance(alice, startBalance - drops(baseFeeDrops)));
512 env.require(Balance(bob, startBalance));
518 env(check::cash(bob, chkId, XRP(10)));
520 env.require(Balance(alice, startBalance - XRP(10) - drops(baseFeeDrops)));
521 env.require(Balance(bob, startBalance + XRP(10) - drops(baseFeeDrops)));
528 env(pay(env.master, alice, XRP(10) + drops(baseFeeDrops)));
529 env(pay(bob, env.master, XRP(10) - drops(baseFeeDrops * 2)));
531 env.require(Balance(alice, startBalance));
532 env.require(Balance(bob, startBalance));
536 STAmount const reserve{env.current()->fees().reserve};
537 STAmount const checkAmount{startBalance - reserve - drops(baseFeeDrops)};
539 env(check::create(alice, bob, checkAmount));
543 env(check::cash(bob, chkId, checkAmount + drops(1)), Ter(
tecPATH_PARTIAL));
545 env(check::cash(bob, chkId, check::DeliverMin(checkAmount + drops(1))),
552 env(check::cash(bob, chkId, check::DeliverMin(checkAmount)));
554 env.require(Balance(alice, reserve));
555 env.require(Balance(bob, startBalance + checkAmount - drops(baseFeeDrops * 3)));
562 env(pay(env.master, alice, checkAmount + drops(baseFeeDrops)));
563 env(pay(bob, env.master, checkAmount - drops(baseFeeDrops * 4)));
565 env.require(Balance(alice, startBalance));
566 env.require(Balance(bob, startBalance));
570 STAmount const reserve{env.current()->fees().reserve};
571 STAmount const checkAmount{startBalance - reserve - drops(baseFeeDrops - 1)};
573 env(check::create(alice, bob, checkAmount));
582 env(check::cash(bob, chkId, check::DeliverMin(drops(1))));
584 env.require(Balance(alice, reserve));
585 env.require(Balance(bob, startBalance + checkAmount - drops(baseFeeDrops * 2 + 1)));
592 env(pay(env.master, alice, checkAmount + drops(baseFeeDrops - 1)));
593 env(pay(bob, env.master, checkAmount - drops(baseFeeDrops * 3 + 1)));
595 env.require(Balance(alice, startBalance));
596 env.require(Balance(bob, startBalance));
611 IOU
const usd{gw[
"USD"]};
614 Env env{*
this, features};
616 env.fund(XRP(1000), gw, alice, bob);
621 env(check::create(alice, bob, usd(10)));
629 env(trust(alice, usd(20)));
631 env(pay(gw, alice, usd(9.5)));
638 env(pay(gw, alice, usd(0.5)));
642 env(trust(bob, usd(9.5)));
647 env(trust(bob, usd(10.5)));
653 env(check::cash(bob, chkId1, usd(10)));
655 env.require(Balance(alice, usd(0)));
656 env.require(Balance(bob, usd(10)));
664 env(check::cash(bob, chkId1, usd(10)), Ter(
tecNO_ENTRY));
668 env(pay(bob, alice, usd(7)));
672 env(check::create(alice, bob, usd(7)));
679 env(check::cash(bob, chkId2, usd(5)));
681 env.require(Balance(alice, usd(2)));
682 env.require(Balance(bob, usd(8)));
690 env(check::create(alice, bob, usd(2)));
693 env(check::create(alice, bob, usd(2)));
699 env(check::cash(bob, chkId4, usd(2)));
701 env.require(Balance(alice, usd(0)));
702 env.require(Balance(bob, usd(10)));
712 env.require(Balance(alice, usd(0)));
713 env.require(Balance(bob, usd(10)));
733 env(check::create(gw, bob, usd(20)));
737 env(check::cash(bob, chkId20, usd(20)));
739 env.require(Balance(bob, usd(30)));
743 env(pay(bob, gw, usd(20)));
746 env(check::cancel(bob, chkId3));
748 env.require(Balance(alice, usd(0)));
749 env.require(Balance(bob, usd(10)));
757 Env env{*
this, features};
759 env.fund(XRP(1000), gw, alice, bob);
762 env(trust(alice, usd(20)));
763 env(trust(bob, usd(20)));
765 env(pay(gw, alice, usd(8)));
770 env(check::create(alice, bob, usd(9)));
773 env(check::create(alice, bob, usd(8)));
776 env(check::create(alice, bob, usd(7)));
779 env(check::create(alice, bob, usd(6)));
784 env(check::cash(bob, chkId9, check::DeliverMin(usd(9))), Ter(
tecPATH_PARTIAL));
788 env(check::cash(bob, chkId9, check::DeliverMin(usd(7))));
790 env.require(Balance(alice, usd(0)));
791 env.require(Balance(bob, usd(8)));
798 env(pay(bob, alice, usd(7)));
803 env(check::cash(bob, chkId7, check::DeliverMin(usd(7))));
805 env.require(Balance(alice, usd(0)));
806 env.require(Balance(bob, usd(8)));
813 env(pay(bob, alice, usd(8)));
818 env(check::cash(bob, chkId6, check::DeliverMin(usd(4))));
820 env.require(Balance(alice, usd(2)));
821 env.require(Balance(bob, usd(6)));
829 env(check::cash(bob, chkId8, check::DeliverMin(usd(2))));
831 env.require(Balance(alice, usd(0)));
832 env.require(Balance(bob, usd(8)));
840 Env env(*
this, features);
842 env.fund(XRP(1000), gw, alice, bob);
843 env(fset(gw, asfRequireAuth));
845 env(trust(gw, alice[
"USD"](100)), Txflags(tfSetfAuth));
846 env(trust(alice, usd(20)));
848 env(pay(gw, alice, usd(8)));
854 env(check::create(alice, bob, usd(7)));
857 env(check::cash(bob, chkId, usd(7)), Ter(
tecNO_AUTH));
862 env(trust(bob, usd(5)));
865 env(check::cash(bob, chkId, usd(7)), Ter(
tecNO_AUTH));
869 env(trust(gw, bob[
"USD"](1)), Txflags(tfSetfAuth));
879 env(check::cash(bob, chkId, check::DeliverMin(usd(4))));
882 env.require(Balance(alice, usd(8) - bobGot));
883 env.require(Balance(bob, bobGot));
893 Env env{*
this, features};
894 env.fund(XRP(1000), gw, alice, bob);
899 env(check::create(alice, bob, usd(1)));
903 env(check::create(alice, bob, usd(2)));
906 env(trust(alice, usd(20)));
907 env(trust(bob, usd(20)));
909 env(pay(gw, alice, usd(8)));
914 env(regkey(bob, bobby));
919 env(signers(bob, 2, {{bogie, 1}, {demon, 1}}), Sig(bobby));
925 env(check::cash(bob, chkId1, (usd(1))), Sig(bobby));
927 env.require(Balance(alice, usd(7)));
928 env.require(Balance(bob, usd(1)));
935 XRPAmount const baseFeeDrops{env.current()->fees().base};
936 env(check::cash(bob, chkId2, (usd(2))), Msig(bogie, demon), Fee(3 * baseFeeDrops));
938 env.require(Balance(alice, usd(5)));
939 env.require(Balance(bob, usd(3)));
1028 IOU
const usd{gw[
"USD"]};
1030 Env env{*
this, features};
1032 env.fund(XRP(1000), gw, alice, bob);
1035 env(trust(alice, usd(1000)));
1036 env(trust(bob, usd(1000)));
1038 env(pay(gw, alice, usd(1000)));
1046 auto qIn = [](
double percent) {
return QualityInPercent(percent); };
1047 auto qOut = [](
double percent) {
return QualityOutPercent(percent); };
1051 auto testNonIssuerQPay = [&env, &alice, &bob, &usd](
1054 auto const& inOrOut,
1058 STAmount const aliceStart{env.balance(alice, usd).value()};
1059 STAmount const bobStart{env.balance(bob, usd).value()};
1062 env(trust(truster, iou(1000)), inOrOut(pct));
1065 env(pay(alice, bob, usd(amount)), Sendmax(usd(10)));
1067 env.require(Balance(alice, aliceStart - usd(10)));
1068 env.require(Balance(bob, bobStart + usd(10)));
1072 env(trust(truster, iou(1000)), inOrOut(0));
1076 auto testNonIssuerQCheck = [&env, &alice, &bob, &usd](
1079 auto const& inOrOut,
1083 STAmount const aliceStart{env.balance(alice, usd).value()};
1084 STAmount const bobStart{env.balance(bob, usd).value()};
1087 env(trust(truster, iou(1000)), inOrOut(pct));
1091 env(check::create(alice, bob, usd(10)));
1094 env(check::cash(bob, chkId, usd(amount)));
1096 env.require(Balance(alice, aliceStart - usd(10)));
1097 env.require(Balance(bob, bobStart + usd(10)));
1101 env(trust(truster, iou(1000)), inOrOut(0));
1106 testNonIssuerQPay(alice, gw[
"USD"], qIn, 50, 10);
1107 testNonIssuerQCheck(alice, gw[
"USD"], qIn, 50, 10);
1110 testNonIssuerQPay(bob, gw[
"USD"], qIn, 50, 5);
1111 testNonIssuerQCheck(bob, gw[
"USD"], qIn, 50, 5);
1113 testNonIssuerQPay(gw, alice[
"USD"], qIn, 50, 10);
1114 testNonIssuerQCheck(gw, alice[
"USD"], qIn, 50, 10);
1116 testNonIssuerQPay(gw, bob[
"USD"], qIn, 50, 10);
1117 testNonIssuerQCheck(gw, bob[
"USD"], qIn, 50, 10);
1119 testNonIssuerQPay(alice, gw[
"USD"], qOut, 200, 10);
1120 testNonIssuerQCheck(alice, gw[
"USD"], qOut, 200, 10);
1122 testNonIssuerQPay(bob, gw[
"USD"], qOut, 200, 10);
1123 testNonIssuerQCheck(bob, gw[
"USD"], qOut, 200, 10);
1125 testNonIssuerQPay(gw, alice[
"USD"], qOut, 200, 10);
1126 testNonIssuerQCheck(gw, alice[
"USD"], qOut, 200, 10);
1128 testNonIssuerQPay(gw, bob[
"USD"], qOut, 200, 10);
1129 testNonIssuerQCheck(gw, bob[
"USD"], qOut, 200, 10);
1136 auto testIssuerQPay = [&env, &gw, &alice, &usd](
1139 auto const& inOrOut,
1147 STAmount const aliceStart{env.balance(alice, usd).value()};
1150 env(trust(truster, iou(1000)), inOrOut(pct));
1154 env(pay(alice, gw, usd(amt1)), Sendmax(usd(max1)));
1156 env.require(Balance(alice, aliceStart - usd(10)));
1159 env(pay(gw, alice, usd(amt2)), Sendmax(usd(max2)));
1161 env.require(Balance(alice, aliceStart));
1165 env(trust(truster, iou(1000)), inOrOut(0));
1169 auto testIssuerQCheck = [&env, &gw, &alice, &usd](
1172 auto const& inOrOut,
1180 STAmount const aliceStart{env.balance(alice, usd).value()};
1183 env(trust(truster, iou(1000)), inOrOut(pct));
1188 env(check::create(alice, gw, usd(max1)));
1191 env(check::cash(gw, chkAliceId, usd(amt1)));
1193 env.require(Balance(alice, aliceStart - usd(10)));
1197 env(check::create(gw, alice, usd(max2)));
1200 env(check::cash(alice, chkGwId, usd(amt2)));
1202 env.require(Balance(alice, aliceStart));
1206 env(trust(truster, iou(1000)), inOrOut(0));
1212 testIssuerQPay(alice, gw[
"USD"], qIn, 50, 10, 10, 5, 10);
1213 testIssuerQCheck(alice, gw[
"USD"], qIn, 50, 10, 10, 5, 10);
1215 testIssuerQPay(gw, alice[
"USD"], qIn, 50, 10, 10, 10, 10);
1216 testIssuerQCheck(gw, alice[
"USD"], qIn, 50, 10, 10, 10, 10);
1218 testIssuerQPay(alice, gw[
"USD"], qOut, 200, 10, 10, 10, 10);
1219 testIssuerQCheck(alice, gw[
"USD"], qOut, 200, 10, 10, 10, 10);
1221 testIssuerQPay(gw, alice[
"USD"], qOut, 200, 10, 10, 10, 10);
1222 testIssuerQCheck(gw, alice[
"USD"], qOut, 200, 10, 10, 10, 10);
1237 IOU
const usd{gw[
"USD"]};
1239 Env env(*
this, features);
1241 env.fund(XRP(1000), gw, alice, bob, zoe);
1245 env(trust(alice, usd(20)));
1247 env(pay(gw, alice, usd(20)));
1251 env(trust(bob, usd(20)));
1257 env(check::cash(bob, chkId, usd(20)), Ter(
tecNO_ENTRY));
1262 if (features[fixCleanup3_3_0])
1270 env(check::create(alice, bob, usd(20)));
1274 env(check::create(alice, bob, XRP(10)));
1277 using namespace std::chrono_literals;
1279 env(check::create(alice, bob, XRP(10)), Expiration(env.now() + 1s));
1283 env(check::create(alice, bob, usd(1)));
1287 env(check::create(alice, bob, usd(2)));
1291 env(check::create(alice, bob, usd(3)));
1295 env(check::create(alice, bob, usd(4)));
1299 env(check::create(alice, gw, usd(4)));
1303 env(check::create(gw, alice, usd(4)));
1307 env(check::create(alice, bob, usd(1)));
1311 env(check::create(alice, bob, usd(2)), DestTag(7));
1315 auto failingCases = [&env, &gw, &alice, &bob](
1318 env(check::cash(bob, chkId, amount), Fee(drops(-10)), Ter(
temBAD_FEE));
1322 env(check::cash(bob, chkId, amount),
1323 Txflags(tfImmediateOrCancel),
1348 env(check::cash(bob, chkId, amount.zeroed()), Ter(
temBAD_AMOUNT));
1353 if (!amount.native())
1370 IOU
const wrongCurrency{gw[
"EUR"]};
1373 env(check::cash(bob, chkId, badAmount), Ter(
temMALFORMED));
1379 IOU
const wrongIssuer{alice[
"USD"]};
1382 env(check::cash(bob, chkId, badAmount), Ter(
temMALFORMED));
1391 env(check::cash(bob, chkId, check::DeliverMin(amount + amount)), Ter(
tecPATH_PARTIAL));
1395 failingCases(chkIdX, XRP(10));
1396 failingCases(chkIdU, usd(20));
1399 env(check::cash(bob, chkIdU, usd(20)));
1401 env(check::cash(bob, chkIdX, check::DeliverMin(XRP(10))));
1405 env(check::cash(bob, chkIdExp, XRP(10)), Ter(
tecEXPIRED));
1409 env(check::cancel(zoe, chkIdExp));
1414 env(pay(bob, alice, usd(20)));
1416 env.require(Balance(alice, usd(20)));
1417 env.require(Balance(bob, usd(0)));
1420 env(fset(gw, asfGlobalFreeze));
1425 env(check::cash(bob, chkIdFroz1, check::DeliverMin(usd(0.5))), Ter(
tecPATH_PARTIAL));
1428 env(check::cash(gw, chkIdFroz4ToIssuer, usd(1)), Ter(
tecPATH_PARTIAL));
1430 env(check::cash(gw, chkIdFroz4ToIssuer, check::DeliverMin(usd(0.5))),
1434 env(check::cash(alice, chkIdFroz4Issuer, usd(1)), Ter(
tecFROZEN));
1436 env(check::cash(alice, chkIdFroz4Issuer, check::DeliverMin(usd(0.5))), Ter(
tecFROZEN));
1439 env(fclear(gw, asfGlobalFreeze));
1443 env(check::cash(bob, chkIdFroz1, usd(1)));
1445 env.require(Balance(alice, usd(19)));
1446 env.require(Balance(bob, usd(1)));
1448 env(check::cash(gw, chkIdFroz4ToIssuer, usd(1)));
1452 env(trust(gw, alice[
"USD"](0), tfSetFreeze));
1456 env(check::cash(bob, chkIdFroz2, check::DeliverMin(usd(1))), Ter(
tecPATH_PARTIAL));
1460 env(trust(gw, alice[
"USD"](0), tfClearFreeze));
1462 env(check::cash(bob, chkIdFroz2, usd(2)));
1464 env.require(Balance(alice, usd(16)));
1465 env.require(Balance(bob, usd(3)));
1468 env(trust(gw, bob[
"USD"](0), tfSetFreeze));
1470 env(check::cash(bob, chkIdFroz3, usd(3)), Ter(
tecFROZEN));
1472 env(check::cash(bob, chkIdFroz3, check::DeliverMin(usd(1))), Ter(
tecFROZEN));
1476 env(trust(gw, bob[
"USD"](0), tfClearFreeze));
1478 env(check::cash(bob, chkIdFroz3, check::DeliverMin(usd(1))));
1480 env.require(Balance(alice, usd(13)));
1481 env.require(Balance(bob, usd(6)));
1485 env(trust(bob, usd(20), tfSetFreeze));
1487 env(check::cash(bob, chkIdFroz4, usd(4)), Ter(
terNO_LINE));
1489 env(check::cash(bob, chkIdFroz4, check::DeliverMin(usd(1))), Ter(
terNO_LINE));
1493 env(trust(bob, usd(20), tfClearFreeze));
1495 env(check::cash(bob, chkIdFroz4, usd(4)));
1497 env.require(Balance(alice, usd(9)));
1498 env.require(Balance(bob, usd(10)));
1503 env(fset(bob, asfRequireDest));
1507 env(check::cash(bob, chkIdNoDest1, check::DeliverMin(usd(0.5))),
1512 env(check::cash(bob, chkIdHasDest2, usd(2)));
1514 env.require(Balance(alice, usd(7)));
1515 env.require(Balance(bob, usd(12)));
1519 env(fclear(bob, asfRequireDest));
1521 env(check::cash(bob, chkIdNoDest1, usd(1)));
1523 env.require(Balance(alice, usd(6)));
1524 env.require(Balance(bob, usd(13)));
1540 IOU
const usd{gw[
"USD"]};
1543 Env env{*
this, features};
1545 env.fund(XRP(1000), gw, alice, bob, zoe);
1551 env(check::create(alice, bob, usd(10)));
1555 env(check::create(alice, bob, XRP(10)));
1559 env(check::create(alice, bob, usd(10)));
1563 using namespace std::chrono_literals;
1565 env(check::create(alice, bob, XRP(10)), Expiration(env.now() + 600s));
1569 env(check::create(alice, bob, usd(10)), Expiration(env.now() + 600s));
1573 env(check::create(alice, bob, XRP(10)), Expiration(env.now() + 600s));
1578 env(check::create(alice, bob, usd(10)), Expiration(env.now() + 1s));
1582 env(check::create(alice, bob, XRP(10)), Expiration(env.now() + 1s));
1586 env(check::create(alice, bob, usd(10)), Expiration(env.now() + 1s));
1591 env(check::create(alice, bob, usd(10)));
1595 env(check::create(alice, bob, XRP(10)));
1601 env(check::cancel(alice, chkId1));
1606 env(check::cancel(bob, chkId2));
1617 env(check::cancel(alice, chkIdNotExp1));
1622 env(check::cancel(bob, chkIdNotExp2));
1633 env(check::cancel(alice, chkIdExp1));
1638 env(check::cancel(bob, chkIdExp2));
1643 env(check::cancel(zoe, chkIdExp3));
1650 env(regkey(alice, alie));
1655 env(signers(alice, 2, {{bogie, 1}, {demon, 1}}), Sig(alie));
1659 env(check::cancel(alice, chkIdReg), Sig(alie));
1665 XRPAmount const baseFeeDrops{env.current()->fees().base};
1666 env(check::cancel(alice, chkIdMSig), Msig(bogie, demon), Fee(3 * baseFeeDrops));
1672 env(check::cancel(alice, chkId3), Sig(alice));
1677 env(check::cancel(bob, chkIdNotExp3));
1766 IOU
const usd{gw[
"USD"]};
1768 Env env{*
this, features};
1769 env.fund(XRP(1000), gw, alice, bob);
1776 env(ticket::create(alice, 10));
1780 env(ticket::create(bob, 10));
1784 env.require(Owners(alice, 10));
1785 env.require(Owners(bob, 10));
1788 env(trust(alice, usd(1000)), ticket::Use(aliceTicketSeq++));
1789 env(trust(bob, usd(1000)), ticket::Use(bobTicketSeq++));
1791 env.require(Owners(alice, 10));
1792 env.require(Owners(bob, 10));
1794 env.require(tickets(alice, env.seq(alice) - aliceTicketSeq));
1795 BEAST_EXPECT(env.seq(alice) == aliceSeq);
1797 env.require(tickets(bob, env.seq(bob) - bobTicketSeq));
1798 BEAST_EXPECT(env.seq(bob) == bobSeq);
1800 env(pay(gw, alice, usd(900)));
1806 env(check::create(alice, bob, XRP(200)), ticket::Use(aliceTicketSeq++));
1809 env(check::create(alice, bob, XRP(300)), ticket::Use(aliceTicketSeq++));
1812 env(check::create(alice, bob, usd(200)), ticket::Use(aliceTicketSeq++));
1815 env(check::create(alice, bob, usd(300)), ticket::Use(aliceTicketSeq++));
1819 env.require(Owners(alice, 10));
1820 env.require(tickets(alice, env.seq(alice) - aliceTicketSeq));
1822 BEAST_EXPECT(env.seq(alice) == aliceSeq);
1824 env.require(Owners(bob, 10));
1825 BEAST_EXPECT(env.seq(bob) == bobSeq);
1828 env(check::cancel(bob, chkIdXrp1), ticket::Use(bobTicketSeq++));
1829 env(check::cancel(bob, chkIdUsd2), ticket::Use(bobTicketSeq++));
1832 env.require(Owners(alice, 8));
1833 env.require(tickets(alice, env.seq(alice) - aliceTicketSeq));
1835 BEAST_EXPECT(env.seq(alice) == aliceSeq);
1837 env.require(Owners(bob, 8));
1838 BEAST_EXPECT(env.seq(bob) == bobSeq);
1841 env(check::cash(bob, chkIdXrp2, XRP(300)), ticket::Use(bobTicketSeq++));
1842 env(check::cash(bob, chkIdUsd1, usd(200)), ticket::Use(bobTicketSeq++));
1845 env.require(Owners(alice, 6));
1846 env.require(tickets(alice, env.seq(alice) - aliceTicketSeq));
1848 BEAST_EXPECT(env.seq(alice) == aliceSeq);
1849 env.require(Balance(alice, usd(700)));
1851 env.require(Owners(bob, 6));
1852 BEAST_EXPECT(env.seq(bob) == bobSeq);
1853 env.require(Balance(bob, usd(200)));
1866 Env env{*
this, features};
1880 ownerCount(env, acct) == owners,
"Owner count mismatch", __FILE__, line);
1901 AccountOwns alice{.suite = *
this, .env = env, .acct =
"alice", .owners = 0};
1902 AccountOwns bob{.suite = *
this, .env = env, .acct =
"bob", .owners = 0};
1905 env.fund(XRP(5000), noripple(alice, bob));
1911 AccountOwns
const gw1{.suite = *
this, .env = env, .acct =
"gw1", .owners = 0};
1916 env.fund(XRP(5000), noripple(gw1));
1919 IOU
const cK8 = gw1[
"CK8"];
1920 gw1.verifyOwners(__LINE__);
1927 env.fund(XRP(200), yui);
1931 env(check::create(gw1, yui, cK8(99)));
1936 alice.verifyOwners(__LINE__);
1940 env(pay(env.master, yui, XRP(51)));
1942 env(check::cash(yui, chkId, cK8(99)));
1949 gw1.verifyOwners(__LINE__);
1964 auto cmpTrustLines = [
this, &env](
1967 IOU
const& offerIou,
1968 IOU
const& checkIou) {
1969 auto const offerLine = env.le(
keylet::trustLine(acct1, acct2, offerIou.currency));
1970 auto const checkLine = env.le(
keylet::trustLine(acct1, acct2, checkIou.currency));
1971 if (offerLine ==
nullptr || checkLine ==
nullptr)
1973 BEAST_EXPECT(offerLine ==
nullptr && checkLine ==
nullptr);
1979 BEAST_EXPECT(offerLine->at(sfFlags) == checkLine->at(sfFlags));
1983 auto cmpReqAmount = [
this, offerLine, checkLine](
SF_AMOUNT const& sfield) {
1984 STAmount const offerAmount = offerLine->at(sfield);
1985 STAmount const checkAmount = checkLine->at(sfield);
1988 if (!BEAST_EXPECT(!offerAmount.
native() && !checkAmount.
native()))
1996 cmpReqAmount(sfBalance);
1997 cmpReqAmount(sfLowLimit);
1998 cmpReqAmount(sfHighLimit);
2002 auto cmpOptField = [
this, offerLine, checkLine](
auto const& sfield) {
2005 offerLine->isFieldPresent(sfield) == checkLine->isFieldPresent(sfield)))
2010 if (!offerLine->isFieldPresent(sfield))
2015 BEAST_EXPECT(offerLine->at(sfield) == checkLine->at(sfield));
2017 cmpOptField(sfLowNode);
2018 cmpOptField(sfLowQualityIn);
2019 cmpOptField(sfLowQualityOut);
2021 cmpOptField(sfHighNode);
2022 cmpOptField(sfHighQualityIn);
2023 cmpOptField(sfHighQualityOut);
2031 AccountOwns
const gw1{.suite = *
this, .env = env, .acct =
"gw1", .owners = 0};
2033 BEAST_EXPECT((*env.le(gw1))[sfFlags] == 0);
2034 BEAST_EXPECT((*env.le(alice))[sfFlags] == 0);
2035 BEAST_EXPECT((*env.le(bob))[sfFlags] == 0);
2038 IOU
const oF1 = gw1[
"OF1"];
2039 env(offer(gw1, XRP(98), oF1(98)));
2042 env(offer(alice, oF1(98), XRP(98)));
2049 gw1.verifyOwners(__LINE__);
2052 alice.verifyOwners(__LINE__);
2055 IOU
const cK1 = gw1[
"CK1"];
2057 env(check::create(gw1, alice, cK1(98)));
2060 env(check::cash(alice, chkId, cK1(98)));
2068 gw1.verifyOwners(__LINE__);
2071 alice.verifyOwners(__LINE__);
2073 cmpTrustLines(gw1, alice, oF1, cK1);
2084 AccountOwns
const gw1{.suite = *
this, .env = env, .acct =
"gw1", .owners = 0};
2085 IOU
const oF1 = gw1[
"OF1"];
2086 env(offer(alice, XRP(97), oF1(97)));
2089 env(offer(bob, oF1(97), XRP(97)));
2094 env.require(Balance(alice, oF1(1)));
2095 env.require(Balance(bob, oF1(97)));
2098 gw1.verifyOwners(__LINE__);
2099 alice.verifyOwners(__LINE__);
2100 bob.verifyOwners(__LINE__);
2108 IOU
const cK1 = gw1[
"CK1"];
2110 env(check::create(alice, bob, cK1(97)));
2113 env(check::cash(bob, chkId, cK1(97)), Ter(
terNO_RIPPLE));
2120 env(check::cancel(alice, chkId));
2124 gw1.verifyOwners(__LINE__);
2125 alice.verifyOwners(__LINE__);
2126 bob.verifyOwners(__LINE__);
2133 AccountOwns
const gw1{.suite = *
this, .env = env, .acct =
"gw1", .owners = 0};
2134 env(fset(gw1, asfDefaultRipple));
2138 IOU
const oF2 = gw1[
"OF2"];
2139 env(offer(gw1, XRP(96), oF2(96)));
2142 env(offer(alice, oF2(96), XRP(96)));
2149 gw1.verifyOwners(__LINE__);
2152 alice.verifyOwners(__LINE__);
2155 IOU
const cK2 = gw1[
"CK2"];
2157 env(check::create(gw1, alice, cK2(96)));
2160 env(check::cash(alice, chkId, cK2(96)));
2168 gw1.verifyOwners(__LINE__);
2171 alice.verifyOwners(__LINE__);
2173 cmpTrustLines(gw1, alice, oF2, cK2);
2181 AccountOwns
const gw1{.suite = *
this, .env = env, .acct =
"gw1", .owners = 0};
2182 IOU
const oF2 = gw1[
"OF2"];
2183 env(offer(alice, XRP(95), oF2(95)));
2186 env(offer(bob, oF2(95), XRP(95)));
2191 gw1.verifyOwners(__LINE__);
2192 alice.verifyOwners(__LINE__);
2193 bob.verifyOwners(__LINE__);
2196 IOU
const cK2 = gw1[
"CK2"];
2198 env(check::create(alice, bob, cK2(95)));
2201 env(check::cash(bob, chkId, cK2(95)));
2207 gw1.verifyOwners(__LINE__);
2208 alice.verifyOwners(__LINE__);
2209 bob.verifyOwners(__LINE__);
2211 cmpTrustLines(alice, bob, oF2, cK2);
2222 AccountOwns
const gw1{.suite = *
this, .env = env, .acct =
"gw1", .owners = 0};
2223 env(fset(gw1, asfDepositAuth));
2224 env(fset(alice, asfDepositAuth));
2225 env(fset(bob, asfDepositAuth));
2229 IOU
const oF3 = gw1[
"OF3"];
2230 env(offer(gw1, XRP(94), oF3(94)));
2233 env(offer(alice, oF3(94), XRP(94)));
2240 gw1.verifyOwners(__LINE__);
2243 alice.verifyOwners(__LINE__);
2246 IOU
const cK3 = gw1[
"CK3"];
2248 env(check::create(gw1, alice, cK3(94)));
2251 env(check::cash(alice, chkId, cK3(94)));
2259 gw1.verifyOwners(__LINE__);
2262 alice.verifyOwners(__LINE__);
2264 cmpTrustLines(gw1, alice, oF3, cK3);
2272 AccountOwns
const gw1{.suite = *
this, .env = env, .acct =
"gw1", .owners = 0};
2273 IOU
const oF3 = gw1[
"OF3"];
2274 env(offer(alice, XRP(93), oF3(93)));
2277 env(offer(bob, oF3(93), XRP(93)));
2282 gw1.verifyOwners(__LINE__);
2283 alice.verifyOwners(__LINE__);
2284 bob.verifyOwners(__LINE__);
2287 IOU
const cK3 = gw1[
"CK3"];
2289 env(check::create(alice, bob, cK3(93)));
2292 env(check::cash(bob, chkId, cK3(93)));
2298 gw1.verifyOwners(__LINE__);
2299 alice.verifyOwners(__LINE__);
2300 bob.verifyOwners(__LINE__);
2302 cmpTrustLines(alice, bob, oF3, cK3);
2309 AccountOwns
const gw1{.suite = *
this, .env = env, .acct =
"gw1", .owners = 0};
2310 env(fset(gw1, asfGlobalFreeze));
2314 IOU
const oF4 = gw1[
"OF4"];
2315 env(offer(gw1, XRP(92), oF4(92)), Ter(
tecFROZEN));
2318 env(offer(alice, oF4(92), XRP(92)), Ter(
tecFROZEN));
2322 gw1.verifyOwners(__LINE__);
2323 alice.verifyOwners(__LINE__);
2324 bob.verifyOwners(__LINE__);
2327 IOU
const cK4 = gw1[
"CK4"];
2329 env(check::create(gw1, alice, cK4(92)), Ter(
tecFROZEN));
2332 env(check::cash(alice, chkId, cK4(92)), Ter(
tecNO_ENTRY));
2336 gw1.verifyOwners(__LINE__);
2337 alice.verifyOwners(__LINE__);
2338 bob.verifyOwners(__LINE__);
2351 AccountOwns
const gw1{.suite = *
this, .env = env, .acct =
"gw1", .owners = 0};
2352 IOU
const oF4 = gw1[
"OF4"];
2353 env(offer(alice, XRP(91), oF4(91)), Ter(
tecFROZEN));
2356 env(offer(bob, oF4(91), XRP(91)), Ter(
tecFROZEN));
2360 gw1.verifyOwners(__LINE__);
2361 alice.verifyOwners(__LINE__);
2362 bob.verifyOwners(__LINE__);
2365 IOU
const cK4 = gw1[
"CK4"];
2367 env(check::create(alice, bob, cK4(91)), Ter(
tecFROZEN));
2370 env(check::cash(bob, chkId, cK4(91)), Ter(
tecNO_ENTRY));
2374 gw1.verifyOwners(__LINE__);
2375 alice.verifyOwners(__LINE__);
2376 bob.verifyOwners(__LINE__);
2390 AccountOwns gw2{.suite = *
this, .env = env, .acct =
"gw2", .owners = 0};
2391 env.fund(XRP(5000), gw2);
2396 env(fset(gw2, asfRequireAuth));
2400 IOU
const oF5 = gw2[
"OF5"];
2402 env(offer(gw2, XRP(92), oF5(92)));
2406 env(offer(alice, oF5(92), XRP(92)), Ter(
tecNO_LINE));
2411 gw2.verifyOwners(__LINE__);
2412 alice.verifyOwners(__LINE__);
2413 bob.verifyOwners(__LINE__);
2416 env(offerCancel(gw2, gw2OfferSeq));
2419 gw2.verifyOwners(__LINE__);
2422 IOU
const cK5 = gw2[
"CK5"];
2424 env(check::create(gw2, alice, cK5(92)));
2428 env(check::cash(alice, chkId, cK5(92)), Ter(
tecNO_AUTH));
2433 gw2.verifyOwners(__LINE__);
2434 alice.verifyOwners(__LINE__);
2435 bob.verifyOwners(__LINE__);
2443 env(check::cancel(gw2, chkId));
2446 gw2.verifyOwners(__LINE__);
2454 AccountOwns
const gw2{.suite = *
this, .env = env, .acct =
"gw2", .owners = 0};
2455 IOU
const oF5 = gw2[
"OF5"];
2458 env(offer(bob, oF5(91), XRP(91)), Ter(
tecNO_LINE));
2462 gw2.verifyOwners(__LINE__);
2463 alice.verifyOwners(__LINE__);
2464 bob.verifyOwners(__LINE__);
2467 IOU
const cK5 = gw2[
"CK5"];
2469 env(check::create(alice, bob, cK5(91)));
2476 env(check::cancel(alice, chkId));
2480 gw2.verifyOwners(__LINE__);
2481 alice.verifyOwners(__LINE__);
2482 bob.verifyOwners(__LINE__);