60 auto const alice =
Account(
"alice");
61 auto const bob =
Account(
"bob");
62 auto const carol =
Account(
"carol");
63 auto const dan =
Account(
"dan");
64 auto const erin =
Account(
"erin");
65 auto const USDA = alice[
"USD"];
66 auto const USDB = bob[
"USD"];
67 auto const USDC = carol[
"USD"];
68 auto const USDD = dan[
"USD"];
70 auto const USD = gw[
"USD"];
73 Env env(*
this, features);
75 env.
fund(
XRP(10000), alice, bob, gw);
77 env.
trust(USD(1000), alice, bob);
78 env(
pay(gw, alice, USD(100)));
79 env(
pay(alice, bob, USD(10)),
paths(USD));
84 Env env(*
this, features);
86 env.
fund(
XRP(10000), alice, bob);
88 env(
pay(alice, bob,
XRP(100)));
94 Env env(*
this, features);
96 env.
fund(
XRP(10000), alice, bob, gw);
98 env.
trust(USD(1000), alice, bob);
99 env(
pay(gw, alice, USD(100)));
102 env(
pay(alice, bob, USD(110)),
109 Env env(*
this, features);
111 env.
fund(
XRP(10000), alice, bob, carol, dan);
113 env.
trust(USDA(10), bob);
114 env.
trust(USDB(10), carol);
115 env.
trust(USDC(10), dan);
116 env(
pay(alice, dan, USDC(10)),
paths(USDA));
125 Env env(*
this, features);
127 env.
fund(
XRP(10000), alice, bob, carol, dan);
129 env.
trust(USDA(10), bob);
130 env.
trust(USDB(10), alice, carol);
131 env.
trust(USDC(10), dan);
135 env(
pay(bob, alice, USDB(6)));
136 env(
pay(alice, dan, USDC(5)),
146 Env env(*
this, features);
148 env.
fund(
XRP(10000), alice, bob, carol, dan);
150 env.
trust(USDA(10), bob);
151 env.
trust(USDB(10), alice, carol);
152 env.
trust(USDC(10), dan);
155 env(
pay(alice, dan, USDC(5)),
165 Env env(*
this, features);
167 env.
fund(
XRP(10000), alice, bob, carol, dan, erin);
169 env.
trust(USDA(10), bob, carol);
170 env.
trust(USDB(10), dan);
171 env.
trust(USDC(10), alice, dan);
172 env.
trust(USDD(20), erin);
174 env(
rate(carol, 1.1));
177 env(
pay(carol, alice, USDC(10)));
178 env(
pay(alice, erin, USDD(5)),
189 Env env(*
this, features);
191 env.
fund(
XRP(10000), alice, bob, carol);
193 env.
trust(USDA(10), bob);
194 env.
trust(USDB(10), carol);
196 env(
pay(alice, carol, USDB(5)),
202 env(
pay(alice, carol, USDB(5)),
215 auto const alice =
Account(
"alice");
216 auto const bob =
Account(
"bob");
217 auto const carol =
Account(
"carol");
218 auto const dan =
Account(
"dan");
219 auto const USDA = alice[
"USD"];
220 auto const USDB = bob[
"USD"];
221 auto const USDC = carol[
"USD"];
222 auto const USDD = dan[
"USD"];
225 for (
auto bobDanQIn : {80, 100, 120})
226 for (
auto bobAliceQOut : {80, 100, 120})
228 Env env(*
this, features);
229 env.
fund(
XRP(10000), alice, bob, carol, dan);
233 env(
trust(carol, USDA(100)));
235 env(
pay(alice, bob, USDA(100)));
237 env(
pay(dan, carol, USDA(10)),
242 if (bobAliceQOut > bobDanQIn)
245 USDD(10.0 *
double(bobAliceQOut) /
double(bobDanQIn))));
252 for (
auto carolAliceQIn : {80, 100, 120})
254 Env env(*
this, features);
255 env.
fund(
XRP(10000), alice, bob, carol);
258 env(
trust(bob, USDA(10)));
261 env(
pay(alice, bob, USDA(10)));
263 env(
pay(bob, carol, USDA(5)),
sendmax(USDA(10)));
264 auto const effectiveQ =
265 carolAliceQIn > 100 ? 1.0 : carolAliceQIn / 100.0;
270 for (
auto bobAliceQOut : {80, 100, 120})
272 Env env(*
this, features);
273 env.
fund(
XRP(10000), alice, bob, carol);
276 env(
trust(carol, USDA(10)));
278 env(
pay(alice, bob, USDA(10)));
280 env(
pay(bob, carol, USDA(5)),
sendmax(USDA(5)));
293 auto const gw =
Account(
"gateway");
294 auto const USD = gw[
"USD"];
295 auto const BTC = gw[
"BTC"];
296 auto const EUR = gw[
"EUR"];
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)));
313 env(
offer(bob, BTC(50), USD(50)));
321 BEAST_EXPECT(!
isOffer(env, bob, BTC(50), USD(50)));
325 Env env(*
this, features);
327 env.
fund(
XRP(10000), alice, bob, carol, gw);
329 env.
trust(USD(1000), alice, bob, carol);
330 env.
trust(BTC(1000), alice, bob, carol);
332 env(
pay(gw, alice, BTC(50)));
333 env(
pay(gw, bob, USD(50)));
344 BEAST_EXPECT(!
isOffer(env, bob,
XRP(50), USD(50)));
345 BEAST_EXPECT(!
isOffer(env, bob, BTC(50),
XRP(50)));
349 Env env(*
this, features);
351 env.
fund(
XRP(10000), alice, bob, carol, gw);
353 env.
trust(USD(1000), alice, bob, carol);
354 env.
trust(BTC(1000), alice, bob, carol);
356 env(
pay(gw, bob, USD(50)));
366 BEAST_EXPECT(!
isOffer(env, bob,
XRP(50), USD(50)));
370 Env env(*
this, features);
372 env.
fund(
XRP(10000), alice, bob, carol, gw);
374 env.
trust(USD(1000), alice, bob, carol);
375 env.
trust(BTC(1000), alice, bob, carol);
377 env(
pay(gw, alice, USD(50)));
387 BEAST_EXPECT(!
isOffer(env, bob, USD(50),
XRP(50)));
391 Env env(*
this, features);
393 env.
fund(
XRP(10000), alice, bob, carol, gw);
395 env.
trust(USD(1000), alice, bob, carol);
396 env.
trust(BTC(1000), alice, bob, carol);
397 env.
trust(EUR(1000), alice, bob, carol);
399 env(
pay(gw, alice, BTC(60)));
400 env(
pay(gw, bob, USD(50)));
401 env(
pay(gw, bob, EUR(50)));
403 env(
offer(bob, BTC(50), USD(50)));
404 env(
offer(bob, BTC(40), EUR(50)));
405 env(
offer(bob, EUR(50), USD(50)));
408 env(
pay(bob, gw, EUR(50)));
409 BEAST_EXPECT(
isOffer(env, bob, BTC(50), USD(50)));
410 BEAST_EXPECT(
isOffer(env, bob, BTC(40), EUR(50)));
411 BEAST_EXPECT(
isOffer(env, bob, EUR(50), USD(50)));
413 env(
pay(alice, carol, USD(50)),
424 BEAST_EXPECT(!
isOffer(env, bob, BTC(50), USD(50)));
426 BEAST_EXPECT(!
isOffer(env, bob, BTC(40), EUR(50)));
428 BEAST_EXPECT(
isOffer(env, bob, EUR(50), USD(50)));
439 Env env(*
this, features);
441 env.
fund(
XRP(10000), alice, bob, carol, gw);
443 env.
trust(USD(1000), alice, bob, carol);
444 env.
trust(BTC(1000), alice, bob, carol);
445 env.
trust(EUR(1000), alice, bob, carol);
447 env(
pay(gw, alice, BTC(60)));
448 env(
pay(gw, bob, USD(60)));
449 env(
pay(gw, bob, EUR(50)));
450 env(
pay(gw, carol, EUR(1)));
452 env(
offer(bob, BTC(50), USD(50)));
453 env(
offer(bob, BTC(60), EUR(50)));
454 env(
offer(carol, BTC(1000), EUR(1)));
455 env(
offer(bob, EUR(50), USD(50)));
458 env(
pay(bob, gw, EUR(50)));
459 BEAST_EXPECT(
isOffer(env, bob, BTC(50), USD(50)));
460 BEAST_EXPECT(
isOffer(env, bob, BTC(60), EUR(50)));
461 BEAST_EXPECT(
isOffer(env, carol, BTC(1000), EUR(1)));
464 auto const flowResult = [&] {
501 BEAST_EXPECT(flowResult.removableOffers.size() == 1);
504 if (flowResult.removableOffers.empty())
507 for (
auto const& o : flowResult.removableOffers)
515 BEAST_EXPECT(
isOffer(env, bob, BTC(50), USD(50)));
516 BEAST_EXPECT(
isOffer(env, carol, BTC(1000), EUR(1)));
518 BEAST_EXPECT(!
isOffer(env, bob, BTC(60), EUR(50)));
528 Env env(*
this, features);
529 env.
fund(
XRP(10000), alice, bob, carol, gw);
532 env.
trust(USD(1000), alice, bob, carol);
533 env.
trust(EUR(1000), alice, bob, carol);
535 env(
pay(gw, alice, USD(1000)));
536 env(
pay(gw, bob, EUR(1000)));
542 bool const reducedOffersV2 = features[fixReducedOffersV2];
548 TER const expectedTER =
550 env(
pay(alice, carol, EUR(1)),
556 if (!reducedOffersV2)
564 if (BEAST_EXPECT(usdOffer))
570 to_string(usdOffer->at(sfBookDirectory));
571 bookDirStr.
erase(0, 48);
575 usdOffer->at(sfTakerGets), usdOffer->at(sfTakerPays));
581 BEAST_EXPECT(actualRate > bookRate);