485 "test AMMClawback specific amount which exceeds the current "
494 Env env(*
this, features);
498 env.
fund(
XRP(1000000), gw, gw2, alice);
507 auto const USD = gw[
"USD"];
508 env.
trust(USD(100000), alice);
509 env(
pay(gw, alice, USD(6000)));
514 auto const EUR = gw2[
"EUR"];
515 env.
trust(EUR(100000), alice);
516 env(
pay(gw2, alice, EUR(6000)));
524 if (!features[fixAMMv1_3])
525 BEAST_EXPECT(amm.expectBalances(USD(4000), EUR(5000),
IOUAmount{4472135954999580, -12}));
527 BEAST_EXPECT(amm.expectBalances(USD(4000), EUR(5000),
IOUAmount{4472135954999579, -12}));
545 if (!features[fixAMMv1_3])
546 BEAST_EXPECT(amm.expectBalances(USD(3000), EUR(3750),
IOUAmount{3354101966249685, -12}));
548 BEAST_EXPECT(amm.expectBalances(USD(3000), EUR(3750),
IOUAmount{3354101966249684, -12}));
551 if (!features[fixAMMv1_3])
552 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount{3354101966249685, -12}));
554 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount{3354101966249684, -12}));
564 if (!features[fixAMMv1_3])
565 BEAST_EXPECT(amm.expectBalances(
566 STAmount{USD, UINT64_C(2500000000000001), -12},
567 STAmount{EUR, UINT64_C(3125000000000001), -12},
570 BEAST_EXPECT(amm.expectBalances(USD(2500), EUR(3125),
IOUAmount{2795084971874737, -12}));
572 if (!features[fixAMMv1_3])
573 BEAST_EXPECT(env.
balance(alice, EUR) ==
STAmount(EUR, UINT64_C(2874999999999999), -12));
575 BEAST_EXPECT(env.
balance(alice, EUR) == EUR(2875));
584 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
585 BEAST_EXPECT(amm.expectBalances(
586 STAmount{USD, UINT64_C(2499000000000002), -12},
587 STAmount{EUR, UINT64_C(3123750000000002), -12},
589 else if (!features[fixAMMClawbackRounding])
590 BEAST_EXPECT(amm.expectBalances(USD(2499), EUR(3123.75),
IOUAmount{2793966937885987, -12}));
591 else if (features[fixAMMClawbackRounding] && features[fixAMMv1_3])
592 BEAST_EXPECT(amm.expectBalances(
593 STAmount{USD, UINT64_C(2499000000000001), -12},
594 STAmount{EUR, UINT64_C(3123750000000001), -12},
597 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
598 BEAST_EXPECT(env.
balance(alice, EUR) ==
STAmount(EUR, UINT64_C(2876'249999999998), -12));
599 else if (!features[fixAMMClawbackRounding])
600 BEAST_EXPECT(env.
balance(alice, EUR) == EUR(2876.25));
601 else if (features[fixAMMClawbackRounding] && features[fixAMMv1_3])
602 BEAST_EXPECT(env.
balance(alice, EUR) ==
STAmount(EUR, UINT64_C(2876'249999999999), -12));
612 BEAST_EXPECT(env.
balance(alice, EUR) ==
STAmount(EUR, UINT64_C(6000000000000000), -12));
615 BEAST_EXPECT(!amm.ammExists());
624 Env env(*
this, features);
629 env.
fund(
XRP(1000000), gw, gw2, alice, bob);
643 auto const USD = gw[
"USD"];
644 env.
trust(USD(100000), alice);
645 env(
pay(gw, alice, USD(6000)));
646 env.
trust(USD(100000), bob);
647 env(
pay(gw, bob, USD(5000)));
651 auto const EUR = gw2[
"EUR"];
652 env.
trust(EUR(100000), alice);
653 env(
pay(gw2, alice, EUR(5000)));
654 env.
trust(EUR(100000), bob);
655 env(
pay(gw2, bob, EUR(4000)));
660 BEAST_EXPECT(amm.expectBalances(USD(1000),
XRP(2000),
IOUAmount{1414213562373095, -9}));
661 amm.deposit(alice, USD(1000),
XRP(2000));
662 BEAST_EXPECT(amm.expectBalances(USD(2000),
XRP(4000),
IOUAmount{2828427124746190, -9}));
663 amm.deposit(bob, USD(1000),
XRP(2000));
664 BEAST_EXPECT(amm.expectBalances(USD(3000),
XRP(6000),
IOUAmount{4242640687119285, -9}));
669 if (!features[fixAMMv1_3])
675 if (!features[fixAMMv1_3])
681 if (!features[fixAMMv1_3])
687 auto aliceXrpBalance = env.
balance(alice,
XRP);
703 if (features[fixAMMClawbackRounding] && features[fixAMMv1_3])
709 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
710 BEAST_EXPECT(amm.expectBalances(USD(2500),
XRP(5000),
IOUAmount{3535533905932738, -9}));
711 else if (!features[fixAMMClawbackRounding])
712 BEAST_EXPECT(amm.expectBalances(USD(2500),
XRP(5000),
IOUAmount{3535533905932737, -9}));
713 else if (features[fixAMMClawbackRounding] && features[fixAMMv1_3])
714 BEAST_EXPECT(amm.expectBalances(USD(2500),
XRPAmount(5000000001),
IOUAmount{3'535'533'905932738, -9}));
716 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
717 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount{7071067811865480, -10}));
718 else if (!features[fixAMMClawbackRounding])
719 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount{7071067811865474, -10}));
720 else if (features[fixAMMClawbackRounding] && features[fixAMMv1_3])
721 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount{707106781186548, -9}));
723 BEAST_EXPECT(amm.expectLPTokens(bob,
IOUAmount{1414213562373095, -9}));
736 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
737 BEAST_EXPECT(amm.expectBalances(
739 else if (!features[fixAMMClawbackRounding])
740 BEAST_EXPECT(amm.expectBalances(USD(2'490),
XRP(4980),
IOUAmount{3521391770309006, -9}));
741 else if (features[fixAMMClawbackRounding] && features[fixAMMv1_3])
742 BEAST_EXPECT(amm.expectBalances(
743 STAmount{USD, UINT64_C(2490000000000001), -12},
747 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
748 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount{7071067811865480, -10}));
749 else if (!features[fixAMMClawbackRounding])
750 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount{7071067811865474, -10}));
751 else if (features[fixAMMClawbackRounding] && features[fixAMMv1_3])
752 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount{707106781186548, -9}));
754 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
755 BEAST_EXPECT(amm.expectLPTokens(bob,
IOUAmount{1400071426749365, -9}));
756 else if (!features[fixAMMClawbackRounding])
757 BEAST_EXPECT(amm.expectLPTokens(bob,
IOUAmount{1400071426749364, -9}));
758 else if (features[fixAMMClawbackRounding] && features[fixAMMv1_3])
759 BEAST_EXPECT(amm.expectLPTokens(bob,
IOUAmount{1400071426749365, -9}));
768 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
770 else if (!features[fixAMMClawbackRounding])
772 else if (features[fixAMMClawbackRounding] && features[fixAMMv1_3])
776 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
778 else if (!features[fixAMMClawbackRounding])
780 else if (features[fixAMMv1_3] && features[fixAMMClawbackRounding])
783 if (!features[fixAMMv1_3])
787 if (!features[fixAMMv1_3])
802 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
804 else if (!features[fixAMMClawbackRounding])
806 else if (features[fixAMMv1_3] && features[fixAMMClawbackRounding])
810 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount(0)));
811 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
812 BEAST_EXPECT(amm.expectLPTokens(bob,
IOUAmount{1400071426749365, -9}));
813 else if (!features[fixAMMClawbackRounding])
814 BEAST_EXPECT(amm.expectLPTokens(bob,
IOUAmount{1400071426749364, -9}));
815 else if (features[fixAMMClawbackRounding] && features[fixAMMv1_3])
816 BEAST_EXPECT(amm.expectLPTokens(bob,
IOUAmount{1400071426749365, -9}));
818 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
819 BEAST_EXPECT(amm.expectBalances(
821 else if (!features[fixAMMClawbackRounding])
822 BEAST_EXPECT(amm.expectBalances(USD(1'990),
XRPAmount{3'980'000'001},
IOUAmount{2814284989122459, -9}));
823 else if (features[fixAMMv1_3] && features[fixAMMClawbackRounding])
824 BEAST_EXPECT(amm.expectBalances(
825 STAmount{USD, UINT64_C(1990000000000001), -12},
844 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount(0)));
845 BEAST_EXPECT(amm.expectLPTokens(bob,
IOUAmount(0)));
866 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
868 else if (!features[fixAMMClawbackRounding])
870 else if (features[fixAMMv1_3] && features[fixAMMClawbackRounding])
893 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
895 else if (!features[fixAMMClawbackRounding])
897 else if (features[fixAMMv1_3] && features[fixAMMClawbackRounding])
905 testcase(
"test AMMClawback all the tokens in the AMM pool");
911 Env env(*
this, features);
917 env.
fund(
XRP(1000000), gw, gw2, alice, bob, carol);
932 auto const USD = gw[
"USD"];
933 env.
trust(USD(100000), alice);
934 env(
pay(gw, alice, USD(6000)));
935 env.
trust(USD(100000), bob);
936 env(
pay(gw, bob, USD(5000)));
937 env.
trust(USD(100000), carol);
938 env(
pay(gw, carol, USD(4000)));
943 auto const EUR = gw2[
"EUR"];
944 env.
trust(EUR(100000), alice);
945 env(
pay(gw2, alice, EUR(6000)));
946 env.
trust(EUR(100000), bob);
947 env(
pay(gw2, bob, EUR(5000)));
948 env.
trust(EUR(100000), carol);
949 env(
pay(gw2, carol, EUR(4000)));
956 if (!features[fixAMMv1_3])
957 BEAST_EXPECT(amm.expectBalances(USD(4000), EUR(5000),
IOUAmount{4472135954999580, -12}));
959 BEAST_EXPECT(amm.expectBalances(USD(4000), EUR(5000),
IOUAmount{4472135954999579, -12}));
960 amm.deposit(bob, USD(2000), EUR(2500));
961 if (!features[fixAMMv1_3])
962 BEAST_EXPECT(amm.expectBalances(USD(6000), EUR(7500),
IOUAmount{6708203932499370, -12}));
964 BEAST_EXPECT(amm.expectBalances(USD(6000), EUR(7500),
IOUAmount{6708203932499368, -12}));
965 amm.deposit(carol, USD(1000), EUR(1250));
966 if (!features[fixAMMv1_3])
967 BEAST_EXPECT(amm.expectBalances(USD(7000), EUR(8750),
IOUAmount{7826237921249265, -12}));
969 BEAST_EXPECT(amm.expectBalances(USD(7000), EUR(8750),
IOUAmount{7826237921249262, -12}));
971 if (!features[fixAMMv1_3])
972 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount{4472135954999580, -12}));
974 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount{4472135954999579, -12}));
975 if (!features[fixAMMv1_3])
976 BEAST_EXPECT(amm.expectLPTokens(bob,
IOUAmount{2236067977499790, -12}));
978 BEAST_EXPECT(amm.expectLPTokens(bob,
IOUAmount{2236067977499789, -12}));
979 if (!features[fixAMMv1_3])
980 BEAST_EXPECT(amm.expectLPTokens(carol,
IOUAmount{1118033988749895, -12}));
982 BEAST_EXPECT(amm.expectLPTokens(carol,
IOUAmount{1118033988749894, -12}));
995 if (!features[fixAMMv1_3])
996 BEAST_EXPECT(amm.expectBalances(
997 STAmount{USD, UINT64_C(4999999999999999), -12},
998 STAmount{EUR, UINT64_C(6249999999999999), -12},
1001 BEAST_EXPECT(amm.expectBalances(
1002 STAmount{USD, UINT64_C(5000000000000001), -12},
1003 STAmount{EUR, UINT64_C(6250000000000001), -12},
1006 if (!features[fixAMMv1_3])
1007 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount{4472135954999580, -12}));
1009 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount{4472135954999579, -12}));
1010 BEAST_EXPECT(amm.expectLPTokens(bob,
IOUAmount(0)));
1011 if (!features[fixAMMv1_3])
1012 BEAST_EXPECT(amm.expectLPTokens(carol,
IOUAmount{1118033988749895, -12}));
1014 BEAST_EXPECT(amm.expectLPTokens(carol,
IOUAmount{1118033988749894, -12}));
1019 BEAST_EXPECT(env.
balance(bob, USD) ==
STAmount(USD, UINT64_C(3000000000000000), -12));
1021 if (!features[fixAMMv1_3])
1022 BEAST_EXPECT(env.
balance(bob, EUR) ==
STAmount(EUR, UINT64_C(5000000000000001), -12));
1024 BEAST_EXPECT(env.
balance(bob, EUR) ==
STAmount(EUR, UINT64_C(4999999999999999), -12));
1031 if (!features[fixAMMv1_3])
1032 BEAST_EXPECT(amm.expectBalances(
1033 STAmount{USD, UINT64_C(3999999999999999), -12},
1034 STAmount{EUR, UINT64_C(4999999999999999), -12},
1037 BEAST_EXPECT(amm.expectBalances(
1038 STAmount{USD, UINT64_C(4000000000000001), -12},
1039 STAmount{EUR, UINT64_C(5000000000000002), -12},
1042 if (!features[fixAMMv1_3])
1043 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount{4472135954999580, -12}));
1045 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount{4472135954999579, -12}));
1046 BEAST_EXPECT(amm.expectLPTokens(bob,
IOUAmount(0)));
1047 BEAST_EXPECT(amm.expectLPTokens(carol,
IOUAmount(0)));
1055 BEAST_EXPECT(!amm.ammExists());
1061 Env env(*
this, features);
1065 env.
fund(
XRP(1000000), gw, alice, bob);
1074 auto const USD = gw[
"USD"];
1075 env.
trust(USD(1000000), alice);
1076 env(
pay(gw, alice, USD(600000)));
1077 env.
trust(USD(1000000), bob);
1078 env(
pay(gw, bob, USD(500000)));
1083 if (!features[fixAMMv1_3])
1084 BEAST_EXPECT(amm.expectBalances(USD(10000),
XRP(2000),
IOUAmount{4472135954999580, -9}));
1086 BEAST_EXPECT(amm.expectBalances(USD(10000),
XRP(2000),
IOUAmount{4472135954999579, -9}));
1087 amm.deposit(alice, USD(1000),
XRP(200));
1088 if (!features[fixAMMv1_3])
1089 BEAST_EXPECT(amm.expectBalances(USD(11000),
XRP(2200),
IOUAmount{4919349550499538, -9}));
1091 BEAST_EXPECT(amm.expectBalances(USD(11000),
XRP(2200),
IOUAmount{4919349550499536, -9}));
1092 amm.deposit(bob, USD(2000),
XRP(400));
1093 if (!features[fixAMMv1_3])
1094 BEAST_EXPECT(amm.expectBalances(USD(13000),
XRP(2600),
IOUAmount{5813776741499453, -9}));
1096 BEAST_EXPECT(amm.expectBalances(USD(13000),
XRP(2600),
IOUAmount{5813776741499451, -9}));
1099 auto aliceXrpBalance = env.
balance(alice,
XRP);
1105 if (!features[fixAMMv1_3])
1106 BEAST_EXPECT(amm.expectBalances(USD(12000),
XRP(2400),
IOUAmount{5366563145999495, -9}));
1108 BEAST_EXPECT(amm.expectBalances(USD(12000),
XRPAmount(2400000001),
IOUAmount{5366563145999494, -9}));
1109 if (!features[fixAMMv1_3])
1113 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount(0)));
1118 if (!features[fixAMMv1_3])
1119 BEAST_EXPECT(amm.expectBalances(USD(10000),
XRP(2000),
IOUAmount{4472135954999580, -9}));
1121 BEAST_EXPECT(amm.expectBalances(USD(10000),
XRPAmount(2000000001),
IOUAmount{4472135954999579, -9}));
1123 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount(0)));
1124 BEAST_EXPECT(amm.expectLPTokens(bob,
IOUAmount(0)));
1132 "test AMMClawback from AMM pool with assets having the same "
1134 using namespace jtx;
1138 Env env(*
this, features);
1143 env.
fund(
XRP(1000000), gw, alice, bob, carol);
1151 auto const USD = gw[
"USD"];
1152 env.
trust(USD(100000), alice);
1153 env(
pay(gw, alice, USD(10000)));
1154 env.
trust(USD(100000), bob);
1155 env(
pay(gw, bob, USD(9000)));
1156 env.
trust(USD(100000), carol);
1157 env(
pay(gw, carol, USD(8000)));
1160 auto const EUR = gw[
"EUR"];
1161 env.
trust(EUR(100000), alice);
1162 env(
pay(gw, alice, EUR(10000)));
1163 env.
trust(EUR(100000), bob);
1164 env(
pay(gw, bob, EUR(9000)));
1165 env.
trust(EUR(100000), carol);
1166 env(
pay(gw, carol, EUR(8000)));
1172 BEAST_EXPECT(amm.expectBalances(USD(8000), EUR(2000),
IOUAmount(4000)));
1173 amm.deposit(bob, USD(4000), EUR(1000));
1174 BEAST_EXPECT(amm.expectBalances(USD(12000), EUR(3000),
IOUAmount(6000)));
1175 if (!features[fixAMMv1_3])
1176 amm.deposit(carol, USD(2000), EUR(500));
1178 amm.deposit(carol, USD(2000.25), EUR(500));
1179 BEAST_EXPECT(amm.expectBalances(USD(14000), EUR(3500),
IOUAmount(7000)));
1183 BEAST_EXPECT(amm.expectBalances(USD(13000), EUR(3250),
IOUAmount(6500)));
1185 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount(4000)));
1186 BEAST_EXPECT(amm.expectLPTokens(bob,
IOUAmount(2000)));
1187 BEAST_EXPECT(amm.expectLPTokens(carol,
IOUAmount(500)));
1188 BEAST_EXPECT(env.
balance(alice, USD) == USD(2000));
1189 BEAST_EXPECT(env.
balance(alice, EUR) == EUR(8000));
1190 BEAST_EXPECT(env.
balance(bob, USD) == USD(5000));
1191 BEAST_EXPECT(env.
balance(bob, EUR) == EUR(8000));
1192 if (!features[fixAMMv1_3])
1193 BEAST_EXPECT(env.
balance(carol, USD) == USD(6000));
1195 BEAST_EXPECT(env.
balance(carol, USD) ==
STAmount(USD, UINT64_C(5999'999999999999), -12));
1197 BEAST_EXPECT(env.
balance(carol, EUR) == EUR(7750));
1204 BEAST_EXPECT(amm.expectBalances(USD(12000), EUR(3000),
IOUAmount(6000)));
1206 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount(4000)));
1207 BEAST_EXPECT(amm.expectLPTokens(bob,
IOUAmount(1500)));
1208 BEAST_EXPECT(amm.expectLPTokens(carol,
IOUAmount(500)));
1209 BEAST_EXPECT(env.
balance(alice, USD) == USD(2000));
1210 BEAST_EXPECT(env.
balance(alice, EUR) == EUR(8000));
1211 BEAST_EXPECT(env.
balance(bob, USD) == USD(5000));
1213 BEAST_EXPECT(env.
balance(bob, EUR) == EUR(8000));
1214 if (!features[fixAMMv1_3])
1215 BEAST_EXPECT(env.
balance(carol, USD) == USD(6000));
1217 BEAST_EXPECT(env.
balance(carol, USD) ==
STAmount(USD, UINT64_C(5999'999999999999), -12));
1218 BEAST_EXPECT(env.
balance(carol, EUR) == EUR(7750));
1223 BEAST_EXPECT(amm.expectBalances(USD(4000), EUR(1000),
IOUAmount(2000)));
1225 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount(0)));
1226 BEAST_EXPECT(amm.expectLPTokens(bob,
IOUAmount(1500)));
1227 BEAST_EXPECT(amm.expectLPTokens(carol,
IOUAmount(500)));
1228 BEAST_EXPECT(env.
balance(alice, USD) == USD(2000));
1229 BEAST_EXPECT(env.
balance(alice, EUR) == EUR(8000));
1230 BEAST_EXPECT(env.
balance(bob, USD) == USD(5000));
1231 BEAST_EXPECT(env.
balance(bob, EUR) == EUR(8000));
1232 if (!features[fixAMMv1_3])
1233 BEAST_EXPECT(env.
balance(carol, USD) == USD(6000));
1235 BEAST_EXPECT(env.
balance(carol, USD) ==
STAmount(USD, UINT64_C(5999'999999999999), -12));
1236 BEAST_EXPECT(env.
balance(carol, EUR) == EUR(7750));
1321 testcase(
"test AMMClawback when issuing token for each other");
1322 using namespace jtx;
1326 Env env(*
this, features);
1330 env.
fund(
XRP(1000000), gw, gw2, alice);
1343 auto const USD = gw[
"USD"];
1344 env.
trust(USD(100000), gw2);
1345 env(
pay(gw, gw2, USD(5000)));
1346 env.
trust(USD(100000), alice);
1347 env(
pay(gw, alice, USD(5000)));
1349 auto const EUR = gw2[
"EUR"];
1350 env.
trust(EUR(100000), gw);
1351 env(
pay(gw2, gw, EUR(6000)));
1352 env.
trust(EUR(100000), alice);
1353 env(
pay(gw2, alice, EUR(6000)));
1358 BEAST_EXPECT(amm.expectBalances(USD(1000), EUR(2000),
IOUAmount{1414213562373095, -12}));
1360 amm.deposit(gw2, USD(2000), EUR(4000));
1361 BEAST_EXPECT(amm.expectBalances(USD(3000), EUR(6000),
IOUAmount{4242640687119285, -12}));
1363 amm.deposit(alice, USD(3000), EUR(6000));
1364 BEAST_EXPECT(amm.expectBalances(USD(6000), EUR(12000),
IOUAmount{8485281374238570, -12}));
1366 BEAST_EXPECT(amm.expectLPTokens(gw,
IOUAmount{1414213562373095, -12}));
1367 BEAST_EXPECT(amm.expectLPTokens(gw2,
IOUAmount{2828427124746190, -12}));
1368 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount{4242640687119285, -12}));
1373 if (!features[fixAMMv1_3] || !features[fixAMMClawbackRounding])
1374 BEAST_EXPECT(amm.expectBalances(USD(5000), EUR(10000),
IOUAmount{7071067811865475, -12}));
1376 BEAST_EXPECT(amm.expectBalances(USD(5000), EUR(10000),
IOUAmount{7071067811865474, -12}));
1378 BEAST_EXPECT(amm.expectLPTokens(gw,
IOUAmount{1414213562373095, -12}));
1379 if (!features[fixAMMv1_3] || !features[fixAMMClawbackRounding])
1380 BEAST_EXPECT(amm.expectLPTokens(gw2,
IOUAmount{1414213562373095, -12}));
1382 BEAST_EXPECT(amm.expectLPTokens(gw2,
IOUAmount{1414213562373094, -12}));
1383 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount{4242640687119285, -12}));
1385 BEAST_EXPECT(env.
balance(alice, USD) == USD(2000));
1386 BEAST_EXPECT(env.
balance(alice, EUR) == EUR(0));
1387 BEAST_EXPECT(env.
balance(gw, EUR) == EUR(4000));
1388 BEAST_EXPECT(env.
balance(gw2, USD) == USD(3000));
1393 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
1394 BEAST_EXPECT(amm.expectBalances(
1395 USD(4500),
STAmount(EUR, UINT64_C(9000000000000001), -12),
IOUAmount{6363961030678928, -12}));
1396 else if (!features[fixAMMClawbackRounding])
1397 BEAST_EXPECT(amm.expectBalances(USD(4500), EUR(9000),
IOUAmount{6363961030678928, -12}));
1398 else if (features[fixAMMv1_3] && features[fixAMMClawbackRounding])
1399 BEAST_EXPECT(amm.expectBalances(
1400 USD(4500),
STAmount(EUR, UINT64_C(9000000000000001), -12),
IOUAmount{6363961030678927, -12}));
1402 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
1403 BEAST_EXPECT(amm.expectLPTokens(gw,
IOUAmount{7071067811865480, -13}));
1404 else if (!features[fixAMMClawbackRounding])
1405 BEAST_EXPECT(amm.expectLPTokens(gw,
IOUAmount{7071067811865475, -13}));
1406 else if (features[fixAMMv1_3] && features[fixAMMClawbackRounding])
1407 BEAST_EXPECT(amm.expectLPTokens(gw,
IOUAmount{7071067811865480, -13}));
1409 if (!features[fixAMMv1_3] || !features[fixAMMClawbackRounding])
1410 BEAST_EXPECT(amm.expectLPTokens(gw2,
IOUAmount{1414213562373095, -12}));
1412 BEAST_EXPECT(amm.expectLPTokens(gw2,
IOUAmount{1414213562373094, -12}));
1414 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount{4242640687119285, -12}));
1416 BEAST_EXPECT(env.
balance(alice, USD) == USD(2000));
1417 BEAST_EXPECT(env.
balance(alice, EUR) == EUR(0));
1418 BEAST_EXPECT(env.
balance(gw, EUR) == EUR(4000));
1419 BEAST_EXPECT(env.
balance(gw2, USD) == USD(3000));
1424 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
1425 BEAST_EXPECT(amm.expectBalances(
1426 USD(2500),
STAmount(EUR, UINT64_C(5000000000000001), -12),
IOUAmount{3535533905932738, -12}));
1427 else if (!features[fixAMMClawbackRounding])
1428 BEAST_EXPECT(amm.expectBalances(USD(2500), EUR(5000),
IOUAmount{3535533905932738, -12}));
1429 else if (features[fixAMMv1_3] && features[fixAMMClawbackRounding])
1430 BEAST_EXPECT(amm.expectBalances(
1431 USD(2500),
STAmount(EUR, UINT64_C(5000000000000001), -12),
IOUAmount{3535533905932737, -12}));
1433 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
1434 BEAST_EXPECT(amm.expectLPTokens(gw,
IOUAmount{7071067811865480, -13}));
1435 else if (!features[fixAMMClawbackRounding])
1436 BEAST_EXPECT(amm.expectLPTokens(gw,
IOUAmount{7071067811865475, -13}));
1437 else if (features[fixAMMv1_3] && features[fixAMMClawbackRounding])
1438 BEAST_EXPECT(amm.expectLPTokens(gw,
IOUAmount{7071067811865480, -13}));
1440 if (!features[fixAMMv1_3] || !features[fixAMMClawbackRounding])
1441 BEAST_EXPECT(amm.expectLPTokens(gw2,
IOUAmount{1414213562373095, -12}));
1443 BEAST_EXPECT(amm.expectLPTokens(gw2,
IOUAmount{1414213562373094, -12}));
1444 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount{1414213562373095, -12}));
1446 BEAST_EXPECT(env.
balance(alice, USD) == USD(4000));
1447 BEAST_EXPECT(env.
balance(alice, EUR) == EUR(0));
1448 BEAST_EXPECT(env.
balance(gw, EUR) == EUR(4000));
1449 BEAST_EXPECT(env.
balance(gw2, USD) == USD(3000));
1487 using namespace jtx;
1491 Env env(*
this, features);
1495 env.
fund(
XRP(1000000), gw, gw2, alice);
1504 auto const USD = gw[
"USD"];
1505 env.
trust(USD(100000), alice);
1506 env(
pay(gw, alice, USD(3000)));
1511 auto const EUR = gw2[
"EUR"];
1512 env.
trust(EUR(100000), alice);
1513 env(
pay(gw2, alice, EUR(3000)));
1521 BEAST_EXPECT(amm.expectBalances(USD(2000), EUR(1000),
IOUAmount{1414213562373095, -12}));
1533 BEAST_EXPECT(amm.expectBalances(USD(1000), EUR(500),
IOUAmount{7071067811865475, -13}));
1536 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount{7071067811865475, -13}));
1549 BEAST_EXPECT(!amm.ammExists());
1554 Env env(*
this, features);
1558 env.
fund(
XRP(1000000), gw, gw2, alice);
1567 auto const USD = gw[
"USD"];
1568 env.
trust(USD(100000), alice);
1569 env(
pay(gw, alice, USD(3000)));
1574 auto const EUR = gw2[
"EUR"];
1575 env.
trust(EUR(100000), alice);
1576 env(
pay(gw2, alice, EUR(3000)));
1584 BEAST_EXPECT(amm.expectBalances(USD(2000), EUR(1000),
IOUAmount{1414213562373095, -12}));
1597 BEAST_EXPECT(amm.expectBalances(USD(1000), EUR(500),
IOUAmount{7071067811865475, -13}));
1598 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount{7071067811865475, -13}));
1603 Env env(*
this, features);
1607 env.
fund(
XRP(1000000), gw, gw2, alice);
1616 auto const USD = gw[
"USD"];
1617 env.
trust(USD(100000), alice);
1618 env(
pay(gw, alice, USD(3000)));
1623 auto const EUR = gw2[
"EUR"];
1624 env.
trust(EUR(100000), alice);
1625 env(
pay(gw2, alice, EUR(3000)));
1633 BEAST_EXPECT(amm.expectBalances(USD(2000), EUR(1000),
IOUAmount{1414213562373095, -12}));
1645 BEAST_EXPECT(amm.expectBalances(USD(1000), EUR(500),
IOUAmount{7071067811865475, -13}));
1646 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount{7071067811865475, -13}));
1652 Env env(*
this, features);
1657 env.
fund(
XRP(1000000), gw, alice, bob, carol);
1665 auto const USD = gw[
"USD"];
1666 env.
trust(USD(100000), alice);
1667 env(
pay(gw, alice, USD(10000)));
1668 env.
trust(USD(100000), bob);
1669 env(
pay(gw, bob, USD(9000)));
1670 env.
trust(USD(100000), carol);
1671 env(
pay(gw, carol, USD(8000)));
1674 auto const EUR = gw[
"EUR"];
1675 env.
trust(EUR(100000), alice);
1676 env(
pay(gw, alice, EUR(10000)));
1677 env.
trust(EUR(100000), bob);
1678 env(
pay(gw, bob, EUR(9000)));
1679 env.
trust(EUR(100000), carol);
1680 env(
pay(gw, carol, EUR(8000)));
1686 BEAST_EXPECT(amm.expectBalances(USD(8000), EUR(2000),
IOUAmount(4000)));
1687 amm.deposit(bob, USD(4000), EUR(1000));
1688 BEAST_EXPECT(amm.expectBalances(USD(12000), EUR(3000),
IOUAmount(6000)));
1689 if (!features[fixAMMv1_3])
1690 amm.deposit(carol, USD(2000), EUR(500));
1692 amm.deposit(carol, USD(2000.25), EUR(500));
1693 BEAST_EXPECT(amm.expectBalances(USD(14000), EUR(3500),
IOUAmount(7000)));
1702 BEAST_EXPECT(amm.expectBalances(USD(13000), EUR(3250),
IOUAmount(6500)));
1704 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount(4000)));
1705 BEAST_EXPECT(amm.expectLPTokens(bob,
IOUAmount(2000)));
1706 BEAST_EXPECT(amm.expectLPTokens(carol,
IOUAmount(500)));
1707 BEAST_EXPECT(env.
balance(alice, USD) == USD(2000));
1708 BEAST_EXPECT(env.
balance(alice, EUR) == EUR(8000));
1709 BEAST_EXPECT(env.
balance(bob, USD) == USD(5000));
1710 BEAST_EXPECT(env.
balance(bob, EUR) == EUR(8000));
1711 if (!features[fixAMMv1_3])
1712 BEAST_EXPECT(env.
balance(carol, USD) == USD(6000));
1714 BEAST_EXPECT(env.
balance(carol, USD) ==
STAmount(USD, UINT64_C(5999'999999999999), -12));
1716 BEAST_EXPECT(env.
balance(carol, EUR) == EUR(7750));
1723 BEAST_EXPECT(amm.expectBalances(USD(12000), EUR(3000),
IOUAmount(6000)));
1725 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount(4000)));
1726 BEAST_EXPECT(amm.expectLPTokens(bob,
IOUAmount(1500)));
1727 BEAST_EXPECT(amm.expectLPTokens(carol,
IOUAmount(500)));
1728 BEAST_EXPECT(env.
balance(alice, USD) == USD(2000));
1729 BEAST_EXPECT(env.
balance(alice, EUR) == EUR(8000));
1730 BEAST_EXPECT(env.
balance(bob, USD) == USD(5000));
1732 BEAST_EXPECT(env.
balance(bob, EUR) == EUR(8000));
1733 if (!features[fixAMMv1_3])
1734 BEAST_EXPECT(env.
balance(carol, USD) == USD(6000));
1736 BEAST_EXPECT(env.
balance(carol, USD) ==
STAmount(USD, UINT64_C(5999'999999999999), -12));
1737 BEAST_EXPECT(env.
balance(carol, EUR) == EUR(7750));
1742 BEAST_EXPECT(amm.expectBalances(USD(4000), EUR(1000),
IOUAmount(2000)));
1744 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount(0)));
1745 BEAST_EXPECT(amm.expectLPTokens(bob,
IOUAmount(1500)));
1746 BEAST_EXPECT(amm.expectLPTokens(carol,
IOUAmount(500)));
1747 BEAST_EXPECT(env.
balance(alice, USD) == USD(2000));
1748 BEAST_EXPECT(env.
balance(alice, EUR) == EUR(8000));
1749 BEAST_EXPECT(env.
balance(bob, USD) == USD(5000));
1750 BEAST_EXPECT(env.
balance(bob, EUR) == EUR(8000));
1751 if (!features[fixAMMv1_3])
1752 BEAST_EXPECT(env.
balance(carol, USD) == USD(6000));
1754 BEAST_EXPECT(env.
balance(carol, USD) ==
STAmount(USD, UINT64_C(5999'999999999999), -12));
1755 BEAST_EXPECT(env.
balance(carol, EUR) == EUR(7750));
1819 "test last holder's lptoken balance not equal to AMM's lptoken "
1820 "balance before clawback");
1821 using namespace jtx;
1825 env.
fund(
XRP(100000), gw, alice, bob);
1830 auto const USD = gw[
"USD"];
1831 env.
trust(USD(100000), alice);
1832 env(
pay(gw, alice, USD(50000)));
1833 env.
trust(USD(100000), bob);
1834 env(
pay(gw, bob, USD(40000)));
1840 auto getLPTokenBalances =
1843 auto const lpTokenBalance = amm.ammRpcInfo()[jss::amm][jss::lp_token][jss::value].asString();
1844 return {lpToken, lpTokenBalance};
1850 Account gw{
"gateway"}, alice{
"alice"}, bob{
"bob"};
1851 auto const USD = setupAccounts(env, gw, alice, bob);
1853 AMM amm(env, alice,
XRP(2), USD(1));
1854 amm.deposit(alice,
IOUAmount{1'876123487565916, -15});
1856 amm.withdraw(alice,
IOUAmount{1'876123487565916, -15});
1857 amm.withdrawAll(bob);
1859 auto [lpToken, lpTokenBalance] = getLPTokenBalances(env, amm, alice);
1860 BEAST_EXPECT(lpToken ==
"1414.21356237366" && lpTokenBalance ==
"1414.213562374");
1863 BEAST_EXPECT(res && res.value());
1865 if (!features[fixAMMClawbackRounding] || !features[fixAMMv1_3])
1868 BEAST_EXPECT(amm.ammExists());
1872 auto const lpBalance =
IOUAmount{989, -12};
1875 amm.expectBalances(
STAmount(USD, UINT64_C(7000000000000000), -28),
XRPAmount(1), lpBalance));
1876 BEAST_EXPECT(amm.expectLPTokens(alice, lpBalance));
1883 Account gw{
"gateway"}, alice{
"alice"}, bob{
"bob"};
1884 auto const USD = setupAccounts(env, gw, alice, bob);
1886 AMM amm(env, alice,
XRP(2), USD(1));
1887 amm.deposit(alice,
IOUAmount{1'876123487565916, -15});
1889 amm.withdrawAll(bob);
1891 auto [lpToken, lpTokenBalance] = getLPTokenBalances(env, amm, alice);
1892 BEAST_EXPECT(lpToken ==
"1416.08968586066" && lpTokenBalance ==
"1416.089685861");
1895 BEAST_EXPECT(res && res.value());
1899 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
1901 BEAST_EXPECT(amm.expectBalances(
1902 STAmount(USD, UINT64_C(5013266196406), -13),
1906 else if (!features[fixAMMClawbackRounding])
1908 BEAST_EXPECT(amm.expectBalances(
1909 STAmount(USD, UINT64_C(5013266196407), -13),
1913 else if (features[fixAMMv1_3] && features[fixAMMClawbackRounding])
1915 auto const lpBalance =
IOUAmount{708'9829046743238, -13};
1917 amm.expectBalances(
STAmount(USD, UINT64_C(5013266196406999), -16),
XRPAmount(1002655), lpBalance));
1918 BEAST_EXPECT(amm.expectLPTokens(alice, lpBalance));
1925 Account gw{
"gateway"}, alice{
"alice"}, bob{
"bob"};
1926 auto const USD = setupAccounts(env, gw, alice, bob);
1928 AMM amm(env, alice,
XRP(2), USD(1));
1929 amm.deposit(alice,
IOUAmount{1'876123487565916, -15});
1931 amm.withdraw(alice,
IOUAmount{1'876123487565916, -15});
1932 amm.withdrawAll(bob);
1934 auto [lpToken, lpTokenBalance] = getLPTokenBalances(env, amm, alice);
1935 BEAST_EXPECT(lpToken ==
"1414.21356237366" && lpTokenBalance ==
"1414.213562374");
1938 BEAST_EXPECT(res && res.value());
1940 if (!features[fixAMMClawbackRounding] && !features[fixAMMv1_3])
1944 else if (!features[fixAMMClawbackRounding])
1947 BEAST_EXPECT(amm.expectBalances(
1950 else if (features[fixAMMv1_3] && features[fixAMMClawbackRounding])
1953 BEAST_EXPECT(!amm.ammExists());
1960 Account gw{
"gateway"}, alice{
"alice"}, bob{
"bob"};
1961 auto const USD = setupAccounts(env, gw, alice, bob);
1966 auto const EUR = gw2[
"EUR"];
1967 env.
trust(EUR(100000), alice);
1968 env(
pay(gw2, alice, EUR(50000)));
1969 env.
trust(EUR(100000), bob);
1970 env(
pay(gw2, bob, EUR(50000)));
1973 AMM amm(env, alice, USD(2), EUR(1));
1974 amm.deposit(alice,
IOUAmount{1'576123487565916, -15});
1976 amm.withdraw(alice,
IOUAmount{1'576123487565916, -15});
1977 amm.withdrawAll(bob);
1979 auto [lpToken, lpTokenBalance] = getLPTokenBalances(env, amm, alice);
1980 BEAST_EXPECT(lpToken ==
"1.414213562374011" && lpTokenBalance ==
"1.414213562374");
1983 BEAST_EXPECT(res && res.value());
1985 if (features[fixAMMv1_3] && features[fixAMMClawbackRounding])
1988 BEAST_EXPECT(!amm.ammExists());
1993 BEAST_EXPECT(amm.ammExists());
2000 Account gw{
"gateway"}, alice{
"alice"}, bob{
"bob"};
2001 auto const USD = setupAccounts(env, gw, alice, bob);
2003 auto const EUR = gw[
"EUR"];
2004 env.
trust(EUR(100000), alice);
2005 env(
pay(gw, alice, EUR(50000)));
2006 env.
trust(EUR(100000), bob);
2007 env(
pay(gw, bob, EUR(50000)));
2010 AMM amm(env, alice, USD(1), EUR(2));
2011 amm.deposit(alice,
IOUAmount{1'076123487565916, -15});
2013 amm.withdraw(alice,
IOUAmount{1'076123487565916, -15});
2014 amm.withdrawAll(bob);
2016 auto [lpToken, lpTokenBalance] = getLPTokenBalances(env, amm, alice);
2017 BEAST_EXPECT(lpToken ==
"1.414213562374011" && lpTokenBalance ==
"1.414213562374");
2020 BEAST_EXPECT(res && res.value());
2022 if (features[fixAMMClawbackRounding])
2025 BEAST_EXPECT(!amm.ammExists());
2030 BEAST_EXPECT(amm.ammExists());
2037 Account gw{
"gateway"}, alice{
"alice"}, bob{
"bob"};
2038 auto const USD = setupAccounts(env, gw, alice, bob);
2040 auto const EUR = gw[
"EUR"];
2041 env.
trust(EUR(1000000000), alice);
2042 env(
pay(gw, alice, EUR(500000000)));
2043 env.
trust(EUR(1000000000), bob);
2044 env(
pay(gw, bob, EUR(500000000)));
2047 AMM amm(env, alice, USD(1), EUR(2000000));
2048 amm.deposit(alice,
IOUAmount{1'076123487565916, -12});
2050 amm.withdraw(alice,
IOUAmount{1'076123487565916, -12});
2051 amm.withdrawAll(bob);
2053 auto [lpToken, lpTokenBalance] = getLPTokenBalances(env, amm, alice);
2055 BEAST_EXPECT(lpToken ==
"1414.213562373101" && lpTokenBalance ==
"1414.2135623731");
2058 BEAST_EXPECT(res && res.value());
2060 if (!features[fixAMMClawbackRounding] && !features[fixAMMv1_3])
2063 BEAST_EXPECT(amm.expectBalances(
2066 else if (!features[fixAMMClawbackRounding])
2071 BEAST_EXPECT(amm.ammExists());
2073 else if (features[fixAMMv1_3] && features[fixAMMClawbackRounding])
2076 auto const lpBalance =
IOUAmount{5, -12};
2078 amm.expectBalances(
STAmount(USD, UINT64_C(4), -15),
STAmount(EUR, UINT64_C(8), -9), lpBalance));
2079 BEAST_EXPECT(amm.expectLPTokens(alice, lpBalance));