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 BEAST_EXPECT(amm.expectBalances(
604 BEAST_EXPECT(amm.expectBalances(
620 BEAST_EXPECT(amm.expectBalances(
621 STAmount{USD, UINT64_C(2500000000000001), -12},
622 STAmount{EUR, UINT64_C(3125000000000001), -12},
636 BEAST_EXPECT(amm.expectBalances(
637 STAmount{USD, UINT64_C(2499000000000002), -12},
638 STAmount{EUR, UINT64_C(3123750000000002), -12},
659 BEAST_EXPECT(!amm.ammExists());
668 Env env(*
this, features);
687 auto const USD =
gw[
"USD"];
695 auto const EUR = gw2[
"EUR"];
704 BEAST_EXPECT(amm.expectBalances(
707 BEAST_EXPECT(amm.expectBalances(
710 BEAST_EXPECT(amm.expectBalances(
746 BEAST_EXPECT(amm.expectBalances(
751 amm.expectLPTokens(
bob,
IOUAmount{1414213562373095, -9}));
763 BEAST_EXPECT(amm.expectBalances(
764 STAmount{USD, UINT64_C(2490000000000001), -12},
770 amm.expectLPTokens(
bob,
IOUAmount{1400071426749365, -9}));
782 env,
alice, aliceXrpBalance +
XRP(1000) +
XRP(600)));
804 aliceXrpBalance +
XRP(1000) +
XRP(600) +
XRP(1000)));
807 amm.expectLPTokens(
bob,
IOUAmount{1400071426749365, -9}));
808 BEAST_EXPECT(amm.expectBalances(
809 STAmount{USD, UINT64_C(1990000000000001), -12},
826 aliceXrpBalance +
XRP(1000) +
XRP(600) +
XRP(1000)));
828 env,
bob, bobXrpBalance +
XRP(20) +
XRP(1980)));
849 aliceXrpBalance +
XRP(1000) +
XRP(600) +
XRP(1000) +
852 env,
bob, bobXrpBalance +
XRP(20) +
XRP(1980)));
875 aliceXrpBalance +
XRP(1000) +
XRP(600) +
XRP(1000) +
878 env,
bob, bobXrpBalance +
XRP(20) +
XRP(1980) +
XRP(3000)));
892 testcase(
"test AMMClawback all the tokens in the AMM pool");
898 Env env(*
this, features);
919 auto const USD =
gw[
"USD"];
930 auto const EUR = gw2[
"EUR"];
943 BEAST_EXPECT(amm.expectBalances(
946 BEAST_EXPECT(amm.expectBalances(
949 BEAST_EXPECT(amm.expectBalances(
955 amm.expectLPTokens(
bob,
IOUAmount{2236067977499790, -12}));
971 BEAST_EXPECT(amm.expectBalances(
972 STAmount{USD, UINT64_C(4999999999999999), -12},
973 STAmount{EUR, UINT64_C(6249999999999999), -12},
999 BEAST_EXPECT(amm.expectBalances(
1000 STAmount{USD, UINT64_C(3999999999999999), -12},
1001 STAmount{EUR, UINT64_C(4999999999999999), -12},
1016 BEAST_EXPECT(!amm.ammExists());
1022 Env env(*
this, features);
1035 auto const USD =
gw[
"USD"];
1044 BEAST_EXPECT(amm.expectBalances(
1047 BEAST_EXPECT(amm.expectBalances(
1050 BEAST_EXPECT(amm.expectBalances(
1061 BEAST_EXPECT(amm.expectBalances(
1071 BEAST_EXPECT(amm.expectBalances(
1084 "test AMMClawback from AMM pool with assets having the same "
1086 using namespace jtx;
1090 Env env(*
this, features);
1103 auto const USD =
gw[
"USD"];
1112 auto const EUR =
gw[
"EUR"];
1124 BEAST_EXPECT(amm.expectBalances(
USD(8000),
EUR(2000),
IOUAmount(4000)));
1139 BEAST_EXPECT(amm.expectLPTokens(
bob,
IOUAmount(2000)));
1160 BEAST_EXPECT(amm.expectLPTokens(
bob,
IOUAmount(1500)));
1175 BEAST_EXPECT(amm.expectBalances(
USD(4000),
EUR(1000),
IOUAmount(2000)));
1178 BEAST_EXPECT(amm.expectLPTokens(
bob,
IOUAmount(1500)));
1192 "test AMMClawback from AMM pool with assets having the same "
1193 "currency, but from different issuer");
1194 using namespace jtx;
1198 Env env(*
this, features);
1222 env(
pay(gw2,
alice, gw2[
"USD"](6000)));
1223 env.
trust(gw2[
"USD"](100000),
bob);
1224 env(
pay(gw2,
bob, gw2[
"USD"](5000)));
1230 BEAST_EXPECT(amm.expectBalances(
1234 amm.deposit(
bob,
gw[
"USD"](2000), gw2[
"USD"](3000));
1235 BEAST_EXPECT(amm.expectBalances(
1258 BEAST_EXPECT(amm.expectBalances(
1259 STAmount{gw[
"USD"], UINT64_C(2666666666666667), -12},
1265 BEAST_EXPECT(amm.expectLPTokens(
bob,
IOUAmount{2449489742783178, -12}));
1268 STAmount(
gw[
"USD"], UINT64_C(7333333333333333), -12));
1269 BEAST_EXPECT(env.
balance(
alice, gw2[
"USD"]) == gw2[
"USD"](4500));
1271 BEAST_EXPECT(env.
balance(
bob, gw2[
"USD"]) == gw2[
"USD"](2000));
1277 BEAST_EXPECT(amm.expectBalances(
1278 STAmount{gw[
"USD"], UINT64_C(6666666666666670), -13},
1287 STAmount(
gw[
"USD"], UINT64_C(7333333333333333), -12));
1288 BEAST_EXPECT(env.
balance(
alice, gw2[
"USD"]) == gw2[
"USD"](4500));
1291 BEAST_EXPECT(env.
balance(
bob, gw2[
"USD"]) == gw2[
"USD"](5000));
1297 testcase(
"test AMMClawback when issuing token for each other");
1298 using namespace jtx;
1302 Env env(*
this, features);
1319 auto const USD =
gw[
"USD"];
1325 auto const EUR = gw2[
"EUR"];
1334 BEAST_EXPECT(amm.expectBalances(
1337 amm.deposit(gw2,
USD(2000),
EUR(4000));
1338 BEAST_EXPECT(amm.expectBalances(
1342 BEAST_EXPECT(amm.expectBalances(
1345 BEAST_EXPECT(amm.expectLPTokens(
gw,
IOUAmount{1414213562373095, -12}));
1346 BEAST_EXPECT(amm.expectLPTokens(gw2,
IOUAmount{2828427124746190, -12}));
1353 BEAST_EXPECT(amm.expectBalances(
1356 BEAST_EXPECT(amm.expectLPTokens(
gw,
IOUAmount{1414213562373095, -12}));
1357 BEAST_EXPECT(amm.expectLPTokens(gw2,
IOUAmount{1414213562373095, -12}));
1369 BEAST_EXPECT(amm.expectBalances(
1374 BEAST_EXPECT(amm.expectLPTokens(
gw,
IOUAmount{7071067811865480, -13}));
1375 BEAST_EXPECT(amm.expectLPTokens(gw2,
IOUAmount{1414213562373095, -12}));
1387 BEAST_EXPECT(amm.expectBalances(
1392 BEAST_EXPECT(amm.expectLPTokens(
gw,
IOUAmount{7071067811865480, -13}));
1393 BEAST_EXPECT(amm.expectLPTokens(gw2,
IOUAmount{1414213562373095, -12}));
1407 "test AMMClawback from account which does not own any lptoken in "
1409 using namespace jtx;
1411 Env env(*
this, features);
1422 auto const USD =
gw[
"USD"];
1439 using namespace jtx;
1443 Env env(*
this, features);
1456 auto const USD =
gw[
"USD"];
1463 auto const EUR = gw2[
"EUR"];
1473 BEAST_EXPECT(amm.expectBalances(
1487 BEAST_EXPECT(amm.expectBalances(
1506 BEAST_EXPECT(!amm.ammExists());
1511 Env env(*
this, features);
1524 auto const USD =
gw[
"USD"];
1531 auto const EUR = gw2[
"EUR"];
1541 BEAST_EXPECT(amm.expectBalances(
1556 BEAST_EXPECT(amm.expectBalances(
1564 Env env(*
this, features);
1577 auto const USD =
gw[
"USD"];
1584 auto const EUR = gw2[
"EUR"];
1594 BEAST_EXPECT(amm.expectBalances(
1608 BEAST_EXPECT(amm.expectBalances(
1617 Env env(*
this, features);
1630 auto const USD =
gw[
"USD"];
1639 auto const EUR =
gw[
"EUR"];
1672 BEAST_EXPECT(amm.expectLPTokens(
bob,
IOUAmount(2000)));
1693 BEAST_EXPECT(amm.expectLPTokens(
bob,
IOUAmount(1500)));
1712 BEAST_EXPECT(amm.expectLPTokens(
bob,
IOUAmount(1500)));
1726 testcase(
"test single depoit and clawback");
1727 using namespace jtx;
1731 Env env(*
this, features);
1743 auto const USD =
gw[
"USD"];
1753 BEAST_EXPECT(amm.expectBalances(
USD(400),
XRP(100),
IOUAmount(200000)));
1758 BEAST_EXPECT(amm.expectBalances(
1766 BEAST_EXPECT(amm.expectBalances(
1772 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