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)