21#include <test/jtx/AMM.h>
23#include <xrpl/protocol/AccountID.h>
24#include <xrpl/protocol/Feature.h>
25#include <xrpl/protocol/SField.h>
26#include <xrpl/protocol/TxFlags.h>
27#include <xrpl/protocol/jss.h>
38 using namespace test::jtx;
39 Env env(*
this, features);
42 Account alice{
"alice"};
45 env.fund(XRP(1000), G1, alice, bob);
48 env.trust(G1[
"USD"](100), bob);
49 env.trust(G1[
"USD"](100), alice);
52 env(pay(G1, bob, G1[
"USD"](10)));
53 env(pay(G1, alice, G1[
"USD"](100)));
56 env(offer(alice, XRP(500), G1[
"USD"](100)));
60 auto lines = getAccountLines(env, bob);
61 if (!BEAST_EXPECT(checkArraySize(lines[jss::lines], 1u)))
63 BEAST_EXPECT(lines[jss::lines][0u][jss::account] == G1.human());
64 BEAST_EXPECT(lines[jss::lines][0u][jss::limit] ==
"100");
65 BEAST_EXPECT(lines[jss::lines][0u][jss::balance] ==
"10");
69 auto lines = getAccountLines(env, alice);
70 if (!BEAST_EXPECT(checkArraySize(lines[jss::lines], 1u)))
72 BEAST_EXPECT(lines[jss::lines][0u][jss::account] == G1.human());
73 BEAST_EXPECT(lines[jss::lines][0u][jss::limit] ==
"100");
74 BEAST_EXPECT(lines[jss::lines][0u][jss::balance] ==
"100");
80 env(pay(alice, bob, G1[
"USD"](1)));
83 env(pay(bob, alice, G1[
"USD"](1)));
91 auto affected = env.meta()->getJson(
93 if (!BEAST_EXPECT(checkArraySize(affected, 2u)))
96 affected[1u][sfModifiedNode.fieldName][sfFinalFields.fieldName];
98 ff[sfLowLimit.fieldName] ==
108 env(offer(bob, G1[
"USD"](5), XRP(25)));
109 auto affected = env.meta()->getJson(
111 if (!BEAST_EXPECT(checkArraySize(affected, 5u)))
114 affected[3u][sfModifiedNode.fieldName][sfFinalFields.fieldName];
116 ff[sfHighLimit.fieldName] ==
121 BEAST_EXPECT(ff[sfBalance.fieldName] == amt);
130 env(pay(alice, bob, G1[
"USD"](1)));
133 env(pay(bob, alice, G1[
"USD"](1)), ter(
tecPATH_DRY));
139 auto lines = getAccountLines(env, G1);
141 for (
auto const& it : lines[jss::lines])
143 if (it[jss::account] == bob.human())
149 if (!BEAST_EXPECT(bobLine))
151 BEAST_EXPECT(bobLine[jss::freeze] ==
true);
152 BEAST_EXPECT(bobLine[jss::balance] ==
"-16");
157 auto lines = getAccountLines(env, bob);
159 for (
auto const& it : lines[jss::lines])
161 if (it[jss::account] == G1.human())
167 if (!BEAST_EXPECT(g1Line))
169 BEAST_EXPECT(g1Line[jss::freeze_peer] ==
true);
170 BEAST_EXPECT(g1Line[jss::balance] ==
"16");
177 auto affected = env.meta()->getJson(
179 if (!BEAST_EXPECT(checkArraySize(affected, 2u)))
182 affected[1u][sfModifiedNode.fieldName][sfFinalFields.fieldName];
184 ff[sfLowLimit.fieldName] ==
186 BEAST_EXPECT(!(ff[jss::Flags].asUInt() &
lsfLowFreeze));
197 using namespace test::jtx;
198 Env env(*
this, features);
203 env.fund(XRP(10000), G1, A1);
206 env.trust(G1[
"USD"](1000), A1);
209 if (features[featureDeepFreeze])
288 testcase(
"Create Frozen Trustline");
290 using namespace test::jtx;
291 Env env(*
this, features);
296 env.fund(XRP(10000), G1, A1);
305 env.require(lines(A1, 1));
311 env.require(lines(G1, 0));
312 env.require(lines(A1, 0));
315 if (features[featureDeepFreeze])
320 env.require(lines(A1, 0));
324 if (features[featureDeepFreeze])
331 env.require(lines(A1, 1));
340 using namespace test::jtx;
341 Env env(*
this, features);
346 env.fund(XRP(10000), G1, A1);
349 env.trust(G1[
"USD"](1000), A1);
352 if (features[featureDeepFreeze])
371 auto affected = env.meta()->getJson(
373 BEAST_EXPECT(checkArraySize(
384 using namespace test::jtx;
385 Env env(*
this, features);
393 env.fund(XRP(12000), G1);
394 env.fund(XRP(1000), A1);
395 env.fund(XRP(20000), A2, A3, A4);
398 env.trust(G1[
"USD"](1200), A1);
399 env.trust(G1[
"USD"](200), A2);
400 env.trust(G1[
"BTC"](100), A3);
401 env.trust(G1[
"BTC"](100), A4);
404 env(pay(G1, A1, G1[
"USD"](1000)));
405 env(pay(G1, A2, G1[
"USD"](100)));
406 env(pay(G1, A3, G1[
"BTC"](100)));
407 env(pay(G1, A4, G1[
"BTC"](100)));
410 env(offer(G1, XRP(10000), G1[
"USD"](100)), txflags(
tfPassive));
411 env(offer(G1, G1[
"USD"](100), XRP(10000)), txflags(
tfPassive));
412 env(offer(A1, XRP(10000), G1[
"USD"](100)), txflags(
tfPassive));
413 env(offer(A2, G1[
"USD"](100), XRP(10000)), txflags(
tfPassive));
433 auto offers = env.rpc(
436 "XRP")[jss::result][jss::offers];
437 if (!BEAST_EXPECT(checkArraySize(offers, 2u)))
440 for (
auto const& offer : offers)
442 accounts.
insert(offer[jss::Account].asString());
444 BEAST_EXPECT(accounts.
find(A2.human()) !=
std::end(accounts));
445 BEAST_EXPECT(accounts.
find(G1.human()) !=
std::end(accounts));
451 std::string(
"USD/") + G1.human())[jss::result][jss::offers];
452 if (!BEAST_EXPECT(checkArraySize(offers, 2u)))
455 for (
auto const& offer : offers)
457 accounts.
insert(offer[jss::Account].asString());
459 BEAST_EXPECT(accounts.
find(A1.human()) !=
std::end(accounts));
460 BEAST_EXPECT(accounts.
find(G1.human()) !=
std::end(accounts));
466 env(offer(A3, G1[
"BTC"](1), XRP(1)));
469 env(offer(A4, XRP(1), G1[
"BTC"](1)));
472 env(pay(G1, A2, G1[
"USD"](1)));
475 env(pay(A2, G1, G1[
"USD"](1)));
478 env(pay(A2, A1, G1[
"USD"](1)));
481 env(pay(A1, A2, G1[
"USD"](1)));
494 env(offer(A3, G1[
"BTC"](1), XRP(1)), ter(
tecFROZEN));
497 env(offer(A4, XRP(1), G1[
"BTC"](1)), ter(
tecFROZEN));
503 auto offers = getAccountOffers(env, G1)[jss::offers];
504 if (!BEAST_EXPECT(checkArraySize(offers, 2u)))
512 std::string(
"USD/") + G1.human())[jss::result][jss::offers];
513 if (!BEAST_EXPECT(checkArraySize(offers, 2u)))
519 "XRP")[jss::result][jss::offers];
520 if (!BEAST_EXPECT(checkArraySize(offers, 2u)))
527 env(pay(G1, A2, G1[
"USD"](1)));
530 env(pay(A2, G1, G1[
"USD"](1)));
542 using namespace test::jtx;
543 Env env(*
this, features);
547 Account frozenAcc{
"A2"};
548 Account deepFrozenAcc{
"A3"};
550 env.fund(XRP(12000), G1);
551 env.fund(XRP(1000), A1);
552 env.fund(XRP(1000), frozenAcc);
553 env.fund(XRP(1000), deepFrozenAcc);
556 env.trust(G1[
"USD"](1000), A1);
557 env.trust(G1[
"USD"](1000), frozenAcc);
558 env.trust(G1[
"USD"](1000), deepFrozenAcc);
561 env(pay(G1, A1, G1[
"USD"](1000)));
562 env(pay(G1, frozenAcc, G1[
"USD"](1000)));
563 env(pay(G1, deepFrozenAcc, G1[
"USD"](1000)));
573 if (features[featureDeepFreeze])
609 if (features[featureDeepFreeze])
623 auto affected = env.meta()->getJson(
625 if (!BEAST_EXPECT(checkArraySize(affected, 1u)))
628 auto let = affected[0u][sfModifiedNode.fieldName]
629 [sfLedgerEntryType.fieldName];
630 BEAST_EXPECT(let == jss::AccountRoot);
640 if (features[featureDeepFreeze])
655 testcase(
"Offers for Frozen Trust Lines");
657 using namespace test::jtx;
658 Env env(*
this, features);
665 env.fund(XRP(1000), G1, A3, A4);
666 env.fund(XRP(2000), A2);
669 env.trust(G1[
"USD"](1000), A2);
670 env.trust(G1[
"USD"](2000), A3);
671 env.trust(G1[
"USD"](2000), A4);
674 env(pay(G1, A3, G1[
"USD"](2000)));
675 env(pay(G1, A4, G1[
"USD"](2000)));
678 env(offer(A3, XRP(1000), G1[
"USD"](1000)), txflags(
tfPassive));
683 env(pay(A2, G1, G1[
"USD"](1)), paths(G1[
"USD"]), sendmax(XRP(1)));
687 auto offers = getAccountOffers(env, A3)[jss::offers];
688 if (!BEAST_EXPECT(checkArraySize(offers, 1u)))
691 offers[0u][jss::taker_gets] ==
695 env(offer(A4, XRP(999), G1[
"USD"](999)));
702 if (!BEAST_EXPECT(checkArraySize(affected, 2u)))
705 affected[1u][sfModifiedNode.fieldName][sfFinalFields.fieldName];
707 ff[sfHighLimit.fieldName] ==
709 BEAST_EXPECT(!(ff[jss::Flags].asUInt() &
lsfLowFreeze));
714 offers = getAccountOffers(env, A3)[jss::offers];
715 if (!BEAST_EXPECT(checkArraySize(offers, 1u)))
719 env(pay(A2, G1, G1[
"USD"](1)), paths(G1[
"USD"]), sendmax(XRP(1)));
723 offers = getAccountOffers(env, A3)[jss::offers];
724 if (!BEAST_EXPECT(checkArraySize(offers, 0u)))
732 if (!BEAST_EXPECT(checkArraySize(affected, 2u)))
734 ff = affected[0u][sfModifiedNode.fieldName][sfFinalFields.fieldName];
736 ff[sfLowLimit.fieldName] ==
743 env(offer(A2, G1[
"USD"](999), XRP(999)));
746 if (!BEAST_EXPECT(checkArraySize(affected, 8u)))
748 auto created = affected[0u][sfCreatedNode.fieldName];
750 created[sfNewFields.fieldName][jss::Account] == A2.human());
754 offers = getAccountOffers(env, A4)[jss::offers];
755 if (!BEAST_EXPECT(checkArraySize(offers, 0u)))
762 testcase(
"Offers on frozen trust lines");
764 using namespace test::jtx;
765 Env env(*
this, features);
771 auto const USD{G1[
"USD"]};
773 env.fund(XRP(10000), G1, A1, A2, A3);
776 auto const limit = USD(10000);
777 env.trust(limit, A1, A2, A3);
780 env(pay(G1, A1, USD(1000)));
781 env(pay(G1, A2, USD(1000)));
786 env(offer(A2, XRP(100), USD(50)), txflags(
tfPassive));
790 env(offer(A3, USD(100), XRP(100)), txflags(
tfPassive));
792 env.require(offers(A2, 1), offers(A3, 1));
797 env.require(balance(A1, USD(1001)), balance(A2, USD(999)));
802 env.require(balance(A1, USD(1000)), balance(A3, USD(1)));
811 env(offer(A1, USD(1), XRP(0.5)), txflags(
tfPassive));
813 env.require(balance(A1, USD(1000)), offers(A1, 1));
815 env(offer_cancel(A1, env.seq(A1) - 1));
816 env.require(offers(A1, 0));
823 balance(A1, USD(1001)), balance(A2, USD(998)), offers(A1, 0));
826 env(offer(A1, XRP(2), USD(1)),
830 env.require(balance(A1, USD(1001)), offers(A1, 0));
833 env(offer(A1, XRP(1), USD(1)),
837 env.require(balance(A1, USD(1001)), offers(A1, 0));
845 if (features[featureDeepFreeze])
851 env(offer(A1, USD(1), XRP(0.5)),
857 env(offer(A1, USD(1), XRP(2)),
863 env(offer(A1, XRP(2), USD(1)),
869 env(offer(A1, XRP(1), USD(1)),
876 env.require(balance(A1, USD(1001)), offers(A1, 0));
882 env.require(balance(A1, USD(1001)));
883 env(offer(A1, XRP(1.9), USD(1)));
884 env(offer(A1, USD(1), XRP(1.1)));
886 env.require(balance(A1, USD(1001)), offers(A1, 2));
892 env.require(balance(A1, USD(1001)), balance(A2, USD(998)));
893 env(offer(A2, XRP(1.1), USD(1)), txflags(
tfFillOrKill));
896 balance(A1, USD(1002)), balance(A2, USD(997)), offers(A1, 1));
900 balance(A1, USD(1002)), balance(A3, USD(1)), offers(A1, 1));
901 env(offer(A3, USD(1), XRP(1.9)),
906 balance(A1, USD(1002)), balance(A3, USD(1)), offers(A1, 0));
914 if (features[featureDeepFreeze])
916 env.require(balance(A1, USD(1002)));
917 env(offer(A1, XRP(1.9), USD(1)));
918 env(offer(A1, USD(1), XRP(1.1)));
920 env.require(balance(A1, USD(1002)), offers(A1, 2));
926 env.require(balance(A1, USD(1002)), balance(A2, USD(997)));
927 env(offer(A2, XRP(1.1), USD(1)),
932 balance(A1, USD(1002)), balance(A2, USD(997)), offers(A1, 1));
936 balance(A1, USD(1002)), balance(A3, USD(1)), offers(A1, 1));
937 env(offer(A3, USD(1), XRP(1.9)),
942 balance(A1, USD(1002)), balance(A3, USD(1)), offers(A1, 0));
955 env(offer(A1, USD(1), XRP(0.5)), txflags(
tfPassive));
957 env.require(balance(A1, USD(1002)), offers(A1, 1));
959 env(offer_cancel(A1, env.seq(A1) - 1));
960 env.require(offers(A1, 0));
964 if (features[featureFlowCross])
966 env(offer(A1, USD(1), XRP(2)),
971 balance(A1, USD(1002)),
972 balance(A2, USD(997)),
984 env(offer(A1, XRP(2), USD(1)), txflags(
tfPassive));
986 env.require(balance(A1, USD(1002)), offers(A1, 1));
988 env(offer_cancel(A1, env.seq(A1) - 1));
989 env.require(offers(A1, 0));
995 env.require(balance(A1, USD(1001)), offers(A1, 0));
1003 if (features[featureDeepFreeze])
1009 env(offer(A1, USD(1), XRP(0.5)),
1015 env(offer(A1, USD(1), XRP(2)),
1021 env(offer(A1, XRP(2), USD(1)),
1027 env(offer(A1, XRP(1), USD(1)),
1040 testcase(
"Longer paths payment on frozen trust lines");
1041 using namespace test::jtx;
1044 Env env(*
this, features);
1048 auto const USD{G1[
"USD"]};
1050 env.fund(XRP(10000), G1, A1, A2);
1053 auto const limit = USD(10000);
1054 env.trust(limit, A1, A2);
1057 env(pay(G1, A1, USD(1000)));
1058 env(pay(G1, A2, USD(1000)));
1061 env(offer(A2, XRP(100), USD(100)), txflags(
tfPassive));
1070 env(pay(A1, G1, USD(10)),
1078 env(pay(G1, A1, USD(10)),
1090 if (features[featureDeepFreeze])
1096 env(pay(A1, G1, USD(10)),
1104 env(pay(G1, A1, USD(10)),
1122 env(pay(A1, G1, USD(10)),
1129 env(pay(G1, A1, USD(10)),
1141 if (features[featureDeepFreeze])
1147 env(pay(A1, G1, USD(10)),
1155 env(pay(G1, A1, USD(10)),
1167 env(offer_cancel(A1, env.seq(A1) - 1));
1168 env.require(offers(A1, 0));
1171 env(offer(A2, USD(100), XRP(100)), txflags(
tfPassive));
1180 env(pay(A1, G1, XRP(10)),
1187 env(pay(G1, A1, XRP(10)),
1199 if (features[featureDeepFreeze])
1205 env(pay(A1, G1, XRP(10)),
1213 env(pay(G1, A1, XRP(10)),
1231 env(pay(A1, G1, XRP(10)),
1238 env(pay(G1, A1, XRP(10)),
1250 if (features[featureDeepFreeze])
1256 env(pay(A1, G1, XRP(10)),
1264 env(pay(G1, A1, XRP(10)),
1276 env(offer_cancel(A1, env.seq(A1) - 1));
1277 env.require(offers(A1, 0));
1284 testcase(
"Direct payments on frozen trust lines");
1286 using namespace test::jtx;
1287 Env env(*
this, features);
1292 auto const USD{G1[
"USD"]};
1294 env.fund(XRP(10000), G1, A1, A2);
1297 auto const limit = USD(10000);
1298 env.trust(limit, A1, A2);
1301 env(pay(G1, A1, USD(1000)));
1302 env(pay(G1, A2, USD(1000)));
1307 env(pay(A1, G1, USD(1)));
1308 env(pay(A2, G1, USD(1)));
1312 env(pay(A1, A2, USD(1)));
1313 env(pay(A2, A1, USD(1)));
1321 env(pay(A1, G1, USD(1)));
1322 env(pay(G1, A1, USD(1)));
1329 env(pay(A2, A1, USD(1)));
1332 if (features[featureDeepFreeze])
1339 env(pay(A1, G1, USD(1)));
1340 env(pay(G1, A1, USD(1)));
1363 env(pay(A2, G1, USD(1)));
1364 env(pay(G1, A2, USD(1)));
1368 env(pay(A1, G1, USD(1)));
1371 env(pay(A1, A2, USD(1)));
1375 env(pay(G1, A1, USD(1)));
1379 if (features[featureDeepFreeze])
1386 env(pay(A2, G1, USD(1)));
1387 env(pay(G1, A2, USD(1)));
1391 env(pay(A1, G1, USD(1)));
1395 env(pay(G1, A1, USD(1)));
1406 testcase(
"Checks on frozen trust lines");
1408 using namespace test::jtx;
1409 Env env(*
this, features);
1414 auto const USD{G1[
"USD"]};
1416 env.fund(XRP(10000), G1, A1, A2);
1419 auto const limit = USD(10000);
1420 env.trust(limit, A1, A2);
1423 env(pay(G1, A1, USD(1000)));
1424 env(pay(G1, A2, USD(1000)));
1430 env(check::create(G1, A1, USD(10)));
1432 env(check::cash(A1, checkId, USD(10)));
1438 env(check::create(G1, A2, USD(10)));
1440 env(check::cash(A2, checkId, USD(10)));
1446 env(check::create(A1, G1, USD(10)));
1448 env(check::cash(G1, checkId, USD(10)));
1454 env(check::create(A1, A2, USD(10)));
1456 env(check::cash(A2, checkId, USD(10)));
1462 env(check::create(A2, G1, USD(10)));
1464 env(check::cash(G1, checkId, USD(10)));
1470 env(check::create(A2, A1, USD(10)));
1472 env(check::cash(A1, checkId, USD(10)));
1485 env(check::create(G1, A1, USD(10)));
1487 env(check::cash(A1, checkId, USD(10)), ter(
tecFROZEN));
1494 env(check::create(A2, A1, USD(10)));
1497 env(check::cash(A1, checkId, USD(10)), ter(
tecFROZEN));
1503 env(check::create(A1, G1, USD(10)), ter(
tecFROZEN));
1510 env(check::create(A1, A2, USD(10)), ter(
tecFROZEN));
1520 env(check::create(A1, G1, USD(10)));
1523 env(check::create(A1, A2, USD(10)));
1547 if (features[featureDeepFreeze])
1555 env(check::create(G1, A1, USD(10)));
1558 env(check::cash(A1, checkId, USD(10)), ter(
tecFROZEN));
1565 env(check::create(A2, A1, USD(10)));
1568 env(check::cash(A1, checkId, USD(10)), ter(
tecFROZEN));
1574 env(check::create(A1, G1, USD(10)), ter(
tecFROZEN));
1581 env(check::create(A1, A2, USD(10)), ter(
tecFROZEN));
1591 env(check::create(A1, G1, USD(10)));
1594 env(check::create(A1, A2, USD(10)));
1624 env(check::create(G1, A1, USD(10)), ter(
tecFROZEN));
1630 env(check::create(A2, A1, USD(10)), ter(
tecFROZEN));
1637 env(check::create(A1, G1, USD(10)));
1639 env(check::cash(G1, checkId, USD(10)));
1646 env(check::create(A1, A2, USD(10)));
1648 env(check::cash(A2, checkId, USD(10)));
1658 if (features[featureDeepFreeze])
1665 env(check::create(G1, A1, USD(10)), ter(
tecFROZEN));
1671 env(check::create(A2, A1, USD(10)), ter(
tecFROZEN));
1678 env(check::create(A1, G1, USD(10)));
1687 env(check::create(A1, A2, USD(10)));
1701 testcase(
"AMM payments on frozen trust lines");
1702 using namespace test::jtx;
1705 Env env(*
this, features);
1709 auto const USD{G1[
"USD"]};
1711 env.fund(XRP(10000), G1, A1, A2);
1714 env.trust(G1[
"USD"](10000), A1, A2);
1717 env(pay(G1, A1, USD(1000)));
1718 env(pay(G1, A2, USD(1000)));
1721 AMM ammG1(env, G1, XRP(1'000), USD(1'000));
1730 env(pay(A1, A2, USD(10)),
1737 env(pay(A1, A2, XRP(10)),
1745 env(pay(A2, A1, USD(10)),
1752 env(pay(A2, A1, XRP(10)),
1764 if (features[featureDeepFreeze])
1770 env(pay(A1, A2, USD(10)),
1777 env(pay(A1, A2, XRP(10)),
1785 env(pay(A2, A1, USD(10)),
1793 env(pay(A2, A1, XRP(10)),
1807 testcase(
"NFT offers on frozen trust lines");
1808 using namespace test::jtx;
1810 Env env(*
this, features);
1814 auto const USD{G1[
"USD"]};
1816 env.fund(XRP(10000), G1, A1, A2);
1819 auto const limit = USD(10000);
1820 env.trust(limit, A1, A2);
1823 env(pay(G1, A1, USD(1000)));
1824 env(pay(G1, A2, USD(1000)));
1834 env(token::acceptSellOffer(A1, sellOfferIndex));
1842 if (features[featureDeepFreeze])
1850 env(token::acceptSellOffer(A1, sellOfferIndex), ter(
tecFROZEN));
1864 env(token::acceptSellOffer(A2, sellOfferIndex),
1873 if (features[featureDeepFreeze])
1880 env(token::acceptSellOffer(A2, sellOfferIndex),
1889 if (features[featureDeepFreeze] &&
1890 features[fixEnforceNFTokenTrustlineV2])
1900 env(token::createOffer(A1, nftID, USD(10)), token::owner(A2));
1903 env(token::acceptBuyOffer(A2, buyIdx), ter(
tecFROZEN));
1909 env(token::acceptBuyOffer(A2, buyIdx));
1920 env(token::acceptSellOffer(A1, sellOfferIndex));
1928 if (features[featureDeepFreeze])
1936 env(token::acceptSellOffer(A1, sellOfferIndex), ter(
tecFROZEN));
1950 env(token::acceptSellOffer(A2, sellOfferIndex));
1958 if (features[featureDeepFreeze])
1965 env(token::acceptSellOffer(A2, sellOfferIndex),
1974 if (features[featureDeepFreeze] &&
1975 features[fixEnforceNFTokenTrustlineV2])
1977 Account broker{
"broker"};
1978 env.fund(XRP(10000), broker);
1988 env(token::createOffer(A2, nftID, USD(10)), txflags(
tfSellNFToken));
1991 env(token::createOffer(A1, nftID, USD(11)), token::owner(A2));
1994 env(token::brokerOffers(broker, buyIdx, sellIdx),
1995 token::brokerFee(USD(1)),
2001 if (features[featureDeepFreeze] &&
2002 features[fixEnforceNFTokenTrustlineV2])
2004 Account minter{
"minter"};
2005 env.fund(XRP(10000), minter);
2007 env(trust(G1, minter[
"USD"](1000)));
2012 env(token::mint(minter, 0),
2019 env(token::createOffer(minter, nftID, drops(1)),
2022 env(token::acceptSellOffer(A2, minterSellIdx));
2026 env(token::createOffer(A2, nftID, USD(100)),
2031 env(token::acceptSellOffer(A1, sellIdx), ter(
tecFROZEN));
2040 size_t expectedArraySize,
2041 size_t expectedArrayIndex,
2042 bool modified =
true)
2044 using namespace test::jtx;
2045 auto const affected =
2047 if (!BEAST_EXPECT(checkArraySize(affected, expectedArraySize)))
2052 return affected[expectedArrayIndex][sfModifiedNode.fieldName]
2053 [sfFinalFields.fieldName][jss::Flags]
2057 return affected[expectedArrayIndex][sfCreatedNode.fieldName]
2058 [sfNewFields.fieldName][jss::Flags]
2075 using namespace test::jtx;
2080 uint256 const sellOfferIndex =
2082 env(token::createOffer(account, nftID, currency),
2086 return sellOfferIndex;
2108 using namespace test::jtx;
2109 auto const sa = supported_amendments();
2111 sa - featureFlowCross - featureDeepFreeze - featurePermissionedDEX -
2112 fixEnforceNFTokenTrustlineV2);
2114 sa - featureFlowCross - featurePermissionedDEX -
2115 fixEnforceNFTokenTrustlineV2);
2117 sa - featureDeepFreeze - featurePermissionedDEX -
2118 fixEnforceNFTokenTrustlineV2);
2119 testAll(sa - featurePermissionedDEX - fixEnforceNFTokenTrustlineV2);
2120 testAll(sa - fixEnforceNFTokenTrustlineV2);
testcase_t testcase
Memberspace for declaring test cases.
void testOffersWhenDeepFrozen(FeatureBitset features)
uint256 createNFTSellOffer(test::jtx::Env &env, test::jtx::Account const &account, test::jtx::PrettyAmount const ¤cy)
uint32_t getTrustlineFlags(test::jtx::Env &env, size_t expectedArraySize, size_t expectedArrayIndex, bool modified=true)
void testGlobalFreeze(FeatureBitset features)
void testDeepFreeze(FeatureBitset features)
void testPaymentsWhenDeepFrozen(FeatureBitset features)
void testNoFreeze(FeatureBitset features)
void testNFTOffersWhenFreeze(FeatureBitset features)
void testAMMWhenFreeze(FeatureBitset features)
void testPathsWhenFrozen(FeatureBitset features)
void run() override
Runs the suite.
uint256 getCheckIndex(AccountID const &account, std::uint32_t uSequence)
void testCreateFrozenTrustline(FeatureBitset features)
void testRippleState(FeatureBitset features)
void testSetAndClear(FeatureBitset features)
void testOffersWhenFrozen(FeatureBitset features)
void testChecksWhenFrozen(FeatureBitset features)
A currency issued by an account.
Immutable cryptographic account descriptor.
A transaction testing environment.
std::uint32_t seq(Account const &account) const
Returns the next sequence number on account.
bool close(NetClock::time_point closeTime, std::optional< std::chrono::milliseconds > consensusDelay=std::nullopt)
Close and advance the ledger.
std::shared_ptr< STObject const > meta()
Return metadata for the last JTx.
Keylet nftoffer(AccountID const &owner, std::uint32_t seq)
An offer from an account to buy or sell an NFT.
Keylet check(AccountID const &id, std::uint32_t seq) noexcept
A Check.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
AccountID const & noAccount()
A placeholder for empty accounts.
constexpr std::uint32_t asfGlobalFreeze
constexpr std::uint32_t tfSetDeepFreeze
constexpr std::uint32_t const tfSellNFToken
constexpr std::uint32_t asfNoFreeze
constexpr std::uint32_t tfFillOrKill
constexpr std::uint32_t tfPassive
constexpr std::uint32_t tfClearFreeze
constexpr std::uint32_t tfNoRippleDirect
constexpr std::uint32_t tfClearDeepFreeze
Json::Value getJson(LedgerFill const &fill)
Return a new Json::Value representing the ledger with given options.
constexpr std::uint32_t tfSetFreeze
constexpr std::uint32_t const tfTransferable
bool to_currency(Currency &, std::string const &)
Tries to convert a string to a Currency, returns true on success.
Represents an XRP or IOU quantity This customizes the string conversion and supports XRP conversions ...