22#include <xrpld/app/tx/applySteps.h>
24#include <xrpl/ledger/Dir.h>
25#include <xrpl/ledger/Sandbox.h>
26#include <xrpl/protocol/Feature.h>
27#include <xrpl/protocol/Indexes.h>
28#include <xrpl/protocol/STAmount.h>
29#include <xrpl/protocol/TxFlags.h>
30#include <xrpl/protocol/jss.h>
47 if (sle && sle->isFieldPresent(sfLockedAmount))
48 return (*sle)[sfLockedAmount];
56 if (sle && sle->isFieldPresent(sfLockedAmount))
57 return (*sle)[sfLockedAmount];
68 params[jss::account] = account.human();
69 auto jrr = env.
rpc(
"json",
"gateway_balances",
to_string(params));
70 auto const result = jrr[jss::result];
71 auto const obligations =
73 if (obligations.isNull())
74 return {
STAmount(issue, 0), account.name()};
76 return {amount, account.name()};
86 params[jss::account] = account.human();
87 auto jrr = env.
rpc(
"json",
"gateway_balances",
to_string(params));
88 auto const result = jrr[jss::result];
91 return {
STAmount(issue, 0), account.name()};
93 return {amount, account.name()};
104 for (
bool const withTokenEscrow : {
false,
true})
107 withTokenEscrow ? features : features - featureTokenEscrow;
108 Env env{*
this, amend};
109 auto const baseFee = env.
current()->fees().base;
110 auto const alice =
Account(
"alice");
111 auto const bob =
Account(
"bob");
112 auto const gw =
Account{
"gateway"};
113 auto const USD = gw[
"USD"];
114 env.fund(
XRP(5000), alice, bob, gw);
117 env.trust(USD(10'000), alice, bob);
119 env(
pay(gw, alice, USD(5000)));
120 env(
pay(gw, bob, USD(5000)));
123 auto const createResult =
125 auto const finishResult =
128 auto const seq1 = env.seq(alice);
142 auto const seq2 = env.seq(alice);
154 for (
bool const withTokenEscrow : {
false,
true})
157 withTokenEscrow ? features : features - featureTokenEscrow;
158 Env env{*
this, amend};
159 auto const baseFee = env.
current()->fees().base;
160 auto const alice =
Account(
"alice");
161 auto const bob =
Account(
"bob");
162 auto const gw =
Account{
"gateway"};
163 auto const USD = gw[
"USD"];
164 env.fund(
XRP(5000), alice, bob, gw);
167 env.trust(USD(10'000), alice, bob);
169 env(
pay(gw, alice, USD(5000)));
170 env(
pay(gw, bob, USD(5000)));
173 auto const seq1 = env.seq(alice);
194 Env env{*
this, features};
195 auto const baseFee = env.current()->fees().base;
196 auto const alice =
Account(
"alice");
197 auto const bob =
Account(
"bob");
198 auto const gw =
Account{
"gateway"};
199 auto const USD = gw[
"USD"];
200 env.fund(
XRP(5000), alice, bob, gw);
203 env.trust(USD(10'000), alice, bob);
205 env(
pay(gw, alice, USD(5000)));
206 env(
pay(gw, bob, USD(5000)));
210 auto const seq1 = env.seq(alice);
218 auto const seq2 = env.seq(alice);
256 using namespace test::jtx;
261 Env env{*
this, features};
262 auto const alice =
Account(
"alice");
263 auto const bob =
Account(
"bob");
264 auto const gw =
Account{
"gateway"};
265 auto const USD = gw[
"USD"];
266 env.fund(
XRP(5000), alice, bob, gw);
277 Env env{*
this, features};
278 auto const baseFee = env.current()->fees().base;
279 auto const alice =
Account(
"alice");
280 auto const bob =
Account(
"bob");
281 auto const gw =
Account{
"gateway"};
282 auto const USD = gw[
"USD"];
283 env.fund(
XRP(5000), alice, bob, gw);
295 Env env{*
this, features};
296 auto const baseFee = env.current()->fees().base;
297 auto const alice =
Account(
"alice");
298 auto const bob =
Account(
"bob");
299 auto const gw =
Account{
"gateway"};
301 env.fund(
XRP(5000), alice, bob, gw);
316 using namespace test::jtx;
321 Env env{*
this, features};
322 auto const baseFee = env.current()->fees().base;
323 auto const alice =
Account(
"alice");
324 auto const bob =
Account(
"bob");
325 auto const gw =
Account{
"gateway"};
326 auto const USD = gw[
"USD"];
327 env.fund(
XRP(5000), alice, bob, gw);
339 Env env{*
this, features};
340 auto const baseFee = env.current()->fees().base;
341 auto const alice =
Account(
"alice");
342 auto const bob =
Account(
"bob");
343 auto const gw =
Account{
"gateway"};
344 auto const USD = gw[
"USD"];
345 env.fund(
XRP(5000), alice, bob);
359 Env env{*
this, features};
360 auto const baseFee = env.current()->fees().base;
361 auto const alice =
Account(
"alice");
362 auto const bob =
Account(
"bob");
363 auto const gw =
Account{
"gateway"};
364 auto const USD = gw[
"USD"];
365 env.fund(
XRP(5000), alice, bob, gw);
367 env.trust(USD(10'000), alice, bob);
369 env(
pay(gw, alice, USD(5000)));
370 env(
pay(gw, bob, USD(5000)));
383 Env env{*
this, features};
384 auto const baseFee = env.current()->fees().base;
385 auto const alice =
Account(
"alice");
386 auto const bob =
Account(
"bob");
387 auto const gw =
Account{
"gateway"};
388 auto const USD = gw[
"USD"];
389 env.fund(
XRP(5000), alice, bob, gw);
404 Env env{*
this, features};
405 auto const baseFee = env.current()->fees().base;
406 auto const alice =
Account(
"alice");
407 auto const bob =
Account(
"bob");
408 auto const gw =
Account{
"gateway"};
409 auto const USD = gw[
"USD"];
410 env.fund(
XRP(5000), alice, bob, gw);
414 env.trust(USD(10'000), alice, bob);
427 Env env{*
this, features};
428 auto const baseFee = env.current()->fees().base;
429 auto const alice =
Account(
"alice");
430 auto const bob =
Account(
"bob");
431 auto const gw =
Account{
"gateway"};
432 auto const USD = gw[
"USD"];
433 auto const aliceUSD = alice[
"USD"];
434 env.fund(
XRP(5000), alice, bob, gw);
439 env.trust(USD(10'000), alice, bob);
453 Env env{*
this, features};
454 auto const alice =
Account(
"alice");
455 auto const bob =
Account(
"bob");
456 auto const gw =
Account{
"gateway"};
457 auto const USD = gw[
"USD"];
458 auto const baseFee = env.current()->fees().base;
459 env.fund(
XRP(10'000), alice, bob, gw);
462 env(
trust(alice, USD(100'000)));
463 env(
trust(bob, USD(100'000)));
465 env(
pay(gw, alice, USD(10'000)));
466 env(
pay(gw, bob, USD(10'000)));
484 Env env{*
this, features};
485 auto const alice =
Account(
"alice");
486 auto const bob =
Account(
"bob");
487 auto const gw =
Account{
"gateway"};
488 auto const USD = gw[
"USD"];
489 auto const baseFee = env.current()->fees().base;
490 env.fund(
XRP(10'000), alice, bob, gw);
493 env(
trust(alice, USD(100'000)));
494 env(
trust(bob, USD(100'000)));
496 env(
pay(gw, alice, USD(10'000)));
497 env(
pay(gw, bob, USD(10'000)));
515 Env env{*
this, features};
516 auto const alice =
Account(
"alice");
517 auto const bob =
Account(
"bob");
518 auto const gw =
Account{
"gateway"};
519 auto const USD = gw[
"USD"];
520 auto const baseFee = env.current()->fees().base;
521 env.fund(
XRP(10'000), alice, bob, gw);
524 env(
trust(alice, USD(100'000)));
525 env(
trust(bob, USD(100'000)));
539 Env env{*
this, features};
540 auto const alice =
Account(
"alice");
541 auto const bob =
Account(
"bob");
542 auto const gw =
Account{
"gateway"};
543 auto const USD = gw[
"USD"];
544 auto const baseFee = env.current()->fees().base;
545 env.fund(
XRP(10'000), alice, bob, gw);
548 env(
trust(alice, USD(100'000)));
549 env(
trust(bob, USD(100'000)));
551 env(
pay(gw, alice, USD(10'000)));
552 env(
pay(gw, bob, USD(10'000)));
565 Env env{*
this, features};
566 auto const alice =
Account(
"alice");
567 auto const bob =
Account(
"bob");
568 auto const gw =
Account{
"gateway"};
569 auto const USD = gw[
"USD"];
570 auto const baseFee = env.current()->fees().base;
571 env.fund(
XRP(10'000), alice, bob, gw);
574 env.trust(USD(100000000000000000), alice);
575 env.trust(USD(100000000000000000), bob);
577 env(
pay(gw, alice, USD(10000000000000000)));
578 env(
pay(gw, bob, USD(1)));
595 using namespace test::jtx;
600 Env env{*
this, features};
601 auto const baseFee = env.current()->fees().base;
602 auto const alice =
Account(
"alice");
603 auto const bob =
Account(
"bob");
604 auto const gw =
Account{
"gateway"};
605 auto const USD = gw[
"USD"];
606 auto const aliceUSD = alice[
"USD"];
607 auto const bobUSD = bob[
"USD"];
608 env.fund(
XRP(5000), alice, bob, gw);
614 env.trust(USD(10'000), alice, bob);
616 env(
pay(gw, alice, USD(10'000)));
617 env(
pay(gw, bob, USD(10'000)));
620 auto const seq1 = env.seq(alice);
628 env(
pay(bob, gw, USD(10'000)));
630 env(
trust(bob, USD(0)));
633 env.trust(USD(10'000), bob);
647 Env env{*
this, features};
648 auto const baseFee = env.current()->fees().base;
649 auto const alice =
Account(
"alice");
650 auto const bob =
Account(
"bob");
651 auto const gw =
Account{
"gateway"};
652 auto const USD = gw[
"USD"];
653 env.fund(
XRP(5000), alice, bob, gw);
656 env.trust(USD(10'000), alice, bob);
658 env(
pay(gw, alice, USD(10'000)));
659 env(
pay(gw, bob, USD(10'000)));
662 auto const seq1 = env.seq(alice);
687 using namespace test::jtx;
692 Env env{*
this, features};
693 auto const baseFee = env.current()->fees().base;
694 auto const acctReserve = env.current()->fees().accountReserve(0);
695 auto const incReserve = env.current()->fees().increment;
696 auto const alice =
Account(
"alice");
697 auto const bob =
Account(
"bob");
698 auto const gw =
Account{
"gateway"};
699 auto const USD = gw[
"USD"];
700 env.fund(
XRP(5000), alice, gw);
701 env.fund(acctReserve + (incReserve - 1), bob);
705 env.trust(USD(10'000), alice);
707 env(
pay(gw, alice, USD(10'000)));
710 auto const seq1 = env.seq(alice);
729 Env env{*
this, features};
730 auto const baseFee = env.current()->fees().base;
731 auto const alice =
Account(
"alice");
732 auto const bob =
Account(
"bob");
733 auto const gw =
Account{
"gateway"};
734 auto const USD = gw[
"USD"];
735 env.fund(
XRP(5000), alice, bob, gw);
739 env.trust(USD(10'000), alice);
741 env(
pay(gw, alice, USD(10'000)));
744 auto const seq1 = env.seq(alice);
763 Env env{*
this, features};
764 auto const baseFee = env.current()->fees().base;
765 auto const alice =
Account(
"alice");
766 auto const bob =
Account(
"bob");
767 auto const gw =
Account{
"gateway"};
768 auto const USD = gw[
"USD"];
769 env.fund(
XRP(5000), alice, bob, gw);
773 env.trust(USD(1000), alice, bob);
775 env(
pay(gw, alice, USD(1000)));
778 auto const seq1 = env.seq(alice);
786 env.trust(USD(1), bob);
800 Env env{*
this, features};
801 auto const baseFee = env.current()->fees().base;
802 auto const alice =
Account(
"alice");
803 auto const bob =
Account(
"bob");
804 auto const gw =
Account{
"gateway"};
805 auto const USD = gw[
"USD"];
806 env.fund(
XRP(5000), alice, bob, gw);
810 env.trust(USD(1000), alice, bob);
812 env(
pay(gw, alice, USD(1000)));
815 auto const seq1 = env.seq(alice);
823 env.trust(USD(1), bob);
827 auto const bobPreLimit = env.limit(bob, USD);
837 BEAST_EXPECT(env.limit(bob, USD) == bobPreLimit);
845 using namespace test::jtx;
850 Env env{*
this, features};
851 auto const baseFee = env.current()->fees().base;
852 auto const alice =
Account(
"alice");
853 auto const bob =
Account(
"bob");
854 auto const gw =
Account{
"gateway"};
855 auto const USD = gw[
"USD"];
856 auto const aliceUSD = alice[
"USD"];
857 auto const bobUSD = bob[
"USD"];
858 env.fund(
XRP(5000), alice, bob, gw);
864 env.trust(USD(10'000), alice, bob);
866 env(
pay(gw, alice, USD(10'000)));
867 env(
pay(gw, bob, USD(10'000)));
870 auto const seq1 = env.seq(alice);
878 env(
pay(alice, gw, USD(9'999)));
880 env(
trust(alice, USD(0)));
883 env.trust(USD(10'000), alice);
902 Env env{*
this, features};
903 auto const baseFee = env.current()->fees().base;
904 auto const alice =
Account(
"alice");
905 auto const bob =
Account(
"bob");
906 auto const gw =
Account{
"gateway"};
907 auto const USD = gw[
"USD"];
908 env.fund(
XRP(5000), alice, bob, gw);
911 env.trust(USD(10'000), alice, bob);
913 env(
pay(gw, alice, USD(5'000)));
914 env(
pay(gw, bob, USD(5'000)));
917 auto const outstandingUSD = USD(10'000);
920 auto const seq1 = env.seq(alice);
922 auto const preAliceUSD = env.balance(alice, USD);
923 auto const preBobUSD = env.balance(bob, USD);
931 BEAST_EXPECT(env.balance(alice, USD) == preAliceUSD - USD(1'000));
932 BEAST_EXPECT(env.balance(bob, USD) == preBobUSD);
938 auto const preAliceUSD = env.balance(alice, USD);
939 auto const preBobUSD = env.balance(bob, USD);
947 BEAST_EXPECT(env.balance(alice, USD) == preAliceUSD);
948 BEAST_EXPECT(env.balance(bob, USD) == preBobUSD + USD(1'000));
954 auto const seq2 = env.seq(alice);
956 auto const preAliceUSD = env.balance(alice, USD);
957 auto const preBobUSD = env.balance(bob, USD);
966 BEAST_EXPECT(env.balance(alice, USD) == preAliceUSD - USD(1'000));
967 BEAST_EXPECT(env.balance(bob, USD) == preBobUSD);
973 auto const preAliceUSD = env.balance(alice, USD);
974 auto const preBobUSD = env.balance(bob, USD);
978 BEAST_EXPECT(env.balance(alice, USD) == preAliceUSD + USD(1'000));
979 BEAST_EXPECT(env.balance(bob, USD) == preBobUSD);
991 auto const alice =
Account(
"alice");
992 auto const bob =
Account(
"bob");
993 auto const carol =
Account(
"carol");
994 auto const gw =
Account{
"gateway"};
995 auto const USD = gw[
"USD"];
999 Env env{*
this, features};
1000 env.fund(
XRP(5000), alice, bob, carol, gw);
1003 env.trust(USD(10'000), alice, bob, carol);
1005 env(
pay(gw, alice, USD(5000)));
1006 env(
pay(gw, bob, USD(5000)));
1007 env(
pay(gw, carol, USD(5000)));
1009 auto const aseq = env.seq(alice);
1010 auto const bseq = env.seq(bob);
1016 (*env.meta())[sfTransactionResult] ==
1039 (*env.meta())[sfTransactionResult] ==
1064 (*env.meta())[sfTransactionResult] ==
1088 (*env.meta())[sfTransactionResult] ==
1105 Env env{*
this, features};
1106 env.fund(
XRP(5000), alice, bob, carol, gw);
1109 env.trust(USD(10'000), alice, bob, carol);
1111 env(
pay(gw, alice, USD(5000)));
1112 env(
pay(gw, bob, USD(5000)));
1113 env(
pay(gw, carol, USD(5000)));
1115 auto const aseq = env.seq(alice);
1116 auto const bseq = env.seq(bob);
1121 (*env.meta())[sfTransactionResult] ==
1128 (*env.meta())[sfTransactionResult] ==
1224 testcase(
"IOU Metadata to issuer");
1226 Env env{*
this, features};
1227 env.fund(
XRP(5000), alice, carol, gw);
1230 env.trust(USD(10'000), alice, carol);
1232 env(
pay(gw, alice, USD(5000)));
1233 env(
pay(gw, carol, USD(5000)));
1235 auto const aseq = env.seq(alice);
1241 (*env.meta())[sfTransactionResult] ==
1293 using namespace test::jtx;
1296 struct TestAccountData
1324 for (
auto const& t : tests)
1326 Env env{*
this, features};
1327 auto const baseFee = env.current()->fees().base;
1328 auto const USD = t.gw[
"USD"];
1329 env.fund(
XRP(5000), t.src, t.dst, t.gw);
1334 env.trust(USD(100'000), t.src, t.dst);
1336 env.trust(USD(100'000), t.src);
1339 env(
pay(t.gw, t.src, USD(10'000)));
1341 env(
pay(t.gw, t.dst, USD(10'000)));
1345 auto const seq1 = env.seq(t.src);
1346 auto const delta = USD(1'000);
1350 fee(baseFee * 150));
1354 auto const preSrc = env.balance(t.src, USD);
1355 auto const preDst = env.balance(t.dst, USD);
1360 fee(baseFee * 150));
1363 BEAST_EXPECT(env.balance(t.src, USD) == preSrc);
1364 BEAST_EXPECT(env.balance(t.dst, USD) == preDst + delta);
1372 using namespace test::jtx;
1375 struct TestAccountData
1384 auto const gw =
Account{
"gateway"};
1385 auto const alice =
Account{
"alice"};
1386 Env env{*
this, features};
1387 auto const baseFee = env.current()->fees().base;
1388 auto const USD = gw[
"USD"];
1389 env.fund(
XRP(5000), alice, gw);
1392 env.trust(USD(100'000), alice);
1395 env(
pay(gw, alice, USD(10'000)));
1419 for (
auto const& t : gwDstTests)
1421 Env env{*
this, features};
1422 auto const baseFee = env.current()->fees().base;
1423 auto const USD = t.dst[
"USD"];
1424 env.fund(
XRP(5000), t.dst, t.src);
1428 env.trust(USD(100'000), t.src);
1431 env(
pay(t.dst, t.src, USD(10'000)));
1435 auto const seq1 = env.seq(t.src);
1436 auto const preSrc = env.balance(t.src, USD);
1440 fee(baseFee * 150));
1447 fee(baseFee * 150));
1449 auto const preAmount = 10'000;
1450 BEAST_EXPECT(preSrc == USD(preAmount));
1451 auto const postAmount = 9000;
1452 BEAST_EXPECT(env.balance(t.src, USD) == USD(postAmount));
1453 BEAST_EXPECT(env.balance(t.dst, USD) == USD(0));
1458 auto const gw =
Account{
"gateway"};
1459 auto const USD = gw[
"USD"];
1460 Env env{*
this, features};
1461 auto const baseFee = env.current()->fees().base;
1462 env.fund(
XRP(5000), gw);
1480 using namespace test::jtx;
1483 auto const alice =
Account(
"alice");
1484 auto const bob =
Account(
"bob");
1485 auto const carol =
Account(
"carol");
1486 auto const gw =
Account{
"gateway"};
1487 auto const USD = gw[
"USD"];
1491 Env env{*
this, features};
1492 auto const baseFee = env.current()->fees().base;
1493 env.fund(
XRP(10'000), alice, bob, gw);
1495 env(
rate(gw, 1.25));
1497 env.trust(USD(100'000), alice);
1498 env.trust(USD(100'000), bob);
1500 env(
pay(gw, alice, USD(10'000)));
1501 env(
pay(gw, bob, USD(10'000)));
1505 auto const preAlice = env.balance(alice, USD);
1506 auto const seq1 = env.seq(alice);
1507 auto const delta = USD(125);
1511 fee(baseFee * 150));
1521 fee(baseFee * 150));
1524 BEAST_EXPECT(env.balance(alice, USD) == preAlice - delta);
1525 BEAST_EXPECT(env.balance(bob, USD) == USD(10'100));
1529 Env env{*
this, features};
1530 auto const baseFee = env.current()->fees().base;
1531 env.fund(
XRP(10'000), alice, bob, gw);
1533 env(
rate(gw, 1.25));
1535 env.trust(USD(100'000), alice);
1536 env.trust(USD(100'000), bob);
1538 env(
pay(gw, alice, USD(10'000)));
1539 env(
pay(gw, bob, USD(10'000)));
1543 auto const preAlice = env.balance(alice, USD);
1544 auto const seq1 = env.seq(alice);
1545 auto const delta = USD(125);
1549 fee(baseFee * 150));
1556 env(
rate(gw, 1.26));
1563 fee(baseFee * 150));
1566 BEAST_EXPECT(env.balance(alice, USD) == preAlice - delta);
1567 BEAST_EXPECT(env.balance(bob, USD) == USD(10'100));
1572 Env env{*
this, features};
1573 auto const baseFee = env.current()->fees().base;
1574 env.fund(
XRP(10'000), alice, bob, gw);
1576 env(
rate(gw, 1.25));
1578 env.trust(USD(100'000), alice);
1579 env.trust(USD(100'000), bob);
1581 env(
pay(gw, alice, USD(10'000)));
1582 env(
pay(gw, bob, USD(10'000)));
1586 auto const preAlice = env.balance(alice, USD);
1587 auto const seq1 = env.seq(alice);
1588 auto const delta = USD(125);
1592 fee(baseFee * 150));
1599 env(
rate(gw, 1.00));
1606 fee(baseFee * 150));
1609 BEAST_EXPECT(env.balance(alice, USD) == preAlice - delta);
1610 BEAST_EXPECT(env.balance(bob, USD) == USD(10125));
1615 Env env{*
this, features};
1616 auto const baseFee = env.current()->fees().base;
1617 env.fund(
XRP(10'000), alice, bob, gw);
1619 env(
rate(gw, 1.25));
1621 env.trust(USD(100'000), alice);
1622 env.trust(USD(100'000), bob);
1624 env(
pay(gw, alice, USD(10'000)));
1625 env(
pay(gw, bob, USD(10'000)));
1629 auto const preAlice = env.balance(alice, USD);
1630 auto const seq1 = env.seq(alice);
1631 auto const delta = USD(125);
1642 env(
rate(gw, 1.00));
1649 BEAST_EXPECT(env.balance(alice, USD) == preAlice);
1650 BEAST_EXPECT(env.balance(bob, USD) == USD(10000));
1658 using namespace test::jtx;
1661 auto const alice =
Account(
"alice");
1662 auto const bob =
Account(
"bob");
1663 auto const gw =
Account{
"gateway"};
1664 auto const USD = gw[
"USD"];
1668 Env env{*
this, features};
1669 auto const baseFee = env.current()->fees().base;
1670 env.fund(
XRP(1'000), alice, bob, gw);
1673 env.trust(USD(10'000), alice, bob);
1675 env(
pay(gw, alice, USD(1'000)));
1676 env(
pay(gw, bob, USD(1'000)));
1680 auto seq1 = env.seq(alice);
1681 auto const delta = USD(125);
1685 fee(baseFee * 150));
1689 auto const preBobLimit = env.limit(bob, USD);
1693 fee(baseFee * 150));
1695 auto const postBobLimit = env.limit(bob, USD);
1697 BEAST_EXPECT(postBobLimit == preBobLimit);
1705 using namespace test::jtx;
1708 auto const alice =
Account(
"alice");
1709 auto const bob =
Account(
"bob");
1710 auto const carol =
Account(
"carol");
1711 auto const gw =
Account{
"gateway"};
1712 auto const USD = gw[
"USD"];
1714 auto const aliceUSD = alice[
"USD"];
1715 auto const bobUSD = bob[
"USD"];
1717 Env env{*
this, features};
1718 auto const baseFee = env.current()->fees().base;
1719 env.fund(
XRP(1'000), alice, bob, gw);
1724 env(
trust(alice, USD(10'000)));
1725 env(
trust(bob, USD(10'000)));
1727 env(
pay(gw, alice, USD(1'000)));
1731 auto seq1 = env.seq(alice);
1732 auto const delta = USD(125);
1742 env(
trust(bob, USD(10'000)));
1744 env(
pay(gw, bob, USD(1'000)));
1748 seq1 = env.seq(alice);
1752 fee(baseFee * 150));
1759 fee(baseFee * 150));
1767 using namespace test::jtx;
1770 auto const alice =
Account(
"alice");
1771 auto const bob =
Account(
"bob");
1772 auto const carol =
Account(
"carol");
1773 auto const gw =
Account{
"gateway"};
1774 auto const USD = gw[
"USD"];
1778 Env env{*
this, features};
1779 auto const baseFee = env.current()->fees().base;
1780 env.fund(
XRP(10'000), alice, bob, gw);
1783 env.trust(USD(100'000), alice);
1784 env.trust(USD(100'000), bob);
1786 env(
pay(gw, alice, USD(10'000)));
1787 env(
pay(gw, bob, USD(10'000)));
1793 auto seq1 = env.seq(alice);
1794 auto const delta = USD(125);
1809 seq1 = env.seq(alice);
1813 fee(baseFee * 150));
1824 fee(baseFee * 150));
1832 seq1 = env.seq(alice);
1836 fee(baseFee * 150));
1851 Env env{*
this, features};
1852 auto const baseFee = env.current()->fees().base;
1853 env.fund(
XRP(10'000), alice, bob, gw);
1856 env(
trust(alice, USD(100'000)));
1857 env(
trust(bob, USD(100'000)));
1859 env(
pay(gw, alice, USD(10'000)));
1860 env(
pay(gw, bob, USD(10'000)));
1868 auto seq1 = env.seq(alice);
1869 auto const delta = USD(125);
1884 seq1 = env.seq(alice);
1888 fee(baseFee * 150));
1899 fee(baseFee * 150));
1908 seq1 = env.seq(alice);
1912 fee(baseFee * 150));
1927 Env env{*
this, features};
1928 auto const baseFee = env.current()->fees().base;
1929 env.fund(
XRP(10'000), alice, bob, gw);
1932 env(
trust(alice, USD(100'000)));
1933 env(
trust(bob, USD(100'000)));
1935 env(
pay(gw, alice, USD(10'000)));
1936 env(
pay(gw, bob, USD(10'000)));
1944 auto seq1 = env.seq(alice);
1945 auto const delta = USD(125);
1961 seq1 = env.seq(alice);
1965 fee(baseFee * 150));
1987 seq1 = env.seq(alice);
1991 fee(baseFee * 150));
2009 using namespace test::jtx;
2012 auto const alice =
Account(
"alice");
2013 auto const bob =
Account(
"bob");
2014 auto const carol =
Account(
"carol");
2015 auto const gw =
Account{
"gateway"};
2016 auto const USD = gw[
"USD"];
2020 Env env{*
this, features};
2021 auto const baseFee = env.current()->fees().base;
2022 env.fund(
XRP(10'000), alice, bob, gw);
2025 env.trust(USD(100'000), alice);
2026 env.trust(USD(100'000), bob);
2028 env(
pay(gw, alice, USD(10'000)));
2029 env(
pay(gw, bob, USD(10'000)));
2033 auto const delta = USD(1'000);
2037 fee(baseFee * 150));
2044 Env env{*
this, features};
2045 auto const baseFee = env.current()->fees().base;
2046 env.fund(
XRP(10'000), alice, bob, gw);
2049 env.trust(USD(100'000), alice);
2050 env.trust(USD(100'000), bob);
2052 env(
pay(gw, alice, USD(10'000)));
2053 env(
pay(gw, bob, USD(10'000)));
2056 auto const delta = USD(1'000);
2060 fee(baseFee * 150));
2076 using namespace test::jtx;
2079 auto const alice =
Account(
"alice");
2080 auto const bob =
Account(
"bob");
2081 auto const gw =
Account{
"gateway"};
2082 auto const USD = gw[
"USD"];
2086 Env env(*
this, features);
2087 auto const baseFee = env.
current()->fees().base;
2088 env.
fund(
XRP(10'000), alice, bob, gw);
2091 env.
trust(USD(100000000000000000), alice);
2092 env.
trust(USD(100000000000000000), bob);
2094 env(
pay(gw, alice, USD(10000000000000000)));
2095 env(
pay(gw, bob, USD(1)));
2106 auto const seq1 = env.
seq(alice);
2111 fee(baseFee * 150));
2118 fee(baseFee * 150));
2128 using namespace jtx;
2131 for (
bool const withTokenEscrow : {
false,
true})
2134 withTokenEscrow ? features : features - featureTokenEscrow;
2135 Env env{*
this, amend};
2136 auto const baseFee = env.
current()->fees().base;
2137 auto const alice =
Account(
"alice");
2138 auto const bob =
Account(
"bob");
2139 auto const gw =
Account(
"gw");
2140 env.fund(
XRP(5000), bob);
2142 MPTTester mptGw(env, gw, {.holders = {alice}});
2147 mptGw.authorize({.account = alice});
2148 auto const MPT = mptGw[
"MPT"];
2149 env(
pay(gw, alice,
MPT(10'000)));
2152 auto const createResult =
2154 auto const finishResult =
2157 auto const seq1 = env.seq(alice);
2170 auto const seq2 = env.seq(alice);
2187 using namespace test::jtx;
2190 for (
bool const withMPT : {
true,
false})
2193 withMPT ? features : features - featureMPTokensV1;
2194 Env env{*
this, amend};
2195 auto const baseFee = env.
current()->fees().base;
2196 auto const alice =
Account(
"alice");
2197 auto const bob =
Account(
"bob");
2198 auto const gw =
Account(
"gw");
2199 env.fund(
XRP(1'000), alice, bob, gw);
2203 jv[jss::Amount][jss::mpt_issuance_id] =
2204 "00000004A407AF5856CCF3C42619DAA925813FC955C72983";
2205 jv[jss::Amount][jss::value] =
"-1";
2218 Env env{*
this, features};
2219 auto const baseFee = env.current()->fees().base;
2220 auto const alice =
Account(
"alice");
2221 auto const bob =
Account(
"bob");
2222 auto const gw =
Account(
"gw");
2224 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
2229 mptGw.authorize({.account = alice});
2230 mptGw.authorize({.account = bob});
2231 auto const MPT = mptGw[
"MPT"];
2232 env(
pay(gw, alice,
MPT(10'000)));
2233 env(
pay(gw, bob,
MPT(10'000)));
2249 using namespace test::jtx;
2254 Env env{*
this, features};
2255 auto const baseFee = env.current()->fees().base;
2256 auto const alice =
Account(
"alice");
2257 auto const gw =
Account(
"gw");
2259 MPTTester mptGw(env, gw, {.holders = {alice}});
2264 mptGw.authorize({.account = alice});
2265 auto const MPT = mptGw[
"MPT"];
2266 env(
pay(gw, alice,
MPT(10'000)));
2279 Env env{*
this, features};
2280 auto const baseFee = env.current()->fees().base;
2281 auto const alice =
Account(
"alice");
2282 auto const bob =
Account(
"bob");
2283 auto const gw =
Account(
"gw");
2284 env.fund(
XRP(10'000), alice, bob, gw);
2288 alice.name(),
makeMptID(env.seq(alice), alice));
2290 jv[jss::Amount][jss::mpt_issuance_id] =
2291 "00000004A407AF5856CCF3C42619DAA925813FC955C72983";
2302 Env env{*
this, features};
2303 auto const baseFee = env.current()->fees().base;
2304 auto const alice =
Account(
"alice");
2305 auto const bob =
Account(
"bob");
2306 auto const gw =
Account(
"gw");
2308 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
2311 mptGw.authorize({.account = alice});
2312 mptGw.authorize({.account = bob});
2313 auto const MPT = mptGw[
"MPT"];
2314 env(
pay(gw, alice,
MPT(10'000)));
2315 env(
pay(gw, bob,
MPT(10'000)));
2328 Env env{*
this, features};
2329 auto const baseFee = env.current()->fees().base;
2330 auto const alice =
Account(
"alice");
2331 auto const bob =
Account(
"bob");
2332 auto const gw =
Account(
"gw");
2334 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
2339 auto const MPT = mptGw[
"MPT"];
2351 Env env{*
this, features};
2352 auto const baseFee = env.current()->fees().base;
2353 auto const alice =
Account(
"alice");
2354 auto const bob =
Account(
"bob");
2355 auto const gw =
Account(
"gw");
2357 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
2363 mptGw.authorize({.account = alice});
2364 mptGw.authorize({.account = gw, .holder = alice});
2365 auto const MPT = mptGw[
"MPT"];
2366 env(
pay(gw, alice,
MPT(10'000)));
2383 Env env{*
this, features};
2384 auto const baseFee = env.current()->fees().base;
2385 auto const alice =
Account(
"alice");
2386 auto const bob =
Account(
"bob");
2387 auto const gw =
Account(
"gw");
2389 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
2395 mptGw.authorize({.account = alice});
2396 mptGw.authorize({.account = gw, .holder = alice});
2397 mptGw.authorize({.account = bob});
2398 mptGw.authorize({.account = gw, .holder = bob});
2399 auto const MPT = mptGw[
"MPT"];
2400 env(
pay(gw, alice,
MPT(10'000)));
2401 env(
pay(gw, bob,
MPT(10'000)));
2418 Env env{*
this, features};
2419 auto const baseFee = env.current()->fees().base;
2420 auto const alice =
Account(
"alice");
2421 auto const bob =
Account(
"bob");
2422 auto const gw =
Account(
"gw");
2424 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
2429 mptGw.authorize({.account = alice});
2430 mptGw.authorize({.account = bob});
2431 auto const MPT = mptGw[
"MPT"];
2432 env(
pay(gw, alice,
MPT(10'000)));
2433 env(
pay(gw, bob,
MPT(10'000)));
2437 mptGw.set({.account = gw, .holder = alice, .flags =
tfMPTLock});
2449 Env env{*
this, features};
2450 auto const baseFee = env.current()->fees().base;
2451 auto const alice =
Account(
"alice");
2452 auto const bob =
Account(
"bob");
2453 auto const gw =
Account(
"gw");
2455 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
2460 mptGw.authorize({.account = alice});
2461 mptGw.authorize({.account = bob});
2462 auto const MPT = mptGw[
"MPT"];
2463 env(
pay(gw, alice,
MPT(10'000)));
2464 env(
pay(gw, bob,
MPT(10'000)));
2468 mptGw.set({.account = gw, .holder = bob, .flags =
tfMPTLock});
2480 Env env{*
this, features};
2481 auto const baseFee = env.current()->fees().base;
2482 auto const alice =
Account(
"alice");
2483 auto const bob =
Account(
"bob");
2484 auto const gw =
Account(
"gw");
2486 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
2489 mptGw.authorize({.account = alice});
2490 mptGw.authorize({.account = bob});
2491 auto const MPT = mptGw[
"MPT"];
2492 env(
pay(gw, alice,
MPT(10'000)));
2493 env(
pay(gw, bob,
MPT(10'000)));
2506 Env env{*
this, features};
2507 auto const baseFee = env.current()->fees().base;
2508 auto const alice =
Account(
"alice");
2509 auto const bob =
Account(
"bob");
2510 auto const gw =
Account(
"gw");
2512 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
2517 mptGw.authorize({.account = alice});
2518 mptGw.authorize({.account = bob});
2519 auto const MPT = mptGw[
"MPT"];
2520 env(
pay(gw, bob,
MPT(10)));
2533 Env env{*
this, features};
2534 auto const baseFee = env.current()->fees().base;
2535 auto const alice =
Account(
"alice");
2536 auto const bob =
Account(
"bob");
2537 auto const gw =
Account(
"gw");
2539 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
2544 mptGw.authorize({.account = alice});
2545 mptGw.authorize({.account = bob});
2546 auto const MPT = mptGw[
"MPT"];
2547 env(
pay(gw, alice,
MPT(10)));
2548 env(
pay(gw, bob,
MPT(10)));
2564 using namespace test::jtx;
2569 Env env{*
this, features};
2570 auto const baseFee = env.current()->fees().base;
2571 auto const alice =
Account(
"alice");
2572 auto const bob =
Account(
"bob");
2573 auto const gw =
Account(
"gw");
2575 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
2581 mptGw.authorize({.account = alice});
2582 mptGw.authorize({.account = gw, .holder = alice});
2583 mptGw.authorize({.account = bob});
2584 mptGw.authorize({.account = gw, .holder = bob});
2585 auto const MPT = mptGw[
"MPT"];
2586 env(
pay(gw, alice,
MPT(10'000)));
2587 env(
pay(gw, bob,
MPT(10'000)));
2590 auto const seq1 = env.seq(alice);
2612 Env env{*
this, features};
2613 auto const baseFee = env.current()->fees().base;
2614 auto const alice =
Account(
"alice");
2615 auto const bob =
Account(
"bob");
2616 env.fund(
XRP(10'000), alice, bob);
2619 auto const seq1 = env.seq(alice);
2620 env.app().openLedger().modify(
2628 sleNew->setAccountID(sfDestination, bob);
2629 sleNew->setFieldAmount(sfAmount, amt);
2645 Env env{*
this, features};
2646 auto const baseFee = env.current()->fees().base;
2647 auto const alice =
Account(
"alice");
2648 auto const bob =
Account(
"bob");
2649 auto const gw =
Account(
"gw");
2651 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
2656 mptGw.authorize({.account = alice});
2657 mptGw.authorize({.account = bob});
2658 auto const MPT = mptGw[
"MPT"];
2659 env(
pay(gw, alice,
MPT(10'000)));
2660 env(
pay(gw, bob,
MPT(10'000)));
2663 auto const seq1 = env.seq(alice);
2672 mptGw.set({.account = gw, .holder = bob, .flags =
tfMPTLock});
2687 using namespace test::jtx;
2692 Env env{*
this, features};
2693 auto const baseFee = env.current()->fees().base;
2694 auto const acctReserve = env.current()->fees().accountReserve(0);
2695 auto const incReserve = env.current()->fees().increment;
2697 auto const alice =
Account(
"alice");
2698 auto const bob =
Account(
"bob");
2699 auto const gw =
Account(
"gw");
2700 env.fund(acctReserve + (incReserve - 1), bob);
2703 MPTTester mptGw(env, gw, {.holders = {alice}});
2708 mptGw.authorize({.account = alice});
2709 auto const MPT = mptGw[
"MPT"];
2710 env(
pay(gw, alice,
MPT(10'000)));
2713 auto const seq1 = env.seq(alice);
2731 Env env{*
this, features};
2732 auto const baseFee = env.current()->fees().base;
2733 auto const alice =
Account(
"alice");
2734 auto const bob =
Account(
"bob");
2735 auto const gw =
Account(
"gw");
2736 env.fund(
XRP(10'000), bob);
2739 MPTTester mptGw(env, gw, {.holders = {alice}});
2744 mptGw.authorize({.account = alice});
2745 auto const MPT = mptGw[
"MPT"];
2746 env(
pay(gw, alice,
MPT(10'000)));
2749 auto const seq1 = env.seq(alice);
2767 Env env{*
this, features};
2768 auto const baseFee = env.current()->fees().base;
2769 auto const alice =
Account(
"alice");
2770 auto const bob =
Account(
"bob");
2771 auto const carol =
Account(
"carol");
2772 auto const gw =
Account(
"gw");
2773 env.fund(
XRP(10'000), bob, carol);
2776 MPTTester mptGw(env, gw, {.holders = {alice}});
2781 mptGw.authorize({.account = alice});
2782 auto const MPT = mptGw[
"MPT"];
2783 env(
pay(gw, alice,
MPT(10'000)));
2786 auto const seq1 = env.seq(alice);
2807 using namespace test::jtx;
2812 Env env{*
this, features};
2813 auto const baseFee = env.current()->fees().base;
2814 auto const alice =
Account(
"alice");
2815 auto const bob =
Account(
"bob");
2816 auto const gw =
Account(
"gw");
2818 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
2824 mptGw.authorize({.account = alice});
2825 mptGw.authorize({.account = gw, .holder = alice});
2826 mptGw.authorize({.account = bob});
2827 mptGw.authorize({.account = gw, .holder = bob});
2828 auto const MPT = mptGw[
"MPT"];
2829 env(
pay(gw, alice,
MPT(10'000)));
2830 env(
pay(gw, bob,
MPT(10'000)));
2833 auto const seq1 = env.seq(alice);
2851 Env env{*
this, features};
2852 auto const baseFee = env.current()->fees().base;
2853 auto const alice =
Account(
"alice");
2854 auto const bob =
Account(
"bob");
2855 env.fund(
XRP(10'000), alice, bob);
2857 auto const seq1 = env.seq(alice);
2858 env.app().openLedger().modify(
2866 sleNew->setAccountID(sfDestination, bob);
2867 sleNew->setFieldAmount(sfAmount, amt);
2885 using namespace jtx;
2888 Env env{*
this, features};
2889 auto const baseFee = env.current()->fees().base;
2890 auto const alice =
Account(
"alice");
2891 auto const bob =
Account(
"bob");
2892 auto const carol =
Account(
"carol");
2893 auto const gw =
Account(
"gw");
2894 env.fund(
XRP(5000), bob);
2896 MPTTester mptGw(env, gw, {.holders = {alice, carol}});
2901 mptGw.authorize({.account = alice});
2902 mptGw.authorize({.account = carol});
2903 auto const MPT = mptGw[
"MPT"];
2904 env(
pay(gw, alice,
MPT(10'000)));
2905 env(
pay(gw, carol,
MPT(10'000)));
2908 auto outstandingMPT = env.balance(gw,
MPT);
2911 auto const seq1 = env.seq(alice);
2913 auto const preAliceMPT = env.balance(alice,
MPT);
2914 auto const preBobMPT = env.balance(bob,
MPT);
2922 BEAST_EXPECT(env.balance(alice,
MPT) == preAliceMPT -
MPT(1'000));
2924 BEAST_EXPECT(env.balance(bob,
MPT) == preBobMPT);
2926 BEAST_EXPECT(env.balance(gw,
MPT) == outstandingMPT);
2930 auto const preAliceMPT = env.balance(alice,
MPT);
2931 auto const preBobMPT = env.balance(bob,
MPT);
2939 BEAST_EXPECT(env.balance(alice,
MPT) == preAliceMPT);
2941 BEAST_EXPECT(env.balance(bob,
MPT) == preBobMPT +
MPT(1'000));
2943 BEAST_EXPECT(env.balance(gw,
MPT) == outstandingMPT);
2948 auto const seq2 = env.seq(alice);
2950 auto const preAliceMPT = env.balance(alice,
MPT);
2951 auto const preBobMPT = env.balance(bob,
MPT);
2960 BEAST_EXPECT(env.balance(alice,
MPT) == preAliceMPT -
MPT(1'000));
2962 BEAST_EXPECT(env.balance(bob,
MPT) == preBobMPT);
2964 BEAST_EXPECT(env.balance(gw,
MPT) == outstandingMPT);
2968 auto const preAliceMPT = env.balance(alice,
MPT);
2969 auto const preBobMPT = env.balance(bob,
MPT);
2973 BEAST_EXPECT(env.balance(alice,
MPT) == preAliceMPT +
MPT(1'000));
2975 BEAST_EXPECT(env.balance(bob,
MPT) == preBobMPT);
2977 BEAST_EXPECT(env.balance(gw,
MPT) == outstandingMPT);
2983 auto const seq = env.
seq(alice);
2984 auto const preAliceMPT = env.balance(alice,
MPT);
2992 BEAST_EXPECT(env.balance(alice,
MPT) == preAliceMPT -
MPT(1'000));
2994 BEAST_EXPECT(env.balance(gw,
MPT) == outstandingMPT);
3004 BEAST_EXPECT(env.balance(alice,
MPT) == preAliceMPT);
3006 BEAST_EXPECT(env.balance(gw,
MPT) == outstandingMPT);
3012 auto const seq = env.
seq(alice);
3013 auto const preAliceMPT = env.balance(alice,
MPT);
3022 BEAST_EXPECT(env.balance(alice,
MPT) == preAliceMPT -
MPT(1'000));
3024 BEAST_EXPECT(env.balance(gw,
MPT) == outstandingMPT);
3030 BEAST_EXPECT(env.balance(alice,
MPT) == preAliceMPT);
3032 BEAST_EXPECT(env.balance(gw,
MPT) == outstandingMPT);
3038 auto const preAliceMPT = env.balance(alice,
MPT);
3039 auto const preBobMPT = env.balance(bob,
MPT);
3040 auto const preCarolMPT = env.balance(carol,
MPT);
3055 BEAST_EXPECT(env.balance(alice,
MPT) == preAliceMPT -
MPT(1'000));
3057 BEAST_EXPECT(env.balance(bob,
MPT) == preBobMPT);
3059 BEAST_EXPECT(env.balance(carol,
MPT) == preCarolMPT -
MPT(1'000));
3061 BEAST_EXPECT(env.balance(gw,
MPT) == outstandingMPT);
3067 Env env{*
this, features};
3068 auto const baseFee = env.current()->fees().base;
3069 auto const alice =
Account(
"alice");
3070 auto const bob =
Account(
"bob");
3071 auto const gw =
Account(
"gw");
3073 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
3078 mptGw.authorize({.account = alice});
3079 mptGw.authorize({.account = bob});
3080 auto const MPT = mptGw[
"MPT"];
3084 auto const preAliceMPT = env.balance(alice,
MPT);
3085 auto const preBobMPT = env.balance(bob,
MPT);
3086 auto const outstandingMPT = env.balance(gw,
MPT);
3088 auto const seq1 = env.seq(alice);
3092 fee(baseFee * 150));
3095 BEAST_EXPECT(env.balance(alice,
MPT) == preAliceMPT -
MPT(1));
3097 BEAST_EXPECT(env.balance(bob,
MPT) == preBobMPT);
3099 BEAST_EXPECT(env.balance(gw,
MPT) == outstandingMPT);
3109 BEAST_EXPECT(env.balance(alice,
MPT) == preAliceMPT -
MPT(1));
3112 ->isFieldPresent(sfLockedAmount));
3113 BEAST_EXPECT(env.balance(bob,
MPT) == preBobMPT +
MPT(1));
3115 BEAST_EXPECT(env.balance(gw,
MPT) == outstandingMPT);
3118 ->isFieldPresent(sfLockedAmount));
3123 Env env{*
this, features};
3124 auto const baseFee = env.current()->fees().base;
3125 auto const alice =
Account(
"alice");
3126 auto const bob =
Account(
"bob");
3127 auto const gw =
Account(
"gw");
3129 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
3134 mptGw.authorize({.account = alice});
3135 mptGw.authorize({.account = bob});
3136 auto const MPT = mptGw[
"MPT"];
3140 auto const preAliceMPT = env.balance(alice,
MPT);
3141 auto const preBobMPT = env.balance(bob,
MPT);
3142 auto const outstandingMPT = env.balance(gw,
MPT);
3145 auto const seq1 = env.seq(alice);
3149 fee(baseFee * 150));
3153 auto const seq2 = env.seq(alice);
3157 fee(baseFee * 150));
3163 BEAST_EXPECT(env.balance(bob,
MPT) == preBobMPT);
3165 BEAST_EXPECT(env.balance(gw,
MPT) == outstandingMPT);
3188 BEAST_EXPECT(env.balance(gw,
MPT) == outstandingMPT);
3196 using namespace jtx;
3199 auto const alice =
Account(
"alice");
3200 auto const bob =
Account(
"bob");
3201 auto const carol =
Account(
"carol");
3202 auto const gw =
Account{
"gateway"};
3206 Env env{*
this, features};
3207 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
3212 mptGw.authorize({.account = alice});
3213 mptGw.authorize({.account = bob});
3214 auto const MPT = mptGw[
"MPT"];
3215 env(
pay(gw, alice,
MPT(10'000)));
3216 env(
pay(gw, bob,
MPT(10'000)));
3218 auto const aseq = env.seq(alice);
3219 auto const bseq = env.seq(bob);
3225 (*env.meta())[sfTransactionResult] ==
3248 (*env.meta())[sfTransactionResult] ==
3266 (*env.meta())[sfTransactionResult] ==
3285 (*env.meta())[sfTransactionResult] ==
3298 Env env{*
this, features};
3299 MPTTester mptGw(env, gw, {.holders = {alice, bob, carol}});
3304 mptGw.authorize({.account = alice});
3305 mptGw.authorize({.account = bob});
3306 mptGw.authorize({.account = carol});
3307 auto const MPT = mptGw[
"MPT"];
3308 env(
pay(gw, alice,
MPT(10'000)));
3309 env(
pay(gw, bob,
MPT(10'000)));
3310 env(
pay(gw, carol,
MPT(10'000)));
3312 auto const aseq = env.seq(alice);
3313 auto const bseq = env.seq(bob);
3318 (*env.meta())[sfTransactionResult] ==
3325 (*env.meta())[sfTransactionResult] ==
3404 using namespace test::jtx;
3409 Env env{*
this, features};
3410 auto const baseFee = env.current()->fees().base;
3411 auto const alice =
Account(
"alice");
3412 auto const gw =
Account(
"gw");
3414 MPTTester mptGw(env, gw, {.holders = {alice}});
3419 mptGw.authorize({.account = alice});
3420 auto const MPT = mptGw[
"MPT"];
3421 env(
pay(gw, alice,
MPT(10'000)));
3425 auto const seq1 = env.seq(alice);
3426 auto const preAliceMPT = env.balance(alice,
MPT);
3427 auto const preOutstanding = env.balance(gw,
MPT);
3429 BEAST_EXPECT(preOutstanding ==
MPT(-10'000));
3430 BEAST_EXPECT(preEscrowed == 0);
3435 fee(baseFee * 150));
3438 BEAST_EXPECT(env.balance(alice,
MPT) == preAliceMPT -
MPT(1'000));
3440 BEAST_EXPECT(env.balance(gw,
MPT) == preOutstanding);
3447 fee(baseFee * 150));
3450 BEAST_EXPECT(env.balance(alice,
MPT) == preAliceMPT -
MPT(1'000));
3452 BEAST_EXPECT(env.balance(gw,
MPT) == preOutstanding +
MPT(1'000));
3461 using namespace test::jtx;
3464 auto const alice =
Account(
"alice");
3465 auto const bob =
Account(
"bob");
3466 auto const carol =
Account(
"carol");
3467 auto const gw =
Account{
"gateway"};
3468 auto const USD = gw[
"USD"];
3472 Env env{*
this, features};
3473 auto const baseFee = env.current()->fees().base;
3474 auto const alice =
Account(
"alice");
3475 auto const bob =
Account(
"bob");
3476 auto const gw =
Account(
"gw");
3478 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
3480 {.transferFee = 25000,
3484 mptGw.authorize({.account = alice});
3485 mptGw.authorize({.account = bob});
3486 auto const MPT = mptGw[
"MPT"];
3487 env(
pay(gw, alice,
MPT(10'000)));
3488 env(
pay(gw, bob,
MPT(10'000)));
3492 auto const preAlice = env.balance(alice,
MPT);
3493 auto const seq1 = env.seq(alice);
3494 auto const delta =
MPT(125);
3498 fee(baseFee * 150));
3506 BEAST_EXPECT(env.balance(gw,
MPT) ==
MPT(-20'000));
3512 fee(baseFee * 150));
3515 BEAST_EXPECT(env.balance(alice,
MPT) == preAlice - delta);
3516 BEAST_EXPECT(env.balance(bob,
MPT) ==
MPT(10'100));
3518 auto const escrowedWithFix =
3519 env.current()->rules().enabled(fixTokenEscrowV1) ? 0 : 25;
3520 auto const outstandingWithFix =
3521 env.current()->rules().enabled(fixTokenEscrowV1) ?
MPT(19'975)
3525 BEAST_EXPECT(env.balance(gw,
MPT) == -outstandingWithFix);
3530 Env env{*
this, features};
3531 auto const baseFee = env.current()->fees().base;
3532 auto const alice =
Account(
"alice");
3533 auto const bob =
Account(
"bob");
3534 auto const gw =
Account(
"gw");
3536 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
3538 {.transferFee = 25000,
3542 mptGw.authorize({.account = alice});
3543 mptGw.authorize({.account = bob});
3544 auto const MPT = mptGw[
"MPT"];
3545 env(
pay(gw, alice,
MPT(10'000)));
3546 env(
pay(gw, bob,
MPT(10'000)));
3550 auto const preAlice = env.balance(alice,
MPT);
3551 auto const preBob = env.balance(bob,
MPT);
3552 auto const seq1 = env.seq(alice);
3553 auto const delta =
MPT(125);
3558 fee(baseFee * 150));
3568 BEAST_EXPECT(env.balance(alice,
MPT) == preAlice);
3569 BEAST_EXPECT(env.balance(bob,
MPT) == preBob);
3570 BEAST_EXPECT(env.balance(gw,
MPT) ==
MPT(-20'000));
3577 Env env{*
this, features};
3578 auto const baseFee = env.current()->fees().base;
3579 auto const alice =
Account(
"alice");
3580 auto const bob =
Account(
"bob");
3581 auto const gw =
Account(
"gw");
3583 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
3585 {.transferFee = 25000,
3589 mptGw.authorize({.account = alice});
3590 mptGw.authorize({.account = bob});
3591 auto const MPT = mptGw[
"MPT"];
3592 env(
pay(gw, alice,
MPT(10'000)));
3593 env(
pay(gw, bob,
MPT(10'000)));
3597 auto const preAlice = env.balance(alice,
MPT);
3598 auto const seq1 = env.seq(alice);
3599 auto const delta =
MPT(125);
3603 fee(baseFee * 150));
3611 BEAST_EXPECT(env.balance(gw,
MPT) ==
MPT(-20'000));
3617 fee(baseFee * 150));
3620 BEAST_EXPECT(env.balance(alice,
MPT) == preAlice - delta);
3623 BEAST_EXPECT(env.balance(gw,
MPT) ==
MPT(-19'875));
3631 using namespace test::jtx;
3634 Env env{*
this, features};
3635 auto const baseFee = env.current()->fees().base;
3636 auto const alice =
Account(
"alice");
3637 auto const bob =
Account(
"bob");
3638 auto const gw =
Account(
"gw");
3640 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
3645 mptGw.authorize({.account = alice});
3646 mptGw.authorize({.account = gw, .holder = alice});
3647 mptGw.authorize({.account = bob});
3648 mptGw.authorize({.account = gw, .holder = bob});
3649 auto const MPT = mptGw[
"MPT"];
3650 env(
pay(gw, alice,
MPT(10'000)));
3653 auto seq = env.
seq(alice);
3654 auto const delta =
MPT(125);
3659 fee(baseFee * 150));
3666 fee(baseFee * 150));
3674 using namespace test::jtx;
3677 Env env{*
this, features};
3678 auto const baseFee = env.current()->fees().base;
3679 auto const alice =
Account(
"alice");
3680 auto const bob =
Account(
"bob");
3681 auto const gw =
Account(
"gw");
3683 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
3688 mptGw.authorize({.account = alice});
3689 mptGw.authorize({.account = bob});
3690 auto const MPT = mptGw[
"MPT"];
3691 env(
pay(gw, alice,
MPT(10'000)));
3692 env(
pay(gw, bob,
MPT(10'000)));
3696 auto seq1 = env.seq(alice);
3701 fee(baseFee * 150));
3705 mptGw.set({.account = gw, .holder = alice, .flags =
tfMPTLock});
3706 mptGw.set({.account = gw, .holder = bob, .flags =
tfMPTLock});
3725 using namespace test::jtx;
3728 Env env{*
this, features};
3729 auto const baseFee = env.current()->fees().base;
3730 auto const alice =
Account(
"alice");
3731 auto const bob =
Account(
"bob");
3732 auto const gw =
Account(
"gw");
3734 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
3737 mptGw.authorize({.account = alice});
3738 mptGw.authorize({.account = bob});
3739 auto const MPT = mptGw[
"MPT"];
3740 env(
pay(gw, alice,
MPT(10'000)));
3741 env(
pay(gw, bob,
MPT(10'000)));
3756 auto seq = env.
seq(alice);
3760 fee(baseFee * 150));
3767 fee(baseFee * 150));
3774 auto seq = env.
seq(alice);
3779 fee(baseFee * 150));
3792 using namespace test::jtx;
3797 Env env{*
this, features};
3798 auto const baseFee = env.current()->fees().base;
3799 auto const alice =
Account(
"alice");
3800 auto const bob =
Account(
"bob");
3801 auto const gw =
Account(
"gw");
3803 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
3808 mptGw.authorize({.account = alice});
3809 mptGw.authorize({.account = bob});
3810 auto const MPT = mptGw[
"MPT"];
3811 env(
pay(gw, alice,
MPT(10'000)));
3812 env(
pay(gw, bob,
MPT(10'000)));
3815 auto const seq1 = env.seq(alice);
3819 fee(baseFee * 150));
3823 env(
pay(alice, gw,
MPT(9'990)));
3824 env(
pay(bob, gw,
MPT(10'000)));
3825 BEAST_EXPECT(env.balance(alice,
MPT) ==
MPT(0));
3827 BEAST_EXPECT(env.balance(bob,
MPT) ==
MPT(0));
3829 BEAST_EXPECT(env.balance(gw,
MPT) ==
MPT(-10));
3832 {.id = mptGw.issuanceID(),
3843 env(
pay(bob, gw,
MPT(10)));
3844 mptGw.destroy({.id = mptGw.issuanceID(), .
ownerCount = 0});
3849 Env env{*
this, features};
3850 auto const baseFee = env.current()->fees().base;
3851 auto const alice =
Account(
"alice");
3852 auto const bob =
Account(
"bob");
3853 auto const gw =
Account(
"gw");
3854 env.fund(
XRP(10'000), bob);
3857 MPTTester mptGw(env, gw, {.holders = {alice}});
3862 mptGw.authorize({.account = alice});
3863 auto const MPT = mptGw[
"MPT"];
3864 env(
pay(gw, alice,
MPT(10'000)));
3867 auto const seq1 = env.seq(alice);
3875 env(
pay(alice, gw,
MPT(9'990)));
3878 BEAST_EXPECT(env.balance(alice,
MPT) ==
MPT(0));
3892 BEAST_EXPECT(env.balance(alice,
MPT) ==
MPT(0));
3944 using namespace test::jtx;
3952BEAST_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.