21#include <test/jtx/AMM.h>
22#include <test/jtx/AMMTest.h>
24#include <xrpl/protocol/jss.h>
42 enum TestAccount {
None, Alice, Bogie };
43 auto accountId = [&](
AMM const& ammAlice,
56 auto const USD =
gw[
"USD"];
59 BEAST_EXPECT(jv[jss::error_message] ==
"Account not found.");
65 BEAST_EXPECT(jv[jss::error_message] ==
"Account malformed.");
72 bool>>
const invalidParams = {
75 {
xrpIssue(), std::nullopt, Alice,
false},
76 {std::nullopt,
USD.
issue(), Alice,
false},
78 {std::nullopt, std::nullopt,
None,
true}};
82 for (
auto const& [iss1, iss2, acct, ignoreParams] : invalidParams)
89 accountId(ammAlice, acct),
91 BEAST_EXPECT(jv[jss::error_message] ==
"Invalid parameters.");
97 for (
auto const& [iss1, iss2, acct, ignoreParams] : invalidParams)
104 accountId(ammAlice, acct),
106 BEAST_EXPECT(jv[jss::error_message] ==
"Invalid parameters.");
112 for (
auto const& [iss1, iss2, acct, ignoreParams] : invalidParams)
119 accountId(ammAlice, acct),
122 BEAST_EXPECT(jv[jss::error_message] ==
"Account malformed.");
134 BEAST_EXPECT(jv[jss::error_message] ==
"Account malformed.");
141 bool>>
const invalidParamsBadAccount = {
144 {
xrpIssue(), std::nullopt, Bogie,
false},
145 {std::nullopt,
USD.
issue(), Bogie,
false},
147 {std::nullopt, std::nullopt,
None,
true}};
151 for (
auto const& [iss1, iss2, acct, ignoreParams] :
152 invalidParamsBadAccount)
159 accountId(ammAlice, acct),
161 BEAST_EXPECT(jv[jss::error_message] ==
"Invalid parameters.");
167 for (
auto const& [iss1, iss2, acct, ignoreParams] :
168 invalidParamsBadAccount)
175 accountId(ammAlice, acct),
179 jv[jss::error_message] ==
216 for (
int i = 0; i < 7; ++i)
220 fund(env,
gw, {a}, {
USD(10000)}, Fund::Acct);
222 ammAlice.
vote(a, 50 * (i + 1));
229 {.bidMin = 100, .authAccounts = {carol, bob, ed, bill}}));
237 for (
auto i = 0; i < 2; ++i)
241 auto const ammInfo = i ? ammAlice.
ammRpcInfo()
248 auto const& amm = ammInfo[jss::amm];
252 auto const voteSlots = amm[jss::vote_slots];
253 auto votesCopy = votes;
257 votes[voteSlots[i][jss::account].asString()] ==
258 voteSlots[i][jss::trading_fee].asUInt() &&
259 voteSlots[i][jss::vote_weight].asUInt() ==
262 votes.erase(voteSlots[i][jss::account].asString());
264 if (!BEAST_EXPECT(votes.empty()))
269 auto const auctionSlot = amm[jss::auction_slot];
272 if (!BEAST_EXPECT(authAccounts.
contains(
273 auctionSlot[jss::auth_accounts][i][jss::account]
277 auctionSlot[jss::auth_accounts][i][jss::account]
280 if (!BEAST_EXPECT(authAccounts.
empty()))
283 auctionSlot[jss::account].asString() ==
alice.
human() &&
284 auctionSlot[jss::discounted_fee].asUInt() == 17 &&
285 auctionSlot[jss::price][jss::value].asString() ==
287 auctionSlot[jss::price][jss::currency].asString() ==
289 auctionSlot[jss::price][jss::issuer].asString() ==
304 testAMM([&](
AMM& ammAlice,
Env& env) {
307 auto test = [&](
bool freeze) {
310 info[jss::amm][jss::asset2_frozen].asBool() ==
freeze);
323 testcase(
"Invalid amm field");
325 testAMM([&](
AMM& amm,
Env&) {
326 auto const resp = amm.ammRpcInfo(
328 jss::validated.c_str(),
333 resp.isMember(
"error") && resp[
"error"] ==
"actNotFound");
344 testInvalidAmmField();
348BEAST_DEFINE_TESTSUITE(AMMInfo, app,
ripple);
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 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={supported_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)
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)
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)