19#include <test/jtx/AMM.h>
20#include <test/jtx/AMMTest.h>
21#include <test/jtx/trust.h>
22#include <xrpl/protocol/Feature.h>
38 Env env(*
this, features);
63 Env env(*
this, features);
75 auto const USD =
gw[
"USD"];
84 BEAST_EXPECT(!amm.ammExists());
96 Env env(*
this, features);
108 auto const USD =
gw[
"USD"];
126 Env env(*
this, features);
138 auto const USD =
gw[
"USD"];
158 Env env(*
this, features);
170 auto const USD =
gw[
"USD"];
191 Env env(*
this, features);
203 auto const USD =
gw[
"USD"];
232 Env env(*
this, features);
239 auto const USD =
gw[
"USD"];
257 Env env(*
this, features);
269 auto const USD =
gw[
"USD"];
285 Env env(*
this, features);
297 auto const USD =
gw[
"USD"];
316 Env env(*
this, features);
328 auto const USD =
gw[
"USD"];
346 testcase(
"test featureAMMClawback is not enabled.");
348 if (!features[featureAMMClawback])
350 Env env(*
this, features);
362 auto const USD =
gw[
"USD"];
378 testcase(
"test AMMClawback specific amount");
384 Env env(*
this, features);
397 auto const USD =
gw[
"USD"];
405 auto const EUR = gw2[
"EUR"];
416 BEAST_EXPECT(amm.expectBalances(
438 BEAST_EXPECT(amm.expectBalances(
462 BEAST_EXPECT(!amm.ammExists());
468 Env env(*
this, features);
480 auto const USD =
gw[
"USD"];
491 BEAST_EXPECT(amm.expectBalances(
513 BEAST_EXPECT(amm.expectBalances(
536 BEAST_EXPECT(!amm.ammExists());
544 "test AMMClawback specific amount which exceeds the current "
553 Env env(*
this, features);
566 auto const USD =
gw[
"USD"];
573 auto const EUR = gw2[
"EUR"];
583 BEAST_EXPECT(amm.expectBalances(
603 BEAST_EXPECT(amm.expectBalances(
619 BEAST_EXPECT(amm.expectBalances(
620 STAmount{USD, UINT64_C(2500000000000001), -12},
621 STAmount{EUR, UINT64_C(3125000000000001), -12},
635 BEAST_EXPECT(amm.expectBalances(
636 STAmount{USD, UINT64_C(2499000000000002), -12},
637 STAmount{EUR, UINT64_C(3123750000000002), -12},
658 BEAST_EXPECT(!amm.ammExists());
667 Env env(*
this, features);
686 auto const USD =
gw[
"USD"];
694 auto const EUR = gw2[
"EUR"];
703 BEAST_EXPECT(amm.expectBalances(
706 BEAST_EXPECT(amm.expectBalances(
709 BEAST_EXPECT(amm.expectBalances(
745 BEAST_EXPECT(amm.expectBalances(
750 amm.expectLPTokens(
bob,
IOUAmount{1414213562373095, -9}));
762 BEAST_EXPECT(amm.expectBalances(
763 STAmount{USD, UINT64_C(2490000000000001), -12},
769 amm.expectLPTokens(
bob,
IOUAmount{1400071426749365, -9}));
781 env,
alice, aliceXrpBalance +
XRP(1000) +
XRP(600)));
803 aliceXrpBalance +
XRP(1000) +
XRP(600) +
XRP(1000)));
806 amm.expectLPTokens(
bob,
IOUAmount{1400071426749365, -9}));
807 BEAST_EXPECT(amm.expectBalances(
808 STAmount{USD, UINT64_C(1990000000000001), -12},
825 aliceXrpBalance +
XRP(1000) +
XRP(600) +
XRP(1000)));
827 env,
bob, bobXrpBalance +
XRP(20) +
XRP(1980)));
848 aliceXrpBalance +
XRP(1000) +
XRP(600) +
XRP(1000) +
851 env,
bob, bobXrpBalance +
XRP(20) +
XRP(1980)));
874 aliceXrpBalance +
XRP(1000) +
XRP(600) +
XRP(1000) +
877 env,
bob, bobXrpBalance +
XRP(20) +
XRP(1980) +
XRP(3000)));
891 testcase(
"test AMMClawback all the tokens in the AMM pool");
897 Env env(*
this, features);
918 auto const USD =
gw[
"USD"];
929 auto const EUR = gw2[
"EUR"];
942 BEAST_EXPECT(amm.expectBalances(
945 BEAST_EXPECT(amm.expectBalances(
948 BEAST_EXPECT(amm.expectBalances(
954 amm.expectLPTokens(
bob,
IOUAmount{2236067977499790, -12}));
970 BEAST_EXPECT(amm.expectBalances(
971 STAmount{USD, UINT64_C(4999999999999999), -12},
972 STAmount{EUR, UINT64_C(6249999999999999), -12},
998 BEAST_EXPECT(amm.expectBalances(
999 STAmount{USD, UINT64_C(3999999999999999), -12},
1000 STAmount{EUR, UINT64_C(4999999999999999), -12},
1015 BEAST_EXPECT(!amm.ammExists());
1021 Env env(*
this, features);
1034 auto const USD =
gw[
"USD"];
1043 BEAST_EXPECT(amm.expectBalances(
1046 BEAST_EXPECT(amm.expectBalances(
1049 BEAST_EXPECT(amm.expectBalances(
1060 BEAST_EXPECT(amm.expectBalances(
1070 BEAST_EXPECT(amm.expectBalances(
1083 "test AMMClawback from AMM pool with assets having the same "
1085 using namespace jtx;
1089 Env env(*
this, features);
1102 auto const USD =
gw[
"USD"];
1111 auto const EUR =
gw[
"EUR"];
1123 BEAST_EXPECT(amm.expectBalances(
USD(8000),
EUR(2000),
IOUAmount(4000)));
1138 BEAST_EXPECT(amm.expectLPTokens(
bob,
IOUAmount(2000)));
1159 BEAST_EXPECT(amm.expectLPTokens(
bob,
IOUAmount(1500)));
1174 BEAST_EXPECT(amm.expectBalances(
USD(4000),
EUR(1000),
IOUAmount(2000)));
1177 BEAST_EXPECT(amm.expectLPTokens(
bob,
IOUAmount(1500)));
1191 "test AMMClawback from AMM pool with assets having the same "
1192 "currency, but from different issuer");
1193 using namespace jtx;
1197 Env env(*
this, features);
1221 env(
pay(gw2,
alice, gw2[
"USD"](6000)));
1222 env.
trust(gw2[
"USD"](100000),
bob);
1223 env(
pay(gw2,
bob, gw2[
"USD"](5000)));
1229 BEAST_EXPECT(amm.expectBalances(
1233 amm.deposit(
bob,
gw[
"USD"](2000), gw2[
"USD"](3000));
1234 BEAST_EXPECT(amm.expectBalances(
1257 BEAST_EXPECT(amm.expectBalances(
1258 STAmount{gw[
"USD"], UINT64_C(2666666666666667), -12},
1264 BEAST_EXPECT(amm.expectLPTokens(
bob,
IOUAmount{2449489742783178, -12}));
1267 STAmount(
gw[
"USD"], UINT64_C(7333333333333333), -12));
1268 BEAST_EXPECT(env.
balance(
alice, gw2[
"USD"]) == gw2[
"USD"](4500));
1270 BEAST_EXPECT(env.
balance(
bob, gw2[
"USD"]) == gw2[
"USD"](2000));
1276 BEAST_EXPECT(amm.expectBalances(
1277 STAmount{gw[
"USD"], UINT64_C(6666666666666670), -13},
1286 STAmount(
gw[
"USD"], UINT64_C(7333333333333333), -12));
1287 BEAST_EXPECT(env.
balance(
alice, gw2[
"USD"]) == gw2[
"USD"](4500));
1290 BEAST_EXPECT(env.
balance(
bob, gw2[
"USD"]) == gw2[
"USD"](5000));
1296 testcase(
"test AMMClawback when issuing token for each other");
1297 using namespace jtx;
1301 Env env(*
this, features);
1318 auto const USD =
gw[
"USD"];
1324 auto const EUR = gw2[
"EUR"];
1333 BEAST_EXPECT(amm.expectBalances(
1336 amm.deposit(gw2,
USD(2000),
EUR(4000));
1337 BEAST_EXPECT(amm.expectBalances(
1341 BEAST_EXPECT(amm.expectBalances(
1344 BEAST_EXPECT(amm.expectLPTokens(
gw,
IOUAmount{1414213562373095, -12}));
1345 BEAST_EXPECT(amm.expectLPTokens(gw2,
IOUAmount{2828427124746190, -12}));
1352 BEAST_EXPECT(amm.expectBalances(
1355 BEAST_EXPECT(amm.expectLPTokens(
gw,
IOUAmount{1414213562373095, -12}));
1356 BEAST_EXPECT(amm.expectLPTokens(gw2,
IOUAmount{1414213562373095, -12}));
1368 BEAST_EXPECT(amm.expectBalances(
1373 BEAST_EXPECT(amm.expectLPTokens(
gw,
IOUAmount{7071067811865480, -13}));
1374 BEAST_EXPECT(amm.expectLPTokens(gw2,
IOUAmount{1414213562373095, -12}));
1386 BEAST_EXPECT(amm.expectBalances(
1391 BEAST_EXPECT(amm.expectLPTokens(
gw,
IOUAmount{7071067811865480, -13}));
1392 BEAST_EXPECT(amm.expectLPTokens(gw2,
IOUAmount{1414213562373095, -12}));
1406 "test AMMClawback from account which does not own any lptoken in "
1408 using namespace jtx;
1410 Env env(*
this, features);
1421 auto const USD =
gw[
"USD"];
1438 using namespace jtx;
1442 Env env(*
this, features);
1455 auto const USD =
gw[
"USD"];
1462 auto const EUR = gw2[
"EUR"];
1472 BEAST_EXPECT(amm.expectBalances(
1486 BEAST_EXPECT(amm.expectBalances(
1505 BEAST_EXPECT(!amm.ammExists());
1510 Env env(*
this, features);
1523 auto const USD =
gw[
"USD"];
1530 auto const EUR = gw2[
"EUR"];
1540 BEAST_EXPECT(amm.expectBalances(
1555 BEAST_EXPECT(amm.expectBalances(
1563 Env env(*
this, features);
1576 auto const USD =
gw[
"USD"];
1583 auto const EUR = gw2[
"EUR"];
1593 BEAST_EXPECT(amm.expectBalances(
1607 BEAST_EXPECT(amm.expectBalances(
1616 Env env(*
this, features);
1629 auto const USD =
gw[
"USD"];
1638 auto const EUR =
gw[
"EUR"];
1671 BEAST_EXPECT(amm.expectLPTokens(
bob,
IOUAmount(2000)));
1692 BEAST_EXPECT(amm.expectLPTokens(
bob,
IOUAmount(1500)));
1711 BEAST_EXPECT(amm.expectLPTokens(
bob,
IOUAmount(1500)));
1725 testcase(
"test single depoit and clawback");
1726 using namespace jtx;
1730 Env env(*
this, features);
1742 auto const USD =
gw[
"USD"];
1752 BEAST_EXPECT(amm.expectBalances(
USD(400),
XRP(100),
IOUAmount(200000)));
1757 BEAST_EXPECT(amm.expectBalances(
1765 BEAST_EXPECT(amm.expectBalances(
1771 env,
alice, aliceXrpBalance +
XRP(29.289322)));
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