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>
25 if (sle && sle->isFieldPresent(sfLockedAmount))
26 return (*sle)[sfLockedAmount];
34 if (sle && sle->isFieldPresent(sfLockedAmount))
35 return (*sle)[sfLockedAmount];
43 params[jss::account] = account.human();
44 auto jrr = env.
rpc(
"json",
"gateway_balances",
to_string(params));
45 auto const result = jrr[jss::result];
47 if (obligations.isNull())
48 return {
STAmount(issue, 0), account.name()};
50 return {
amount, account.name()};
57 params[jss::account] = account.human();
58 auto jrr = env.
rpc(
"json",
"gateway_balances",
to_string(params));
59 auto const result = jrr[jss::result];
62 return {
STAmount(issue, 0), account.name()};
64 return {
amount, account.name()};
75 for (
bool const withTokenEscrow : {
false,
true})
77 auto const amend = withTokenEscrow ? features : features - featureTokenEscrow;
78 Env env{*
this, amend};
79 auto const baseFee = env.
current()->fees().base;
80 auto const alice =
Account(
"alice");
81 auto const bob =
Account(
"bob");
82 auto const gw =
Account{
"gateway"};
83 auto const USD = gw[
"USD"];
84 env.fund(
XRP(5000), alice, bob, gw);
87 env.trust(USD(10'000), alice, bob);
89 env(
pay(gw, alice, USD(5000)));
90 env(
pay(gw, bob, USD(5000)));
96 auto const seq1 = env.seq(alice);
110 auto const seq2 = env.seq(alice);
122 for (
bool const withTokenEscrow : {
false,
true})
124 auto const amend = withTokenEscrow ? features : features - featureTokenEscrow;
125 Env env{*
this, amend};
126 auto const baseFee = env.
current()->fees().base;
127 auto const alice =
Account(
"alice");
128 auto const bob =
Account(
"bob");
129 auto const gw =
Account{
"gateway"};
130 auto const USD = gw[
"USD"];
131 env.fund(
XRP(5000), alice, bob, gw);
134 env.trust(USD(10'000), alice, bob);
136 env(
pay(gw, alice, USD(5000)));
137 env(
pay(gw, bob, USD(5000)));
140 auto const seq1 = env.seq(alice);
161 Env env{*
this, features};
162 auto const baseFee = env.current()->fees().base;
163 auto const alice =
Account(
"alice");
164 auto const bob =
Account(
"bob");
165 auto const gw =
Account{
"gateway"};
166 auto const USD = gw[
"USD"];
167 env.fund(
XRP(5000), alice, bob, gw);
170 env.trust(USD(10'000), alice, bob);
172 env(
pay(gw, alice, USD(5000)));
173 env(
pay(gw, bob, USD(5000)));
177 auto const seq1 = env.seq(alice);
185 auto const seq2 = env.seq(alice);
223 using namespace test::jtx;
228 Env env{*
this, features};
229 auto const alice =
Account(
"alice");
230 auto const bob =
Account(
"bob");
231 auto const gw =
Account{
"gateway"};
232 auto const USD = gw[
"USD"];
233 env.fund(
XRP(5000), alice, bob, gw);
241 Env env{*
this, features};
242 auto const baseFee = env.current()->fees().base;
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);
259 Env env{*
this, features};
260 auto const baseFee = env.current()->fees().base;
261 auto const alice =
Account(
"alice");
262 auto const bob =
Account(
"bob");
263 auto const gw =
Account{
"gateway"};
265 env.fund(
XRP(5000), alice, bob, gw);
280 using namespace test::jtx;
285 Env env{*
this, features};
286 auto const baseFee = env.current()->fees().base;
287 auto const alice =
Account(
"alice");
288 auto const bob =
Account(
"bob");
289 auto const gw =
Account{
"gateway"};
290 auto const USD = gw[
"USD"];
291 env.fund(
XRP(5000), alice, bob, gw);
303 Env env{*
this, features};
304 auto const baseFee = env.current()->fees().base;
305 auto const alice =
Account(
"alice");
306 auto const bob =
Account(
"bob");
307 auto const gw =
Account{
"gateway"};
308 auto const USD = gw[
"USD"];
309 env.fund(
XRP(5000), alice, bob);
323 Env env{*
this, features};
324 auto const baseFee = env.current()->fees().base;
325 auto const alice =
Account(
"alice");
326 auto const bob =
Account(
"bob");
327 auto const gw =
Account{
"gateway"};
328 auto const USD = gw[
"USD"];
329 env.fund(
XRP(5000), alice, bob, gw);
331 env.trust(USD(10'000), alice, bob);
333 env(
pay(gw, alice, USD(5000)));
334 env(
pay(gw, bob, USD(5000)));
347 Env env{*
this, features};
348 auto const baseFee = env.current()->fees().base;
349 auto const alice =
Account(
"alice");
350 auto const bob =
Account(
"bob");
351 auto const gw =
Account{
"gateway"};
352 auto const USD = gw[
"USD"];
353 env.fund(
XRP(5000), alice, bob, gw);
368 Env env{*
this, features};
369 auto const baseFee = env.current()->fees().base;
370 auto const alice =
Account(
"alice");
371 auto const bob =
Account(
"bob");
372 auto const gw =
Account{
"gateway"};
373 auto const USD = gw[
"USD"];
374 env.fund(
XRP(5000), alice, bob, gw);
378 env.trust(USD(10'000), alice, bob);
391 Env env{*
this, features};
392 auto const baseFee = env.current()->fees().base;
393 auto const alice =
Account(
"alice");
394 auto const bob =
Account(
"bob");
395 auto const gw =
Account{
"gateway"};
396 auto const USD = gw[
"USD"];
397 auto const aliceUSD = alice[
"USD"];
398 env.fund(
XRP(5000), alice, bob, gw);
403 env.trust(USD(10'000), alice, bob);
417 Env env{*
this, features};
418 auto const alice =
Account(
"alice");
419 auto const bob =
Account(
"bob");
420 auto const gw =
Account{
"gateway"};
421 auto const USD = gw[
"USD"];
422 auto const baseFee = env.current()->fees().base;
423 env.fund(
XRP(10'000), alice, bob, gw);
426 env(
trust(alice, USD(100'000)));
427 env(
trust(bob, USD(100'000)));
429 env(
pay(gw, alice, USD(10'000)));
430 env(
pay(gw, bob, USD(10'000)));
448 Env env{*
this, features};
449 auto const alice =
Account(
"alice");
450 auto const bob =
Account(
"bob");
451 auto const gw =
Account{
"gateway"};
452 auto const USD = gw[
"USD"];
453 auto const baseFee = env.current()->fees().base;
454 env.fund(
XRP(10'000), alice, bob, gw);
457 env(
trust(alice, USD(100'000)));
458 env(
trust(bob, USD(100'000)));
460 env(
pay(gw, alice, USD(10'000)));
461 env(
pay(gw, bob, USD(10'000)));
479 Env env{*
this, features};
480 auto const alice =
Account(
"alice");
481 auto const bob =
Account(
"bob");
482 auto const gw =
Account{
"gateway"};
483 auto const USD = gw[
"USD"];
484 auto const baseFee = env.current()->fees().base;
485 env.fund(
XRP(10'000), alice, bob, gw);
488 env(
trust(alice, USD(100'000)));
489 env(
trust(bob, USD(100'000)));
503 Env env{*
this, features};
504 auto const alice =
Account(
"alice");
505 auto const bob =
Account(
"bob");
506 auto const gw =
Account{
"gateway"};
507 auto const USD = gw[
"USD"];
508 auto const baseFee = env.current()->fees().base;
509 env.fund(
XRP(10'000), alice, bob, gw);
512 env(
trust(alice, USD(100'000)));
513 env(
trust(bob, USD(100'000)));
515 env(
pay(gw, alice, USD(10'000)));
516 env(
pay(gw, bob, USD(10'000)));
529 Env env{*
this, features};
530 auto const alice =
Account(
"alice");
531 auto const bob =
Account(
"bob");
532 auto const gw =
Account{
"gateway"};
533 auto const USD = gw[
"USD"];
534 auto const baseFee = env.current()->fees().base;
535 env.fund(
XRP(10'000), alice, bob, gw);
538 env.trust(USD(100000000000000000), alice);
539 env.trust(USD(100000000000000000), bob);
541 env(
pay(gw, alice, USD(10000000000000000)));
542 env(
pay(gw, bob, USD(1)));
545 bool const largeMantissa = features[featureSingleAssetVault] || features[featureLendingProtocol];
561 using namespace test::jtx;
566 Env env{*
this, features};
567 auto const baseFee = env.current()->fees().base;
568 auto const alice =
Account(
"alice");
569 auto const bob =
Account(
"bob");
570 auto const gw =
Account{
"gateway"};
571 auto const USD = gw[
"USD"];
572 auto const aliceUSD = alice[
"USD"];
573 auto const bobUSD = bob[
"USD"];
574 env.fund(
XRP(5000), alice, bob, gw);
580 env.trust(USD(10'000), alice, bob);
582 env(
pay(gw, alice, USD(10'000)));
583 env(
pay(gw, bob, USD(10'000)));
586 auto const seq1 = env.seq(alice);
594 env(
pay(bob, gw, USD(10'000)));
596 env(
trust(bob, USD(0)));
599 env.trust(USD(10'000), bob);
613 Env env{*
this, features};
614 auto const baseFee = env.current()->fees().base;
615 auto const alice =
Account(
"alice");
616 auto const bob =
Account(
"bob");
617 auto const gw =
Account{
"gateway"};
618 auto const USD = gw[
"USD"];
619 env.fund(
XRP(5000), alice, bob, gw);
622 env.trust(USD(10'000), alice, bob);
624 env(
pay(gw, alice, USD(10'000)));
625 env(
pay(gw, bob, USD(10'000)));
628 auto const seq1 = env.seq(alice);
653 using namespace test::jtx;
658 Env env{*
this, features};
659 auto const baseFee = env.current()->fees().base;
660 auto const acctReserve = env.current()->fees().reserve;
661 auto const incReserve = env.current()->fees().increment;
662 auto const alice =
Account(
"alice");
663 auto const bob =
Account(
"bob");
664 auto const gw =
Account{
"gateway"};
665 auto const USD = gw[
"USD"];
666 env.fund(
XRP(5000), alice, gw);
667 env.fund(acctReserve + (incReserve - 1), bob);
671 env.trust(USD(10'000), alice);
673 env(
pay(gw, alice, USD(10'000)));
676 auto const seq1 = env.seq(alice);
695 Env env{*
this, features};
696 auto const baseFee = env.current()->fees().base;
697 auto const alice =
Account(
"alice");
698 auto const bob =
Account(
"bob");
699 auto const gw =
Account{
"gateway"};
700 auto const USD = gw[
"USD"];
701 env.fund(
XRP(5000), alice, bob, gw);
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(1000), alice, bob);
741 env(
pay(gw, alice, USD(1000)));
744 auto const seq1 = env.seq(alice);
752 env.trust(USD(1), bob);
766 Env env{*
this, features};
767 auto const baseFee = env.current()->fees().base;
768 auto const alice =
Account(
"alice");
769 auto const bob =
Account(
"bob");
770 auto const gw =
Account{
"gateway"};
771 auto const USD = gw[
"USD"];
772 env.fund(
XRP(5000), alice, bob, gw);
776 env.trust(USD(1000), alice, bob);
778 env(
pay(gw, alice, USD(1000)));
781 auto const seq1 = env.seq(alice);
789 env.trust(USD(1), bob);
793 auto const bobPreLimit = env.limit(bob, USD);
803 BEAST_EXPECT(env.limit(bob, USD) == bobPreLimit);
811 using namespace test::jtx;
816 Env env{*
this, features};
817 auto const baseFee = env.current()->fees().base;
818 auto const alice =
Account(
"alice");
819 auto const bob =
Account(
"bob");
820 auto const gw =
Account{
"gateway"};
821 auto const USD = gw[
"USD"];
822 auto const aliceUSD = alice[
"USD"];
823 auto const bobUSD = bob[
"USD"];
824 env.fund(
XRP(5000), alice, bob, gw);
830 env.trust(USD(10'000), alice, bob);
832 env(
pay(gw, alice, USD(10'000)));
833 env(
pay(gw, bob, USD(10'000)));
836 auto const seq1 = env.seq(alice);
844 env(
pay(alice, gw, USD(9'999)));
846 env(
trust(alice, USD(0)));
849 env.trust(USD(10'000), alice);
866 Env env{*
this, features};
867 auto const baseFee = env.current()->fees().base;
868 auto const alice =
Account(
"alice");
869 auto const bob =
Account(
"bob");
870 auto const gw =
Account{
"gateway"};
871 auto const USD = gw[
"USD"];
872 env.fund(
XRP(5000), alice, bob, gw);
875 env.trust(USD(10'000), alice, bob);
877 env(
pay(gw, alice, USD(5'000)));
878 env(
pay(gw, bob, USD(5'000)));
881 auto const outstandingUSD = USD(10'000);
884 auto const seq1 = env.seq(alice);
886 auto const preAliceUSD = env.balance(alice, USD);
887 auto const preBobUSD = env.balance(bob, USD);
895 BEAST_EXPECT(env.balance(alice, USD) == preAliceUSD - USD(1'000));
896 BEAST_EXPECT(env.balance(bob, USD) == preBobUSD);
897 BEAST_EXPECT(
issuerBalance(env, gw, USD) == outstandingUSD - USD(1'000));
901 auto const preAliceUSD = env.balance(alice, USD);
902 auto const preBobUSD = env.balance(bob, USD);
910 BEAST_EXPECT(env.balance(alice, USD) == preAliceUSD);
911 BEAST_EXPECT(env.balance(bob, USD) == preBobUSD + USD(1'000));
917 auto const seq2 = env.seq(alice);
919 auto const preAliceUSD = env.balance(alice, USD);
920 auto const preBobUSD = env.balance(bob, USD);
929 BEAST_EXPECT(env.balance(alice, USD) == preAliceUSD - USD(1'000));
930 BEAST_EXPECT(env.balance(bob, USD) == preBobUSD);
931 BEAST_EXPECT(
issuerBalance(env, gw, USD) == outstandingUSD - USD(1'000));
935 auto const preAliceUSD = env.balance(alice, USD);
936 auto const preBobUSD = env.balance(bob, USD);
940 BEAST_EXPECT(env.balance(alice, USD) == preAliceUSD + USD(1'000));
941 BEAST_EXPECT(env.balance(bob, USD) == preBobUSD);
953 auto const alice =
Account(
"alice");
954 auto const bob =
Account(
"bob");
955 auto const carol =
Account(
"carol");
956 auto const gw =
Account{
"gateway"};
957 auto const USD = gw[
"USD"];
961 Env env{*
this, features};
962 env.fund(
XRP(5000), alice, bob, carol, gw);
965 env.trust(USD(10'000), alice, bob, carol);
967 env(
pay(gw, alice, USD(5000)));
968 env(
pay(gw, bob, USD(5000)));
969 env(
pay(gw, carol, USD(5000)));
971 auto const aseq = env.seq(alice);
972 auto const bseq = env.seq(bob);
1050 Env env{*
this, features};
1051 env.fund(
XRP(5000), alice, bob, carol, gw);
1054 env.trust(USD(10'000), alice, bob, carol);
1056 env(
pay(gw, alice, USD(5000)));
1057 env(
pay(gw, bob, USD(5000)));
1058 env(
pay(gw, carol, USD(5000)));
1060 auto const aseq = env.seq(alice);
1061 auto const bseq = env.seq(bob);
1148 testcase(
"IOU Metadata to issuer");
1150 Env env{*
this, features};
1151 env.fund(
XRP(5000), alice, carol, gw);
1154 env.trust(USD(10'000), alice, carol);
1156 env(
pay(gw, alice, USD(5000)));
1157 env(
pay(gw, carol, USD(5000)));
1159 auto const aseq = env.seq(alice);
1210 using namespace test::jtx;
1213 struct TestAccountData
1241 for (
auto const& t : tests)
1243 Env env{*
this, features};
1244 auto const baseFee = env.current()->fees().base;
1245 auto const USD = t.gw[
"USD"];
1246 env.fund(
XRP(5000), t.src, t.dst, t.gw);
1251 env.trust(USD(100'000), t.src, t.dst);
1253 env.trust(USD(100'000), t.src);
1256 env(
pay(t.gw, t.src, USD(10'000)));
1258 env(
pay(t.gw, t.dst, USD(10'000)));
1262 auto const seq1 = env.seq(t.src);
1263 auto const delta = USD(1'000);
1267 fee(baseFee * 150));
1271 auto const preSrc = env.balance(t.src, USD);
1272 auto const preDst = env.balance(t.dst, USD);
1277 fee(baseFee * 150));
1280 BEAST_EXPECT(env.balance(t.src, USD) == preSrc);
1281 BEAST_EXPECT(env.balance(t.dst, USD) == preDst + delta);
1289 using namespace test::jtx;
1292 struct TestAccountData
1301 auto const gw =
Account{
"gateway"};
1302 auto const alice =
Account{
"alice"};
1303 Env env{*
this, features};
1304 auto const baseFee = env.current()->fees().base;
1305 auto const USD = gw[
"USD"];
1306 env.fund(
XRP(5000), alice, gw);
1309 env.trust(USD(100'000), alice);
1312 env(
pay(gw, alice, USD(10'000)));
1336 for (
auto const& t : gwDstTests)
1338 Env env{*
this, features};
1339 auto const baseFee = env.current()->fees().base;
1340 auto const USD = t.dst[
"USD"];
1341 env.fund(
XRP(5000), t.dst, t.src);
1345 env.trust(USD(100'000), t.src);
1348 env(
pay(t.dst, t.src, USD(10'000)));
1352 auto const seq1 = env.seq(t.src);
1353 auto const preSrc = env.balance(t.src, USD);
1357 fee(baseFee * 150));
1364 fee(baseFee * 150));
1366 auto const preAmount = 10'000;
1367 BEAST_EXPECT(preSrc == USD(preAmount));
1368 auto const postAmount = 9000;
1369 BEAST_EXPECT(env.balance(t.src, USD) == USD(postAmount));
1370 BEAST_EXPECT(env.balance(t.dst, USD) == USD(0));
1375 auto const gw =
Account{
"gateway"};
1376 auto const USD = gw[
"USD"];
1377 Env env{*
this, features};
1378 auto const baseFee = env.current()->fees().base;
1379 env.fund(
XRP(5000), gw);
1397 using namespace test::jtx;
1400 auto const alice =
Account(
"alice");
1401 auto const bob =
Account(
"bob");
1402 auto const carol =
Account(
"carol");
1403 auto const gw =
Account{
"gateway"};
1404 auto const USD = gw[
"USD"];
1408 Env env{*
this, features};
1409 auto const baseFee = env.current()->fees().base;
1410 env.fund(
XRP(10'000), alice, bob, gw);
1412 env(
rate(gw, 1.25));
1414 env.trust(USD(100'000), alice);
1415 env.trust(USD(100'000), bob);
1417 env(
pay(gw, alice, USD(10'000)));
1418 env(
pay(gw, bob, USD(10'000)));
1422 auto const preAlice = env.balance(alice, USD);
1423 auto const seq1 = env.seq(alice);
1424 auto const delta = USD(125);
1428 fee(baseFee * 150));
1437 fee(baseFee * 150));
1440 BEAST_EXPECT(env.balance(alice, USD) == preAlice - delta);
1441 BEAST_EXPECT(env.balance(bob, USD) == USD(10'100));
1445 Env env{*
this, features};
1446 auto const baseFee = env.current()->fees().base;
1447 env.fund(
XRP(10'000), alice, bob, gw);
1449 env(
rate(gw, 1.25));
1451 env.trust(USD(100'000), alice);
1452 env.trust(USD(100'000), bob);
1454 env(
pay(gw, alice, USD(10'000)));
1455 env(
pay(gw, bob, USD(10'000)));
1459 auto const preAlice = env.balance(alice, USD);
1460 auto const seq1 = env.seq(alice);
1461 auto const delta = USD(125);
1465 fee(baseFee * 150));
1471 env(
rate(gw, 1.26));
1478 fee(baseFee * 150));
1481 BEAST_EXPECT(env.balance(alice, USD) == preAlice - delta);
1482 BEAST_EXPECT(env.balance(bob, USD) == USD(10'100));
1487 Env env{*
this, features};
1488 auto const baseFee = env.current()->fees().base;
1489 env.fund(
XRP(10'000), alice, bob, gw);
1491 env(
rate(gw, 1.25));
1493 env.trust(USD(100'000), alice);
1494 env.trust(USD(100'000), bob);
1496 env(
pay(gw, alice, USD(10'000)));
1497 env(
pay(gw, bob, USD(10'000)));
1501 auto const preAlice = env.balance(alice, USD);
1502 auto const seq1 = env.seq(alice);
1503 auto const delta = USD(125);
1507 fee(baseFee * 150));
1513 env(
rate(gw, 1.00));
1520 fee(baseFee * 150));
1523 BEAST_EXPECT(env.balance(alice, USD) == preAlice - delta);
1524 BEAST_EXPECT(env.balance(bob, USD) == USD(10125));
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);
1555 env(
rate(gw, 1.00));
1562 BEAST_EXPECT(env.balance(alice, USD) == preAlice);
1563 BEAST_EXPECT(env.balance(bob, USD) == USD(10000));
1571 using namespace test::jtx;
1574 auto const alice =
Account(
"alice");
1575 auto const bob =
Account(
"bob");
1576 auto const gw =
Account{
"gateway"};
1577 auto const USD = gw[
"USD"];
1581 Env env{*
this, features};
1582 auto const baseFee = env.current()->fees().base;
1583 env.fund(
XRP(1'000), alice, bob, gw);
1586 env.trust(USD(10'000), alice, bob);
1588 env(
pay(gw, alice, USD(1'000)));
1589 env(
pay(gw, bob, USD(1'000)));
1593 auto seq1 = env.seq(alice);
1594 auto const delta = USD(125);
1598 fee(baseFee * 150));
1602 auto const preBobLimit = env.limit(bob, USD);
1606 fee(baseFee * 150));
1608 auto const postBobLimit = env.limit(bob, USD);
1610 BEAST_EXPECT(postBobLimit == preBobLimit);
1618 using namespace test::jtx;
1621 auto const alice =
Account(
"alice");
1622 auto const bob =
Account(
"bob");
1623 auto const carol =
Account(
"carol");
1624 auto const gw =
Account{
"gateway"};
1625 auto const USD = gw[
"USD"];
1627 auto const aliceUSD = alice[
"USD"];
1628 auto const bobUSD = bob[
"USD"];
1630 Env env{*
this, features};
1631 auto const baseFee = env.current()->fees().base;
1632 env.fund(
XRP(1'000), alice, bob, gw);
1637 env(
trust(alice, USD(10'000)));
1638 env(
trust(bob, USD(10'000)));
1640 env(
pay(gw, alice, USD(1'000)));
1644 auto seq1 = env.seq(alice);
1645 auto const delta = USD(125);
1655 env(
trust(bob, USD(10'000)));
1657 env(
pay(gw, bob, USD(1'000)));
1661 seq1 = env.seq(alice);
1665 fee(baseFee * 150));
1672 fee(baseFee * 150));
1680 using namespace test::jtx;
1683 auto const alice =
Account(
"alice");
1684 auto const bob =
Account(
"bob");
1685 auto const carol =
Account(
"carol");
1686 auto const gw =
Account{
"gateway"};
1687 auto const USD = gw[
"USD"];
1691 Env env{*
this, features};
1692 auto const baseFee = env.current()->fees().base;
1693 env.fund(
XRP(10'000), alice, bob, gw);
1696 env.trust(USD(100'000), alice);
1697 env.trust(USD(100'000), bob);
1699 env(
pay(gw, alice, USD(10'000)));
1700 env(
pay(gw, bob, USD(10'000)));
1706 auto seq1 = env.seq(alice);
1707 auto const delta = USD(125);
1722 seq1 = env.seq(alice);
1726 fee(baseFee * 150));
1737 fee(baseFee * 150));
1745 seq1 = env.seq(alice);
1749 fee(baseFee * 150));
1764 Env env{*
this, features};
1765 auto const baseFee = env.current()->fees().base;
1766 env.fund(
XRP(10'000), alice, bob, gw);
1769 env(
trust(alice, USD(100'000)));
1770 env(
trust(bob, USD(100'000)));
1772 env(
pay(gw, alice, USD(10'000)));
1773 env(
pay(gw, bob, USD(10'000)));
1781 auto seq1 = env.seq(alice);
1782 auto const delta = USD(125);
1797 seq1 = env.seq(alice);
1801 fee(baseFee * 150));
1812 fee(baseFee * 150));
1821 seq1 = env.seq(alice);
1825 fee(baseFee * 150));
1840 Env env{*
this, features};
1841 auto const baseFee = env.current()->fees().base;
1842 env.fund(
XRP(10'000), alice, bob, gw);
1845 env(
trust(alice, USD(100'000)));
1846 env(
trust(bob, USD(100'000)));
1848 env(
pay(gw, alice, USD(10'000)));
1849 env(
pay(gw, bob, USD(10'000)));
1857 auto seq1 = env.seq(alice);
1858 auto const delta = USD(125);
1873 seq1 = env.seq(alice);
1877 fee(baseFee * 150));
1898 seq1 = env.seq(alice);
1902 fee(baseFee * 150));
1917 testcase(
"IOU Insufficient Funds");
1918 using namespace test::jtx;
1921 auto const alice =
Account(
"alice");
1922 auto const bob =
Account(
"bob");
1923 auto const carol =
Account(
"carol");
1924 auto const gw =
Account{
"gateway"};
1925 auto const USD = gw[
"USD"];
1929 Env env{*
this, features};
1930 auto const baseFee = env.current()->fees().base;
1931 env.fund(
XRP(10'000), alice, bob, gw);
1934 env.trust(USD(100'000), alice);
1935 env.trust(USD(100'000), bob);
1937 env(
pay(gw, alice, USD(10'000)));
1938 env(
pay(gw, bob, USD(10'000)));
1942 auto const delta = USD(1'000);
1946 fee(baseFee * 150));
1953 Env env{*
this, features};
1954 auto const baseFee = env.current()->fees().base;
1955 env.fund(
XRP(10'000), alice, bob, gw);
1958 env.trust(USD(100'000), alice);
1959 env.trust(USD(100'000), bob);
1961 env(
pay(gw, alice, USD(10'000)));
1962 env(
pay(gw, bob, USD(10'000)));
1965 auto const delta = USD(1'000);
1969 fee(baseFee * 150));
1985 using namespace test::jtx;
1988 auto const alice =
Account(
"alice");
1989 auto const bob =
Account(
"bob");
1990 auto const gw =
Account{
"gateway"};
1991 auto const USD = gw[
"USD"];
1995 Env env(*
this, features);
1996 auto const baseFee = env.
current()->fees().base;
1997 env.
fund(
XRP(10'000), alice, bob, gw);
2000 env.
trust(USD(100000000000000000), alice);
2001 env.
trust(USD(100000000000000000), bob);
2003 env(
pay(gw, alice, USD(10000000000000000)));
2004 env(
pay(gw, bob, USD(1)));
2007 bool const largeMantissa = features[featureSingleAssetVault] || features[featureLendingProtocol];
2017 auto const seq1 = env.
seq(alice);
2022 fee(baseFee * 150));
2029 fee(baseFee * 150));
2039 using namespace jtx;
2042 for (
bool const withTokenEscrow : {
false,
true})
2044 auto const amend = withTokenEscrow ? features : features - featureTokenEscrow;
2045 Env env{*
this, amend};
2046 auto const baseFee = env.
current()->fees().base;
2047 auto const alice =
Account(
"alice");
2048 auto const bob =
Account(
"bob");
2049 auto const gw =
Account(
"gw");
2050 env.fund(
XRP(5000), bob);
2052 MPTTester mptGw(env, gw, {.holders = {alice}});
2054 mptGw.authorize({.account = alice});
2055 auto const MPT = mptGw[
"MPT"];
2056 env(
pay(gw, alice,
MPT(10'000)));
2062 auto const seq1 = env.seq(alice);
2075 auto const seq2 = env.seq(alice);
2092 using namespace test::jtx;
2095 for (
bool const withMPT : {
true,
false})
2097 auto const amend = withMPT ? features : features - featureMPTokensV1;
2098 Env env{*
this, amend};
2099 auto const baseFee = env.
current()->fees().base;
2100 auto const alice =
Account(
"alice");
2101 auto const bob =
Account(
"bob");
2102 auto const gw =
Account(
"gw");
2103 env.fund(
XRP(1'000), alice, bob, gw);
2107 jv[jss::Amount][jss::mpt_issuance_id] =
"00000004A407AF5856CCF3C42619DAA925813FC955C72983";
2108 jv[jss::Amount][jss::value] =
"-1";
2117 Env env{*
this, features};
2118 auto const baseFee = env.current()->fees().base;
2119 auto const alice =
Account(
"alice");
2120 auto const bob =
Account(
"bob");
2121 auto const gw =
Account(
"gw");
2123 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
2125 mptGw.authorize({.account = alice});
2126 mptGw.authorize({.account = bob});
2127 auto const MPT = mptGw[
"MPT"];
2128 env(
pay(gw, alice,
MPT(10'000)));
2129 env(
pay(gw, bob,
MPT(10'000)));
2145 using namespace test::jtx;
2150 Env env{*
this, features};
2151 auto const baseFee = env.current()->fees().base;
2152 auto const alice =
Account(
"alice");
2153 auto const gw =
Account(
"gw");
2155 MPTTester mptGw(env, gw, {.holders = {alice}});
2157 mptGw.authorize({.account = alice});
2158 auto const MPT = mptGw[
"MPT"];
2159 env(
pay(gw, alice,
MPT(10'000)));
2172 Env env{*
this, features};
2173 auto const baseFee = env.current()->fees().base;
2174 auto const alice =
Account(
"alice");
2175 auto const bob =
Account(
"bob");
2176 auto const gw =
Account(
"gw");
2177 env.fund(
XRP(10'000), alice, bob, gw);
2182 jv[jss::Amount][jss::mpt_issuance_id] =
"00000004A407AF5856CCF3C42619DAA925813FC955C72983";
2193 Env env{*
this, features};
2194 auto const baseFee = env.current()->fees().base;
2195 auto const alice =
Account(
"alice");
2196 auto const bob =
Account(
"bob");
2197 auto const gw =
Account(
"gw");
2199 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
2201 mptGw.authorize({.account = alice});
2202 mptGw.authorize({.account = bob});
2203 auto const MPT = mptGw[
"MPT"];
2204 env(
pay(gw, alice,
MPT(10'000)));
2205 env(
pay(gw, bob,
MPT(10'000)));
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}});
2226 auto const MPT = mptGw[
"MPT"];
2238 Env env{*
this, features};
2239 auto const baseFee = env.current()->fees().base;
2240 auto const alice =
Account(
"alice");
2241 auto const bob =
Account(
"bob");
2242 auto const gw =
Account(
"gw");
2244 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
2247 mptGw.authorize({.account = alice});
2248 mptGw.authorize({.account = gw, .holder = alice});
2249 auto const MPT = mptGw[
"MPT"];
2250 env(
pay(gw, alice,
MPT(10'000)));
2254 mptGw.authorize({.account = gw, .holder = alice, .flags =
tfMPTUnauthorize});
2266 Env env{*
this, features};
2267 auto const baseFee = env.current()->fees().base;
2268 auto const alice =
Account(
"alice");
2269 auto const bob =
Account(
"bob");
2270 auto const gw =
Account(
"gw");
2272 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
2275 mptGw.authorize({.account = alice});
2276 mptGw.authorize({.account = gw, .holder = alice});
2277 mptGw.authorize({.account = bob});
2278 mptGw.authorize({.account = gw, .holder = bob});
2279 auto const MPT = mptGw[
"MPT"];
2280 env(
pay(gw, alice,
MPT(10'000)));
2281 env(
pay(gw, bob,
MPT(10'000)));
2285 mptGw.authorize({.account = gw, .holder = bob, .flags =
tfMPTUnauthorize});
2297 Env env{*
this, features};
2298 auto const baseFee = env.current()->fees().base;
2299 auto const alice =
Account(
"alice");
2300 auto const bob =
Account(
"bob");
2301 auto const gw =
Account(
"gw");
2303 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
2306 mptGw.authorize({.account = alice});
2307 mptGw.authorize({.account = bob});
2308 auto const MPT = mptGw[
"MPT"];
2309 env(
pay(gw, alice,
MPT(10'000)));
2310 env(
pay(gw, bob,
MPT(10'000)));
2314 mptGw.set({.account = gw, .holder = alice, .flags =
tfMPTLock});
2326 Env env{*
this, features};
2327 auto const baseFee = env.current()->fees().base;
2328 auto const alice =
Account(
"alice");
2329 auto const bob =
Account(
"bob");
2330 auto const gw =
Account(
"gw");
2332 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
2335 mptGw.authorize({.account = alice});
2336 mptGw.authorize({.account = bob});
2337 auto const MPT = mptGw[
"MPT"];
2338 env(
pay(gw, alice,
MPT(10'000)));
2339 env(
pay(gw, bob,
MPT(10'000)));
2343 mptGw.set({.account = gw, .holder = bob, .flags =
tfMPTLock});
2355 Env env{*
this, features};
2356 auto const baseFee = env.current()->fees().base;
2357 auto const alice =
Account(
"alice");
2358 auto const bob =
Account(
"bob");
2359 auto const gw =
Account(
"gw");
2361 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
2363 mptGw.authorize({.account = alice});
2364 mptGw.authorize({.account = bob});
2365 auto const MPT = mptGw[
"MPT"];
2366 env(
pay(gw, alice,
MPT(10'000)));
2367 env(
pay(gw, bob,
MPT(10'000)));
2380 Env env{*
this, features};
2381 auto const baseFee = env.current()->fees().base;
2382 auto const alice =
Account(
"alice");
2383 auto const bob =
Account(
"bob");
2384 auto const gw =
Account(
"gw");
2386 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
2388 mptGw.authorize({.account = alice});
2389 mptGw.authorize({.account = bob});
2390 auto const MPT = mptGw[
"MPT"];
2391 env(
pay(gw, bob,
MPT(10)));
2404 Env env{*
this, features};
2405 auto const baseFee = env.current()->fees().base;
2406 auto const alice =
Account(
"alice");
2407 auto const bob =
Account(
"bob");
2408 auto const gw =
Account(
"gw");
2410 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
2412 mptGw.authorize({.account = alice});
2413 mptGw.authorize({.account = bob});
2414 auto const MPT = mptGw[
"MPT"];
2415 env(
pay(gw, alice,
MPT(10)));
2416 env(
pay(gw, bob,
MPT(10)));
2432 using namespace test::jtx;
2437 Env env{*
this, features};
2438 auto const baseFee = env.current()->fees().base;
2439 auto const alice =
Account(
"alice");
2440 auto const bob =
Account(
"bob");
2441 auto const gw =
Account(
"gw");
2443 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
2446 mptGw.authorize({.account = alice});
2447 mptGw.authorize({.account = gw, .holder = alice});
2448 mptGw.authorize({.account = bob});
2449 mptGw.authorize({.account = gw, .holder = bob});
2450 auto const MPT = mptGw[
"MPT"];
2451 env(
pay(gw, alice,
MPT(10'000)));
2452 env(
pay(gw, bob,
MPT(10'000)));
2455 auto const seq1 = env.seq(alice);
2464 mptGw.authorize({.account = gw, .holder = bob, .flags =
tfMPTUnauthorize});
2476 Env env{*
this, features};
2477 auto const baseFee = env.current()->fees().base;
2478 auto const alice =
Account(
"alice");
2479 auto const bob =
Account(
"bob");
2480 env.fund(
XRP(10'000), alice, bob);
2483 auto const seq1 = env.seq(alice);
2489 sleNew->setAccountID(sfDestination, bob);
2490 sleNew->setFieldAmount(sfAmount, amt);
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}});
2515 mptGw.authorize({.account = alice});
2516 mptGw.authorize({.account = bob});
2517 auto const MPT = mptGw[
"MPT"];
2518 env(
pay(gw, alice,
MPT(10'000)));
2519 env(
pay(gw, bob,
MPT(10'000)));
2522 auto const seq1 = env.seq(alice);
2531 mptGw.set({.account = gw, .holder = bob, .flags =
tfMPTLock});
2546 using namespace test::jtx;
2551 Env env{*
this, features};
2552 auto const baseFee = env.current()->fees().base;
2553 auto const acctReserve = env.current()->fees().reserve;
2554 auto const incReserve = env.current()->fees().increment;
2556 auto const alice =
Account(
"alice");
2557 auto const bob =
Account(
"bob");
2558 auto const gw =
Account(
"gw");
2559 env.fund(acctReserve + (incReserve - 1), bob);
2562 MPTTester mptGw(env, gw, {.holders = {alice}});
2564 mptGw.authorize({.account = alice});
2565 auto const MPT = mptGw[
"MPT"];
2566 env(
pay(gw, alice,
MPT(10'000)));
2569 auto const seq1 = env.seq(alice);
2587 Env env{*
this, features};
2588 auto const baseFee = env.current()->fees().base;
2589 auto const alice =
Account(
"alice");
2590 auto const bob =
Account(
"bob");
2591 auto const gw =
Account(
"gw");
2592 env.fund(
XRP(10'000), bob);
2595 MPTTester mptGw(env, gw, {.holders = {alice}});
2597 mptGw.authorize({.account = alice});
2598 auto const MPT = mptGw[
"MPT"];
2599 env(
pay(gw, alice,
MPT(10'000)));
2602 auto const seq1 = env.seq(alice);
2620 Env env{*
this, features};
2621 auto const baseFee = env.current()->fees().base;
2622 auto const alice =
Account(
"alice");
2623 auto const bob =
Account(
"bob");
2624 auto const carol =
Account(
"carol");
2625 auto const gw =
Account(
"gw");
2626 env.fund(
XRP(10'000), bob, carol);
2629 MPTTester mptGw(env, gw, {.holders = {alice}});
2631 mptGw.authorize({.account = alice});
2632 auto const MPT = mptGw[
"MPT"];
2633 env(
pay(gw, alice,
MPT(10'000)));
2636 auto const seq1 = env.seq(alice);
2657 using namespace test::jtx;
2662 Env env{*
this, features};
2663 auto const baseFee = env.current()->fees().base;
2664 auto const alice =
Account(
"alice");
2665 auto const bob =
Account(
"bob");
2666 auto const gw =
Account(
"gw");
2668 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
2671 mptGw.authorize({.account = alice});
2672 mptGw.authorize({.account = gw, .holder = alice});
2673 mptGw.authorize({.account = bob});
2674 mptGw.authorize({.account = gw, .holder = bob});
2675 auto const MPT = mptGw[
"MPT"];
2676 env(
pay(gw, alice,
MPT(10'000)));
2677 env(
pay(gw, bob,
MPT(10'000)));
2680 auto const seq1 = env.seq(alice);
2689 mptGw.authorize({.account = gw, .holder = alice, .flags =
tfMPTUnauthorize});
2697 Env env{*
this, features};
2698 auto const baseFee = env.current()->fees().base;
2699 auto const alice =
Account(
"alice");
2700 auto const bob =
Account(
"bob");
2701 env.fund(
XRP(10'000), alice, bob);
2703 auto const seq1 = env.seq(alice);
2709 sleNew->setAccountID(sfDestination, bob);
2710 sleNew->setFieldAmount(sfAmount, amt);
2726 using namespace jtx;
2729 Env env{*
this, features};
2730 auto const baseFee = env.current()->fees().base;
2731 auto const alice =
Account(
"alice");
2732 auto const bob =
Account(
"bob");
2733 auto const carol =
Account(
"carol");
2734 auto const gw =
Account(
"gw");
2735 env.fund(
XRP(5000), bob);
2737 MPTTester mptGw(env, gw, {.holders = {alice, carol}});
2739 mptGw.authorize({.account = alice});
2740 mptGw.authorize({.account = carol});
2741 auto const MPT = mptGw[
"MPT"];
2742 env(
pay(gw, alice,
MPT(10'000)));
2743 env(
pay(gw, carol,
MPT(10'000)));
2746 auto outstandingMPT = env.balance(gw,
MPT);
2749 auto const seq1 = env.seq(alice);
2751 auto const preAliceMPT = env.balance(alice,
MPT);
2752 auto const preBobMPT = env.balance(bob,
MPT);
2760 BEAST_EXPECT(env.balance(alice,
MPT) == preAliceMPT -
MPT(1'000));
2762 BEAST_EXPECT(env.balance(bob,
MPT) == preBobMPT);
2764 BEAST_EXPECT(env.balance(gw,
MPT) == outstandingMPT);
2768 auto const preAliceMPT = env.balance(alice,
MPT);
2769 auto const preBobMPT = env.balance(bob,
MPT);
2777 BEAST_EXPECT(env.balance(alice,
MPT) == preAliceMPT);
2779 BEAST_EXPECT(env.balance(bob,
MPT) == preBobMPT +
MPT(1'000));
2781 BEAST_EXPECT(env.balance(gw,
MPT) == outstandingMPT);
2786 auto const seq2 = env.seq(alice);
2788 auto const preAliceMPT = env.balance(alice,
MPT);
2789 auto const preBobMPT = env.balance(bob,
MPT);
2798 BEAST_EXPECT(env.balance(alice,
MPT) == preAliceMPT -
MPT(1'000));
2800 BEAST_EXPECT(env.balance(bob,
MPT) == preBobMPT);
2802 BEAST_EXPECT(env.balance(gw,
MPT) == outstandingMPT);
2806 auto const preAliceMPT = env.balance(alice,
MPT);
2807 auto const preBobMPT = env.balance(bob,
MPT);
2811 BEAST_EXPECT(env.balance(alice,
MPT) == preAliceMPT +
MPT(1'000));
2813 BEAST_EXPECT(env.balance(bob,
MPT) == preBobMPT);
2815 BEAST_EXPECT(env.balance(gw,
MPT) == outstandingMPT);
2821 auto const seq = env.
seq(alice);
2822 auto const preAliceMPT = env.balance(alice,
MPT);
2830 BEAST_EXPECT(env.balance(alice,
MPT) == preAliceMPT -
MPT(1'000));
2832 BEAST_EXPECT(env.balance(gw,
MPT) == outstandingMPT);
2842 BEAST_EXPECT(env.balance(alice,
MPT) == preAliceMPT);
2844 BEAST_EXPECT(env.balance(gw,
MPT) == outstandingMPT);
2850 auto const seq = env.
seq(alice);
2851 auto const preAliceMPT = env.balance(alice,
MPT);
2860 BEAST_EXPECT(env.balance(alice,
MPT) == preAliceMPT -
MPT(1'000));
2862 BEAST_EXPECT(env.balance(gw,
MPT) == outstandingMPT);
2868 BEAST_EXPECT(env.balance(alice,
MPT) == preAliceMPT);
2870 BEAST_EXPECT(env.balance(gw,
MPT) == outstandingMPT);
2876 auto const preAliceMPT = env.balance(alice,
MPT);
2877 auto const preBobMPT = env.balance(bob,
MPT);
2878 auto const preCarolMPT = env.balance(carol,
MPT);
2893 BEAST_EXPECT(env.balance(alice,
MPT) == preAliceMPT -
MPT(1'000));
2895 BEAST_EXPECT(env.balance(bob,
MPT) == preBobMPT);
2897 BEAST_EXPECT(env.balance(carol,
MPT) == preCarolMPT -
MPT(1'000));
2899 BEAST_EXPECT(env.balance(gw,
MPT) == outstandingMPT);
2905 Env env{*
this, features};
2906 auto const baseFee = env.current()->fees().base;
2907 auto const alice =
Account(
"alice");
2908 auto const bob =
Account(
"bob");
2909 auto const gw =
Account(
"gw");
2911 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
2913 mptGw.authorize({.account = alice});
2914 mptGw.authorize({.account = bob});
2915 auto const MPT = mptGw[
"MPT"];
2919 auto const preAliceMPT = env.balance(alice,
MPT);
2920 auto const preBobMPT = env.balance(bob,
MPT);
2921 auto const outstandingMPT = env.balance(gw,
MPT);
2923 auto const seq1 = env.seq(alice);
2927 fee(baseFee * 150));
2930 BEAST_EXPECT(env.balance(alice,
MPT) == preAliceMPT -
MPT(1));
2932 BEAST_EXPECT(env.balance(bob,
MPT) == preBobMPT);
2934 BEAST_EXPECT(env.balance(gw,
MPT) == outstandingMPT);
2944 BEAST_EXPECT(env.balance(alice,
MPT) == preAliceMPT -
MPT(1));
2947 BEAST_EXPECT(env.balance(bob,
MPT) == preBobMPT +
MPT(1));
2949 BEAST_EXPECT(env.balance(gw,
MPT) == outstandingMPT);
2956 Env env{*
this, features};
2957 auto const baseFee = env.current()->fees().base;
2958 auto const alice =
Account(
"alice");
2959 auto const bob =
Account(
"bob");
2960 auto const gw =
Account(
"gw");
2962 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
2964 mptGw.authorize({.account = alice});
2965 mptGw.authorize({.account = bob});
2966 auto const MPT = mptGw[
"MPT"];
2970 auto const preAliceMPT = env.balance(alice,
MPT);
2971 auto const preBobMPT = env.balance(bob,
MPT);
2972 auto const outstandingMPT = env.balance(gw,
MPT);
2975 auto const seq1 = env.seq(alice);
2979 fee(baseFee * 150));
2983 auto const seq2 = env.seq(alice);
2987 fee(baseFee * 150));
2992 BEAST_EXPECT(env.balance(bob,
MPT) == preBobMPT);
2994 BEAST_EXPECT(env.balance(gw,
MPT) == outstandingMPT);
3015 BEAST_EXPECT(env.balance(gw,
MPT) == outstandingMPT);
3023 using namespace jtx;
3026 auto const alice =
Account(
"alice");
3027 auto const bob =
Account(
"bob");
3028 auto const carol =
Account(
"carol");
3029 auto const gw =
Account{
"gateway"};
3033 Env env{*
this, features};
3034 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
3036 mptGw.authorize({.account = alice});
3037 mptGw.authorize({.account = bob});
3038 auto const MPT = mptGw[
"MPT"];
3039 env(
pay(gw, alice,
MPT(10'000)));
3040 env(
pay(gw, bob,
MPT(10'000)));
3042 auto const aseq = env.seq(alice);
3043 auto const bseq = env.seq(bob);
3108 Env env{*
this, features};
3109 MPTTester mptGw(env, gw, {.holders = {alice, bob, carol}});
3111 mptGw.authorize({.account = alice});
3112 mptGw.authorize({.account = bob});
3113 mptGw.authorize({.account = carol});
3114 auto const MPT = mptGw[
"MPT"];
3115 env(
pay(gw, alice,
MPT(10'000)));
3116 env(
pay(gw, bob,
MPT(10'000)));
3117 env(
pay(gw, carol,
MPT(10'000)));
3119 auto const aseq = env.seq(alice);
3120 auto const bseq = env.seq(bob);
3196 using namespace test::jtx;
3201 Env env{*
this, features};
3202 auto const baseFee = env.current()->fees().base;
3203 auto const alice =
Account(
"alice");
3204 auto const gw =
Account(
"gw");
3206 MPTTester mptGw(env, gw, {.holders = {alice}});
3208 mptGw.authorize({.account = alice});
3209 auto const MPT = mptGw[
"MPT"];
3210 env(
pay(gw, alice,
MPT(10'000)));
3214 auto const seq1 = env.seq(alice);
3215 auto const preAliceMPT = env.balance(alice,
MPT);
3216 auto const preOutstanding = env.balance(gw,
MPT);
3218 BEAST_EXPECT(preOutstanding ==
MPT(-10'000));
3219 BEAST_EXPECT(preEscrowed == 0);
3224 fee(baseFee * 150));
3227 BEAST_EXPECT(env.balance(alice,
MPT) == preAliceMPT -
MPT(1'000));
3229 BEAST_EXPECT(env.balance(gw,
MPT) == preOutstanding);
3236 fee(baseFee * 150));
3239 BEAST_EXPECT(env.balance(alice,
MPT) == preAliceMPT -
MPT(1'000));
3241 BEAST_EXPECT(env.balance(gw,
MPT) == preOutstanding +
MPT(1'000));
3250 using namespace test::jtx;
3253 auto const alice =
Account(
"alice");
3254 auto const bob =
Account(
"bob");
3255 auto const carol =
Account(
"carol");
3256 auto const gw =
Account{
"gateway"};
3257 auto const USD = gw[
"USD"];
3261 Env env{*
this, features};
3262 auto const baseFee = env.current()->fees().base;
3263 auto const alice =
Account(
"alice");
3264 auto const bob =
Account(
"bob");
3265 auto const gw =
Account(
"gw");
3267 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
3270 mptGw.authorize({.account = alice});
3271 mptGw.authorize({.account = bob});
3272 auto const MPT = mptGw[
"MPT"];
3273 env(
pay(gw, alice,
MPT(10'000)));
3274 env(
pay(gw, bob,
MPT(10'000)));
3278 auto const preAlice = env.balance(alice,
MPT);
3279 auto const seq1 = env.seq(alice);
3280 auto const delta =
MPT(125);
3284 fee(baseFee * 150));
3291 BEAST_EXPECT(env.balance(gw,
MPT) ==
MPT(-20'000));
3297 fee(baseFee * 150));
3300 BEAST_EXPECT(env.balance(alice,
MPT) == preAlice - delta);
3301 BEAST_EXPECT(env.balance(bob,
MPT) ==
MPT(10'100));
3303 auto const escrowedWithFix = env.current()->rules().enabled(fixTokenEscrowV1) ? 0 : 25;
3304 auto const outstandingWithFix =
3305 env.current()->rules().enabled(fixTokenEscrowV1) ?
MPT(19'975) :
MPT(20'000);
3308 BEAST_EXPECT(env.balance(gw,
MPT) == -outstandingWithFix);
3313 Env env{*
this, features};
3314 auto const baseFee = env.current()->fees().base;
3315 auto const alice =
Account(
"alice");
3316 auto const bob =
Account(
"bob");
3317 auto const gw =
Account(
"gw");
3319 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
3322 mptGw.authorize({.account = alice});
3323 mptGw.authorize({.account = bob});
3324 auto const MPT = mptGw[
"MPT"];
3325 env(
pay(gw, alice,
MPT(10'000)));
3326 env(
pay(gw, bob,
MPT(10'000)));
3330 auto const preAlice = env.balance(alice,
MPT);
3331 auto const preBob = env.balance(bob,
MPT);
3332 auto const seq1 = env.seq(alice);
3333 auto const delta =
MPT(125);
3338 fee(baseFee * 150));
3347 BEAST_EXPECT(env.balance(alice,
MPT) == preAlice);
3348 BEAST_EXPECT(env.balance(bob,
MPT) == preBob);
3349 BEAST_EXPECT(env.balance(gw,
MPT) ==
MPT(-20'000));
3356 Env env{*
this, features};
3357 auto const baseFee = env.current()->fees().base;
3358 auto const alice =
Account(
"alice");
3359 auto const bob =
Account(
"bob");
3360 auto const gw =
Account(
"gw");
3362 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
3365 mptGw.authorize({.account = alice});
3366 mptGw.authorize({.account = bob});
3367 auto const MPT = mptGw[
"MPT"];
3368 env(
pay(gw, alice,
MPT(10'000)));
3369 env(
pay(gw, bob,
MPT(10'000)));
3373 auto const preAlice = env.balance(alice,
MPT);
3374 auto const seq1 = env.seq(alice);
3375 auto const delta =
MPT(125);
3379 fee(baseFee * 150));
3386 BEAST_EXPECT(env.balance(gw,
MPT) ==
MPT(-20'000));
3392 fee(baseFee * 150));
3395 BEAST_EXPECT(env.balance(alice,
MPT) == preAlice - delta);
3398 BEAST_EXPECT(env.balance(gw,
MPT) ==
MPT(-19'875));
3406 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 bob =
Account(
"bob");
3413 auto const gw =
Account(
"gw");
3415 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
3418 mptGw.authorize({.account = alice});
3419 mptGw.authorize({.account = gw, .holder = alice});
3420 mptGw.authorize({.account = bob});
3421 mptGw.authorize({.account = gw, .holder = bob});
3422 auto const MPT = mptGw[
"MPT"];
3423 env(
pay(gw, alice,
MPT(10'000)));
3426 auto seq = env.
seq(alice);
3427 auto const delta =
MPT(125);
3432 fee(baseFee * 150));
3439 fee(baseFee * 150));
3447 using namespace test::jtx;
3450 Env env{*
this, features};
3451 auto const baseFee = env.current()->fees().base;
3452 auto const alice =
Account(
"alice");
3453 auto const bob =
Account(
"bob");
3454 auto const gw =
Account(
"gw");
3456 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
3458 mptGw.authorize({.account = alice});
3459 mptGw.authorize({.account = bob});
3460 auto const MPT = mptGw[
"MPT"];
3461 env(
pay(gw, alice,
MPT(10'000)));
3462 env(
pay(gw, bob,
MPT(10'000)));
3466 auto seq1 = env.seq(alice);
3471 fee(baseFee * 150));
3475 mptGw.set({.account = gw, .holder = alice, .flags =
tfMPTLock});
3476 mptGw.set({.account = gw, .holder = bob, .flags =
tfMPTLock});
3495 using namespace test::jtx;
3498 Env env{*
this, features};
3499 auto const baseFee = env.current()->fees().base;
3500 auto const alice =
Account(
"alice");
3501 auto const bob =
Account(
"bob");
3502 auto const gw =
Account(
"gw");
3504 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
3506 mptGw.authorize({.account = alice});
3507 mptGw.authorize({.account = bob});
3508 auto const MPT = mptGw[
"MPT"];
3509 env(
pay(gw, alice,
MPT(10'000)));
3510 env(
pay(gw, bob,
MPT(10'000)));
3525 auto seq = env.
seq(alice);
3529 fee(baseFee * 150));
3536 fee(baseFee * 150));
3543 auto seq = env.
seq(alice);
3548 fee(baseFee * 150));
3561 using namespace test::jtx;
3566 Env env{*
this, features};
3567 auto const baseFee = env.current()->fees().base;
3568 auto const alice =
Account(
"alice");
3569 auto const bob =
Account(
"bob");
3570 auto const gw =
Account(
"gw");
3572 MPTTester mptGw(env, gw, {.holders = {alice, bob}});
3574 mptGw.authorize({.account = alice});
3575 mptGw.authorize({.account = bob});
3576 auto const MPT = mptGw[
"MPT"];
3577 env(
pay(gw, alice,
MPT(10'000)));
3578 env(
pay(gw, bob,
MPT(10'000)));
3581 auto const seq1 = env.seq(alice);
3585 fee(baseFee * 150));
3589 env(
pay(alice, gw,
MPT(9'990)));
3590 env(
pay(bob, gw,
MPT(10'000)));
3591 BEAST_EXPECT(env.balance(alice,
MPT) ==
MPT(0));
3593 BEAST_EXPECT(env.balance(bob,
MPT) ==
MPT(0));
3595 BEAST_EXPECT(env.balance(gw,
MPT) ==
MPT(-10));
3606 env(
pay(bob, gw,
MPT(10)));
3607 mptGw.destroy({.id = mptGw.issuanceID(), .
ownerCount = 0});
3612 Env env{*
this, features};
3613 auto const baseFee = env.current()->fees().base;
3614 auto const alice =
Account(
"alice");
3615 auto const bob =
Account(
"bob");
3616 auto const gw =
Account(
"gw");
3617 env.fund(
XRP(10'000), bob);
3620 MPTTester mptGw(env, gw, {.holders = {alice}});
3622 mptGw.authorize({.account = alice});
3623 auto const MPT = mptGw[
"MPT"];
3624 env(
pay(gw, alice,
MPT(10'000)));
3627 auto const seq1 = env.seq(alice);
3635 env(
pay(alice, gw,
MPT(9'990)));
3638 BEAST_EXPECT(env.balance(alice,
MPT) ==
MPT(0));
3649 BEAST_EXPECT(env.balance(alice,
MPT) ==
MPT(0));
3701 using namespace test::jtx;
3703 for (
FeatureBitset const& feats : {
all - featureSingleAssetVault - featureLendingProtocol,
all})
3712BEAST_DEFINE_TESTSUITE(EscrowToken, app,
xrpl);
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 begin() const
const_iterator end() 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.
bool close(NetClock::time_point closeTime, std::optional< std::chrono::milliseconds > consensusDelay=std::nullopt)
Close and advance the ledger.
std::shared_ptr< SLE const > le(Account const &account) const
Return an account root.
void fund(bool setDefaultRipple, STAmount const &amount, Account const &account)
std::uint32_t seq(Account const &account) const
Returns the next sequence number on account.
void trust(STAmount const &amount, Account const &account)
Establish trust lines.
Json::Value rpc(unsigned apiVersion, std::unordered_map< std::string, std::string > const &headers, std::string const &cmd, Args &&... args)
Execute an RPC command.
std::shared_ptr< OpenView const > current() const
Returns the current ledger.
NetClock::time_point now()
Returns the current network time.
Converts to IOU Issue or STAmount.
void create(MPTCreate const &arg=MPTCreate{})
Converts to MPT Issue or STAmount.
xrpl::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 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.
Keylet mptIssuance(std::uint32_t seq, AccountID const &issuer) noexcept
Keylet mptoken(MPTID const &issuanceID, AccountID const &holder) noexcept
auto const finish_time
Set the "FinishAfter" time tag on a JTx.
Json::Value create(AccountID const &account, AccountID const &to, STAmount const &amount)
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
std::array< std::uint8_t, 39 > const cb1
auto const cancel_time
Set the "CancelAfter" time tag on a JTx.
Json::Value finish(AccountID const &account, AccountID const &from, std::uint32_t seq)
std::array< std::uint8_t, 4 > const fb1
Json::Value trust(Account const &account, STAmount const &amount, std::uint32_t flags)
Modify a trust line.
std::uint32_t ownerCount(Env const &env, Account const &account)
Json::Value rate(Account const &account, double multiplier)
Set a transfer rate.
XRP_t const XRP
Converts to XRP Issue or STAmount.
Json::Value pay(AccountID const &account, AccountID const &to, AnyAmount amount)
Create a payment.
Json::Value fclear(Account const &account, std::uint32_t off)
Remove account flag.
FeatureBitset testable_amendments()
Json::Value fset(Account const &account, std::uint32_t on, std::uint32_t off=0)
Add and/or remove flag.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
constexpr std::uint32_t asfGlobalFreeze
constexpr std::uint32_t const tfMPTCanTransfer
std::string to_string(base_uint< Bits, Tag > const &a)
constexpr std::uint32_t const tfMPTRequireAuth
std::uint64_t constexpr maxMPTokenAmount
The maximum amount of MPTokenIssuance.
STAmount amountFromString(Asset const &asset, std::string const &amount)
base_uint< 160, detail::AccountIDTag > AccountID
A 160-bit unsigned that uniquely identifies an account.
constexpr std::uint32_t const tfMPTCanLock
constexpr std::uint32_t tfClearFreeze
TERSubset< CanCvtToTER > TER
constexpr std::uint32_t const tfMPTLock
constexpr std::uint32_t tfClearDeepFreeze
Rate transferRate(ReadView const &view, AccountID const &issuer)
Returns IOU issuer transfer fee as Rate.
constexpr std::uint32_t tfSetDeepFreeze
constexpr std::uint32_t const tfMPTUnauthorize
constexpr std::uint32_t tfSetfAuth
constexpr std::uint32_t asfRequireAuth
@ tecNO_LINE_INSUF_RESERVE
@ tecINSUFFICIENT_RESERVE
Currency const & badCurrency()
We deliberately disallow the currency that looks like "XRP" because too many people were using it ins...
constexpr std::uint32_t tfSetFreeze
constexpr std::uint32_t const tfMPTCanEscrow
constexpr std::uint32_t asfAllowTrustLineLocking
MPTID makeMptID(std::uint32_t sequence, AccountID const &account)
void testMPTCreatePreclaim(FeatureBitset features)
void testMPTFinishDoApply(FeatureBitset features)
void testMPTMetaAndOwnership(FeatureBitset features)
void testIOUBalances(FeatureBitset features)
void testIOUCreatePreclaim(FeatureBitset features)
void testMPTGateway(FeatureBitset features)
void testMPTCanTransfer(FeatureBitset features)
void testIOUFinishPreclaim(FeatureBitset features)
void run() override
Runs the suite.
void testIOUMetaAndOwnership(FeatureBitset features)
void testIOUPrecisionLoss(FeatureBitset features)
void testMPTLock(FeatureBitset features)
void testMPTCancelPreclaim(FeatureBitset features)
void testIOUEnablement(FeatureBitset features)
void testMPTBalances(FeatureBitset features)
void testMPTRequireAuth(FeatureBitset features)
void testIOUFinishDoApply(FeatureBitset features)
jtx::PrettyAmount issuerEscrowed(jtx::Env &env, jtx::Account const &account, Issue const &issue)
void testIOUFreeze(FeatureBitset features)
void testMPTEnablement(FeatureBitset features)
static uint64_t mptEscrowed(jtx::Env const &env, jtx::Account const &account, jtx::MPT const &mpt)
void testIOUCancelPreclaim(FeatureBitset features)
void testIOUGateway(FeatureBitset features)
static uint64_t issuerMPTEscrowed(jtx::Env const &env, jtx::MPT const &mpt)
void testIOULimitAmount(FeatureBitset features)
void testIOUAllowLockingFlag(FeatureBitset features)
void testMPTCreatePreflight(FeatureBitset features)
void testIOULockedRate(FeatureBitset features)
void testMPTFinishPreclaim(FeatureBitset features)
void testIOUINSF(FeatureBitset features)
jtx::PrettyAmount issuerBalance(jtx::Env &env, jtx::Account const &account, Issue const &issue)
void testIOUWithFeats(FeatureBitset features)
void testMPTLockedRate(FeatureBitset features)
void testMPTWithFeats(FeatureBitset features)
void testIOUCreatePreflight(FeatureBitset features)
void testIOURequireAuth(FeatureBitset features)
void testMPTDestroy(FeatureBitset features)
void testIOURippleState(FeatureBitset features)
Represents an XRP or IOU quantity This customizes the string conversion and supports XRP conversions ...
Set the sequence number on a JTx.