41 auto const alice =
Account(
"alice");
42 auto const bob =
Account(
"bob");
43 auto const carol =
Account(
"carol");
44 auto const dan =
Account(
"dan");
45 auto const erin =
Account(
"erin");
46 auto const USDA = alice[
"USD"];
47 auto const USDB = bob[
"USD"];
48 auto const USDC = carol[
"USD"];
49 auto const USDD = dan[
"USD"];
51 auto const USD = gw[
"USD"];
54 Env env(*
this, features);
56 env.
fund(
XRP(10000), alice, bob, gw);
58 env.
trust(USD(1000), alice, bob);
59 env(
pay(gw, alice, USD(100)));
60 env(
pay(alice, bob, USD(10)),
paths(USD));
65 Env env(*
this, features);
67 env.
fund(
XRP(10000), alice, bob);
69 env(
pay(alice, bob,
XRP(100)));
75 Env env(*
this, features);
77 env.
fund(
XRP(10000), alice, bob, gw);
79 env.
trust(USD(1000), alice, bob);
80 env(
pay(gw, alice, USD(100)));
88 Env env(*
this, features);
90 env.
fund(
XRP(10000), alice, bob, carol, dan);
92 env.
trust(USDA(10), bob);
93 env.
trust(USDB(10), carol);
94 env.
trust(USDC(10), dan);
95 env(
pay(alice, dan, USDC(10)),
paths(USDA));
101 Env env(*
this, features);
103 env.
fund(
XRP(10000), alice, bob, carol, dan);
105 env.
trust(USDA(10), bob);
106 env.
trust(USDB(10), alice, carol);
107 env.
trust(USDC(10), dan);
111 env(
pay(bob, alice, USDB(6)));
112 env(
pay(alice, dan, USDC(5)),
122 Env env(*
this, features);
124 env.
fund(
XRP(10000), alice, bob, carol, dan);
126 env.
trust(USDA(10), bob);
127 env.
trust(USDB(10), alice, carol);
128 env.
trust(USDC(10), dan);
131 env(
pay(alice, dan, USDC(5)),
141 Env env(*
this, features);
143 env.
fund(
XRP(10000), alice, bob, carol, dan, erin);
145 env.
trust(USDA(10), bob, carol);
146 env.
trust(USDB(10), dan);
147 env.
trust(USDC(10), alice, dan);
148 env.
trust(USDD(20), erin);
150 env(
rate(carol, 1.1));
153 env(
pay(carol, alice, USDC(10)));
154 env(
pay(alice, erin, USDD(5)),
165 Env env(*
this, features);
167 env.
fund(
XRP(10000), alice, bob, carol);
169 env.
trust(USDA(10), bob);
170 env.
trust(USDB(10), carol);
172 env(
pay(alice, carol, USDB(5)),
174 txflags(tfLimitQuality | tfPartialPayment),
189 auto const alice =
Account(
"alice");
190 auto const bob =
Account(
"bob");
191 auto const carol =
Account(
"carol");
192 auto const dan =
Account(
"dan");
193 auto const USDA = alice[
"USD"];
194 auto const USDB = bob[
"USD"];
195 auto const USDC = carol[
"USD"];
196 auto const USDD = dan[
"USD"];
199 for (
auto bobDanQIn : {80, 100, 120})
201 for (
auto bobAliceQOut : {80, 100, 120})
203 Env env(*
this, features);
204 env.
fund(
XRP(10000), alice, bob, carol, dan);
208 env(
trust(carol, USDA(100)));
210 env(
pay(alice, bob, USDA(100)));
212 env(
pay(dan, carol, USDA(10)),
217 if (bobAliceQOut > bobDanQIn)
220 balance(bob, USDD(10.0 *
double(bobAliceQOut) /
double(bobDanQIn))));
231 for (
auto carolAliceQIn : {80, 100, 120})
233 Env env(*
this, features);
234 env.
fund(
XRP(10000), alice, bob, carol);
237 env(
trust(bob, USDA(10)));
240 env(
pay(alice, bob, USDA(10)));
242 env(
pay(bob, carol, USDA(5)),
sendmax(USDA(10)));
243 auto const effectiveQ = carolAliceQIn > 100 ? 1.0 : carolAliceQIn / 100.0;
248 for (
auto bobAliceQOut : {80, 100, 120})
250 Env env(*
this, features);
251 env.
fund(
XRP(10000), alice, bob, carol);
254 env(
trust(carol, USDA(10)));
256 env(
pay(alice, bob, USDA(10)));
258 env(
pay(bob, carol, USDA(5)),
sendmax(USDA(5)));
271 auto const gw =
Account(
"gateway");
272 auto const USD = gw[
"USD"];
273 auto const BTC = gw[
"BTC"];
274 auto const EUR = gw[
"EUR"];
281 Env env(*
this, features);
283 env.
fund(
XRP(10000), alice, bob, carol, gw);
285 env.
trust(USD(1000), alice, bob, carol);
286 env.
trust(BTC(1000), alice, bob, carol);
288 env(
pay(gw, alice, BTC(50)));
289 env(
pay(gw, bob, USD(50)));
291 env(
offer(bob, BTC(50), USD(50)));
299 BEAST_EXPECT(!
isOffer(env, bob, BTC(50), USD(50)));
303 Env env(*
this, features);
305 env.
fund(
XRP(10000), alice, bob, carol, gw);
307 env.
trust(USD(1000), alice, bob, carol);
308 env.
trust(BTC(1000), alice, bob, carol);
310 env(
pay(gw, alice, BTC(50)));
311 env(
pay(gw, bob, USD(50)));
322 BEAST_EXPECT(!
isOffer(env, bob,
XRP(50), USD(50)));
323 BEAST_EXPECT(!
isOffer(env, bob, BTC(50),
XRP(50)));
327 Env env(*
this, features);
329 env.
fund(
XRP(10000), alice, bob, carol, gw);
331 env.
trust(USD(1000), alice, bob, carol);
332 env.
trust(BTC(1000), alice, bob, carol);
334 env(
pay(gw, bob, USD(50)));
344 BEAST_EXPECT(!
isOffer(env, bob,
XRP(50), USD(50)));
348 Env env(*
this, features);
350 env.
fund(
XRP(10000), alice, bob, carol, gw);
352 env.
trust(USD(1000), alice, bob, carol);
353 env.
trust(BTC(1000), alice, bob, carol);
355 env(
pay(gw, alice, USD(50)));
365 BEAST_EXPECT(!
isOffer(env, bob, USD(50),
XRP(50)));
369 Env env(*
this, features);
371 env.
fund(
XRP(10000), alice, bob, carol, gw);
373 env.
trust(USD(1000), alice, bob, carol);
374 env.
trust(BTC(1000), alice, bob, carol);
375 env.
trust(EUR(1000), alice, bob, carol);
377 env(
pay(gw, alice, BTC(60)));
378 env(
pay(gw, bob, USD(50)));
379 env(
pay(gw, bob, EUR(50)));
381 env(
offer(bob, BTC(50), USD(50)));
382 env(
offer(bob, BTC(40), EUR(50)));
383 env(
offer(bob, EUR(50), USD(50)));
386 env(
pay(bob, gw, EUR(50)));
387 BEAST_EXPECT(
isOffer(env, bob, BTC(50), USD(50)));
388 BEAST_EXPECT(
isOffer(env, bob, BTC(40), EUR(50)));
389 BEAST_EXPECT(
isOffer(env, bob, EUR(50), USD(50)));
399 BEAST_EXPECT(!
isOffer(env, bob, BTC(50), USD(50)));
401 BEAST_EXPECT(!
isOffer(env, bob, BTC(40), EUR(50)));
403 BEAST_EXPECT(
isOffer(env, bob, EUR(50), USD(50)));
414 Env env(*
this, features);
416 env.
fund(
XRP(10000), alice, bob, carol, gw);
418 env.
trust(USD(1000), alice, bob, carol);
419 env.
trust(BTC(1000), alice, bob, carol);
420 env.
trust(EUR(1000), alice, bob, carol);
422 env(
pay(gw, alice, BTC(60)));
423 env(
pay(gw, bob, USD(60)));
424 env(
pay(gw, bob, EUR(50)));
425 env(
pay(gw, carol, EUR(1)));
427 env(
offer(bob, BTC(50), USD(50)));
428 env(
offer(bob, BTC(60), EUR(50)));
429 env(
offer(carol, BTC(1000), EUR(1)));
430 env(
offer(bob, EUR(50), USD(50)));
433 env(
pay(bob, gw, EUR(50)));
434 BEAST_EXPECT(
isOffer(env, bob, BTC(50), USD(50)));
435 BEAST_EXPECT(
isOffer(env, bob, BTC(60), EUR(50)));
436 BEAST_EXPECT(
isOffer(env, carol, BTC(1000), EUR(1)));
439 auto const flowResult = [&] {
476 BEAST_EXPECT(flowResult.removableOffers.size() == 1);
478 if (flowResult.removableOffers.empty())
481 for (
auto const& o : flowResult.removableOffers)
491 BEAST_EXPECT(
isOffer(env, bob, BTC(50), USD(50)));
492 BEAST_EXPECT(
isOffer(env, carol, BTC(1000), EUR(1)));
494 BEAST_EXPECT(!
isOffer(env, bob, BTC(60), EUR(50)));
504 Env env(*
this, features);
505 env.
fund(
XRP(10000), alice, bob, carol, gw);
508 env.
trust(USD(1000), alice, bob, carol);
509 env.
trust(EUR(1000), alice, bob, carol);
511 env(
pay(gw, alice, USD(1000)));
512 env(
pay(gw, bob, EUR(1000)));
518 bool const reducedOffersV2 = features[fixReducedOffersV2];
525 env(
pay(alice, carol, EUR(1)),
528 txflags(tfNoRippleDirect | tfPartialPayment),
531 if (!reducedOffersV2)
539 if (BEAST_EXPECT(usdOffer))
545 bookDirStr.
erase(0, 48);
549 getRate(usdOffer->at(sfTakerGets), usdOffer->at(sfTakerPays));
555 BEAST_EXPECT(actualRate > bookRate);