158 using namespace test::jtx;
160 Account
const gw{
"gateway"};
161 Account
const alice{
"alice"};
162 Account
const bob{
"bob"};
163 IOU
const USD{gw[
"USD"]};
165 Env env{*
this, features};
167 STAmount const startBalance{XRP(1000).value()};
168 env.fund(startBalance, gw, alice, bob);
174 auto writeTwoChecks = [&env, &USD,
this](
175 Account
const& from, Account
const& to) {
182 env(check::create(from, to, XRP(2000)));
185 env(check::create(from, to, USD(50)));
191 env.require(owners(from, fromOwnerCount + 2));
193 owners(to, to == from ? fromOwnerCount + 2 : toOwnerCount));
196 writeTwoChecks(alice, bob);
197 writeTwoChecks(gw, alice);
198 writeTwoChecks(alice, gw);
204 using namespace std::chrono_literals;
207 env(check::create(alice, bob, USD(50)), expiration(env.now() + 1s));
210 env(check::create(alice, bob, USD(50)), source_tag(2));
212 env(check::create(alice, bob, USD(50)), dest_tag(3));
214 env(check::create(alice, bob, USD(50)), invoice_id(
uint256{4}));
216 env(check::create(alice, bob, USD(50)),
217 expiration(env.now() + 1s),
228 env(regkey(alice, alie));
233 env(signers(alice, 2, {{bogie, 1}, {demon, 1}}), sig(alie));
237 env(check::create(alice, bob, USD(50)), sig(alie));
243 XRPAmount const baseFeeDrops{env.current()->fees().base};
244 env(check::create(alice, bob, USD(50)),
246 fee(3 * baseFeeDrops));
341 using namespace test::jtx;
343 Account
const gw1{
"gateway1"};
344 Account
const gwF{
"gatewayFrozen"};
345 Account
const alice{
"alice"};
346 Account
const bob{
"bob"};
347 IOU
const USD{gw1[
"USD"]};
349 Env env{*
this, features};
351 STAmount const startBalance{XRP(1000).value()};
352 env.fund(startBalance, gw1, gwF, alice, bob);
356 env(check::create(alice, bob, USD(50)),
362 env(check::create(alice, bob, USD(50)),
368 env(check::create(alice, alice, XRP(10)), ter(
temREDUNDANT));
372 env(check::create(alice, bob, drops(-1)), ter(
temBAD_AMOUNT));
375 env(check::create(alice, bob, drops(0)), ter(
temBAD_AMOUNT));
378 env(check::create(alice, bob, drops(1)));
387 env(check::create(alice, bob, USD(1)));
396 env(check::create(alice, bob, USD(50)),
402 Account
const bogie{
"bogie"};
403 env(check::create(alice, bogie, USD(50)), ter(
tecNO_DST));
413 env(check::create(alice, bob, USD(50)), dest_tag(11));
420 IOU
const USF{gwF[
"USF"]};
424 env(check::create(alice, bob, USF(50)), ter(
tecFROZEN));
430 env(check::create(alice, bob, USF(50)));
436 env.trust(USD(1000), alice);
437 env.trust(USD(1000), bob);
439 env(pay(gw1, alice, USD(25)));
440 env(pay(gw1, bob, USD(25)));
448 env(check::create(alice, bob, USD(50)), ter(
tecFROZEN));
452 env(check::create(bob, alice, USD(50)));
454 env(pay(bob, alice, USD(1)));
456 env(check::create(gw1, alice, USD(50)));
458 env(pay(gw1, alice, USD(1)));
464 env(check::create(alice, bob, USD(50)));
466 env(check::create(bob, alice, USD(50)));
468 env(check::create(gw1, alice, USD(50)));
476 env(check::create(alice, bob, USD(50)));
478 env(pay(alice, bob, USD(1)));
480 env(check::create(bob, alice, USD(50)), ter(
tecFROZEN));
484 env(check::create(gw1, alice, USD(50)), ter(
tecFROZEN));
495 env(check::create(alice, bob, USD(50)),
496 expiration(env.now()),
500 using namespace std::chrono_literals;
501 env(check::create(alice, bob, USD(50)), expiration(env.now() + 1s));
505 Account
const cheri{
"cheri"};
506 env.fund(env.current()->fees().accountReserve(1) - drops(1), cheri);
509 env(check::create(cheri, bob, USD(50)),
510 fee(drops(env.current()->fees().base)),
514 env(pay(bob, cheri, drops(env.current()->fees().base + 1)));
517 env(check::create(cheri, bob, USD(50)));
527 using namespace test::jtx;
529 Account
const alice{
"alice"};
530 Account
const bob{
"bob"};
532 Env env{*
this, features};
534 XRPAmount const baseFeeDrops{env.current()->fees().base};
535 STAmount const startBalance{XRP(300).value()};
536 env.fund(startBalance, alice, bob);
541 env(check::create(alice, bob, XRP(10)));
543 env.require(balance(alice, startBalance - drops(baseFeeDrops)));
544 env.require(balance(bob, startBalance));
547 BEAST_EXPECT(ownerCount(env, alice) == 1);
548 BEAST_EXPECT(ownerCount(env, bob) == 0);
550 env(check::cash(bob, chkId, XRP(10)));
553 balance(alice, startBalance - XRP(10) - drops(baseFeeDrops)));
555 balance(bob, startBalance + XRP(10) - drops(baseFeeDrops)));
558 BEAST_EXPECT(ownerCount(env, alice) == 0);
559 BEAST_EXPECT(ownerCount(env, bob) == 0);
562 env(pay(env.master, alice, XRP(10) + drops(baseFeeDrops)));
563 env(pay(bob, env.master, XRP(10) - drops(baseFeeDrops * 2)));
565 env.require(balance(alice, startBalance));
566 env.require(balance(bob, startBalance));
570 STAmount const reserve{env.current()->fees().reserve};
572 startBalance - reserve - drops(baseFeeDrops)};
574 env(check::create(alice, bob, checkAmount));
578 env(check::cash(bob, chkId, checkAmount + drops(1)),
582 bob, chkId, check::DeliverMin(checkAmount + drops(1))),
589 env(check::cash(bob, chkId, check::DeliverMin(checkAmount)));
591 env.require(balance(alice, reserve));
593 bob, startBalance + checkAmount - drops(baseFeeDrops * 3)));
596 BEAST_EXPECT(ownerCount(env, alice) == 0);
597 BEAST_EXPECT(ownerCount(env, bob) == 0);
600 env(pay(env.master, alice, checkAmount + drops(baseFeeDrops)));
601 env(pay(bob, env.master, checkAmount - drops(baseFeeDrops * 4)));
603 env.require(balance(alice, startBalance));
604 env.require(balance(bob, startBalance));
608 STAmount const reserve{env.current()->fees().reserve};
610 startBalance - reserve - drops(baseFeeDrops - 1)};
612 env(check::create(alice, bob, checkAmount));
621 env(check::cash(bob, chkId, check::DeliverMin(drops(1))));
623 env.require(balance(alice, reserve));
625 bob, startBalance + checkAmount - drops(baseFeeDrops * 2 + 1)));
628 BEAST_EXPECT(ownerCount(env, alice) == 0);
629 BEAST_EXPECT(ownerCount(env, bob) == 0);
632 env(pay(env.master, alice, checkAmount + drops(baseFeeDrops - 1)));
634 bob, env.master, checkAmount - drops(baseFeeDrops * 3 + 1)));
636 env.require(balance(alice, startBalance));
637 env.require(balance(bob, startBalance));
647 using namespace test::jtx;
649 Account
const gw{
"gateway"};
650 Account
const alice{
"alice"};
651 Account
const bob{
"bob"};
652 IOU
const USD{gw[
"USD"]};
655 Env env{*
this, features};
657 env.fund(XRP(1000), gw, alice, bob);
662 env(check::create(alice, bob, USD(10)));
670 env(trust(alice, USD(20)));
672 env(pay(gw, alice, USD(9.5)));
679 env(pay(gw, alice, USD(0.5)));
683 env(trust(bob, USD(9.5)));
688 env(trust(bob, USD(10.5)));
694 env(check::cash(bob, chkId1, USD(10)));
696 env.require(balance(alice, USD(0)));
697 env.require(balance(bob, USD(10)));
700 BEAST_EXPECT(ownerCount(env, alice) == 1);
701 BEAST_EXPECT(ownerCount(env, bob) == 1);
704 env(check::cash(bob, chkId1, USD(10)), ter(
tecNO_ENTRY));
708 env(pay(bob, alice, USD(7)));
712 env(check::create(alice, bob, USD(7)));
719 env(check::cash(bob, chkId2, USD(5)));
721 env.require(balance(alice, USD(2)));
722 env.require(balance(bob, USD(8)));
725 BEAST_EXPECT(ownerCount(env, alice) == 1);
726 BEAST_EXPECT(ownerCount(env, bob) == 1);
730 env(check::create(alice, bob, USD(2)));
733 env(check::create(alice, bob, USD(2)));
739 env(check::cash(bob, chkId4, USD(2)));
741 env.require(balance(alice, USD(0)));
742 env.require(balance(bob, USD(10)));
745 BEAST_EXPECT(ownerCount(env, alice) == 2);
746 BEAST_EXPECT(ownerCount(env, bob) == 1);
752 env.require(balance(alice, USD(0)));
753 env.require(balance(bob, USD(10)));
756 BEAST_EXPECT(ownerCount(env, alice) == 2);
757 BEAST_EXPECT(ownerCount(env, bob) == 1);
773 env(check::create(gw, bob, USD(20)));
777 env(check::cash(bob, chkId20, USD(20)));
779 env.require(balance(bob, USD(30)));
783 env(pay(bob, gw, USD(20)));
786 env(check::cancel(bob, chkId3));
788 env.require(balance(alice, USD(0)));
789 env.require(balance(bob, USD(10)));
792 BEAST_EXPECT(ownerCount(env, alice) == 1);
793 BEAST_EXPECT(ownerCount(env, bob) == 1);
797 Env env{*
this, features};
799 env.fund(XRP(1000), gw, alice, bob);
802 env(trust(alice, USD(20)));
803 env(trust(bob, USD(20)));
805 env(pay(gw, alice, USD(8)));
810 env(check::create(alice, bob, USD(9)));
813 env(check::create(alice, bob, USD(8)));
816 env(check::create(alice, bob, USD(7)));
819 env(check::create(alice, bob, USD(6)));
824 env(check::cash(bob, chkId9, check::DeliverMin(USD(9))),
829 env(check::cash(bob, chkId9, check::DeliverMin(USD(7))));
831 env.require(balance(alice, USD(0)));
832 env.require(balance(bob, USD(8)));
835 BEAST_EXPECT(ownerCount(env, alice) == 4);
836 BEAST_EXPECT(ownerCount(env, bob) == 1);
839 env(pay(bob, alice, USD(7)));
844 env(check::cash(bob, chkId7, check::DeliverMin(USD(7))));
846 env.require(balance(alice, USD(0)));
847 env.require(balance(bob, USD(8)));
850 BEAST_EXPECT(ownerCount(env, alice) == 3);
851 BEAST_EXPECT(ownerCount(env, bob) == 1);
854 env(pay(bob, alice, USD(8)));
859 env(check::cash(bob, chkId6, check::DeliverMin(USD(4))));
861 env.require(balance(alice, USD(2)));
862 env.require(balance(bob, USD(6)));
865 BEAST_EXPECT(ownerCount(env, alice) == 2);
866 BEAST_EXPECT(ownerCount(env, bob) == 1);
870 env(check::cash(bob, chkId8, check::DeliverMin(USD(2))));
872 env.require(balance(alice, USD(0)));
873 env.require(balance(bob, USD(8)));
876 BEAST_EXPECT(ownerCount(env, alice) == 1);
877 BEAST_EXPECT(ownerCount(env, bob) == 1);
881 Env env(*
this, features);
883 env.fund(XRP(1000), gw, alice, bob);
886 env(trust(gw, alice[
"USD"](100)), txflags(
tfSetfAuth));
887 env(trust(alice, USD(20)));
889 env(pay(gw, alice, USD(8)));
895 env(check::create(alice, bob, USD(7)));
898 env(check::cash(bob, chkId, USD(7)), ter(
tecNO_AUTH));
903 env(trust(bob, USD(5)));
906 env(check::cash(bob, chkId, USD(7)), ter(
tecNO_AUTH));
910 env(trust(gw, bob[
"USD"](1)), txflags(
tfSetfAuth));
920 env(check::cash(bob, chkId, check::DeliverMin(USD(4))));
923 env.require(balance(alice, USD(8) - bobGot));
924 env.require(balance(bob, bobGot));
928 BEAST_EXPECT(ownerCount(env, alice) == 1);
929 BEAST_EXPECT(ownerCount(env, bob) == 1);
934 Env env{*
this, features};
935 env.fund(XRP(1000), gw, alice, bob);
940 env(check::create(alice, bob, USD(1)));
944 env(check::create(alice, bob, USD(2)));
947 env(trust(alice, USD(20)));
948 env(trust(bob, USD(20)));
950 env(pay(gw, alice, USD(8)));
955 env(regkey(bob, bobby));
960 env(signers(bob, 2, {{bogie, 1}, {demon, 1}}), sig(bobby));
963 BEAST_EXPECT(ownerCount(env, bob) == 2);
966 env(check::cash(bob, chkId1, (USD(1))), sig(bobby));
968 env.require(balance(alice, USD(7)));
969 env.require(balance(bob, USD(1)));
972 BEAST_EXPECT(ownerCount(env, alice) == 2);
973 BEAST_EXPECT(ownerCount(env, bob) == 2);
976 XRPAmount const baseFeeDrops{env.current()->fees().base};
977 env(check::cash(bob, chkId2, (USD(2))),
979 fee(3 * baseFeeDrops));
981 env.require(balance(alice, USD(5)));
982 env.require(balance(bob, USD(3)));
985 BEAST_EXPECT(ownerCount(env, alice) == 1);
986 BEAST_EXPECT(ownerCount(env, bob) == 2);
1067 using namespace test::jtx;
1069 Account
const gw{
"gateway"};
1070 Account
const alice{
"alice"};
1071 Account
const bob{
"bob"};
1072 IOU
const USD{gw[
"USD"]};
1074 Env env{*
this, features};
1076 env.fund(XRP(1000), gw, alice, bob);
1079 env(trust(alice, USD(1000)));
1080 env(trust(bob, USD(1000)));
1082 env(pay(gw, alice, USD(1000)));
1090 auto qIn = [](
double percent) {
return qualityInPercent(percent); };
1091 auto qOut = [](
double percent) {
return qualityOutPercent(percent); };
1095 auto testNonIssuerQPay = [&env, &alice, &bob, &USD](
1096 Account
const& truster,
1098 auto const& inOrOut,
1102 STAmount const aliceStart{env.balance(alice, USD.issue()).value()};
1103 STAmount const bobStart{env.balance(bob, USD.issue()).value()};
1106 env(trust(truster, iou(1000)), inOrOut(pct));
1109 env(pay(alice, bob, USD(amount)), sendmax(USD(10)));
1111 env.require(balance(alice, aliceStart - USD(10)));
1112 env.require(balance(bob, bobStart + USD(10)));
1116 env(trust(truster, iou(1000)), inOrOut(0));
1120 auto testNonIssuerQCheck = [&env, &alice, &bob, &USD](
1121 Account
const& truster,
1123 auto const& inOrOut,
1127 STAmount const aliceStart{env.balance(alice, USD.issue()).value()};
1128 STAmount const bobStart{env.balance(bob, USD.issue()).value()};
1131 env(trust(truster, iou(1000)), inOrOut(pct));
1135 env(check::create(alice, bob, USD(10)));
1138 env(check::cash(bob, chkId, USD(amount)));
1140 env.require(balance(alice, aliceStart - USD(10)));
1141 env.require(balance(bob, bobStart + USD(10)));
1145 env(trust(truster, iou(1000)), inOrOut(0));
1150 testNonIssuerQPay(alice, gw[
"USD"], qIn, 50, 10);
1151 testNonIssuerQCheck(alice, gw[
"USD"], qIn, 50, 10);
1154 testNonIssuerQPay(bob, gw[
"USD"], qIn, 50, 5);
1155 testNonIssuerQCheck(bob, gw[
"USD"], qIn, 50, 5);
1157 testNonIssuerQPay(gw, alice[
"USD"], qIn, 50, 10);
1158 testNonIssuerQCheck(gw, alice[
"USD"], qIn, 50, 10);
1160 testNonIssuerQPay(gw, bob[
"USD"], qIn, 50, 10);
1161 testNonIssuerQCheck(gw, bob[
"USD"], qIn, 50, 10);
1163 testNonIssuerQPay(alice, gw[
"USD"], qOut, 200, 10);
1164 testNonIssuerQCheck(alice, gw[
"USD"], qOut, 200, 10);
1166 testNonIssuerQPay(bob, gw[
"USD"], qOut, 200, 10);
1167 testNonIssuerQCheck(bob, gw[
"USD"], qOut, 200, 10);
1169 testNonIssuerQPay(gw, alice[
"USD"], qOut, 200, 10);
1170 testNonIssuerQCheck(gw, alice[
"USD"], qOut, 200, 10);
1172 testNonIssuerQPay(gw, bob[
"USD"], qOut, 200, 10);
1173 testNonIssuerQCheck(gw, bob[
"USD"], qOut, 200, 10);
1180 auto testIssuerQPay = [&env, &gw, &alice, &USD](
1181 Account
const& truster,
1183 auto const& inOrOut,
1191 STAmount const aliceStart{env.balance(alice, USD.issue()).value()};
1194 env(trust(truster, iou(1000)), inOrOut(pct));
1198 env(pay(alice, gw, USD(amt1)), sendmax(USD(max1)));
1200 env.require(balance(alice, aliceStart - USD(10)));
1203 env(pay(gw, alice, USD(amt2)), sendmax(USD(max2)));
1205 env.require(balance(alice, aliceStart));
1209 env(trust(truster, iou(1000)), inOrOut(0));
1213 auto testIssuerQCheck = [&env, &gw, &alice, &USD](
1214 Account
const& truster,
1216 auto const& inOrOut,
1224 STAmount const aliceStart{env.balance(alice, USD.issue()).value()};
1227 env(trust(truster, iou(1000)), inOrOut(pct));
1232 env(check::create(alice, gw, USD(max1)));
1235 env(check::cash(gw, chkAliceId, USD(amt1)));
1237 env.require(balance(alice, aliceStart - USD(10)));
1241 env(check::create(gw, alice, USD(max2)));
1244 env(check::cash(alice, chkGwId, USD(amt2)));
1246 env.require(balance(alice, aliceStart));
1250 env(trust(truster, iou(1000)), inOrOut(0));
1256 testIssuerQPay(alice, gw[
"USD"], qIn, 50, 10, 10, 5, 10);
1257 testIssuerQCheck(alice, gw[
"USD"], qIn, 50, 10, 10, 5, 10);
1259 testIssuerQPay(gw, alice[
"USD"], qIn, 50, 10, 10, 10, 10);
1260 testIssuerQCheck(gw, alice[
"USD"], qIn, 50, 10, 10, 10, 10);
1262 testIssuerQPay(alice, gw[
"USD"], qOut, 200, 10, 10, 10, 10);
1263 testIssuerQCheck(alice, gw[
"USD"], qOut, 200, 10, 10, 10, 10);
1265 testIssuerQPay(gw, alice[
"USD"], qOut, 200, 10, 10, 10, 10);
1266 testIssuerQCheck(gw, alice[
"USD"], qOut, 200, 10, 10, 10, 10);
1275 using namespace test::jtx;
1277 Account
const gw{
"gateway"};
1278 Account
const alice{
"alice"};
1279 Account
const bob{
"bob"};
1280 Account
const zoe{
"zoe"};
1281 IOU
const USD{gw[
"USD"]};
1283 Env env(*
this, features);
1285 env.fund(XRP(1000), gw, alice, bob, zoe);
1289 env(trust(alice, USD(20)));
1291 env(pay(gw, alice, USD(20)));
1295 env(trust(bob, USD(20)));
1301 env(check::cash(bob, chkId, USD(20)), ter(
tecNO_ENTRY));
1307 env(check::create(alice, bob, USD(20)));
1311 env(check::create(alice, bob, XRP(10)));
1314 using namespace std::chrono_literals;
1316 env(check::create(alice, bob, XRP(10)), expiration(env.now() + 1s));
1320 env(check::create(alice, bob, USD(1)));
1324 env(check::create(alice, bob, USD(2)));
1328 env(check::create(alice, bob, USD(3)));
1332 env(check::create(alice, bob, USD(4)));
1336 env(check::create(alice, bob, USD(1)));
1340 env(check::create(alice, bob, USD(2)), dest_tag(7));
1344 auto failingCases = [&env, &gw, &alice, &bob](
1347 env(check::cash(bob, chkId, amount),
1353 env(check::cash(bob, chkId, amount),
1379 env(check::cash(bob, chkId, amount.zeroed()),
1385 if (!amount.native())
1402 IOU
const wrongCurrency{gw[
"EUR"]};
1404 badAmount.
setIssue(wrongCurrency.issue());
1405 env(check::cash(bob, chkId, badAmount), ter(
temMALFORMED));
1411 IOU
const wrongIssuer{alice[
"USD"]};
1413 badAmount.
setIssue(wrongIssuer.issue());
1414 env(check::cash(bob, chkId, badAmount), ter(
temMALFORMED));
1423 env(check::cash(bob, chkId, check::DeliverMin(amount + amount)),
1428 failingCases(chkIdX, XRP(10));
1429 failingCases(chkIdU, USD(20));
1432 env(check::cash(bob, chkIdU, USD(20)));
1434 env(check::cash(bob, chkIdX, check::DeliverMin(XRP(10))));
1438 env(check::cash(bob, chkIdExp, XRP(10)), ter(
tecEXPIRED));
1442 env(check::cancel(zoe, chkIdExp));
1447 env(pay(bob, alice, USD(20)));
1449 env.require(balance(alice, USD(20)));
1450 env.require(balance(bob, USD(0)));
1458 env(check::cash(bob, chkIdFroz1, check::DeliverMin(USD(0.5))),
1466 env(check::cash(bob, chkIdFroz1, USD(1)));
1468 env.require(balance(alice, USD(19)));
1469 env.require(balance(bob, USD(1)));
1476 env(check::cash(bob, chkIdFroz2, check::DeliverMin(USD(1))),
1483 env(check::cash(bob, chkIdFroz2, USD(2)));
1485 env.require(balance(alice, USD(17)));
1486 env.require(balance(bob, USD(3)));
1491 env(check::cash(bob, chkIdFroz3, USD(3)), ter(
tecFROZEN));
1493 env(check::cash(bob, chkIdFroz3, check::DeliverMin(USD(1))),
1500 env(check::cash(bob, chkIdFroz3, check::DeliverMin(USD(1))));
1502 env.require(balance(alice, USD(14)));
1503 env.require(balance(bob, USD(6)));
1509 env(check::cash(bob, chkIdFroz4, USD(4)), ter(
terNO_LINE));
1511 env(check::cash(bob, chkIdFroz4, check::DeliverMin(USD(1))),
1518 env(check::cash(bob, chkIdFroz4, USD(4)));
1520 env.require(balance(alice, USD(10)));
1521 env.require(balance(bob, USD(10)));
1530 env(check::cash(bob, chkIdNoDest1, check::DeliverMin(USD(0.5))),
1535 env(check::cash(bob, chkIdHasDest2, USD(2)));
1537 env.require(balance(alice, USD(8)));
1538 env.require(balance(bob, USD(12)));
1544 env(check::cash(bob, chkIdNoDest1, USD(1)));
1546 env.require(balance(alice, USD(7)));
1547 env.require(balance(bob, USD(13)));
1557 using namespace test::jtx;
1559 Account
const gw{
"gateway"};
1560 Account
const alice{
"alice"};
1561 Account
const bob{
"bob"};
1562 Account
const zoe{
"zoe"};
1563 IOU
const USD{gw[
"USD"]};
1566 Env env{*
this, features};
1568 env.fund(XRP(1000), gw, alice, bob, zoe);
1574 env(check::create(alice, bob, USD(10)));
1578 env(check::create(alice, bob, XRP(10)));
1582 env(check::create(alice, bob, USD(10)));
1586 using namespace std::chrono_literals;
1588 env(check::create(alice, bob, XRP(10)),
1589 expiration(env.now() + 600s));
1593 env(check::create(alice, bob, USD(10)),
1594 expiration(env.now() + 600s));
1598 env(check::create(alice, bob, XRP(10)),
1599 expiration(env.now() + 600s));
1604 env(check::create(alice, bob, USD(10)), expiration(env.now() + 1s));
1608 env(check::create(alice, bob, XRP(10)), expiration(env.now() + 1s));
1612 env(check::create(alice, bob, USD(10)), expiration(env.now() + 1s));
1617 env(check::create(alice, bob, USD(10)));
1621 env(check::create(alice, bob, XRP(10)));
1624 BEAST_EXPECT(ownerCount(env, alice) == 11);
1627 env(check::cancel(alice, chkId1));
1630 BEAST_EXPECT(ownerCount(env, alice) == 10);
1632 env(check::cancel(bob, chkId2));
1635 BEAST_EXPECT(ownerCount(env, alice) == 9);
1640 BEAST_EXPECT(ownerCount(env, alice) == 9);
1643 env(check::cancel(alice, chkIdNotExp1));
1646 BEAST_EXPECT(ownerCount(env, alice) == 8);
1648 env(check::cancel(bob, chkIdNotExp2));
1651 BEAST_EXPECT(ownerCount(env, alice) == 7);
1656 BEAST_EXPECT(ownerCount(env, alice) == 7);
1659 env(check::cancel(alice, chkIdExp1));
1662 BEAST_EXPECT(ownerCount(env, alice) == 6);
1664 env(check::cancel(bob, chkIdExp2));
1667 BEAST_EXPECT(ownerCount(env, alice) == 5);
1669 env(check::cancel(zoe, chkIdExp3));
1672 BEAST_EXPECT(ownerCount(env, alice) == 4);
1676 env(regkey(alice, alie));
1681 env(signers(alice, 2, {{bogie, 1}, {demon, 1}}), sig(alie));
1685 env(check::cancel(alice, chkIdReg), sig(alie));
1688 BEAST_EXPECT(ownerCount(env, alice) == 4);
1691 XRPAmount const baseFeeDrops{env.current()->fees().base};
1692 env(check::cancel(alice, chkIdMSig),
1694 fee(3 * baseFeeDrops));
1697 BEAST_EXPECT(ownerCount(env, alice) == 3);
1700 env(check::cancel(alice, chkId3), sig(alice));
1703 BEAST_EXPECT(ownerCount(env, alice) == 2);
1705 env(check::cancel(bob, chkIdNotExp3));
1708 BEAST_EXPECT(ownerCount(env, alice) == 1);
1783 using namespace test::jtx;
1785 Account
const gw{
"gw"};
1786 Account
const alice{
"alice"};
1787 Account
const bob{
"bob"};
1788 IOU
const USD{gw[
"USD"]};
1790 Env env{*
this, features};
1791 env.fund(XRP(1000), gw, alice, bob);
1798 env(ticket::create(alice, 10));
1802 env(ticket::create(bob, 10));
1806 env.require(owners(alice, 10));
1807 env.require(owners(bob, 10));
1810 env(trust(alice, USD(1000)), ticket::use(aliceTicketSeq++));
1811 env(trust(bob, USD(1000)), ticket::use(bobTicketSeq++));
1813 env.require(owners(alice, 10));
1814 env.require(owners(bob, 10));
1816 env.require(tickets(alice, env.seq(alice) - aliceTicketSeq));
1817 BEAST_EXPECT(env.seq(alice) == aliceSeq);
1819 env.require(tickets(bob, env.seq(bob) - bobTicketSeq));
1820 BEAST_EXPECT(env.seq(bob) == bobSeq);
1822 env(pay(gw, alice, USD(900)));
1828 env(check::create(alice, bob, XRP(200)), ticket::use(aliceTicketSeq++));
1831 env(check::create(alice, bob, XRP(300)), ticket::use(aliceTicketSeq++));
1834 env(check::create(alice, bob, USD(200)), ticket::use(aliceTicketSeq++));
1837 env(check::create(alice, bob, USD(300)), ticket::use(aliceTicketSeq++));
1841 env.require(owners(alice, 10));
1842 env.require(tickets(alice, env.seq(alice) - aliceTicketSeq));
1844 BEAST_EXPECT(env.seq(alice) == aliceSeq);
1846 env.require(owners(bob, 10));
1847 BEAST_EXPECT(env.seq(bob) == bobSeq);
1850 env(check::cancel(bob, chkIdXrp1), ticket::use(bobTicketSeq++));
1851 env(check::cancel(bob, chkIdUsd2), ticket::use(bobTicketSeq++));
1854 env.require(owners(alice, 8));
1855 env.require(tickets(alice, env.seq(alice) - aliceTicketSeq));
1857 BEAST_EXPECT(env.seq(alice) == aliceSeq);
1859 env.require(owners(bob, 8));
1860 BEAST_EXPECT(env.seq(bob) == bobSeq);
1863 env(check::cash(bob, chkIdXrp2, XRP(300)), ticket::use(bobTicketSeq++));
1864 env(check::cash(bob, chkIdUsd1, USD(200)), ticket::use(bobTicketSeq++));
1867 env.require(owners(alice, 6));
1868 env.require(tickets(alice, env.seq(alice) - aliceTicketSeq));
1870 BEAST_EXPECT(env.seq(alice) == aliceSeq);
1871 env.require(balance(alice, USD(700)));
1873 env.require(owners(bob, 6));
1874 BEAST_EXPECT(env.seq(bob) == bobSeq);
1875 env.require(balance(bob, USD(200)));
1886 using namespace test::jtx;
1888 Env env{*
this, features};
1902 ownerCount(env, acct) == owners,
1903 "Owner count mismatch",
1909 operator Account
const()
const
1926 AccountOwns alice{*
this, env,
"alice", 0};
1927 AccountOwns bob{*
this, env,
"bob", 0};
1930 env.fund(XRP(5000), noripple(alice, bob));
1936 AccountOwns gw1{*
this, env,
"gw1", 0};
1941 env.fund(XRP(5000), noripple(gw1));
1944 IOU
const CK8 = gw1[
"CK8"];
1945 gw1.verifyOwners(__LINE__);
1947 Account
const yui{
"yui"};
1952 env.fund(XRP(200), yui);
1956 env(check::create(gw1, yui, CK8(99)));
1959 env(check::cash(yui, chkId, CK8(99)),
1962 alice.verifyOwners(__LINE__);
1966 env(pay(env.master, yui, XRP(51)));
1968 env(check::cash(yui, chkId, CK8(99)));
1971 BEAST_EXPECT(ownerCount(env, yui) == 1);
1975 gw1.verifyOwners(__LINE__);
1990 auto cmpTrustLines = [
this, &env](
1991 Account
const& acct1,
1992 Account
const& acct2,
1993 IOU
const& offerIou,
1994 IOU
const& checkIou) {
1995 auto const offerLine =
1997 auto const checkLine =
1999 if (offerLine ==
nullptr || checkLine ==
nullptr)
2001 BEAST_EXPECT(offerLine ==
nullptr && checkLine ==
nullptr);
2007 BEAST_EXPECT(offerLine->at(sfFlags) == checkLine->at(sfFlags));
2012 [
this, offerLine, checkLine](
SF_AMOUNT const& sfield) {
2013 STAmount const offerAmount = offerLine->at(sfield);
2014 STAmount const checkAmount = checkLine->at(sfield);
2031 cmpReqAmount(sfBalance);
2032 cmpReqAmount(sfLowLimit);
2033 cmpReqAmount(sfHighLimit);
2038 [
this, offerLine, checkLine](
auto const& sfield) {
2041 offerLine->isFieldPresent(sfield) ==
2042 checkLine->isFieldPresent(sfield)))
2047 if (!offerLine->isFieldPresent(sfield))
2053 offerLine->at(sfield) == checkLine->at(sfield));
2055 cmpOptField(sfLowNode);
2056 cmpOptField(sfLowQualityIn);
2057 cmpOptField(sfLowQualityOut);
2059 cmpOptField(sfHighNode);
2060 cmpOptField(sfHighQualityIn);
2061 cmpOptField(sfHighQualityOut);
2069 AccountOwns gw1{*
this, env,
"gw1", 0};
2071 BEAST_EXPECT((*env.le(gw1))[sfFlags] == 0);
2072 BEAST_EXPECT((*env.le(alice))[sfFlags] == 0);
2073 BEAST_EXPECT((*env.le(bob))[sfFlags] == 0);
2076 IOU
const OF1 = gw1[
"OF1"];
2077 env(offer(gw1, XRP(98), OF1(98)));
2080 env.le(
keylet::line(gw1, alice, OF1.currency)) ==
nullptr);
2081 env(offer(alice, OF1(98), XRP(98)));
2088 gw1.verifyOwners(__LINE__);
2091 alice.verifyOwners(__LINE__);
2094 IOU
const CK1 = gw1[
"CK1"];
2096 env(check::create(gw1, alice, CK1(98)));
2099 env.le(
keylet::line(gw1, alice, CK1.currency)) ==
nullptr);
2100 env(check::cash(alice, chkId, CK1(98)));
2108 gw1.verifyOwners(__LINE__);
2111 alice.verifyOwners(__LINE__);
2113 cmpTrustLines(gw1, alice, OF1, CK1);
2124 AccountOwns gw1{*
this, env,
"gw1", 0};
2125 IOU
const OF1 = gw1[
"OF1"];
2126 env(offer(alice, XRP(97), OF1(97)));
2129 env.le(
keylet::line(alice, bob, OF1.currency)) ==
nullptr);
2130 env(offer(bob, OF1(97), XRP(97)));
2135 env.require(balance(alice, OF1(1)));
2136 env.require(balance(bob, OF1(97)));
2139 gw1.verifyOwners(__LINE__);
2140 alice.verifyOwners(__LINE__);
2141 bob.verifyOwners(__LINE__);
2149 IOU
const CK1 = gw1[
"CK1"];
2151 env(check::create(alice, bob, CK1(97)));
2154 env.le(
keylet::line(alice, bob, CK1.currency)) ==
nullptr);
2155 env(check::cash(bob, chkId, CK1(97)), ter(
terNO_RIPPLE));
2159 env.le(
keylet::line(gw1, bob, OF1.currency)) !=
nullptr);
2161 env.le(
keylet::line(gw1, bob, CK1.currency)) ==
nullptr);
2164 env(check::cancel(alice, chkId));
2168 gw1.verifyOwners(__LINE__);
2169 alice.verifyOwners(__LINE__);
2170 bob.verifyOwners(__LINE__);
2177 AccountOwns gw1{*
this, env,
"gw1", 0};
2182 IOU
const OF2 = gw1[
"OF2"];
2183 env(offer(gw1, XRP(96), OF2(96)));
2186 env.le(
keylet::line(gw1, alice, OF2.currency)) ==
nullptr);
2187 env(offer(alice, OF2(96), XRP(96)));
2194 gw1.verifyOwners(__LINE__);
2197 alice.verifyOwners(__LINE__);
2200 IOU
const CK2 = gw1[
"CK2"];
2202 env(check::create(gw1, alice, CK2(96)));
2205 env.le(
keylet::line(gw1, alice, CK2.currency)) ==
nullptr);
2206 env(check::cash(alice, chkId, CK2(96)));
2214 gw1.verifyOwners(__LINE__);
2217 alice.verifyOwners(__LINE__);
2219 cmpTrustLines(gw1, alice, OF2, CK2);
2227 AccountOwns gw1{*
this, env,
"gw1", 0};
2228 IOU
const OF2 = gw1[
"OF2"];
2229 env(offer(alice, XRP(95), OF2(95)));
2232 env.le(
keylet::line(alice, bob, OF2.currency)) ==
nullptr);
2233 env(offer(bob, OF2(95), XRP(95)));
2238 gw1.verifyOwners(__LINE__);
2239 alice.verifyOwners(__LINE__);
2240 bob.verifyOwners(__LINE__);
2243 IOU
const CK2 = gw1[
"CK2"];
2245 env(check::create(alice, bob, CK2(95)));
2248 env.le(
keylet::line(alice, bob, CK2.currency)) ==
nullptr);
2249 env(check::cash(bob, chkId, CK2(95)));
2255 gw1.verifyOwners(__LINE__);
2256 alice.verifyOwners(__LINE__);
2257 bob.verifyOwners(__LINE__);
2259 cmpTrustLines(alice, bob, OF2, CK2);
2270 AccountOwns gw1{*
this, env,
"gw1", 0};
2277 IOU
const OF3 = gw1[
"OF3"];
2278 env(offer(gw1, XRP(94), OF3(94)));
2281 env.le(
keylet::line(gw1, alice, OF3.currency)) ==
nullptr);
2282 env(offer(alice, OF3(94), XRP(94)));
2289 gw1.verifyOwners(__LINE__);
2292 alice.verifyOwners(__LINE__);
2295 IOU
const CK3 = gw1[
"CK3"];
2297 env(check::create(gw1, alice, CK3(94)));
2300 env.le(
keylet::line(gw1, alice, CK3.currency)) ==
nullptr);
2301 env(check::cash(alice, chkId, CK3(94)));
2309 gw1.verifyOwners(__LINE__);
2312 alice.verifyOwners(__LINE__);
2314 cmpTrustLines(gw1, alice, OF3, CK3);
2322 AccountOwns gw1{*
this, env,
"gw1", 0};
2323 IOU
const OF3 = gw1[
"OF3"];
2324 env(offer(alice, XRP(93), OF3(93)));
2327 env.le(
keylet::line(alice, bob, OF3.currency)) ==
nullptr);
2328 env(offer(bob, OF3(93), XRP(93)));
2333 gw1.verifyOwners(__LINE__);
2334 alice.verifyOwners(__LINE__);
2335 bob.verifyOwners(__LINE__);
2338 IOU
const CK3 = gw1[
"CK3"];
2340 env(check::create(alice, bob, CK3(93)));
2343 env.le(
keylet::line(alice, bob, CK3.currency)) ==
nullptr);
2344 env(check::cash(bob, chkId, CK3(93)));
2350 gw1.verifyOwners(__LINE__);
2351 alice.verifyOwners(__LINE__);
2352 bob.verifyOwners(__LINE__);
2354 cmpTrustLines(alice, bob, OF3, CK3);
2361 AccountOwns gw1{*
this, env,
"gw1", 0};
2366 IOU
const OF4 = gw1[
"OF4"];
2367 env(offer(gw1, XRP(92), OF4(92)), ter(
tecFROZEN));
2370 env.le(
keylet::line(gw1, alice, OF4.currency)) ==
nullptr);
2371 env(offer(alice, OF4(92), XRP(92)), ter(
tecFROZEN));
2375 gw1.verifyOwners(__LINE__);
2376 alice.verifyOwners(__LINE__);
2377 bob.verifyOwners(__LINE__);
2380 IOU
const CK4 = gw1[
"CK4"];
2382 env(check::create(gw1, alice, CK4(92)), ter(
tecFROZEN));
2385 env.le(
keylet::line(gw1, alice, CK4.currency)) ==
nullptr);
2386 env(check::cash(alice, chkId, CK4(92)), ter(
tecNO_ENTRY));
2390 gw1.verifyOwners(__LINE__);
2391 alice.verifyOwners(__LINE__);
2392 bob.verifyOwners(__LINE__);
2397 env.le(
keylet::line(gw1, alice, OF4.currency)) ==
nullptr);
2399 env.le(
keylet::line(gw1, alice, CK4.currency)) ==
nullptr);
2407 AccountOwns gw1{*
this, env,
"gw1", 0};
2408 IOU
const OF4 = gw1[
"OF4"];
2409 env(offer(alice, XRP(91), OF4(91)), ter(
tecFROZEN));
2412 env.le(
keylet::line(alice, bob, OF4.currency)) ==
nullptr);
2413 env(offer(bob, OF4(91), XRP(91)), ter(
tecFROZEN));
2417 gw1.verifyOwners(__LINE__);
2418 alice.verifyOwners(__LINE__);
2419 bob.verifyOwners(__LINE__);
2422 IOU
const CK4 = gw1[
"CK4"];
2424 env(check::create(alice, bob, CK4(91)), ter(
tecFROZEN));
2427 env.le(
keylet::line(alice, bob, CK4.currency)) ==
nullptr);
2428 env(check::cash(bob, chkId, CK4(91)), ter(
tecNO_ENTRY));
2432 gw1.verifyOwners(__LINE__);
2433 alice.verifyOwners(__LINE__);
2434 bob.verifyOwners(__LINE__);
2439 env.le(
keylet::line(gw1, bob, OF4.currency)) ==
nullptr);
2441 env.le(
keylet::line(gw1, bob, CK4.currency)) ==
nullptr);
2450 AccountOwns gw2{*
this, env,
"gw2", 0};
2451 env.fund(XRP(5000), gw2);
2460 IOU
const OF5 = gw2[
"OF5"];
2462 env(offer(gw2, XRP(92), OF5(92)));
2466 env.le(
keylet::line(gw2, alice, OF5.currency)) ==
nullptr);
2467 env(offer(alice, OF5(92), XRP(92)), ter(
tecNO_LINE));
2472 gw2.verifyOwners(__LINE__);
2473 alice.verifyOwners(__LINE__);
2474 bob.verifyOwners(__LINE__);
2477 env(offer_cancel(gw2, gw2OfferSeq));
2480 gw2.verifyOwners(__LINE__);
2483 IOU
const CK5 = gw2[
"CK5"];
2485 env(check::create(gw2, alice, CK5(92)));
2489 env.le(
keylet::line(gw2, alice, CK5.currency)) ==
nullptr);
2490 env(check::cash(alice, chkId, CK5(92)), ter(
tecNO_AUTH));
2495 gw2.verifyOwners(__LINE__);
2496 alice.verifyOwners(__LINE__);
2497 bob.verifyOwners(__LINE__);
2502 env.le(
keylet::line(gw2, alice, OF5.currency)) ==
nullptr);
2504 env.le(
keylet::line(gw2, alice, CK5.currency)) ==
nullptr);
2507 env(check::cancel(gw2, chkId));
2510 gw2.verifyOwners(__LINE__);
2518 AccountOwns gw2{*
this, env,
"gw2", 0};
2519 IOU
const OF5 = gw2[
"OF5"];
2522 env(offer(bob, OF5(91), XRP(91)), ter(
tecNO_LINE));
2524 env.le(
keylet::line(gw2, bob, OF5.currency)) ==
nullptr);
2527 gw2.verifyOwners(__LINE__);
2528 alice.verifyOwners(__LINE__);
2529 bob.verifyOwners(__LINE__);
2532 IOU
const CK5 = gw2[
"CK5"];
2534 env(check::create(alice, bob, CK5(91)));
2537 env.le(
keylet::line(alice, bob, CK5.currency)) ==
nullptr);
2542 env(check::cancel(alice, chkId));
2546 gw2.verifyOwners(__LINE__);
2547 alice.verifyOwners(__LINE__);
2548 bob.verifyOwners(__LINE__);
2553 env.le(
keylet::line(gw2, bob, OF5.currency)) ==
nullptr);
2555 env.le(
keylet::line(gw2, bob, CK5.currency)) ==
nullptr);