3#include <xrpld/app/tx/applySteps.h>
5#include <xrpl/ledger/Dir.h>
6#include <xrpl/ledger/Sandbox.h>
7#include <xrpl/protocol/Feature.h>
8#include <xrpl/protocol/Indexes.h>
9#include <xrpl/protocol/STAmount.h>
10#include <xrpl/protocol/TxFlags.h>
11#include <xrpl/protocol/jss.h>
28 if (sle && sle->isFieldPresent(sfLockedAmount))
29 return (*sle)[sfLockedAmount];
37 if (sle && sle->isFieldPresent(sfLockedAmount))
38 return (*sle)[sfLockedAmount];
49 params[jss::account] = account.human();
50 auto jrr = env.
rpc(
"json",
"gateway_balances",
to_string(params));
51 auto const result = jrr[jss::result];
52 auto const obligations =
54 if (obligations.isNull())
55 return {
STAmount(issue, 0), account.name()};
57 return {amount, account.name()};
67 params[jss::account] = account.human();
68 auto jrr = env.
rpc(
"json",
"gateway_balances",
to_string(params));
69 auto const result = jrr[jss::result];
72 return {
STAmount(issue, 0), account.name()};
74 return {amount, account.name()};
85 for (
bool const withTokenEscrow : {
false,
true})
88 withTokenEscrow ? features : features - featureTokenEscrow;
89 Env env{*
this, amend};
90 auto const baseFee = env.
current()->fees().base;
91 auto const alice =
Account(
"alice");
92 auto const bob =
Account(
"bob");
93 auto const gw =
Account{
"gateway"};
94 auto const USD = gw[
"USD"];
95 env.fund(
XRP(5000), alice, bob, gw);
98 env.trust(USD(10'000), alice, bob);
100 env(
pay(gw, alice, USD(5000)));
101 env(
pay(gw, bob, USD(5000)));
104 auto const createResult =
106 auto const finishResult =
109 auto const seq1 = env.seq(alice);
123 auto const seq2 = env.seq(alice);
135 for (
bool const withTokenEscrow : {
false,
true})
138 withTokenEscrow ? features : features - featureTokenEscrow;
139 Env env{*
this, amend};
140 auto const baseFee = env.
current()->fees().base;
141 auto const alice =
Account(
"alice");
142 auto const bob =
Account(
"bob");
143 auto const gw =
Account{
"gateway"};
144 auto const USD = gw[
"USD"];
145 env.fund(
XRP(5000), alice, bob, gw);
148 env.trust(USD(10'000), alice, bob);
150 env(
pay(gw, alice, USD(5000)));
151 env(
pay(gw, bob, USD(5000)));
154 auto const seq1 = env.seq(alice);
175 Env env{*
this, features};
176 auto const baseFee = env.current()->fees().base;
177 auto const alice =
Account(
"alice");
178 auto const bob =
Account(
"bob");
179 auto const gw =
Account{
"gateway"};
180 auto const USD = gw[
"USD"];
181 env.fund(
XRP(5000), alice, bob, gw);
184 env.trust(USD(10'000), alice, bob);
186 env(
pay(gw, alice, USD(5000)));
187 env(
pay(gw, bob, USD(5000)));
191 auto const seq1 = env.seq(alice);
199 auto const seq2 = env.seq(alice);
237 using namespace test::jtx;
242 Env env{*
this, features};
243 auto const alice =
Account(
"alice");
244 auto const bob =
Account(
"bob");
245 auto const gw =
Account{
"gateway"};
246 auto const USD = gw[
"USD"];
247 env.fund(
XRP(5000), alice, bob, gw);
258 Env env{*
this, features};
259 auto const baseFee = env.current()->fees().base;
260 auto const alice =
Account(
"alice");
261 auto const bob =
Account(
"bob");
262 auto const gw =
Account{
"gateway"};
263 auto const USD = gw[
"USD"];
264 env.fund(
XRP(5000), alice, bob, gw);
276 Env env{*
this, features};
277 auto const baseFee = env.current()->fees().base;
278 auto const alice =
Account(
"alice");
279 auto const bob =
Account(
"bob");
280 auto const gw =
Account{
"gateway"};
282 env.fund(
XRP(5000), alice, bob, gw);
297 using namespace test::jtx;
302 Env env{*
this, features};
303 auto const baseFee = env.current()->fees().base;
304 auto const alice =
Account(
"alice");
305 auto const bob =
Account(
"bob");
306 auto const gw =
Account{
"gateway"};
307 auto const USD = gw[
"USD"];
308 env.fund(
XRP(5000), alice, bob, gw);
320 Env env{*
this, features};
321 auto const baseFee = env.current()->fees().base;
322 auto const alice =
Account(
"alice");
323 auto const bob =
Account(
"bob");
324 auto const gw =
Account{
"gateway"};
325 auto const USD = gw[
"USD"];
326 env.fund(
XRP(5000), alice, bob);
340 Env env{*
this, features};
341 auto const baseFee = env.current()->fees().base;
342 auto const alice =
Account(
"alice");
343 auto const bob =
Account(
"bob");
344 auto const gw =
Account{
"gateway"};
345 auto const USD = gw[
"USD"];
346 env.fund(
XRP(5000), alice, bob, gw);
348 env.trust(USD(10'000), alice, bob);
350 env(
pay(gw, alice, USD(5000)));
351 env(
pay(gw, bob, USD(5000)));
364 Env env{*
this, features};
365 auto const baseFee = env.current()->fees().base;
366 auto const alice =
Account(
"alice");
367 auto const bob =
Account(
"bob");
368 auto const gw =
Account{
"gateway"};
369 auto const USD = gw[
"USD"];
370 env.fund(
XRP(5000), alice, bob, gw);
385 Env env{*
this, features};
386 auto const baseFee = env.current()->fees().base;
387 auto const alice =
Account(
"alice");
388 auto const bob =
Account(
"bob");
389 auto const gw =
Account{
"gateway"};
390 auto const USD = gw[
"USD"];
391 env.fund(
XRP(5000), alice, bob, gw);
395 env.trust(USD(10'000), alice, bob);
408 Env env{*
this, features};
409 auto const baseFee = env.current()->fees().base;
410 auto const alice =
Account(
"alice");
411 auto const bob =
Account(
"bob");
412 auto const gw =
Account{
"gateway"};
413 auto const USD = gw[
"USD"];
414 auto const aliceUSD = alice[
"USD"];
415 env.fund(
XRP(5000), alice, bob, gw);
420 env.trust(USD(10'000), alice, bob);
434 Env env{*
this, features};
435 auto const alice =
Account(
"alice");
436 auto const bob =
Account(
"bob");
437 auto const gw =
Account{
"gateway"};
438 auto const USD = gw[
"USD"];
439 auto const baseFee = env.current()->fees().base;
440 env.fund(
XRP(10'000), alice, bob, gw);
443 env(
trust(alice, USD(100'000)));
444 env(
trust(bob, USD(100'000)));
446 env(
pay(gw, alice, USD(10'000)));
447 env(
pay(gw, bob, USD(10'000)));
465 Env env{*
this, features};
466 auto const alice =
Account(
"alice");
467 auto const bob =
Account(
"bob");
468 auto const gw =
Account{
"gateway"};
469 auto const USD = gw[
"USD"];
470 auto const baseFee = env.current()->fees().base;
471 env.fund(
XRP(10'000), alice, bob, gw);
474 env(
trust(alice, USD(100'000)));
475 env(
trust(bob, USD(100'000)));
477 env(
pay(gw, alice, USD(10'000)));
478 env(
pay(gw, bob, USD(10'000)));
496 Env env{*
this, features};
497 auto const alice =
Account(
"alice");
498 auto const bob =
Account(
"bob");
499 auto const gw =
Account{
"gateway"};
500 auto const USD = gw[
"USD"];
501 auto const baseFee = env.current()->fees().base;
502 env.fund(
XRP(10'000), alice, bob, gw);
505 env(
trust(alice, USD(100'000)));
506 env(
trust(bob, USD(100'000)));
520 Env env{*
this, features};
521 auto const alice =
Account(
"alice");
522 auto const bob =
Account(
"bob");
523 auto const gw =
Account{
"gateway"};
524 auto const USD = gw[
"USD"];
525 auto const baseFee = env.current()->fees().base;
526 env.fund(
XRP(10'000), alice, bob, gw);
529 env(
trust(alice, USD(100'000)));
530 env(
trust(bob, USD(100'000)));
532 env(
pay(gw, alice, USD(10'000)));
533 env(
pay(gw, bob, USD(10'000)));
546 Env env{*
this, features};
547 auto const alice =
Account(
"alice");
548 auto const bob =
Account(
"bob");
549 auto const gw =
Account{
"gateway"};
550 auto const USD = gw[
"USD"];
551 auto const baseFee = env.current()->fees().base;
552 env.fund(
XRP(10'000), alice, bob, gw);
555 env.trust(USD(100000000000000000), alice);
556 env.trust(USD(100000000000000000), bob);
558 env(
pay(gw, alice, USD(10000000000000000)));
559 env(
pay(gw, bob, USD(1)));
576 using namespace test::jtx;
581 Env env{*
this, features};
582 auto const baseFee = env.current()->fees().base;
583 auto const alice =
Account(
"alice");
584 auto const bob =
Account(
"bob");
585 auto const gw =
Account{
"gateway"};
586 auto const USD = gw[
"USD"];
587 auto const aliceUSD = alice[
"USD"];
588 auto const bobUSD = bob[
"USD"];
589 env.fund(
XRP(5000), alice, bob, gw);
595 env.trust(USD(10'000), alice, bob);
597 env(
pay(gw, alice, USD(10'000)));
598 env(
pay(gw, bob, USD(10'000)));
601 auto const seq1 = env.seq(alice);
609 env(
pay(bob, gw, USD(10'000)));
611 env(
trust(bob, USD(0)));
614 env.trust(USD(10'000), bob);
628 Env env{*
this, features};
629 auto const baseFee = env.current()->fees().base;
630 auto const alice =
Account(
"alice");
631 auto const bob =
Account(
"bob");
632 auto const gw =
Account{
"gateway"};
633 auto const USD = gw[
"USD"];
634 env.fund(
XRP(5000), alice, bob, gw);
637 env.trust(USD(10'000), alice, bob);
639 env(
pay(gw, alice, USD(10'000)));
640 env(
pay(gw, bob, USD(10'000)));
643 auto const seq1 = env.seq(alice);
668 using namespace test::jtx;
673 Env env{*
this, features};
674 auto const baseFee = env.current()->fees().base;
675 auto const acctReserve = env.current()->fees().reserve;
676 auto const incReserve = env.current()->fees().increment;
677 auto const alice =
Account(
"alice");
678 auto const bob =
Account(
"bob");
679 auto const gw =
Account{
"gateway"};
680 auto const USD = gw[
"USD"];
681 env.fund(
XRP(5000), alice, gw);
682 env.fund(acctReserve + (incReserve - 1), bob);
686 env.trust(USD(10'000), alice);
688 env(
pay(gw, alice, USD(10'000)));
691 auto const seq1 = env.seq(alice);
710 Env env{*
this, features};
711 auto const baseFee = env.current()->fees().base;
712 auto const alice =
Account(
"alice");
713 auto const bob =
Account(
"bob");
714 auto const gw =
Account{
"gateway"};
715 auto const USD = gw[
"USD"];
716 env.fund(
XRP(5000), alice, bob, gw);
720 env.trust(USD(10'000), alice);
722 env(
pay(gw, alice, USD(10'000)));
725 auto const seq1 = env.seq(alice);
744 Env env{*
this, features};
745 auto const baseFee = env.current()->fees().base;
746 auto const alice =
Account(
"alice");
747 auto const bob =
Account(
"bob");
748 auto const gw =
Account{
"gateway"};
749 auto const USD = gw[
"USD"];
750 env.fund(
XRP(5000), alice, bob, gw);
754 env.trust(USD(1000), alice, bob);
756 env(
pay(gw, alice, USD(1000)));
759 auto const seq1 = env.seq(alice);
767 env.trust(USD(1), bob);
781 Env env{*
this, features};
782 auto const baseFee = env.current()->fees().base;
783 auto const alice =
Account(
"alice");
784 auto const bob =
Account(
"bob");
785 auto const gw =
Account{
"gateway"};
786 auto const USD = gw[
"USD"];
787 env.fund(
XRP(5000), alice, bob, gw);
791 env.trust(USD(1000), alice, bob);
793 env(
pay(gw, alice, USD(1000)));
796 auto const seq1 = env.seq(alice);
804 env.trust(USD(1), bob);
808 auto const bobPreLimit = env.limit(bob, USD);
818 BEAST_EXPECT(env.limit(bob, USD) == bobPreLimit);
826 using namespace test::jtx;
831 Env env{*
this, features};
832 auto const baseFee = env.current()->fees().base;
833 auto const alice =
Account(
"alice");
834 auto const bob =
Account(
"bob");
835 auto const gw =
Account{
"gateway"};
836 auto const USD = gw[
"USD"];
837 auto const aliceUSD = alice[
"USD"];
838 auto const bobUSD = bob[
"USD"];
839 env.fund(
XRP(5000), alice, bob, gw);
845 env.trust(USD(10'000), alice, bob);
847 env(
pay(gw, alice, USD(10'000)));
848 env(
pay(gw, bob, USD(10'000)));
851 auto const seq1 = env.seq(alice);
859 env(
pay(alice, gw, USD(9'999)));
861 env(
trust(alice, USD(0)));
864 env.trust(USD(10'000), alice);
883 Env env{*
this, features};
884 auto const baseFee = env.current()->fees().base;
885 auto const alice =
Account(
"alice");
886 auto const bob =
Account(
"bob");
887 auto const gw =
Account{
"gateway"};
888 auto const USD = gw[
"USD"];
889 env.fund(
XRP(5000), alice, bob, gw);
892 env.trust(USD(10'000), alice, bob);
894 env(
pay(gw, alice, USD(5'000)));
895 env(
pay(gw, bob, USD(5'000)));
898 auto const outstandingUSD = USD(10'000);
901 auto const seq1 = env.seq(alice);
903 auto const preAliceUSD = env.balance(alice, USD);
904 auto const preBobUSD = env.balance(bob, USD);
912 BEAST_EXPECT(env.balance(alice, USD) == preAliceUSD - USD(1'000));
913 BEAST_EXPECT(env.balance(bob, USD) == preBobUSD);
919 auto const preAliceUSD = env.balance(alice, USD);
920 auto const preBobUSD = env.balance(bob, USD);
928 BEAST_EXPECT(env.balance(alice, USD) == preAliceUSD);
929 BEAST_EXPECT(env.balance(bob, USD) == preBobUSD + USD(1'000));
935 auto const seq2 = env.seq(alice);
937 auto const preAliceUSD = env.balance(alice, USD);
938 auto const preBobUSD = env.balance(bob, USD);
947 BEAST_EXPECT(env.balance(alice, USD) == preAliceUSD - USD(1'000));
948 BEAST_EXPECT(env.balance(bob, USD) == preBobUSD);
954 auto const preAliceUSD = env.balance(alice, USD);
955 auto const preBobUSD = env.balance(bob, USD);
959 BEAST_EXPECT(env.balance(alice, USD) == preAliceUSD + USD(1'000));
960 BEAST_EXPECT(env.balance(bob, USD) == preBobUSD);
972 auto const alice =
Account(
"alice");
973 auto const bob =
Account(
"bob");
974 auto const carol =
Account(
"carol");
975 auto const gw =
Account{
"gateway"};
976 auto const USD = gw[
"USD"];
980 Env env{*
this, features};
981 env.fund(
XRP(5000), alice, bob, carol, gw);
984 env.trust(USD(10'000), alice, bob, carol);
986 env(
pay(gw, alice, USD(5000)));
987 env(
pay(gw, bob, USD(5000)));
988 env(
pay(gw, carol, USD(5000)));
990 auto const aseq = env.seq(alice);
991 auto const bseq = env.seq(bob);
997 (*env.meta())[sfTransactionResult] ==
1020 (*env.meta())[sfTransactionResult] ==
1045 (*env.meta())[sfTransactionResult] ==
1069 (*env.meta())[sfTransactionResult] ==
1086 Env env{*
this, features};
1087 env.fund(
XRP(5000), alice, bob, carol, gw);
1090 env.trust(USD(10'000), alice, bob, carol);
1092 env(
pay(gw, alice, USD(5000)));
1093 env(
pay(gw, bob, USD(5000)));
1094 env(
pay(gw, carol, USD(5000)));
1096 auto const aseq = env.seq(alice);
1097 auto const bseq = env.seq(bob);
1102 (*env.meta())[sfTransactionResult] ==
1109 (*env.meta())[sfTransactionResult] ==
1205 testcase(
"IOU Metadata to issuer");
1207 Env env{*
this, features};
1208 env.fund(
XRP(5000), alice, carol, gw);
1211 env.trust(USD(10'000), alice, carol);
1213 env(
pay(gw, alice, USD(5000)));
1214 env(
pay(gw, carol, USD(5000)));
1216 auto const aseq = env.seq(alice);
1222 (*env.meta())[sfTransactionResult] ==
1274 using namespace test::jtx;
1277 struct TestAccountData
1305 for (
auto const& t : tests)
1307 Env env{*
this, features};
1308 auto const baseFee = env.current()->fees().base;
1309 auto const USD = t.gw[
"USD"];
1310 env.fund(
XRP(5000), t.src, t.dst, t.gw);
1315 env.trust(USD(100'000), t.src, t.dst);
1317 env.trust(USD(100'000), t.src);
1320 env(
pay(t.gw, t.src, USD(10'000)));
1322 env(
pay(t.gw, t.dst, USD(10'000)));
1326 auto const seq1 = env.seq(t.src);
1327 auto const delta = USD(1'000);
1331 fee(baseFee * 150));
1335 auto const preSrc = env.balance(t.src, USD);
1336 auto const preDst = env.balance(t.dst, USD);
1341 fee(baseFee * 150));
1344 BEAST_EXPECT(env.balance(t.src, USD) == preSrc);
1345 BEAST_EXPECT(env.balance(t.dst, USD) == preDst + delta);
1353 using namespace test::jtx;
1356 struct TestAccountData
1365 auto const gw =
Account{
"gateway"};
1366 auto const alice =
Account{
"alice"};
1367 Env env{*
this, features};
1368 auto const baseFee = env.current()->fees().base;
1369 auto const USD = gw[
"USD"];
1370 env.fund(
XRP(5000), alice, gw);
1373 env.trust(USD(100'000), alice);
1376 env(
pay(gw, alice, USD(10'000)));
1400 for (
auto const& t : gwDstTests)
1402 Env env{*
this, features};
1403 auto const baseFee = env.current()->fees().base;
1404 auto const USD = t.dst[
"USD"];
1405 env.fund(
XRP(5000), t.dst, t.src);
1409 env.trust(USD(100'000), t.src);
1412 env(
pay(t.dst, t.src, USD(10'000)));
1416 auto const seq1 = env.seq(t.src);
1417 auto const preSrc = env.balance(t.src, USD);
1421 fee(baseFee * 150));
1428 fee(baseFee * 150));
1430 auto const preAmount = 10'000;
1431 BEAST_EXPECT(preSrc == USD(preAmount));
1432 auto const postAmount = 9000;
1433 BEAST_EXPECT(env.balance(t.src, USD) == USD(postAmount));
1434 BEAST_EXPECT(env.balance(t.dst, USD) == USD(0));
1439 auto const gw =
Account{
"gateway"};
1440 auto const USD = gw[
"USD"];
1441 Env env{*
this, features};
1442 auto const baseFee = env.current()->fees().base;
1443 env.fund(
XRP(5000), gw);
1461 using namespace test::jtx;
1464 auto const alice =
Account(
"alice");
1465 auto const bob =
Account(
"bob");
1466 auto const carol =
Account(
"carol");
1467 auto const gw =
Account{
"gateway"};
1468 auto const USD = gw[
"USD"];
1472 Env env{*
this, features};
1473 auto const baseFee = env.current()->fees().base;
1474 env.fund(
XRP(10'000), alice, bob, gw);
1476 env(
rate(gw, 1.25));
1478 env.trust(USD(100'000), alice);
1479 env.trust(USD(100'000), bob);
1481 env(
pay(gw, alice, USD(10'000)));
1482 env(
pay(gw, bob, USD(10'000)));
1486 auto const preAlice = env.balance(alice, USD);
1487 auto const seq1 = env.seq(alice);
1488 auto const delta = USD(125);
1492 fee(baseFee * 150));
1502 fee(baseFee * 150));
1505 BEAST_EXPECT(env.balance(alice, USD) == preAlice - delta);
1506 BEAST_EXPECT(env.balance(bob, USD) == USD(10'100));
1510 Env env{*
this, features};
1511 auto const baseFee = env.current()->fees().base;
1512 env.fund(
XRP(10'000), alice, bob, gw);
1514 env(
rate(gw, 1.25));
1516 env.trust(USD(100'000), alice);
1517 env.trust(USD(100'000), bob);
1519 env(
pay(gw, alice, USD(10'000)));
1520 env(
pay(gw, bob, USD(10'000)));
1524 auto const preAlice = env.balance(alice, USD);
1525 auto const seq1 = env.seq(alice);
1526 auto const delta = USD(125);
1530 fee(baseFee * 150));
1537 env(
rate(gw, 1.26));
1544 fee(baseFee * 150));
1547 BEAST_EXPECT(env.balance(alice, USD) == preAlice - delta);
1548 BEAST_EXPECT(env.balance(bob, USD) == USD(10'100));
1553 Env env{*
this, features};
1554 auto const baseFee = env.current()->fees().base;
1555 env.fund(
XRP(10'000), alice, bob, gw);
1557 env(
rate(gw, 1.25));
1559 env.trust(USD(100'000), alice);
1560 env.trust(USD(100'000), bob);
1562 env(
pay(gw, alice, USD(10'000)));
1563 env(
pay(gw, bob, USD(10'000)));
1567 auto const preAlice = env.balance(alice, USD);
1568 auto const seq1 = env.seq(alice);
1569 auto const delta = USD(125);
1573 fee(baseFee * 150));
1580 env(
rate(gw, 1.00));
1587 fee(baseFee * 150));
1590 BEAST_EXPECT(env.balance(alice, USD) == preAlice - delta);
1591 BEAST_EXPECT(env.balance(bob, USD) == USD(10125));
1596 Env env{*
this, features};
1597 auto const baseFee = env.current()->fees().base;
1598 env.fund(
XRP(10'000), alice, bob, gw);
1600 env(
rate(gw, 1.25));
1602 env.trust(USD(100'000), alice);
1603 env.trust(USD(100'000), bob);
1605 env(
pay(gw, alice, USD(10'000)));
1606 env(
pay(gw, bob, USD(10'000)));
1610 auto const preAlice = env.balance(alice, USD);
1611 auto const seq1 = env.seq(alice);
1612 auto const delta = USD(125);
1623 env(
rate(gw, 1.00));
1630 BEAST_EXPECT(env.balance(alice, USD) == preAlice);
1631 BEAST_EXPECT(env.balance(bob, USD) == USD(10000));
1639 using namespace test::jtx;
1642 auto const alice =
Account(
"alice");
1643 auto const bob =
Account(
"bob");
1644 auto const gw =
Account{
"gateway"};
1645 auto const USD = gw[
"USD"];
1649 Env env{*
this, features};
1650 auto const baseFee = env.current()->fees().base;
1651 env.fund(
XRP(1'000), alice, bob, gw);
1654 env.trust(USD(10'000), alice, bob);
1656 env(
pay(gw, alice, USD(1'000)));
1657 env(
pay(gw, bob, USD(1'000)));
1661 auto seq1 = env.seq(alice);
1662 auto const delta = USD(125);
1666 fee(baseFee * 150));
1670 auto const preBobLimit = env.limit(bob, USD);
1674 fee(baseFee * 150));
1676 auto const postBobLimit = env.limit(bob, USD);
1678 BEAST_EXPECT(postBobLimit == preBobLimit);
1686 using namespace test::jtx;
1689 auto const alice =
Account(
"alice");
1690 auto const bob =
Account(
"bob");
1691 auto const carol =
Account(
"carol");
1692 auto const gw =
Account{
"gateway"};
1693 auto const USD = gw[
"USD"];
1695 auto const aliceUSD = alice[
"USD"];
1696 auto const bobUSD = bob[
"USD"];
1698 Env env{*
this, features};
1699 auto const baseFee = env.current()->fees().base;
1700 env.fund(
XRP(1'000), alice, bob, gw);
1705 env(
trust(alice, USD(10'000)));
1706 env(
trust(bob, USD(10'000)));
1708 env(
pay(gw, alice, USD(1'000)));
1712 auto seq1 = env.seq(alice);
1713 auto const delta = USD(125);
1723 env(
trust(bob, USD(10'000)));
1725 env(
pay(gw, bob, USD(1'000)));
1729 seq1 = env.seq(alice);
1733 fee(baseFee * 150));
1740 fee(baseFee * 150));
1748 using namespace test::jtx;
1751 auto const alice =
Account(
"alice");
1752 auto const bob =
Account(
"bob");
1753 auto const carol =
Account(
"carol");
1754 auto const gw =
Account{
"gateway"};
1755 auto const USD = gw[
"USD"];
1759 Env env{*
this, features};
1760 auto const baseFee = env.current()->fees().base;
1761 env.fund(
XRP(10'000), alice, bob, gw);
1764 env.trust(USD(100'000), alice);
1765 env.trust(USD(100'000), bob);
1767 env(
pay(gw, alice, USD(10'000)));
1768 env(
pay(gw, bob, USD(10'000)));
1774 auto seq1 = env.seq(alice);
1775 auto const delta = USD(125);
1790 seq1 = env.seq(alice);
1794 fee(baseFee * 150));
1805 fee(baseFee * 150));
1813 seq1 = env.seq(alice);
1817 fee(baseFee * 150));
1832 Env env{*
this, features};
1833 auto const baseFee = env.current()->fees().base;
1834 env.fund(
XRP(10'000), alice, bob, gw);
1837 env(
trust(alice, USD(100'000)));
1838 env(
trust(bob, USD(100'000)));
1840 env(
pay(gw, alice, USD(10'000)));
1841 env(
pay(gw, bob, USD(10'000)));
1849 auto seq1 = env.seq(alice);
1850 auto const delta = USD(125);
1865 seq1 = env.seq(alice);
1869 fee(baseFee * 150));
1880 fee(baseFee * 150));
1889 seq1 = env.seq(alice);
1893 fee(baseFee * 150));
1908 Env env{*
this, features};
1909 auto const baseFee = env.current()->fees().base;
1910 env.fund(
XRP(10'000), alice, bob, gw);
1913 env(
trust(alice, USD(100'000)));
1914 env(
trust(bob, USD(100'000)));
1916 env(
pay(gw, alice, USD(10'000)));
1917 env(
pay(gw, bob, USD(10'000)));
1925 auto seq1 = env.seq(alice);
1926 auto const delta = USD(125);
1942 seq1 = env.seq(alice);
1946 fee(baseFee * 150));
1968 seq1 = env.seq(alice);
1972 fee(baseFee * 150));
1990 using namespace test::jtx;
1993 auto const alice =
Account(
"alice");
1994 auto const bob =
Account(
"bob");
1995 auto const carol =
Account(
"carol");
1996 auto const gw =
Account{
"gateway"};
1997 auto const USD = gw[
"USD"];
2001 Env env{*
this, features};
2002 auto const baseFee = env.current()->fees().base;
2003 env.fund(
XRP(10'000), alice, bob, gw);
2006 env.trust(USD(100'000), alice);
2007 env.trust(USD(100'000), bob);
2009 env(
pay(gw, alice, USD(10'000)));
2010 env(
pay(gw, bob, USD(10'000)));
2014 auto const delta = USD(1'000);
2018 fee(baseFee * 150));
2025 Env env{*
this, features};
2026 auto const baseFee = env.current()->fees().base;
2027 env.fund(
XRP(10'000), alice, bob, gw);
2030 env.trust(USD(100'000), alice);
2031 env.trust(USD(100'000), bob);
2033 env(
pay(gw, alice, USD(10'000)));
2034 env(
pay(gw, bob, USD(10'000)));
2037 auto const delta = USD(1'000);
2041 fee(baseFee * 150));
2057 using namespace test::jtx;
2060 auto const alice =
Account(
"alice");
2061 auto const bob =
Account(
"bob");
2062 auto const gw =
Account{
"gateway"};
2063 auto const USD = gw[
"USD"];
2067 Env env(*
this, features);
2068 auto const baseFee = env.
current()->fees().base;
2069 env.
fund(
XRP(10'000), alice, bob, gw);
2072 env.
trust(USD(100000000000000000), alice);
2073 env.
trust(USD(100000000000000000), bob);
2075 env(
pay(gw, alice, USD(10000000000000000)));
2076 env(
pay(gw, bob, USD(1)));
2087 auto const seq1 = env.
seq(alice);
2092 fee(baseFee * 150));
2099 fee(baseFee * 150));
2109 using namespace jtx;
2112 for (
bool const withTokenEscrow : {
false,
true})
2115 withTokenEscrow ? features : features - featureTokenEscrow;
2116 Env env{*
this, amend};
2117 auto const baseFee = env.
current()->fees().base;
2118 auto const alice =
Account(
"alice");
2119 auto const bob =
Account(
"bob");
2120 auto const gw =
Account(
"gw");
2121 env.fund(
XRP(5000), bob);
2123 MPTTester mptGw(env, gw, {.holders = {alice}});
2128 mptGw.authorize({.account = alice});
2129 auto const MPT = mptGw[
"MPT"];
2130 env(
pay(gw, alice,
MPT(10'000)));
2133 auto const createResult =
2135 auto const finishResult =
2138 auto const seq1 = env.seq(alice);
2151 auto const seq2 = env.seq(alice);
2168 using namespace test::jtx;
2171 for (
bool const withMPT : {
true,
false})
2174 withMPT ? features : features - featureMPTokensV1;
2175 Env env{*
this, amend};
2176 auto const baseFee = env.
current()->fees().base;
2177 auto const alice =
Account(
"alice");
2178 auto const bob =
Account(
"bob");
2179 auto const gw =
Account(
"gw");
2180 env.fund(
XRP(1'000), alice, bob, gw);
2184 jv[jss::Amount][jss::mpt_issuance_id] =
2185 "00000004A407AF5856CCF3C42619DAA925813FC955C72983";
2186 jv[jss::Amount][jss::value] =
"-1";
2199 Env env{*
this, features};
2200 auto const baseFee = env.current()->fees().base;
2201 auto const alice =
Account(
"alice");
2202 auto const bob =
Account(
"bob");
2203 auto const gw =
Account(
"gw");
2205 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
2210 mptGw.authorize({.account = alice});
2211 mptGw.authorize({.account = bob});
2212 auto const MPT = mptGw[
"MPT"];
2213 env(
pay(gw, alice,
MPT(10'000)));
2214 env(
pay(gw, bob,
MPT(10'000)));
2230 using namespace test::jtx;
2235 Env env{*
this, features};
2236 auto const baseFee = env.current()->fees().base;
2237 auto const alice =
Account(
"alice");
2238 auto const gw =
Account(
"gw");
2240 MPTTester mptGw(env, gw, {.holders = {alice}});
2245 mptGw.authorize({.account = alice});
2246 auto const MPT = mptGw[
"MPT"];
2247 env(
pay(gw, alice,
MPT(10'000)));
2260 Env env{*
this, features};
2261 auto const baseFee = env.current()->fees().base;
2262 auto const alice =
Account(
"alice");
2263 auto const bob =
Account(
"bob");
2264 auto const gw =
Account(
"gw");
2265 env.fund(
XRP(10'000), alice, bob, gw);
2269 alice.name(),
makeMptID(env.seq(alice), alice));
2271 jv[jss::Amount][jss::mpt_issuance_id] =
2272 "00000004A407AF5856CCF3C42619DAA925813FC955C72983";
2283 Env env{*
this, features};
2284 auto const baseFee = env.current()->fees().base;
2285 auto const alice =
Account(
"alice");
2286 auto const bob =
Account(
"bob");
2287 auto const gw =
Account(
"gw");
2289 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
2292 mptGw.authorize({.account = alice});
2293 mptGw.authorize({.account = bob});
2294 auto const MPT = mptGw[
"MPT"];
2295 env(
pay(gw, alice,
MPT(10'000)));
2296 env(
pay(gw, bob,
MPT(10'000)));
2309 Env env{*
this, features};
2310 auto const baseFee = env.current()->fees().base;
2311 auto const alice =
Account(
"alice");
2312 auto const bob =
Account(
"bob");
2313 auto const gw =
Account(
"gw");
2315 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
2320 auto const MPT = mptGw[
"MPT"];
2332 Env env{*
this, features};
2333 auto const baseFee = env.current()->fees().base;
2334 auto const alice =
Account(
"alice");
2335 auto const bob =
Account(
"bob");
2336 auto const gw =
Account(
"gw");
2338 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
2344 mptGw.authorize({.account = alice});
2345 mptGw.authorize({.account = gw, .holder = alice});
2346 auto const MPT = mptGw[
"MPT"];
2347 env(
pay(gw, alice,
MPT(10'000)));
2364 Env env{*
this, features};
2365 auto const baseFee = env.current()->fees().base;
2366 auto const alice =
Account(
"alice");
2367 auto const bob =
Account(
"bob");
2368 auto const gw =
Account(
"gw");
2370 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
2376 mptGw.authorize({.account = alice});
2377 mptGw.authorize({.account = gw, .holder = alice});
2378 mptGw.authorize({.account = bob});
2379 mptGw.authorize({.account = gw, .holder = bob});
2380 auto const MPT = mptGw[
"MPT"];
2381 env(
pay(gw, alice,
MPT(10'000)));
2382 env(
pay(gw, bob,
MPT(10'000)));
2399 Env env{*
this, features};
2400 auto const baseFee = env.current()->fees().base;
2401 auto const alice =
Account(
"alice");
2402 auto const bob =
Account(
"bob");
2403 auto const gw =
Account(
"gw");
2405 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
2410 mptGw.authorize({.account = alice});
2411 mptGw.authorize({.account = bob});
2412 auto const MPT = mptGw[
"MPT"];
2413 env(
pay(gw, alice,
MPT(10'000)));
2414 env(
pay(gw, bob,
MPT(10'000)));
2418 mptGw.set({.account = gw, .holder = alice, .flags =
tfMPTLock});
2430 Env env{*
this, features};
2431 auto const baseFee = env.current()->fees().base;
2432 auto const alice =
Account(
"alice");
2433 auto const bob =
Account(
"bob");
2434 auto const gw =
Account(
"gw");
2436 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
2441 mptGw.authorize({.account = alice});
2442 mptGw.authorize({.account = bob});
2443 auto const MPT = mptGw[
"MPT"];
2444 env(
pay(gw, alice,
MPT(10'000)));
2445 env(
pay(gw, bob,
MPT(10'000)));
2449 mptGw.set({.account = gw, .holder = bob, .flags =
tfMPTLock});
2461 Env env{*
this, features};
2462 auto const baseFee = env.current()->fees().base;
2463 auto const alice =
Account(
"alice");
2464 auto const bob =
Account(
"bob");
2465 auto const gw =
Account(
"gw");
2467 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
2470 mptGw.authorize({.account = alice});
2471 mptGw.authorize({.account = bob});
2472 auto const MPT = mptGw[
"MPT"];
2473 env(
pay(gw, alice,
MPT(10'000)));
2474 env(
pay(gw, bob,
MPT(10'000)));
2487 Env env{*
this, features};
2488 auto const baseFee = env.current()->fees().base;
2489 auto const alice =
Account(
"alice");
2490 auto const bob =
Account(
"bob");
2491 auto const gw =
Account(
"gw");
2493 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
2498 mptGw.authorize({.account = alice});
2499 mptGw.authorize({.account = bob});
2500 auto const MPT = mptGw[
"MPT"];
2501 env(
pay(gw, bob,
MPT(10)));
2514 Env env{*
this, features};
2515 auto const baseFee = env.current()->fees().base;
2516 auto const alice =
Account(
"alice");
2517 auto const bob =
Account(
"bob");
2518 auto const gw =
Account(
"gw");
2520 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
2525 mptGw.authorize({.account = alice});
2526 mptGw.authorize({.account = bob});
2527 auto const MPT = mptGw[
"MPT"];
2528 env(
pay(gw, alice,
MPT(10)));
2529 env(
pay(gw, bob,
MPT(10)));
2545 using namespace test::jtx;
2550 Env env{*
this, features};
2551 auto const baseFee = env.current()->fees().base;
2552 auto const alice =
Account(
"alice");
2553 auto const bob =
Account(
"bob");
2554 auto const gw =
Account(
"gw");
2556 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
2562 mptGw.authorize({.account = alice});
2563 mptGw.authorize({.account = gw, .holder = alice});
2564 mptGw.authorize({.account = bob});
2565 mptGw.authorize({.account = gw, .holder = bob});
2566 auto const MPT = mptGw[
"MPT"];
2567 env(
pay(gw, alice,
MPT(10'000)));
2568 env(
pay(gw, bob,
MPT(10'000)));
2571 auto const seq1 = env.seq(alice);
2593 Env env{*
this, features};
2594 auto const baseFee = env.current()->fees().base;
2595 auto const alice =
Account(
"alice");
2596 auto const bob =
Account(
"bob");
2597 env.fund(
XRP(10'000), alice, bob);
2600 auto const seq1 = env.seq(alice);
2601 env.app().openLedger().modify(
2609 sleNew->setAccountID(sfDestination, bob);
2610 sleNew->setFieldAmount(sfAmount, amt);
2626 Env env{*
this, features};
2627 auto const baseFee = env.current()->fees().base;
2628 auto const alice =
Account(
"alice");
2629 auto const bob =
Account(
"bob");
2630 auto const gw =
Account(
"gw");
2632 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
2637 mptGw.authorize({.account = alice});
2638 mptGw.authorize({.account = bob});
2639 auto const MPT = mptGw[
"MPT"];
2640 env(
pay(gw, alice,
MPT(10'000)));
2641 env(
pay(gw, bob,
MPT(10'000)));
2644 auto const seq1 = env.seq(alice);
2653 mptGw.set({.account = gw, .holder = bob, .flags =
tfMPTLock});
2668 using namespace test::jtx;
2673 Env env{*
this, features};
2674 auto const baseFee = env.current()->fees().base;
2675 auto const acctReserve = env.current()->fees().reserve;
2676 auto const incReserve = env.current()->fees().increment;
2678 auto const alice =
Account(
"alice");
2679 auto const bob =
Account(
"bob");
2680 auto const gw =
Account(
"gw");
2681 env.fund(acctReserve + (incReserve - 1), bob);
2684 MPTTester mptGw(env, gw, {.holders = {alice}});
2689 mptGw.authorize({.account = alice});
2690 auto const MPT = mptGw[
"MPT"];
2691 env(
pay(gw, alice,
MPT(10'000)));
2694 auto const seq1 = env.seq(alice);
2712 Env env{*
this, features};
2713 auto const baseFee = env.current()->fees().base;
2714 auto const alice =
Account(
"alice");
2715 auto const bob =
Account(
"bob");
2716 auto const gw =
Account(
"gw");
2717 env.fund(
XRP(10'000), bob);
2720 MPTTester mptGw(env, gw, {.holders = {alice}});
2725 mptGw.authorize({.account = alice});
2726 auto const MPT = mptGw[
"MPT"];
2727 env(
pay(gw, alice,
MPT(10'000)));
2730 auto const seq1 = env.seq(alice);
2748 Env env{*
this, features};
2749 auto const baseFee = env.current()->fees().base;
2750 auto const alice =
Account(
"alice");
2751 auto const bob =
Account(
"bob");
2752 auto const carol =
Account(
"carol");
2753 auto const gw =
Account(
"gw");
2754 env.fund(
XRP(10'000), bob, carol);
2757 MPTTester mptGw(env, gw, {.holders = {alice}});
2762 mptGw.authorize({.account = alice});
2763 auto const MPT = mptGw[
"MPT"];
2764 env(
pay(gw, alice,
MPT(10'000)));
2767 auto const seq1 = env.seq(alice);
2788 using namespace test::jtx;
2793 Env env{*
this, features};
2794 auto const baseFee = env.current()->fees().base;
2795 auto const alice =
Account(
"alice");
2796 auto const bob =
Account(
"bob");
2797 auto const gw =
Account(
"gw");
2799 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
2805 mptGw.authorize({.account = alice});
2806 mptGw.authorize({.account = gw, .holder = alice});
2807 mptGw.authorize({.account = bob});
2808 mptGw.authorize({.account = gw, .holder = bob});
2809 auto const MPT = mptGw[
"MPT"];
2810 env(
pay(gw, alice,
MPT(10'000)));
2811 env(
pay(gw, bob,
MPT(10'000)));
2814 auto const seq1 = env.seq(alice);
2832 Env env{*
this, features};
2833 auto const baseFee = env.current()->fees().base;
2834 auto const alice =
Account(
"alice");
2835 auto const bob =
Account(
"bob");
2836 env.fund(
XRP(10'000), alice, bob);
2838 auto const seq1 = env.seq(alice);
2839 env.app().openLedger().modify(
2847 sleNew->setAccountID(sfDestination, bob);
2848 sleNew->setFieldAmount(sfAmount, amt);
2866 using namespace jtx;
2869 Env env{*
this, features};
2870 auto const baseFee = env.current()->fees().base;
2871 auto const alice =
Account(
"alice");
2872 auto const bob =
Account(
"bob");
2873 auto const carol =
Account(
"carol");
2874 auto const gw =
Account(
"gw");
2875 env.fund(
XRP(5000), bob);
2877 MPTTester mptGw(env, gw, {.holders = {alice, carol}});
2882 mptGw.authorize({.account = alice});
2883 mptGw.authorize({.account = carol});
2884 auto const MPT = mptGw[
"MPT"];
2885 env(
pay(gw, alice,
MPT(10'000)));
2886 env(
pay(gw, carol,
MPT(10'000)));
2889 auto outstandingMPT = env.balance(gw,
MPT);
2892 auto const seq1 = env.seq(alice);
2894 auto const preAliceMPT = env.balance(alice,
MPT);
2895 auto const preBobMPT = env.balance(bob,
MPT);
2903 BEAST_EXPECT(env.balance(alice,
MPT) == preAliceMPT -
MPT(1'000));
2905 BEAST_EXPECT(env.balance(bob,
MPT) == preBobMPT);
2907 BEAST_EXPECT(env.balance(gw,
MPT) == outstandingMPT);
2911 auto const preAliceMPT = env.balance(alice,
MPT);
2912 auto const preBobMPT = env.balance(bob,
MPT);
2920 BEAST_EXPECT(env.balance(alice,
MPT) == preAliceMPT);
2922 BEAST_EXPECT(env.balance(bob,
MPT) == preBobMPT +
MPT(1'000));
2924 BEAST_EXPECT(env.balance(gw,
MPT) == outstandingMPT);
2929 auto const seq2 = env.seq(alice);
2931 auto const preAliceMPT = env.balance(alice,
MPT);
2932 auto const preBobMPT = env.balance(bob,
MPT);
2941 BEAST_EXPECT(env.balance(alice,
MPT) == preAliceMPT -
MPT(1'000));
2943 BEAST_EXPECT(env.balance(bob,
MPT) == preBobMPT);
2945 BEAST_EXPECT(env.balance(gw,
MPT) == outstandingMPT);
2949 auto const preAliceMPT = env.balance(alice,
MPT);
2950 auto const preBobMPT = env.balance(bob,
MPT);
2954 BEAST_EXPECT(env.balance(alice,
MPT) == preAliceMPT +
MPT(1'000));
2956 BEAST_EXPECT(env.balance(bob,
MPT) == preBobMPT);
2958 BEAST_EXPECT(env.balance(gw,
MPT) == outstandingMPT);
2964 auto const seq = env.
seq(alice);
2965 auto const preAliceMPT = env.balance(alice,
MPT);
2973 BEAST_EXPECT(env.balance(alice,
MPT) == preAliceMPT -
MPT(1'000));
2975 BEAST_EXPECT(env.balance(gw,
MPT) == outstandingMPT);
2985 BEAST_EXPECT(env.balance(alice,
MPT) == preAliceMPT);
2987 BEAST_EXPECT(env.balance(gw,
MPT) == outstandingMPT);
2993 auto const seq = env.
seq(alice);
2994 auto const preAliceMPT = env.balance(alice,
MPT);
3003 BEAST_EXPECT(env.balance(alice,
MPT) == preAliceMPT -
MPT(1'000));
3005 BEAST_EXPECT(env.balance(gw,
MPT) == outstandingMPT);
3011 BEAST_EXPECT(env.balance(alice,
MPT) == preAliceMPT);
3013 BEAST_EXPECT(env.balance(gw,
MPT) == outstandingMPT);
3019 auto const preAliceMPT = env.balance(alice,
MPT);
3020 auto const preBobMPT = env.balance(bob,
MPT);
3021 auto const preCarolMPT = env.balance(carol,
MPT);
3036 BEAST_EXPECT(env.balance(alice,
MPT) == preAliceMPT -
MPT(1'000));
3038 BEAST_EXPECT(env.balance(bob,
MPT) == preBobMPT);
3040 BEAST_EXPECT(env.balance(carol,
MPT) == preCarolMPT -
MPT(1'000));
3042 BEAST_EXPECT(env.balance(gw,
MPT) == outstandingMPT);
3048 Env env{*
this, features};
3049 auto const baseFee = env.current()->fees().base;
3050 auto const alice =
Account(
"alice");
3051 auto const bob =
Account(
"bob");
3052 auto const gw =
Account(
"gw");
3054 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
3059 mptGw.authorize({.account = alice});
3060 mptGw.authorize({.account = bob});
3061 auto const MPT = mptGw[
"MPT"];
3065 auto const preAliceMPT = env.balance(alice,
MPT);
3066 auto const preBobMPT = env.balance(bob,
MPT);
3067 auto const outstandingMPT = env.balance(gw,
MPT);
3069 auto const seq1 = env.seq(alice);
3073 fee(baseFee * 150));
3076 BEAST_EXPECT(env.balance(alice,
MPT) == preAliceMPT -
MPT(1));
3078 BEAST_EXPECT(env.balance(bob,
MPT) == preBobMPT);
3080 BEAST_EXPECT(env.balance(gw,
MPT) == outstandingMPT);
3090 BEAST_EXPECT(env.balance(alice,
MPT) == preAliceMPT -
MPT(1));
3093 ->isFieldPresent(sfLockedAmount));
3094 BEAST_EXPECT(env.balance(bob,
MPT) == preBobMPT +
MPT(1));
3096 BEAST_EXPECT(env.balance(gw,
MPT) == outstandingMPT);
3099 ->isFieldPresent(sfLockedAmount));
3104 Env env{*
this, features};
3105 auto const baseFee = env.current()->fees().base;
3106 auto const alice =
Account(
"alice");
3107 auto const bob =
Account(
"bob");
3108 auto const gw =
Account(
"gw");
3110 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
3115 mptGw.authorize({.account = alice});
3116 mptGw.authorize({.account = bob});
3117 auto const MPT = mptGw[
"MPT"];
3121 auto const preAliceMPT = env.balance(alice,
MPT);
3122 auto const preBobMPT = env.balance(bob,
MPT);
3123 auto const outstandingMPT = env.balance(gw,
MPT);
3126 auto const seq1 = env.seq(alice);
3130 fee(baseFee * 150));
3134 auto const seq2 = env.seq(alice);
3138 fee(baseFee * 150));
3144 BEAST_EXPECT(env.balance(bob,
MPT) == preBobMPT);
3146 BEAST_EXPECT(env.balance(gw,
MPT) == outstandingMPT);
3169 BEAST_EXPECT(env.balance(gw,
MPT) == outstandingMPT);
3177 using namespace jtx;
3180 auto const alice =
Account(
"alice");
3181 auto const bob =
Account(
"bob");
3182 auto const carol =
Account(
"carol");
3183 auto const gw =
Account{
"gateway"};
3187 Env env{*
this, features};
3188 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
3193 mptGw.authorize({.account = alice});
3194 mptGw.authorize({.account = bob});
3195 auto const MPT = mptGw[
"MPT"];
3196 env(
pay(gw, alice,
MPT(10'000)));
3197 env(
pay(gw, bob,
MPT(10'000)));
3199 auto const aseq = env.seq(alice);
3200 auto const bseq = env.seq(bob);
3206 (*env.meta())[sfTransactionResult] ==
3229 (*env.meta())[sfTransactionResult] ==
3247 (*env.meta())[sfTransactionResult] ==
3266 (*env.meta())[sfTransactionResult] ==
3279 Env env{*
this, features};
3280 MPTTester mptGw(env, gw, {.holders = {alice, bob, carol}});
3285 mptGw.authorize({.account = alice});
3286 mptGw.authorize({.account = bob});
3287 mptGw.authorize({.account = carol});
3288 auto const MPT = mptGw[
"MPT"];
3289 env(
pay(gw, alice,
MPT(10'000)));
3290 env(
pay(gw, bob,
MPT(10'000)));
3291 env(
pay(gw, carol,
MPT(10'000)));
3293 auto const aseq = env.seq(alice);
3294 auto const bseq = env.seq(bob);
3299 (*env.meta())[sfTransactionResult] ==
3306 (*env.meta())[sfTransactionResult] ==
3385 using namespace test::jtx;
3390 Env env{*
this, features};
3391 auto const baseFee = env.current()->fees().base;
3392 auto const alice =
Account(
"alice");
3393 auto const gw =
Account(
"gw");
3395 MPTTester mptGw(env, gw, {.holders = {alice}});
3400 mptGw.authorize({.account = alice});
3401 auto const MPT = mptGw[
"MPT"];
3402 env(
pay(gw, alice,
MPT(10'000)));
3406 auto const seq1 = env.seq(alice);
3407 auto const preAliceMPT = env.balance(alice,
MPT);
3408 auto const preOutstanding = env.balance(gw,
MPT);
3410 BEAST_EXPECT(preOutstanding ==
MPT(-10'000));
3411 BEAST_EXPECT(preEscrowed == 0);
3416 fee(baseFee * 150));
3419 BEAST_EXPECT(env.balance(alice,
MPT) == preAliceMPT -
MPT(1'000));
3421 BEAST_EXPECT(env.balance(gw,
MPT) == preOutstanding);
3428 fee(baseFee * 150));
3431 BEAST_EXPECT(env.balance(alice,
MPT) == preAliceMPT -
MPT(1'000));
3433 BEAST_EXPECT(env.balance(gw,
MPT) == preOutstanding +
MPT(1'000));
3442 using namespace test::jtx;
3445 auto const alice =
Account(
"alice");
3446 auto const bob =
Account(
"bob");
3447 auto const carol =
Account(
"carol");
3448 auto const gw =
Account{
"gateway"};
3449 auto const USD = gw[
"USD"];
3453 Env env{*
this, features};
3454 auto const baseFee = env.current()->fees().base;
3455 auto const alice =
Account(
"alice");
3456 auto const bob =
Account(
"bob");
3457 auto const gw =
Account(
"gw");
3459 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
3461 {.transferFee = 25000,
3465 mptGw.authorize({.account = alice});
3466 mptGw.authorize({.account = bob});
3467 auto const MPT = mptGw[
"MPT"];
3468 env(
pay(gw, alice,
MPT(10'000)));
3469 env(
pay(gw, bob,
MPT(10'000)));
3473 auto const preAlice = env.balance(alice,
MPT);
3474 auto const seq1 = env.seq(alice);
3475 auto const delta =
MPT(125);
3479 fee(baseFee * 150));
3487 BEAST_EXPECT(env.balance(gw,
MPT) ==
MPT(-20'000));
3493 fee(baseFee * 150));
3496 BEAST_EXPECT(env.balance(alice,
MPT) == preAlice - delta);
3497 BEAST_EXPECT(env.balance(bob,
MPT) ==
MPT(10'100));
3499 auto const escrowedWithFix =
3500 env.current()->rules().enabled(fixTokenEscrowV1) ? 0 : 25;
3501 auto const outstandingWithFix =
3502 env.current()->rules().enabled(fixTokenEscrowV1) ?
MPT(19'975)
3506 BEAST_EXPECT(env.balance(gw,
MPT) == -outstandingWithFix);
3511 Env env{*
this, features};
3512 auto const baseFee = env.current()->fees().base;
3513 auto const alice =
Account(
"alice");
3514 auto const bob =
Account(
"bob");
3515 auto const gw =
Account(
"gw");
3517 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
3519 {.transferFee = 25000,
3523 mptGw.authorize({.account = alice});
3524 mptGw.authorize({.account = bob});
3525 auto const MPT = mptGw[
"MPT"];
3526 env(
pay(gw, alice,
MPT(10'000)));
3527 env(
pay(gw, bob,
MPT(10'000)));
3531 auto const preAlice = env.balance(alice,
MPT);
3532 auto const preBob = env.balance(bob,
MPT);
3533 auto const seq1 = env.seq(alice);
3534 auto const delta =
MPT(125);
3539 fee(baseFee * 150));
3549 BEAST_EXPECT(env.balance(alice,
MPT) == preAlice);
3550 BEAST_EXPECT(env.balance(bob,
MPT) == preBob);
3551 BEAST_EXPECT(env.balance(gw,
MPT) ==
MPT(-20'000));
3558 Env env{*
this, features};
3559 auto const baseFee = env.current()->fees().base;
3560 auto const alice =
Account(
"alice");
3561 auto const bob =
Account(
"bob");
3562 auto const gw =
Account(
"gw");
3564 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
3566 {.transferFee = 25000,
3570 mptGw.authorize({.account = alice});
3571 mptGw.authorize({.account = bob});
3572 auto const MPT = mptGw[
"MPT"];
3573 env(
pay(gw, alice,
MPT(10'000)));
3574 env(
pay(gw, bob,
MPT(10'000)));
3578 auto const preAlice = env.balance(alice,
MPT);
3579 auto const seq1 = env.seq(alice);
3580 auto const delta =
MPT(125);
3584 fee(baseFee * 150));
3592 BEAST_EXPECT(env.balance(gw,
MPT) ==
MPT(-20'000));
3598 fee(baseFee * 150));
3601 BEAST_EXPECT(env.balance(alice,
MPT) == preAlice - delta);
3604 BEAST_EXPECT(env.balance(gw,
MPT) ==
MPT(-19'875));
3612 using namespace test::jtx;
3615 Env env{*
this, features};
3616 auto const baseFee = env.current()->fees().base;
3617 auto const alice =
Account(
"alice");
3618 auto const bob =
Account(
"bob");
3619 auto const gw =
Account(
"gw");
3621 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
3626 mptGw.authorize({.account = alice});
3627 mptGw.authorize({.account = gw, .holder = alice});
3628 mptGw.authorize({.account = bob});
3629 mptGw.authorize({.account = gw, .holder = bob});
3630 auto const MPT = mptGw[
"MPT"];
3631 env(
pay(gw, alice,
MPT(10'000)));
3634 auto seq = env.
seq(alice);
3635 auto const delta =
MPT(125);
3640 fee(baseFee * 150));
3647 fee(baseFee * 150));
3655 using namespace test::jtx;
3658 Env env{*
this, features};
3659 auto const baseFee = env.current()->fees().base;
3660 auto const alice =
Account(
"alice");
3661 auto const bob =
Account(
"bob");
3662 auto const gw =
Account(
"gw");
3664 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
3669 mptGw.authorize({.account = alice});
3670 mptGw.authorize({.account = bob});
3671 auto const MPT = mptGw[
"MPT"];
3672 env(
pay(gw, alice,
MPT(10'000)));
3673 env(
pay(gw, bob,
MPT(10'000)));
3677 auto seq1 = env.seq(alice);
3682 fee(baseFee * 150));
3686 mptGw.set({.account = gw, .holder = alice, .flags =
tfMPTLock});
3687 mptGw.set({.account = gw, .holder = bob, .flags =
tfMPTLock});
3706 using namespace test::jtx;
3709 Env env{*
this, features};
3710 auto const baseFee = env.current()->fees().base;
3711 auto const alice =
Account(
"alice");
3712 auto const bob =
Account(
"bob");
3713 auto const gw =
Account(
"gw");
3715 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
3718 mptGw.authorize({.account = alice});
3719 mptGw.authorize({.account = bob});
3720 auto const MPT = mptGw[
"MPT"];
3721 env(
pay(gw, alice,
MPT(10'000)));
3722 env(
pay(gw, bob,
MPT(10'000)));
3737 auto seq = env.
seq(alice);
3741 fee(baseFee * 150));
3748 fee(baseFee * 150));
3755 auto seq = env.
seq(alice);
3760 fee(baseFee * 150));
3773 using namespace test::jtx;
3778 Env env{*
this, features};
3779 auto const baseFee = env.current()->fees().base;
3780 auto const alice =
Account(
"alice");
3781 auto const bob =
Account(
"bob");
3782 auto const gw =
Account(
"gw");
3784 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
3789 mptGw.authorize({.account = alice});
3790 mptGw.authorize({.account = bob});
3791 auto const MPT = mptGw[
"MPT"];
3792 env(
pay(gw, alice,
MPT(10'000)));
3793 env(
pay(gw, bob,
MPT(10'000)));
3796 auto const seq1 = env.seq(alice);
3800 fee(baseFee * 150));
3804 env(
pay(alice, gw,
MPT(9'990)));
3805 env(
pay(bob, gw,
MPT(10'000)));
3806 BEAST_EXPECT(env.balance(alice,
MPT) ==
MPT(0));
3808 BEAST_EXPECT(env.balance(bob,
MPT) ==
MPT(0));
3810 BEAST_EXPECT(env.balance(gw,
MPT) ==
MPT(-10));
3813 {.id = mptGw.issuanceID(),
3824 env(
pay(bob, gw,
MPT(10)));
3825 mptGw.destroy({.id = mptGw.issuanceID(), .
ownerCount = 0});
3830 Env env{*
this, features};
3831 auto const baseFee = env.current()->fees().base;
3832 auto const alice =
Account(
"alice");
3833 auto const bob =
Account(
"bob");
3834 auto const gw =
Account(
"gw");
3835 env.fund(
XRP(10'000), bob);
3838 MPTTester mptGw(env, gw, {.holders = {alice}});
3843 mptGw.authorize({.account = alice});
3844 auto const MPT = mptGw[
"MPT"];
3845 env(
pay(gw, alice,
MPT(10'000)));
3848 auto const seq1 = env.seq(alice);
3856 env(
pay(alice, gw,
MPT(9'990)));
3859 BEAST_EXPECT(env.balance(alice,
MPT) ==
MPT(0));
3873 BEAST_EXPECT(env.balance(alice,
MPT) ==
MPT(0));
3925 using namespace test::jtx;
3933BEAST_DEFINE_TESTSUITE(EscrowToken, app,
ripple);
Value removeMember(char const *key)
Remove and return the named member.
A generic endpoint for log messages.
testcase_t testcase
Memberspace for declaring test cases.
A class that simplifies iterating ledger directory pages.
const_iterator end() const
const_iterator begin() const
A currency issued by an account.
Writable ledger view that accumulates state and tx changes.
Discardable, editable view to a ledger.
void insert(std::shared_ptr< SLE > const &sle) override
Insert a new state SLE.
Immutable cryptographic account descriptor.
A transaction testing environment.
std::uint32_t seq(Account const &account) const
Returns the next sequence number on account.
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.
void trust(STAmount const &amount, Account const &account)
Establish trust lines.
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)
std::shared_ptr< SLE const > le(Account const &account) const
Return an account root.
Converts to IOU Issue or STAmount.
void create(MPTCreate const &arg=MPTCreate{})
Converts to MPT Issue or STAmount.
ripple::MPTID const & mpt() const
Match clear account flags.
Set the expected result code for a JTx The test will fail if the code doesn't match.
Keylet mptoken(MPTID const &issuanceID, AccountID const &holder) noexcept
Keylet mptIssuance(std::uint32_t seq, AccountID const &issuer) noexcept
Keylet escrow(AccountID const &src, std::uint32_t seq) noexcept
An escrow entry.
Keylet ownerDir(AccountID const &id) noexcept
The root page of an account's directory.
std::array< std::uint8_t, 39 > const cb1
Json::Value create(AccountID const &account, AccountID const &to, STAmount const &amount)
auto const finish_time
Set the "FinishAfter" time tag on a JTx.
Rate rate(Env &env, Account const &account, std::uint32_t const &seq)
Json::Value cancel(AccountID const &account, Account const &from, std::uint32_t seq)
std::array< std::uint8_t, 39 > const cb2
auto const cancel_time
Set the "CancelAfter" time tag on a JTx.
std::array< std::uint8_t, 4 > const fb1
Json::Value finish(AccountID const &account, AccountID const &from, std::uint32_t seq)
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 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.
FeatureBitset testable_amendments()
Json::Value rate(Account const &account, double multiplier)
Set a transfer rate.
XRP_t const XRP
Converts to XRP Issue or STAmount.
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 tfSetDeepFreeze
constexpr std::uint32_t asfAllowTrustLineLocking
constexpr std::uint32_t const tfMPTCanTransfer
std::uint64_t constexpr maxMPTokenAmount
The maximum amount of MPTokenIssuance.
constexpr std::uint32_t const tfMPTUnauthorize
constexpr std::uint32_t tfSetfAuth
constexpr std::uint32_t tfClearFreeze
Rate transferRate(ReadView const &view, AccountID const &issuer)
Returns IOU issuer transfer fee as Rate.
@ tecNO_LINE_INSUF_RESERVE
@ tecINSUFFICIENT_RESERVE
constexpr std::uint32_t const tfMPTLock
constexpr std::uint32_t tfClearDeepFreeze
std::string to_string(base_uint< Bits, Tag > const &a)
STAmount amountFromString(Asset const &asset, std::string const &amount)
constexpr std::uint32_t asfRequireAuth
MPTID makeMptID(std::uint32_t sequence, AccountID const &account)
constexpr std::uint32_t const tfMPTCanEscrow
constexpr std::uint32_t const tfMPTRequireAuth
constexpr std::uint32_t tfSetFreeze
constexpr std::uint32_t const tfMPTCanLock
void testMPTBalances(FeatureBitset features)
void testIOUWithFeats(FeatureBitset features)
void testMPTLockedRate(FeatureBitset features)
void testIOUINSF(FeatureBitset features)
void testIOULimitAmount(FeatureBitset features)
void testIOURippleState(FeatureBitset features)
void testMPTFinishPreclaim(FeatureBitset features)
void testMPTGateway(FeatureBitset features)
void testIOULockedRate(FeatureBitset features)
static uint64_t issuerMPTEscrowed(jtx::Env const &env, jtx::MPT const &mpt)
static uint64_t mptEscrowed(jtx::Env const &env, jtx::Account const &account, jtx::MPT const &mpt)
void testIOUEnablement(FeatureBitset features)
void run() override
Runs the suite.
void testIOUFreeze(FeatureBitset features)
void testIOUAllowLockingFlag(FeatureBitset features)
void testMPTCreatePreclaim(FeatureBitset features)
void testIOUFinishDoApply(FeatureBitset features)
jtx::PrettyAmount issuerBalance(jtx::Env &env, jtx::Account const &account, Issue const &issue)
void testMPTRequireAuth(FeatureBitset features)
void testMPTCanTransfer(FeatureBitset features)
void testMPTCreatePreflight(FeatureBitset features)
void testMPTDestroy(FeatureBitset features)
void testMPTLock(FeatureBitset features)
void testIOUCreatePreclaim(FeatureBitset features)
void testIOUPrecisionLoss(FeatureBitset features)
void testIOUBalances(FeatureBitset features)
void testMPTCancelPreclaim(FeatureBitset features)
void testIOUGateway(FeatureBitset features)
void testMPTWithFeats(FeatureBitset features)
void testIOUFinishPreclaim(FeatureBitset features)
void testIOUCreatePreflight(FeatureBitset features)
void testMPTEnablement(FeatureBitset features)
void testMPTFinishDoApply(FeatureBitset features)
void testIOUMetaAndOwnership(FeatureBitset features)
void testIOURequireAuth(FeatureBitset features)
jtx::PrettyAmount issuerEscrowed(jtx::Env &env, jtx::Account const &account, Issue const &issue)
void testIOUCancelPreclaim(FeatureBitset features)
void testMPTMetaAndOwnership(FeatureBitset features)
Represents an XRP or IOU quantity This customizes the string conversion and supports XRP conversions ...
Set the sequence number on a JTx.