3#include <xrpl/beast/unit_test.h>
4#include <xrpl/protocol/Feature.h>
18 Env env(*
this, features);
20 auto const gw =
Account(
"gateway");
21 auto const USD = gw[
"USD"];
23 env.
fund(
XRP(100000000), gw,
"alice",
"bob",
"carol",
"dan");
24 env.
trust(USD(1),
"bob");
25 env(
pay(gw,
"bob", USD(1)));
26 env.
trust(USD(1),
"dan");
27 env(
pay(gw,
"dan", USD(1)));
33 env(
offer(
"alice", USD(1000),
XRP(1000)));
43 env(
offer(
"carol", USD(1000),
XRP(1000)));
58 Env env(*
this, features);
60 auto const gw =
Account(
"gateway");
61 auto const USD = gw[
"USD"];
64 int const maxConsumed = 1000;
66 env.
fund(
XRP(100000000), gw,
"alice",
"bob",
"carol");
67 int const bobsOfferCount = maxConsumed + 150;
68 env.
trust(USD(bobsOfferCount),
"bob");
69 env(
pay(gw,
"bob", USD(bobsOfferCount)));
71 n_offers(env, bobsOfferCount,
"bob",
XRP(1), USD(1));
75 env(
offer(
"alice", USD(bobsOfferCount),
XRP(bobsOfferCount)));
83 env(
offer(
"carol", USD(1000),
XRP(1000)));
96 Env env(*
this, features);
98 auto const gw =
Account(
"gateway");
99 auto const USD = gw[
"USD"];
101 env.
fund(
XRP(100000000), gw,
"alice",
"bob",
"carol",
"dan",
"evita");
104 int const maxConsumed = 1000;
106 int const evitasOfferCount{maxConsumed + 49};
107 env.
trust(USD(1000),
"alice");
108 env(
pay(gw,
"alice", USD(1000)));
109 env.
trust(USD(1000),
"carol");
110 env(
pay(gw,
"carol", USD(1)));
111 env.
trust(USD(evitasOfferCount + 1),
"evita");
112 env(
pay(gw,
"evita", USD(evitasOfferCount + 1)));
115 int const carolsOfferCount{700};
117 n_offers(env, carolsOfferCount,
"carol",
XRP(1), USD(1));
118 n_offers(env, evitasOfferCount,
"evita",
XRP(1), USD(1));
123 env(
offer(
"bob", USD(1000),
XRP(1000)));
135 env(
offer(
"dan", USD(maxConsumed + 50),
XRP(maxConsumed + 50)));
149 testcase(
"Auto Bridged Limits Taker");
152 Env env(*
this, features);
154 auto const gw =
Account(
"gateway");
155 auto const USD = gw[
"USD"];
156 auto const EUR = gw[
"EUR"];
158 env.
fund(
XRP(100000000), gw,
"alice",
"bob",
"carol",
"dan",
"evita");
160 env.
trust(USD(2000),
"alice");
161 env(
pay(gw,
"alice", USD(2000)));
162 env.
trust(USD(1000),
"carol");
163 env(
pay(gw,
"carol", USD(3)));
164 env.
trust(USD(1000),
"evita");
165 env(
pay(gw,
"evita", USD(1000)));
170 n_offers(env, 1001,
"evita", EUR(1), USD(1));
188 env.
trust(EUR(10000),
"bob");
190 env(
pay(gw,
"bob", EUR(1000)));
192 env(
offer(
"bob", USD(2000), EUR(2000)));
217 env.
trust(EUR(10000),
"dan");
219 env(
pay(gw,
"dan", EUR(1000)));
222 env(
offer(
"dan", USD(900), EUR(900)));
253 auto const gw =
Account(
"gateway");
254 auto const alice =
Account(
"alice");
255 auto const bob =
Account(
"bob");
256 auto const carol =
Account(
"carol");
258 auto const USD = gw[
"USD"];
259 auto const EUR = gw[
"EUR"];
274 Env env(*
this, features);
276 env.
fund(
XRP(100000000), gw, alice, bob, carol);
278 env.
trust(USD(4000), alice);
279 env(
pay(gw, alice, USD(4000)));
280 env.
trust(USD(1000), carol);
281 env(
pay(gw, carol, USD(3)));
288 env, 801, carol,
XRP(1), USD(3));
291 n_offers(env, 1, alice, EUR(500), USD(500));
331 env.
trust(EUR(10000), bob);
333 env(
pay(gw, bob, EUR(2000)));
335 env(
offer(bob, USD(4000), EUR(4000)));
345 auto const numAOffers =
346 2000 + 100 + 1000 + 1 - (2 * 100 + 2 * 199 + 1 + 1);
353 Env env(*
this, features);
355 env.
fund(
XRP(100000000), gw, alice, bob, carol);
357 env.
trust(USD(4000), alice);
358 env(
pay(gw, alice, USD(4000)));
359 env.
trust(USD(1000), carol);
360 env(
pay(gw, carol, USD(3)));
364 n_offers(env, 1, alice, EUR(1), USD(10));
368 env, 801, carol,
XRP(1), USD(3));
371 n_offers(env, 1, alice, EUR(499), USD(499));
404 env.
trust(EUR(10000), bob);
406 env(
pay(gw, bob, EUR(2000)));
408 env(
offer(bob, USD(4000), EUR(4000)));
418 auto const numAOffers =
419 1 + 2000 + 100 + 1000 + 1 - (1 + 2 * 100 + 2 * 199 + 1 + 1);
434 auto const gw =
Account(
"gateway");
435 auto const alice =
Account(
"alice");
436 auto const bob =
Account(
"bob");
438 auto const USD = gw[
"USD"];
440 Env env(*
this, features);
442 env.
fund(
XRP(100000000), gw, alice, bob);
444 env.
trust(USD(8000), alice);
445 env.
trust(USD(8000), bob);
448 env(
pay(gw, alice, USD(8000)));
477 bool const withSortStrands = features[featureFlowSortStrands];
479 auto const expectedTER = [&]() ->
TER {
480 if (!withSortStrands)
485 env(
offer(bob, USD(8000),
XRP(8000)),
ter(expectedTER));
488 auto const expectedUSD = [&] {
489 if (!withSortStrands)
510 testAll(sa - featureFlowSortStrands);
511 testAll(sa - featurePermissionedDEX);
512 testAll(sa - featureFlowSortStrands - featurePermissionedDEX);
516BEAST_DEFINE_TESTSUITE_MANUAL_PRIO(CrossingLimits, app,
ripple, 10);
testcase_t testcase
Memberspace for declaring test cases.
void testStepAndCrossingLimit(FeatureBitset features)
void testAutoBridgedLimitsTaker(FeatureBitset features)
void testAutoBridgedLimits(FeatureBitset features)
void testStepLimit(FeatureBitset features)
void testCrossingLimit(FeatureBitset features)
void run() override
Runs the suite.
void testOfferOverflow(FeatureBitset features)
Immutable cryptographic account descriptor.
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)
Match the number of items in the account's owner directory.
Set the expected result code for a JTx The test will fail if the code doesn't match.
owner_count< ltOFFER > offers
Match the number of offers in the account's owner directory.
Json::Value pay(AccountID const &account, AccountID const &to, AnyAmount amount)
Create a payment.
void n_offers(Env &env, std::size_t n, Account const &account, STAmount const &in, STAmount const &out)
FeatureBitset testable_amendments()
Json::Value offer(Account const &account, STAmount const &takerPays, STAmount const &takerGets, std::uint32_t flags)
Create an offer.
XRP_t const XRP
Converts to XRP Issue or STAmount.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.