19 using namespace test::jtx;
20 Env env(*
this, features);
22 Account
const G1{
"G1"};
23 Account
const alice{
"alice"};
24 Account
const bob{
"bob"};
26 env.fund(XRP(1000), G1, alice, bob);
29 env.trust(G1[
"USD"](100), bob);
30 env.trust(G1[
"USD"](100), alice);
33 env(pay(G1, bob, G1[
"USD"](10)));
34 env(pay(G1, alice, G1[
"USD"](100)));
37 env(offer(alice, XRP(500), G1[
"USD"](100)));
41 auto lines = getAccountLines(env, bob);
42 if (!BEAST_EXPECT(checkArraySize(lines[jss::lines], 1u)))
44 BEAST_EXPECT(lines[jss::lines][0u][jss::account] == G1.human());
45 BEAST_EXPECT(lines[jss::lines][0u][jss::limit] ==
"100");
46 BEAST_EXPECT(lines[jss::lines][0u][jss::balance] ==
"10");
50 auto lines = getAccountLines(env, alice);
51 if (!BEAST_EXPECT(checkArraySize(lines[jss::lines], 1u)))
53 BEAST_EXPECT(lines[jss::lines][0u][jss::account] == G1.human());
54 BEAST_EXPECT(lines[jss::lines][0u][jss::limit] ==
"100");
55 BEAST_EXPECT(lines[jss::lines][0u][jss::balance] ==
"100");
61 env(pay(alice, bob, G1[
"USD"](1)));
64 env(pay(bob, alice, G1[
"USD"](1)));
71 env(trust(G1, bob[
"USD"](0), tfSetFreeze));
72 auto affected = env.meta()->getJson(
JsonOptions::none)[sfAffectedNodes.fieldName];
73 if (!BEAST_EXPECT(checkArraySize(affected, 2u)))
75 auto ff = affected[1u][sfModifiedNode.fieldName][sfFinalFields.fieldName];
78 BEAST_EXPECT(ff[jss::Flags].asUInt() & lsfLowFreeze);
79 BEAST_EXPECT(!(ff[jss::Flags].asUInt() & lsfHighFreeze));
86 env(offer(bob, G1[
"USD"](5), XRP(25)));
87 auto affected = env.meta()->getJson(
JsonOptions::none)[sfAffectedNodes.fieldName];
88 if (!BEAST_EXPECT(checkArraySize(affected, 5u)))
90 auto ff = affected[3u][sfModifiedNode.fieldName][sfFinalFields.fieldName];
95 BEAST_EXPECT(ff[sfBalance.fieldName] == amt);
104 env(pay(alice, bob, G1[
"USD"](1)));
107 env(pay(bob, alice, G1[
"USD"](1)), ter(
tecPATH_DRY));
113 auto lines = getAccountLines(env, G1);
115 for (
auto const& it : lines[jss::lines])
117 if (it[jss::account] == bob.human())
123 if (!BEAST_EXPECT(bobLine))
125 BEAST_EXPECT(bobLine[jss::freeze] ==
true);
126 BEAST_EXPECT(bobLine[jss::balance] ==
"-16");
131 auto lines = getAccountLines(env, bob);
133 for (
auto const& it : lines[jss::lines])
135 if (it[jss::account] == G1.human())
141 if (!BEAST_EXPECT(g1Line))
143 BEAST_EXPECT(g1Line[jss::freeze_peer] ==
true);
144 BEAST_EXPECT(g1Line[jss::balance] ==
"16");
150 env(trust(G1, bob[
"USD"](0), tfClearFreeze));
151 auto affected = env.meta()->getJson(
JsonOptions::none)[sfAffectedNodes.fieldName];
152 if (!BEAST_EXPECT(checkArraySize(affected, 2u)))
154 auto ff = affected[1u][sfModifiedNode.fieldName][sfFinalFields.fieldName];
157 BEAST_EXPECT(!(ff[jss::Flags].asUInt() & lsfLowFreeze));
158 BEAST_EXPECT(!(ff[jss::Flags].asUInt() & lsfHighFreeze));
347 using namespace test::jtx;
348 Env env(*
this, features);
350 Account
const G1{
"G1"};
351 Account
const A1{
"A1"};
352 Account
const A2{
"A2"};
353 Account
const A3{
"A3"};
354 Account
const A4{
"A4"};
356 env.fund(XRP(12000), G1);
357 env.fund(XRP(1000), A1);
358 env.fund(XRP(20000), A2, A3, A4);
361 env.trust(G1[
"USD"](1200), A1);
362 env.trust(G1[
"USD"](200), A2);
363 env.trust(G1[
"BTC"](100), A3);
364 env.trust(G1[
"BTC"](100), A4);
367 env(pay(G1, A1, G1[
"USD"](1000)));
368 env(pay(G1, A2, G1[
"USD"](100)));
369 env(pay(G1, A3, G1[
"BTC"](100)));
370 env(pay(G1, A4, G1[
"BTC"](100)));
373 env(offer(G1, XRP(10000), G1[
"USD"](100)), txflags(tfPassive));
374 env(offer(G1, G1[
"USD"](100), XRP(10000)), txflags(tfPassive));
375 env(offer(A1, XRP(10000), G1[
"USD"](100)), txflags(tfPassive));
376 env(offer(A2, G1[
"USD"](100), XRP(10000)), txflags(tfPassive));
382 env.require(nflags(G1, asfGlobalFreeze));
383 env(fset(G1, asfGlobalFreeze));
384 env.require(flags(G1, asfGlobalFreeze));
385 env.require(nflags(G1, asfNoFreeze));
388 env(fclear(G1, asfGlobalFreeze));
389 env.require(nflags(G1, asfGlobalFreeze));
390 env.require(nflags(G1, asfNoFreeze));
396 auto offers = env.rpc(
397 "book_offers",
std::string(
"USD/") + G1.human(),
"XRP")[jss::result][jss::offers];
398 if (!BEAST_EXPECT(checkArraySize(offers, 2u)))
401 for (
auto const& offer : offers)
403 accounts.
insert(offer[jss::Account].asString());
405 BEAST_EXPECT(accounts.
find(A2.human()) !=
std::end(accounts));
406 BEAST_EXPECT(accounts.
find(G1.human()) !=
std::end(accounts));
410 "book_offers",
"XRP",
std::string(
"USD/") + G1.human())[jss::result][jss::offers];
411 if (!BEAST_EXPECT(checkArraySize(offers, 2u)))
414 for (
auto const& offer : offers)
416 accounts.
insert(offer[jss::Account].asString());
418 BEAST_EXPECT(accounts.
find(A1.human()) !=
std::end(accounts));
419 BEAST_EXPECT(accounts.
find(G1.human()) !=
std::end(accounts));
425 env(offer(A3, G1[
"BTC"](1), XRP(1)));
428 env(offer(A4, XRP(1), G1[
"BTC"](1)));
431 env(pay(G1, A2, G1[
"USD"](1)));
434 env(pay(A2, G1, G1[
"USD"](1)));
437 env(pay(A2, A1, G1[
"USD"](1)));
440 env(pay(A1, A2, G1[
"USD"](1)));
447 env.require(nflags(G1, asfGlobalFreeze));
448 env(fset(G1, asfGlobalFreeze));
449 env.require(flags(G1, asfGlobalFreeze));
450 env.require(nflags(G1, asfNoFreeze));
453 env(offer(A3, G1[
"BTC"](1), XRP(1)), ter(
tecFROZEN));
456 env(offer(A4, XRP(1), G1[
"BTC"](1)), ter(
tecFROZEN));
462 auto offers = getAccountOffers(env, G1)[jss::offers];
463 if (!BEAST_EXPECT(checkArraySize(offers, 2u)))
469 "book_offers",
"XRP",
std::string(
"USD/") + G1.human())[jss::result][jss::offers];
470 if (!BEAST_EXPECT(checkArraySize(offers, 2u)))
474 "book_offers",
std::string(
"USD/") + G1.human(),
"XRP")[jss::result][jss::offers];
475 if (!BEAST_EXPECT(checkArraySize(offers, 2u)))
482 env(pay(G1, A2, G1[
"USD"](1)));
485 env(pay(A2, G1, G1[
"USD"](1)));
497 using namespace test::jtx;
498 Env env(*
this, features);
500 Account
const G1{
"G1"};
501 Account
const A1{
"A1"};
502 Account
const frozenAcc{
"A2"};
503 Account
const deepFrozenAcc{
"A3"};
505 env.fund(XRP(12000), G1);
506 env.fund(XRP(1000), A1);
507 env.fund(XRP(1000), frozenAcc);
508 env.fund(XRP(1000), deepFrozenAcc);
511 env.trust(G1[
"USD"](1000), A1);
512 env.trust(G1[
"USD"](1000), frozenAcc);
513 env.trust(G1[
"USD"](1000), deepFrozenAcc);
516 env(pay(G1, A1, G1[
"USD"](1000)));
517 env(pay(G1, frozenAcc, G1[
"USD"](1000)));
518 env(pay(G1, deepFrozenAcc, G1[
"USD"](1000)));
522 env(trust(G1, frozenAcc[
"USD"](0), tfSetFreeze));
525 BEAST_EXPECT(flags & lsfLowFreeze);
526 BEAST_EXPECT(!(flags & lsfHighFreeze));
528 if (features[featureDeepFreeze])
530 env(trust(G1, deepFrozenAcc[
"USD"](0), tfSetFreeze | tfSetDeepFreeze));
533 BEAST_EXPECT(!(flags & (lsfLowFreeze | lsfLowDeepFreeze)));
534 BEAST_EXPECT(flags & lsfHighFreeze);
535 BEAST_EXPECT(flags & lsfHighDeepFreeze);
542 env.require(nflags(G1, asfNoFreeze));
543 env(fset(G1, asfNoFreeze));
544 env.require(flags(G1, asfNoFreeze));
545 env.require(nflags(G1, asfGlobalFreeze));
548 env(fclear(G1, asfNoFreeze));
549 env.require(flags(G1, asfNoFreeze));
550 env.require(nflags(G1, asfGlobalFreeze));
553 env(fset(G1, asfGlobalFreeze));
554 env.require(flags(G1, asfNoFreeze));
555 env.require(flags(G1, asfGlobalFreeze));
558 env(fclear(G1, asfGlobalFreeze));
559 env.require(flags(G1, asfNoFreeze));
560 env.require(flags(G1, asfGlobalFreeze));
563 if (features[featureDeepFreeze])
569 env(trust(G1, frozenAcc[
"USD"](0), tfSetDeepFreeze), ter(
tecNO_PERMISSION));
575 env(trust(G1, A1[
"USD"](0), tfSetFreeze));
576 auto affected = env.meta()->getJson(
JsonOptions::none)[sfAffectedNodes.fieldName];
577 if (!BEAST_EXPECT(checkArraySize(affected, 1u)))
580 auto let = affected[0u][sfModifiedNode.fieldName][sfLedgerEntryType.fieldName];
581 BEAST_EXPECT(let == jss::AccountRoot);
585 env(trust(G1, frozenAcc[
"USD"](0), tfClearFreeze));
588 BEAST_EXPECT(!(flags & lsfLowFreeze));
591 if (features[featureDeepFreeze])
594 env(trust(G1, deepFrozenAcc[
"USD"](0), tfClearDeepFreeze));
597 BEAST_EXPECT(flags & lsfHighFreeze);
598 BEAST_EXPECT(!(flags & lsfHighDeepFreeze));
606 testcase(
"Offers for Frozen Trust Lines");
608 using namespace test::jtx;
609 Env env(*
this, features);
611 Account
const G1{
"G1"};
612 Account
const A2{
"A2"};
613 Account
const A3{
"A3"};
614 Account
const A4{
"A4"};
616 env.fund(XRP(1000), G1, A3, A4);
617 env.fund(XRP(2000), A2);
620 env.trust(G1[
"USD"](1000), A2);
621 env.trust(G1[
"USD"](2000), A3);
622 env.trust(G1[
"USD"](2000), A4);
625 env(pay(G1, A3, G1[
"USD"](2000)));
626 env(pay(G1, A4, G1[
"USD"](2000)));
629 env(offer(A3, XRP(1000), G1[
"USD"](1000)), txflags(tfPassive));
634 env(pay(A2, G1, G1[
"USD"](1)), paths(G1[
"USD"]), sendmax(XRP(1)));
638 auto offers = getAccountOffers(env, A3)[jss::offers];
639 if (!BEAST_EXPECT(checkArraySize(offers, 1u)))
645 env(offer(A4, XRP(999), G1[
"USD"](999)));
649 env(trust(G1, A3[
"USD"](0), tfSetFreeze));
650 auto affected = env.meta()->getJson(
JsonOptions::none)[sfAffectedNodes.fieldName];
651 if (!BEAST_EXPECT(checkArraySize(affected, 2u)))
653 auto ff = affected[1u][sfModifiedNode.fieldName][sfFinalFields.fieldName];
654 BEAST_EXPECT(ff[sfHighLimit.fieldName] == G1[
"USD"](0).value().getJson(
JsonOptions::none));
655 BEAST_EXPECT(!(ff[jss::Flags].asUInt() & lsfLowFreeze));
656 BEAST_EXPECT(ff[jss::Flags].asUInt() & lsfHighFreeze);
660 offers = getAccountOffers(env, A3)[jss::offers];
661 if (!BEAST_EXPECT(checkArraySize(offers, 1u)))
665 env(pay(A2, G1, G1[
"USD"](1)), paths(G1[
"USD"]), sendmax(XRP(1)));
669 offers = getAccountOffers(env, A3)[jss::offers];
670 if (!BEAST_EXPECT(checkArraySize(offers, 0u)))
675 env(trust(G1, A4[
"USD"](0), tfSetFreeze));
677 if (!BEAST_EXPECT(checkArraySize(affected, 2u)))
679 ff = affected[0u][sfModifiedNode.fieldName][sfFinalFields.fieldName];
680 BEAST_EXPECT(ff[sfLowLimit.fieldName] == G1[
"USD"](0).value().getJson(
JsonOptions::none));
681 BEAST_EXPECT(ff[jss::Flags].asUInt() & lsfLowFreeze);
682 BEAST_EXPECT(!(ff[jss::Flags].asUInt() & lsfHighFreeze));
686 env(offer(A2, G1[
"USD"](999), XRP(999)));
688 if (!BEAST_EXPECT(checkArraySize(affected, 8u)))
690 auto created = affected[0u][sfCreatedNode.fieldName];
691 BEAST_EXPECT(created[sfNewFields.fieldName][jss::Account] == A2.human());
695 offers = getAccountOffers(env, A4)[jss::offers];
696 if (!BEAST_EXPECT(checkArraySize(offers, 0u)))
703 testcase(
"Offers on frozen trust lines");
705 using namespace test::jtx;
706 Env env(*
this, features);
708 Account
const G1{
"G1"};
709 Account
const A1{
"A1"};
710 Account
const A2{
"A2"};
711 Account
const A3{
"A3"};
712 auto const USD{G1[
"USD"]};
714 env.fund(XRP(10000), G1, A1, A2, A3);
717 auto const limit = USD(10000);
718 env.trust(limit, A1, A2, A3);
721 env(pay(G1, A1, USD(1000)));
722 env(pay(G1, A2, USD(1000)));
727 env(offer(A2, XRP(100), USD(50)), txflags(tfPassive));
731 env(offer(A3, USD(100), XRP(100)), txflags(tfPassive));
733 env.require(offers(A2, 1), offers(A3, 1));
736 env(offer(A1, USD(1), XRP(2)), txflags(tfFillOrKill));
738 env.require(balance(A1, USD(1001)), balance(A2, USD(999)));
741 env(offer(A1, XRP(1), USD(1)), txflags(tfFillOrKill));
743 env.require(balance(A1, USD(1000)), balance(A3, USD(1)));
748 env(trust(G1, A1[
"USD"](0), tfSetFreeze));
752 env(offer(A1, USD(1), XRP(0.5)), txflags(tfPassive));
754 env.require(balance(A1, USD(1000)), offers(A1, 1));
756 env(offer_cancel(A1, env.seq(A1) - 1));
757 env.require(offers(A1, 0));
761 env(offer(A1, USD(1), XRP(2)), txflags(tfFillOrKill));
763 env.require(balance(A1, USD(1001)), balance(A2, USD(998)), offers(A1, 0));
768 env.require(balance(A1, USD(1001)), offers(A1, 0));
773 env.require(balance(A1, USD(1001)), offers(A1, 0));
775 env(trust(G1, A1[
"USD"](0), tfClearFreeze));
781 if (features[featureDeepFreeze])
783 env(trust(G1, A1[
"USD"](0), tfSetFreeze | tfSetDeepFreeze));
787 env(offer(A1, USD(1), XRP(0.5)), txflags(tfPassive), ter(
tecFROZEN));
791 env(offer(A1, USD(1), XRP(2)), txflags(tfFillOrKill), ter(
tecFROZEN));
802 env(trust(G1, A1[
"USD"](0), tfClearFreeze | tfClearDeepFreeze));
804 env.require(balance(A1, USD(1001)), offers(A1, 0));
810 env.require(balance(A1, USD(1001)));
811 env(offer(A1, XRP(1.9), USD(1)));
812 env(offer(A1, USD(1), XRP(1.1)));
814 env.require(balance(A1, USD(1001)), offers(A1, 2));
816 env(trust(G1, A1[
"USD"](0), tfSetFreeze));
820 env.require(balance(A1, USD(1001)), balance(A2, USD(998)));
821 env(offer(A2, XRP(1.1), USD(1)), txflags(tfFillOrKill));
823 env.require(balance(A1, USD(1002)), balance(A2, USD(997)), offers(A1, 1));
826 env.require(balance(A1, USD(1002)), balance(A3, USD(1)), offers(A1, 1));
827 env(offer(A3, USD(1), XRP(1.9)), txflags(tfFillOrKill), ter(
tecKILLED));
829 env.require(balance(A1, USD(1002)), balance(A3, USD(1)), offers(A1, 0));
831 env(trust(G1, A1[
"USD"](0), tfClearFreeze));
837 if (features[featureDeepFreeze])
839 env.require(balance(A1, USD(1002)));
840 env(offer(A1, XRP(1.9), USD(1)));
841 env(offer(A1, USD(1), XRP(1.1)));
843 env.require(balance(A1, USD(1002)), offers(A1, 2));
845 env(trust(G1, A1[
"USD"](0), tfSetFreeze | tfSetDeepFreeze));
849 env.require(balance(A1, USD(1002)), balance(A2, USD(997)));
850 env(offer(A2, XRP(1.1), USD(1)), txflags(tfFillOrKill), ter(
tecKILLED));
852 env.require(balance(A1, USD(1002)), balance(A2, USD(997)), offers(A1, 1));
855 env.require(balance(A1, USD(1002)), balance(A3, USD(1)), offers(A1, 1));
856 env(offer(A3, USD(1), XRP(1.9)), txflags(tfFillOrKill), ter(
tecKILLED));
858 env.require(balance(A1, USD(1002)), balance(A3, USD(1)), offers(A1, 0));
860 env(trust(G1, A1[
"USD"](0), tfClearFreeze | tfClearDeepFreeze));
867 env(trust(A1, limit, tfSetFreeze));
871 env(offer(A1, USD(1), XRP(0.5)), txflags(tfPassive));
873 env.require(balance(A1, USD(1002)), offers(A1, 1));
875 env(offer_cancel(A1, env.seq(A1) - 1));
876 env.require(offers(A1, 0));
880 env(offer(A1, USD(1), XRP(2)), txflags(tfFillOrKill), ter(
tecKILLED));
882 env.require(balance(A1, USD(1002)), balance(A2, USD(997)), offers(A1, 0));
885 env(offer(A1, XRP(2), USD(1)), txflags(tfPassive));
887 env.require(balance(A1, USD(1002)), offers(A1, 1));
889 env(offer_cancel(A1, env.seq(A1) - 1));
890 env.require(offers(A1, 0));
894 env(offer(A1, XRP(1), USD(1)), txflags(tfFillOrKill));
896 env.require(balance(A1, USD(1001)), offers(A1, 0));
898 env(trust(A1, limit, tfClearFreeze));
904 if (features[featureDeepFreeze])
906 env(trust(A1, limit, tfSetFreeze | tfSetDeepFreeze));
910 env(offer(A1, USD(1), XRP(0.5)), txflags(tfPassive), ter(
tecFROZEN));
914 env(offer(A1, USD(1), XRP(2)), txflags(tfFillOrKill), ter(
tecFROZEN));
925 env(trust(A1, limit, tfClearFreeze | tfClearDeepFreeze));
933 testcase(
"Longer paths payment on frozen trust lines");
934 using namespace test::jtx;
937 Env env(*
this, features);
938 Account
const G1{
"G1"};
939 Account
const A1{
"A1"};
940 Account
const A2{
"A2"};
941 auto const USD{G1[
"USD"]};
943 env.fund(XRP(10000), G1, A1, A2);
946 auto const limit = USD(10000);
947 env.trust(limit, A1, A2);
950 env(pay(G1, A1, USD(1000)));
951 env(pay(G1, A2, USD(1000)));
954 env(offer(A2, XRP(100), USD(100)), txflags(tfPassive));
959 env(trust(G1, A2[
"USD"](0), tfSetFreeze));
963 env(pay(A1, G1, USD(10)),
966 txflags(tfNoRippleDirect),
971 env(pay(G1, A1, USD(10)),
974 txflags(tfNoRippleDirect),
978 env(trust(G1, A2[
"USD"](0), tfClearFreeze));
983 if (features[featureDeepFreeze])
985 env(trust(G1, A2[
"USD"](0), tfSetFreeze | tfSetDeepFreeze));
989 env(pay(A1, G1, USD(10)),
992 txflags(tfNoRippleDirect),
997 env(pay(G1, A1, USD(10)),
1000 txflags(tfNoRippleDirect),
1004 env(trust(G1, A2[
"USD"](0), tfClearFreeze | tfClearDeepFreeze));
1011 env(trust(A2, limit, tfSetFreeze));
1015 env(pay(A1, G1, USD(10)), path(~USD), sendmax(XRP(11)), txflags(tfNoRippleDirect));
1019 env(pay(G1, A1, USD(10)), path(~USD), sendmax(XRP(11)), txflags(tfNoRippleDirect));
1022 env(trust(A2, limit, tfClearFreeze));
1028 if (features[featureDeepFreeze])
1030 env(trust(A2, limit, tfSetFreeze | tfSetDeepFreeze));
1034 env(pay(A1, G1, USD(10)),
1037 txflags(tfNoRippleDirect),
1042 env(pay(G1, A1, USD(10)),
1045 txflags(tfNoRippleDirect),
1049 env(trust(A2, limit, tfClearFreeze | tfClearDeepFreeze));
1054 env(offer_cancel(A1, env.seq(A1) - 1));
1055 env.require(offers(A1, 0));
1058 env(offer(A2, USD(100), XRP(100)), txflags(tfPassive));
1063 env(trust(G1, A2[
"USD"](0), tfSetFreeze));
1067 env(pay(A1, G1, XRP(10)), path(~XRP), sendmax(USD(11)), txflags(tfNoRippleDirect));
1071 env(pay(G1, A1, XRP(10)), path(~XRP), sendmax(USD(11)), txflags(tfNoRippleDirect));
1074 env(trust(G1, A2[
"USD"](0), tfClearFreeze));
1080 if (features[featureDeepFreeze])
1082 env(trust(G1, A2[
"USD"](0), tfSetFreeze | tfSetDeepFreeze));
1086 env(pay(A1, G1, XRP(10)),
1089 txflags(tfNoRippleDirect),
1094 env(pay(G1, A1, XRP(10)),
1097 txflags(tfNoRippleDirect),
1101 env(trust(G1, A2[
"USD"](0), tfClearFreeze | tfClearDeepFreeze));
1108 env(trust(A2, limit, tfSetFreeze));
1112 env(pay(A1, G1, XRP(10)), path(~XRP), sendmax(USD(11)), txflags(tfNoRippleDirect));
1116 env(pay(G1, A1, XRP(10)), path(~XRP), sendmax(USD(11)), txflags(tfNoRippleDirect));
1119 env(trust(A2, limit, tfClearFreeze));
1125 if (features[featureDeepFreeze])
1127 env(trust(A2, limit, tfSetFreeze | tfSetDeepFreeze));
1131 env(pay(A1, G1, XRP(10)),
1134 txflags(tfNoRippleDirect),
1139 env(pay(G1, A1, XRP(10)),
1142 txflags(tfNoRippleDirect),
1146 env(trust(A2, limit, tfClearFreeze | tfClearDeepFreeze));
1151 env(offer_cancel(A1, env.seq(A1) - 1));
1152 env.require(offers(A1, 0));
1159 testcase(
"Direct payments on frozen trust lines");
1161 using namespace test::jtx;
1162 Env env(*
this, features);
1164 Account
const G1{
"G1"};
1165 Account
const A1{
"A1"};
1166 Account
const A2{
"A2"};
1167 auto const USD{G1[
"USD"]};
1169 env.fund(XRP(10000), G1, A1, A2);
1172 auto const limit = USD(10000);
1173 env.trust(limit, A1, A2);
1176 env(pay(G1, A1, USD(1000)));
1177 env(pay(G1, A2, USD(1000)));
1182 env(pay(A1, G1, USD(1)));
1183 env(pay(A2, G1, USD(1)));
1187 env(pay(A1, A2, USD(1)));
1188 env(pay(A2, A1, USD(1)));
1192 env(trust(G1, A1[
"USD"](0), tfSetFreeze));
1196 env(pay(A1, G1, USD(1)));
1197 env(pay(G1, A1, USD(1)));
1204 env(pay(A2, A1, USD(1)));
1207 if (features[featureDeepFreeze])
1210 env(trust(G1, A1[
"USD"](0), tfSetDeepFreeze));
1214 env(pay(A1, G1, USD(1)));
1215 env(pay(G1, A1, USD(1)));
1225 env(trust(G1, A1[
"USD"](0), tfClearDeepFreeze));
1230 env(trust(G1, A1[
"USD"](0), tfClearFreeze));
1234 env(trust(A1, limit, tfSetFreeze));
1238 env(pay(A2, G1, USD(1)));
1239 env(pay(G1, A2, USD(1)));
1243 env(pay(A1, G1, USD(1)));
1246 env(pay(A1, A2, USD(1)));
1250 env(pay(G1, A1, USD(1)));
1254 if (features[featureDeepFreeze])
1257 env(trust(A1, limit, tfSetDeepFreeze));
1261 env(pay(A2, G1, USD(1)));
1262 env(pay(G1, A2, USD(1)));
1266 env(pay(A1, G1, USD(1)));
1270 env(pay(G1, A1, USD(1)));
1281 testcase(
"Checks on frozen trust lines");
1283 using namespace test::jtx;
1284 Env env(*
this, features);
1286 Account
const G1{
"G1"};
1287 Account
const A1{
"A1"};
1288 Account
const A2{
"A2"};
1289 auto const USD{G1[
"USD"]};
1291 env.fund(XRP(10000), G1, A1, A2);
1294 auto const limit = USD(10000);
1295 env.trust(limit, A1, A2);
1298 env(pay(G1, A1, USD(1000)));
1299 env(pay(G1, A2, USD(1000)));
1305 env(check::create(G1, A1, USD(10)));
1307 env(check::cash(A1, checkId, USD(10)));
1313 env(check::create(G1, A2, USD(10)));
1315 env(check::cash(A2, checkId, USD(10)));
1321 env(check::create(A1, G1, USD(10)));
1323 env(check::cash(G1, checkId, USD(10)));
1329 env(check::create(A1, A2, USD(10)));
1331 env(check::cash(A2, checkId, USD(10)));
1337 env(check::create(A2, G1, USD(10)));
1339 env(check::cash(G1, checkId, USD(10)));
1345 env(check::create(A2, A1, USD(10)));
1347 env(check::cash(A1, checkId, USD(10)));
1354 env(trust(G1, A1[
"USD"](0), tfSetFreeze));
1360 env(check::create(G1, A1, USD(10)));
1362 env(check::cash(A1, checkId, USD(10)), ter(
tecFROZEN));
1369 env(check::create(A2, A1, USD(10)));
1372 env(check::cash(A1, checkId, USD(10)), ter(
tecFROZEN));
1378 env(check::create(A1, G1, USD(10)), ter(
tecFROZEN));
1385 env(check::create(A1, A2, USD(10)), ter(
tecFROZEN));
1391 env(trust(G1, A1[
"USD"](0), tfClearFreeze));
1395 env(check::create(A1, G1, USD(10)));
1398 env(check::create(A1, A2, USD(10)));
1401 env(trust(G1, A1[
"USD"](0), tfSetFreeze));
1416 env(trust(G1, A1[
"USD"](0), tfClearFreeze));
1422 if (features[featureDeepFreeze])
1424 env(trust(G1, A1[
"USD"](0), tfSetFreeze | tfSetDeepFreeze));
1430 env(check::create(G1, A1, USD(10)));
1433 env(check::cash(A1, checkId, USD(10)), ter(
tecFROZEN));
1440 env(check::create(A2, A1, USD(10)));
1443 env(check::cash(A1, checkId, USD(10)), ter(
tecFROZEN));
1449 env(check::create(A1, G1, USD(10)), ter(
tecFROZEN));
1456 env(check::create(A1, A2, USD(10)), ter(
tecFROZEN));
1462 env(trust(G1, A1[
"USD"](0), tfClearFreeze | tfClearDeepFreeze));
1466 env(check::create(A1, G1, USD(10)));
1469 env(check::create(A1, A2, USD(10)));
1472 env(trust(G1, A1[
"USD"](0), tfSetFreeze | tfSetDeepFreeze));
1487 env(trust(G1, A1[
"USD"](0), tfClearFreeze | tfClearDeepFreeze));
1494 env(trust(A1, limit, tfSetFreeze));
1499 env(check::create(G1, A1, USD(10)), ter(
tecFROZEN));
1505 env(check::create(A2, A1, USD(10)), ter(
tecFROZEN));
1512 env(check::create(A1, G1, USD(10)));
1514 env(check::cash(G1, checkId, USD(10)));
1521 env(check::create(A1, A2, USD(10)));
1523 env(check::cash(A2, checkId, USD(10)));
1527 env(trust(A1, limit, tfClearFreeze));
1533 if (features[featureDeepFreeze])
1535 env(trust(A1, limit, tfSetFreeze | tfSetDeepFreeze));
1540 env(check::create(G1, A1, USD(10)), ter(
tecFROZEN));
1546 env(check::create(A2, A1, USD(10)), ter(
tecFROZEN));
1553 env(check::create(A1, G1, USD(10)));
1562 env(check::create(A1, A2, USD(10)));
1568 env(trust(A1, limit, tfClearFreeze | tfClearDeepFreeze));
1576 testcase(
"AMM payments on frozen trust lines");
1577 using namespace test::jtx;
1580 Env env(*
this, features);
1581 Account
const G1{
"G1"};
1582 Account
const A1{
"A1"};
1583 Account
const A2{
"A2"};
1584 auto const USD{G1[
"USD"]};
1586 env.fund(XRP(10000), G1, A1, A2);
1589 env.trust(G1[
"USD"](10000), A1, A2);
1592 env(pay(G1, A1, USD(1000)));
1593 env(pay(G1, A2, USD(1000)));
1596 AMM const ammG1(env, G1, XRP(1'000), USD(1'000));
1601 env(trust(G1, A1[
"USD"](0), tfSetFreeze));
1605 env(pay(A1, A2, USD(10)), path(~USD), sendmax(XRP(11)), txflags(tfNoRippleDirect));
1609 env(pay(A1, A2, XRP(10)),
1612 txflags(tfNoRippleDirect),
1617 env(pay(A2, A1, USD(10)), path(~USD), sendmax(XRP(11)), txflags(tfNoRippleDirect));
1621 env(pay(A2, A1, XRP(10)), path(~XRP), sendmax(USD(11)), txflags(tfNoRippleDirect));
1624 env(trust(G1, A1[
"USD"](0), tfClearFreeze));
1630 if (features[featureDeepFreeze])
1632 env(trust(G1, A1[
"USD"](0), tfSetFreeze | tfSetDeepFreeze));
1636 env(pay(A1, A2, USD(10)), path(~USD), sendmax(XRP(11)), txflags(tfNoRippleDirect));
1640 env(pay(A1, A2, XRP(10)),
1643 txflags(tfNoRippleDirect),
1648 env(pay(A2, A1, USD(10)),
1651 txflags(tfNoRippleDirect),
1656 env(pay(A2, A1, XRP(10)), path(~XRP), sendmax(USD(11)), txflags(tfNoRippleDirect));
1659 env(trust(G1, A1[
"USD"](0), tfClearFreeze | tfClearDeepFreeze));
1667 testcase(
"NFT offers on frozen trust lines");
1668 using namespace test::jtx;
1670 Env env(*
this, features);
1671 Account
const G1{
"G1"};
1672 Account
const A1{
"A1"};
1673 Account
const A2{
"A2"};
1674 auto const USD{G1[
"USD"]};
1676 env.fund(XRP(10000), G1, A1, A2);
1679 auto const limit = USD(10000);
1680 env.trust(limit, A1, A2);
1683 env(pay(G1, A1, USD(1000)));
1684 env(pay(G1, A2, USD(1000)));
1690 env(trust(G1, A2[
"USD"](0), tfSetFreeze));
1694 env(token::acceptSellOffer(A1, sellOfferIndex));
1697 env(trust(G1, A2[
"USD"](0), tfClearFreeze));
1702 if (features[featureDeepFreeze])
1706 env(trust(G1, A2[
"USD"](0), tfSetFreeze | tfSetDeepFreeze));
1710 env(token::acceptSellOffer(A1, sellOfferIndex), ter(
tecFROZEN));
1713 env(trust(G1, A2[
"USD"](0), tfClearFreeze | tfClearDeepFreeze));
1720 env(trust(G1, A2[
"USD"](0), tfSetFreeze));
1727 env(trust(G1, A2[
"USD"](0), tfClearFreeze));
1732 if (features[featureDeepFreeze])
1735 env(trust(G1, A2[
"USD"](0), tfSetFreeze | tfSetDeepFreeze));
1742 env(trust(G1, A2[
"USD"](0), tfClearFreeze | tfClearDeepFreeze));
1747 if (features[featureDeepFreeze] && features[fixEnforceNFTokenTrustlineV2])
1749 env(trust(G1, A2[
"USD"](0), tfSetFreeze | tfSetDeepFreeze));
1752 uint256 const nftID{token::getNextID(env, A2, 0u, tfTransferable)};
1753 env(token::mint(A2, 0), txflags(tfTransferable));
1757 env(token::createOffer(A1, nftID, USD(10)), token::owner(A2));
1760 env(token::acceptBuyOffer(A2, buyIdx), ter(
tecFROZEN));
1763 env(trust(G1, A2[
"USD"](0), tfClearFreeze | tfClearDeepFreeze));
1766 env(token::acceptBuyOffer(A2, buyIdx));
1773 env(trust(A2, limit, tfSetFreeze));
1777 env(token::acceptSellOffer(A1, sellOfferIndex));
1780 env(trust(A2, limit, tfClearFreeze));
1785 if (features[featureDeepFreeze])
1789 env(trust(A2, limit, tfSetFreeze | tfSetDeepFreeze));
1793 env(token::acceptSellOffer(A1, sellOfferIndex), ter(
tecFROZEN));
1796 env(trust(A2, limit, tfClearFreeze | tfClearDeepFreeze));
1803 env(trust(A2, limit, tfSetFreeze));
1807 env(token::acceptSellOffer(A2, sellOfferIndex));
1810 env(trust(A2, limit, tfClearFreeze));
1815 if (features[featureDeepFreeze])
1818 env(trust(A2, limit, tfSetFreeze | tfSetDeepFreeze));
1825 env(trust(A2, limit, tfClearFreeze | tfClearDeepFreeze));
1830 if (features[featureDeepFreeze] && features[fixEnforceNFTokenTrustlineV2])
1832 Account
const broker{
"broker"};
1833 env.fund(XRP(10000), broker);
1835 env(trust(G1, broker[
"USD"](1000), tfSetFreeze | tfSetDeepFreeze));
1838 uint256 const nftID{token::getNextID(env, A2, 0u, tfTransferable)};
1839 env(token::mint(A2, 0), txflags(tfTransferable));
1843 env(token::createOffer(A2, nftID, USD(10)), txflags(tfSellNFToken));
1846 env(token::createOffer(A1, nftID, USD(11)), token::owner(A2));
1849 env(token::brokerOffers(broker, buyIdx, sellIdx),
1850 token::brokerFee(USD(1)),
1856 if (features[featureDeepFreeze] && features[fixEnforceNFTokenTrustlineV2])
1858 Account
const minter{
"minter"};
1859 env.fund(XRP(10000), minter);
1861 env(trust(G1, minter[
"USD"](1000)));
1864 uint256 const nftID{token::getNextID(env, minter, 0u, tfTransferable, 1u)};
1865 env(token::mint(minter, 0), token::xferFee(1u), txflags(tfTransferable));
1869 env(token::createOffer(minter, nftID, drops(1)), txflags(tfSellNFToken));
1871 env(token::acceptSellOffer(A2, minterSellIdx));
1875 env(token::createOffer(A2, nftID, USD(100)), txflags(tfSellNFToken));
1877 env(trust(G1, minter[
"USD"](1000), tfSetFreeze | tfSetDeepFreeze));
1879 env(token::acceptSellOffer(A1, sellIdx), ter(
tecFROZEN));