529 "test AMMClawback specific amount which exceeds the current "
538 Env env(*
this, features);
542 env.
fund(
XRP(1000000), gw, gw2, alice);
551 auto const USD = gw[
"USD"];
552 env.
trust(USD(100000), alice);
553 env(
pay(gw, alice, USD(6000)));
558 auto const EUR = gw2[
"EUR"];
559 env.
trust(EUR(100000), alice);
560 env(
pay(gw2, alice, EUR(6000)));
568 if (!features[fixAMMv1_3])
569 BEAST_EXPECT(amm.expectBalances(
570 USD(4000), EUR(5000),
IOUAmount{4472135954999580, -12}));
572 BEAST_EXPECT(amm.expectBalances(
573 USD(4000), EUR(5000),
IOUAmount{4472135954999579, -12}));
592 if (!features[fixAMMv1_3])
593 BEAST_EXPECT(amm.expectBalances(
594 USD(3000), EUR(3750),
IOUAmount{3354101966249685, -12}));
596 BEAST_EXPECT(amm.expectBalances(
597 USD(3000), EUR(3750),
IOUAmount{3354101966249684, -12}));
600 if (!features[fixAMMv1_3])
601 BEAST_EXPECT(amm.expectLPTokens(
602 alice,
IOUAmount{3354101966249685, -12}));
604 BEAST_EXPECT(amm.expectLPTokens(
605 alice,
IOUAmount{3354101966249684, -12}));
616 if (!features[fixAMMv1_3])
617 BEAST_EXPECT(amm.expectBalances(
618 STAmount{USD, UINT64_C(2500000000000001), -12},
619 STAmount{EUR, UINT64_C(3125000000000001), -12},
622 BEAST_EXPECT(amm.expectBalances(
623 USD(2500), EUR(3125),
IOUAmount{2795084971874737, -12}));
625 if (!features[fixAMMv1_3])
628 STAmount(EUR, UINT64_C(2874999999999999), -12));
630 BEAST_EXPECT(env.
balance(alice, EUR) == EUR(2875));
639 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
640 BEAST_EXPECT(amm.expectBalances(
641 STAmount{USD, UINT64_C(2499000000000002), -12},
642 STAmount{EUR, UINT64_C(3123750000000002), -12},
644 else if (!features[fixAMMClawbackRounding])
645 BEAST_EXPECT(amm.expectBalances(
646 USD(2499), EUR(3123.75),
IOUAmount{2793966937885987, -12}));
647 else if (features[fixAMMClawbackRounding] && features[fixAMMv1_3])
648 BEAST_EXPECT(amm.expectBalances(
649 STAmount{USD, UINT64_C(2499000000000001), -12},
650 STAmount{EUR, UINT64_C(3123750000000001), -12},
653 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
656 STAmount(EUR, UINT64_C(2876'249999999998), -12));
657 else if (!features[fixAMMClawbackRounding])
658 BEAST_EXPECT(env.
balance(alice, EUR) == EUR(2876.25));
659 else if (features[fixAMMClawbackRounding] && features[fixAMMv1_3])
662 STAmount(EUR, UINT64_C(2876'249999999999), -12));
675 STAmount(EUR, UINT64_C(6000000000000000), -12));
678 BEAST_EXPECT(!amm.ammExists());
687 Env env(*
this, features);
692 env.
fund(
XRP(1000000), gw, gw2, alice, bob);
706 auto const USD = gw[
"USD"];
707 env.
trust(USD(100000), alice);
708 env(
pay(gw, alice, USD(6000)));
709 env.
trust(USD(100000), bob);
710 env(
pay(gw, bob, USD(5000)));
714 auto const EUR = gw2[
"EUR"];
715 env.
trust(EUR(100000), alice);
716 env(
pay(gw2, alice, EUR(5000)));
717 env.
trust(EUR(100000), bob);
718 env(
pay(gw2, bob, EUR(4000)));
723 BEAST_EXPECT(amm.expectBalances(
724 USD(1000),
XRP(2000),
IOUAmount{1414213562373095, -9}));
725 amm.deposit(alice, USD(1000),
XRP(2000));
726 BEAST_EXPECT(amm.expectBalances(
727 USD(2000),
XRP(4000),
IOUAmount{2828427124746190, -9}));
728 amm.deposit(bob, USD(1000),
XRP(2000));
729 BEAST_EXPECT(amm.expectBalances(
730 USD(3000),
XRP(6000),
IOUAmount{4242640687119285, -9}));
735 if (!features[fixAMMv1_3])
737 EUR(1000),
XRP(3000),
IOUAmount{1732050807568878, -9}));
740 EUR(1000),
XRP(3000),
IOUAmount{1732050807568877, -9}));
743 if (!features[fixAMMv1_3])
745 EUR(2000),
XRP(6000),
IOUAmount{3464101615137756, -9}));
748 EUR(2000),
XRP(6000),
IOUAmount{3464101615137754, -9}));
751 if (!features[fixAMMv1_3])
753 EUR(3000),
XRP(9000),
IOUAmount{5196152422706634, -9}));
756 EUR(3000),
XRP(9000),
IOUAmount{5196152422706631, -9}));
759 auto aliceXrpBalance = env.
balance(alice,
XRP);
776 if (features[fixAMMClawbackRounding] && features[fixAMMv1_3])
778 env, alice, aliceXrpBalance +
XRP(1000) -
XRPAmount(1)));
781 env, alice, aliceXrpBalance +
XRP(1000)));
784 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
785 BEAST_EXPECT(amm.expectBalances(
786 USD(2500),
XRP(5000),
IOUAmount{3535533905932738, -9}));
787 else if (!features[fixAMMClawbackRounding])
788 BEAST_EXPECT(amm.expectBalances(
789 USD(2500),
XRP(5000),
IOUAmount{3535533905932737, -9}));
790 else if (features[fixAMMClawbackRounding] && features[fixAMMv1_3])
791 BEAST_EXPECT(amm.expectBalances(
796 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
797 BEAST_EXPECT(amm.expectLPTokens(
798 alice,
IOUAmount{7071067811865480, -10}));
799 else if (!features[fixAMMClawbackRounding])
800 BEAST_EXPECT(amm.expectLPTokens(
801 alice,
IOUAmount{7071067811865474, -10}));
802 else if (features[fixAMMClawbackRounding] && features[fixAMMv1_3])
804 amm.expectLPTokens(alice,
IOUAmount{707106781186548, -9}));
807 amm.expectLPTokens(bob,
IOUAmount{1414213562373095, -9}));
821 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
822 BEAST_EXPECT(amm.expectBalances(
823 STAmount{USD, UINT64_C(2490000000000001), -12},
826 else if (!features[fixAMMClawbackRounding])
827 BEAST_EXPECT(amm.expectBalances(
828 USD(2'490),
XRP(4980),
IOUAmount{3521391770309006, -9}));
829 else if (features[fixAMMClawbackRounding] && features[fixAMMv1_3])
830 BEAST_EXPECT(amm.expectBalances(
831 STAmount{USD, UINT64_C(2490000000000001), -12},
835 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
836 BEAST_EXPECT(amm.expectLPTokens(
837 alice,
IOUAmount{7071067811865480, -10}));
838 else if (!features[fixAMMClawbackRounding])
839 BEAST_EXPECT(amm.expectLPTokens(
840 alice,
IOUAmount{7071067811865474, -10}));
841 else if (features[fixAMMClawbackRounding] && features[fixAMMv1_3])
843 amm.expectLPTokens(alice,
IOUAmount{707106781186548, -9}));
845 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
847 amm.expectLPTokens(bob,
IOUAmount{1400071426749365, -9}));
848 else if (!features[fixAMMClawbackRounding])
850 amm.expectLPTokens(bob,
IOUAmount{1400071426749364, -9}));
851 else if (features[fixAMMClawbackRounding] && features[fixAMMv1_3])
853 amm.expectLPTokens(bob,
IOUAmount{1400071426749365, -9}));
863 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
865 env, alice, aliceXrpBalance +
XRP(600)));
866 else if (!features[fixAMMClawbackRounding])
868 env, alice, aliceXrpBalance +
XRP(600)));
869 else if (features[fixAMMClawbackRounding] && features[fixAMMv1_3])
871 env, alice, aliceXrpBalance +
XRP(600) -
XRPAmount{1}));
874 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
876 EUR(2800),
XRP(8400),
IOUAmount{4849742261192859, -9}));
877 else if (!features[fixAMMClawbackRounding])
879 EUR(2800),
XRP(8400),
IOUAmount{4849742261192856, -9}));
880 else if (features[fixAMMv1_3] && features[fixAMMClawbackRounding])
886 if (!features[fixAMMv1_3])
888 alice,
IOUAmount{1385640646055103, -9}));
891 alice,
IOUAmount{1385640646055102, -9}));
892 if (!features[fixAMMv1_3])
910 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
912 env, alice, aliceXrpBalance +
XRP(1000)));
913 else if (!features[fixAMMClawbackRounding])
915 env, alice, aliceXrpBalance +
XRP(1000) -
XRPAmount{1}));
916 else if (features[fixAMMv1_3] && features[fixAMMClawbackRounding])
918 env, alice, aliceXrpBalance +
XRP(1000)));
921 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount(0)));
922 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
924 amm.expectLPTokens(bob,
IOUAmount{1400071426749365, -9}));
925 else if (!features[fixAMMClawbackRounding])
927 amm.expectLPTokens(bob,
IOUAmount{1400071426749364, -9}));
928 else if (features[fixAMMClawbackRounding] && features[fixAMMv1_3])
930 amm.expectLPTokens(bob,
IOUAmount{1400071426749365, -9}));
932 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
933 BEAST_EXPECT(amm.expectBalances(
934 STAmount{USD, UINT64_C(1990000000000001), -12},
937 else if (!features[fixAMMClawbackRounding])
938 BEAST_EXPECT(amm.expectBalances(
942 else if (features[fixAMMv1_3] && features[fixAMMClawbackRounding])
943 BEAST_EXPECT(amm.expectBalances(
944 STAmount{USD, UINT64_C(1990000000000001), -12},
965 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount(0)));
966 BEAST_EXPECT(amm.expectLPTokens(bob,
IOUAmount(0)));
989 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
991 EUR(2000),
XRP(6000),
IOUAmount{3464101615137756, -9}));
992 else if (!features[fixAMMClawbackRounding])
994 EUR(2000),
XRP(6000),
IOUAmount{3464101615137754, -9}));
995 else if (features[fixAMMv1_3] && features[fixAMMClawbackRounding])
1023 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
1025 EUR(1000),
XRP(3000),
IOUAmount{1732050807568878, -9}));
1026 else if (!features[fixAMMClawbackRounding])
1028 EUR(1000),
XRP(3000),
IOUAmount{1732050807568877, -9}));
1029 else if (features[fixAMMv1_3] && features[fixAMMClawbackRounding])
1040 testcase(
"test AMMClawback all the tokens in the AMM pool");
1041 using namespace jtx;
1046 Env env(*
this, features);
1052 env.
fund(
XRP(1000000), gw, gw2, alice, bob, carol);
1067 auto const USD = gw[
"USD"];
1068 env.
trust(USD(100000), alice);
1069 env(
pay(gw, alice, USD(6000)));
1070 env.
trust(USD(100000), bob);
1071 env(
pay(gw, bob, USD(5000)));
1072 env.
trust(USD(100000), carol);
1073 env(
pay(gw, carol, USD(4000)));
1078 auto const EUR = gw2[
"EUR"];
1079 env.
trust(EUR(100000), alice);
1080 env(
pay(gw2, alice, EUR(6000)));
1081 env.
trust(EUR(100000), bob);
1082 env(
pay(gw2, bob, EUR(5000)));
1083 env.
trust(EUR(100000), carol);
1084 env(
pay(gw2, carol, EUR(4000)));
1091 if (!features[fixAMMv1_3])
1092 BEAST_EXPECT(amm.expectBalances(
1093 USD(4000), EUR(5000),
IOUAmount{4472135954999580, -12}));
1095 BEAST_EXPECT(amm.expectBalances(
1096 USD(4000), EUR(5000),
IOUAmount{4472135954999579, -12}));
1097 amm.deposit(bob, USD(2000), EUR(2500));
1098 if (!features[fixAMMv1_3])
1099 BEAST_EXPECT(amm.expectBalances(
1100 USD(6000), EUR(7500),
IOUAmount{6708203932499370, -12}));
1102 BEAST_EXPECT(amm.expectBalances(
1103 USD(6000), EUR(7500),
IOUAmount{6708203932499368, -12}));
1104 amm.deposit(carol, USD(1000), EUR(1250));
1105 if (!features[fixAMMv1_3])
1106 BEAST_EXPECT(amm.expectBalances(
1107 USD(7000), EUR(8750),
IOUAmount{7826237921249265, -12}));
1109 BEAST_EXPECT(amm.expectBalances(
1110 USD(7000), EUR(8750),
IOUAmount{7826237921249262, -12}));
1112 if (!features[fixAMMv1_3])
1113 BEAST_EXPECT(amm.expectLPTokens(
1114 alice,
IOUAmount{4472135954999580, -12}));
1116 BEAST_EXPECT(amm.expectLPTokens(
1117 alice,
IOUAmount{4472135954999579, -12}));
1118 if (!features[fixAMMv1_3])
1120 amm.expectLPTokens(bob,
IOUAmount{2236067977499790, -12}));
1123 amm.expectLPTokens(bob,
IOUAmount{2236067977499789, -12}));
1124 if (!features[fixAMMv1_3])
1125 BEAST_EXPECT(amm.expectLPTokens(
1126 carol,
IOUAmount{1118033988749895, -12}));
1128 BEAST_EXPECT(amm.expectLPTokens(
1129 carol,
IOUAmount{1118033988749894, -12}));
1143 if (!features[fixAMMv1_3])
1144 BEAST_EXPECT(amm.expectBalances(
1145 STAmount{USD, UINT64_C(4999999999999999), -12},
1146 STAmount{EUR, UINT64_C(6249999999999999), -12},
1149 BEAST_EXPECT(amm.expectBalances(
1150 STAmount{USD, UINT64_C(5000000000000001), -12},
1151 STAmount{EUR, UINT64_C(6250000000000001), -12},
1154 if (!features[fixAMMv1_3])
1155 BEAST_EXPECT(amm.expectLPTokens(
1156 alice,
IOUAmount{4472135954999580, -12}));
1158 BEAST_EXPECT(amm.expectLPTokens(
1159 alice,
IOUAmount{4472135954999579, -12}));
1160 BEAST_EXPECT(amm.expectLPTokens(bob,
IOUAmount(0)));
1161 if (!features[fixAMMv1_3])
1162 BEAST_EXPECT(amm.expectLPTokens(
1163 carol,
IOUAmount{1118033988749895, -12}));
1165 BEAST_EXPECT(amm.expectLPTokens(
1166 carol,
IOUAmount{1118033988749894, -12}));
1173 STAmount(USD, UINT64_C(3000000000000000), -12));
1175 if (!features[fixAMMv1_3])
1178 STAmount(EUR, UINT64_C(5000000000000001), -12));
1182 STAmount(EUR, UINT64_C(4999999999999999), -12));
1190 if (!features[fixAMMv1_3])
1191 BEAST_EXPECT(amm.expectBalances(
1192 STAmount{USD, UINT64_C(3999999999999999), -12},
1193 STAmount{EUR, UINT64_C(4999999999999999), -12},
1196 BEAST_EXPECT(amm.expectBalances(
1197 STAmount{USD, UINT64_C(4000000000000001), -12},
1198 STAmount{EUR, UINT64_C(5000000000000002), -12},
1201 if (!features[fixAMMv1_3])
1202 BEAST_EXPECT(amm.expectLPTokens(
1203 alice,
IOUAmount{4472135954999580, -12}));
1205 BEAST_EXPECT(amm.expectLPTokens(
1206 alice,
IOUAmount{4472135954999579, -12}));
1207 BEAST_EXPECT(amm.expectLPTokens(bob,
IOUAmount(0)));
1208 BEAST_EXPECT(amm.expectLPTokens(carol,
IOUAmount(0)));
1217 BEAST_EXPECT(!amm.ammExists());
1223 Env env(*
this, features);
1227 env.
fund(
XRP(1000000), gw, alice, bob);
1236 auto const USD = gw[
"USD"];
1237 env.
trust(USD(1000000), alice);
1238 env(
pay(gw, alice, USD(600000)));
1239 env.
trust(USD(1000000), bob);
1240 env(
pay(gw, bob, USD(500000)));
1245 if (!features[fixAMMv1_3])
1246 BEAST_EXPECT(amm.expectBalances(
1247 USD(10000),
XRP(2000),
IOUAmount{4472135954999580, -9}));
1249 BEAST_EXPECT(amm.expectBalances(
1250 USD(10000),
XRP(2000),
IOUAmount{4472135954999579, -9}));
1251 amm.deposit(alice, USD(1000),
XRP(200));
1252 if (!features[fixAMMv1_3])
1253 BEAST_EXPECT(amm.expectBalances(
1254 USD(11000),
XRP(2200),
IOUAmount{4919349550499538, -9}));
1256 BEAST_EXPECT(amm.expectBalances(
1257 USD(11000),
XRP(2200),
IOUAmount{4919349550499536, -9}));
1258 amm.deposit(bob, USD(2000),
XRP(400));
1259 if (!features[fixAMMv1_3])
1260 BEAST_EXPECT(amm.expectBalances(
1261 USD(13000),
XRP(2600),
IOUAmount{5813776741499453, -9}));
1263 BEAST_EXPECT(amm.expectBalances(
1264 USD(13000),
XRP(2600),
IOUAmount{5813776741499451, -9}));
1267 auto aliceXrpBalance = env.
balance(alice,
XRP);
1274 if (!features[fixAMMv1_3])
1275 BEAST_EXPECT(amm.expectBalances(
1276 USD(12000),
XRP(2400),
IOUAmount{5366563145999495, -9}));
1278 BEAST_EXPECT(amm.expectBalances(
1282 if (!features[fixAMMv1_3])
1284 env, alice, aliceXrpBalance +
XRP(200)));
1287 env, alice, aliceXrpBalance +
XRP(200) -
XRPAmount{1}));
1288 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount(0)));
1294 if (!features[fixAMMv1_3])
1295 BEAST_EXPECT(amm.expectBalances(
1296 USD(10000),
XRP(2000),
IOUAmount{4472135954999580, -9}));
1298 BEAST_EXPECT(amm.expectBalances(
1304 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount(0)));
1305 BEAST_EXPECT(amm.expectLPTokens(bob,
IOUAmount(0)));
1313 "test AMMClawback from AMM pool with assets having the same "
1315 using namespace jtx;
1319 Env env(*
this, features);
1324 env.
fund(
XRP(1000000), gw, alice, bob, carol);
1332 auto const USD = gw[
"USD"];
1333 env.
trust(USD(100000), alice);
1334 env(
pay(gw, alice, USD(10000)));
1335 env.
trust(USD(100000), bob);
1336 env(
pay(gw, bob, USD(9000)));
1337 env.
trust(USD(100000), carol);
1338 env(
pay(gw, carol, USD(8000)));
1341 auto const EUR = gw[
"EUR"];
1342 env.
trust(EUR(100000), alice);
1343 env(
pay(gw, alice, EUR(10000)));
1344 env.
trust(EUR(100000), bob);
1345 env(
pay(gw, bob, EUR(9000)));
1346 env.
trust(EUR(100000), carol);
1347 env(
pay(gw, carol, EUR(8000)));
1353 BEAST_EXPECT(amm.expectBalances(USD(8000), EUR(2000),
IOUAmount(4000)));
1354 amm.deposit(bob, USD(4000), EUR(1000));
1356 amm.expectBalances(USD(12000), EUR(3000),
IOUAmount(6000)));
1357 if (!features[fixAMMv1_3])
1358 amm.deposit(carol, USD(2000), EUR(500));
1360 amm.deposit(carol, USD(2000.25), EUR(500));
1362 amm.expectBalances(USD(14000), EUR(3500),
IOUAmount(7000)));
1367 amm.expectBalances(USD(13000), EUR(3250),
IOUAmount(6500)));
1369 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount(4000)));
1370 BEAST_EXPECT(amm.expectLPTokens(bob,
IOUAmount(2000)));
1371 BEAST_EXPECT(amm.expectLPTokens(carol,
IOUAmount(500)));
1372 BEAST_EXPECT(env.
balance(alice, USD) == USD(2000));
1373 BEAST_EXPECT(env.
balance(alice, EUR) == EUR(8000));
1374 BEAST_EXPECT(env.
balance(bob, USD) == USD(5000));
1375 BEAST_EXPECT(env.
balance(bob, EUR) == EUR(8000));
1376 if (!features[fixAMMv1_3])
1377 BEAST_EXPECT(env.
balance(carol, USD) == USD(6000));
1381 STAmount(USD, UINT64_C(5999'999999999999), -12));
1383 BEAST_EXPECT(env.
balance(carol, EUR) == EUR(7750));
1393 amm.expectBalances(USD(12000), EUR(3000),
IOUAmount(6000)));
1395 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount(4000)));
1396 BEAST_EXPECT(amm.expectLPTokens(bob,
IOUAmount(1500)));
1397 BEAST_EXPECT(amm.expectLPTokens(carol,
IOUAmount(500)));
1398 BEAST_EXPECT(env.
balance(alice, USD) == USD(2000));
1399 BEAST_EXPECT(env.
balance(alice, EUR) == EUR(8000));
1400 BEAST_EXPECT(env.
balance(bob, USD) == USD(5000));
1402 BEAST_EXPECT(env.
balance(bob, EUR) == EUR(8000));
1403 if (!features[fixAMMv1_3])
1404 BEAST_EXPECT(env.
balance(carol, USD) == USD(6000));
1408 STAmount(USD, UINT64_C(5999'999999999999), -12));
1409 BEAST_EXPECT(env.
balance(carol, EUR) == EUR(7750));
1416 BEAST_EXPECT(amm.expectBalances(USD(4000), EUR(1000),
IOUAmount(2000)));
1418 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount(0)));
1419 BEAST_EXPECT(amm.expectLPTokens(bob,
IOUAmount(1500)));
1420 BEAST_EXPECT(amm.expectLPTokens(carol,
IOUAmount(500)));
1421 BEAST_EXPECT(env.
balance(alice, USD) == USD(2000));
1422 BEAST_EXPECT(env.
balance(alice, EUR) == EUR(8000));
1423 BEAST_EXPECT(env.
balance(bob, USD) == USD(5000));
1424 BEAST_EXPECT(env.
balance(bob, EUR) == EUR(8000));
1425 if (!features[fixAMMv1_3])
1426 BEAST_EXPECT(env.
balance(carol, USD) == USD(6000));
1430 STAmount(USD, UINT64_C(5999'999999999999), -12));
1431 BEAST_EXPECT(env.
balance(carol, EUR) == EUR(7750));
1543 testcase(
"test AMMClawback when issuing token for each other");
1544 using namespace jtx;
1548 Env env(*
this, features);
1552 env.
fund(
XRP(1000000), gw, gw2, alice);
1565 auto const USD = gw[
"USD"];
1566 env.
trust(USD(100000), gw2);
1567 env(
pay(gw, gw2, USD(5000)));
1568 env.
trust(USD(100000), alice);
1569 env(
pay(gw, alice, USD(5000)));
1571 auto const EUR = gw2[
"EUR"];
1572 env.
trust(EUR(100000), gw);
1573 env(
pay(gw2, gw, EUR(6000)));
1574 env.
trust(EUR(100000), alice);
1575 env(
pay(gw2, alice, EUR(6000)));
1580 BEAST_EXPECT(amm.expectBalances(
1581 USD(1000), EUR(2000),
IOUAmount{1414213562373095, -12}));
1583 amm.deposit(gw2, USD(2000), EUR(4000));
1584 BEAST_EXPECT(amm.expectBalances(
1585 USD(3000), EUR(6000),
IOUAmount{4242640687119285, -12}));
1587 amm.deposit(alice, USD(3000), EUR(6000));
1588 BEAST_EXPECT(amm.expectBalances(
1589 USD(6000), EUR(12000),
IOUAmount{8485281374238570, -12}));
1591 BEAST_EXPECT(amm.expectLPTokens(gw,
IOUAmount{1414213562373095, -12}));
1592 BEAST_EXPECT(amm.expectLPTokens(gw2,
IOUAmount{2828427124746190, -12}));
1594 amm.expectLPTokens(alice,
IOUAmount{4242640687119285, -12}));
1599 if (!features[fixAMMv1_3] || !features[fixAMMClawbackRounding])
1600 BEAST_EXPECT(amm.expectBalances(
1601 USD(5000), EUR(10000),
IOUAmount{7071067811865475, -12}));
1603 BEAST_EXPECT(amm.expectBalances(
1604 USD(5000), EUR(10000),
IOUAmount{7071067811865474, -12}));
1606 BEAST_EXPECT(amm.expectLPTokens(gw,
IOUAmount{1414213562373095, -12}));
1607 if (!features[fixAMMv1_3] || !features[fixAMMClawbackRounding])
1609 amm.expectLPTokens(gw2,
IOUAmount{1414213562373095, -12}));
1612 amm.expectLPTokens(gw2,
IOUAmount{1414213562373094, -12}));
1614 amm.expectLPTokens(alice,
IOUAmount{4242640687119285, -12}));
1616 BEAST_EXPECT(env.
balance(alice, USD) == USD(2000));
1617 BEAST_EXPECT(env.
balance(alice, EUR) == EUR(0));
1618 BEAST_EXPECT(env.
balance(gw, EUR) == EUR(4000));
1619 BEAST_EXPECT(env.
balance(gw2, USD) == USD(3000));
1624 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
1625 BEAST_EXPECT(amm.expectBalances(
1627 STAmount(EUR, UINT64_C(9000000000000001), -12),
1629 else if (!features[fixAMMClawbackRounding])
1630 BEAST_EXPECT(amm.expectBalances(
1631 USD(4500), EUR(9000),
IOUAmount{6363961030678928, -12}));
1632 else if (features[fixAMMv1_3] && features[fixAMMClawbackRounding])
1633 BEAST_EXPECT(amm.expectBalances(
1635 STAmount(EUR, UINT64_C(9000000000000001), -12),
1638 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
1640 amm.expectLPTokens(gw,
IOUAmount{7071067811865480, -13}));
1641 else if (!features[fixAMMClawbackRounding])
1643 amm.expectLPTokens(gw,
IOUAmount{7071067811865475, -13}));
1644 else if (features[fixAMMv1_3] && features[fixAMMClawbackRounding])
1646 amm.expectLPTokens(gw,
IOUAmount{7071067811865480, -13}));
1648 if (!features[fixAMMv1_3] || !features[fixAMMClawbackRounding])
1650 amm.expectLPTokens(gw2,
IOUAmount{1414213562373095, -12}));
1653 amm.expectLPTokens(gw2,
IOUAmount{1414213562373094, -12}));
1656 amm.expectLPTokens(alice,
IOUAmount{4242640687119285, -12}));
1658 BEAST_EXPECT(env.
balance(alice, USD) == USD(2000));
1659 BEAST_EXPECT(env.
balance(alice, EUR) == EUR(0));
1660 BEAST_EXPECT(env.
balance(gw, EUR) == EUR(4000));
1661 BEAST_EXPECT(env.
balance(gw2, USD) == USD(3000));
1666 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
1667 BEAST_EXPECT(amm.expectBalances(
1669 STAmount(EUR, UINT64_C(5000000000000001), -12),
1671 else if (!features[fixAMMClawbackRounding])
1672 BEAST_EXPECT(amm.expectBalances(
1673 USD(2500), EUR(5000),
IOUAmount{3535533905932738, -12}));
1674 else if (features[fixAMMv1_3] && features[fixAMMClawbackRounding])
1675 BEAST_EXPECT(amm.expectBalances(
1677 STAmount(EUR, UINT64_C(5000000000000001), -12),
1680 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
1682 amm.expectLPTokens(gw,
IOUAmount{7071067811865480, -13}));
1683 else if (!features[fixAMMClawbackRounding])
1685 amm.expectLPTokens(gw,
IOUAmount{7071067811865475, -13}));
1686 else if (features[fixAMMv1_3] && features[fixAMMClawbackRounding])
1688 amm.expectLPTokens(gw,
IOUAmount{7071067811865480, -13}));
1690 if (!features[fixAMMv1_3] || !features[fixAMMClawbackRounding])
1692 amm.expectLPTokens(gw2,
IOUAmount{1414213562373095, -12}));
1695 amm.expectLPTokens(gw2,
IOUAmount{1414213562373094, -12}));
1697 amm.expectLPTokens(alice,
IOUAmount{1414213562373095, -12}));
1699 BEAST_EXPECT(env.
balance(alice, USD) == USD(4000));
1700 BEAST_EXPECT(env.
balance(alice, EUR) == EUR(0));
1701 BEAST_EXPECT(env.
balance(gw, EUR) == EUR(4000));
1702 BEAST_EXPECT(env.
balance(gw2, USD) == USD(3000));
1741 using namespace jtx;
1745 Env env(*
this, features);
1749 env.
fund(
XRP(1000000), gw, gw2, alice);
1758 auto const USD = gw[
"USD"];
1759 env.
trust(USD(100000), alice);
1760 env(
pay(gw, alice, USD(3000)));
1765 auto const EUR = gw2[
"EUR"];
1766 env.
trust(EUR(100000), alice);
1767 env(
pay(gw2, alice, EUR(3000)));
1775 BEAST_EXPECT(amm.expectBalances(
1776 USD(2000), EUR(1000),
IOUAmount{1414213562373095, -12}));
1789 BEAST_EXPECT(amm.expectBalances(
1790 USD(1000), EUR(500),
IOUAmount{7071067811865475, -13}));
1794 amm.expectLPTokens(alice,
IOUAmount{7071067811865475, -13}));
1808 BEAST_EXPECT(!amm.ammExists());
1813 Env env(*
this, features);
1817 env.
fund(
XRP(1000000), gw, gw2, alice);
1826 auto const USD = gw[
"USD"];
1827 env.
trust(USD(100000), alice);
1828 env(
pay(gw, alice, USD(3000)));
1833 auto const EUR = gw2[
"EUR"];
1834 env.
trust(EUR(100000), alice);
1835 env(
pay(gw2, alice, EUR(3000)));
1843 BEAST_EXPECT(amm.expectBalances(
1844 USD(2000), EUR(1000),
IOUAmount{1414213562373095, -12}));
1858 BEAST_EXPECT(amm.expectBalances(
1859 USD(1000), EUR(500),
IOUAmount{7071067811865475, -13}));
1861 amm.expectLPTokens(alice,
IOUAmount{7071067811865475, -13}));
1866 Env env(*
this, features);
1870 env.
fund(
XRP(1000000), gw, gw2, alice);
1879 auto const USD = gw[
"USD"];
1880 env.
trust(USD(100000), alice);
1881 env(
pay(gw, alice, USD(3000)));
1886 auto const EUR = gw2[
"EUR"];
1887 env.
trust(EUR(100000), alice);
1888 env(
pay(gw2, alice, EUR(3000)));
1896 BEAST_EXPECT(amm.expectBalances(
1897 USD(2000), EUR(1000),
IOUAmount{1414213562373095, -12}));
1910 BEAST_EXPECT(amm.expectBalances(
1911 USD(1000), EUR(500),
IOUAmount{7071067811865475, -13}));
1913 amm.expectLPTokens(alice,
IOUAmount{7071067811865475, -13}));
1919 Env env(*
this, features);
1924 env.
fund(
XRP(1000000), gw, alice, bob, carol);
1932 auto const USD = gw[
"USD"];
1933 env.
trust(USD(100000), alice);
1934 env(
pay(gw, alice, USD(10000)));
1935 env.
trust(USD(100000), bob);
1936 env(
pay(gw, bob, USD(9000)));
1937 env.
trust(USD(100000), carol);
1938 env(
pay(gw, carol, USD(8000)));
1941 auto const EUR = gw[
"EUR"];
1942 env.
trust(EUR(100000), alice);
1943 env(
pay(gw, alice, EUR(10000)));
1944 env.
trust(EUR(100000), bob);
1945 env(
pay(gw, bob, EUR(9000)));
1946 env.
trust(EUR(100000), carol);
1947 env(
pay(gw, carol, EUR(8000)));
1954 amm.expectBalances(USD(8000), EUR(2000),
IOUAmount(4000)));
1955 amm.deposit(bob, USD(4000), EUR(1000));
1957 amm.expectBalances(USD(12000), EUR(3000),
IOUAmount(6000)));
1958 if (!features[fixAMMv1_3])
1959 amm.deposit(carol, USD(2000), EUR(500));
1961 amm.deposit(carol, USD(2000.25), EUR(500));
1963 amm.expectBalances(USD(14000), EUR(3500),
IOUAmount(7000)));
1974 amm.expectBalances(USD(13000), EUR(3250),
IOUAmount(6500)));
1976 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount(4000)));
1977 BEAST_EXPECT(amm.expectLPTokens(bob,
IOUAmount(2000)));
1978 BEAST_EXPECT(amm.expectLPTokens(carol,
IOUAmount(500)));
1979 BEAST_EXPECT(env.
balance(alice, USD) == USD(2000));
1980 BEAST_EXPECT(env.
balance(alice, EUR) == EUR(8000));
1981 BEAST_EXPECT(env.
balance(bob, USD) == USD(5000));
1982 BEAST_EXPECT(env.
balance(bob, EUR) == EUR(8000));
1983 if (!features[fixAMMv1_3])
1984 BEAST_EXPECT(env.
balance(carol, USD) == USD(6000));
1988 STAmount(USD, UINT64_C(5999'999999999999), -12));
1990 BEAST_EXPECT(env.
balance(carol, EUR) == EUR(7750));
2000 amm.expectBalances(USD(12000), EUR(3000),
IOUAmount(6000)));
2002 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount(4000)));
2003 BEAST_EXPECT(amm.expectLPTokens(bob,
IOUAmount(1500)));
2004 BEAST_EXPECT(amm.expectLPTokens(carol,
IOUAmount(500)));
2005 BEAST_EXPECT(env.
balance(alice, USD) == USD(2000));
2006 BEAST_EXPECT(env.
balance(alice, EUR) == EUR(8000));
2007 BEAST_EXPECT(env.
balance(bob, USD) == USD(5000));
2009 BEAST_EXPECT(env.
balance(bob, EUR) == EUR(8000));
2010 if (!features[fixAMMv1_3])
2011 BEAST_EXPECT(env.
balance(carol, USD) == USD(6000));
2015 STAmount(USD, UINT64_C(5999'999999999999), -12));
2016 BEAST_EXPECT(env.
balance(carol, EUR) == EUR(7750));
2024 amm.expectBalances(USD(4000), EUR(1000),
IOUAmount(2000)));
2026 BEAST_EXPECT(amm.expectLPTokens(alice,
IOUAmount(0)));
2027 BEAST_EXPECT(amm.expectLPTokens(bob,
IOUAmount(1500)));
2028 BEAST_EXPECT(amm.expectLPTokens(carol,
IOUAmount(500)));
2029 BEAST_EXPECT(env.
balance(alice, USD) == USD(2000));
2030 BEAST_EXPECT(env.
balance(alice, EUR) == EUR(8000));
2031 BEAST_EXPECT(env.
balance(bob, USD) == USD(5000));
2032 BEAST_EXPECT(env.
balance(bob, EUR) == EUR(8000));
2033 if (!features[fixAMMv1_3])
2034 BEAST_EXPECT(env.
balance(carol, USD) == USD(6000));
2038 STAmount(USD, UINT64_C(5999'999999999999), -12));
2039 BEAST_EXPECT(env.
balance(carol, EUR) == EUR(7750));
2110 "test last holder's lptoken balance not equal to AMM's lptoken "
2111 "balance before clawback");
2112 using namespace jtx;
2115 auto setupAccounts =
2117 env.
fund(
XRP(100000), gw, alice, bob);
2122 auto const USD = gw[
"USD"];
2123 env.
trust(USD(100000), alice);
2124 env(
pay(gw, alice, USD(50000)));
2125 env.
trust(USD(100000), bob);
2126 env(
pay(gw, bob, USD(40000)));
2132 auto getLPTokenBalances =
2136 auto const lpToken =
2138 env, account, amm.lptIssue())[jss::lines][0u][jss::balance]
2140 auto const lpTokenBalance =
2141 amm.ammRpcInfo()[jss::amm][jss::lp_token][jss::value]
2143 return {lpToken, lpTokenBalance};
2149 Account gw{
"gateway"}, alice{
"alice"}, bob{
"bob"};
2150 auto const USD = setupAccounts(env, gw, alice, bob);
2152 AMM amm(env, alice,
XRP(2), USD(1));
2153 amm.deposit(alice,
IOUAmount{1'876123487565916, -15});
2155 amm.withdraw(alice,
IOUAmount{1'876123487565916, -15});
2156 amm.withdrawAll(bob);
2158 auto [lpToken, lpTokenBalance] =
2159 getLPTokenBalances(env, amm, alice);
2161 lpToken ==
"1414.21356237366" &&
2162 lpTokenBalance ==
"1414.213562374");
2166 BEAST_EXPECT(res && res.value());
2168 if (!features[fixAMMClawbackRounding] || !features[fixAMMv1_3])
2172 BEAST_EXPECT(amm.ammExists());
2176 auto const lpBalance =
IOUAmount{989, -12};
2178 BEAST_EXPECT(amm.expectBalances(
2179 STAmount(USD, UINT64_C(7000000000000000), -28),
2182 BEAST_EXPECT(amm.expectLPTokens(alice, lpBalance));
2189 Account gw{
"gateway"}, alice{
"alice"}, bob{
"bob"};
2190 auto const USD = setupAccounts(env, gw, alice, bob);
2192 AMM amm(env, alice,
XRP(2), USD(1));
2193 amm.deposit(alice,
IOUAmount{1'876123487565916, -15});
2195 amm.withdrawAll(bob);
2197 auto [lpToken, lpTokenBalance] =
2198 getLPTokenBalances(env, amm, alice);
2200 lpToken ==
"1416.08968586066" &&
2201 lpTokenBalance ==
"1416.089685861");
2205 BEAST_EXPECT(res && res.value());
2209 if (!features[fixAMMv1_3] && !features[fixAMMClawbackRounding])
2211 BEAST_EXPECT(amm.expectBalances(
2212 STAmount(USD, UINT64_C(5013266196406), -13),
2216 else if (!features[fixAMMClawbackRounding])
2218 BEAST_EXPECT(amm.expectBalances(
2219 STAmount(USD, UINT64_C(5013266196407), -13),
2223 else if (features[fixAMMv1_3] && features[fixAMMClawbackRounding])
2225 auto const lpBalance =
IOUAmount{708'9829046743238, -13};
2226 BEAST_EXPECT(amm.expectBalances(
2227 STAmount(USD, UINT64_C(5013266196406999), -16),
2230 BEAST_EXPECT(amm.expectLPTokens(alice, lpBalance));
2237 Account gw{
"gateway"}, alice{
"alice"}, bob{
"bob"};
2238 auto const USD = setupAccounts(env, gw, alice, bob);
2240 AMM amm(env, alice,
XRP(2), USD(1));
2241 amm.deposit(alice,
IOUAmount{1'876123487565916, -15});
2243 amm.withdraw(alice,
IOUAmount{1'876123487565916, -15});
2244 amm.withdrawAll(bob);
2246 auto [lpToken, lpTokenBalance] =
2247 getLPTokenBalances(env, amm, alice);
2249 lpToken ==
"1414.21356237366" &&
2250 lpTokenBalance ==
"1414.213562374");
2254 BEAST_EXPECT(res && res.value());
2256 if (!features[fixAMMClawbackRounding] && !features[fixAMMv1_3])
2261 else if (!features[fixAMMClawbackRounding])
2264 BEAST_EXPECT(amm.expectBalances(
2265 STAmount(USD, UINT64_C(2410000000000000), -28),
2269 else if (features[fixAMMv1_3] && features[fixAMMClawbackRounding])
2272 BEAST_EXPECT(!amm.ammExists());
2279 Account gw{
"gateway"}, alice{
"alice"}, bob{
"bob"};
2280 auto const USD = setupAccounts(env, gw, alice, bob);
2285 auto const EUR = gw2[
"EUR"];
2286 env.
trust(EUR(100000), alice);
2287 env(
pay(gw2, alice, EUR(50000)));
2288 env.
trust(EUR(100000), bob);
2289 env(
pay(gw2, bob, EUR(50000)));
2292 AMM amm(env, alice, USD(2), EUR(1));
2293 amm.deposit(alice,
IOUAmount{1'576123487565916, -15});
2295 amm.withdraw(alice,
IOUAmount{1'576123487565916, -15});
2296 amm.withdrawAll(bob);
2298 auto [lpToken, lpTokenBalance] =
2299 getLPTokenBalances(env, amm, alice);
2301 lpToken ==
"1.414213562374011" &&
2302 lpTokenBalance ==
"1.414213562374");
2306 BEAST_EXPECT(res && res.value());
2308 if (features[fixAMMv1_3] && features[fixAMMClawbackRounding])
2311 BEAST_EXPECT(!amm.ammExists());
2317 BEAST_EXPECT(amm.ammExists());
2324 Account gw{
"gateway"}, alice{
"alice"}, bob{
"bob"};
2325 auto const USD = setupAccounts(env, gw, alice, bob);
2327 auto const EUR = gw[
"EUR"];
2328 env.
trust(EUR(100000), alice);
2329 env(
pay(gw, alice, EUR(50000)));
2330 env.
trust(EUR(100000), bob);
2331 env(
pay(gw, bob, EUR(50000)));
2334 AMM amm(env, alice, USD(1), EUR(2));
2335 amm.deposit(alice,
IOUAmount{1'076123487565916, -15});
2337 amm.withdraw(alice,
IOUAmount{1'076123487565916, -15});
2338 amm.withdrawAll(bob);
2340 auto [lpToken, lpTokenBalance] =
2341 getLPTokenBalances(env, amm, alice);
2343 lpToken ==
"1.414213562374011" &&
2344 lpTokenBalance ==
"1.414213562374");
2348 BEAST_EXPECT(res && res.value());
2350 if (features[fixAMMClawbackRounding])
2354 BEAST_EXPECT(!amm.ammExists());
2361 BEAST_EXPECT(amm.ammExists());
2368 Account gw{
"gateway"}, alice{
"alice"}, bob{
"bob"};
2369 auto const USD = setupAccounts(env, gw, alice, bob);
2371 auto const EUR = gw[
"EUR"];
2372 env.
trust(EUR(1000000000), alice);
2373 env(
pay(gw, alice, EUR(500000000)));
2374 env.
trust(EUR(1000000000), bob);
2375 env(
pay(gw, bob, EUR(500000000)));
2378 AMM amm(env, alice, USD(1), EUR(2000000));
2379 amm.deposit(alice,
IOUAmount{1'076123487565916, -12});
2381 amm.withdraw(alice,
IOUAmount{1'076123487565916, -12});
2382 amm.withdrawAll(bob);
2384 auto [lpToken, lpTokenBalance] =
2385 getLPTokenBalances(env, amm, alice);
2388 lpToken ==
"1414.213562373101" &&
2389 lpTokenBalance ==
"1414.2135623731");
2393 BEAST_EXPECT(res && res.value());
2395 if (!features[fixAMMClawbackRounding] && !features[fixAMMv1_3])
2398 BEAST_EXPECT(amm.expectBalances(
2403 else if (!features[fixAMMClawbackRounding])
2409 BEAST_EXPECT(amm.ammExists());
2411 else if (features[fixAMMv1_3] && features[fixAMMClawbackRounding])
2415 auto const lpBalance =
IOUAmount{5, -12};
2416 BEAST_EXPECT(amm.expectBalances(
2420 BEAST_EXPECT(amm.expectLPTokens(alice, lpBalance));