21 #include <ripple/protocol/Feature.h>
22 #include <ripple/protocol/jss.h>
98 if (sle->getType() == ltCHECK)
99 result.push_back (sle);
109 if (
auto const sleAccount = env.
le(account))
126 Json::Value const meta = env.
rpc (
"tx", txHash)[jss::result][jss::meta];
136 BEAST_EXPECT (meta[jss::delivered_amount] ==
142 testcase (
"Enabled");
144 using namespace test::jtx;
145 Account
const alice {
"alice"};
151 env.fund (XRP(1000), alice);
155 env (check::create (env.master, alice, XRP(100)),
159 env (check::cash (alice, checkId, XRP(100)),
163 env (check::cancel (alice, checkId), ter (
temDISABLED));
171 env.fund (XRP(1000), alice);
175 env (check::create (env.master, alice, XRP(100)));
178 env (check::cash (alice, checkId1, XRP(100)));
183 env (check::create (env.master, alice, XRP(100)));
186 env (check::cancel (alice, checkId2));
194 testcase (
"Create valid");
196 using namespace test::jtx;
198 Account
const gw {
"gateway"};
199 Account
const alice {
"alice"};
200 Account
const bob {
"bob"};
201 IOU
const USD {gw[
"USD"]};
205 STAmount const startBalance {XRP(1000).value()};
206 env.fund (startBalance, gw, alice, bob);
211 auto writeTwoChecks =
212 [&env, &USD,
this] (Account
const& from, Account
const& to)
220 env (check::create (from, to, XRP(2000)));
223 env (check::create (from, to, USD(50)));
231 env.require (owners (from, fromOwnerCount + 2));
232 env.require (owners (to,
233 to == from ? fromOwnerCount + 2 : toOwnerCount));
236 writeTwoChecks (alice, bob);
237 writeTwoChecks (gw, alice);
238 writeTwoChecks (alice, gw);
244 using namespace std::chrono_literals;
247 env (check::create (alice, bob, USD(50)), expiration (env.now() + 1s));
250 env (check::create (alice, bob, USD(50)), source_tag (2));
252 env (check::create (alice, bob, USD(50)), dest_tag (3));
254 env (check::create (alice, bob, USD(50)), invoice_id (
uint256{4}));
256 env (check::create (alice, bob, USD(50)), expiration (env.now() + 1s),
257 source_tag (12), dest_tag (13), invoice_id (
uint256{4}));
265 env (regkey (alice, alie));
270 env (signers (alice, 2, {{bogie, 1}, {demon, 1}}), sig (alie));
274 env (check::create (alice, bob, USD(50)), sig (alie));
280 XRPAmount const baseFeeDrops {env.current()->fees().base};
281 env (check::create (alice, bob, USD(50)),
282 msig (bogie, demon), fee (3 * baseFeeDrops));
291 testcase (
"Create invalid");
293 using namespace test::jtx;
295 Account
const gw1 {
"gateway1"};
296 Account
const gwF {
"gatewayFrozen"};
297 Account
const alice {
"alice"};
298 Account
const bob {
"bob"};
299 IOU
const USD {gw1[
"USD"]};
303 STAmount const startBalance {XRP(1000).value()};
304 env.fund (startBalance, gw1, gwF, alice, bob);
307 env (check::create (alice, bob, USD(50)), fee (drops(-10)),
312 env (check::create (alice, bob, USD(50)),
317 env (check::create (alice, alice, XRP(10)), ter (
temREDUNDANT));
321 env (check::create (alice, bob, drops(-1)), ter (
temBAD_AMOUNT));
324 env (check::create (alice, bob, drops(0)), ter (
temBAD_AMOUNT));
327 env (check::create (alice, bob, drops(1)));
330 env (check::create (alice, bob, USD(-1)), ter (
temBAD_AMOUNT));
333 env (check::create (alice, bob, USD(0)), ter (
temBAD_AMOUNT));
336 env (check::create (alice, bob, USD(1)));
345 env (check::create (alice, bob, USD(50)),
350 Account
const bogie {
"bogie"};
351 env (check::create (alice, bogie, USD(50)), ter (
tecNO_DST));
361 env (check::create (alice, bob, USD(50)), dest_tag(11));
368 IOU
const USF {gwF[
"USF"]};
372 env (check::create (alice, bob, USF(50)), ter (
tecFROZEN));
378 env (check::create (alice, bob, USF(50)));
384 env.trust (USD(1000), alice);
385 env.trust (USD(1000), bob);
387 env (pay (gw1, alice, USD(25)));
388 env (pay (gw1, bob, USD(25)));
396 env (check::create (alice, bob, USD(50)), ter (
tecFROZEN));
400 env (check::create (bob, alice, USD(50)));
402 env (pay (bob, alice, USD(1)));
404 env (check::create (gw1, alice, USD(50)));
406 env (pay (gw1, alice, USD(1)));
412 env (check::create (alice, bob, USD(50)));
414 env (check::create (bob, alice, USD(50)));
416 env (check::create (gw1, alice, USD(50)));
424 env (check::create (alice, bob, USD(50)));
426 env (pay (alice, bob, USD(1)));
428 env (check::create (bob, alice, USD(50)), ter (
tecFROZEN));
432 env (check::create (gw1, alice, USD(50)), ter (
tecFROZEN));
443 env (check::create (alice, bob, USD(50)),
447 using namespace std::chrono_literals;
448 env (check::create (alice, bob, USD(50)), expiration (env.now() + 1s));
452 Account
const cheri {
"cheri"};
454 env.current()->fees().accountReserve(1) - drops(1), cheri);
456 env (check::create (cheri, bob, USD(50)),
457 fee (drops (env.current()->fees().base)),
461 env (pay (bob, cheri, drops (env.current()->fees().base + 1)));
464 env (check::create (cheri, bob, USD(50)));
471 testcase (
"Cash XRP");
473 using namespace test::jtx;
475 Account
const alice {
"alice"};
476 Account
const bob {
"bob"};
480 XRPAmount const baseFeeDrops {env.current()->fees().base};
481 STAmount const startBalance {XRP(300).value()};
482 env.fund (startBalance, alice, bob);
486 env (check::create (alice, bob, XRP(10)));
488 env.require (balance (alice, startBalance - drops (baseFeeDrops)));
489 env.require (balance (bob, startBalance));
495 env (check::cash (bob, chkId, XRP(10)));
497 env.require (balance (alice,
498 startBalance - XRP(10) - drops (baseFeeDrops)));
499 env.require (balance (bob,
500 startBalance + XRP(10) - drops (baseFeeDrops)));
507 env (pay (env.master, alice, XRP(10) + drops (baseFeeDrops)));
508 env (pay (bob, env.master, XRP(10) - drops (baseFeeDrops * 2)));
510 env.require (balance (alice, startBalance));
511 env.require (balance (bob, startBalance));
515 STAmount const reserve {env.current()->fees().accountReserve (0)};
517 startBalance - reserve - drops (baseFeeDrops)};
519 env (check::create (alice, bob, checkAmount));
523 env (check::cash (bob, chkId, checkAmount + drops(1)),
527 bob, chkId, check::DeliverMin (checkAmount + drops(1))),
534 env (check::cash (bob, chkId, check::DeliverMin (checkAmount)));
536 env.require (balance (alice, reserve));
537 env.require (balance (bob,
538 startBalance + checkAmount - drops (baseFeeDrops * 3)));
545 env (pay (env.master, alice, checkAmount + drops (baseFeeDrops)));
546 env (pay (bob, env.master, checkAmount - drops (baseFeeDrops * 4)));
548 env.require (balance (alice, startBalance));
549 env.require (balance (bob, startBalance));
553 STAmount const reserve {env.current()->fees().accountReserve (0)};
555 startBalance - reserve - drops (baseFeeDrops - 1)};
557 env (check::create (alice, bob, checkAmount));
566 env (check::cash (bob, chkId, check::DeliverMin (drops(1))));
568 env.require (balance (alice, reserve));
569 env.require (balance (bob,
570 startBalance + checkAmount - drops (baseFeeDrops * 2 + 1)));
577 env (pay (env.master, alice,
578 checkAmount + drops (baseFeeDrops - 1)));
579 env (pay (bob, env.master,
580 checkAmount - drops (baseFeeDrops * 3 + 1)));
582 env.require (balance (alice, startBalance));
583 env.require (balance (bob, startBalance));
590 testcase (
"Cash IOU");
592 using namespace test::jtx;
594 Account
const gw {
"gateway"};
595 Account
const alice {
"alice"};
596 Account
const bob {
"bob"};
597 IOU
const USD {gw[
"USD"]};
602 env.fund (XRP(1000), gw, alice, bob);
606 env (check::create (alice, bob, USD(10)));
614 env (trust (alice, USD(20)));
616 env (pay (gw, alice, USD(9.5)));
623 env (pay (gw, alice, USD(0.5)));
625 env (check::cash (bob, chkId1, USD(10)), ter (
tecNO_LINE));
629 env (trust (bob, USD(9.5)));
636 env (trust (bob, USD(10.5)));
642 env (check::cash (bob, chkId1, USD(10)));
644 env.require (balance (alice, USD( 0)));
645 env.require (balance (bob, USD(10)));
652 env (check::cash (bob, chkId1, USD(10)), ter (
tecNO_ENTRY));
656 env (pay (bob, alice, USD(7)));
660 env (check::create (alice, bob, USD(7)));
667 env (check::cash (bob, chkId2, USD(5)));
669 env.require (balance (alice, USD(2)));
670 env.require (balance (bob, USD(8)));
678 env (check::create (alice, bob, USD(2)));
681 env (check::create (alice, bob, USD(2)));
687 env (check::cash (bob, chkId4, USD(2)));
689 env.require (balance (alice, USD( 0)));
690 env.require (balance (bob, USD(10)));
698 env (check::cash (bob, chkId3, USD(0)), ter (
temBAD_AMOUNT));
700 env.require (balance (alice, USD( 0)));
701 env.require (balance (bob, USD(10)));
708 env (check::cancel (bob, chkId3));
710 env.require (balance (alice, USD( 0)));
711 env.require (balance (bob, USD(10)));
721 env.fund (XRP(1000), gw, alice, bob);
723 env (trust (alice, USD(20)));
724 env (trust (bob, USD(20)));
726 env (pay (gw, alice, USD(8)));
731 env (check::create (alice, bob, USD(9)));
734 env (check::create (alice, bob, USD(8)));
737 env (check::create (alice, bob, USD(7)));
740 env (check::create (alice, bob, USD(6)));
745 env (check::cash (bob, chkId9, check::DeliverMin (USD(9))),
750 env (check::cash (bob, chkId9, check::DeliverMin (USD(7))));
752 env.require (balance (alice, USD(0)));
753 env.require (balance (bob, USD(8)));
760 env (pay (bob, alice, USD(7)));
765 env (check::cash (bob, chkId7, check::DeliverMin (USD(7))));
767 env.require (balance (alice, USD(0)));
768 env.require (balance (bob, USD(8)));
775 env (pay (bob, alice, USD(8)));
780 env (check::cash (bob, chkId6, check::DeliverMin (USD(4))));
782 env.require (balance (alice, USD(2)));
783 env.require (balance (bob, USD(6)));
791 env (check::cash (bob, chkId8, check::DeliverMin (USD(2))));
793 env.require (balance (alice, USD(0)));
794 env.require (balance (bob, USD(8)));
804 env.fund (XRP(1000), gw, alice, bob);
807 env (trust (gw, alice[
"USD"](100)), txflags (
tfSetfAuth));
808 env (trust (alice, USD(20)));
810 env (pay (gw, alice, USD(8)));
816 env (check::create (alice, bob, USD(7)));
819 env (check::cash (bob, chkId, USD(7)), ter (
tecNO_LINE));
824 env (trust (bob, USD(5)));
827 env (check::cash (bob, chkId, USD(7)), ter (
tecNO_AUTH));
831 env (trust (gw, bob[
"USD"](1)), txflags (
tfSetfAuth));
841 env (check::cash (bob, chkId, check::DeliverMin (USD(4))));
843 env.require (balance (alice, USD(3)));
844 env.require (balance (bob, USD(5)));
855 for (
auto const features :
859 Env env {*
this, features};
861 env.fund (XRP(1000), gw, alice, bob);
865 env (check::create (alice, bob, USD(1)));
869 env (check::create (alice, bob, USD(2)));
872 env (trust (alice, USD(20)));
873 env (trust (bob, USD(20)));
875 env (pay (gw, alice, USD(8)));
880 env (regkey (bob, bobby));
885 env (signers (bob, 2, {{bogie, 1}, {demon, 1}}), sig (bobby));
891 BEAST_EXPECT (
ownerCount (env, bob) == signersCount + 1);
894 env (check::cash (bob, chkId1, (USD(1))), sig (bobby));
896 env.require (balance (alice, USD(7)));
897 env.require (balance (bob, USD(1)));
901 BEAST_EXPECT (
ownerCount (env, bob ) == signersCount + 1);
904 XRPAmount const baseFeeDrops {env.current()->fees().base};
905 env (check::cash (bob, chkId2, (USD(2))),
906 msig (bogie, demon), fee (3 * baseFeeDrops));
908 env.require (balance (alice, USD(5)));
909 env.require (balance (bob, USD(3)));
913 BEAST_EXPECT (
ownerCount (env, bob ) == signersCount + 1);
920 testcase (
"Cash with transfer fee");
922 using namespace test::jtx;
924 Account
const gw {
"gateway"};
925 Account
const alice {
"alice"};
926 Account
const bob {
"bob"};
927 IOU
const USD {gw[
"USD"]};
931 env.fund (XRP(1000), gw, alice, bob);
933 env (trust (alice, USD(1000)));
934 env (trust (bob, USD(1000)));
936 env (pay (gw, alice, USD(1000)));
940 env (rate (gw, 1.25));
946 env (check::create (alice, bob, USD(125)));
953 env (check::create (alice, bob, USD(120)));
959 env (check::cash (bob, chkId125, check::DeliverMin (USD(101))),
965 env (check::cash (bob, chkId125, check::DeliverMin (USD(75))));
967 env.require (balance (alice, USD(1000 - 125)));
968 env.require (balance (bob, USD( 0 + 100)));
973 env (rate (gw, 1.2));
978 env (check::cash (bob, chkId120, USD(50)));
980 env.require (balance (alice, USD(1000 - 125 - 60)));
981 env.require (balance (bob, USD( 0 + 100 + 50)));
989 testcase (
"Cash quality");
991 using namespace test::jtx;
993 Account
const gw {
"gateway"};
994 Account
const alice {
"alice"};
995 Account
const bob {
"bob"};
996 IOU
const USD {gw[
"USD"]};
1000 env.fund (XRP(1000), gw, alice, bob);
1002 env (trust (alice, USD(1000)));
1003 env (trust (bob, USD(1000)));
1005 env (pay (gw, alice, USD(1000)));
1014 [] (
double percent) {
return qualityInPercent (percent); };
1016 [] (
double percent) {
return qualityOutPercent (percent); };
1020 auto testNonIssuerQPay = [&env, &alice, &bob, &USD]
1021 (Account
const& truster,
1022 IOU
const& iou,
auto const& inOrOut,
double pct,
double amount)
1025 STAmount const aliceStart {env.balance (alice, USD.issue()).value()};
1026 STAmount const bobStart {env.balance (bob, USD.issue()).value()};
1029 env (trust (truster, iou(1000)), inOrOut (pct));
1032 env (pay (alice, bob, USD(amount)), sendmax (USD(10)));
1034 env.require (balance (alice, aliceStart - USD(10)));
1035 env.require (balance (bob, bobStart + USD(10)));
1039 env (trust (truster, iou(1000)), inOrOut (0));
1043 auto testNonIssuerQCheck = [&env, &alice, &bob, &USD]
1044 (Account
const& truster,
1045 IOU
const& iou,
auto const& inOrOut,
double pct,
double amount)
1048 STAmount const aliceStart {env.balance (alice, USD.issue()).value()};
1049 STAmount const bobStart {env.balance (bob, USD.issue()).value()};
1052 env (trust (truster, iou(1000)), inOrOut (pct));
1056 env (check::create (alice, bob, USD(10)));
1059 env (check::cash (bob, chkId, USD(amount)));
1061 env.require (balance (alice, aliceStart - USD(10)));
1062 env.require (balance (bob, bobStart + USD(10)));
1066 env (trust (truster, iou(1000)), inOrOut (0));
1071 testNonIssuerQPay (alice, gw[
"USD"], qIn, 50, 10);
1072 testNonIssuerQCheck (alice, gw[
"USD"], qIn, 50, 10);
1075 testNonIssuerQPay (bob, gw[
"USD"], qIn, 50, 5);
1076 testNonIssuerQCheck (bob, gw[
"USD"], qIn, 50, 5);
1078 testNonIssuerQPay (gw, alice[
"USD"], qIn, 50, 10);
1079 testNonIssuerQCheck (gw, alice[
"USD"], qIn, 50, 10);
1081 testNonIssuerQPay (gw, bob[
"USD"], qIn, 50, 10);
1082 testNonIssuerQCheck (gw, bob[
"USD"], qIn, 50, 10);
1084 testNonIssuerQPay (alice, gw[
"USD"], qOut, 200, 10);
1085 testNonIssuerQCheck (alice, gw[
"USD"], qOut, 200, 10);
1087 testNonIssuerQPay (bob, gw[
"USD"], qOut, 200, 10);
1088 testNonIssuerQCheck (bob, gw[
"USD"], qOut, 200, 10);
1090 testNonIssuerQPay (gw, alice[
"USD"], qOut, 200, 10);
1091 testNonIssuerQCheck (gw, alice[
"USD"], qOut, 200, 10);
1093 testNonIssuerQPay (gw, bob[
"USD"], qOut, 200, 10);
1094 testNonIssuerQCheck (gw, bob[
"USD"], qOut, 200, 10);
1101 auto testIssuerQPay = [&env, &gw, &alice, &USD]
1102 (Account
const& truster, IOU
const& iou,
1103 auto const& inOrOut,
double pct,
1104 double amt1,
double max1,
double amt2,
double max2)
1108 STAmount const aliceStart {env.balance (alice, USD.issue()).value()};
1111 env (trust (truster, iou(1000)), inOrOut (pct));
1115 env (pay (alice, gw, USD(amt1)), sendmax (USD(max1)));
1117 env.require (balance (alice, aliceStart - USD(10)));
1120 env (pay (gw, alice, USD(amt2)), sendmax (USD(max2)));
1122 env.require (balance (alice, aliceStart));
1126 env (trust (truster, iou(1000)), inOrOut (0));
1130 auto testIssuerQCheck = [&env, &gw, &alice, &USD]
1131 (Account
const& truster, IOU
const& iou,
1132 auto const& inOrOut,
double pct,
1133 double amt1,
double max1,
double amt2,
double max2)
1137 STAmount const aliceStart {env.balance (alice, USD.issue()).value()};
1140 env (trust (truster, iou(1000)), inOrOut (pct));
1145 env (check::create (alice, gw, USD(max1)));
1148 env (check::cash (gw, chkAliceId, USD(amt1)));
1150 env.require (balance (alice, aliceStart - USD(10)));
1154 env (check::create (gw, alice, USD(max2)));
1157 env (check::cash (alice, chkGwId, USD(amt2)));
1159 env.require (balance (alice, aliceStart));
1163 env (trust (truster, iou(1000)), inOrOut (0));
1169 testIssuerQPay (alice, gw[
"USD"], qIn, 50, 10, 10, 5, 10);
1170 testIssuerQCheck (alice, gw[
"USD"], qIn, 50, 10, 10, 5, 10);
1172 testIssuerQPay (gw, alice[
"USD"], qIn, 50, 10, 10, 10, 10);
1173 testIssuerQCheck (gw, alice[
"USD"], qIn, 50, 10, 10, 10, 10);
1175 testIssuerQPay (alice, gw[
"USD"], qOut, 200, 10, 10, 10, 10);
1176 testIssuerQCheck (alice, gw[
"USD"], qOut, 200, 10, 10, 10, 10);
1178 testIssuerQPay (gw, alice[
"USD"], qOut, 200, 10, 10, 10, 10);
1179 testIssuerQCheck (gw, alice[
"USD"], qOut, 200, 10, 10, 10, 10);
1185 testcase (
"Cash invalid");
1187 using namespace test::jtx;
1189 Account
const gw {
"gateway"};
1190 Account
const alice {
"alice"};
1191 Account
const bob {
"bob"};
1192 Account
const zoe {
"zoe"};
1193 IOU
const USD {gw[
"USD"]};
1197 env.fund (XRP(1000), gw, alice, bob, zoe);
1200 env (trust (alice, USD(20)));
1202 env (pay (gw, alice, USD(20)));
1209 env (check::create (alice, bob, USD(20)));
1212 env (check::cash (bob, chkId, USD(20)), ter (
tecNO_LINE));
1217 env (trust (bob, USD(20)));
1223 env (check::cash (bob, chkId, USD(20)), ter (
tecNO_ENTRY));
1229 env (check::create (alice, bob, USD(20)));
1233 env (check::create (alice, bob, XRP(10)));
1236 using namespace std::chrono_literals;
1238 env (check::create (alice, bob, XRP(10)), expiration (env.now() + 1s));
1242 env (check::create (alice, bob, USD(1)));
1246 env (check::create (alice, bob, USD(2)));
1250 env (check::create (alice, bob, USD(3)));
1254 env (check::create (alice, bob, USD(4)));
1258 env (check::create (alice, bob, USD(1)));
1262 env (check::create (alice, bob, USD(2)), dest_tag (7));
1266 auto failingCases = [&env, &gw, &alice, &bob] (
1270 env (check::cash (bob, chkId, amount), fee (drops(-10)),
1275 env (check::cash (bob, chkId, amount),
1281 Json::Value tx {check::cash (bob, chkId, amount)};
1288 Json::Value tx {check::cash (bob, chkId, amount)};
1300 env (check::cash (bob, chkId, amount.zeroed()),
1306 if (! amount.native()) {
1310 env (check::cash (bob, chkId, badAmount),
1323 IOU
const wrongCurrency {gw[
"EUR"]};
1325 badAmount.
setIssue (wrongCurrency.issue());
1326 env (check::cash (bob, chkId, badAmount),
1333 IOU
const wrongIssuer {alice[
"USD"]};
1335 badAmount.
setIssue (wrongIssuer.issue());
1336 env (check::cash (bob, chkId, badAmount),
1342 env (check::cash (bob, chkId, amount + amount),
1347 env (check::cash (bob, chkId, check::DeliverMin (amount + amount)),
1352 failingCases (chkIdX, XRP(10));
1353 failingCases (chkIdU, USD(20));
1356 env (check::cash (bob, chkIdU, USD(20)));
1358 env (check::cash (bob, chkIdX, check::DeliverMin (XRP(10))));
1362 env (check::cash (bob, chkIdExp, XRP(10)), ter (
tecEXPIRED));
1366 env (check::cancel (zoe, chkIdExp));
1371 env (pay (bob, alice, USD(20)));
1373 env.require (balance (alice, USD(20)));
1374 env.require (balance (bob, USD( 0)));
1382 env (check::cash (bob, chkIdFroz1, check::DeliverMin (USD(0.5))),
1390 env (check::cash (bob, chkIdFroz1, USD(1)));
1392 env.require (balance (alice, USD(19)));
1393 env.require (balance (bob, USD( 1)));
1400 env (check::cash (bob, chkIdFroz2, check::DeliverMin (USD(1))),
1407 env (check::cash (bob, chkIdFroz2, USD(2)));
1409 env.require (balance (alice, USD(17)));
1410 env.require (balance (bob, USD( 3)));
1415 env (check::cash (bob, chkIdFroz3, USD(3)), ter (
tecFROZEN));
1417 env (check::cash (bob, chkIdFroz3, check::DeliverMin (USD(1))),
1424 env (check::cash (bob, chkIdFroz3, check::DeliverMin (USD(1))));
1426 env.require (balance (alice, USD(14)));
1427 env.require (balance (bob, USD( 6)));
1433 env (check::cash (bob, chkIdFroz4, USD(4)), ter (
terNO_LINE));
1435 env (check::cash (bob, chkIdFroz4, check::DeliverMin (USD(1))),
1442 env (check::cash (bob, chkIdFroz4, USD(4)));
1444 env.require (balance (alice, USD(10)));
1445 env.require (balance (bob, USD(10)));
1452 env (check::cash (bob, chkIdNoDest1, USD(1)),
1455 env (check::cash (bob, chkIdNoDest1, check::DeliverMin (USD(0.5))),
1460 env (check::cash (bob, chkIdHasDest2, USD(2)));
1462 env.require (balance (alice, USD( 8)));
1463 env.require (balance (bob, USD(12)));
1469 env (check::cash (bob, chkIdNoDest1, USD(1)));
1471 env.require (balance (alice, USD( 7)));
1472 env.require (balance (bob, USD(13)));
1479 testcase (
"Cancel valid");
1481 using namespace test::jtx;
1483 Account
const gw {
"gateway"};
1484 Account
const alice {
"alice"};
1485 Account
const bob {
"bob"};
1486 Account
const zoe {
"zoe"};
1487 IOU
const USD {gw[
"USD"]};
1492 for (
auto const features :
1496 Env env {*
this, features};
1498 env.fund (XRP(1000), gw, alice, bob, zoe);
1503 env (check::create (alice, bob, USD(10)));
1507 env (check::create (alice, bob, XRP(10)));
1511 env (check::create (alice, bob, USD(10)));
1515 using namespace std::chrono_literals;
1517 env (check::create (alice, bob, XRP(10)), expiration (env.now()+600s));
1521 env (check::create (alice, bob, USD(10)), expiration (env.now()+600s));
1525 env (check::create (alice, bob, XRP(10)), expiration (env.now()+600s));
1530 env (check::create (alice, bob, USD(10)), expiration (env.now()+1s));
1534 env (check::create (alice, bob, XRP(10)), expiration (env.now()+1s));
1538 env (check::create (alice, bob, USD(10)), expiration (env.now()+1s));
1543 env (check::create (alice, bob, USD(10)));
1547 env (check::create (alice, bob, XRP(10)));
1550 BEAST_EXPECT (
ownerCount (env, alice) == 11);
1553 env (check::cancel (alice, chkId1));
1556 BEAST_EXPECT (
ownerCount (env, alice) == 10);
1558 env (check::cancel (bob, chkId2));
1569 env (check::cancel (alice, chkIdNotExp1));
1574 env (check::cancel (bob, chkIdNotExp2));
1585 env (check::cancel (alice, chkIdExp1));
1590 env (check::cancel (bob, chkIdExp2));
1595 env (check::cancel (zoe, chkIdExp3));
1602 env (regkey (alice, alie));
1607 env (signers (alice, 2, {{bogie, 1}, {demon, 1}}), sig (alie));
1615 env (check::cancel (alice, chkIdReg), sig (alie));
1618 BEAST_EXPECT (
ownerCount (env, alice) == signersCount + 3);
1621 XRPAmount const baseFeeDrops {env.current()->fees().base};
1622 env (check::cancel (alice, chkIdMSig),
1623 msig (bogie, demon), fee (3 * baseFeeDrops));
1626 BEAST_EXPECT (
ownerCount (env, alice) == signersCount + 2);
1629 env (check::cancel (alice, chkId3), sig (alice));
1632 BEAST_EXPECT (
ownerCount (env, alice) == signersCount + 1);
1634 env (check::cancel (bob, chkIdNotExp3));
1637 BEAST_EXPECT (
ownerCount (env, alice) == signersCount + 0);
1644 testcase (
"Cancel invalid");
1646 using namespace test::jtx;
1648 Account
const alice {
"alice"};
1649 Account
const bob {
"bob"};
1653 env.fund (XRP(1000), alice, bob);
1656 env (check::cancel (bob,
getCheckIndex (alice, env.seq (alice))),
1661 env (check::cancel (bob,
getCheckIndex (alice, env.seq (alice))),
1666 env (check::cancel (bob,
getCheckIndex (alice, env.seq (alice))),
1673 testcase (
"Fix1623 enable");
1675 using namespace test::jtx;
1677 auto testEnable = [
this] (
FeatureBitset const& features,
bool hasFields)
1682 Account
const alice {
"alice"};
1683 Account
const bob {
"bob"};
1685 Env env {*
this, features};
1687 env.fund (XRP(1000), alice, bob);
1691 env (check::create (alice, bob, XRP(200)));
1694 env (check::cash (bob, chkId, check::DeliverMin (XRP(100))));
1704 env.rpc (
"tx", txHash)[jss::result][jss::meta];
1708 BEAST_EXPECT(meta.
isMember (jss::delivered_amount) == hasFields);
1712 testEnable (supported_amendments() -
fix1623,
false);
1713 testEnable (supported_amendments(),
true);