46 Env env(*
this, features);
52 env.fund(XRP(1000), g1, alice, bob);
55 env.trust(g1[
"USD"](100), bob);
56 env.trust(g1[
"USD"](100), alice);
59 env(pay(g1, bob, g1[
"USD"](10)));
60 env(pay(g1, alice, g1[
"USD"](100)));
63 env(offer(alice, XRP(500), g1[
"USD"](100)));
67 auto lines = getAccountLines(env, bob);
68 if (!BEAST_EXPECT(checkArraySize(lines[jss::lines], 1u)))
70 BEAST_EXPECT(lines[jss::lines][0u][jss::account] == g1.human());
71 BEAST_EXPECT(lines[jss::lines][0u][jss::limit] ==
"100");
72 BEAST_EXPECT(lines[jss::lines][0u][jss::balance] ==
"10");
76 auto lines = getAccountLines(env, alice);
77 if (!BEAST_EXPECT(checkArraySize(lines[jss::lines], 1u)))
79 BEAST_EXPECT(lines[jss::lines][0u][jss::account] == g1.human());
80 BEAST_EXPECT(lines[jss::lines][0u][jss::limit] ==
"100");
81 BEAST_EXPECT(lines[jss::lines][0u][jss::balance] ==
"100");
87 env(pay(alice, bob, g1[
"USD"](1)));
90 env(pay(bob, alice, g1[
"USD"](1)));
97 env(trust(g1, bob[
"USD"](0), tfSetFreeze));
100 if (!BEAST_EXPECT(checkArraySize(affected, 2u)))
102 auto ff = affected[1u][sfModifiedNode.fieldName][sfFinalFields.fieldName];
104 ff[sfLowLimit.fieldName] ==
106 BEAST_EXPECT(ff[jss::Flags].asUInt() & lsfLowFreeze);
107 BEAST_EXPECT(!(ff[jss::Flags].asUInt() & lsfHighFreeze));
114 env(offer(bob, g1[
"USD"](5), XRP(25)));
117 if (!BEAST_EXPECT(checkArraySize(affected, 5u)))
119 auto ff = affected[3u][sfModifiedNode.fieldName][sfFinalFields.fieldName];
121 ff[sfHighLimit.fieldName] ==
125 BEAST_EXPECT(ff[sfBalance.fieldName] == amt);
134 env(pay(alice, bob, g1[
"USD"](1)));
137 env(pay(bob, alice, g1[
"USD"](1)), Ter(
tecPATH_DRY));
143 auto lines = getAccountLines(env, g1);
145 for (
auto const& it : lines[jss::lines])
147 if (it[jss::account] == bob.human())
153 if (!BEAST_EXPECT(bobLine))
155 BEAST_EXPECT(bobLine[jss::freeze] ==
true);
156 BEAST_EXPECT(bobLine[jss::balance] ==
"-16");
161 auto lines = getAccountLines(env, bob);
163 for (
auto const& it : lines[jss::lines])
165 if (it[jss::account] == g1.human())
171 if (!BEAST_EXPECT(g1Line))
173 BEAST_EXPECT(g1Line[jss::freeze_peer] ==
true);
174 BEAST_EXPECT(g1Line[jss::balance] ==
"16");
180 env(trust(g1, bob[
"USD"](0), tfClearFreeze));
183 if (!BEAST_EXPECT(checkArraySize(affected, 2u)))
185 auto ff = affected[1u][sfModifiedNode.fieldName][sfFinalFields.fieldName];
187 ff[sfLowLimit.fieldName] ==
189 BEAST_EXPECT(!(ff[jss::Flags].asUInt() & lsfLowFreeze));
190 BEAST_EXPECT(!(ff[jss::Flags].asUInt() & lsfHighFreeze));
381 Env env(*
this, features);
389 env.fund(XRP(12000), g1);
390 env.fund(XRP(1000), a1);
391 env.fund(XRP(20000), a2, a3, a4);
394 env.trust(g1[
"USD"](1200), a1);
395 env.trust(g1[
"USD"](200), a2);
396 env.trust(g1[
"BTC"](100), a3);
397 env.trust(g1[
"BTC"](100), a4);
400 env(pay(g1, a1, g1[
"USD"](1000)));
401 env(pay(g1, a2, g1[
"USD"](100)));
402 env(pay(g1, a3, g1[
"BTC"](100)));
403 env(pay(g1, a4, g1[
"BTC"](100)));
406 env(offer(g1, XRP(10000), g1[
"USD"](100)), Txflags(tfPassive));
407 env(offer(g1, g1[
"USD"](100), XRP(10000)), Txflags(tfPassive));
408 env(offer(a1, XRP(10000), g1[
"USD"](100)), Txflags(tfPassive));
409 env(offer(a2, g1[
"USD"](100), XRP(10000)), Txflags(tfPassive));
415 env.require(Nflags(g1, asfGlobalFreeze));
416 env(fset(g1, asfGlobalFreeze));
417 env.require(Flags(g1, asfGlobalFreeze));
418 env.require(Nflags(g1, asfNoFreeze));
421 env(fclear(g1, asfGlobalFreeze));
422 env.require(Nflags(g1, asfGlobalFreeze));
423 env.require(Nflags(g1, asfNoFreeze));
429 auto offers = env.rpc(
430 "book_offers",
std::string(
"USD/") + g1.human(),
"XRP")[jss::result][jss::offers];
431 if (!BEAST_EXPECT(checkArraySize(offers, 2u)))
434 for (
auto const& offer : offers)
436 accounts.
insert(offer[jss::Account].asString());
438 BEAST_EXPECT(accounts.
find(a2.human()) !=
std::end(accounts));
439 BEAST_EXPECT(accounts.
find(g1.human()) !=
std::end(accounts));
443 "book_offers",
"XRP",
std::string(
"USD/") + g1.human())[jss::result][jss::offers];
444 if (!BEAST_EXPECT(checkArraySize(offers, 2u)))
447 for (
auto const& offer : offers)
449 accounts.
insert(offer[jss::Account].asString());
451 BEAST_EXPECT(accounts.
find(a1.human()) !=
std::end(accounts));
452 BEAST_EXPECT(accounts.
find(g1.human()) !=
std::end(accounts));
458 env(offer(a3, g1[
"BTC"](1), XRP(1)));
461 env(offer(a4, XRP(1), g1[
"BTC"](1)));
464 env(pay(g1, a2, g1[
"USD"](1)));
467 env(pay(a2, g1, g1[
"USD"](1)));
470 env(pay(a2, a1, g1[
"USD"](1)));
473 env(pay(a1, a2, g1[
"USD"](1)));
480 env.require(Nflags(g1, asfGlobalFreeze));
481 env(fset(g1, asfGlobalFreeze));
482 env.require(Flags(g1, asfGlobalFreeze));
483 env.require(Nflags(g1, asfNoFreeze));
486 env(offer(a3, g1[
"BTC"](1), XRP(1)), Ter(
tecFROZEN));
489 env(offer(a4, XRP(1), g1[
"BTC"](1)), Ter(
tecFROZEN));
495 auto offers = getAccountOffers(env, g1)[jss::offers];
496 if (!BEAST_EXPECT(checkArraySize(offers, 2u)))
502 "book_offers",
"XRP",
std::string(
"USD/") + g1.human())[jss::result][jss::offers];
503 if (!BEAST_EXPECT(checkArraySize(offers, 2u)))
507 "book_offers",
std::string(
"USD/") + g1.human(),
"XRP")[jss::result][jss::offers];
508 if (!BEAST_EXPECT(checkArraySize(offers, 2u)))
515 env(pay(g1, a2, g1[
"USD"](1)));
518 env(pay(a2, g1, g1[
"USD"](1)));
531 Env env(*
this, features);
536 Account const deepFrozenAcc{
"A3"};
538 env.fund(XRP(12000), g1);
539 env.fund(XRP(1000), a1);
540 env.fund(XRP(1000), frozenAcc);
541 env.fund(XRP(1000), deepFrozenAcc);
544 env.trust(g1[
"USD"](1000), a1);
545 env.trust(g1[
"USD"](1000), frozenAcc);
546 env.trust(g1[
"USD"](1000), deepFrozenAcc);
549 env(pay(g1, a1, g1[
"USD"](1000)));
550 env(pay(g1, frozenAcc, g1[
"USD"](1000)));
551 env(pay(g1, deepFrozenAcc, g1[
"USD"](1000)));
555 env(trust(g1, frozenAcc[
"USD"](0), tfSetFreeze));
558 BEAST_EXPECT(flags & lsfLowFreeze);
559 BEAST_EXPECT(!(flags & lsfHighFreeze));
561 if (features[featureDeepFreeze])
563 env(trust(g1, deepFrozenAcc[
"USD"](0), tfSetFreeze | tfSetDeepFreeze));
566 BEAST_EXPECT(!(flags & (lsfLowFreeze | lsfLowDeepFreeze)));
567 BEAST_EXPECT(flags & lsfHighFreeze);
568 BEAST_EXPECT(flags & lsfHighDeepFreeze);
575 env.require(Nflags(g1, asfNoFreeze));
576 env(fset(g1, asfNoFreeze));
577 env.require(Flags(g1, asfNoFreeze));
578 env.require(Nflags(g1, asfGlobalFreeze));
581 env(fclear(g1, asfNoFreeze));
582 env.require(Flags(g1, asfNoFreeze));
583 env.require(Nflags(g1, asfGlobalFreeze));
586 env(fset(g1, asfGlobalFreeze));
587 env.require(Flags(g1, asfNoFreeze));
588 env.require(Flags(g1, asfGlobalFreeze));
591 env(fclear(g1, asfGlobalFreeze));
592 env.require(Flags(g1, asfNoFreeze));
593 env.require(Flags(g1, asfGlobalFreeze));
596 if (features[featureDeepFreeze])
602 env(trust(g1, frozenAcc[
"USD"](0), tfSetDeepFreeze), Ter(
tecNO_PERMISSION));
608 env(trust(g1, a1[
"USD"](0), tfSetFreeze));
611 if (!BEAST_EXPECT(checkArraySize(affected, 1u)))
614 auto let = affected[0u][sfModifiedNode.fieldName][sfLedgerEntryType.fieldName];
615 BEAST_EXPECT(let == jss::AccountRoot);
619 env(trust(g1, frozenAcc[
"USD"](0), tfClearFreeze));
622 BEAST_EXPECT(!(flags & lsfLowFreeze));
625 if (features[featureDeepFreeze])
628 env(trust(g1, deepFrozenAcc[
"USD"](0), tfClearDeepFreeze));
631 BEAST_EXPECT(flags & lsfHighFreeze);
632 BEAST_EXPECT(!(flags & lsfHighDeepFreeze));
640 testcase(
"Offers for Frozen Trust Lines");
643 Env env(*
this, features);
650 env.fund(XRP(1000), g1, a3, a4);
651 env.fund(XRP(2000), a2);
654 env.trust(g1[
"USD"](1000), a2);
655 env.trust(g1[
"USD"](2000), a3);
656 env.trust(g1[
"USD"](2000), a4);
659 env(pay(g1, a3, g1[
"USD"](2000)));
660 env(pay(g1, a4, g1[
"USD"](2000)));
663 env(offer(a3, XRP(1000), g1[
"USD"](1000)), Txflags(tfPassive));
668 env(pay(a2, g1, g1[
"USD"](1)), Paths(g1[
"USD"]), Sendmax(XRP(1)));
672 auto offers = getAccountOffers(env, a3)[jss::offers];
673 if (!BEAST_EXPECT(checkArraySize(offers, 1u)))
676 offers[0u][jss::taker_gets] ==
680 env(offer(a4, XRP(999), g1[
"USD"](999)));
684 env(trust(g1, a3[
"USD"](0), tfSetFreeze));
686 if (!BEAST_EXPECT(checkArraySize(affected, 2u)))
688 auto ff = affected[1u][sfModifiedNode.fieldName][sfFinalFields.fieldName];
691 BEAST_EXPECT(!(ff[jss::Flags].asUInt() & lsfLowFreeze));
692 BEAST_EXPECT(ff[jss::Flags].asUInt() & lsfHighFreeze);
696 offers = getAccountOffers(env, a3)[jss::offers];
697 if (!BEAST_EXPECT(checkArraySize(offers, 1u)))
701 env(pay(a2, g1, g1[
"USD"](1)), Paths(g1[
"USD"]), Sendmax(XRP(1)));
705 offers = getAccountOffers(env, a3)[jss::offers];
706 if (!BEAST_EXPECT(checkArraySize(offers, 0u)))
711 env(trust(g1, a4[
"USD"](0), tfSetFreeze));
713 if (!BEAST_EXPECT(checkArraySize(affected, 2u)))
715 ff = affected[0u][sfModifiedNode.fieldName][sfFinalFields.fieldName];
718 BEAST_EXPECT(ff[jss::Flags].asUInt() & lsfLowFreeze);
719 BEAST_EXPECT(!(ff[jss::Flags].asUInt() & lsfHighFreeze));
723 env(offer(a2, g1[
"USD"](999), XRP(999)));
725 if (!BEAST_EXPECT(checkArraySize(affected, 8u)))
727 auto created = affected[0u][sfCreatedNode.fieldName];
728 BEAST_EXPECT(created[sfNewFields.fieldName][jss::Account] == a2.human());
732 offers = getAccountOffers(env, a4)[jss::offers];
733 if (!BEAST_EXPECT(checkArraySize(offers, 0u)))
740 testcase(
"Offers on frozen trust lines");
743 Env env(*
this, features);
749 auto const usd{g1[
"USD"]};
751 env.fund(XRP(10000), g1, a1, a2, a3);
754 auto const limit = usd(10000);
755 env.trust(limit, a1, a2, a3);
758 env(pay(g1, a1, usd(1000)));
759 env(pay(g1, a2, usd(1000)));
764 env(offer(a2, XRP(100), usd(50)), Txflags(tfPassive));
768 env(offer(a3, usd(100), XRP(100)), Txflags(tfPassive));
770 env.require(offers(a2, 1), offers(a3, 1));
773 env(offer(a1, usd(1), XRP(2)), Txflags(tfFillOrKill));
775 env.require(Balance(a1, usd(1001)), Balance(a2, usd(999)));
778 env(offer(a1, XRP(1), usd(1)), Txflags(tfFillOrKill));
780 env.require(Balance(a1, usd(1000)), Balance(a3, usd(1)));
785 env(trust(g1, a1[
"USD"](0), tfSetFreeze));
789 env(offer(a1, usd(1), XRP(0.5)), Txflags(tfPassive));
791 env.require(Balance(a1, usd(1000)), offers(a1, 1));
793 env(offerCancel(a1, env.seq(a1) - 1));
794 env.require(offers(a1, 0));
798 env(offer(a1, usd(1), XRP(2)), Txflags(tfFillOrKill));
800 env.require(Balance(a1, usd(1001)), Balance(a2, usd(998)), offers(a1, 0));
805 env.require(Balance(a1, usd(1001)), offers(a1, 0));
810 env.require(Balance(a1, usd(1001)), offers(a1, 0));
812 env(trust(g1, a1[
"USD"](0), tfClearFreeze));
818 if (features[featureDeepFreeze])
820 env(trust(g1, a1[
"USD"](0), tfSetFreeze | tfSetDeepFreeze));
824 env(offer(a1, usd(1), XRP(0.5)), Txflags(tfPassive), Ter(
tecFROZEN));
828 env(offer(a1, usd(1), XRP(2)), Txflags(tfFillOrKill), Ter(
tecFROZEN));
839 env(trust(g1, a1[
"USD"](0), tfClearFreeze | tfClearDeepFreeze));
841 env.require(Balance(a1, usd(1001)), offers(a1, 0));
847 env.require(Balance(a1, usd(1001)));
848 env(offer(a1, XRP(1.9), usd(1)));
849 env(offer(a1, usd(1), XRP(1.1)));
851 env.require(Balance(a1, usd(1001)), offers(a1, 2));
853 env(trust(g1, a1[
"USD"](0), tfSetFreeze));
857 env.require(Balance(a1, usd(1001)), Balance(a2, usd(998)));
858 env(offer(a2, XRP(1.1), usd(1)), Txflags(tfFillOrKill));
860 env.require(Balance(a1, usd(1002)), Balance(a2, usd(997)), offers(a1, 1));
863 env.require(Balance(a1, usd(1002)), Balance(a3, usd(1)), offers(a1, 1));
864 env(offer(a3, usd(1), XRP(1.9)), Txflags(tfFillOrKill), Ter(
tecKILLED));
866 env.require(Balance(a1, usd(1002)), Balance(a3, usd(1)), offers(a1, 0));
868 env(trust(g1, a1[
"USD"](0), tfClearFreeze));
874 if (features[featureDeepFreeze])
876 env.require(Balance(a1, usd(1002)));
877 env(offer(a1, XRP(1.9), usd(1)));
878 env(offer(a1, usd(1), XRP(1.1)));
880 env.require(Balance(a1, usd(1002)), offers(a1, 2));
882 env(trust(g1, a1[
"USD"](0), tfSetFreeze | tfSetDeepFreeze));
886 env.require(Balance(a1, usd(1002)), Balance(a2, usd(997)));
887 env(offer(a2, XRP(1.1), usd(1)), Txflags(tfFillOrKill), Ter(
tecKILLED));
889 env.require(Balance(a1, usd(1002)), Balance(a2, usd(997)), offers(a1, 1));
892 env.require(Balance(a1, usd(1002)), Balance(a3, usd(1)), offers(a1, 1));
893 env(offer(a3, usd(1), XRP(1.9)), Txflags(tfFillOrKill), Ter(
tecKILLED));
895 env.require(Balance(a1, usd(1002)), Balance(a3, usd(1)), offers(a1, 0));
897 env(trust(g1, a1[
"USD"](0), tfClearFreeze | tfClearDeepFreeze));
904 env(trust(a1, limit, tfSetFreeze));
908 env(offer(a1, usd(1), XRP(0.5)), Txflags(tfPassive));
910 env.require(Balance(a1, usd(1002)), offers(a1, 1));
912 env(offerCancel(a1, env.seq(a1) - 1));
913 env.require(offers(a1, 0));
917 env(offer(a1, usd(1), XRP(2)), Txflags(tfFillOrKill), Ter(
tecKILLED));
919 env.require(Balance(a1, usd(1002)), Balance(a2, usd(997)), offers(a1, 0));
922 env(offer(a1, XRP(2), usd(1)), Txflags(tfPassive));
924 env.require(Balance(a1, usd(1002)), offers(a1, 1));
926 env(offerCancel(a1, env.seq(a1) - 1));
927 env.require(offers(a1, 0));
931 env(offer(a1, XRP(1), usd(1)), Txflags(tfFillOrKill));
933 env.require(Balance(a1, usd(1001)), offers(a1, 0));
935 env(trust(a1, limit, tfClearFreeze));
941 if (features[featureDeepFreeze])
943 env(trust(a1, limit, tfSetFreeze | tfSetDeepFreeze));
947 env(offer(a1, usd(1), XRP(0.5)), Txflags(tfPassive), Ter(
tecFROZEN));
951 env(offer(a1, usd(1), XRP(2)), Txflags(tfFillOrKill), Ter(
tecFROZEN));
962 env(trust(a1, limit, tfClearFreeze | tfClearDeepFreeze));
970 testcase(
"Longer paths payment on frozen trust lines");
973 Env env(*
this, features);
977 auto const usd{g1[
"USD"]};
979 env.fund(XRP(10000), g1, a1, a2);
982 auto const limit = usd(10000);
983 env.trust(limit, a1, a2);
986 env(pay(g1, a1, usd(1000)));
987 env(pay(g1, a2, usd(1000)));
990 env(offer(a2, XRP(100), usd(100)), Txflags(tfPassive));
995 env(trust(g1, a2[
"USD"](0), tfSetFreeze));
999 env(pay(a1, g1, usd(10)),
1002 Txflags(tfNoRippleDirect),
1007 env(pay(g1, a1, usd(10)),
1010 Txflags(tfNoRippleDirect),
1014 env(trust(g1, a2[
"USD"](0), tfClearFreeze));
1019 if (features[featureDeepFreeze])
1021 env(trust(g1, a2[
"USD"](0), tfSetFreeze | tfSetDeepFreeze));
1025 env(pay(a1, g1, usd(10)),
1028 Txflags(tfNoRippleDirect),
1033 env(pay(g1, a1, usd(10)),
1036 Txflags(tfNoRippleDirect),
1040 env(trust(g1, a2[
"USD"](0), tfClearFreeze | tfClearDeepFreeze));
1047 env(trust(a2, limit, tfSetFreeze));
1051 env(pay(a1, g1, usd(10)), Path(~usd), Sendmax(XRP(11)), Txflags(tfNoRippleDirect));
1055 env(pay(g1, a1, usd(10)), Path(~usd), Sendmax(XRP(11)), Txflags(tfNoRippleDirect));
1058 env(trust(a2, limit, tfClearFreeze));
1064 if (features[featureDeepFreeze])
1066 env(trust(a2, limit, tfSetFreeze | tfSetDeepFreeze));
1070 env(pay(a1, g1, usd(10)),
1073 Txflags(tfNoRippleDirect),
1078 env(pay(g1, a1, usd(10)),
1081 Txflags(tfNoRippleDirect),
1085 env(trust(a2, limit, tfClearFreeze | tfClearDeepFreeze));
1090 env(offerCancel(a1, env.seq(a1) - 1));
1091 env.require(offers(a1, 0));
1094 env(offer(a2, usd(100), XRP(100)), Txflags(tfPassive));
1099 env(trust(g1, a2[
"USD"](0), tfSetFreeze));
1103 env(pay(a1, g1, XRP(10)), Path(~XRP), Sendmax(usd(11)), Txflags(tfNoRippleDirect));
1107 env(pay(g1, a1, XRP(10)), Path(~XRP), Sendmax(usd(11)), Txflags(tfNoRippleDirect));
1110 env(trust(g1, a2[
"USD"](0), tfClearFreeze));
1116 if (features[featureDeepFreeze])
1118 env(trust(g1, a2[
"USD"](0), tfSetFreeze | tfSetDeepFreeze));
1122 env(pay(a1, g1, XRP(10)),
1125 Txflags(tfNoRippleDirect),
1130 env(pay(g1, a1, XRP(10)),
1133 Txflags(tfNoRippleDirect),
1137 env(trust(g1, a2[
"USD"](0), tfClearFreeze | tfClearDeepFreeze));
1144 env(trust(a2, limit, tfSetFreeze));
1148 env(pay(a1, g1, XRP(10)), Path(~XRP), Sendmax(usd(11)), Txflags(tfNoRippleDirect));
1152 env(pay(g1, a1, XRP(10)), Path(~XRP), Sendmax(usd(11)), Txflags(tfNoRippleDirect));
1155 env(trust(a2, limit, tfClearFreeze));
1161 if (features[featureDeepFreeze])
1163 env(trust(a2, limit, tfSetFreeze | tfSetDeepFreeze));
1167 env(pay(a1, g1, XRP(10)),
1170 Txflags(tfNoRippleDirect),
1175 env(pay(g1, a1, XRP(10)),
1178 Txflags(tfNoRippleDirect),
1182 env(trust(a2, limit, tfClearFreeze | tfClearDeepFreeze));
1187 env(offerCancel(a1, env.seq(a1) - 1));
1188 env.require(offers(a1, 0));
1195 testcase(
"Direct payments on frozen trust lines");
1198 Env env(*
this, features);
1203 auto const usd{g1[
"USD"]};
1205 env.fund(XRP(10000), g1, a1, a2);
1208 auto const limit = usd(10000);
1209 env.trust(limit, a1, a2);
1212 env(pay(g1, a1, usd(1000)));
1213 env(pay(g1, a2, usd(1000)));
1218 env(pay(a1, g1, usd(1)));
1219 env(pay(a2, g1, usd(1)));
1223 env(pay(a1, a2, usd(1)));
1224 env(pay(a2, a1, usd(1)));
1228 env(trust(g1, a1[
"USD"](0), tfSetFreeze));
1232 env(pay(a1, g1, usd(1)));
1233 env(pay(g1, a1, usd(1)));
1240 env(pay(a2, a1, usd(1)));
1243 if (features[featureDeepFreeze])
1246 env(trust(g1, a1[
"USD"](0), tfSetDeepFreeze));
1250 env(pay(a1, g1, usd(1)));
1251 env(pay(g1, a1, usd(1)));
1261 env(trust(g1, a1[
"USD"](0), tfClearDeepFreeze));
1266 env(trust(g1, a1[
"USD"](0), tfClearFreeze));
1270 env(trust(a1, limit, tfSetFreeze));
1274 env(pay(a2, g1, usd(1)));
1275 env(pay(g1, a2, usd(1)));
1279 env(pay(a1, g1, usd(1)));
1282 env(pay(a1, a2, usd(1)));
1286 env(pay(g1, a1, usd(1)));
1290 if (features[featureDeepFreeze])
1293 env(trust(a1, limit, tfSetDeepFreeze));
1297 env(pay(a2, g1, usd(1)));
1298 env(pay(g1, a2, usd(1)));
1302 env(pay(a1, g1, usd(1)));
1306 env(pay(g1, a1, usd(1)));
1317 testcase(
"Checks on frozen trust lines");
1320 Env env(*
this, features);
1325 auto const usd{g1[
"USD"]};
1327 env.fund(XRP(10000), g1, a1, a2);
1330 auto const limit = usd(10000);
1331 env.trust(limit, a1, a2);
1334 env(pay(g1, a1, usd(1000)));
1335 env(pay(g1, a2, usd(1000)));
1341 env(check::create(g1, a1, usd(10)));
1343 env(check::cash(a1, checkId, usd(10)));
1349 env(check::create(g1, a2, usd(10)));
1351 env(check::cash(a2, checkId, usd(10)));
1357 env(check::create(a1, g1, usd(10)));
1359 env(check::cash(g1, checkId, usd(10)));
1365 env(check::create(a1, a2, usd(10)));
1367 env(check::cash(a2, checkId, usd(10)));
1373 env(check::create(a2, g1, usd(10)));
1375 env(check::cash(g1, checkId, usd(10)));
1381 env(check::create(a2, a1, usd(10)));
1383 env(check::cash(a1, checkId, usd(10)));
1390 env(trust(g1, a1[
"USD"](0), tfSetFreeze));
1396 env(check::create(g1, a1, usd(10)));
1398 env(check::cash(a1, checkId, usd(10)), Ter(
tecFROZEN));
1405 env(check::create(a2, a1, usd(10)));
1408 env(check::cash(a1, checkId, usd(10)), Ter(
tecFROZEN));
1414 env(check::create(a1, g1, usd(10)), Ter(
tecFROZEN));
1421 env(check::create(a1, a2, usd(10)), Ter(
tecFROZEN));
1427 env(trust(g1, a1[
"USD"](0), tfClearFreeze));
1431 env(check::create(a1, g1, usd(10)));
1434 env(check::create(a1, a2, usd(10)));
1437 env(trust(g1, a1[
"USD"](0), tfSetFreeze));
1452 env(trust(g1, a1[
"USD"](0), tfClearFreeze));
1458 if (features[featureDeepFreeze])
1460 env(trust(g1, a1[
"USD"](0), tfSetFreeze | tfSetDeepFreeze));
1466 env(check::create(g1, a1, usd(10)));
1469 env(check::cash(a1, checkId, usd(10)), Ter(
tecFROZEN));
1476 env(check::create(a2, a1, usd(10)));
1479 env(check::cash(a1, checkId, usd(10)), Ter(
tecFROZEN));
1485 env(check::create(a1, g1, usd(10)), Ter(
tecFROZEN));
1492 env(check::create(a1, a2, usd(10)), Ter(
tecFROZEN));
1498 env(trust(g1, a1[
"USD"](0), tfClearFreeze | tfClearDeepFreeze));
1502 env(check::create(a1, g1, usd(10)));
1505 env(check::create(a1, a2, usd(10)));
1508 env(trust(g1, a1[
"USD"](0), tfSetFreeze | tfSetDeepFreeze));
1523 env(trust(g1, a1[
"USD"](0), tfClearFreeze | tfClearDeepFreeze));
1530 env(trust(a1, limit, tfSetFreeze));
1535 env(check::create(g1, a1, usd(10)), Ter(
tecFROZEN));
1541 env(check::create(a2, a1, usd(10)), Ter(
tecFROZEN));
1548 env(check::create(a1, g1, usd(10)));
1550 env(check::cash(g1, checkId, usd(10)));
1557 env(check::create(a1, a2, usd(10)));
1559 env(check::cash(a2, checkId, usd(10)));
1563 env(trust(a1, limit, tfClearFreeze));
1569 if (features[featureDeepFreeze])
1571 env(trust(a1, limit, tfSetFreeze | tfSetDeepFreeze));
1576 env(check::create(g1, a1, usd(10)), Ter(
tecFROZEN));
1582 env(check::create(a2, a1, usd(10)), Ter(
tecFROZEN));
1589 env(check::create(a1, g1, usd(10)));
1598 env(check::create(a1, a2, usd(10)));
1604 env(trust(a1, limit, tfClearFreeze | tfClearDeepFreeze));
1612 testcase(
"AMM payments on frozen trust lines");
1615 Env env(*
this, features);
1619 auto const usd{g1[
"USD"]};
1621 env.fund(XRP(10000), g1, a1, a2);
1624 env.trust(g1[
"USD"](10000), a1, a2);
1627 env(pay(g1, a1, usd(1000)));
1628 env(pay(g1, a2, usd(1000)));
1631 AMM
const ammG1(env, g1, XRP(1'000), usd(1'000));
1636 env(trust(g1, a1[
"USD"](0), tfSetFreeze));
1640 env(pay(a1, a2, usd(10)), Path(~usd), Sendmax(XRP(11)), Txflags(tfNoRippleDirect));
1644 env(pay(a1, a2, XRP(10)),
1647 Txflags(tfNoRippleDirect),
1652 env(pay(a2, a1, usd(10)), Path(~usd), Sendmax(XRP(11)), Txflags(tfNoRippleDirect));
1656 env(pay(a2, a1, XRP(10)), Path(~XRP), Sendmax(usd(11)), Txflags(tfNoRippleDirect));
1659 env(trust(g1, a1[
"USD"](0), tfClearFreeze));
1665 if (features[featureDeepFreeze])
1667 env(trust(g1, a1[
"USD"](0), tfSetFreeze | tfSetDeepFreeze));
1671 env(pay(a1, a2, usd(10)), Path(~usd), Sendmax(XRP(11)), Txflags(tfNoRippleDirect));
1675 env(pay(a1, a2, XRP(10)),
1678 Txflags(tfNoRippleDirect),
1683 env(pay(a2, a1, usd(10)),
1686 Txflags(tfNoRippleDirect),
1691 env(pay(a2, a1, XRP(10)), Path(~XRP), Sendmax(usd(11)), Txflags(tfNoRippleDirect));
1694 env(trust(g1, a1[
"USD"](0), tfClearFreeze | tfClearDeepFreeze));
1702 testcase(
"NFT offers on frozen trust lines");
1705 Env env(*
this, features);
1709 auto const usd{g1[
"USD"]};
1711 env.fund(XRP(10000), g1, a1, a2);
1714 auto const limit = usd(10000);
1715 env.trust(limit, a1, a2);
1718 env(pay(g1, a1, usd(1000)));
1719 env(pay(g1, a2, usd(1000)));
1725 env(trust(g1, a2[
"USD"](0), tfSetFreeze));
1729 env(token::acceptSellOffer(a1, sellOfferIndex));
1732 env(trust(g1, a2[
"USD"](0), tfClearFreeze));
1737 if (features[featureDeepFreeze])
1741 env(trust(g1, a2[
"USD"](0), tfSetFreeze | tfSetDeepFreeze));
1745 env(token::acceptSellOffer(a1, sellOfferIndex), Ter(
tecFROZEN));
1748 env(trust(g1, a2[
"USD"](0), tfClearFreeze | tfClearDeepFreeze));
1755 env(trust(g1, a2[
"USD"](0), tfSetFreeze));
1762 env(trust(g1, a2[
"USD"](0), tfClearFreeze));
1767 if (features[featureDeepFreeze])
1770 env(trust(g1, a2[
"USD"](0), tfSetFreeze | tfSetDeepFreeze));
1777 env(trust(g1, a2[
"USD"](0), tfClearFreeze | tfClearDeepFreeze));
1782 if (features[featureDeepFreeze] && features[fixEnforceNFTokenTrustlineV2])
1784 env(trust(g1, a2[
"USD"](0), tfSetFreeze | tfSetDeepFreeze));
1787 uint256 const nftID{token::getNextID(env, a2, 0u, tfTransferable)};
1788 env(token::mint(a2, 0), Txflags(tfTransferable));
1792 env(token::createOffer(a1, nftID, usd(10)), token::Owner(a2));
1795 env(token::acceptBuyOffer(a2, buyIdx), Ter(
tecFROZEN));
1798 env(trust(g1, a2[
"USD"](0), tfClearFreeze | tfClearDeepFreeze));
1801 env(token::acceptBuyOffer(a2, buyIdx));
1808 env(trust(a2, limit, tfSetFreeze));
1812 env(token::acceptSellOffer(a1, sellOfferIndex));
1815 env(trust(a2, limit, tfClearFreeze));
1820 if (features[featureDeepFreeze])
1824 env(trust(a2, limit, tfSetFreeze | tfSetDeepFreeze));
1828 env(token::acceptSellOffer(a1, sellOfferIndex), Ter(
tecFROZEN));
1831 env(trust(a2, limit, tfClearFreeze | tfClearDeepFreeze));
1838 env(trust(a2, limit, tfSetFreeze));
1842 env(token::acceptSellOffer(a2, sellOfferIndex));
1845 env(trust(a2, limit, tfClearFreeze));
1850 if (features[featureDeepFreeze])
1853 env(trust(a2, limit, tfSetFreeze | tfSetDeepFreeze));
1860 env(trust(a2, limit, tfClearFreeze | tfClearDeepFreeze));
1865 if (features[featureDeepFreeze] && features[fixEnforceNFTokenTrustlineV2])
1867 Account const broker{
"broker"};
1868 env.fund(XRP(10000), broker);
1870 env(trust(g1, broker[
"USD"](1000), tfSetFreeze | tfSetDeepFreeze));
1873 uint256 const nftID{token::getNextID(env, a2, 0u, tfTransferable)};
1874 env(token::mint(a2, 0), Txflags(tfTransferable));
1878 env(token::createOffer(a2, nftID, usd(10)), Txflags(tfSellNFToken));
1881 env(token::createOffer(a1, nftID, usd(11)), token::Owner(a2));
1884 env(token::brokerOffers(broker, buyIdx, sellIdx),
1885 token::BrokerFee(usd(1)),
1891 if (features[featureDeepFreeze] && features[fixEnforceNFTokenTrustlineV2])
1893 Account const minter{
"minter"};
1894 env.fund(XRP(10000), minter);
1896 env(trust(g1, minter[
"USD"](1000)));
1899 uint256 const nftID{token::getNextID(env, minter, 0u, tfTransferable, 1u)};
1900 env(token::mint(minter, 0), token::XferFee(1u), Txflags(tfTransferable));
1904 env(token::createOffer(minter, nftID, drops(1)), Txflags(tfSellNFToken));
1906 env(token::acceptSellOffer(a2, minterSellIdx));
1910 env(token::createOffer(a2, nftID, usd(100)), Txflags(tfSellNFToken));
1912 env(trust(g1, minter[
"USD"](1000), tfSetFreeze | tfSetDeepFreeze));
1914 env(token::acceptSellOffer(a1, sellIdx), Ter(
tecFROZEN));