47 Env env(*
this, features);
53 env.fund(XRP(1000), g1, alice, bob);
56 env.trust(g1[
"USD"](100), bob);
57 env.trust(g1[
"USD"](100), alice);
60 env(pay(g1, bob, g1[
"USD"](10)));
61 env(pay(g1, alice, g1[
"USD"](100)));
64 env(offer(alice, XRP(500), g1[
"USD"](100)));
68 auto lines = getAccountLines(env, bob);
69 if (!BEAST_EXPECT(checkArraySize(lines[jss::lines], 1u)))
71 BEAST_EXPECT(lines[jss::lines][0u][jss::account] == g1.human());
72 BEAST_EXPECT(lines[jss::lines][0u][jss::limit] ==
"100");
73 BEAST_EXPECT(lines[jss::lines][0u][jss::balance] ==
"10");
77 auto lines = getAccountLines(env, alice);
78 if (!BEAST_EXPECT(checkArraySize(lines[jss::lines], 1u)))
80 BEAST_EXPECT(lines[jss::lines][0u][jss::account] == g1.human());
81 BEAST_EXPECT(lines[jss::lines][0u][jss::limit] ==
"100");
82 BEAST_EXPECT(lines[jss::lines][0u][jss::balance] ==
"100");
88 env(pay(alice, bob, g1[
"USD"](1)));
91 env(pay(bob, alice, g1[
"USD"](1)));
98 env(trust(g1, bob[
"USD"](0), tfSetFreeze));
101 if (!BEAST_EXPECT(checkArraySize(affected, 2u)))
103 auto ff = affected[1u][sfModifiedNode.fieldName][sfFinalFields.fieldName];
105 ff[sfLowLimit.fieldName] ==
107 BEAST_EXPECT(ff[jss::Flags].asUInt() & lsfLowFreeze);
108 BEAST_EXPECT(!(ff[jss::Flags].asUInt() & lsfHighFreeze));
115 env(offer(bob, g1[
"USD"](5), XRP(25)));
118 if (!BEAST_EXPECT(checkArraySize(affected, 5u)))
120 auto ff = affected[3u][sfModifiedNode.fieldName][sfFinalFields.fieldName];
122 ff[sfHighLimit.fieldName] ==
126 BEAST_EXPECT(ff[sfBalance.fieldName] == amt);
135 env(pay(alice, bob, g1[
"USD"](1)));
138 env(pay(bob, alice, g1[
"USD"](1)), Ter(
tecPATH_DRY));
144 auto lines = getAccountLines(env, g1);
146 for (
auto const& it : lines[jss::lines])
148 if (it[jss::account] == bob.human())
154 if (!BEAST_EXPECT(bobLine))
156 BEAST_EXPECT(bobLine[jss::freeze] ==
true);
157 BEAST_EXPECT(bobLine[jss::balance] ==
"-16");
162 auto lines = getAccountLines(env, bob);
164 for (
auto const& it : lines[jss::lines])
166 if (it[jss::account] == g1.human())
172 if (!BEAST_EXPECT(g1Line))
174 BEAST_EXPECT(g1Line[jss::freeze_peer] ==
true);
175 BEAST_EXPECT(g1Line[jss::balance] ==
"16");
181 env(trust(g1, bob[
"USD"](0), tfClearFreeze));
184 if (!BEAST_EXPECT(checkArraySize(affected, 2u)))
186 auto ff = affected[1u][sfModifiedNode.fieldName][sfFinalFields.fieldName];
188 ff[sfLowLimit.fieldName] ==
190 BEAST_EXPECT(!(ff[jss::Flags].asUInt() & lsfLowFreeze));
191 BEAST_EXPECT(!(ff[jss::Flags].asUInt() & lsfHighFreeze));
382 Env env(*
this, features);
390 env.fund(XRP(12000), g1);
391 env.fund(XRP(1000), a1);
392 env.fund(XRP(20000), a2, a3, a4);
395 env.trust(g1[
"USD"](1200), a1);
396 env.trust(g1[
"USD"](200), a2);
397 env.trust(g1[
"BTC"](100), a3);
398 env.trust(g1[
"BTC"](100), a4);
401 env(pay(g1, a1, g1[
"USD"](1000)));
402 env(pay(g1, a2, g1[
"USD"](100)));
403 env(pay(g1, a3, g1[
"BTC"](100)));
404 env(pay(g1, a4, g1[
"BTC"](100)));
407 env(offer(g1, XRP(10000), g1[
"USD"](100)), Txflags(tfPassive));
408 env(offer(g1, g1[
"USD"](100), XRP(10000)), Txflags(tfPassive));
409 env(offer(a1, XRP(10000), g1[
"USD"](100)), Txflags(tfPassive));
410 env(offer(a2, g1[
"USD"](100), XRP(10000)), Txflags(tfPassive));
416 env.require(Nflags(g1, asfGlobalFreeze));
417 env(fset(g1, asfGlobalFreeze));
418 env.require(Flags(g1, asfGlobalFreeze));
419 env.require(Nflags(g1, asfNoFreeze));
422 env(fclear(g1, asfGlobalFreeze));
423 env.require(Nflags(g1, asfGlobalFreeze));
424 env.require(Nflags(g1, asfNoFreeze));
430 auto offers = env.rpc(
431 "book_offers",
std::string(
"USD/") + g1.human(),
"XRP")[jss::result][jss::offers];
432 if (!BEAST_EXPECT(checkArraySize(offers, 2u)))
435 for (
auto const& offer : offers)
437 accounts.
insert(offer[jss::Account].asString());
439 BEAST_EXPECT(accounts.
find(a2.human()) !=
std::end(accounts));
440 BEAST_EXPECT(accounts.
find(g1.human()) !=
std::end(accounts));
444 "book_offers",
"XRP",
std::string(
"USD/") + g1.human())[jss::result][jss::offers];
445 if (!BEAST_EXPECT(checkArraySize(offers, 2u)))
448 for (
auto const& offer : offers)
450 accounts.
insert(offer[jss::Account].asString());
452 BEAST_EXPECT(accounts.
find(a1.human()) !=
std::end(accounts));
453 BEAST_EXPECT(accounts.
find(g1.human()) !=
std::end(accounts));
459 env(offer(a3, g1[
"BTC"](1), XRP(1)));
462 env(offer(a4, XRP(1), g1[
"BTC"](1)));
465 env(pay(g1, a2, g1[
"USD"](1)));
468 env(pay(a2, g1, g1[
"USD"](1)));
471 env(pay(a2, a1, g1[
"USD"](1)));
474 env(pay(a1, a2, g1[
"USD"](1)));
481 env.require(Nflags(g1, asfGlobalFreeze));
482 env(fset(g1, asfGlobalFreeze));
483 env.require(Flags(g1, asfGlobalFreeze));
484 env.require(Nflags(g1, asfNoFreeze));
487 env(offer(a3, g1[
"BTC"](1), XRP(1)), Ter(
tecFROZEN));
490 env(offer(a4, XRP(1), g1[
"BTC"](1)), Ter(
tecFROZEN));
496 auto offers = getAccountOffers(env, g1)[jss::offers];
497 if (!BEAST_EXPECT(checkArraySize(offers, 2u)))
503 "book_offers",
"XRP",
std::string(
"USD/") + g1.human())[jss::result][jss::offers];
504 if (!BEAST_EXPECT(checkArraySize(offers, 2u)))
508 "book_offers",
std::string(
"USD/") + g1.human(),
"XRP")[jss::result][jss::offers];
509 if (!BEAST_EXPECT(checkArraySize(offers, 2u)))
516 env(pay(g1, a2, g1[
"USD"](1)));
519 env(pay(a2, g1, g1[
"USD"](1)));
532 Env env(*
this, features);
537 Account const deepFrozenAcc{
"A3"};
539 env.fund(XRP(12000), g1);
540 env.fund(XRP(1000), a1);
541 env.fund(XRP(1000), frozenAcc);
542 env.fund(XRP(1000), deepFrozenAcc);
545 env.trust(g1[
"USD"](1000), a1);
546 env.trust(g1[
"USD"](1000), frozenAcc);
547 env.trust(g1[
"USD"](1000), deepFrozenAcc);
550 env(pay(g1, a1, g1[
"USD"](1000)));
551 env(pay(g1, frozenAcc, g1[
"USD"](1000)));
552 env(pay(g1, deepFrozenAcc, g1[
"USD"](1000)));
556 env(trust(g1, frozenAcc[
"USD"](0), tfSetFreeze));
559 BEAST_EXPECT(flags & lsfLowFreeze);
560 BEAST_EXPECT(!(flags & lsfHighFreeze));
562 if (features[featureDeepFreeze])
564 env(trust(g1, deepFrozenAcc[
"USD"](0), tfSetFreeze | tfSetDeepFreeze));
567 BEAST_EXPECT(!(flags & (lsfLowFreeze | lsfLowDeepFreeze)));
568 BEAST_EXPECT(flags & lsfHighFreeze);
569 BEAST_EXPECT(flags & lsfHighDeepFreeze);
576 env.require(Nflags(g1, asfNoFreeze));
577 env(fset(g1, asfNoFreeze));
578 env.require(Flags(g1, asfNoFreeze));
579 env.require(Nflags(g1, asfGlobalFreeze));
582 env(fclear(g1, asfNoFreeze));
583 env.require(Flags(g1, asfNoFreeze));
584 env.require(Nflags(g1, asfGlobalFreeze));
587 env(fset(g1, asfGlobalFreeze));
588 env.require(Flags(g1, asfNoFreeze));
589 env.require(Flags(g1, asfGlobalFreeze));
592 env(fclear(g1, asfGlobalFreeze));
593 env.require(Flags(g1, asfNoFreeze));
594 env.require(Flags(g1, asfGlobalFreeze));
597 if (features[featureDeepFreeze])
603 env(trust(g1, frozenAcc[
"USD"](0), tfSetDeepFreeze), Ter(
tecNO_PERMISSION));
609 env(trust(g1, a1[
"USD"](0), tfSetFreeze));
612 if (!BEAST_EXPECT(checkArraySize(affected, 1u)))
615 auto let = affected[0u][sfModifiedNode.fieldName][sfLedgerEntryType.fieldName];
616 BEAST_EXPECT(let == jss::AccountRoot);
620 env(trust(g1, frozenAcc[
"USD"](0), tfClearFreeze));
623 BEAST_EXPECT(!(flags & lsfLowFreeze));
626 if (features[featureDeepFreeze])
629 env(trust(g1, deepFrozenAcc[
"USD"](0), tfClearDeepFreeze));
632 BEAST_EXPECT(flags & lsfHighFreeze);
633 BEAST_EXPECT(!(flags & lsfHighDeepFreeze));
641 testcase(
"Offers for Frozen Trust Lines");
644 Env env(*
this, features);
651 env.fund(XRP(1000), g1, a3, a4);
652 env.fund(XRP(2000), a2);
655 env.trust(g1[
"USD"](1000), a2);
656 env.trust(g1[
"USD"](2000), a3);
657 env.trust(g1[
"USD"](2000), a4);
660 env(pay(g1, a3, g1[
"USD"](2000)));
661 env(pay(g1, a4, g1[
"USD"](2000)));
664 env(offer(a3, XRP(1000), g1[
"USD"](1000)), Txflags(tfPassive));
669 env(pay(a2, g1, g1[
"USD"](1)), Paths(g1[
"USD"]), Sendmax(XRP(1)));
673 auto offers = getAccountOffers(env, a3)[jss::offers];
674 if (!BEAST_EXPECT(checkArraySize(offers, 1u)))
677 offers[0u][jss::taker_gets] ==
681 env(offer(a4, XRP(999), g1[
"USD"](999)));
685 env(trust(g1, a3[
"USD"](0), tfSetFreeze));
687 if (!BEAST_EXPECT(checkArraySize(affected, 2u)))
689 auto ff = affected[1u][sfModifiedNode.fieldName][sfFinalFields.fieldName];
692 BEAST_EXPECT(!(ff[jss::Flags].asUInt() & lsfLowFreeze));
693 BEAST_EXPECT(ff[jss::Flags].asUInt() & lsfHighFreeze);
697 offers = getAccountOffers(env, a3)[jss::offers];
698 if (!BEAST_EXPECT(checkArraySize(offers, 1u)))
702 env(pay(a2, g1, g1[
"USD"](1)), Paths(g1[
"USD"]), Sendmax(XRP(1)));
706 offers = getAccountOffers(env, a3)[jss::offers];
707 if (!BEAST_EXPECT(checkArraySize(offers, 0u)))
712 env(trust(g1, a4[
"USD"](0), tfSetFreeze));
714 if (!BEAST_EXPECT(checkArraySize(affected, 2u)))
716 ff = affected[0u][sfModifiedNode.fieldName][sfFinalFields.fieldName];
719 BEAST_EXPECT(ff[jss::Flags].asUInt() & lsfLowFreeze);
720 BEAST_EXPECT(!(ff[jss::Flags].asUInt() & lsfHighFreeze));
724 env(offer(a2, g1[
"USD"](999), XRP(999)));
726 if (!BEAST_EXPECT(checkArraySize(affected, 8u)))
728 auto created = affected[0u][sfCreatedNode.fieldName];
729 BEAST_EXPECT(created[sfNewFields.fieldName][jss::Account] == a2.human());
733 offers = getAccountOffers(env, a4)[jss::offers];
734 if (!BEAST_EXPECT(checkArraySize(offers, 0u)))
741 testcase(
"Offers on frozen trust lines");
744 Env env(*
this, features);
750 auto const usd{g1[
"USD"]};
752 env.fund(XRP(10000), g1, a1, a2, a3);
755 auto const limit = usd(10000);
756 env.trust(limit, a1, a2, a3);
759 env(pay(g1, a1, usd(1000)));
760 env(pay(g1, a2, usd(1000)));
765 env(offer(a2, XRP(100), usd(50)), Txflags(tfPassive));
769 env(offer(a3, usd(100), XRP(100)), Txflags(tfPassive));
771 env.require(offers(a2, 1), offers(a3, 1));
774 env(offer(a1, usd(1), XRP(2)), Txflags(tfFillOrKill));
776 env.require(Balance(a1, usd(1001)), Balance(a2, usd(999)));
779 env(offer(a1, XRP(1), usd(1)), Txflags(tfFillOrKill));
781 env.require(Balance(a1, usd(1000)), Balance(a3, usd(1)));
786 env(trust(g1, a1[
"USD"](0), tfSetFreeze));
790 env(offer(a1, usd(1), XRP(0.5)), Txflags(tfPassive));
792 env.require(Balance(a1, usd(1000)), offers(a1, 1));
794 env(offerCancel(a1, env.seq(a1) - 1));
795 env.require(offers(a1, 0));
799 env(offer(a1, usd(1), XRP(2)), Txflags(tfFillOrKill));
801 env.require(Balance(a1, usd(1001)), Balance(a2, usd(998)), offers(a1, 0));
806 env.require(Balance(a1, usd(1001)), offers(a1, 0));
811 env.require(Balance(a1, usd(1001)), offers(a1, 0));
813 env(trust(g1, a1[
"USD"](0), tfClearFreeze));
819 if (features[featureDeepFreeze])
821 env(trust(g1, a1[
"USD"](0), tfSetFreeze | tfSetDeepFreeze));
825 env(offer(a1, usd(1), XRP(0.5)), Txflags(tfPassive), Ter(
tecFROZEN));
829 env(offer(a1, usd(1), XRP(2)), Txflags(tfFillOrKill), Ter(
tecFROZEN));
840 env(trust(g1, a1[
"USD"](0), tfClearFreeze | tfClearDeepFreeze));
842 env.require(Balance(a1, usd(1001)), offers(a1, 0));
848 env.require(Balance(a1, usd(1001)));
849 env(offer(a1, XRP(1.9), usd(1)));
850 env(offer(a1, usd(1), XRP(1.1)));
852 env.require(Balance(a1, usd(1001)), offers(a1, 2));
854 env(trust(g1, a1[
"USD"](0), tfSetFreeze));
858 env.require(Balance(a1, usd(1001)), Balance(a2, usd(998)));
859 env(offer(a2, XRP(1.1), usd(1)), Txflags(tfFillOrKill));
861 env.require(Balance(a1, usd(1002)), Balance(a2, usd(997)), offers(a1, 1));
864 env.require(Balance(a1, usd(1002)), Balance(a3, usd(1)), offers(a1, 1));
865 env(offer(a3, usd(1), XRP(1.9)), Txflags(tfFillOrKill), Ter(
tecKILLED));
867 env.require(Balance(a1, usd(1002)), Balance(a3, usd(1)), offers(a1, 0));
869 env(trust(g1, a1[
"USD"](0), tfClearFreeze));
875 if (features[featureDeepFreeze])
877 env.require(Balance(a1, usd(1002)));
878 env(offer(a1, XRP(1.9), usd(1)));
879 env(offer(a1, usd(1), XRP(1.1)));
881 env.require(Balance(a1, usd(1002)), offers(a1, 2));
883 env(trust(g1, a1[
"USD"](0), tfSetFreeze | tfSetDeepFreeze));
887 env.require(Balance(a1, usd(1002)), Balance(a2, usd(997)));
888 env(offer(a2, XRP(1.1), usd(1)), Txflags(tfFillOrKill), Ter(
tecKILLED));
890 env.require(Balance(a1, usd(1002)), Balance(a2, usd(997)), offers(a1, 1));
893 env.require(Balance(a1, usd(1002)), Balance(a3, usd(1)), offers(a1, 1));
894 env(offer(a3, usd(1), XRP(1.9)), Txflags(tfFillOrKill), Ter(
tecKILLED));
896 env.require(Balance(a1, usd(1002)), Balance(a3, usd(1)), offers(a1, 0));
898 env(trust(g1, a1[
"USD"](0), tfClearFreeze | tfClearDeepFreeze));
905 env(trust(a1, limit, tfSetFreeze));
909 env(offer(a1, usd(1), XRP(0.5)), Txflags(tfPassive));
911 env.require(Balance(a1, usd(1002)), offers(a1, 1));
913 env(offerCancel(a1, env.seq(a1) - 1));
914 env.require(offers(a1, 0));
918 env(offer(a1, usd(1), XRP(2)), Txflags(tfFillOrKill), Ter(
tecKILLED));
920 env.require(Balance(a1, usd(1002)), Balance(a2, usd(997)), offers(a1, 0));
923 env(offer(a1, XRP(2), usd(1)), Txflags(tfPassive));
925 env.require(Balance(a1, usd(1002)), offers(a1, 1));
927 env(offerCancel(a1, env.seq(a1) - 1));
928 env.require(offers(a1, 0));
932 env(offer(a1, XRP(1), usd(1)), Txflags(tfFillOrKill));
934 env.require(Balance(a1, usd(1001)), offers(a1, 0));
936 env(trust(a1, limit, tfClearFreeze));
942 if (features[featureDeepFreeze])
944 env(trust(a1, limit, tfSetFreeze | tfSetDeepFreeze));
948 env(offer(a1, usd(1), XRP(0.5)), Txflags(tfPassive), Ter(
tecFROZEN));
952 env(offer(a1, usd(1), XRP(2)), Txflags(tfFillOrKill), Ter(
tecFROZEN));
963 env(trust(a1, limit, tfClearFreeze | tfClearDeepFreeze));
971 testcase(
"Longer paths payment on frozen trust lines");
974 Env env(*
this, features);
978 auto const usd{g1[
"USD"]};
980 env.fund(XRP(10000), g1, a1, a2);
983 auto const limit = usd(10000);
984 env.trust(limit, a1, a2);
987 env(pay(g1, a1, usd(1000)));
988 env(pay(g1, a2, usd(1000)));
991 env(offer(a2, XRP(100), usd(100)), Txflags(tfPassive));
996 env(trust(g1, a2[
"USD"](0), tfSetFreeze));
1000 env(pay(a1, g1, usd(10)),
1003 Txflags(tfNoRippleDirect),
1008 env(pay(g1, a1, usd(10)),
1011 Txflags(tfNoRippleDirect),
1015 env(trust(g1, a2[
"USD"](0), tfClearFreeze));
1020 if (features[featureDeepFreeze])
1022 env(trust(g1, a2[
"USD"](0), tfSetFreeze | tfSetDeepFreeze));
1026 env(pay(a1, g1, usd(10)),
1029 Txflags(tfNoRippleDirect),
1034 env(pay(g1, a1, usd(10)),
1037 Txflags(tfNoRippleDirect),
1041 env(trust(g1, a2[
"USD"](0), tfClearFreeze | tfClearDeepFreeze));
1048 env(trust(a2, limit, tfSetFreeze));
1052 env(pay(a1, g1, usd(10)), Path(~usd), Sendmax(XRP(11)), Txflags(tfNoRippleDirect));
1056 env(pay(g1, a1, usd(10)), Path(~usd), Sendmax(XRP(11)), Txflags(tfNoRippleDirect));
1059 env(trust(a2, limit, tfClearFreeze));
1065 if (features[featureDeepFreeze])
1067 env(trust(a2, limit, tfSetFreeze | tfSetDeepFreeze));
1071 env(pay(a1, g1, usd(10)),
1074 Txflags(tfNoRippleDirect),
1079 env(pay(g1, a1, usd(10)),
1082 Txflags(tfNoRippleDirect),
1086 env(trust(a2, limit, tfClearFreeze | tfClearDeepFreeze));
1091 env(offerCancel(a1, env.seq(a1) - 1));
1092 env.require(offers(a1, 0));
1095 env(offer(a2, usd(100), XRP(100)), Txflags(tfPassive));
1100 env(trust(g1, a2[
"USD"](0), tfSetFreeze));
1104 env(pay(a1, g1, XRP(10)), Path(~XRP), Sendmax(usd(11)), Txflags(tfNoRippleDirect));
1108 env(pay(g1, a1, XRP(10)), Path(~XRP), Sendmax(usd(11)), Txflags(tfNoRippleDirect));
1111 env(trust(g1, a2[
"USD"](0), tfClearFreeze));
1117 if (features[featureDeepFreeze])
1119 env(trust(g1, a2[
"USD"](0), tfSetFreeze | tfSetDeepFreeze));
1123 env(pay(a1, g1, XRP(10)),
1126 Txflags(tfNoRippleDirect),
1131 env(pay(g1, a1, XRP(10)),
1134 Txflags(tfNoRippleDirect),
1138 env(trust(g1, a2[
"USD"](0), tfClearFreeze | tfClearDeepFreeze));
1145 env(trust(a2, limit, tfSetFreeze));
1149 env(pay(a1, g1, XRP(10)), Path(~XRP), Sendmax(usd(11)), Txflags(tfNoRippleDirect));
1153 env(pay(g1, a1, XRP(10)), Path(~XRP), Sendmax(usd(11)), Txflags(tfNoRippleDirect));
1156 env(trust(a2, limit, tfClearFreeze));
1162 if (features[featureDeepFreeze])
1164 env(trust(a2, limit, tfSetFreeze | tfSetDeepFreeze));
1168 env(pay(a1, g1, XRP(10)),
1171 Txflags(tfNoRippleDirect),
1176 env(pay(g1, a1, XRP(10)),
1179 Txflags(tfNoRippleDirect),
1183 env(trust(a2, limit, tfClearFreeze | tfClearDeepFreeze));
1188 env(offerCancel(a1, env.seq(a1) - 1));
1189 env.require(offers(a1, 0));
1196 testcase(
"Direct payments on frozen trust lines");
1199 Env env(*
this, features);
1204 auto const usd{g1[
"USD"]};
1206 env.fund(XRP(10000), g1, a1, a2);
1209 auto const limit = usd(10000);
1210 env.trust(limit, a1, a2);
1213 env(pay(g1, a1, usd(1000)));
1214 env(pay(g1, a2, usd(1000)));
1219 env(pay(a1, g1, usd(1)));
1220 env(pay(a2, g1, usd(1)));
1224 env(pay(a1, a2, usd(1)));
1225 env(pay(a2, a1, usd(1)));
1229 env(trust(g1, a1[
"USD"](0), tfSetFreeze));
1233 env(pay(a1, g1, usd(1)));
1234 env(pay(g1, a1, usd(1)));
1241 env(pay(a2, a1, usd(1)));
1244 if (features[featureDeepFreeze])
1247 env(trust(g1, a1[
"USD"](0), tfSetDeepFreeze));
1251 env(pay(a1, g1, usd(1)));
1252 env(pay(g1, a1, usd(1)));
1262 env(trust(g1, a1[
"USD"](0), tfClearDeepFreeze));
1267 env(trust(g1, a1[
"USD"](0), tfClearFreeze));
1271 env(trust(a1, limit, tfSetFreeze));
1275 env(pay(a2, g1, usd(1)));
1276 env(pay(g1, a2, usd(1)));
1280 env(pay(a1, g1, usd(1)));
1283 env(pay(a1, a2, usd(1)));
1287 env(pay(g1, a1, usd(1)));
1291 if (features[featureDeepFreeze])
1294 env(trust(a1, limit, tfSetDeepFreeze));
1298 env(pay(a2, g1, usd(1)));
1299 env(pay(g1, a2, usd(1)));
1303 env(pay(a1, g1, usd(1)));
1307 env(pay(g1, a1, usd(1)));
1318 testcase(
"Checks on frozen trust lines");
1321 Env env(*
this, features);
1326 auto const usd{g1[
"USD"]};
1328 env.fund(XRP(10000), g1, a1, a2);
1331 auto const limit = usd(10000);
1332 env.trust(limit, a1, a2);
1335 env(pay(g1, a1, usd(1000)));
1336 env(pay(g1, a2, usd(1000)));
1342 env(check::create(g1, a1, usd(10)));
1344 env(check::cash(a1, checkId, usd(10)));
1350 env(check::create(g1, a2, usd(10)));
1352 env(check::cash(a2, checkId, usd(10)));
1358 env(check::create(a1, g1, usd(10)));
1360 env(check::cash(g1, checkId, usd(10)));
1366 env(check::create(a1, a2, usd(10)));
1368 env(check::cash(a2, checkId, usd(10)));
1374 env(check::create(a2, g1, usd(10)));
1376 env(check::cash(g1, checkId, usd(10)));
1382 env(check::create(a2, a1, usd(10)));
1384 env(check::cash(a1, checkId, usd(10)));
1391 env(trust(g1, a1[
"USD"](0), tfSetFreeze));
1397 env(check::create(g1, a1, usd(10)));
1399 env(check::cash(a1, checkId, usd(10)), Ter(
tecFROZEN));
1406 env(check::create(a2, a1, usd(10)));
1409 env(check::cash(a1, checkId, usd(10)), Ter(
tecFROZEN));
1415 env(check::create(a1, g1, usd(10)), Ter(
tecFROZEN));
1422 env(check::create(a1, a2, usd(10)), Ter(
tecFROZEN));
1428 env(trust(g1, a1[
"USD"](0), tfClearFreeze));
1432 env(check::create(a1, g1, usd(10)));
1435 env(check::create(a1, a2, usd(10)));
1438 env(trust(g1, a1[
"USD"](0), tfSetFreeze));
1453 env(trust(g1, a1[
"USD"](0), tfClearFreeze));
1459 if (features[featureDeepFreeze])
1461 env(trust(g1, a1[
"USD"](0), tfSetFreeze | tfSetDeepFreeze));
1467 env(check::create(g1, a1, usd(10)));
1470 env(check::cash(a1, checkId, usd(10)), Ter(
tecFROZEN));
1477 env(check::create(a2, a1, usd(10)));
1480 env(check::cash(a1, checkId, usd(10)), Ter(
tecFROZEN));
1486 env(check::create(a1, g1, usd(10)), Ter(
tecFROZEN));
1493 env(check::create(a1, a2, usd(10)), Ter(
tecFROZEN));
1499 env(trust(g1, a1[
"USD"](0), tfClearFreeze | tfClearDeepFreeze));
1503 env(check::create(a1, g1, usd(10)));
1506 env(check::create(a1, a2, usd(10)));
1509 env(trust(g1, a1[
"USD"](0), tfSetFreeze | tfSetDeepFreeze));
1524 env(trust(g1, a1[
"USD"](0), tfClearFreeze | tfClearDeepFreeze));
1531 env(trust(a1, limit, tfSetFreeze));
1536 env(check::create(g1, a1, usd(10)), Ter(
tecFROZEN));
1542 env(check::create(a2, a1, usd(10)), Ter(
tecFROZEN));
1549 env(check::create(a1, g1, usd(10)));
1551 env(check::cash(g1, checkId, usd(10)));
1558 env(check::create(a1, a2, usd(10)));
1560 env(check::cash(a2, checkId, usd(10)));
1564 env(trust(a1, limit, tfClearFreeze));
1570 if (features[featureDeepFreeze])
1572 env(trust(a1, limit, tfSetFreeze | tfSetDeepFreeze));
1577 env(check::create(g1, a1, usd(10)), Ter(
tecFROZEN));
1583 env(check::create(a2, a1, usd(10)), Ter(
tecFROZEN));
1590 env(check::create(a1, g1, usd(10)));
1599 env(check::create(a1, a2, usd(10)));
1605 env(trust(a1, limit, tfClearFreeze | tfClearDeepFreeze));
1613 testcase(
"AMM payments on frozen trust lines");
1616 Env env(*
this, features);
1620 auto const usd{g1[
"USD"]};
1622 env.fund(XRP(10000), g1, a1, a2);
1625 env.trust(g1[
"USD"](10000), a1, a2);
1628 env(pay(g1, a1, usd(1000)));
1629 env(pay(g1, a2, usd(1000)));
1632 AMM
const ammG1(env, g1, XRP(1'000), usd(1'000));
1637 env(trust(g1, a1[
"USD"](0), tfSetFreeze));
1641 env(pay(a1, a2, usd(10)), Path(~usd), Sendmax(XRP(11)), Txflags(tfNoRippleDirect));
1645 env(pay(a1, a2, XRP(10)),
1648 Txflags(tfNoRippleDirect),
1653 env(pay(a2, a1, usd(10)), Path(~usd), Sendmax(XRP(11)), Txflags(tfNoRippleDirect));
1657 env(pay(a2, a1, XRP(10)), Path(~XRP), Sendmax(usd(11)), Txflags(tfNoRippleDirect));
1660 env(trust(g1, a1[
"USD"](0), tfClearFreeze));
1666 if (features[featureDeepFreeze])
1668 env(trust(g1, a1[
"USD"](0), tfSetFreeze | tfSetDeepFreeze));
1672 env(pay(a1, a2, usd(10)), Path(~usd), Sendmax(XRP(11)), Txflags(tfNoRippleDirect));
1676 env(pay(a1, a2, XRP(10)),
1679 Txflags(tfNoRippleDirect),
1684 env(pay(a2, a1, usd(10)),
1687 Txflags(tfNoRippleDirect),
1692 env(pay(a2, a1, XRP(10)), Path(~XRP), Sendmax(usd(11)), Txflags(tfNoRippleDirect));
1695 env(trust(g1, a1[
"USD"](0), tfClearFreeze | tfClearDeepFreeze));
1703 testcase(
"NFT offers on frozen trust lines");
1706 Env env(*
this, features);
1710 auto const usd{g1[
"USD"]};
1712 env.fund(XRP(10000), g1, a1, a2);
1715 auto const limit = usd(10000);
1716 env.trust(limit, a1, a2);
1719 env(pay(g1, a1, usd(1000)));
1720 env(pay(g1, a2, usd(1000)));
1726 env(trust(g1, a2[
"USD"](0), tfSetFreeze));
1730 env(token::acceptSellOffer(a1, sellOfferIndex));
1733 env(trust(g1, a2[
"USD"](0), tfClearFreeze));
1738 if (features[featureDeepFreeze])
1742 env(trust(g1, a2[
"USD"](0), tfSetFreeze | tfSetDeepFreeze));
1746 env(token::acceptSellOffer(a1, sellOfferIndex), Ter(
tecFROZEN));
1749 env(trust(g1, a2[
"USD"](0), tfClearFreeze | tfClearDeepFreeze));
1756 env(trust(g1, a2[
"USD"](0), tfSetFreeze));
1763 env(trust(g1, a2[
"USD"](0), tfClearFreeze));
1768 if (features[featureDeepFreeze])
1771 env(trust(g1, a2[
"USD"](0), tfSetFreeze | tfSetDeepFreeze));
1778 env(trust(g1, a2[
"USD"](0), tfClearFreeze | tfClearDeepFreeze));
1783 if (features[featureDeepFreeze] && features[fixEnforceNFTokenTrustlineV2])
1785 env(trust(g1, a2[
"USD"](0), tfSetFreeze | tfSetDeepFreeze));
1788 uint256 const nftID{token::getNextID(env, a2, 0u, tfTransferable)};
1789 env(token::mint(a2, 0), Txflags(tfTransferable));
1793 env(token::createOffer(a1, nftID, usd(10)), token::Owner(a2));
1796 env(token::acceptBuyOffer(a2, buyIdx), Ter(
tecFROZEN));
1799 env(trust(g1, a2[
"USD"](0), tfClearFreeze | tfClearDeepFreeze));
1802 env(token::acceptBuyOffer(a2, buyIdx));
1809 env(trust(a2, limit, tfSetFreeze));
1813 env(token::acceptSellOffer(a1, sellOfferIndex));
1816 env(trust(a2, limit, tfClearFreeze));
1821 if (features[featureDeepFreeze])
1825 env(trust(a2, limit, tfSetFreeze | tfSetDeepFreeze));
1829 env(token::acceptSellOffer(a1, sellOfferIndex), Ter(
tecFROZEN));
1832 env(trust(a2, limit, tfClearFreeze | tfClearDeepFreeze));
1839 env(trust(a2, limit, tfSetFreeze));
1843 env(token::acceptSellOffer(a2, sellOfferIndex));
1846 env(trust(a2, limit, tfClearFreeze));
1851 if (features[featureDeepFreeze])
1854 env(trust(a2, limit, tfSetFreeze | tfSetDeepFreeze));
1861 env(trust(a2, limit, tfClearFreeze | tfClearDeepFreeze));
1866 if (features[featureDeepFreeze] && features[fixEnforceNFTokenTrustlineV2])
1868 Account const broker{
"broker"};
1869 env.fund(XRP(10000), broker);
1871 env(trust(g1, broker[
"USD"](1000), tfSetFreeze | tfSetDeepFreeze));
1874 uint256 const nftID{token::getNextID(env, a2, 0u, tfTransferable)};
1875 env(token::mint(a2, 0), Txflags(tfTransferable));
1880 env(token::createOffer(a2, nftID, usd(10)), Txflags(tfSellNFToken));
1883 env(token::createOffer(a1, nftID, usd(11)), token::Owner(a2));
1886 env(token::brokerOffers(broker, buyIdx, sellIdx),
1887 token::BrokerFee(usd(1)),
1893 if (features[featureDeepFreeze] && features[fixEnforceNFTokenTrustlineV2])
1895 Account const minter{
"minter"};
1896 env.fund(XRP(10000), minter);
1898 env(trust(g1, minter[
"USD"](1000)));
1901 uint256 const nftID{token::getNextID(env, minter, 0u, tfTransferable, 1u)};
1902 env(token::mint(minter, 0), token::XferFee(1u), Txflags(tfTransferable));
1907 env(token::createOffer(minter, nftID, drops(1)), Txflags(tfSellNFToken));
1909 env(token::acceptSellOffer(a2, minterSellIdx));
1914 env(token::createOffer(a2, nftID, usd(100)), Txflags(tfSellNFToken));
1916 env(trust(g1, minter[
"USD"](1000), tfSetFreeze | tfSetDeepFreeze));
1918 env(token::acceptSellOffer(a1, sellIdx), Ter(
tecFROZEN));