22#include <xrpl/protocol/Feature.h>
23#include <xrpl/protocol/jss.h>
37 :
expry_{expiry.time_since_epoch().count()}
44 jt[sfExpiration.jsonName] =
expry_;
62 jt[sfSourceTag.jsonName] =
tag_;
80 jt[sfDestinationTag.jsonName] =
tag_;
106 if (sle && sle->getType() == ltCHECK)
107 result.push_back(sle);
125 Json::Value const meta = env.
rpc(
"tx", txHash)[jss::result][jss::meta];
128 if (!BEAST_EXPECT(meta.
isMember(sfDeliveredAmount.jsonName)))
134 meta[sfDeliveredAmount.jsonName] ==
145 using namespace test::jtx;
150 Env env{*
this, features - featureChecks};
152 env.fund(
XRP(1000), alice);
169 Env env{*
this, features};
171 env.fund(
XRP(1000), alice);
198 using namespace test::jtx;
203 IOU const USD{gw[
"USD"]};
205 Env env{*
this, features};
208 env.fund(startBalance, gw, alice, bob);
214 auto writeTwoChecks = [&env, &USD,
this](
231 env.require(
owners(from, fromOwnerCount + 2));
233 owners(to, to == from ? fromOwnerCount + 2 : toOwnerCount));
236 writeTwoChecks(alice, bob);
237 writeTwoChecks(gw, alice);
238 writeTwoChecks(alice, gw);
244 using namespace std::chrono_literals;
273 env(
signers(alice, 2, {{bogie, 1}, {demon, 1}}),
sig(alie));
283 XRPAmount const baseFeeDrops{env.current()->fees().base};
286 fee(3 * baseFeeDrops));
295 testcase(
"Create valid with disallow incoming");
297 using namespace test::jtx;
303 env.fund(
XRP(10000), alice);
306 auto const sle = env.le(alice);
307 uint32_t
flags = sle->getFlags();
314 IOU const USD{gw[
"USD"]};
319 env.fund(startBalance, gw, alice, bob);
326 auto writeTwoChecksDI = [&env, &USD,
this](
348 env.require(
owners(from, fromOwnerCount + 2));
350 owners(to, to == from ? fromOwnerCount + 2 : toOwnerCount));
357 env.require(
owners(from, fromOwnerCount));
358 env.require(
owners(to, to == from ? fromOwnerCount : toOwnerCount));
393 using namespace test::jtx;
396 Account const gwF{
"gatewayFrozen"};
399 IOU const USD{gw1[
"USD"]};
401 Env env{*
this, features};
404 env.fund(startBalance, gw1, gwF, alice, bob);
472 IOU const USF{gwF[
"USF"]};
488 env.trust(USD(1000), alice);
489 env.trust(USD(1000), bob);
491 env(
pay(gw1, alice, USD(25)));
492 env(
pay(gw1, bob, USD(25)));
506 env(
pay(bob, alice, USD(1)));
510 env(
pay(gw1, alice, USD(1)));
530 env(
pay(alice, bob, USD(1)));
552 using namespace std::chrono_literals;
558 env.fund(env.current()->fees().accountReserve(1) -
drops(1), cheri);
562 fee(
drops(env.current()->fees().base)),
566 env(
pay(bob, cheri,
drops(env.current()->fees().base + 1)));
579 using namespace test::jtx;
584 Env env{*
this, features};
586 XRPAmount const baseFeeDrops{env.current()->fees().base};
588 env.fund(startBalance, alice, bob);
595 env.require(
balance(alice, startBalance -
drops(baseFeeDrops)));
596 env.require(
balance(bob, startBalance));
614 env(
pay(env.master, alice,
XRP(10) +
drops(baseFeeDrops)));
615 env(
pay(bob, env.master,
XRP(10) -
drops(baseFeeDrops * 2)));
617 env.require(
balance(alice, startBalance));
618 env.require(
balance(bob, startBalance));
622 STAmount const reserve{env.current()->fees().accountReserve(0)};
624 startBalance - reserve -
drops(baseFeeDrops)};
643 env.require(
balance(alice, reserve));
645 bob, startBalance + checkAmount -
drops(baseFeeDrops * 3)));
652 env(
pay(env.master, alice, checkAmount +
drops(baseFeeDrops)));
653 env(
pay(bob, env.master, checkAmount -
drops(baseFeeDrops * 4)));
655 env.require(
balance(alice, startBalance));
656 env.require(
balance(bob, startBalance));
660 STAmount const reserve{env.current()->fees().accountReserve(0)};
662 startBalance - reserve -
drops(baseFeeDrops - 1)};
675 env.require(
balance(alice, reserve));
677 bob, startBalance + checkAmount -
drops(baseFeeDrops * 2 + 1)));
684 env(
pay(env.master, alice, checkAmount +
drops(baseFeeDrops - 1)));
686 bob, env.master, checkAmount -
drops(baseFeeDrops * 3 + 1)));
688 env.require(
balance(alice, startBalance));
689 env.require(
balance(bob, startBalance));
699 using namespace test::jtx;
701 bool const cashCheckMakesTrustLine =
702 features[featureCheckCashMakesTrustLine];
707 IOU const USD{gw[
"USD"]};
710 Env env{*
this, features};
712 env.fund(
XRP(1000), gw, alice, bob);
725 env(
trust(alice, USD(20)));
727 env(
pay(gw, alice, USD(9.5)));
734 env(
pay(gw, alice, USD(0.5)));
736 if (!cashCheckMakesTrustLine)
746 env(
trust(bob, USD(9.5)));
748 if (!cashCheckMakesTrustLine)
759 env(
trust(bob, USD(10.5)));
767 env.require(
balance(alice, USD(0)));
768 env.require(
balance(bob, USD(10)));
779 env(
pay(bob, alice, USD(7)));
792 env.require(
balance(alice, USD(2)));
793 env.require(
balance(bob, USD(8)));
812 env.require(
balance(alice, USD(0)));
813 env.require(
balance(bob, USD(10)));
823 env.require(
balance(alice, USD(0)));
824 env.require(
balance(bob, USD(10)));
830 if (cashCheckMakesTrustLine)
852 env.require(
balance(bob, USD(30)));
856 env(
pay(bob, gw, USD(20)));
862 env.require(
balance(alice, USD(0)));
863 env.require(
balance(bob, USD(10)));
871 Env env{*
this, features};
873 env.fund(
XRP(1000), gw, alice, bob);
876 env(
trust(alice, USD(20)));
877 env(
trust(bob, USD(20)));
879 env(
pay(gw, alice, USD(8)));
905 env.require(
balance(alice, USD(0)));
906 env.require(
balance(bob, USD(8)));
913 env(
pay(bob, alice, USD(7)));
920 env.require(
balance(alice, USD(0)));
921 env.require(
balance(bob, USD(8)));
928 env(
pay(bob, alice, USD(8)));
935 env.require(
balance(alice, USD(2)));
936 env.require(
balance(bob, USD(6)));
946 env.require(
balance(alice, USD(0)));
947 env.require(
balance(bob, USD(8)));
955 Env env(*
this, features);
957 env.
fund(
XRP(1000), gw, alice, bob);
961 env(
trust(alice, USD(20)));
963 env(
pay(gw, alice, USD(8)));
978 env(
trust(bob, USD(5)));
990 if (!cashCheckMakesTrustLine)
1007 STAmount const bobGot = cashCheckMakesTrustLine ? USD(7) : USD(5);
1021 for (
auto const& testFeatures :
1022 {features - featureMultiSignReserve,
1023 features | featureMultiSignReserve})
1025 Env env{*
this, testFeatures};
1027 env.
fund(
XRP(1000), gw, alice, bob);
1039 env(
trust(alice, USD(20)));
1040 env(
trust(bob, USD(20)));
1042 env(
pay(gw, alice, USD(8)));
1052 env(
signers(bob, 2, {{bogie, 1}, {demon, 1}}),
sig(bobby));
1057 int const signersCount = {
1058 testFeatures[featureMultiSignReserve] ? 1 : 4};
1059 BEAST_EXPECT(
ownerCount(env, bob) == signersCount + 1);
1064 env.require(
balance(alice, USD(7)));
1065 env.require(
balance(bob, USD(1)));
1069 BEAST_EXPECT(
ownerCount(env, bob) == signersCount + 1);
1072 XRPAmount const baseFeeDrops{env.current()->fees().base};
1075 fee(3 * baseFeeDrops));
1077 env.require(
balance(alice, USD(5)));
1078 env.require(
balance(bob, USD(3)));
1082 BEAST_EXPECT(
ownerCount(env, bob) == signersCount + 1);
1090 testcase(
"Cash with transfer fee");
1092 using namespace test::jtx;
1097 IOU const USD{gw[
"USD"]};
1099 Env env{*
this, features};
1101 env.fund(
XRP(1000), gw, alice, bob);
1104 env(
trust(alice, USD(1000)));
1105 env(
trust(bob, USD(1000)));
1107 env(
pay(gw, alice, USD(1000)));
1111 env(
rate(gw, 1.25));
1138 env.require(
balance(alice, USD(1000 - 125)));
1139 env.require(
balance(bob, USD(0 + 100)));
1151 env.require(
balance(alice, USD(1000 - 125 - 60)));
1152 env.require(
balance(bob, USD(0 + 100 + 50)));
1163 using namespace test::jtx;
1168 IOU const USD{gw[
"USD"]};
1170 Env env{*
this, features};
1172 env.fund(
XRP(1000), gw, alice, bob);
1175 env(
trust(alice, USD(1000)));
1176 env(
trust(bob, USD(1000)));
1178 env(
pay(gw, alice, USD(1000)));
1191 auto testNonIssuerQPay = [&env, &alice, &bob, &USD](
1194 auto const& inOrOut,
1198 STAmount const aliceStart{env.balance(alice, USD.issue()).value()};
1199 STAmount const bobStart{env.balance(bob, USD.issue()).value()};
1202 env(
trust(truster, iou(1000)), inOrOut(pct));
1205 env(
pay(alice, bob, USD(amount)),
sendmax(USD(10)));
1207 env.require(
balance(alice, aliceStart - USD(10)));
1208 env.require(
balance(bob, bobStart + USD(10)));
1212 env(
trust(truster, iou(1000)), inOrOut(0));
1216 auto testNonIssuerQCheck = [&env, &alice, &bob, &USD](
1219 auto const& inOrOut,
1223 STAmount const aliceStart{env.balance(alice, USD.issue()).value()};
1224 STAmount const bobStart{env.balance(bob, USD.issue()).value()};
1227 env(
trust(truster, iou(1000)), inOrOut(pct));
1236 env.require(
balance(alice, aliceStart - USD(10)));
1237 env.require(
balance(bob, bobStart + USD(10)));
1241 env(
trust(truster, iou(1000)), inOrOut(0));
1246 testNonIssuerQPay(alice, gw[
"USD"], qIn, 50, 10);
1247 testNonIssuerQCheck(alice, gw[
"USD"], qIn, 50, 10);
1250 testNonIssuerQPay(bob, gw[
"USD"], qIn, 50, 5);
1251 testNonIssuerQCheck(bob, gw[
"USD"], qIn, 50, 5);
1253 testNonIssuerQPay(gw, alice[
"USD"], qIn, 50, 10);
1254 testNonIssuerQCheck(gw, alice[
"USD"], qIn, 50, 10);
1256 testNonIssuerQPay(gw, bob[
"USD"], qIn, 50, 10);
1257 testNonIssuerQCheck(gw, bob[
"USD"], qIn, 50, 10);
1259 testNonIssuerQPay(alice, gw[
"USD"], qOut, 200, 10);
1260 testNonIssuerQCheck(alice, gw[
"USD"], qOut, 200, 10);
1262 testNonIssuerQPay(bob, gw[
"USD"], qOut, 200, 10);
1263 testNonIssuerQCheck(bob, gw[
"USD"], qOut, 200, 10);
1265 testNonIssuerQPay(gw, alice[
"USD"], qOut, 200, 10);
1266 testNonIssuerQCheck(gw, alice[
"USD"], qOut, 200, 10);
1268 testNonIssuerQPay(gw, bob[
"USD"], qOut, 200, 10);
1269 testNonIssuerQCheck(gw, bob[
"USD"], qOut, 200, 10);
1276 auto testIssuerQPay = [&env, &gw, &alice, &USD](
1279 auto const& inOrOut,
1287 STAmount const aliceStart{env.balance(alice, USD.issue()).value()};
1290 env(
trust(truster, iou(1000)), inOrOut(pct));
1294 env(
pay(alice, gw, USD(amt1)),
sendmax(USD(max1)));
1296 env.require(
balance(alice, aliceStart - USD(10)));
1299 env(
pay(gw, alice, USD(amt2)),
sendmax(USD(max2)));
1301 env.require(
balance(alice, aliceStart));
1305 env(
trust(truster, iou(1000)), inOrOut(0));
1309 auto testIssuerQCheck = [&env, &gw, &alice, &USD](
1312 auto const& inOrOut,
1320 STAmount const aliceStart{env.balance(alice, USD.issue()).value()};
1323 env(
trust(truster, iou(1000)), inOrOut(pct));
1333 env.require(
balance(alice, aliceStart - USD(10)));
1342 env.require(
balance(alice, aliceStart));
1346 env(
trust(truster, iou(1000)), inOrOut(0));
1352 testIssuerQPay(alice, gw[
"USD"], qIn, 50, 10, 10, 5, 10);
1353 testIssuerQCheck(alice, gw[
"USD"], qIn, 50, 10, 10, 5, 10);
1355 testIssuerQPay(gw, alice[
"USD"], qIn, 50, 10, 10, 10, 10);
1356 testIssuerQCheck(gw, alice[
"USD"], qIn, 50, 10, 10, 10, 10);
1358 testIssuerQPay(alice, gw[
"USD"], qOut, 200, 10, 10, 10, 10);
1359 testIssuerQCheck(alice, gw[
"USD"], qOut, 200, 10, 10, 10, 10);
1361 testIssuerQPay(gw, alice[
"USD"], qOut, 200, 10, 10, 10, 10);
1362 testIssuerQCheck(gw, alice[
"USD"], qOut, 200, 10, 10, 10, 10);
1371 using namespace test::jtx;
1377 IOU const USD{gw[
"USD"]};
1379 Env env(*
this, features);
1381 env.
fund(
XRP(1000), gw, alice, bob, zoe);
1385 env(
trust(alice, USD(20)));
1387 env(
pay(gw, alice, USD(20)));
1397 if (!features[featureCheckCashMakesTrustLine])
1408 env(
trust(bob, USD(20)));
1427 using namespace std::chrono_literals;
1457 auto failingCases = [&env, &gw, &alice, &bob](
1498 if (!amount.native())
1515 IOU const wrongCurrency{gw[
"EUR"]};
1517 badAmount.
setIssue(wrongCurrency.issue());
1524 IOU const wrongIssuer{alice[
"USD"]};
1526 badAmount.
setIssue(wrongIssuer.issue());
1541 failingCases(chkIdX,
XRP(10));
1542 failingCases(chkIdU, USD(20));
1560 env(
pay(bob, alice, USD(20)));
1670 using namespace test::jtx;
1676 IOU const USD{gw[
"USD"]};
1680 for (
auto const& testFeatures :
1681 {features - featureMultiSignReserve,
1682 features | featureMultiSignReserve})
1684 Env env{*
this, testFeatures};
1686 env.
fund(
XRP(1000), gw, alice, bob, zoe);
1704 using namespace std::chrono_literals;
1794 env(
regkey(alice, alie));
1799 env(
signers(alice, 2, {{bogie, 1}, {demon, 1}}),
sig(alie));
1804 int const signersCount{
1805 testFeatures[featureMultiSignReserve] ? 1 : 4};
1811 BEAST_EXPECT(
ownerCount(env, alice) == signersCount + 3);
1814 XRPAmount const baseFeeDrops{env.current()->fees().base};
1817 fee(3 * baseFeeDrops));
1820 BEAST_EXPECT(
ownerCount(env, alice) == signersCount + 2);
1826 BEAST_EXPECT(
ownerCount(env, alice) == signersCount + 1);
1831 BEAST_EXPECT(
ownerCount(env, alice) == signersCount + 0);
1841 using namespace test::jtx;
1846 Env env{*
this, features};
1848 env.fund(
XRP(1000), alice, bob);
1874 using namespace test::jtx;
1876 auto testEnable = [
this](
1884 Env env{*
this, features};
1886 env.fund(
XRP(1000), alice, bob);
1903 env.rpc(
"tx", txHash)[jss::result][jss::meta];
1906 meta.
isMember(sfDeliveredAmount.jsonName) == hasFields);
1907 BEAST_EXPECT(meta.
isMember(jss::delivered_amount) == hasFields);
1911 testEnable(features - fix1623,
false);
1912 testEnable(features,
true);
1920 using namespace test::jtx;
1925 IOU const USD{gw[
"USD"]};
1927 Env env{*
this, features};
1928 env.fund(
XRP(1000), gw, alice, bob);
1943 env.require(
owners(alice, 10));
1944 env.require(
owners(bob, 10));
1950 env.require(
owners(alice, 10));
1951 env.require(
owners(bob, 10));
1953 env.require(
tickets(alice, env.seq(alice) - aliceTicketSeq));
1954 BEAST_EXPECT(env.seq(alice) == aliceSeq);
1956 env.require(
tickets(bob, env.seq(bob) - bobTicketSeq));
1957 BEAST_EXPECT(env.seq(bob) == bobSeq);
1959 env(
pay(gw, alice, USD(900)));
1978 env.require(
owners(alice, 10));
1979 env.require(
tickets(alice, env.seq(alice) - aliceTicketSeq));
1981 BEAST_EXPECT(env.seq(alice) == aliceSeq);
1983 env.require(
owners(bob, 10));
1984 BEAST_EXPECT(env.seq(bob) == bobSeq);
1991 env.require(
owners(alice, 8));
1992 env.require(
tickets(alice, env.seq(alice) - aliceTicketSeq));
1994 BEAST_EXPECT(env.seq(alice) == aliceSeq);
1996 env.require(
owners(bob, 8));
1997 BEAST_EXPECT(env.seq(bob) == bobSeq);
2004 env.require(
owners(alice, 6));
2005 env.require(
tickets(alice, env.seq(alice) - aliceTicketSeq));
2007 BEAST_EXPECT(env.seq(alice) == aliceSeq);
2008 env.require(
balance(alice, USD(700)));
2010 env.require(
owners(bob, 6));
2011 BEAST_EXPECT(env.seq(bob) == bobSeq);
2012 env.require(
balance(bob, USD(200)));
2023 assert(features[featureCheckCashMakesTrustLine]);
2027 using namespace test::jtx;
2029 Env env{*
this, features};
2044 "Owner count mismatch",
2050 operator Account const()
const
2067 AccountOwns alice{*
this, env,
"alice", 0};
2068 AccountOwns bob{*
this, env,
"bob", 0};
2077 AccountOwns gw1{*
this, env,
"gw1", 0};
2085 IOU const CK8 = gw1[
"CK8"];
2086 gw1.verifyOwners(__LINE__);
2093 env.fund(
XRP(200), yui);
2103 alice.verifyOwners(__LINE__);
2107 env(
pay(env.master, yui,
XRP(51)));
2116 gw1.verifyOwners(__LINE__);
2131 auto cmpTrustLines = [
this, &env](
2134 IOU const& offerIou,
2135 IOU const& checkIou) {
2136 auto const offerLine =
2138 auto const checkLine =
2140 if (offerLine ==
nullptr || checkLine ==
nullptr)
2142 BEAST_EXPECT(offerLine ==
nullptr && checkLine ==
nullptr);
2148 BEAST_EXPECT(offerLine->at(sfFlags) == checkLine->at(sfFlags));
2153 [
this, offerLine, checkLine](
SF_AMOUNT const& sfield) {
2154 STAmount const offerAmount = offerLine->at(sfield);
2155 STAmount const checkAmount = checkLine->at(sfield);
2172 cmpReqAmount(sfBalance);
2173 cmpReqAmount(sfLowLimit);
2174 cmpReqAmount(sfHighLimit);
2179 [
this, offerLine, checkLine](
auto const& sfield) {
2182 offerLine->isFieldPresent(sfield) ==
2183 checkLine->isFieldPresent(sfield)))
2188 if (!offerLine->isFieldPresent(sfield))
2194 offerLine->at(sfield) == checkLine->at(sfield));
2196 cmpOptField(sfLowNode);
2197 cmpOptField(sfLowQualityIn);
2198 cmpOptField(sfLowQualityOut);
2200 cmpOptField(sfHighNode);
2201 cmpOptField(sfHighQualityIn);
2202 cmpOptField(sfHighQualityOut);
2210 AccountOwns gw1{*
this, env,
"gw1", 0};
2212 BEAST_EXPECT((*env.le(gw1))[sfFlags] == 0);
2213 BEAST_EXPECT((*env.le(alice))[sfFlags] == 0);
2214 BEAST_EXPECT((*env.le(bob))[sfFlags] == 0);
2217 IOU const OF1 = gw1[
"OF1"];
2222 env(
offer(alice, OF1(98),
XRP(98)));
2229 gw1.verifyOwners(__LINE__);
2232 alice.verifyOwners(__LINE__);
2235 IOU const CK1 = gw1[
"CK1"];
2249 gw1.verifyOwners(__LINE__);
2252 alice.verifyOwners(__LINE__);
2254 cmpTrustLines(gw1, alice, OF1, CK1);
2265 AccountOwns gw1{*
this, env,
"gw1", 0};
2266 IOU const OF1 = gw1[
"OF1"];
2267 env(
offer(alice,
XRP(97), OF1(97)));
2276 env.require(
balance(alice, OF1(1)));
2277 env.require(
balance(bob, OF1(97)));
2280 gw1.verifyOwners(__LINE__);
2281 alice.verifyOwners(__LINE__);
2282 bob.verifyOwners(__LINE__);
2290 IOU const CK1 = gw1[
"CK1"];
2309 gw1.verifyOwners(__LINE__);
2310 alice.verifyOwners(__LINE__);
2311 bob.verifyOwners(__LINE__);
2318 AccountOwns gw1{*
this, env,
"gw1", 0};
2323 IOU const OF2 = gw1[
"OF2"];
2328 env(
offer(alice, OF2(96),
XRP(96)));
2335 gw1.verifyOwners(__LINE__);
2338 alice.verifyOwners(__LINE__);
2341 IOU const CK2 = gw1[
"CK2"];
2355 gw1.verifyOwners(__LINE__);
2358 alice.verifyOwners(__LINE__);
2360 cmpTrustLines(gw1, alice, OF2, CK2);
2368 AccountOwns gw1{*
this, env,
"gw1", 0};
2369 IOU const OF2 = gw1[
"OF2"];
2370 env(
offer(alice,
XRP(95), OF2(95)));
2379 gw1.verifyOwners(__LINE__);
2380 alice.verifyOwners(__LINE__);
2381 bob.verifyOwners(__LINE__);
2384 IOU const CK2 = gw1[
"CK2"];
2396 gw1.verifyOwners(__LINE__);
2397 alice.verifyOwners(__LINE__);
2398 bob.verifyOwners(__LINE__);
2400 cmpTrustLines(alice, bob, OF2, CK2);
2411 AccountOwns gw1{*
this, env,
"gw1", 0};
2418 IOU const OF3 = gw1[
"OF3"];
2423 env(
offer(alice, OF3(94),
XRP(94)));
2430 gw1.verifyOwners(__LINE__);
2433 alice.verifyOwners(__LINE__);
2436 IOU const CK3 = gw1[
"CK3"];
2450 gw1.verifyOwners(__LINE__);
2453 alice.verifyOwners(__LINE__);
2455 cmpTrustLines(gw1, alice, OF3, CK3);
2463 AccountOwns gw1{*
this, env,
"gw1", 0};
2464 IOU const OF3 = gw1[
"OF3"];
2465 env(
offer(alice,
XRP(93), OF3(93)));
2474 gw1.verifyOwners(__LINE__);
2475 alice.verifyOwners(__LINE__);
2476 bob.verifyOwners(__LINE__);
2479 IOU const CK3 = gw1[
"CK3"];
2491 gw1.verifyOwners(__LINE__);
2492 alice.verifyOwners(__LINE__);
2493 bob.verifyOwners(__LINE__);
2495 cmpTrustLines(alice, bob, OF3, CK3);
2502 AccountOwns gw1{*
this, env,
"gw1", 0};
2507 IOU const OF4 = gw1[
"OF4"];
2516 gw1.verifyOwners(__LINE__);
2517 alice.verifyOwners(__LINE__);
2518 bob.verifyOwners(__LINE__);
2521 IOU const CK4 = gw1[
"CK4"];
2531 gw1.verifyOwners(__LINE__);
2532 alice.verifyOwners(__LINE__);
2533 bob.verifyOwners(__LINE__);
2548 AccountOwns gw1{*
this, env,
"gw1", 0};
2549 IOU const OF4 = gw1[
"OF4"];
2558 gw1.verifyOwners(__LINE__);
2559 alice.verifyOwners(__LINE__);
2560 bob.verifyOwners(__LINE__);
2563 IOU const CK4 = gw1[
"CK4"];
2573 gw1.verifyOwners(__LINE__);
2574 alice.verifyOwners(__LINE__);
2575 bob.verifyOwners(__LINE__);
2591 AccountOwns gw2{*
this, env,
"gw2", 0};
2592 env.fund(
XRP(5000), gw2);
2601 IOU const OF5 = gw2[
"OF5"];
2613 gw2.verifyOwners(__LINE__);
2614 alice.verifyOwners(__LINE__);
2615 bob.verifyOwners(__LINE__);
2621 gw2.verifyOwners(__LINE__);
2624 IOU const CK5 = gw2[
"CK5"];
2636 gw2.verifyOwners(__LINE__);
2637 alice.verifyOwners(__LINE__);
2638 bob.verifyOwners(__LINE__);
2651 gw2.verifyOwners(__LINE__);
2659 AccountOwns gw2{*
this, env,
"gw2", 0};
2660 IOU const OF5 = gw2[
"OF5"];
2668 gw2.verifyOwners(__LINE__);
2669 alice.verifyOwners(__LINE__);
2670 bob.verifyOwners(__LINE__);
2673 IOU const CK5 = gw2[
"CK5"];
2687 gw2.verifyOwners(__LINE__);
2688 alice.verifyOwners(__LINE__);
2689 bob.verifyOwners(__LINE__);
2722 using namespace test::jtx;
Value removeMember(char const *key)
Remove and return the named member.
bool isMember(char const *key) const
Return true if the object has a member named key.
testcase_t testcase
Memberspace for declaring test cases.
bool expect(Condition const &shouldBeTrue)
Evaluate a test condition.
void testCancelInvalid(FeatureBitset features)
void testCashXferFee(FeatureBitset features)
void testCashIOU(FeatureBitset features)
void testFix1623Enable(FeatureBitset features)
void testWithTickets(FeatureBitset features)
static std::vector< std::shared_ptr< SLE const > > checksOnAccount(test::jtx::Env &env, test::jtx::Account account)
void testCashXRP(FeatureBitset features)
void verifyDeliveredAmount(test::jtx::Env &env, STAmount const &amount)
void testEnabled(FeatureBitset features)
void testCashQuality(FeatureBitset features)
static uint256 getCheckIndex(AccountID const &account, std::uint32_t uSequence)
void testTrustLineCreation(FeatureBitset features)
FeatureBitset const disallowIncoming
void testCreateDisallowIncoming(FeatureBitset features)
void testCreateInvalid(FeatureBitset features)
void testCancelValid(FeatureBitset features)
void testCreateValid(FeatureBitset features)
void run() override
Runs the suite.
void testCashInvalid(FeatureBitset features)
void testWithFeats(FeatureBitset features)
A currency issued by an account.
Json::Value getJson(JsonOptions=JsonOptions::none) const override
int exponent() const noexcept
void setIssue(Asset const &asset)
Set the Issue for this amount.
bool negative() const noexcept
Issue const & issue() const
std::uint64_t mantissa() const noexcept
bool native() const noexcept
Immutable cryptographic account descriptor.
AccountID id() const
Returns the Account ID.
A transaction testing environment.
std::uint32_t seq(Account const &account) const
Returns the next sequence number on account.
void require(Args const &... args)
Check a set of requirements.
std::shared_ptr< STTx const > tx() const
Return the tx data for the last JTx.
std::shared_ptr< OpenView const > current() const
Returns the current ledger.
bool close(NetClock::time_point closeTime, std::optional< std::chrono::milliseconds > consensusDelay=std::nullopt)
Close and advance the ledger.
NetClock::time_point now()
Returns the current network time.
Json::Value rpc(unsigned apiVersion, std::unordered_map< std::string, std::string > const &headers, std::string const &cmd, Args &&... args)
Execute an RPC command.
void fund(bool setDefaultRipple, STAmount const &amount, Account const &account)
Converts to IOU Issue or STAmount.
ripple::Currency currency
Set DestinationTag on a JTx.
dest_tag(std::uint32_t tag)
void operator()(Env &, JTx &jt) const
void operator()(Env &, JTx &jt) const
expiration(NetClock::time_point const &expiry)
std::uint32_t const expry_
Set a multisignature on a JTx.
Match the number of items in the account's owner directory.
Sets the QualityIn on a trust JTx.
Sets the QualityOut on a trust JTx as a percentage.
Sets the SendMax on a JTx.
Set the regular signature on a JTx.
void operator()(Env &, JTx &jt) const
source_tag(std::uint32_t tag)
Set the expected result code for a JTx The test will fail if the code doesn't match.
Set a ticket sequence on a JTx.
Keylet line(AccountID const &id0, AccountID const &id1, Currency const ¤cy) noexcept
The index of a trust line for a given currency.
Keylet check(AccountID const &id, std::uint32_t seq) noexcept
A Check.
Json::Value create(A const &account, A const &dest, STAmount const &sendMax)
Create a check.
Json::Value cancel(jtx::Account const &dest, uint256 const &checkId)
Cancel a check.
Json::Value cash(jtx::Account const &dest, uint256 const &checkId, STAmount const &amount)
Cash a check requiring that a specific amount be delivered.
Json::Value create(Account const &account, std::uint32_t count)
Create one of more tickets.
std::uint32_t ownerCount(Env const &env, Account const &account)
Json::Value fclear(Account const &account, std::uint32_t off)
Remove account flag.
Json::Value regkey(Account const &account, disabled_t)
Disable the regular key.
Json::Value signers(Account const &account, std::uint32_t quorum, std::vector< signer > const &v)
PrettyAmount drops(Integer i)
Returns an XRP PrettyAmount, which is trivially convertible to STAmount.
Json::Value trust(Account const &account, STAmount const &amount, std::uint32_t flags)
Modify a trust line.
Json::Value fset(Account const &account, std::uint32_t on, std::uint32_t off=0)
Add and/or remove flag.
Json::Value pay(AccountID const &account, AccountID const &to, AnyAmount amount)
Create a payment.
Json::Value rate(Account const &account, double multiplier)
Set a transfer rate.
std::array< Account, 1+sizeof...(Args)> noripple(Account const &account, Args const &... args)
Designate accounts as no-ripple in Env::fund.
Json::Value offer(Account const &account, STAmount const &takerPays, STAmount const &takerGets, std::uint32_t flags)
Create an offer.
owner_count< ltTICKET > tickets
Match the number of tickets on the account.
XRP_t const XRP
Converts to XRP Issue or STAmount.
FeatureBitset supported_amendments()
Json::Value offer_cancel(Account const &account, std::uint32_t offerSeq)
Cancel an offer.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
base_uint< 160, detail::AccountIDTag > AccountID
A 160-bit unsigned that uniquely identifies an account.
constexpr std::uint32_t asfGlobalFreeze
Currency const & badCurrency()
We deliberately disallow the currency that looks like "XRP" because too many people were using it ins...
constexpr std::uint32_t asfDepositAuth
constexpr std::uint32_t asfRequireDest
@ lsfDisallowIncomingCheck
constexpr std::uint32_t tfImmediateOrCancel
constexpr std::uint32_t tfSetfAuth
constexpr std::uint32_t asfDefaultRipple
constexpr std::uint32_t asfDisallowIncomingCheck
constexpr std::uint32_t tfClearFreeze
@ tecNO_LINE_INSUF_RESERVE
@ tecINSUFFICIENT_RESERVE
void forEachItem(ReadView const &view, Keylet const &root, std::function< void(std::shared_ptr< SLE const > const &)> const &f)
Iterate all items in the given directory.
constexpr std::uint32_t asfRequireAuth
constexpr std::uint32_t tfSetFreeze
A field with a type known at compile time.
Execution context for applying a JSON transaction.
Type used to specify DeliverMin for cashing a check.