2#include <test/jtx/AMM.h>
3#include <test/jtx/AMMTest.h>
5#include <xrpl/protocol/jss.h>
23 enum TestAccount {
None, Alice, Bogie };
24 auto accountId = [&](
AMM const& ammAlice,
37 auto const USD =
gw[
"USD"];
40 BEAST_EXPECT(jv[jss::error_message] ==
"Account not found.");
46 BEAST_EXPECT(jv[jss::error_message] ==
"Account malformed.");
53 bool>>
const invalidParams = {
63 for (
auto const& [iss1, iss2, acct, ignoreParams] : invalidParams)
70 accountId(ammAlice, acct),
72 BEAST_EXPECT(jv[jss::error_message] ==
"Invalid parameters.");
78 for (
auto const& [iss1, iss2, acct, ignoreParams] : invalidParams)
85 accountId(ammAlice, acct),
87 BEAST_EXPECT(jv[jss::error_message] ==
"Invalid parameters.");
93 for (
auto const& [iss1, iss2, acct, ignoreParams] : invalidParams)
100 accountId(ammAlice, acct),
103 BEAST_EXPECT(jv[jss::error_message] ==
"Account malformed.");
115 BEAST_EXPECT(jv[jss::error_message] ==
"Account malformed.");
122 bool>>
const invalidParamsBadAccount = {
132 for (
auto const& [iss1, iss2, acct, ignoreParams] :
133 invalidParamsBadAccount)
140 accountId(ammAlice, acct),
142 BEAST_EXPECT(jv[jss::error_message] ==
"Invalid parameters.");
148 for (
auto const& [iss1, iss2, acct, ignoreParams] :
149 invalidParamsBadAccount)
156 accountId(ammAlice, acct),
160 jv[jss::error_message] ==
193 [&](
AMM& ammAlice,
Env& env) {
198 for (
int i = 0; i < 7; ++i)
202 if (!features[fixAMMv1_3])
203 fund(env,
gw, {a}, {
USD(10000)}, Fund::Acct);
205 fund(env,
gw, {a}, {
USD(10001)}, Fund::Acct);
207 ammAlice.
vote(a, 50 * (i + 1));
214 {.bidMin = 100, .authAccounts = {carol, bob, ed, bill}}));
215 if (!features[fixAMMv1_3])
231 for (
auto i = 0; i < 2; ++i)
235 auto const ammInfo = i ? ammAlice.
ammRpcInfo()
242 auto const& amm = ammInfo[jss::amm];
246 auto const voteSlots = amm[jss::vote_slots];
247 auto votesCopy = votes;
251 votes[voteSlots[i][jss::account]
253 voteSlots[i][jss::trading_fee]
255 voteSlots[i][jss::vote_weight].asUInt() ==
258 votes.erase(voteSlots[i][jss::account].asString());
260 if (!BEAST_EXPECT(votes.empty()))
265 auto const auctionSlot = amm[jss::auction_slot];
268 if (!BEAST_EXPECT(authAccounts.
contains(
269 auctionSlot[jss::auth_accounts][i]
274 auctionSlot[jss::auth_accounts][i][jss::account]
277 if (!BEAST_EXPECT(authAccounts.
empty()))
280 auctionSlot[jss::account].asString() ==
282 auctionSlot[jss::discounted_fee].asUInt() == 17 &&
283 auctionSlot[jss::price][jss::value].asString() ==
285 auctionSlot[jss::price][jss::currency].asString() ==
287 auctionSlot[jss::price][jss::issuer].asString() ==
306 testAMM([&](
AMM& ammAlice,
Env& env) {
309 auto test = [&](
bool freeze) {
312 info[jss::amm][jss::asset2_frozen].asBool() ==
freeze);
325 testcase(
"Invalid amm field");
327 testAMM([&](
AMM& amm,
Env&) {
328 auto const resp = amm.ammRpcInfo(
330 jss::validated.c_str(),
335 resp.isMember(
"error") && resp[
"error"] ==
"actNotFound");
347 testVoteAndBid(
all - fixAMMv1_3);
349 testInvalidAmmField();
testcase_t testcase
Memberspace for declaring test cases.
void fail(String const &reason, char const *file, int line)
Record a failure.
Floating point representation of amounts with high dynamic range.
void testInvalidAmmField()
void testVoteAndBid(FeatureBitset features)
void run() override
Runs the suite.
void testAMM(std::function< void(jtx::AMM &, jtx::Env &)> &&cb, std::optional< std::pair< STAmount, STAmount > > const &pool=std::nullopt, std::uint16_t tfee=0, std::optional< jtx::ter > const &ter=std::nullopt, std::vector< FeatureBitset > const &features={testable_amendments()})
testAMM() funds 30,000XRP and 30,000IOU for each non-XRP asset to Alice and Carol
Convenience class to test AMM functionality.
Json::Value ammRpcInfo(std::optional< AccountID > const &account=std::nullopt, std::optional< std::string > const &ledgerIndex=std::nullopt, std::optional< Issue > issue1=std::nullopt, std::optional< Issue > issue2=std::nullopt, std::optional< AccountID > const &ammAccount=std::nullopt, bool ignoreParams=false, unsigned apiVersion=RPC::apiInvalidVersion) const
Send amm_info RPC command.
void vote(std::optional< Account > const &account, std::uint32_t feeVal, std::optional< std::uint32_t > const &flags=std::nullopt, std::optional< jtx::seq > const &seq=std::nullopt, std::optional< std::pair< Issue, Issue > > const &assets=std::nullopt, std::optional< ter > const &ter=std::nullopt)
AccountID const & ammAccount() const
bool expectTradingFee(std::uint16_t fee) const
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)
Json::Value bid(BidArg const &arg)
bool expectAmmRpcInfo(STAmount const &asset1, STAmount const &asset2, IOUAmount const &balance, std::optional< AccountID > const &account=std::nullopt, std::optional< std::string > const &ledger_index=std::nullopt, std::optional< AccountID > const &ammAccount=std::nullopt) const
Immutable cryptographic account descriptor.
AccountID id() const
Returns the Account ID.
std::string const & human() const
Returns the human readable public key.
A transaction testing environment.
bool close(NetClock::time_point closeTime, std::optional< std::chrono::milliseconds > consensusDelay=std::nullopt)
Close and advance the ledger.
void fund(bool setDefaultRipple, STAmount const &amount, Account const &account)
Set the expected result code for a JTx The test will fail if the code doesn't match.
Json::Value fclear(Account const &account, std::uint32_t off)
Remove account flag.
Json::Value fset(Account const &account, std::uint32_t on, std::uint32_t off=0)
Add and/or remove flag.
void fund(jtx::Env &env, jtx::Account const &gw, std::vector< jtx::Account > const &accounts, std::vector< STAmount > const &amts, Fund how)
FeatureBitset testable_amendments()
XRP_t const XRP
Converts to XRP Issue or STAmount.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
Issue const & xrpIssue()
Returns an asset specifier that represents XRP.
constexpr std::uint32_t asfGlobalFreeze
std::string to_string(base_uint< Bits, Tag > const &a)