19 using namespace test::jtx;
20 Env env(*
this, features);
23 Account alice{
"alice"};
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)));
72 auto affected = env.meta()->getJson(
74 if (!BEAST_EXPECT(checkArraySize(affected, 2u)))
77 affected[1u][sfModifiedNode.fieldName][sfFinalFields.fieldName];
79 ff[sfLowLimit.fieldName] ==
89 env(offer(bob, G1[
"USD"](5), XRP(25)));
90 auto affected = env.meta()->getJson(
92 if (!BEAST_EXPECT(checkArraySize(affected, 5u)))
95 affected[3u][sfModifiedNode.fieldName][sfFinalFields.fieldName];
97 ff[sfHighLimit.fieldName] ==
102 BEAST_EXPECT(ff[sfBalance.fieldName] == amt);
111 env(pay(alice, bob, G1[
"USD"](1)));
114 env(pay(bob, alice, G1[
"USD"](1)), ter(
tecPATH_DRY));
120 auto lines = getAccountLines(env, G1);
122 for (
auto const& it : lines[jss::lines])
124 if (it[jss::account] == bob.human())
130 if (!BEAST_EXPECT(bobLine))
132 BEAST_EXPECT(bobLine[jss::freeze] ==
true);
133 BEAST_EXPECT(bobLine[jss::balance] ==
"-16");
138 auto lines = getAccountLines(env, bob);
140 for (
auto const& it : lines[jss::lines])
142 if (it[jss::account] == G1.human())
148 if (!BEAST_EXPECT(g1Line))
150 BEAST_EXPECT(g1Line[jss::freeze_peer] ==
true);
151 BEAST_EXPECT(g1Line[jss::balance] ==
"16");
158 auto affected = env.meta()->getJson(
160 if (!BEAST_EXPECT(checkArraySize(affected, 2u)))
163 affected[1u][sfModifiedNode.fieldName][sfFinalFields.fieldName];
165 ff[sfLowLimit.fieldName] ==
167 BEAST_EXPECT(!(ff[jss::Flags].asUInt() &
lsfLowFreeze));
365 using namespace test::jtx;
366 Env env(*
this, features);
374 env.fund(XRP(12000), G1);
375 env.fund(XRP(1000), A1);
376 env.fund(XRP(20000), A2, A3, A4);
379 env.trust(G1[
"USD"](1200), A1);
380 env.trust(G1[
"USD"](200), A2);
381 env.trust(G1[
"BTC"](100), A3);
382 env.trust(G1[
"BTC"](100), A4);
385 env(pay(G1, A1, G1[
"USD"](1000)));
386 env(pay(G1, A2, G1[
"USD"](100)));
387 env(pay(G1, A3, G1[
"BTC"](100)));
388 env(pay(G1, A4, G1[
"BTC"](100)));
391 env(offer(G1, XRP(10000), G1[
"USD"](100)), txflags(
tfPassive));
392 env(offer(G1, G1[
"USD"](100), XRP(10000)), txflags(
tfPassive));
393 env(offer(A1, XRP(10000), G1[
"USD"](100)), txflags(
tfPassive));
394 env(offer(A2, G1[
"USD"](100), XRP(10000)), txflags(
tfPassive));
414 auto offers = env.rpc(
417 "XRP")[jss::result][jss::offers];
418 if (!BEAST_EXPECT(checkArraySize(offers, 2u)))
421 for (
auto const& offer : offers)
423 accounts.
insert(offer[jss::Account].asString());
425 BEAST_EXPECT(accounts.
find(A2.human()) !=
std::end(accounts));
426 BEAST_EXPECT(accounts.
find(G1.human()) !=
std::end(accounts));
432 std::string(
"USD/") + G1.human())[jss::result][jss::offers];
433 if (!BEAST_EXPECT(checkArraySize(offers, 2u)))
436 for (
auto const& offer : offers)
438 accounts.
insert(offer[jss::Account].asString());
440 BEAST_EXPECT(accounts.
find(A1.human()) !=
std::end(accounts));
441 BEAST_EXPECT(accounts.
find(G1.human()) !=
std::end(accounts));
447 env(offer(A3, G1[
"BTC"](1), XRP(1)));
450 env(offer(A4, XRP(1), G1[
"BTC"](1)));
453 env(pay(G1, A2, G1[
"USD"](1)));
456 env(pay(A2, G1, G1[
"USD"](1)));
459 env(pay(A2, A1, G1[
"USD"](1)));
462 env(pay(A1, A2, G1[
"USD"](1)));
475 env(offer(A3, G1[
"BTC"](1), XRP(1)), ter(
tecFROZEN));
478 env(offer(A4, XRP(1), G1[
"BTC"](1)), ter(
tecFROZEN));
484 auto offers = getAccountOffers(env, G1)[jss::offers];
485 if (!BEAST_EXPECT(checkArraySize(offers, 2u)))
493 std::string(
"USD/") + G1.human())[jss::result][jss::offers];
494 if (!BEAST_EXPECT(checkArraySize(offers, 2u)))
500 "XRP")[jss::result][jss::offers];
501 if (!BEAST_EXPECT(checkArraySize(offers, 2u)))
508 env(pay(G1, A2, G1[
"USD"](1)));
511 env(pay(A2, G1, G1[
"USD"](1)));
636 testcase(
"Offers for Frozen Trust Lines");
638 using namespace test::jtx;
639 Env env(*
this, features);
646 env.fund(XRP(1000), G1, A3, A4);
647 env.fund(XRP(2000), A2);
650 env.trust(G1[
"USD"](1000), A2);
651 env.trust(G1[
"USD"](2000), A3);
652 env.trust(G1[
"USD"](2000), A4);
655 env(pay(G1, A3, G1[
"USD"](2000)));
656 env(pay(G1, A4, G1[
"USD"](2000)));
659 env(offer(A3, XRP(1000), G1[
"USD"](1000)), txflags(
tfPassive));
664 env(pay(A2, G1, G1[
"USD"](1)), paths(G1[
"USD"]), sendmax(XRP(1)));
668 auto offers = getAccountOffers(env, A3)[jss::offers];
669 if (!BEAST_EXPECT(checkArraySize(offers, 1u)))
672 offers[0u][jss::taker_gets] ==
676 env(offer(A4, XRP(999), G1[
"USD"](999)));
683 if (!BEAST_EXPECT(checkArraySize(affected, 2u)))
686 affected[1u][sfModifiedNode.fieldName][sfFinalFields.fieldName];
688 ff[sfHighLimit.fieldName] ==
690 BEAST_EXPECT(!(ff[jss::Flags].asUInt() &
lsfLowFreeze));
695 offers = getAccountOffers(env, A3)[jss::offers];
696 if (!BEAST_EXPECT(checkArraySize(offers, 1u)))
700 env(pay(A2, G1, G1[
"USD"](1)), paths(G1[
"USD"]), sendmax(XRP(1)));
704 offers = getAccountOffers(env, A3)[jss::offers];
705 if (!BEAST_EXPECT(checkArraySize(offers, 0u)))
713 if (!BEAST_EXPECT(checkArraySize(affected, 2u)))
715 ff = affected[0u][sfModifiedNode.fieldName][sfFinalFields.fieldName];
717 ff[sfLowLimit.fieldName] ==
724 env(offer(A2, G1[
"USD"](999), XRP(999)));
727 if (!BEAST_EXPECT(checkArraySize(affected, 8u)))
729 auto created = affected[0u][sfCreatedNode.fieldName];
731 created[sfNewFields.fieldName][jss::Account] == A2.human());
735 offers = getAccountOffers(env, A4)[jss::offers];
736 if (!BEAST_EXPECT(checkArraySize(offers, 0u)))
743 testcase(
"Offers on frozen trust lines");
745 using namespace test::jtx;
746 Env env(*
this, features);
752 auto const USD{G1[
"USD"]};
754 env.fund(XRP(10000), G1, A1, A2, A3);
757 auto const limit = USD(10000);
758 env.trust(limit, A1, A2, A3);
761 env(pay(G1, A1, USD(1000)));
762 env(pay(G1, A2, USD(1000)));
767 env(offer(A2, XRP(100), USD(50)), txflags(
tfPassive));
771 env(offer(A3, USD(100), XRP(100)), txflags(
tfPassive));
773 env.require(offers(A2, 1), offers(A3, 1));
778 env.require(balance(A1, USD(1001)), balance(A2, USD(999)));
783 env.require(balance(A1, USD(1000)), balance(A3, USD(1)));
792 env(offer(A1, USD(1), XRP(0.5)), txflags(
tfPassive));
794 env.require(balance(A1, USD(1000)), offers(A1, 1));
796 env(offer_cancel(A1, env.seq(A1) - 1));
797 env.require(offers(A1, 0));
804 balance(A1, USD(1001)), balance(A2, USD(998)), offers(A1, 0));
807 env(offer(A1, XRP(2), USD(1)),
811 env.require(balance(A1, USD(1001)), offers(A1, 0));
814 env(offer(A1, XRP(1), USD(1)),
818 env.require(balance(A1, USD(1001)), offers(A1, 0));
826 if (features[featureDeepFreeze])
832 env(offer(A1, USD(1), XRP(0.5)),
838 env(offer(A1, USD(1), XRP(2)),
844 env(offer(A1, XRP(2), USD(1)),
850 env(offer(A1, XRP(1), USD(1)),
857 env.require(balance(A1, USD(1001)), offers(A1, 0));
863 env.require(balance(A1, USD(1001)));
864 env(offer(A1, XRP(1.9), USD(1)));
865 env(offer(A1, USD(1), XRP(1.1)));
867 env.require(balance(A1, USD(1001)), offers(A1, 2));
873 env.require(balance(A1, USD(1001)), balance(A2, USD(998)));
874 env(offer(A2, XRP(1.1), USD(1)), txflags(
tfFillOrKill));
877 balance(A1, USD(1002)), balance(A2, USD(997)), offers(A1, 1));
881 balance(A1, USD(1002)), balance(A3, USD(1)), offers(A1, 1));
882 env(offer(A3, USD(1), XRP(1.9)),
887 balance(A1, USD(1002)), balance(A3, USD(1)), offers(A1, 0));
895 if (features[featureDeepFreeze])
897 env.require(balance(A1, USD(1002)));
898 env(offer(A1, XRP(1.9), USD(1)));
899 env(offer(A1, USD(1), XRP(1.1)));
901 env.require(balance(A1, USD(1002)), offers(A1, 2));
907 env.require(balance(A1, USD(1002)), balance(A2, USD(997)));
908 env(offer(A2, XRP(1.1), USD(1)),
913 balance(A1, USD(1002)), balance(A2, USD(997)), offers(A1, 1));
917 balance(A1, USD(1002)), balance(A3, USD(1)), offers(A1, 1));
918 env(offer(A3, USD(1), XRP(1.9)),
923 balance(A1, USD(1002)), balance(A3, USD(1)), offers(A1, 0));
936 env(offer(A1, USD(1), XRP(0.5)), txflags(
tfPassive));
938 env.require(balance(A1, USD(1002)), offers(A1, 1));
940 env(offer_cancel(A1, env.seq(A1) - 1));
941 env.require(offers(A1, 0));
945 env(offer(A1, USD(1), XRP(2)),
950 balance(A1, USD(1002)), balance(A2, USD(997)), offers(A1, 0));
953 env(offer(A1, XRP(2), USD(1)), txflags(
tfPassive));
955 env.require(balance(A1, USD(1002)), offers(A1, 1));
957 env(offer_cancel(A1, env.seq(A1) - 1));
958 env.require(offers(A1, 0));
964 env.require(balance(A1, USD(1001)), offers(A1, 0));
972 if (features[featureDeepFreeze])
978 env(offer(A1, USD(1), XRP(0.5)),
984 env(offer(A1, USD(1), XRP(2)),
990 env(offer(A1, XRP(2), USD(1)),
996 env(offer(A1, XRP(1), USD(1)),
1009 testcase(
"Longer paths payment on frozen trust lines");
1010 using namespace test::jtx;
1013 Env env(*
this, features);
1017 auto const USD{G1[
"USD"]};
1019 env.fund(XRP(10000), G1, A1, A2);
1022 auto const limit = USD(10000);
1023 env.trust(limit, A1, A2);
1026 env(pay(G1, A1, USD(1000)));
1027 env(pay(G1, A2, USD(1000)));
1030 env(offer(A2, XRP(100), USD(100)), txflags(
tfPassive));
1039 env(pay(A1, G1, USD(10)),
1047 env(pay(G1, A1, USD(10)),
1059 if (features[featureDeepFreeze])
1065 env(pay(A1, G1, USD(10)),
1073 env(pay(G1, A1, USD(10)),
1091 env(pay(A1, G1, USD(10)),
1098 env(pay(G1, A1, USD(10)),
1110 if (features[featureDeepFreeze])
1116 env(pay(A1, G1, USD(10)),
1124 env(pay(G1, A1, USD(10)),
1136 env(offer_cancel(A1, env.seq(A1) - 1));
1137 env.require(offers(A1, 0));
1140 env(offer(A2, USD(100), XRP(100)), txflags(
tfPassive));
1149 env(pay(A1, G1, XRP(10)),
1156 env(pay(G1, A1, XRP(10)),
1168 if (features[featureDeepFreeze])
1174 env(pay(A1, G1, XRP(10)),
1182 env(pay(G1, A1, XRP(10)),
1200 env(pay(A1, G1, XRP(10)),
1207 env(pay(G1, A1, XRP(10)),
1219 if (features[featureDeepFreeze])
1225 env(pay(A1, G1, XRP(10)),
1233 env(pay(G1, A1, XRP(10)),
1245 env(offer_cancel(A1, env.seq(A1) - 1));
1246 env.require(offers(A1, 0));
1253 testcase(
"Direct payments on frozen trust lines");
1255 using namespace test::jtx;
1256 Env env(*
this, features);
1261 auto const USD{G1[
"USD"]};
1263 env.fund(XRP(10000), G1, A1, A2);
1266 auto const limit = USD(10000);
1267 env.trust(limit, A1, A2);
1270 env(pay(G1, A1, USD(1000)));
1271 env(pay(G1, A2, USD(1000)));
1276 env(pay(A1, G1, USD(1)));
1277 env(pay(A2, G1, USD(1)));
1281 env(pay(A1, A2, USD(1)));
1282 env(pay(A2, A1, USD(1)));
1290 env(pay(A1, G1, USD(1)));
1291 env(pay(G1, A1, USD(1)));
1298 env(pay(A2, A1, USD(1)));
1301 if (features[featureDeepFreeze])
1308 env(pay(A1, G1, USD(1)));
1309 env(pay(G1, A1, USD(1)));
1332 env(pay(A2, G1, USD(1)));
1333 env(pay(G1, A2, USD(1)));
1337 env(pay(A1, G1, USD(1)));
1340 env(pay(A1, A2, USD(1)));
1344 env(pay(G1, A1, USD(1)));
1348 if (features[featureDeepFreeze])
1355 env(pay(A2, G1, USD(1)));
1356 env(pay(G1, A2, USD(1)));
1360 env(pay(A1, G1, USD(1)));
1364 env(pay(G1, A1, USD(1)));
1375 testcase(
"Checks on frozen trust lines");
1377 using namespace test::jtx;
1378 Env env(*
this, features);
1383 auto const USD{G1[
"USD"]};
1385 env.fund(XRP(10000), G1, A1, A2);
1388 auto const limit = USD(10000);
1389 env.trust(limit, A1, A2);
1392 env(pay(G1, A1, USD(1000)));
1393 env(pay(G1, A2, USD(1000)));
1399 env(check::create(G1, A1, USD(10)));
1401 env(check::cash(A1, checkId, USD(10)));
1407 env(check::create(G1, A2, USD(10)));
1409 env(check::cash(A2, checkId, USD(10)));
1415 env(check::create(A1, G1, USD(10)));
1417 env(check::cash(G1, checkId, USD(10)));
1423 env(check::create(A1, A2, USD(10)));
1425 env(check::cash(A2, checkId, USD(10)));
1431 env(check::create(A2, G1, USD(10)));
1433 env(check::cash(G1, checkId, USD(10)));
1439 env(check::create(A2, A1, USD(10)));
1441 env(check::cash(A1, checkId, USD(10)));
1454 env(check::create(G1, A1, USD(10)));
1456 env(check::cash(A1, checkId, USD(10)), ter(
tecFROZEN));
1463 env(check::create(A2, A1, USD(10)));
1466 env(check::cash(A1, checkId, USD(10)), ter(
tecFROZEN));
1472 env(check::create(A1, G1, USD(10)), ter(
tecFROZEN));
1479 env(check::create(A1, A2, USD(10)), ter(
tecFROZEN));
1489 env(check::create(A1, G1, USD(10)));
1492 env(check::create(A1, A2, USD(10)));
1516 if (features[featureDeepFreeze])
1524 env(check::create(G1, A1, USD(10)));
1527 env(check::cash(A1, checkId, USD(10)), ter(
tecFROZEN));
1534 env(check::create(A2, A1, USD(10)));
1537 env(check::cash(A1, checkId, USD(10)), ter(
tecFROZEN));
1543 env(check::create(A1, G1, USD(10)), ter(
tecFROZEN));
1550 env(check::create(A1, A2, USD(10)), ter(
tecFROZEN));
1560 env(check::create(A1, G1, USD(10)));
1563 env(check::create(A1, A2, USD(10)));
1593 env(check::create(G1, A1, USD(10)), ter(
tecFROZEN));
1599 env(check::create(A2, A1, USD(10)), ter(
tecFROZEN));
1606 env(check::create(A1, G1, USD(10)));
1608 env(check::cash(G1, checkId, USD(10)));
1615 env(check::create(A1, A2, USD(10)));
1617 env(check::cash(A2, checkId, USD(10)));
1627 if (features[featureDeepFreeze])
1634 env(check::create(G1, A1, USD(10)), ter(
tecFROZEN));
1640 env(check::create(A2, A1, USD(10)), ter(
tecFROZEN));
1647 env(check::create(A1, G1, USD(10)));
1656 env(check::create(A1, A2, USD(10)));
1670 testcase(
"AMM payments on frozen trust lines");
1671 using namespace test::jtx;
1674 Env env(*
this, features);
1678 auto const USD{G1[
"USD"]};
1680 env.fund(XRP(10000), G1, A1, A2);
1683 env.trust(G1[
"USD"](10000), A1, A2);
1686 env(pay(G1, A1, USD(1000)));
1687 env(pay(G1, A2, USD(1000)));
1690 AMM ammG1(env, G1, XRP(1'000), USD(1'000));
1699 env(pay(A1, A2, USD(10)),
1706 env(pay(A1, A2, XRP(10)),
1714 env(pay(A2, A1, USD(10)),
1721 env(pay(A2, A1, XRP(10)),
1733 if (features[featureDeepFreeze])
1739 env(pay(A1, A2, USD(10)),
1746 env(pay(A1, A2, XRP(10)),
1754 env(pay(A2, A1, USD(10)),
1762 env(pay(A2, A1, XRP(10)),
1776 testcase(
"NFT offers on frozen trust lines");
1777 using namespace test::jtx;
1779 Env env(*
this, features);
1783 auto const USD{G1[
"USD"]};
1785 env.fund(XRP(10000), G1, A1, A2);
1788 auto const limit = USD(10000);
1789 env.trust(limit, A1, A2);
1792 env(pay(G1, A1, USD(1000)));
1793 env(pay(G1, A2, USD(1000)));
1803 env(token::acceptSellOffer(A1, sellOfferIndex));
1811 if (features[featureDeepFreeze])
1819 env(token::acceptSellOffer(A1, sellOfferIndex), ter(
tecFROZEN));
1833 env(token::acceptSellOffer(A2, sellOfferIndex),
1842 if (features[featureDeepFreeze])
1849 env(token::acceptSellOffer(A2, sellOfferIndex),
1858 if (features[featureDeepFreeze] &&
1859 features[fixEnforceNFTokenTrustlineV2])
1869 env(token::createOffer(A1, nftID, USD(10)), token::owner(A2));
1872 env(token::acceptBuyOffer(A2, buyIdx), ter(
tecFROZEN));
1878 env(token::acceptBuyOffer(A2, buyIdx));
1889 env(token::acceptSellOffer(A1, sellOfferIndex));
1897 if (features[featureDeepFreeze])
1905 env(token::acceptSellOffer(A1, sellOfferIndex), ter(
tecFROZEN));
1919 env(token::acceptSellOffer(A2, sellOfferIndex));
1927 if (features[featureDeepFreeze])
1934 env(token::acceptSellOffer(A2, sellOfferIndex),
1943 if (features[featureDeepFreeze] &&
1944 features[fixEnforceNFTokenTrustlineV2])
1946 Account broker{
"broker"};
1947 env.fund(XRP(10000), broker);
1957 env(token::createOffer(A2, nftID, USD(10)), txflags(
tfSellNFToken));
1960 env(token::createOffer(A1, nftID, USD(11)), token::owner(A2));
1963 env(token::brokerOffers(broker, buyIdx, sellIdx),
1964 token::brokerFee(USD(1)),
1970 if (features[featureDeepFreeze] &&
1971 features[fixEnforceNFTokenTrustlineV2])
1973 Account minter{
"minter"};
1974 env.fund(XRP(10000), minter);
1976 env(trust(G1, minter[
"USD"](1000)));
1981 env(token::mint(minter, 0),
1988 env(token::createOffer(minter, nftID, drops(1)),
1991 env(token::acceptSellOffer(A2, minterSellIdx));
1995 env(token::createOffer(A2, nftID, USD(100)),
2000 env(token::acceptSellOffer(A1, sellIdx), ter(
tecFROZEN));