20 #include <ripple/protocol/Feature.h>
21 #include <ripple/protocol/jss.h>
97 if (sle->getType() == ltCHECK)
98 result.push_back(sle);
108 if (
auto const sleAccount = env.
le(account))
126 Json::Value const meta = env.
rpc(
"tx", txHash)[jss::result][jss::meta];
146 using namespace test::jtx;
147 Account
const alice{
"alice"};
153 env.fund(XRP(1000), alice);
157 env(check::create(env.master, alice, XRP(100)), ter(
temDISABLED));
160 env(check::cash(alice, checkId, XRP(100)), ter(
temDISABLED));
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));
195 testcase(
"Create valid");
197 using namespace test::jtx;
199 Account
const gw{
"gateway"};
200 Account
const alice{
"alice"};
201 Account
const bob{
"bob"};
202 IOU
const USD{gw[
"USD"]};
206 STAmount const startBalance{XRP(1000).value()};
207 env.fund(startBalance, gw, alice, bob);
212 auto writeTwoChecks = [&env, &USD,
this](
213 Account
const& from, Account
const& to) {
220 env(check::create(from, to, XRP(2000)));
223 env(check::create(from, to, USD(50)));
229 env.require(owners(from, fromOwnerCount + 2));
231 owners(to, to == from ? fromOwnerCount + 2 : toOwnerCount));
234 writeTwoChecks(alice, bob);
235 writeTwoChecks(gw, alice);
236 writeTwoChecks(alice, gw);
242 using namespace std::chrono_literals;
245 env(check::create(alice, bob, USD(50)), expiration(env.now() + 1s));
248 env(check::create(alice, bob, USD(50)), source_tag(2));
250 env(check::create(alice, bob, USD(50)), dest_tag(3));
252 env(check::create(alice, bob, USD(50)), invoice_id(
uint256{4}));
254 env(check::create(alice, bob, USD(50)),
255 expiration(env.now() + 1s),
266 env(regkey(alice, alie));
271 env(signers(alice, 2, {{bogie, 1}, {demon, 1}}), sig(alie));
275 env(check::create(alice, bob, USD(50)), sig(alie));
281 XRPAmount const baseFeeDrops{env.current()->fees().base};
282 env(check::create(alice, bob, USD(50)),
284 fee(3 * baseFeeDrops));
294 testcase(
"Create invalid");
296 using namespace test::jtx;
298 Account
const gw1{
"gateway1"};
299 Account
const gwF{
"gatewayFrozen"};
300 Account
const alice{
"alice"};
301 Account
const bob{
"bob"};
302 IOU
const USD{gw1[
"USD"]};
306 STAmount const startBalance{XRP(1000).value()};
307 env.fund(startBalance, gw1, gwF, alice, bob);
310 env(check::create(alice, bob, USD(50)),
316 env(check::create(alice, bob, USD(50)),
322 env(check::create(alice, alice, XRP(10)), ter(
temREDUNDANT));
326 env(check::create(alice, bob, drops(-1)), ter(
temBAD_AMOUNT));
329 env(check::create(alice, bob, drops(0)), ter(
temBAD_AMOUNT));
332 env(check::create(alice, bob, drops(1)));
341 env(check::create(alice, bob, USD(1)));
350 env(check::create(alice, bob, USD(50)),
356 Account
const bogie{
"bogie"};
357 env(check::create(alice, bogie, USD(50)), ter(
tecNO_DST));
367 env(check::create(alice, bob, USD(50)), dest_tag(11));
374 IOU
const USF{gwF[
"USF"]};
378 env(check::create(alice, bob, USF(50)), ter(
tecFROZEN));
384 env(check::create(alice, bob, USF(50)));
390 env.trust(USD(1000), alice);
391 env.trust(USD(1000), bob);
393 env(pay(gw1, alice, USD(25)));
394 env(pay(gw1, bob, USD(25)));
402 env(check::create(alice, bob, USD(50)), ter(
tecFROZEN));
406 env(check::create(bob, alice, USD(50)));
408 env(pay(bob, alice, USD(1)));
410 env(check::create(gw1, alice, USD(50)));
412 env(pay(gw1, alice, USD(1)));
418 env(check::create(alice, bob, USD(50)));
420 env(check::create(bob, alice, USD(50)));
422 env(check::create(gw1, alice, USD(50)));
430 env(check::create(alice, bob, USD(50)));
432 env(pay(alice, bob, USD(1)));
434 env(check::create(bob, alice, USD(50)), ter(
tecFROZEN));
438 env(check::create(gw1, alice, USD(50)), ter(
tecFROZEN));
449 env(check::create(alice, bob, USD(50)),
450 expiration(env.now()),
454 using namespace std::chrono_literals;
455 env(check::create(alice, bob, USD(50)), expiration(env.now() + 1s));
459 Account
const cheri{
"cheri"};
460 env.fund(env.current()->fees().accountReserve(1) - drops(1), cheri);
462 env(check::create(cheri, bob, USD(50)),
463 fee(drops(env.current()->fees().base)),
467 env(pay(bob, cheri, drops(env.current()->fees().base + 1)));
470 env(check::create(cheri, bob, USD(50)));
478 testcase(
"Cash XRP");
480 using namespace test::jtx;
482 Account
const alice{
"alice"};
483 Account
const bob{
"bob"};
487 XRPAmount const baseFeeDrops{env.current()->fees().base};
488 STAmount const startBalance{XRP(300).value()};
489 env.fund(startBalance, alice, bob);
493 env(check::create(alice, bob, XRP(10)));
495 env.require(balance(alice, startBalance - drops(baseFeeDrops)));
496 env.require(balance(bob, startBalance));
502 env(check::cash(bob, chkId, XRP(10)));
505 balance(alice, startBalance - XRP(10) - drops(baseFeeDrops)));
507 balance(bob, startBalance + XRP(10) - drops(baseFeeDrops)));
514 env(pay(env.master, alice, XRP(10) + drops(baseFeeDrops)));
515 env(pay(bob, env.master, XRP(10) - drops(baseFeeDrops * 2)));
517 env.require(balance(alice, startBalance));
518 env.require(balance(bob, startBalance));
522 STAmount const reserve{env.current()->fees().accountReserve(0)};
524 startBalance - reserve - drops(baseFeeDrops)};
526 env(check::create(alice, bob, checkAmount));
530 env(check::cash(bob, chkId, checkAmount + drops(1)),
534 bob, chkId, check::DeliverMin(checkAmount + drops(1))),
541 env(check::cash(bob, chkId, check::DeliverMin(checkAmount)));
543 env.require(balance(alice, reserve));
545 bob, startBalance + checkAmount - drops(baseFeeDrops * 3)));
552 env(pay(env.master, alice, checkAmount + drops(baseFeeDrops)));
553 env(pay(bob, env.master, checkAmount - drops(baseFeeDrops * 4)));
555 env.require(balance(alice, startBalance));
556 env.require(balance(bob, startBalance));
560 STAmount const reserve{env.current()->fees().accountReserve(0)};
562 startBalance - reserve - drops(baseFeeDrops - 1)};
564 env(check::create(alice, bob, checkAmount));
573 env(check::cash(bob, chkId, check::DeliverMin(drops(1))));
575 env.require(balance(alice, reserve));
577 bob, startBalance + checkAmount - drops(baseFeeDrops * 2 + 1)));
584 env(pay(env.master, alice, checkAmount + drops(baseFeeDrops - 1)));
586 bob, env.master, checkAmount - drops(baseFeeDrops * 3 + 1)));
588 env.require(balance(alice, startBalance));
589 env.require(balance(bob, startBalance));
597 testcase(
"Cash IOU");
599 using namespace test::jtx;
601 Account
const gw{
"gateway"};
602 Account
const alice{
"alice"};
603 Account
const bob{
"bob"};
604 IOU
const USD{gw[
"USD"]};
609 env.fund(XRP(1000), gw, alice, bob);
613 env(check::create(alice, bob, USD(10)));
621 env(trust(alice, USD(20)));
623 env(pay(gw, alice, USD(9.5)));
630 env(pay(gw, alice, USD(0.5)));
632 env(check::cash(bob, chkId1, USD(10)), ter(
tecNO_LINE));
636 env(trust(bob, USD(9.5)));
643 env(trust(bob, USD(10.5)));
649 env(check::cash(bob, chkId1, USD(10)));
651 env.require(balance(alice, USD(0)));
652 env.require(balance(bob, USD(10)));
659 env(check::cash(bob, chkId1, USD(10)), ter(
tecNO_ENTRY));
663 env(pay(bob, alice, USD(7)));
667 env(check::create(alice, bob, USD(7)));
674 env(check::cash(bob, chkId2, USD(5)));
676 env.require(balance(alice, USD(2)));
677 env.require(balance(bob, USD(8)));
685 env(check::create(alice, bob, USD(2)));
688 env(check::create(alice, bob, USD(2)));
694 env(check::cash(bob, chkId4, USD(2)));
696 env.require(balance(alice, USD(0)));
697 env.require(balance(bob, USD(10)));
707 env.require(balance(alice, USD(0)));
708 env.require(balance(bob, USD(10)));
715 env(check::cancel(bob, chkId3));
717 env.require(balance(alice, USD(0)));
718 env.require(balance(bob, USD(10)));
728 env.fund(XRP(1000), gw, alice, bob);
730 env(trust(alice, USD(20)));
731 env(trust(bob, USD(20)));
733 env(pay(gw, alice, USD(8)));
738 env(check::create(alice, bob, USD(9)));
741 env(check::create(alice, bob, USD(8)));
744 env(check::create(alice, bob, USD(7)));
747 env(check::create(alice, bob, USD(6)));
752 env(check::cash(bob, chkId9, check::DeliverMin(USD(9))),
757 env(check::cash(bob, chkId9, check::DeliverMin(USD(7))));
759 env.require(balance(alice, USD(0)));
760 env.require(balance(bob, USD(8)));
767 env(pay(bob, alice, USD(7)));
772 env(check::cash(bob, chkId7, check::DeliverMin(USD(7))));
774 env.require(balance(alice, USD(0)));
775 env.require(balance(bob, USD(8)));
782 env(pay(bob, alice, USD(8)));
787 env(check::cash(bob, chkId6, check::DeliverMin(USD(4))));
789 env.require(balance(alice, USD(2)));
790 env.require(balance(bob, USD(6)));
798 env(check::cash(bob, chkId8, check::DeliverMin(USD(2))));
800 env.require(balance(alice, USD(0)));
801 env.require(balance(bob, USD(8)));
811 env.fund(XRP(1000), gw, alice, bob);
814 env(trust(gw, alice[
"USD"](100)), txflags(
tfSetfAuth));
815 env(trust(alice, USD(20)));
817 env(pay(gw, alice, USD(8)));
823 env(check::create(alice, bob, USD(7)));
826 env(check::cash(bob, chkId, USD(7)), ter(
tecNO_LINE));
831 env(trust(bob, USD(5)));
834 env(check::cash(bob, chkId, USD(7)), ter(
tecNO_AUTH));
838 env(trust(gw, bob[
"USD"](1)), txflags(
tfSetfAuth));
848 env(check::cash(bob, chkId, check::DeliverMin(USD(4))));
850 env.require(balance(alice, USD(3)));
851 env.require(balance(bob, USD(5)));
862 for (
auto const features :
866 Env env{*
this, features};
868 env.fund(XRP(1000), gw, alice, bob);
872 env(check::create(alice, bob, USD(1)));
876 env(check::create(alice, bob, USD(2)));
879 env(trust(alice, USD(20)));
880 env(trust(bob, USD(20)));
882 env(pay(gw, alice, USD(8)));
887 env(regkey(bob, bobby));
892 env(signers(bob, 2, {{bogie, 1}, {demon, 1}}), sig(bobby));
898 BEAST_EXPECT(
ownerCount(env, bob) == signersCount + 1);
901 env(check::cash(bob, chkId1, (USD(1))), sig(bobby));
903 env.require(balance(alice, USD(7)));
904 env.require(balance(bob, USD(1)));
908 BEAST_EXPECT(
ownerCount(env, bob) == signersCount + 1);
911 XRPAmount const baseFeeDrops{env.current()->fees().base};
912 env(check::cash(bob, chkId2, (USD(2))),
914 fee(3 * baseFeeDrops));
916 env.require(balance(alice, USD(5)));
917 env.require(balance(bob, USD(3)));
921 BEAST_EXPECT(
ownerCount(env, bob) == signersCount + 1);
929 testcase(
"Cash with transfer fee");
931 using namespace test::jtx;
933 Account
const gw{
"gateway"};
934 Account
const alice{
"alice"};
935 Account
const bob{
"bob"};
936 IOU
const USD{gw[
"USD"]};
940 env.fund(XRP(1000), gw, alice, bob);
942 env(trust(alice, USD(1000)));
943 env(trust(bob, USD(1000)));
945 env(pay(gw, alice, USD(1000)));
955 env(check::create(alice, bob, USD(125)));
962 env(check::create(alice, bob, USD(120)));
968 env(check::cash(bob, chkId125, check::DeliverMin(USD(101))),
974 env(check::cash(bob, chkId125, check::DeliverMin(USD(75))));
976 env.require(balance(alice, USD(1000 - 125)));
977 env.require(balance(bob, USD(0 + 100)));
987 env(check::cash(bob, chkId120, USD(50)));
989 env.require(balance(alice, USD(1000 - 125 - 60)));
990 env.require(balance(bob, USD(0 + 100 + 50)));
999 testcase(
"Cash quality");
1001 using namespace test::jtx;
1003 Account
const gw{
"gateway"};
1004 Account
const alice{
"alice"};
1005 Account
const bob{
"bob"};
1006 IOU
const USD{gw[
"USD"]};
1010 env.fund(XRP(1000), gw, alice, bob);
1012 env(trust(alice, USD(1000)));
1013 env(trust(bob, USD(1000)));
1015 env(pay(gw, alice, USD(1000)));
1023 auto qIn = [](
double percent) {
return qualityInPercent(percent); };
1024 auto qOut = [](
double percent) {
return qualityOutPercent(percent); };
1028 auto testNonIssuerQPay = [&env, &alice, &bob, &USD](
1029 Account
const& truster,
1031 auto const& inOrOut,
1035 STAmount const aliceStart{env.balance(alice, USD.issue()).value()};
1036 STAmount const bobStart{env.balance(bob, USD.issue()).value()};
1039 env(trust(truster, iou(1000)), inOrOut(pct));
1042 env(pay(alice, bob, USD(amount)), sendmax(USD(10)));
1044 env.require(balance(alice, aliceStart - USD(10)));
1045 env.require(balance(bob, bobStart + USD(10)));
1049 env(trust(truster, iou(1000)), inOrOut(0));
1053 auto testNonIssuerQCheck = [&env, &alice, &bob, &USD](
1054 Account
const& truster,
1056 auto const& inOrOut,
1060 STAmount const aliceStart{env.balance(alice, USD.issue()).value()};
1061 STAmount const bobStart{env.balance(bob, USD.issue()).value()};
1064 env(trust(truster, iou(1000)), inOrOut(pct));
1068 env(check::create(alice, bob, USD(10)));
1071 env(check::cash(bob, chkId, USD(amount)));
1073 env.require(balance(alice, aliceStart - USD(10)));
1074 env.require(balance(bob, bobStart + USD(10)));
1078 env(trust(truster, iou(1000)), inOrOut(0));
1083 testNonIssuerQPay(alice, gw[
"USD"], qIn, 50, 10);
1084 testNonIssuerQCheck(alice, gw[
"USD"], qIn, 50, 10);
1087 testNonIssuerQPay(bob, gw[
"USD"], qIn, 50, 5);
1088 testNonIssuerQCheck(bob, gw[
"USD"], qIn, 50, 5);
1090 testNonIssuerQPay(gw, alice[
"USD"], qIn, 50, 10);
1091 testNonIssuerQCheck(gw, alice[
"USD"], qIn, 50, 10);
1093 testNonIssuerQPay(gw, bob[
"USD"], qIn, 50, 10);
1094 testNonIssuerQCheck(gw, bob[
"USD"], qIn, 50, 10);
1096 testNonIssuerQPay(alice, gw[
"USD"], qOut, 200, 10);
1097 testNonIssuerQCheck(alice, gw[
"USD"], qOut, 200, 10);
1099 testNonIssuerQPay(bob, gw[
"USD"], qOut, 200, 10);
1100 testNonIssuerQCheck(bob, gw[
"USD"], qOut, 200, 10);
1102 testNonIssuerQPay(gw, alice[
"USD"], qOut, 200, 10);
1103 testNonIssuerQCheck(gw, alice[
"USD"], qOut, 200, 10);
1105 testNonIssuerQPay(gw, bob[
"USD"], qOut, 200, 10);
1106 testNonIssuerQCheck(gw, bob[
"USD"], qOut, 200, 10);
1113 auto testIssuerQPay = [&env, &gw, &alice, &USD](
1114 Account
const& truster,
1116 auto const& inOrOut,
1124 STAmount const aliceStart{env.balance(alice, USD.issue()).value()};
1127 env(trust(truster, iou(1000)), inOrOut(pct));
1131 env(pay(alice, gw, USD(amt1)), sendmax(USD(max1)));
1133 env.require(balance(alice, aliceStart - USD(10)));
1136 env(pay(gw, alice, USD(amt2)), sendmax(USD(max2)));
1138 env.require(balance(alice, aliceStart));
1142 env(trust(truster, iou(1000)), inOrOut(0));
1146 auto testIssuerQCheck = [&env, &gw, &alice, &USD](
1147 Account
const& truster,
1149 auto const& inOrOut,
1157 STAmount const aliceStart{env.balance(alice, USD.issue()).value()};
1160 env(trust(truster, iou(1000)), inOrOut(pct));
1165 env(check::create(alice, gw, USD(max1)));
1168 env(check::cash(gw, chkAliceId, USD(amt1)));
1170 env.require(balance(alice, aliceStart - USD(10)));
1174 env(check::create(gw, alice, USD(max2)));
1177 env(check::cash(alice, chkGwId, USD(amt2)));
1179 env.require(balance(alice, aliceStart));
1183 env(trust(truster, iou(1000)), inOrOut(0));
1189 testIssuerQPay(alice, gw[
"USD"], qIn, 50, 10, 10, 5, 10);
1190 testIssuerQCheck(alice, gw[
"USD"], qIn, 50, 10, 10, 5, 10);
1192 testIssuerQPay(gw, alice[
"USD"], qIn, 50, 10, 10, 10, 10);
1193 testIssuerQCheck(gw, alice[
"USD"], qIn, 50, 10, 10, 10, 10);
1195 testIssuerQPay(alice, gw[
"USD"], qOut, 200, 10, 10, 10, 10);
1196 testIssuerQCheck(alice, gw[
"USD"], qOut, 200, 10, 10, 10, 10);
1198 testIssuerQPay(gw, alice[
"USD"], qOut, 200, 10, 10, 10, 10);
1199 testIssuerQCheck(gw, alice[
"USD"], qOut, 200, 10, 10, 10, 10);
1206 testcase(
"Cash invalid");
1208 using namespace test::jtx;
1210 Account
const gw{
"gateway"};
1211 Account
const alice{
"alice"};
1212 Account
const bob{
"bob"};
1213 Account
const zoe{
"zoe"};
1214 IOU
const USD{gw[
"USD"]};
1218 env.fund(XRP(1000), gw, alice, bob, zoe);
1221 env(trust(alice, USD(20)));
1223 env(pay(gw, alice, USD(20)));
1230 env(check::create(alice, bob, USD(20)));
1233 env(check::cash(bob, chkId, USD(20)), ter(
tecNO_LINE));
1238 env(trust(bob, USD(20)));
1244 env(check::cash(bob, chkId, USD(20)), ter(
tecNO_ENTRY));
1250 env(check::create(alice, bob, USD(20)));
1254 env(check::create(alice, bob, XRP(10)));
1257 using namespace std::chrono_literals;
1259 env(check::create(alice, bob, XRP(10)), expiration(env.now() + 1s));
1263 env(check::create(alice, bob, USD(1)));
1267 env(check::create(alice, bob, USD(2)));
1271 env(check::create(alice, bob, USD(3)));
1275 env(check::create(alice, bob, USD(4)));
1279 env(check::create(alice, bob, USD(1)));
1283 env(check::create(alice, bob, USD(2)), dest_tag(7));
1287 auto failingCases = [&env, &gw, &alice, &bob](
1290 env(check::cash(bob, chkId, amount),
1296 env(check::cash(bob, chkId, amount),
1322 env(check::cash(bob, chkId, amount.zeroed()),
1328 if (!amount.native())
1345 IOU
const wrongCurrency{gw[
"EUR"]};
1347 badAmount.
setIssue(wrongCurrency.issue());
1348 env(check::cash(bob, chkId, badAmount), ter(
temMALFORMED));
1354 IOU
const wrongIssuer{alice[
"USD"]};
1356 badAmount.
setIssue(wrongIssuer.issue());
1357 env(check::cash(bob, chkId, badAmount), ter(
temMALFORMED));
1366 env(check::cash(bob, chkId, check::DeliverMin(amount + amount)),
1371 failingCases(chkIdX, XRP(10));
1372 failingCases(chkIdU, USD(20));
1375 env(check::cash(bob, chkIdU, USD(20)));
1377 env(check::cash(bob, chkIdX, check::DeliverMin(XRP(10))));
1381 env(check::cash(bob, chkIdExp, XRP(10)), ter(
tecEXPIRED));
1385 env(check::cancel(zoe, chkIdExp));
1390 env(pay(bob, alice, USD(20)));
1392 env.require(balance(alice, USD(20)));
1393 env.require(balance(bob, USD(0)));
1401 env(check::cash(bob, chkIdFroz1, check::DeliverMin(USD(0.5))),
1409 env(check::cash(bob, chkIdFroz1, USD(1)));
1411 env.require(balance(alice, USD(19)));
1412 env.require(balance(bob, USD(1)));
1419 env(check::cash(bob, chkIdFroz2, check::DeliverMin(USD(1))),
1426 env(check::cash(bob, chkIdFroz2, USD(2)));
1428 env.require(balance(alice, USD(17)));
1429 env.require(balance(bob, USD(3)));
1434 env(check::cash(bob, chkIdFroz3, USD(3)), ter(
tecFROZEN));
1436 env(check::cash(bob, chkIdFroz3, check::DeliverMin(USD(1))),
1443 env(check::cash(bob, chkIdFroz3, check::DeliverMin(USD(1))));
1445 env.require(balance(alice, USD(14)));
1446 env.require(balance(bob, USD(6)));
1452 env(check::cash(bob, chkIdFroz4, USD(4)), ter(
terNO_LINE));
1454 env(check::cash(bob, chkIdFroz4, check::DeliverMin(USD(1))),
1461 env(check::cash(bob, chkIdFroz4, USD(4)));
1463 env.require(balance(alice, USD(10)));
1464 env.require(balance(bob, USD(10)));
1473 env(check::cash(bob, chkIdNoDest1, check::DeliverMin(USD(0.5))),
1478 env(check::cash(bob, chkIdHasDest2, USD(2)));
1480 env.require(balance(alice, USD(8)));
1481 env.require(balance(bob, USD(12)));
1487 env(check::cash(bob, chkIdNoDest1, USD(1)));
1489 env.require(balance(alice, USD(7)));
1490 env.require(balance(bob, USD(13)));
1498 testcase(
"Cancel valid");
1500 using namespace test::jtx;
1502 Account
const gw{
"gateway"};
1503 Account
const alice{
"alice"};
1504 Account
const bob{
"bob"};
1505 Account
const zoe{
"zoe"};
1506 IOU
const USD{gw[
"USD"]};
1511 for (
auto const features :
1515 Env env{*
this, features};
1517 env.fund(XRP(1000), gw, alice, bob, zoe);
1522 env(check::create(alice, bob, USD(10)));
1526 env(check::create(alice, bob, XRP(10)));
1530 env(check::create(alice, bob, USD(10)));
1534 using namespace std::chrono_literals;
1536 env(check::create(alice, bob, XRP(10)),
1537 expiration(env.now() + 600s));
1541 env(check::create(alice, bob, USD(10)),
1542 expiration(env.now() + 600s));
1546 env(check::create(alice, bob, XRP(10)),
1547 expiration(env.now() + 600s));
1552 env(check::create(alice, bob, USD(10)), expiration(env.now() + 1s));
1556 env(check::create(alice, bob, XRP(10)), expiration(env.now() + 1s));
1560 env(check::create(alice, bob, USD(10)), expiration(env.now() + 1s));
1565 env(check::create(alice, bob, USD(10)));
1569 env(check::create(alice, bob, XRP(10)));
1575 env(check::cancel(alice, chkId1));
1580 env(check::cancel(bob, chkId2));
1591 env(check::cancel(alice, chkIdNotExp1));
1596 env(check::cancel(bob, chkIdNotExp2));
1607 env(check::cancel(alice, chkIdExp1));
1612 env(check::cancel(bob, chkIdExp2));
1617 env(check::cancel(zoe, chkIdExp3));
1624 env(regkey(alice, alie));
1629 env(signers(alice, 2, {{bogie, 1}, {demon, 1}}), sig(alie));
1637 env(check::cancel(alice, chkIdReg), sig(alie));
1640 BEAST_EXPECT(
ownerCount(env, alice) == signersCount + 3);
1643 XRPAmount const baseFeeDrops{env.current()->fees().base};
1644 env(check::cancel(alice, chkIdMSig),
1646 fee(3 * baseFeeDrops));
1649 BEAST_EXPECT(
ownerCount(env, alice) == signersCount + 2);
1652 env(check::cancel(alice, chkId3), sig(alice));
1655 BEAST_EXPECT(
ownerCount(env, alice) == signersCount + 1);
1657 env(check::cancel(bob, chkIdNotExp3));
1660 BEAST_EXPECT(
ownerCount(env, alice) == signersCount + 0);
1668 testcase(
"Cancel invalid");
1670 using namespace test::jtx;
1672 Account
const alice{
"alice"};
1673 Account
const bob{
"bob"};
1677 env.fund(XRP(1000), alice, bob);
1680 env(check::cancel(bob,
getCheckIndex(alice, env.seq(alice))),
1686 env(check::cancel(bob,
getCheckIndex(alice, env.seq(alice))),
1692 env(check::cancel(bob,
getCheckIndex(alice, env.seq(alice))),
1700 testcase(
"Fix1623 enable");
1702 using namespace test::jtx;
1704 auto testEnable = [
this](
1709 Account
const alice{
"alice"};
1710 Account
const bob{
"bob"};
1712 Env env{*
this, features};
1714 env.fund(XRP(1000), alice, bob);
1718 env(check::create(alice, bob, XRP(200)));
1721 env(check::cash(bob, chkId, check::DeliverMin(XRP(100))));
1731 env.rpc(
"tx", txHash)[jss::result][jss::meta];
1735 BEAST_EXPECT(meta.
isMember(jss::delivered_amount) == hasFields);
1739 testEnable(supported_amendments() -
fix1623,
false);
1740 testEnable(supported_amendments(),
true);