21#include <test/jtx/AMM.h>
22#include <xrpl/protocol/AccountID.h>
23#include <xrpl/protocol/Feature.h>
24#include <xrpl/protocol/SField.h>
25#include <xrpl/protocol/TxFlags.h>
26#include <xrpl/protocol/jss.h>
37 using namespace test::jtx;
38 Env env(*
this, features);
41 Account alice{
"alice"};
44 env.fund(XRP(1000), G1, alice, bob);
47 env.trust(G1[
"USD"](100), bob);
48 env.trust(G1[
"USD"](100), alice);
51 env(pay(G1, bob, G1[
"USD"](10)));
52 env(pay(G1, alice, G1[
"USD"](100)));
55 env(offer(alice, XRP(500), G1[
"USD"](100)));
59 auto lines = getAccountLines(env, bob);
60 if (!BEAST_EXPECT(checkArraySize(lines[jss::lines], 1u)))
62 BEAST_EXPECT(lines[jss::lines][0u][jss::account] == G1.human());
63 BEAST_EXPECT(lines[jss::lines][0u][jss::limit] ==
"100");
64 BEAST_EXPECT(lines[jss::lines][0u][jss::balance] ==
"10");
68 auto lines = getAccountLines(env, alice);
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] ==
"100");
79 env(pay(alice, bob, G1[
"USD"](1)));
82 env(pay(bob, alice, G1[
"USD"](1)));
90 auto affected = env.meta()->getJson(
92 if (!BEAST_EXPECT(checkArraySize(affected, 2u)))
95 affected[1u][sfModifiedNode.fieldName][sfFinalFields.fieldName];
97 ff[sfLowLimit.fieldName] ==
107 env(offer(bob, G1[
"USD"](5), XRP(25)));
108 auto affected = env.meta()->getJson(
110 if (!BEAST_EXPECT(checkArraySize(affected, 5u)))
113 affected[3u][sfModifiedNode.fieldName][sfFinalFields.fieldName];
115 ff[sfHighLimit.fieldName] ==
120 BEAST_EXPECT(ff[sfBalance.fieldName] == amt);
129 env(pay(alice, bob, G1[
"USD"](1)));
132 env(pay(bob, alice, G1[
"USD"](1)), ter(
tecPATH_DRY));
138 auto lines = getAccountLines(env, G1);
140 for (
auto const& it : lines[jss::lines])
142 if (it[jss::account] == bob.human())
148 if (!BEAST_EXPECT(bobLine))
150 BEAST_EXPECT(bobLine[jss::freeze] ==
true);
151 BEAST_EXPECT(bobLine[jss::balance] ==
"-16");
156 auto lines = getAccountLines(env, bob);
158 for (
auto const& it : lines[jss::lines])
160 if (it[jss::account] == G1.human())
166 if (!BEAST_EXPECT(g1Line))
168 BEAST_EXPECT(g1Line[jss::freeze_peer] ==
true);
169 BEAST_EXPECT(g1Line[jss::balance] ==
"16");
176 auto affected = env.meta()->getJson(
178 if (!BEAST_EXPECT(checkArraySize(affected, 2u)))
181 affected[1u][sfModifiedNode.fieldName][sfFinalFields.fieldName];
183 ff[sfLowLimit.fieldName] ==
185 BEAST_EXPECT(!(ff[jss::Flags].asUInt() &
lsfLowFreeze));
196 using namespace test::jtx;
197 Env env(*
this, features);
202 env.fund(XRP(10000), G1, A1);
205 env.trust(G1[
"USD"](1000), A1);
208 if (features[featureDeepFreeze])
287 testcase(
"Create Frozen Trustline");
289 using namespace test::jtx;
290 Env env(*
this, features);
295 env.fund(XRP(10000), G1, A1);
304 env.require(lines(A1, 1));
310 env.require(lines(G1, 0));
311 env.require(lines(A1, 0));
314 if (features[featureDeepFreeze])
319 env.require(lines(A1, 0));
323 if (features[featureDeepFreeze])
330 env.require(lines(A1, 1));
339 using namespace test::jtx;
340 Env env(*
this, features);
345 env.fund(XRP(10000), G1, A1);
348 env.trust(G1[
"USD"](1000), A1);
351 if (features[featureDeepFreeze])
370 auto affected = env.meta()->getJson(
372 BEAST_EXPECT(checkArraySize(
383 using namespace test::jtx;
384 Env env(*
this, features);
392 env.fund(XRP(12000), G1);
393 env.fund(XRP(1000), A1);
394 env.fund(XRP(20000), A2, A3, A4);
397 env.trust(G1[
"USD"](1200), A1);
398 env.trust(G1[
"USD"](200), A2);
399 env.trust(G1[
"BTC"](100), A3);
400 env.trust(G1[
"BTC"](100), A4);
403 env(pay(G1, A1, G1[
"USD"](1000)));
404 env(pay(G1, A2, G1[
"USD"](100)));
405 env(pay(G1, A3, G1[
"BTC"](100)));
406 env(pay(G1, A4, G1[
"BTC"](100)));
409 env(offer(G1, XRP(10000), G1[
"USD"](100)), txflags(
tfPassive));
410 env(offer(G1, G1[
"USD"](100), XRP(10000)), txflags(
tfPassive));
411 env(offer(A1, XRP(10000), G1[
"USD"](100)), txflags(
tfPassive));
412 env(offer(A2, G1[
"USD"](100), XRP(10000)), txflags(
tfPassive));
432 auto offers = env.rpc(
435 "XRP")[jss::result][jss::offers];
436 if (!BEAST_EXPECT(checkArraySize(offers, 2u)))
439 for (
auto const& offer : offers)
441 accounts.
insert(offer[jss::Account].asString());
443 BEAST_EXPECT(accounts.
find(A2.human()) !=
std::end(accounts));
444 BEAST_EXPECT(accounts.
find(G1.human()) !=
std::end(accounts));
450 std::string(
"USD/") + G1.human())[jss::result][jss::offers];
451 if (!BEAST_EXPECT(checkArraySize(offers, 2u)))
454 for (
auto const& offer : offers)
456 accounts.
insert(offer[jss::Account].asString());
458 BEAST_EXPECT(accounts.
find(A1.human()) !=
std::end(accounts));
459 BEAST_EXPECT(accounts.
find(G1.human()) !=
std::end(accounts));
465 env(offer(A3, G1[
"BTC"](1), XRP(1)));
468 env(offer(A4, XRP(1), G1[
"BTC"](1)));
471 env(pay(G1, A2, G1[
"USD"](1)));
474 env(pay(A2, G1, G1[
"USD"](1)));
477 env(pay(A2, A1, G1[
"USD"](1)));
480 env(pay(A1, A2, G1[
"USD"](1)));
493 env(offer(A3, G1[
"BTC"](1), XRP(1)), ter(
tecFROZEN));
496 env(offer(A4, XRP(1), G1[
"BTC"](1)), ter(
tecFROZEN));
502 auto offers = getAccountOffers(env, G1)[jss::offers];
503 if (!BEAST_EXPECT(checkArraySize(offers, 2u)))
511 std::string(
"USD/") + G1.human())[jss::result][jss::offers];
512 if (!BEAST_EXPECT(checkArraySize(offers, 2u)))
518 "XRP")[jss::result][jss::offers];
519 if (!BEAST_EXPECT(checkArraySize(offers, 2u)))
526 env(pay(G1, A2, G1[
"USD"](1)));
529 env(pay(A2, G1, G1[
"USD"](1)));
541 using namespace test::jtx;
542 Env env(*
this, features);
546 Account frozenAcc{
"A2"};
547 Account deepFrozenAcc{
"A3"};
549 env.fund(XRP(12000), G1);
550 env.fund(XRP(1000), A1);
551 env.fund(XRP(1000), frozenAcc);
552 env.fund(XRP(1000), deepFrozenAcc);
555 env.trust(G1[
"USD"](1000), A1);
556 env.trust(G1[
"USD"](1000), frozenAcc);
557 env.trust(G1[
"USD"](1000), deepFrozenAcc);
560 env(pay(G1, A1, G1[
"USD"](1000)));
561 env(pay(G1, frozenAcc, G1[
"USD"](1000)));
562 env(pay(G1, deepFrozenAcc, G1[
"USD"](1000)));
572 if (features[featureDeepFreeze])
608 if (features[featureDeepFreeze])
622 auto affected = env.meta()->getJson(
624 if (!BEAST_EXPECT(checkArraySize(affected, 1u)))
627 auto let = affected[0u][sfModifiedNode.fieldName]
628 [sfLedgerEntryType.fieldName];
629 BEAST_EXPECT(let == jss::AccountRoot);
639 if (features[featureDeepFreeze])
654 testcase(
"Offers for Frozen Trust Lines");
656 using namespace test::jtx;
657 Env env(*
this, features);
664 env.fund(XRP(1000), G1, A3, A4);
665 env.fund(XRP(2000), A2);
668 env.trust(G1[
"USD"](1000), A2);
669 env.trust(G1[
"USD"](2000), A3);
670 env.trust(G1[
"USD"](2000), A4);
673 env(pay(G1, A3, G1[
"USD"](2000)));
674 env(pay(G1, A4, G1[
"USD"](2000)));
677 env(offer(A3, XRP(1000), G1[
"USD"](1000)), txflags(
tfPassive));
682 env(pay(A2, G1, G1[
"USD"](1)), paths(G1[
"USD"]), sendmax(XRP(1)));
686 auto offers = getAccountOffers(env, A3)[jss::offers];
687 if (!BEAST_EXPECT(checkArraySize(offers, 1u)))
690 offers[0u][jss::taker_gets] ==
694 env(offer(A4, XRP(999), G1[
"USD"](999)));
701 if (!BEAST_EXPECT(checkArraySize(affected, 2u)))
704 affected[1u][sfModifiedNode.fieldName][sfFinalFields.fieldName];
706 ff[sfHighLimit.fieldName] ==
708 BEAST_EXPECT(!(ff[jss::Flags].asUInt() &
lsfLowFreeze));
713 offers = getAccountOffers(env, A3)[jss::offers];
714 if (!BEAST_EXPECT(checkArraySize(offers, 1u)))
718 env(pay(A2, G1, G1[
"USD"](1)), paths(G1[
"USD"]), sendmax(XRP(1)));
722 offers = getAccountOffers(env, A3)[jss::offers];
723 if (!BEAST_EXPECT(checkArraySize(offers, 0u)))
731 if (!BEAST_EXPECT(checkArraySize(affected, 2u)))
733 ff = affected[0u][sfModifiedNode.fieldName][sfFinalFields.fieldName];
735 ff[sfLowLimit.fieldName] ==
742 env(offer(A2, G1[
"USD"](999), XRP(999)));
745 if (!BEAST_EXPECT(checkArraySize(affected, 8u)))
747 auto created = affected[0u][sfCreatedNode.fieldName];
749 created[sfNewFields.fieldName][jss::Account] == A2.human());
753 offers = getAccountOffers(env, A4)[jss::offers];
754 if (!BEAST_EXPECT(checkArraySize(offers, 0u)))
761 testcase(
"Offers on frozen trust lines");
763 using namespace test::jtx;
764 Env env(*
this, features);
770 auto const USD{G1[
"USD"]};
772 env.fund(XRP(10000), G1, A1, A2, A3);
775 auto const limit = USD(10000);
776 env.trust(limit, A1, A2, A3);
779 env(pay(G1, A1, USD(1000)));
780 env(pay(G1, A2, USD(1000)));
785 env(offer(A2, XRP(100), USD(50)), txflags(
tfPassive));
789 env(offer(A3, USD(100), XRP(100)), txflags(
tfPassive));
791 env.require(offers(A2, 1), offers(A3, 1));
796 env.require(balance(A1, USD(1001)), balance(A2, USD(999)));
801 env.require(balance(A1, USD(1000)), balance(A3, USD(1)));
810 env(offer(A1, USD(1), XRP(0.5)), txflags(
tfPassive));
812 env.require(balance(A1, USD(1000)), offers(A1, 1));
814 env(offer_cancel(A1, env.seq(A1) - 1));
815 env.require(offers(A1, 0));
822 balance(A1, USD(1001)), balance(A2, USD(998)), offers(A1, 0));
825 env(offer(A1, XRP(2), USD(1)),
829 env.require(balance(A1, USD(1001)), offers(A1, 0));
832 env(offer(A1, XRP(1), USD(1)),
836 env.require(balance(A1, USD(1001)), offers(A1, 0));
844 if (features[featureDeepFreeze])
850 env(offer(A1, USD(1), XRP(0.5)),
856 env(offer(A1, USD(1), XRP(2)),
862 env(offer(A1, XRP(2), USD(1)),
868 env(offer(A1, XRP(1), USD(1)),
875 env.require(balance(A1, USD(1001)), offers(A1, 0));
881 env.require(balance(A1, USD(1001)));
882 env(offer(A1, XRP(1.9), USD(1)));
883 env(offer(A1, USD(1), XRP(1.1)));
885 env.require(balance(A1, USD(1001)), offers(A1, 2));
891 env.require(balance(A1, USD(1001)), balance(A2, USD(998)));
892 env(offer(A2, XRP(1.1), USD(1)), txflags(
tfFillOrKill));
895 balance(A1, USD(1002)), balance(A2, USD(997)), offers(A1, 1));
899 balance(A1, USD(1002)), balance(A3, USD(1)), offers(A1, 1));
900 env(offer(A3, USD(1), XRP(1.9)),
905 balance(A1, USD(1002)), balance(A3, USD(1)), offers(A1, 0));
913 if (features[featureDeepFreeze])
915 env.require(balance(A1, USD(1002)));
916 env(offer(A1, XRP(1.9), USD(1)));
917 env(offer(A1, USD(1), XRP(1.1)));
919 env.require(balance(A1, USD(1002)), offers(A1, 2));
925 env.require(balance(A1, USD(1002)), balance(A2, USD(997)));
926 env(offer(A2, XRP(1.1), USD(1)),
931 balance(A1, USD(1002)), balance(A2, USD(997)), offers(A1, 1));
935 balance(A1, USD(1002)), balance(A3, USD(1)), offers(A1, 1));
936 env(offer(A3, USD(1), XRP(1.9)),
941 balance(A1, USD(1002)), balance(A3, USD(1)), offers(A1, 0));
954 env(offer(A1, USD(1), XRP(0.5)), txflags(
tfPassive));
956 env.require(balance(A1, USD(1002)), offers(A1, 1));
958 env(offer_cancel(A1, env.seq(A1) - 1));
959 env.require(offers(A1, 0));
963 if (features[featureFlowCross])
965 env(offer(A1, USD(1), XRP(2)),
970 balance(A1, USD(1002)),
971 balance(A2, USD(997)),
983 env(offer(A1, XRP(2), USD(1)), txflags(
tfPassive));
985 env.require(balance(A1, USD(1002)), offers(A1, 1));
987 env(offer_cancel(A1, env.seq(A1) - 1));
988 env.require(offers(A1, 0));
994 env.require(balance(A1, USD(1001)), offers(A1, 0));
1002 if (features[featureDeepFreeze])
1008 env(offer(A1, USD(1), XRP(0.5)),
1014 env(offer(A1, USD(1), XRP(2)),
1020 env(offer(A1, XRP(2), USD(1)),
1026 env(offer(A1, XRP(1), USD(1)),
1039 testcase(
"Longer paths payment on frozen trust lines");
1040 using namespace test::jtx;
1043 Env env(*
this, features);
1047 auto const USD{G1[
"USD"]};
1049 env.fund(XRP(10000), G1, A1, A2);
1052 auto const limit = USD(10000);
1053 env.trust(limit, A1, A2);
1056 env(pay(G1, A1, USD(1000)));
1057 env(pay(G1, A2, USD(1000)));
1060 env(offer(A2, XRP(100), USD(100)), txflags(
tfPassive));
1069 env(pay(A1, G1, USD(10)),
1077 env(pay(G1, A1, USD(10)),
1089 if (features[featureDeepFreeze])
1095 env(pay(A1, G1, USD(10)),
1103 env(pay(G1, A1, USD(10)),
1121 env(pay(A1, G1, USD(10)),
1128 env(pay(G1, A1, USD(10)),
1140 if (features[featureDeepFreeze])
1146 env(pay(A1, G1, USD(10)),
1154 env(pay(G1, A1, USD(10)),
1166 env(offer_cancel(A1, env.seq(A1) - 1));
1167 env.require(offers(A1, 0));
1170 env(offer(A2, USD(100), XRP(100)), txflags(
tfPassive));
1179 env(pay(A1, G1, XRP(10)),
1186 env(pay(G1, A1, XRP(10)),
1198 if (features[featureDeepFreeze])
1204 env(pay(A1, G1, XRP(10)),
1212 env(pay(G1, A1, XRP(10)),
1230 env(pay(A1, G1, XRP(10)),
1237 env(pay(G1, A1, XRP(10)),
1249 if (features[featureDeepFreeze])
1255 env(pay(A1, G1, XRP(10)),
1263 env(pay(G1, A1, XRP(10)),
1275 env(offer_cancel(A1, env.seq(A1) - 1));
1276 env.require(offers(A1, 0));
1283 testcase(
"Direct payments on frozen trust lines");
1285 using namespace test::jtx;
1286 Env env(*
this, features);
1291 auto const USD{G1[
"USD"]};
1293 env.fund(XRP(10000), G1, A1, A2);
1296 auto const limit = USD(10000);
1297 env.trust(limit, A1, A2);
1300 env(pay(G1, A1, USD(1000)));
1301 env(pay(G1, A2, USD(1000)));
1306 env(pay(A1, G1, USD(1)));
1307 env(pay(A2, G1, USD(1)));
1311 env(pay(A1, A2, USD(1)));
1312 env(pay(A2, A1, USD(1)));
1320 env(pay(A1, G1, USD(1)));
1321 env(pay(G1, A1, USD(1)));
1328 env(pay(A2, A1, USD(1)));
1331 if (features[featureDeepFreeze])
1338 env(pay(A1, G1, USD(1)));
1339 env(pay(G1, A1, USD(1)));
1362 env(pay(A2, G1, USD(1)));
1363 env(pay(G1, A2, USD(1)));
1367 env(pay(A1, G1, USD(1)));
1370 env(pay(A1, A2, USD(1)));
1374 env(pay(G1, A1, USD(1)));
1378 if (features[featureDeepFreeze])
1385 env(pay(A2, G1, USD(1)));
1386 env(pay(G1, A2, USD(1)));
1390 env(pay(A1, G1, USD(1)));
1394 env(pay(G1, A1, USD(1)));
1405 testcase(
"Checks on frozen trust lines");
1407 using namespace test::jtx;
1408 Env env(*
this, features);
1413 auto const USD{G1[
"USD"]};
1415 env.fund(XRP(10000), G1, A1, A2);
1418 auto const limit = USD(10000);
1419 env.trust(limit, A1, A2);
1422 env(pay(G1, A1, USD(1000)));
1423 env(pay(G1, A2, USD(1000)));
1429 env(check::create(G1, A1, USD(10)));
1431 env(check::cash(A1, checkId, USD(10)));
1437 env(check::create(G1, A2, USD(10)));
1439 env(check::cash(A2, checkId, USD(10)));
1445 env(check::create(A1, G1, USD(10)));
1447 env(check::cash(G1, checkId, USD(10)));
1453 env(check::create(A1, A2, USD(10)));
1455 env(check::cash(A2, checkId, USD(10)));
1461 env(check::create(A2, G1, USD(10)));
1463 env(check::cash(G1, checkId, USD(10)));
1469 env(check::create(A2, A1, USD(10)));
1471 env(check::cash(A1, checkId, USD(10)));
1484 env(check::create(G1, A1, USD(10)));
1486 env(check::cash(A1, checkId, USD(10)), ter(
tecFROZEN));
1493 env(check::create(A2, A1, USD(10)));
1496 env(check::cash(A1, checkId, USD(10)), ter(
tecFROZEN));
1502 env(check::create(A1, G1, USD(10)), ter(
tecFROZEN));
1509 env(check::create(A1, A2, USD(10)), ter(
tecFROZEN));
1519 env(check::create(A1, G1, USD(10)));
1522 env(check::create(A1, A2, USD(10)));
1546 if (features[featureDeepFreeze])
1554 env(check::create(G1, A1, USD(10)));
1557 env(check::cash(A1, checkId, USD(10)), ter(
tecFROZEN));
1564 env(check::create(A2, A1, USD(10)));
1567 env(check::cash(A1, checkId, USD(10)), ter(
tecFROZEN));
1573 env(check::create(A1, G1, USD(10)), ter(
tecFROZEN));
1580 env(check::create(A1, A2, USD(10)), ter(
tecFROZEN));
1590 env(check::create(A1, G1, USD(10)));
1593 env(check::create(A1, A2, USD(10)));
1623 env(check::create(G1, A1, USD(10)), ter(
tecFROZEN));
1629 env(check::create(A2, A1, USD(10)), ter(
tecFROZEN));
1636 env(check::create(A1, G1, USD(10)));
1638 env(check::cash(G1, checkId, USD(10)));
1645 env(check::create(A1, A2, USD(10)));
1647 env(check::cash(A2, checkId, USD(10)));
1657 if (features[featureDeepFreeze])
1664 env(check::create(G1, A1, USD(10)), ter(
tecFROZEN));
1670 env(check::create(A2, A1, USD(10)), ter(
tecFROZEN));
1677 env(check::create(A1, G1, USD(10)));
1686 env(check::create(A1, A2, USD(10)));
1700 testcase(
"AMM payments on frozen trust lines");
1701 using namespace test::jtx;
1704 Env env(*
this, features);
1708 auto const USD{G1[
"USD"]};
1710 env.fund(XRP(10000), G1, A1, A2);
1713 env.trust(G1[
"USD"](10000), A1, A2);
1716 env(pay(G1, A1, USD(1000)));
1717 env(pay(G1, A2, USD(1000)));
1720 AMM ammG1(env, G1, XRP(1'000), USD(1'000));
1729 env(pay(A1, A2, USD(10)),
1736 env(pay(A1, A2, XRP(10)),
1744 env(pay(A2, A1, USD(10)),
1751 env(pay(A2, A1, XRP(10)),
1763 if (features[featureDeepFreeze])
1769 env(pay(A1, A2, USD(10)),
1776 env(pay(A1, A2, XRP(10)),
1784 env(pay(A2, A1, USD(10)),
1792 env(pay(A2, A1, XRP(10)),
1806 testcase(
"NFT offers on frozen trust lines");
1807 using namespace test::jtx;
1809 Env env(*
this, features);
1813 auto const USD{G1[
"USD"]};
1815 env.fund(XRP(10000), G1, A1, A2);
1818 auto const limit = USD(10000);
1819 env.trust(limit, A1, A2);
1822 env(pay(G1, A1, USD(1000)));
1823 env(pay(G1, A2, USD(1000)));
1833 env(token::acceptSellOffer(A1, sellOfferIndex));
1841 if (features[featureDeepFreeze])
1849 env(token::acceptSellOffer(A1, sellOfferIndex), ter(
tecFROZEN));
1863 env(token::acceptSellOffer(A2, sellOfferIndex),
1872 if (features[featureDeepFreeze])
1879 env(token::acceptSellOffer(A2, sellOfferIndex),
1894 env(token::acceptSellOffer(A1, sellOfferIndex));
1902 if (features[featureDeepFreeze])
1910 env(token::acceptSellOffer(A1, sellOfferIndex), ter(
tecFROZEN));
1924 env(token::acceptSellOffer(A2, sellOfferIndex));
1932 if (features[featureDeepFreeze])
1939 env(token::acceptSellOffer(A2, sellOfferIndex),
1952 size_t expectedArraySize,
1953 size_t expectedArrayIndex,
1954 bool modified =
true)
1956 using namespace test::jtx;
1957 auto const affected =
1959 if (!BEAST_EXPECT(checkArraySize(affected, expectedArraySize)))
1964 return affected[expectedArrayIndex][sfModifiedNode.fieldName]
1965 [sfFinalFields.fieldName][jss::Flags]
1969 return affected[expectedArrayIndex][sfCreatedNode.fieldName]
1970 [sfNewFields.fieldName][jss::Flags]
1987 using namespace test::jtx;
1992 uint256 const sellOfferIndex =
1994 env(token::createOffer(account, nftID, currency),
1998 return sellOfferIndex;
2020 using namespace test::jtx;
2021 auto const sa = supported_amendments();
2022 testAll(sa - featureFlowCross - featureDeepFreeze);
2023 testAll(sa - featureFlowCross);
2024 testAll(sa - featureDeepFreeze);
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 ...