1#include <test/jtx/AMM.h>
2#include <test/jtx/AMMTest.h>
3#include <test/jtx/CaptureLogs.h>
4#include <test/jtx/Env.h>
5#include <test/jtx/pay.h>
7#include <xrpld/rpc/RPCHandler.h>
9#include <xrpl/protocol/ApiVersion.h>
10#include <xrpl/protocol/STParsedJSON.h>
11#include <xrpl/resource/Fees.h>
25 fund(env, gw, accounts,
XRP(30000), amts, how);
36 for (
auto const& account : accounts)
40 env.
fund(xrp, account);
44 for (
auto const& account : accounts)
46 for (
auto const& amt : amts)
48 env.
trust(amt + amt, account);
49 env(
pay(amt.issue().account, account, amt));
67 fund(env, accounts, xrp, amts, how);
94 .
pool = pool, .tfee = tfee, .ter =
ter, .features = vfeatures});
106 for (
auto const& features :
arg.features)
113 auto const [asset1, asset2] =
118 auto const defXRP =
XRP(30000);
121 return a +
XRP(1000);
128 auto const toFund1 = tofund(asset1);
129 auto const toFund2 = tofund(asset2);
130 BEAST_EXPECT(asset1 <= toFund1 && asset2 <= toFund2);
132 if (!asset1.native() && !asset2.native())
134 else if (asset1.native())
136 else if (asset2.native())
146 ammAlice.expectBalances(asset1, asset2, ammAlice.tokens())))
154 return env.
current()->fees().accountReserve(count);
160 return env.
current()->fees().increment;
170 cfg->PATH_SEARCH_OLD = 7;
171 cfg->PATH_SEARCH = 7;
172 cfg->PATH_SEARCH_MAX = 10;
188 auto& app = env.
app();
197 app.getLedgerMaster(),
207 params[jss::command] =
"ripple_path_find";
208 params[jss::source_account] =
toBase58(src);
209 params[jss::destination_account] =
toBase58(dst);
223 app.getJobQueue().postCoro(
jtCLIENT,
"RPC-Client", [&](
auto const& coro) {
224 context.params = std::move(params);
230 using namespace std::chrono_literals;
232 BEAST_EXPECT(!result.
isMember(jss::error));
246 env, src, dst, saDstAmount, saSendMax, saSrcCurrency);
247 BEAST_EXPECT(!result.
isMember(jss::error));
250 if (result.
isMember(jss::destination_amount))
255 if (result.
isMember(jss::alternatives))
257 auto const& alts = result[jss::alternatives];
260 auto const&
path = alts[0u];
262 if (
path.isMember(jss::source_amount))
265 if (
path.isMember(jss::destination_amount))
268 if (
path.isMember(jss::paths_computed))
271 p[
"Paths"] =
path[jss::paths_computed];
bool isMember(char const *key) const
Return true if the object has a member named key.
std::string const & arg() const
Return the argument associated with the runner.
An endpoint that consumes resources.
Json::Value getJson(JsonOptions=JsonOptions::none) const override
Issue const & issue() const
Holds the serialized result of parsing an input JSON object.
std::optional< STObject > object
The STObject if the parse was successful.
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
bool wait_for(std::chrono::duration< Rep, Period > const &rel_time)
std::tuple< STPathSet, STAmount, STAmount > find_paths(jtx::Env &env, jtx::Account const &src, jtx::Account const &dst, STAmount const &saDstAmount, std::optional< STAmount > const &saSendMax=std::nullopt, std::optional< Currency > const &saSrcCurrency=std::nullopt)
XRPAmount ammCrtFee(jtx::Env &env) const
XRPAmount reserve(jtx::Env &env, std::uint32_t count) const
Json::Value find_paths_request(jtx::Env &env, jtx::Account const &src, jtx::Account const &dst, STAmount const &saDstAmount, std::optional< STAmount > const &saSendMax=std::nullopt, std::optional< Currency > const &saSrcCurrency=std::nullopt)
Convenience class to test AMM functionality.
Immutable cryptographic account descriptor.
A transaction testing environment.
std::shared_ptr< OpenView const > current() const
Returns the current ledger.
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.
beast::Journal const journal
void fund(bool setDefaultRipple, STAmount const &amount, Account const &account)
Converts to IOU Issue or STAmount.
Set Paths, SendMax on a JTx.
Set the expected result code for a JTx The test will fail if the code doesn't match.
@ arrayValue
array value (ordered list)
@ objectValue
object value (collection of name/value pairs).
Status doCommand(RPC::JsonContext &context, Json::Value &result)
Execute an RPC command and store the results in a Json::Value.
static constexpr auto apiVersionIfUnspecified
Charge const feeReferenceRPC
Json::Value pay(AccountID const &account, AccountID const &to, AnyAmount amount)
Create a payment.
void fund(jtx::Env &env, jtx::Account const &gw, std::vector< jtx::Account > const &accounts, std::vector< STAmount > const &amts, Fund how)
std::unique_ptr< Config > envconfig()
creates and initializes a default configuration for jtx::Env
XRP_t const XRP
Converts to XRP Issue or STAmount.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
std::string toBase58(AccountID const &v)
Convert AccountID to base58 checked string.
Currency const & badCurrency()
We deliberately disallow the currency that looks like "XRP" because too many people were using it ins...
STAmount amountFromJson(SField const &name, Json::Value const &v)
std::string to_string(base_uint< Bits, Tag > const &a)
std::optional< std::pair< STAmount, STAmount > > pool