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));