494 "test AMMClawback specific amount which exceeds the current "
503 Env env(*
this, features);
507 env.
fund(
XRP(1000000), gw, gw2, alice);
511 env(
fset(gw, asfAllowTrustLineClawback));
516 auto const USD = gw[
"USD"];
517 env.
trust(USD(100000), alice);
518 env(
pay(gw, alice, USD(6000)));
523 auto const EUR = gw2[
"EUR"];
524 env.
trust(EUR(100000), alice);
525 env(
pay(gw2, alice, EUR(6000)));
533 if (!features[fixAMMv1_3])
536 amm.expectBalances(USD(4000), EUR(5000),
IOUAmount{4472135954999580, -12}));
541 amm.expectBalances(USD(4000), EUR(5000),
IOUAmount{4472135954999579, -12}));
560 if (!features[fixAMMv1_3])
563 amm.expectBalances(USD(3000), EUR(3750),
IOUAmount{3354101966249685, -12}));
568 amm.expectBalances(USD(3000), EUR(3750),
IOUAmount{3354101966249684, -12}));
572 if (!features[fixAMMv1_3])
574 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount{3354101966249685, -12}));
578 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount{3354101966249684, -12}));
589 if (!features[fixAMMv1_3])
591 BEAST_EXPECT(amm.expectBalances(
592 STAmount{USD, UINT64_C(2500000000000001), -12},
593 STAmount{EUR, UINT64_C(3125000000000001), -12},
599 amm.expectBalances(USD(2500), EUR(3125),
IOUAmount{2795084971874737, -12}));
602 if (!features[fixAMMv1_3])
605 env.
balance(alice, EUR) ==
STAmount(EUR, UINT64_C(2874999999999999), -12));
609 BEAST_EXPECT(env.
balance(alice, EUR) == EUR(2875));
619 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
621 BEAST_EXPECT(amm.expectBalances(
622 STAmount{USD, UINT64_C(2499000000000002), -12},
623 STAmount{EUR, UINT64_C(3123750000000002), -12},
626 else if (!features[fixAMMClawbackRounding])
629 amm.expectBalances(USD(2499), EUR(3123.75),
IOUAmount{2793966937885987, -12}));
631 else if (features[fixAMMClawbackRounding] && features[fixAMMv1_3])
633 BEAST_EXPECT(amm.expectBalances(
634 STAmount{USD, UINT64_C(2499000000000001), -12},
635 STAmount{EUR, UINT64_C(3123750000000001), -12},
639 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
642 env.
balance(alice, EUR) ==
STAmount(EUR, UINT64_C(2876'249999999998), -12));
644 else if (!features[fixAMMClawbackRounding])
646 BEAST_EXPECT(env.
balance(alice, EUR) == EUR(2876.25));
648 else if (features[fixAMMClawbackRounding] && features[fixAMMv1_3])
651 env.
balance(alice, EUR) ==
STAmount(EUR, UINT64_C(2876'249999999999), -12));
662 BEAST_EXPECT(env.
balance(alice, EUR) ==
STAmount(EUR, UINT64_C(6000000000000000), -12));
665 BEAST_EXPECT(!amm.ammExists());
674 Env env(*
this, features);
679 env.
fund(
XRP(1000000), gw, gw2, alice, bob);
683 env(
fset(gw, asfAllowTrustLineClawback));
688 env(
fset(gw2, asfAllowTrustLineClawback));
693 auto const USD = gw[
"USD"];
694 env.
trust(USD(100000), alice);
695 env(
pay(gw, alice, USD(6000)));
696 env.
trust(USD(100000), bob);
697 env(
pay(gw, bob, USD(5000)));
701 auto const EUR = gw2[
"EUR"];
702 env.
trust(EUR(100000), alice);
703 env(
pay(gw2, alice, EUR(5000)));
704 env.
trust(EUR(100000), bob);
705 env(
pay(gw2, bob, EUR(4000)));
710 BEAST_EXPECT(amm.expectBalances(USD(1000),
XRP(2000),
IOUAmount{1414213562373095, -9}));
711 amm.deposit(alice, USD(1000),
XRP(2000));
712 BEAST_EXPECT(amm.expectBalances(USD(2000),
XRP(4000),
IOUAmount{2828427124746190, -9}));
713 amm.deposit(bob, USD(1000),
XRP(2000));
714 BEAST_EXPECT(amm.expectBalances(USD(3000),
XRP(6000),
IOUAmount{4242640687119285, -9}));
719 if (!features[fixAMMv1_3])
731 if (!features[fixAMMv1_3])
743 if (!features[fixAMMv1_3])
755 auto aliceXrpBalance = env.
balance(alice,
XRP);
771 if (features[fixAMMClawbackRounding] && features[fixAMMv1_3])
782 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
785 amm.expectBalances(USD(2500),
XRP(5000),
IOUAmount{3535533905932738, -9}));
787 else if (!features[fixAMMClawbackRounding])
790 amm.expectBalances(USD(2500),
XRP(5000),
IOUAmount{3535533905932737, -9}));
792 else if (features[fixAMMClawbackRounding] && features[fixAMMv1_3])
794 BEAST_EXPECT(amm.expectBalances(
798 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
800 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount{7071067811865480, -10}));
802 else if (!features[fixAMMClawbackRounding])
804 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount{7071067811865474, -10}));
806 else if (features[fixAMMClawbackRounding] && features[fixAMMv1_3])
808 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount{707106781186548, -9}));
811 BEAST_EXPECT(amm.expectLPTokens(bob,
IOUAmount{1414213562373095, -9}));
824 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
826 BEAST_EXPECT(amm.expectBalances(
827 STAmount{USD, UINT64_C(2490000000000001), -12},
831 else if (!features[fixAMMClawbackRounding])
834 amm.expectBalances(USD(2'490),
XRP(4980),
IOUAmount{3521391770309006, -9}));
836 else if (features[fixAMMClawbackRounding] && features[fixAMMv1_3])
838 BEAST_EXPECT(amm.expectBalances(
839 STAmount{USD, UINT64_C(2490000000000001), -12},
844 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
846 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount{7071067811865480, -10}));
848 else if (!features[fixAMMClawbackRounding])
850 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount{7071067811865474, -10}));
852 else if (features[fixAMMClawbackRounding] && features[fixAMMv1_3])
854 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount{707106781186548, -9}));
857 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
859 BEAST_EXPECT(amm.expectLPTokens(bob,
IOUAmount{1400071426749365, -9}));
861 else if (!features[fixAMMClawbackRounding])
863 BEAST_EXPECT(amm.expectLPTokens(bob,
IOUAmount{1400071426749364, -9}));
865 else if (features[fixAMMClawbackRounding] && features[fixAMMv1_3])
867 BEAST_EXPECT(amm.expectLPTokens(bob,
IOUAmount{1400071426749365, -9}));
877 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
881 else if (!features[fixAMMClawbackRounding])
885 else if (features[fixAMMClawbackRounding] && features[fixAMMv1_3])
892 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
897 else if (!features[fixAMMClawbackRounding])
902 else if (features[fixAMMv1_3] && features[fixAMMClawbackRounding])
908 if (!features[fixAMMv1_3])
916 if (!features[fixAMMv1_3])
935 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
939 else if (!features[fixAMMClawbackRounding])
944 else if (features[fixAMMv1_3] && features[fixAMMClawbackRounding])
950 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount(0)));
951 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
953 BEAST_EXPECT(amm.expectLPTokens(bob,
IOUAmount{1400071426749365, -9}));
955 else if (!features[fixAMMClawbackRounding])
957 BEAST_EXPECT(amm.expectLPTokens(bob,
IOUAmount{1400071426749364, -9}));
959 else if (features[fixAMMClawbackRounding] && features[fixAMMv1_3])
961 BEAST_EXPECT(amm.expectLPTokens(bob,
IOUAmount{1400071426749365, -9}));
964 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
966 BEAST_EXPECT(amm.expectBalances(
967 STAmount{USD, UINT64_C(1990000000000001), -12},
971 else if (!features[fixAMMClawbackRounding])
973 BEAST_EXPECT(amm.expectBalances(
976 else if (features[fixAMMv1_3] && features[fixAMMClawbackRounding])
978 BEAST_EXPECT(amm.expectBalances(
979 STAmount{USD, UINT64_C(1990000000000001), -12},
999 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount(0)));
1000 BEAST_EXPECT(amm.expectLPTokens(bob,
IOUAmount(0)));
1021 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
1026 else if (!features[fixAMMClawbackRounding])
1031 else if (features[fixAMMv1_3] && features[fixAMMClawbackRounding])
1057 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
1062 else if (!features[fixAMMClawbackRounding])
1067 else if (features[fixAMMv1_3] && features[fixAMMClawbackRounding])
1078 testcase(
"test AMMClawback all the tokens in the AMM pool");
1079 using namespace jtx;
1084 Env env(*
this, features);
1086 Account const gw2{
"gateway2"};
1090 env.
fund(
XRP(1000000), gw, gw2, alice, bob, carol);
1094 env(
fset(gw, asfAllowTrustLineClawback));
1099 env(
fset(gw2, asfAllowTrustLineClawback));
1105 auto const USD = gw[
"USD"];
1106 env.
trust(USD(100000), alice);
1107 env(
pay(gw, alice, USD(6000)));
1108 env.
trust(USD(100000), bob);
1109 env(
pay(gw, bob, USD(5000)));
1110 env.
trust(USD(100000), carol);
1111 env(
pay(gw, carol, USD(4000)));
1116 auto const EUR = gw2[
"EUR"];
1117 env.
trust(EUR(100000), alice);
1118 env(
pay(gw2, alice, EUR(6000)));
1119 env.
trust(EUR(100000), bob);
1120 env(
pay(gw2, bob, EUR(5000)));
1121 env.
trust(EUR(100000), carol);
1122 env(
pay(gw2, carol, EUR(4000)));
1129 if (!features[fixAMMv1_3])
1132 amm.expectBalances(USD(4000), EUR(5000),
IOUAmount{4472135954999580, -12}));
1137 amm.expectBalances(USD(4000), EUR(5000),
IOUAmount{4472135954999579, -12}));
1139 amm.deposit(bob, USD(2000), EUR(2500));
1140 if (!features[fixAMMv1_3])
1143 amm.expectBalances(USD(6000), EUR(7500),
IOUAmount{6708203932499370, -12}));
1148 amm.expectBalances(USD(6000), EUR(7500),
IOUAmount{6708203932499368, -12}));
1150 amm.deposit(carol, USD(1000), EUR(1250));
1151 if (!features[fixAMMv1_3])
1154 amm.expectBalances(USD(7000), EUR(8750),
IOUAmount{7826237921249265, -12}));
1159 amm.expectBalances(USD(7000), EUR(8750),
IOUAmount{7826237921249262, -12}));
1162 if (!features[fixAMMv1_3])
1164 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount{4472135954999580, -12}));
1168 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount{4472135954999579, -12}));
1170 if (!features[fixAMMv1_3])
1172 BEAST_EXPECT(amm.expectLPTokens(bob,
IOUAmount{2236067977499790, -12}));
1176 BEAST_EXPECT(amm.expectLPTokens(bob,
IOUAmount{2236067977499789, -12}));
1178 if (!features[fixAMMv1_3])
1180 BEAST_EXPECT(amm.expectLPTokens(carol,
IOUAmount{1118033988749895, -12}));
1184 BEAST_EXPECT(amm.expectLPTokens(carol,
IOUAmount{1118033988749894, -12}));
1198 if (!features[fixAMMv1_3])
1200 BEAST_EXPECT(amm.expectBalances(
1201 STAmount{USD, UINT64_C(4999999999999999), -12},
1202 STAmount{EUR, UINT64_C(6249999999999999), -12},
1207 BEAST_EXPECT(amm.expectBalances(
1208 STAmount{USD, UINT64_C(5000000000000001), -12},
1209 STAmount{EUR, UINT64_C(6250000000000001), -12},
1213 if (!features[fixAMMv1_3])
1215 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount{4472135954999580, -12}));
1219 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount{4472135954999579, -12}));
1221 BEAST_EXPECT(amm.expectLPTokens(bob,
IOUAmount(0)));
1222 if (!features[fixAMMv1_3])
1224 BEAST_EXPECT(amm.expectLPTokens(carol,
IOUAmount{1118033988749895, -12}));
1228 BEAST_EXPECT(amm.expectLPTokens(carol,
IOUAmount{1118033988749894, -12}));
1234 BEAST_EXPECT(env.
balance(bob, USD) ==
STAmount(USD, UINT64_C(3000000000000000), -12));
1236 if (!features[fixAMMv1_3])
1239 env.
balance(bob, EUR) ==
STAmount(EUR, UINT64_C(5000000000000001), -12));
1244 env.
balance(bob, EUR) ==
STAmount(EUR, UINT64_C(4999999999999999), -12));
1252 if (!features[fixAMMv1_3])
1254 BEAST_EXPECT(amm.expectBalances(
1255 STAmount{USD, UINT64_C(3999999999999999), -12},
1256 STAmount{EUR, UINT64_C(4999999999999999), -12},
1261 BEAST_EXPECT(amm.expectBalances(
1262 STAmount{USD, UINT64_C(4000000000000001), -12},
1263 STAmount{EUR, UINT64_C(5000000000000002), -12},
1267 if (!features[fixAMMv1_3])
1269 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount{4472135954999580, -12}));
1273 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount{4472135954999579, -12}));
1275 BEAST_EXPECT(amm.expectLPTokens(bob,
IOUAmount(0)));
1276 BEAST_EXPECT(amm.expectLPTokens(carol,
IOUAmount(0)));
1284 BEAST_EXPECT(!amm.ammExists());
1290 Env env(*
this, features);
1294 env.
fund(
XRP(1000000), gw, alice, bob);
1298 env(
fset(gw, asfAllowTrustLineClawback));
1303 auto const USD = gw[
"USD"];
1304 env.
trust(USD(1000000), alice);
1305 env(
pay(gw, alice, USD(600000)));
1306 env.
trust(USD(1000000), bob);
1307 env(
pay(gw, bob, USD(500000)));
1312 if (!features[fixAMMv1_3])
1315 amm.expectBalances(USD(10000),
XRP(2000),
IOUAmount{4472135954999580, -9}));
1320 amm.expectBalances(USD(10000),
XRP(2000),
IOUAmount{4472135954999579, -9}));
1322 amm.deposit(alice, USD(1000),
XRP(200));
1323 if (!features[fixAMMv1_3])
1326 amm.expectBalances(USD(11000),
XRP(2200),
IOUAmount{4919349550499538, -9}));
1331 amm.expectBalances(USD(11000),
XRP(2200),
IOUAmount{4919349550499536, -9}));
1333 amm.deposit(bob, USD(2000),
XRP(400));
1334 if (!features[fixAMMv1_3])
1337 amm.expectBalances(USD(13000),
XRP(2600),
IOUAmount{5813776741499453, -9}));
1342 amm.expectBalances(USD(13000),
XRP(2600),
IOUAmount{5813776741499451, -9}));
1346 auto aliceXrpBalance = env.
balance(alice,
XRP);
1352 if (!features[fixAMMv1_3])
1355 amm.expectBalances(USD(12000),
XRP(2400),
IOUAmount{5366563145999495, -9}));
1359 BEAST_EXPECT(amm.expectBalances(
1362 if (!features[fixAMMv1_3])
1371 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount(0)));
1376 if (!features[fixAMMv1_3])
1379 amm.expectBalances(USD(10000),
XRP(2000),
IOUAmount{4472135954999580, -9}));
1383 BEAST_EXPECT(amm.expectBalances(
1387 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount(0)));
1388 BEAST_EXPECT(amm.expectLPTokens(bob,
IOUAmount(0)));
1396 "test AMMClawback from AMM pool with assets having the same "
1398 using namespace jtx;
1402 Env env(*
this, features);
1407 env.
fund(
XRP(1000000), gw, alice, bob, carol);
1411 env(
fset(gw, asfAllowTrustLineClawback));
1415 auto const USD = gw[
"USD"];
1416 env.
trust(USD(100000), alice);
1417 env(
pay(gw, alice, USD(10000)));
1418 env.
trust(USD(100000), bob);
1419 env(
pay(gw, bob, USD(9000)));
1420 env.
trust(USD(100000), carol);
1421 env(
pay(gw, carol, USD(8000)));
1424 auto const EUR = gw[
"EUR"];
1425 env.
trust(EUR(100000), alice);
1426 env(
pay(gw, alice, EUR(10000)));
1427 env.
trust(EUR(100000), bob);
1428 env(
pay(gw, bob, EUR(9000)));
1429 env.
trust(EUR(100000), carol);
1430 env(
pay(gw, carol, EUR(8000)));
1436 BEAST_EXPECT(amm.expectBalances(USD(8000), EUR(2000),
IOUAmount(4000)));
1437 amm.deposit(bob, USD(4000), EUR(1000));
1438 BEAST_EXPECT(amm.expectBalances(USD(12000), EUR(3000),
IOUAmount(6000)));
1439 if (!features[fixAMMv1_3])
1441 amm.deposit(carol, USD(2000), EUR(500));
1445 amm.deposit(carol, USD(2000.25), EUR(500));
1447 BEAST_EXPECT(amm.expectBalances(USD(14000), EUR(3500),
IOUAmount(7000)));
1451 BEAST_EXPECT(amm.expectBalances(USD(13000), EUR(3250),
IOUAmount(6500)));
1453 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount(4000)));
1454 BEAST_EXPECT(amm.expectLPTokens(bob,
IOUAmount(2000)));
1455 BEAST_EXPECT(amm.expectLPTokens(carol,
IOUAmount(500)));
1456 BEAST_EXPECT(env.
balance(alice, USD) == USD(2000));
1457 BEAST_EXPECT(env.
balance(alice, EUR) == EUR(8000));
1458 BEAST_EXPECT(env.
balance(bob, USD) == USD(5000));
1459 BEAST_EXPECT(env.
balance(bob, EUR) == EUR(8000));
1460 if (!features[fixAMMv1_3])
1462 BEAST_EXPECT(env.
balance(carol, USD) == USD(6000));
1467 env.
balance(carol, USD) ==
STAmount(USD, UINT64_C(5999'999999999999), -12));
1470 BEAST_EXPECT(env.
balance(carol, EUR) == EUR(7750));
1479 BEAST_EXPECT(amm.expectBalances(USD(12000), EUR(3000),
IOUAmount(6000)));
1481 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount(4000)));
1482 BEAST_EXPECT(amm.expectLPTokens(bob,
IOUAmount(1500)));
1483 BEAST_EXPECT(amm.expectLPTokens(carol,
IOUAmount(500)));
1484 BEAST_EXPECT(env.
balance(alice, USD) == USD(2000));
1485 BEAST_EXPECT(env.
balance(alice, EUR) == EUR(8000));
1486 BEAST_EXPECT(env.
balance(bob, USD) == USD(5000));
1488 BEAST_EXPECT(env.
balance(bob, EUR) == EUR(8000));
1489 if (!features[fixAMMv1_3])
1491 BEAST_EXPECT(env.
balance(carol, USD) == USD(6000));
1496 env.
balance(carol, USD) ==
STAmount(USD, UINT64_C(5999'999999999999), -12));
1498 BEAST_EXPECT(env.
balance(carol, EUR) == EUR(7750));
1505 BEAST_EXPECT(amm.expectBalances(USD(4000), EUR(1000),
IOUAmount(2000)));
1507 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount(0)));
1508 BEAST_EXPECT(amm.expectLPTokens(bob,
IOUAmount(1500)));
1509 BEAST_EXPECT(amm.expectLPTokens(carol,
IOUAmount(500)));
1510 BEAST_EXPECT(env.
balance(alice, USD) == USD(2000));
1511 BEAST_EXPECT(env.
balance(alice, EUR) == EUR(8000));
1512 BEAST_EXPECT(env.
balance(bob, USD) == USD(5000));
1513 BEAST_EXPECT(env.
balance(bob, EUR) == EUR(8000));
1514 if (!features[fixAMMv1_3])
1516 BEAST_EXPECT(env.
balance(carol, USD) == USD(6000));
1521 env.
balance(carol, USD) ==
STAmount(USD, UINT64_C(5999'999999999999), -12));
1523 BEAST_EXPECT(env.
balance(carol, EUR) == EUR(7750));
1626 testcase(
"test AMMClawback when issuing token for each other");
1627 using namespace jtx;
1631 Env env(*
this, features);
1635 env.
fund(
XRP(1000000), gw, gw2, alice);
1639 env(
fset(gw, asfAllowTrustLineClawback));
1644 env(
fset(gw2, asfAllowTrustLineClawback));
1648 auto const USD = gw[
"USD"];
1649 env.
trust(USD(100000), gw2);
1650 env(
pay(gw, gw2, USD(5000)));
1651 env.
trust(USD(100000), alice);
1652 env(
pay(gw, alice, USD(5000)));
1654 auto const EUR = gw2[
"EUR"];
1655 env.
trust(EUR(100000), gw);
1656 env(
pay(gw2, gw, EUR(6000)));
1657 env.
trust(EUR(100000), alice);
1658 env(
pay(gw2, alice, EUR(6000)));
1663 BEAST_EXPECT(amm.expectBalances(USD(1000), EUR(2000),
IOUAmount{1414213562373095, -12}));
1665 amm.deposit(gw2, USD(2000), EUR(4000));
1666 BEAST_EXPECT(amm.expectBalances(USD(3000), EUR(6000),
IOUAmount{4242640687119285, -12}));
1668 amm.deposit(alice, USD(3000), EUR(6000));
1669 BEAST_EXPECT(amm.expectBalances(USD(6000), EUR(12000),
IOUAmount{8485281374238570, -12}));
1671 BEAST_EXPECT(amm.expectLPTokens(gw,
IOUAmount{1414213562373095, -12}));
1672 BEAST_EXPECT(amm.expectLPTokens(gw2,
IOUAmount{2828427124746190, -12}));
1673 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount{4242640687119285, -12}));
1678 if (!features[fixAMMv1_3] || !features[fixAMMClawbackRounding])
1681 amm.expectBalances(USD(5000), EUR(10000),
IOUAmount{7071067811865475, -12}));
1686 amm.expectBalances(USD(5000), EUR(10000),
IOUAmount{7071067811865474, -12}));
1689 BEAST_EXPECT(amm.expectLPTokens(gw,
IOUAmount{1414213562373095, -12}));
1690 if (!features[fixAMMv1_3] || !features[fixAMMClawbackRounding])
1692 BEAST_EXPECT(amm.expectLPTokens(gw2,
IOUAmount{1414213562373095, -12}));
1696 BEAST_EXPECT(amm.expectLPTokens(gw2,
IOUAmount{1414213562373094, -12}));
1698 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount{4242640687119285, -12}));
1700 BEAST_EXPECT(env.
balance(alice, USD) == USD(2000));
1701 BEAST_EXPECT(env.
balance(alice, EUR) == EUR(0));
1702 BEAST_EXPECT(env.
balance(gw, EUR) == EUR(4000));
1703 BEAST_EXPECT(env.
balance(gw2, USD) == USD(3000));
1708 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
1710 BEAST_EXPECT(amm.expectBalances(
1712 STAmount(EUR, UINT64_C(9000000000000001), -12),
1715 else if (!features[fixAMMClawbackRounding])
1718 amm.expectBalances(USD(4500), EUR(9000),
IOUAmount{6363961030678928, -12}));
1720 else if (features[fixAMMv1_3] && features[fixAMMClawbackRounding])
1722 BEAST_EXPECT(amm.expectBalances(
1724 STAmount(EUR, UINT64_C(9000000000000001), -12),
1728 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
1730 BEAST_EXPECT(amm.expectLPTokens(gw,
IOUAmount{7071067811865480, -13}));
1732 else if (!features[fixAMMClawbackRounding])
1734 BEAST_EXPECT(amm.expectLPTokens(gw,
IOUAmount{7071067811865475, -13}));
1736 else if (features[fixAMMv1_3] && features[fixAMMClawbackRounding])
1738 BEAST_EXPECT(amm.expectLPTokens(gw,
IOUAmount{7071067811865480, -13}));
1741 if (!features[fixAMMv1_3] || !features[fixAMMClawbackRounding])
1743 BEAST_EXPECT(amm.expectLPTokens(gw2,
IOUAmount{1414213562373095, -12}));
1747 BEAST_EXPECT(amm.expectLPTokens(gw2,
IOUAmount{1414213562373094, -12}));
1750 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount{4242640687119285, -12}));
1752 BEAST_EXPECT(env.
balance(alice, USD) == USD(2000));
1753 BEAST_EXPECT(env.
balance(alice, EUR) == EUR(0));
1754 BEAST_EXPECT(env.
balance(gw, EUR) == EUR(4000));
1755 BEAST_EXPECT(env.
balance(gw2, USD) == USD(3000));
1760 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
1762 BEAST_EXPECT(amm.expectBalances(
1764 STAmount(EUR, UINT64_C(5000000000000001), -12),
1767 else if (!features[fixAMMClawbackRounding])
1770 amm.expectBalances(USD(2500), EUR(5000),
IOUAmount{3535533905932738, -12}));
1772 else if (features[fixAMMv1_3] && features[fixAMMClawbackRounding])
1774 BEAST_EXPECT(amm.expectBalances(
1776 STAmount(EUR, UINT64_C(5000000000000001), -12),
1780 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
1782 BEAST_EXPECT(amm.expectLPTokens(gw,
IOUAmount{7071067811865480, -13}));
1784 else if (!features[fixAMMClawbackRounding])
1786 BEAST_EXPECT(amm.expectLPTokens(gw,
IOUAmount{7071067811865475, -13}));
1788 else if (features[fixAMMv1_3] && features[fixAMMClawbackRounding])
1790 BEAST_EXPECT(amm.expectLPTokens(gw,
IOUAmount{7071067811865480, -13}));
1793 if (!features[fixAMMv1_3] || !features[fixAMMClawbackRounding])
1795 BEAST_EXPECT(amm.expectLPTokens(gw2,
IOUAmount{1414213562373095, -12}));
1799 BEAST_EXPECT(amm.expectLPTokens(gw2,
IOUAmount{1414213562373094, -12}));
1801 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount{1414213562373095, -12}));
1803 BEAST_EXPECT(env.
balance(alice, USD) == USD(4000));
1804 BEAST_EXPECT(env.
balance(alice, EUR) == EUR(0));
1805 BEAST_EXPECT(env.
balance(gw, EUR) == EUR(4000));
1806 BEAST_EXPECT(env.
balance(gw2, USD) == USD(3000));
1844 using namespace jtx;
1848 Env env(*
this, features);
1850 Account const gw2{
"gateway2"};
1852 env.
fund(
XRP(1000000), gw, gw2, alice);
1856 env(
fset(gw, asfAllowTrustLineClawback));
1861 auto const USD = gw[
"USD"];
1862 env.
trust(USD(100000), alice);
1863 env(
pay(gw, alice, USD(3000)));
1868 auto const EUR = gw2[
"EUR"];
1869 env.
trust(EUR(100000), alice);
1870 env(
pay(gw2, alice, EUR(3000)));
1879 amm.expectBalances(USD(2000), EUR(1000),
IOUAmount{1414213562373095, -12}));
1882 env(
trust(gw, alice[
"USD"](0), tfSetFreeze));
1891 BEAST_EXPECT(amm.expectBalances(USD(1000), EUR(500),
IOUAmount{7071067811865475, -13}));
1894 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount{7071067811865475, -13}));
1907 BEAST_EXPECT(!amm.ammExists());
1912 Env env(*
this, features);
1914 Account const gw2{
"gateway2"};
1916 env.
fund(
XRP(1000000), gw, gw2, alice);
1920 env(
fset(gw, asfAllowTrustLineClawback));
1925 auto const USD = gw[
"USD"];
1926 env.
trust(USD(100000), alice);
1927 env(
pay(gw, alice, USD(3000)));
1932 auto const EUR = gw2[
"EUR"];
1933 env.
trust(EUR(100000), alice);
1934 env(
pay(gw2, alice, EUR(3000)));
1943 amm.expectBalances(USD(2000), EUR(1000),
IOUAmount{1414213562373095, -12}));
1946 env(
trust(gw, alice[
"USD"](0), tfSetFreeze));
1947 env(
trust(gw2, alice[
"EUR"](0), tfSetFreeze));
1956 BEAST_EXPECT(amm.expectBalances(USD(1000), EUR(500),
IOUAmount{7071067811865475, -13}));
1957 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount{7071067811865475, -13}));
1962 Env env(*
this, features);
1964 Account const gw2{
"gateway2"};
1966 env.
fund(
XRP(1000000), gw, gw2, alice);
1970 env(
fset(gw, asfAllowTrustLineClawback));
1975 auto const USD = gw[
"USD"];
1976 env.
trust(USD(100000), alice);
1977 env(
pay(gw, alice, USD(3000)));
1982 auto const EUR = gw2[
"EUR"];
1983 env.
trust(EUR(100000), alice);
1984 env(
pay(gw2, alice, EUR(3000)));
1993 amm.expectBalances(USD(2000), EUR(1000),
IOUAmount{1414213562373095, -12}));
1996 env(
fset(gw, asfGlobalFreeze));
2005 BEAST_EXPECT(amm.expectBalances(USD(1000), EUR(500),
IOUAmount{7071067811865475, -13}));
2006 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount{7071067811865475, -13}));
2012 Env env(*
this, features);
2017 env.
fund(
XRP(1000000), gw, alice, bob, carol);
2021 env(
fset(gw, asfAllowTrustLineClawback));
2025 auto const USD = gw[
"USD"];
2026 env.
trust(USD(100000), alice);
2027 env(
pay(gw, alice, USD(10000)));
2028 env.
trust(USD(100000), bob);
2029 env(
pay(gw, bob, USD(9000)));
2030 env.
trust(USD(100000), carol);
2031 env(
pay(gw, carol, USD(8000)));
2034 auto const EUR = gw[
"EUR"];
2035 env.
trust(EUR(100000), alice);
2036 env(
pay(gw, alice, EUR(10000)));
2037 env.
trust(EUR(100000), bob);
2038 env(
pay(gw, bob, EUR(9000)));
2039 env.
trust(EUR(100000), carol);
2040 env(
pay(gw, carol, EUR(8000)));
2046 BEAST_EXPECT(amm.expectBalances(USD(8000), EUR(2000),
IOUAmount(4000)));
2047 amm.deposit(bob, USD(4000), EUR(1000));
2048 BEAST_EXPECT(amm.expectBalances(USD(12000), EUR(3000),
IOUAmount(6000)));
2049 if (!features[fixAMMv1_3])
2051 amm.deposit(carol, USD(2000), EUR(500));
2055 amm.deposit(carol, USD(2000.25), EUR(500));
2057 BEAST_EXPECT(amm.expectBalances(USD(14000), EUR(3500),
IOUAmount(7000)));
2060 env(
fset(gw, asfGlobalFreeze));
2066 BEAST_EXPECT(amm.expectBalances(USD(13000), EUR(3250),
IOUAmount(6500)));
2068 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount(4000)));
2069 BEAST_EXPECT(amm.expectLPTokens(bob,
IOUAmount(2000)));
2070 BEAST_EXPECT(amm.expectLPTokens(carol,
IOUAmount(500)));
2071 BEAST_EXPECT(env.
balance(alice, USD) == USD(2000));
2072 BEAST_EXPECT(env.
balance(alice, EUR) == EUR(8000));
2073 BEAST_EXPECT(env.
balance(bob, USD) == USD(5000));
2074 BEAST_EXPECT(env.
balance(bob, EUR) == EUR(8000));
2075 if (!features[fixAMMv1_3])
2077 BEAST_EXPECT(env.
balance(carol, USD) == USD(6000));
2082 env.
balance(carol, USD) ==
STAmount(USD, UINT64_C(5999'999999999999), -12));
2085 BEAST_EXPECT(env.
balance(carol, EUR) == EUR(7750));
2094 BEAST_EXPECT(amm.expectBalances(USD(12000), EUR(3000),
IOUAmount(6000)));
2096 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount(4000)));
2097 BEAST_EXPECT(amm.expectLPTokens(bob,
IOUAmount(1500)));
2098 BEAST_EXPECT(amm.expectLPTokens(carol,
IOUAmount(500)));
2099 BEAST_EXPECT(env.
balance(alice, USD) == USD(2000));
2100 BEAST_EXPECT(env.
balance(alice, EUR) == EUR(8000));
2101 BEAST_EXPECT(env.
balance(bob, USD) == USD(5000));
2103 BEAST_EXPECT(env.
balance(bob, EUR) == EUR(8000));
2104 if (!features[fixAMMv1_3])
2106 BEAST_EXPECT(env.
balance(carol, USD) == USD(6000));
2111 env.
balance(carol, USD) ==
STAmount(USD, UINT64_C(5999'999999999999), -12));
2113 BEAST_EXPECT(env.
balance(carol, EUR) == EUR(7750));
2120 BEAST_EXPECT(amm.expectBalances(USD(4000), EUR(1000),
IOUAmount(2000)));
2122 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount(0)));
2123 BEAST_EXPECT(amm.expectLPTokens(bob,
IOUAmount(1500)));
2124 BEAST_EXPECT(amm.expectLPTokens(carol,
IOUAmount(500)));
2125 BEAST_EXPECT(env.
balance(alice, USD) == USD(2000));
2126 BEAST_EXPECT(env.
balance(alice, EUR) == EUR(8000));
2127 BEAST_EXPECT(env.
balance(bob, USD) == USD(5000));
2128 BEAST_EXPECT(env.
balance(bob, EUR) == EUR(8000));
2129 if (!features[fixAMMv1_3])
2131 BEAST_EXPECT(env.
balance(carol, USD) == USD(6000));
2136 env.
balance(carol, USD) ==
STAmount(USD, UINT64_C(5999'999999999999), -12));
2138 BEAST_EXPECT(env.
balance(carol, EUR) == EUR(7750));
2210 "test last holder's lptoken balance not equal to AMM's lptoken "
2211 "balance before clawback");
2212 using namespace jtx;
2216 env.
fund(
XRP(100000), gw, alice, bob);
2218 env(
fset(gw, asfAllowTrustLineClawback));
2221 auto const USD = gw[
"USD"];
2222 env.
trust(USD(100000), alice);
2223 env(
pay(gw, alice, USD(50000)));
2224 env.
trust(USD(100000), bob);
2225 env(
pay(gw, bob, USD(40000)));
2231 auto getLPTokenBalances = [&](
auto& env,
2234 auto const lpToken =
2235 getAccountLines(env, account, amm.lptIssue())[jss::lines][0u][jss::balance]
2237 auto const lpTokenBalance =
2238 amm.ammRpcInfo()[jss::amm][jss::lp_token][jss::value].asString();
2239 return {lpToken, lpTokenBalance};
2245 Account gw{
"gateway"}, alice{
"alice"}, bob{
"bob"};
2246 auto const USD = setupAccounts(env, gw, alice, bob);
2248 AMM amm(env, alice,
XRP(2), USD(1));
2249 amm.deposit(alice,
IOUAmount{1'876123487565916, -15});
2251 amm.withdraw(alice,
IOUAmount{1'876123487565916, -15});
2252 amm.withdrawAll(bob);
2254 auto [lpToken, lpTokenBalance] = getLPTokenBalances(env, amm, alice);
2255 BEAST_EXPECT(lpToken ==
"1414.21356237366" && lpTokenBalance ==
"1414.213562374");
2258 BEAST_EXPECT(res && res.value());
2260 if (!features[fixAMMClawbackRounding] || !features[fixAMMv1_3])
2263 BEAST_EXPECT(amm.ammExists());
2267 auto const lpBalance =
IOUAmount{989, -12};
2269 BEAST_EXPECT(amm.expectBalances(
2271 BEAST_EXPECT(amm.expectLPTokens(alice, lpBalance));
2278 Account gw{
"gateway"}, alice{
"alice"}, bob{
"bob"};
2279 auto const USD = setupAccounts(env, gw, alice, bob);
2281 AMM amm(env, alice,
XRP(2), USD(1));
2282 amm.deposit(alice,
IOUAmount{1'876123487565916, -15});
2284 amm.withdrawAll(bob);
2286 auto [lpToken, lpTokenBalance] = getLPTokenBalances(env, amm, alice);
2287 BEAST_EXPECT(lpToken ==
"1416.08968586066" && lpTokenBalance ==
"1416.089685861");
2290 BEAST_EXPECT(res && res.value());
2294 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
2296 BEAST_EXPECT(amm.expectBalances(
2297 STAmount(USD, UINT64_C(5013266196406), -13),
2301 else if (!features[fixAMMClawbackRounding])
2303 BEAST_EXPECT(amm.expectBalances(
2304 STAmount(USD, UINT64_C(5013266196407), -13),
2308 else if (features[fixAMMv1_3] && features[fixAMMClawbackRounding])
2310 auto const lpBalance =
IOUAmount{708'9829046743238, -13};
2311 BEAST_EXPECT(amm.expectBalances(
2312 STAmount(USD, UINT64_C(5013266196406999), -16),
XRPAmount(1002655), lpBalance));
2313 BEAST_EXPECT(amm.expectLPTokens(alice, lpBalance));
2320 Account gw{
"gateway"}, alice{
"alice"}, bob{
"bob"};
2321 auto const USD = setupAccounts(env, gw, alice, bob);
2323 AMM amm(env, alice,
XRP(2), USD(1));
2324 amm.deposit(alice,
IOUAmount{1'876123487565916, -15});
2326 amm.withdraw(alice,
IOUAmount{1'876123487565916, -15});
2327 amm.withdrawAll(bob);
2329 auto [lpToken, lpTokenBalance] = getLPTokenBalances(env, amm, alice);
2330 BEAST_EXPECT(lpToken ==
"1414.21356237366" && lpTokenBalance ==
"1414.213562374");
2333 BEAST_EXPECT(res && res.value());
2335 if (!features[fixAMMClawbackRounding] && !features[fixAMMv1_3])
2339 else if (!features[fixAMMClawbackRounding])
2342 BEAST_EXPECT(amm.expectBalances(
2343 STAmount(USD, UINT64_C(2410000000000000), -28),
2347 else if (features[fixAMMv1_3] && features[fixAMMClawbackRounding])
2350 BEAST_EXPECT(!amm.ammExists());
2357 Account gw{
"gateway"}, alice{
"alice"}, bob{
"bob"};
2358 auto const USD = setupAccounts(env, gw, alice, bob);
2360 Account const gw2{
"gateway2"};
2363 auto const EUR = gw2[
"EUR"];
2364 env.
trust(EUR(100000), alice);
2365 env(
pay(gw2, alice, EUR(50000)));
2366 env.
trust(EUR(100000), bob);
2367 env(
pay(gw2, bob, EUR(50000)));
2370 AMM amm(env, alice, USD(2), EUR(1));
2371 amm.deposit(alice,
IOUAmount{1'576123487565916, -15});
2373 amm.withdraw(alice,
IOUAmount{1'576123487565916, -15});
2374 amm.withdrawAll(bob);
2376 auto [lpToken, lpTokenBalance] = getLPTokenBalances(env, amm, alice);
2377 BEAST_EXPECT(lpToken ==
"1.414213562374011" && lpTokenBalance ==
"1.414213562374");
2380 BEAST_EXPECT(res && res.value());
2382 if (features[fixAMMv1_3] && features[fixAMMClawbackRounding])
2385 BEAST_EXPECT(!amm.ammExists());
2390 BEAST_EXPECT(amm.ammExists());
2397 Account gw{
"gateway"}, alice{
"alice"}, bob{
"bob"};
2398 auto const USD = setupAccounts(env, gw, alice, bob);
2400 auto const EUR = gw[
"EUR"];
2401 env.
trust(EUR(100000), alice);
2402 env(
pay(gw, alice, EUR(50000)));
2403 env.
trust(EUR(100000), bob);
2404 env(
pay(gw, bob, EUR(50000)));
2407 AMM amm(env, alice, USD(1), EUR(2));
2408 amm.deposit(alice,
IOUAmount{1'076123487565916, -15});
2410 amm.withdraw(alice,
IOUAmount{1'076123487565916, -15});
2411 amm.withdrawAll(bob);
2413 auto [lpToken, lpTokenBalance] = getLPTokenBalances(env, amm, alice);
2414 BEAST_EXPECT(lpToken ==
"1.414213562374011" && lpTokenBalance ==
"1.414213562374");
2417 BEAST_EXPECT(res && res.value());
2419 if (features[fixAMMClawbackRounding])
2422 BEAST_EXPECT(!amm.ammExists());
2429 BEAST_EXPECT(amm.ammExists());
2436 Account gw{
"gateway"}, alice{
"alice"}, bob{
"bob"};
2437 auto const USD = setupAccounts(env, gw, alice, bob);
2439 auto const EUR = gw[
"EUR"];
2440 env.
trust(EUR(1000000000), alice);
2441 env(
pay(gw, alice, EUR(500000000)));
2442 env.
trust(EUR(1000000000), bob);
2443 env(
pay(gw, bob, EUR(500000000)));
2446 AMM amm(env, alice, USD(1), EUR(2000000));
2447 amm.deposit(alice,
IOUAmount{1'076123487565916, -12});
2449 amm.withdraw(alice,
IOUAmount{1'076123487565916, -12});
2450 amm.withdrawAll(bob);
2452 auto [lpToken, lpTokenBalance] = getLPTokenBalances(env, amm, alice);
2454 BEAST_EXPECT(lpToken ==
"1414.213562373101" && lpTokenBalance ==
"1414.2135623731");
2457 BEAST_EXPECT(res && res.value());
2459 if (!features[fixAMMClawbackRounding] && !features[fixAMMv1_3])
2462 BEAST_EXPECT(amm.expectBalances(
2467 else if (!features[fixAMMClawbackRounding])
2472 BEAST_EXPECT(amm.ammExists());
2474 else if (features[fixAMMv1_3] && features[fixAMMClawbackRounding])
2477 auto const lpBalance =
IOUAmount{5, -12};
2478 BEAST_EXPECT(amm.expectBalances(
2479 STAmount(USD, UINT64_C(4), -15),
STAmount(EUR, UINT64_C(8), -9), lpBalance));
2480 BEAST_EXPECT(amm.expectLPTokens(alice, lpBalance));