18 #include <ripple/beast/unit_test.h>
19 #include <ripple/protocol/Feature.h>
37 auto const ownerCount = env.
le(account)->getFieldU32(
sfOwnerCount);
40 env(offer(account,
in,
out));
50 testcase(
"Step Limit");
53 Env env(*
this, features);
55 auto const gw =
Account(
"gateway");
56 auto const USD = gw[
"USD"];
58 env.
fund(
XRP(100000000), gw,
"alice",
"bob",
"carol",
"dan");
59 env.
trust(USD(1),
"bob");
60 env(
pay(gw,
"bob", USD(1)));
61 env.
trust(USD(1),
"dan");
62 env(
pay(gw,
"dan", USD(1)));
68 env(offer(
"alice", USD(1000),
XRP(1000)));
78 env(offer(
"carol", USD(1000),
XRP(1000)));
90 testcase(
"Crossing Limit");
93 Env env(*
this, features);
95 auto const gw =
Account(
"gateway");
96 auto const USD = gw[
"USD"];
103 env.
fund(
XRP(100000000), gw,
"alice",
"bob",
"carol");
104 int const bobsOfferCount = maxConsumed + 150;
105 env.
trust(USD(bobsOfferCount),
"bob");
106 env(
pay(gw,
"bob", USD(bobsOfferCount)));
108 n_offers(env, bobsOfferCount,
"bob",
XRP(1), USD(1));
112 env(offer(
"alice", USD(bobsOfferCount),
XRP(bobsOfferCount)));
120 env(offer(
"carol", USD(1000),
XRP(1000)));
130 testcase(
"Step And Crossing Limit");
133 Env env(*
this, features);
135 auto const gw =
Account(
"gateway");
136 auto const USD = gw[
"USD"];
138 env.
fund(
XRP(100000000), gw,
"alice",
"bob",
"carol",
"dan",
"evita");
144 int const maxConsumed = isFlowCross ? 1000 : 850;
146 int const evitasOfferCount{maxConsumed + 49};
147 env.
trust(USD(1000),
"alice");
148 env(
pay(gw,
"alice", USD(1000)));
149 env.
trust(USD(1000),
"carol");
150 env(
pay(gw,
"carol", USD(1)));
151 env.
trust(USD(evitasOfferCount + 1),
"evita");
152 env(
pay(gw,
"evita", USD(evitasOfferCount + 1)));
161 int const carolsOfferCount{isFlowCross ? 700 : 850};
163 n_offers(env, carolsOfferCount,
"carol",
XRP(1), USD(1));
164 n_offers(env, evitasOfferCount,
"evita",
XRP(1), USD(1));
169 env(offer(
"bob", USD(1000),
XRP(1000)));
181 env(offer(
"dan", USD(maxConsumed + 50),
XRP(maxConsumed + 50)));
195 testcase(
"Auto Bridged Limits Taker");
198 Env env(*
this, features);
200 auto const gw =
Account(
"gateway");
201 auto const USD = gw[
"USD"];
202 auto const EUR = gw[
"EUR"];
204 env.
fund(
XRP(100000000), gw,
"alice",
"bob",
"carol",
"dan",
"evita");
206 env.
trust(USD(2000),
"alice");
207 env(
pay(gw,
"alice", USD(2000)));
208 env.
trust(USD(1000),
"carol");
209 env(
pay(gw,
"carol", USD(3)));
210 env.
trust(USD(1000),
"evita");
211 env(
pay(gw,
"evita", USD(1000)));
216 n_offers(env, 1001,
"evita", EUR(1), USD(1));
234 env.
trust(EUR(10000),
"bob");
236 env(
pay(gw,
"bob", EUR(1000)));
238 env(offer(
"bob", USD(2000), EUR(2000)));
263 env.
trust(EUR(10000),
"dan");
265 env(
pay(gw,
"dan", EUR(1000)));
268 env(offer(
"dan", USD(900), EUR(900)));
291 testcase(
"Auto Bridged Limits FlowCross");
299 auto const gw =
Account(
"gateway");
300 auto const alice =
Account(
"alice");
301 auto const bob =
Account(
"bob");
302 auto const carol =
Account(
"carol");
304 auto const USD = gw[
"USD"];
305 auto const EUR = gw[
"EUR"];
320 Env env(*
this, features);
322 env.
fund(
XRP(100000000), gw, alice, bob, carol);
324 env.
trust(USD(4000), alice);
325 env(
pay(gw, alice, USD(4000)));
326 env.
trust(USD(1000), carol);
327 env(
pay(gw, carol, USD(3)));
334 env, 801, carol,
XRP(1), USD(3));
337 n_offers(env, 1, alice, EUR(500), USD(500));
377 env.
trust(EUR(10000), bob);
379 env(
pay(gw, bob, EUR(2000)));
381 env(offer(bob, USD(4000), EUR(4000)));
391 auto const numAOffers =
392 2000 + 100 + 1000 + 1 - (2 * 100 + 2 * 199 + 1 + 1);
399 Env env(*
this, features);
401 env.
fund(
XRP(100000000), gw, alice, bob, carol);
403 env.
trust(USD(4000), alice);
404 env(
pay(gw, alice, USD(4000)));
405 env.
trust(USD(1000), carol);
406 env(
pay(gw, carol, USD(3)));
410 n_offers(env, 1, alice, EUR(1), USD(10));
414 env, 801, carol,
XRP(1), USD(3));
417 n_offers(env, 1, alice, EUR(499), USD(499));
450 env.
trust(EUR(10000), bob);
452 env(
pay(gw, bob, EUR(2000)));
454 env(offer(bob, USD(4000), EUR(4000)));
464 auto const numAOffers =
465 1 + 2000 + 100 + 1000 + 1 - (1 + 2 * 100 + 2 * 199 + 1 + 1);
496 testcase(
"Offer Overflow");
500 auto const gw =
Account(
"gateway");
501 auto const alice =
Account(
"alice");
502 auto const bob =
Account(
"bob");
504 auto const USD = gw[
"USD"];
506 Env env(*
this, features);
508 env.
fund(
XRP(100000000), gw, alice, bob);
510 env.
trust(USD(8000), alice);
511 env.
trust(USD(8000), bob);
514 env(
pay(gw, alice, USD(8000)));
546 auto const expectedTER = [&]() ->
TER {
547 if (withFlowCross && !withSortStrands)
552 env(offer(bob, USD(8000),
XRP(8000)),
ter(expectedTER));
555 auto const expectedUSD = [&] {
558 if (!withSortStrands)