19#include <test/jtx/AMM.h>
20#include <test/jtx/AMMTest.h>
21#include <test/jtx/trust.h>
23#include <xrpl/protocol/Feature.h>
39 Env env(*
this, features);
64 Env env(*
this, features);
76 auto const USD =
gw[
"USD"];
85 BEAST_EXPECT(!amm.ammExists());
97 Env env(*
this, features);
109 auto const USD =
gw[
"USD"];
127 Env env(*
this, features);
139 auto const USD =
gw[
"USD"];
159 Env env(*
this, features);
171 auto const USD =
gw[
"USD"];
192 Env env(*
this, features);
204 auto const USD =
gw[
"USD"];
233 Env env(*
this, features);
240 auto const USD =
gw[
"USD"];
258 Env env(*
this, features);
270 auto const USD =
gw[
"USD"];
286 Env env(*
this, features);
298 auto const USD =
gw[
"USD"];
317 Env env(*
this, features);
329 auto const USD =
gw[
"USD"];
347 testcase(
"test featureAMMClawback is not enabled.");
349 if (!features[featureAMMClawback])
351 Env env(*
this, features);
363 auto const USD =
gw[
"USD"];
379 testcase(
"test AMMClawback specific amount");
385 Env env(*
this, features);
398 auto const USD =
gw[
"USD"];
406 auto const EUR = gw2[
"EUR"];
417 BEAST_EXPECT(amm.expectBalances(
439 BEAST_EXPECT(amm.expectBalances(
463 BEAST_EXPECT(!amm.ammExists());
469 Env env(*
this, features);
481 auto const USD =
gw[
"USD"];
492 BEAST_EXPECT(amm.expectBalances(
514 BEAST_EXPECT(amm.expectBalances(
537 BEAST_EXPECT(!amm.ammExists());
545 "test AMMClawback specific amount which exceeds the current "
554 Env env(*
this, features);
567 auto const USD =
gw[
"USD"];
574 auto const EUR = gw2[
"EUR"];
584 if (!features[fixAMMv1_3])
585 BEAST_EXPECT(amm.expectBalances(
588 BEAST_EXPECT(amm.expectBalances(
608 if (!features[fixAMMv1_3])
609 BEAST_EXPECT(amm.expectBalances(
612 BEAST_EXPECT(amm.expectBalances(
616 if (!features[fixAMMv1_3])
617 BEAST_EXPECT(amm.expectLPTokens(
620 BEAST_EXPECT(amm.expectLPTokens(
632 if (!features[fixAMMv1_3])
633 BEAST_EXPECT(amm.expectBalances(
634 STAmount{USD, UINT64_C(2500000000000001), -12},
635 STAmount{EUR, UINT64_C(3125000000000001), -12},
638 BEAST_EXPECT(amm.expectBalances(
641 if (!features[fixAMMv1_3])
655 if (!features[fixAMMv1_3])
656 BEAST_EXPECT(amm.expectBalances(
657 STAmount{USD, UINT64_C(2499000000000002), -12},
658 STAmount{EUR, UINT64_C(3123750000000002), -12},
661 BEAST_EXPECT(amm.expectBalances(
664 if (!features[fixAMMv1_3])
685 BEAST_EXPECT(!amm.ammExists());
694 Env env(*
this, features);
713 auto const USD =
gw[
"USD"];
721 auto const EUR = gw2[
"EUR"];
730 BEAST_EXPECT(amm.expectBalances(
733 BEAST_EXPECT(amm.expectBalances(
736 BEAST_EXPECT(amm.expectBalances(
742 if (!features[fixAMMv1_3])
749 if (!features[fixAMMv1_3])
756 if (!features[fixAMMv1_3])
784 if (!features[fixAMMv1_3])
785 BEAST_EXPECT(amm.expectBalances(
788 BEAST_EXPECT(amm.expectBalances(
790 if (!features[fixAMMv1_3])
791 BEAST_EXPECT(amm.expectLPTokens(
794 BEAST_EXPECT(amm.expectLPTokens(
797 amm.expectLPTokens(
bob,
IOUAmount{1414213562373095, -9}));
809 if (!features[fixAMMv1_3])
810 BEAST_EXPECT(amm.expectBalances(
811 STAmount{USD, UINT64_C(2490000000000001), -12},
815 BEAST_EXPECT(amm.expectBalances(
817 if (!features[fixAMMv1_3])
818 BEAST_EXPECT(amm.expectLPTokens(
821 BEAST_EXPECT(amm.expectLPTokens(
823 if (!features[fixAMMv1_3])
825 amm.expectLPTokens(
bob,
IOUAmount{1400071426749365, -9}));
828 amm.expectLPTokens(
bob,
IOUAmount{1400071426749364, -9}));
840 env,
alice, aliceXrpBalance +
XRP(1000) +
XRP(600)));
841 if (!features[fixAMMv1_3])
847 if (!features[fixAMMv1_3])
853 if (!features[fixAMMv1_3])
871 if (!features[fixAMMv1_3])
875 aliceXrpBalance +
XRP(1000) +
XRP(600) +
XRP(1000)));
880 aliceXrpBalance +
XRP(1000) +
XRP(600) +
XRP(1000) -
883 if (!features[fixAMMv1_3])
885 amm.expectLPTokens(
bob,
IOUAmount{1400071426749365, -9}));
888 amm.expectLPTokens(
bob,
IOUAmount{1400071426749364, -9}));
889 if (!features[fixAMMv1_3])
890 BEAST_EXPECT(amm.expectBalances(
891 STAmount{USD, UINT64_C(1990000000000001), -12},
895 BEAST_EXPECT(amm.expectBalances(
910 if (!features[fixAMMv1_3])
914 aliceXrpBalance +
XRP(1000) +
XRP(600) +
XRP(1000)));
919 aliceXrpBalance +
XRP(1000) +
XRP(600) +
XRP(1000) -
922 env,
bob, bobXrpBalance +
XRP(20) +
XRP(1980)));
940 if (!features[fixAMMv1_3])
944 aliceXrpBalance +
XRP(1000) +
XRP(600) +
XRP(1000) +
950 aliceXrpBalance +
XRP(1000) +
XRP(600) +
XRP(1000) +
953 env,
bob, bobXrpBalance +
XRP(20) +
XRP(1980)));
958 if (!features[fixAMMv1_3])
977 if (!features[fixAMMv1_3])
981 aliceXrpBalance +
XRP(1000) +
XRP(600) +
XRP(1000) +
987 aliceXrpBalance +
XRP(1000) +
XRP(600) +
XRP(1000) +
990 env,
bob, bobXrpBalance +
XRP(20) +
XRP(1980) +
XRP(3000)));
996 if (!features[fixAMMv1_3])
1008 testcase(
"test AMMClawback all the tokens in the AMM pool");
1009 using namespace jtx;
1014 Env env(*
this, features);
1035 auto const USD =
gw[
"USD"];
1046 auto const EUR = gw2[
"EUR"];
1059 if (!features[fixAMMv1_3])
1060 BEAST_EXPECT(amm.expectBalances(
1063 BEAST_EXPECT(amm.expectBalances(
1066 if (!features[fixAMMv1_3])
1067 BEAST_EXPECT(amm.expectBalances(
1070 BEAST_EXPECT(amm.expectBalances(
1073 if (!features[fixAMMv1_3])
1074 BEAST_EXPECT(amm.expectBalances(
1077 BEAST_EXPECT(amm.expectBalances(
1080 if (!features[fixAMMv1_3])
1081 BEAST_EXPECT(amm.expectLPTokens(
1084 BEAST_EXPECT(amm.expectLPTokens(
1086 if (!features[fixAMMv1_3])
1088 amm.expectLPTokens(
bob,
IOUAmount{2236067977499790, -12}));
1091 amm.expectLPTokens(
bob,
IOUAmount{2236067977499789, -12}));
1092 if (!features[fixAMMv1_3])
1093 BEAST_EXPECT(amm.expectLPTokens(
1096 BEAST_EXPECT(amm.expectLPTokens(
1111 if (!features[fixAMMv1_3])
1112 BEAST_EXPECT(amm.expectBalances(
1113 STAmount{USD, UINT64_C(4999999999999999), -12},
1114 STAmount{EUR, UINT64_C(6249999999999999), -12},
1117 BEAST_EXPECT(amm.expectBalances(
1118 STAmount{USD, UINT64_C(5000000000000001), -12},
1119 STAmount{EUR, UINT64_C(6250000000000001), -12},
1122 if (!features[fixAMMv1_3])
1123 BEAST_EXPECT(amm.expectLPTokens(
1126 BEAST_EXPECT(amm.expectLPTokens(
1129 if (!features[fixAMMv1_3])
1130 BEAST_EXPECT(amm.expectLPTokens(
1133 BEAST_EXPECT(amm.expectLPTokens(
1143 if (!features[fixAMMv1_3])
1158 if (!features[fixAMMv1_3])
1159 BEAST_EXPECT(amm.expectBalances(
1160 STAmount{USD, UINT64_C(3999999999999999), -12},
1161 STAmount{EUR, UINT64_C(4999999999999999), -12},
1164 BEAST_EXPECT(amm.expectBalances(
1165 STAmount{USD, UINT64_C(4000000000000001), -12},
1166 STAmount{EUR, UINT64_C(5000000000000002), -12},
1169 if (!features[fixAMMv1_3])
1170 BEAST_EXPECT(amm.expectLPTokens(
1173 BEAST_EXPECT(amm.expectLPTokens(
1185 BEAST_EXPECT(!amm.ammExists());
1191 Env env(*
this, features);
1204 auto const USD =
gw[
"USD"];
1213 if (!features[fixAMMv1_3])
1214 BEAST_EXPECT(amm.expectBalances(
1217 BEAST_EXPECT(amm.expectBalances(
1220 if (!features[fixAMMv1_3])
1221 BEAST_EXPECT(amm.expectBalances(
1224 BEAST_EXPECT(amm.expectBalances(
1227 if (!features[fixAMMv1_3])
1228 BEAST_EXPECT(amm.expectBalances(
1231 BEAST_EXPECT(amm.expectBalances(
1242 if (!features[fixAMMv1_3])
1243 BEAST_EXPECT(amm.expectBalances(
1246 BEAST_EXPECT(amm.expectBalances(
1250 if (!features[fixAMMv1_3])
1252 env,
alice, aliceXrpBalance +
XRP(200)));
1262 if (!features[fixAMMv1_3])
1263 BEAST_EXPECT(amm.expectBalances(
1266 BEAST_EXPECT(amm.expectBalances(
1281 "test AMMClawback from AMM pool with assets having the same "
1283 using namespace jtx;
1287 Env env(*
this, features);
1300 auto const USD =
gw[
"USD"];
1309 auto const EUR =
gw[
"EUR"];
1321 BEAST_EXPECT(amm.expectBalances(
USD(8000),
EUR(2000),
IOUAmount(4000)));
1325 if (!features[fixAMMv1_3])
1338 BEAST_EXPECT(amm.expectLPTokens(
bob,
IOUAmount(2000)));
1344 if (!features[fixAMMv1_3])
1364 BEAST_EXPECT(amm.expectLPTokens(
bob,
IOUAmount(1500)));
1371 if (!features[fixAMMv1_3])
1384 BEAST_EXPECT(amm.expectBalances(
USD(4000),
EUR(1000),
IOUAmount(2000)));
1387 BEAST_EXPECT(amm.expectLPTokens(
bob,
IOUAmount(1500)));
1393 if (!features[fixAMMv1_3])
1406 "test AMMClawback from AMM pool with assets having the same "
1407 "currency, but from different issuer");
1408 using namespace jtx;
1412 Env env(*
this, features);
1436 env(
pay(gw2,
alice, gw2[
"USD"](6000)));
1437 env.
trust(gw2[
"USD"](100000),
bob);
1438 env(
pay(gw2,
bob, gw2[
"USD"](5000)));
1444 BEAST_EXPECT(amm.expectBalances(
1448 amm.deposit(
bob,
gw[
"USD"](2000), gw2[
"USD"](3000));
1449 BEAST_EXPECT(amm.expectBalances(
1472 BEAST_EXPECT(amm.expectBalances(
1473 STAmount{gw[
"USD"], UINT64_C(2666666666666667), -12},
1479 BEAST_EXPECT(amm.expectLPTokens(
bob,
IOUAmount{2449489742783178, -12}));
1482 STAmount(
gw[
"USD"], UINT64_C(7333333333333333), -12));
1483 BEAST_EXPECT(env.
balance(
alice, gw2[
"USD"]) == gw2[
"USD"](4500));
1485 BEAST_EXPECT(env.
balance(
bob, gw2[
"USD"]) == gw2[
"USD"](2000));
1491 BEAST_EXPECT(amm.expectBalances(
1492 STAmount{gw[
"USD"], UINT64_C(6666666666666670), -13},
1501 STAmount(
gw[
"USD"], UINT64_C(7333333333333333), -12));
1502 BEAST_EXPECT(env.
balance(
alice, gw2[
"USD"]) == gw2[
"USD"](4500));
1505 BEAST_EXPECT(env.
balance(
bob, gw2[
"USD"]) == gw2[
"USD"](5000));
1511 testcase(
"test AMMClawback when issuing token for each other");
1512 using namespace jtx;
1516 Env env(*
this, features);
1533 auto const USD =
gw[
"USD"];
1539 auto const EUR = gw2[
"EUR"];
1548 BEAST_EXPECT(amm.expectBalances(
1551 amm.deposit(gw2,
USD(2000),
EUR(4000));
1552 BEAST_EXPECT(amm.expectBalances(
1556 BEAST_EXPECT(amm.expectBalances(
1559 BEAST_EXPECT(amm.expectLPTokens(
gw,
IOUAmount{1414213562373095, -12}));
1560 BEAST_EXPECT(amm.expectLPTokens(gw2,
IOUAmount{2828427124746190, -12}));
1567 BEAST_EXPECT(amm.expectBalances(
1570 BEAST_EXPECT(amm.expectLPTokens(
gw,
IOUAmount{1414213562373095, -12}));
1571 BEAST_EXPECT(amm.expectLPTokens(gw2,
IOUAmount{1414213562373095, -12}));
1583 if (!features[fixAMMv1_3])
1584 BEAST_EXPECT(amm.expectBalances(
1589 BEAST_EXPECT(amm.expectBalances(
1592 if (!features[fixAMMv1_3])
1594 amm.expectLPTokens(
gw,
IOUAmount{7071067811865480, -13}));
1597 amm.expectLPTokens(
gw,
IOUAmount{7071067811865475, -13}));
1598 BEAST_EXPECT(amm.expectLPTokens(gw2,
IOUAmount{1414213562373095, -12}));
1610 if (!features[fixAMMv1_3])
1611 BEAST_EXPECT(amm.expectBalances(
1616 BEAST_EXPECT(amm.expectBalances(
1619 if (!features[fixAMMv1_3])
1621 amm.expectLPTokens(
gw,
IOUAmount{7071067811865480, -13}));
1624 amm.expectLPTokens(
gw,
IOUAmount{7071067811865475, -13}));
1625 BEAST_EXPECT(amm.expectLPTokens(gw2,
IOUAmount{1414213562373095, -12}));
1639 "test AMMClawback from account which does not own any lptoken in "
1641 using namespace jtx;
1643 Env env(*
this, features);
1654 auto const USD =
gw[
"USD"];
1671 using namespace jtx;
1675 Env env(*
this, features);
1688 auto const USD =
gw[
"USD"];
1695 auto const EUR = gw2[
"EUR"];
1705 BEAST_EXPECT(amm.expectBalances(
1719 BEAST_EXPECT(amm.expectBalances(
1738 BEAST_EXPECT(!amm.ammExists());
1743 Env env(*
this, features);
1756 auto const USD =
gw[
"USD"];
1763 auto const EUR = gw2[
"EUR"];
1773 BEAST_EXPECT(amm.expectBalances(
1788 BEAST_EXPECT(amm.expectBalances(
1796 Env env(*
this, features);
1809 auto const USD =
gw[
"USD"];
1816 auto const EUR = gw2[
"EUR"];
1826 BEAST_EXPECT(amm.expectBalances(
1840 BEAST_EXPECT(amm.expectBalances(
1849 Env env(*
this, features);
1862 auto const USD =
gw[
"USD"];
1871 auto const EUR =
gw[
"EUR"];
1888 if (!features[fixAMMv1_3])
1907 BEAST_EXPECT(amm.expectLPTokens(
bob,
IOUAmount(2000)));
1913 if (!features[fixAMMv1_3])
1933 BEAST_EXPECT(amm.expectLPTokens(
bob,
IOUAmount(1500)));
1940 if (!features[fixAMMv1_3])
1957 BEAST_EXPECT(amm.expectLPTokens(
bob,
IOUAmount(1500)));
1963 if (!features[fixAMMv1_3])
1976 testcase(
"test single depoit and clawback");
1977 using namespace jtx;
1981 Env env(*
this, features);
1993 auto const USD =
gw[
"USD"];
2003 BEAST_EXPECT(amm.expectBalances(
USD(400),
XRP(100),
IOUAmount(200000)));
2008 BEAST_EXPECT(amm.expectBalances(
2016 if (!features[fixAMMv1_3])
2017 BEAST_EXPECT(amm.expectBalances(
2022 BEAST_EXPECT(amm.expectBalances(
2027 if (!features[fixAMMv1_3])
2029 env,
alice, aliceXrpBalance +
XRP(29.289322)));
2032 env,
alice, aliceXrpBalance +
XRP(29.289321)));
testcase_t testcase
Memberspace for declaring test cases.
Floating point representation of amounts with high dynamic range.
A currency issued by an account.
void testInvalidRequest(FeatureBitset features)
void testAMMClawbackSameCurrency(FeatureBitset features)
void testNotHoldingLptoken(FeatureBitset features)
void testSingleDepositAndClawback(FeatureBitset features)
void testAMMClawbackAll(FeatureBitset features)
void testAMMClawbackSpecificAmount(FeatureBitset features)
void testFeatureDisabled(FeatureBitset features)
void testAMMClawbackExceedBalance(FeatureBitset features)
void run() override
Runs the suite.
void testAssetFrozen(FeatureBitset features)
void testAMMClawbackSameIssuerAssets(FeatureBitset features)
void testAMMClawbackIssuesEachOther(FeatureBitset features)
Convenience class to test AMM functionality.
bool expectBalances(STAmount const &asset1, STAmount const &asset2, IOUAmount const &lpt, std::optional< AccountID > const &account=std::nullopt) const
Verify the AMM balances.
IOUAmount deposit(std::optional< Account > const &account, LPToken tokens, std::optional< STAmount > const &asset1InDetails=std::nullopt, std::optional< std::uint32_t > const &flags=std::nullopt, std::optional< ter > const &ter=std::nullopt)
bool expectLPTokens(AccountID const &account, IOUAmount const &tokens) const
Immutable cryptographic account descriptor.
AccountID id() const
Returns the Account ID.
A transaction testing environment.
void require(Args const &... args)
Check a set of requirements.
bool close(NetClock::time_point closeTime, std::optional< std::chrono::milliseconds > consensusDelay=std::nullopt)
Close and advance the ledger.
void trust(STAmount const &amount, Account const &account)
Establish trust lines.
void fund(bool setDefaultRipple, STAmount const &amount, Account const &account)
PrettyAmount balance(Account const &account) const
Returns the XRP balance on an account.
Set the expected result code for a JTx The test will fail if the code doesn't match.
Json::Value ammClawback(Account const &issuer, Account const &holder, Issue const &asset, Issue const &asset2, std::optional< STAmount > const &amount)
Json::Value trust(Account const &account, STAmount const &amount, std::uint32_t flags)
Modify a trust line.
Json::Value fset(Account const &account, std::uint32_t on, std::uint32_t off=0)
Add and/or remove flag.
Json::Value pay(AccountID const &account, AccountID const &to, AnyAmount amount)
Create a payment.
bool expectLedgerEntryRoot(Env &env, Account const &acct, STAmount const &expectedValue)
XRP_t const XRP
Converts to XRP Issue or STAmount.
FeatureBitset supported_amendments()
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
constexpr std::uint32_t asfGlobalFreeze
constexpr std::uint32_t tfClawTwoAssets
constexpr std::uint32_t tfTwoAssetIfEmpty
constexpr std::uint32_t asfAllowTrustLineClawback
constexpr std::uint32_t tfSetFreeze