21 #include <ripple/app/paths/Flow.h>
22 #include <ripple/app/paths/impl/Steps.h>
23 #include <ripple/basics/contract.h>
24 #include <ripple/core/Config.h>
25 #include <ripple/ledger/ApplyViewImpl.h>
26 #include <ripple/ledger/PaymentSandbox.h>
27 #include <ripple/ledger/Sandbox.h>
28 #include <test/jtx/PathSet.h>
29 #include <ripple/protocol/Feature.h>
30 #include <ripple/protocol/jss.h>
43 return sle->isFlag (flag);
45 Throw<std::runtime_error> (
"No line in getTrustFlag");
53 auto feeDrops = env.
current ()->fees ().base;
62 testcase (
"Direct Step");
65 auto const alice =
Account (
"alice");
66 auto const bob =
Account (
"bob");
67 auto const carol =
Account (
"carol");
68 auto const dan =
Account (
"dan");
69 auto const erin =
Account (
"erin");
70 auto const USDA = alice[
"USD"];
71 auto const USDB = bob[
"USD"];
72 auto const USDC = carol[
"USD"];
73 auto const USDD = dan[
"USD"];
75 auto const USD = gw[
"USD"];
78 Env env (*
this, features);
80 env.
fund (
XRP (10000), alice, bob, gw);
81 env.
trust (USD (1000), alice, bob);
82 env (
pay (gw, alice, USD (100)));
83 env (
pay (alice, bob, USD (10)),
paths (USD));
88 Env env (*
this, features);
90 env.
fund (
XRP (10000), alice, bob);
91 env (
pay (alice, bob,
XRP (100)));
97 Env env (*
this, features);
99 env.
fund (
XRP (10000), alice, bob, gw);
100 env.
trust (USD (1000), alice, bob);
101 env (
pay (gw, alice, USD (100)));
102 env (
pay (alice, bob, USD (110)),
paths (USD),
105 env (
pay (alice, bob, USD (110)),
paths (USD),
111 Env env (*
this, features);
113 env.
fund (
XRP (10000), alice, bob, carol, dan);
114 env.
trust (USDA (10), bob);
115 env.
trust (USDB (10), carol);
116 env.
trust (USDC (10), dan);
117 env (
pay (alice, dan, USDC (10)),
paths (USDA));
126 Env env (*
this, features);
128 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);
132 env (
rate (bob, 1.1));
135 env (
pay (bob, alice, USDB(6)));
136 env (
pay (alice, dan, USDC (5)),
path (bob, carol),
144 Env env (*
this, features);
146 env.
fund (
XRP (10000), alice, bob, carol, dan);
147 env.
trust (USDA (10), bob);
148 env.
trust (USDB (10), alice, carol);
149 env.
trust (USDC (10), dan);
150 env (
rate (bob, 1.1));
152 env (
pay (alice, dan, USDC (5)),
path (bob, carol),
160 Env env (*
this, features);
162 env.
fund (
XRP (10000), alice, bob, carol, dan, erin);
163 env.
trust (USDA (10), bob, carol);
164 env.
trust (USDB (10), dan);
165 env.
trust (USDC (10), alice, dan);
166 env.
trust (USDD (20), erin);
168 env (
rate (carol, 1.1));
171 env (
pay (carol, alice, USDC(10)));
172 env (
pay (alice, erin, USDD (5)),
path (carol, dan),
181 Env env (*
this, features);
183 env.
fund (
XRP (10000), alice, bob, carol);
184 env.
trust (USDA (10), bob);
185 env.
trust (USDB (10), carol);
187 env (
pay (alice, carol, USDB (5)),
sendmax (USDA (4)),
191 env (
pay (alice, carol, USDB (5)),
sendmax (USDA (4)),
199 testcase (
"Line Quality");
202 auto const alice =
Account (
"alice");
203 auto const bob =
Account (
"bob");
204 auto const carol =
Account (
"carol");
205 auto const dan =
Account (
"dan");
206 auto const USDA = alice[
"USD"];
207 auto const USDB = bob[
"USD"];
208 auto const USDC = carol[
"USD"];
209 auto const USDD = dan[
"USD"];
212 for (
auto bobDanQIn : {80, 100, 120})
213 for (
auto bobAliceQOut : {80, 100, 120})
215 Env env(*
this, features);
216 env.
fund(
XRP(10000), alice, bob, carol, dan);
219 env(
trust(carol, USDA(100)));
221 env(
pay(alice, bob, USDA(100)));
223 env(
pay(dan, carol, USDA(10)),
226 if (bobAliceQOut > bobDanQIn)
229 USDD(10.0 *
double(bobAliceQOut) /
double(bobDanQIn))));
236 for (
auto carolAliceQIn : {80, 100, 120})
238 Env env(*
this, features);
239 env.
fund(
XRP(10000), alice, bob, carol);
240 env(
trust(bob, USDA(10)));
243 env(
pay(alice, bob, USDA(10)));
245 env(
pay(bob, carol, USDA(5)),
sendmax(USDA(10)));
246 auto const effectiveQ =
247 carolAliceQIn > 100 ? 1.0 : carolAliceQIn / 100.0;
252 for (
auto bobAliceQOut : {80, 100, 120})
254 Env env(*
this, features);
255 env.
fund(
XRP(10000), alice, bob, carol);
257 env(
trust(carol, USDA(10)));
259 env(
pay(alice, bob, USDA(10)));
261 env(
pay(bob, carol, USDA(5)),
sendmax(USDA(5)));
269 testcase (
"Book Step");
273 auto const gw =
Account (
"gateway");
274 auto const USD = gw[
"USD"];
275 auto const BTC = gw[
"BTC"];
276 auto const EUR = gw[
"EUR"];
283 Env env (*
this, features);
285 env.
fund (
XRP (10000), alice, bob, carol, gw);
286 env.
trust (USD (1000), alice, bob, carol);
287 env.
trust (BTC (1000), alice, bob, carol);
289 env (
pay (gw, alice, BTC (50)));
290 env (
pay (gw, bob, USD (50)));
292 env (
offer (bob, BTC (50), USD (50)));
294 env (
pay (alice, carol, USD (50)),
path (~USD),
sendmax (BTC (50)));
300 BEAST_EXPECT(!
isOffer (env, bob, BTC (50), USD (50)));
304 Env env (*
this, features);
306 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),
XRP (50)));
314 env (
offer (bob,
XRP (50), USD (50)));
316 env (
pay (alice, carol, USD (50)),
path (~
XRP, ~USD),
323 BEAST_EXPECT(!
isOffer (env, bob,
XRP (50), USD (50)));
324 BEAST_EXPECT(!
isOffer (env, bob, BTC (50),
XRP (50)));
328 Env env (*
this, features);
330 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)));
336 env (
offer (bob,
XRP (50), USD (50)));
338 env (
pay (alice, carol, USD (50)),
path (~USD),
345 BEAST_EXPECT(!
isOffer (env, bob,
XRP (50), USD (50)));
349 Env env (*
this, features);
351 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)));
357 env (
offer (bob, USD (50),
XRP (50)));
366 BEAST_EXPECT(!
isOffer (env, bob, USD (50),
XRP (50)));
370 Env env (*
this, features);
372 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 (60), 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 (60), EUR (50)));
389 BEAST_EXPECT(
isOffer (env, bob, EUR (50), USD (50)));
391 env (
pay (alice, carol, USD (50)),
401 BEAST_EXPECT(!
isOffer (env, bob, BTC (50), USD (50)));
403 BEAST_EXPECT(!
isOffer (env, bob, BTC (60), EUR (50)));
405 BEAST_EXPECT(
isOffer (env, bob, EUR (50), USD (50)));
416 Env env (*
this, features);
418 env.
fund (
XRP (10000), alice, bob, carol, gw);
419 env.
trust (USD (1000), alice, bob, carol);
420 env.
trust (BTC (1000), alice, bob, carol);
421 env.
trust (EUR (1000), alice, bob, carol);
423 env (
pay (gw, alice, BTC (60)));
424 env (
pay (gw, bob, USD (50)));
425 env (
pay (gw, bob, EUR (50)));
427 env (
offer (bob, BTC (50), USD (50)));
428 env (
offer (bob, BTC (60), EUR (50)));
429 env (
offer (bob, EUR (50), USD (50)));
432 env (
pay (bob, gw, EUR (50)));
433 BEAST_EXPECT(
isOffer (env, bob, BTC (50), USD (50)));
434 BEAST_EXPECT(
isOffer (env, bob, BTC (60), EUR (50)));
437 auto const flowResult = [&]
454 paths.push_back (p1);
457 paths.push_back (p2);
460 return flow (sb, deliver, alice, carol,
paths,
false,
false,
461 true,
false, boost::none, smax, flowJournal);
464 BEAST_EXPECT(flowResult.removableOffers.size () == 1);
468 if (flowResult.removableOffers.empty())
471 for (
auto const& o : flowResult.removableOffers)
479 BEAST_EXPECT(
isOffer (env, bob, BTC (50), USD (50)));
481 BEAST_EXPECT(!
isOffer (env, bob, BTC (60), EUR (50)));
491 Env env (*
this, features);
492 env.
fund (
XRP (10000), alice, bob, carol, gw);
493 env.
trust (USD (1000), alice, bob, carol);
494 env.
trust (EUR (1000), alice, bob, carol);
496 env (
pay (gw, alice, USD (1000)));
497 env (
pay (gw, bob, EUR (1000)));
502 env (
pay (alice, carol, EUR (1)),
path (~
XRP, ~EUR),
513 testcase (
"Transfer Rate");
517 auto const gw =
Account (
"gateway");
518 auto const USD = gw[
"USD"];
519 auto const BTC = gw[
"BTC"];
520 auto const EUR = gw[
"EUR"];
529 Env env (*
this, features);
531 env.
fund (
XRP (10000), alice, bob, carol, gw);
533 env.
trust (USD (1000), alice, bob, carol);
534 env (
pay (gw, alice, USD (50)));
536 env (
pay (alice, bob, USD (40)),
sendmax (USD (50)));
541 Env env (*
this, features);
543 env.
fund (
XRP (10000), alice, bob, carol, gw);
545 env.
trust (USD (1000), alice, bob, carol);
546 env (
pay (gw, alice, USD (50)));
548 env (
pay (alice, gw, USD (40)),
sendmax (USD (40)));
553 Env env (*
this, features);
555 env.
fund (
XRP (10000), alice, bob, carol, gw);
557 env.
trust (USD (1000), alice, bob, carol);
558 env (
pay (gw, bob, USD (65)));
560 env (
offer (bob,
XRP (50), USD (50)));
571 Env env (*
this, features);
573 env.
fund (
XRP (10000), alice, bob, carol, gw);
575 env.
trust (USD (1000), alice, bob, carol);
576 env.
trust (EUR (1000), alice, bob, carol);
577 env (
pay (gw, bob, USD (50)));
578 env (
pay (gw, bob, EUR (50)));
580 env (
offer (bob,
XRP (50), USD (50)));
581 env (
offer (bob, USD (50), EUR (50)));
594 Env env (*
this, features);
595 auto const USDA = alice[
"USD"];
596 auto const USDB = bob[
"USD"];
598 env.
fund (
XRP (10000), alice, bob, carol, gw);
600 env.
trust (USD (1000), alice, bob, carol);
601 env.
trust (USDA (1000), bob);
602 env.
trust (USDB (1000), gw);
603 env (
pay (gw, bob, USD (50)));
605 env (
pay (alice, carol, USD(50)),
path (bob),
sendmax (USDA(60)));
614 Env env (*
this, features);
615 auto const USDA = alice[
"USD"];
616 auto const USDB = bob[
"USD"];
619 env.
fund (
XRP (10000), alice, bob, carol, dan, gw);
621 env.
trust (USD (1000), alice, bob, carol, dan);
622 env.
trust (EUR (1000), carol, dan);
623 env.
trust (USDA (1000), bob);
624 env.
trust (USDB (1000), gw);
625 env (
pay (gw, bob, USD (50)));
626 env (
pay (gw, dan, EUR (100)));
627 env (
offer (dan, USD (100), EUR (100)));
629 env (
pay (alice, carol, EUR (50)),
path (bob, gw, ~EUR),
641 Env env (*
this, features);
643 env.
fund (
XRP (10000), alice, bob, gw);
645 env.
trust (USD (1000), alice, bob);
646 env (
offer (gw,
XRP (100), USD (100)));
647 env (
pay (alice, bob, USD (100)),
656 Env env (*
this, features);
658 env.
fund (
XRP (10000), alice, bob, gw);
660 env.
trust (USD (1000), alice, bob);
661 env (
offer (gw,
XRP (125), USD (125)));
662 env (
pay (alice, bob, USD (100)),
673 testcase (
"falseDryChanges");
677 auto const gw =
Account (
"gateway");
678 auto const USD = gw[
"USD"];
679 auto const EUR = gw[
"EUR"];
684 Env env (*
this, features);
686 env.
fund (
XRP(10000), alice, carol, gw);
688 env.
trust (USD (1000), alice, bob, carol);
689 env.
trust (EUR (1000), alice, bob, carol);
691 env (
pay (gw, alice, EUR (50)));
692 env (
pay (gw, bob, USD (50)));
701 env (
offer (bob, EUR (50),
XRP (50)));
702 env (
offer (bob,
XRP (50), USD (50)));
704 env (
pay (alice, carol, USD (1000000)),
path (~
XRP, ~USD),
709 BEAST_EXPECT(carolUSD > USD (0) && carolUSD < USD (50));
719 testcase (
"limitQuality");
722 auto const gw =
Account (
"gateway");
723 auto const USD = gw[
"USD"];
731 env.
fund (
XRP(10000), alice, bob, carol, gw);
733 env.
trust (USD(100), alice, bob, carol);
734 env (
pay (gw, bob, USD (100)));
735 env (
offer (bob,
XRP (50), USD (50)));
736 env (
offer (bob,
XRP (100), USD (50)));
749 return env.
current()->fees().accountReserve (count);
760 if (sle->getType() == ltOFFER)
761 result.push_back (sle);
769 testcase (
"Self-payment 1");
778 auto const gw1 =
Account (
"gw1");
779 auto const gw2 =
Account (
"gw2");
780 auto const alice =
Account (
"alice");
781 auto const USD = gw1[
"USD"];
782 auto const EUR = gw2[
"EUR"];
784 Env env (*
this, features);
786 env.
fund (
XRP (1000000), gw1, gw2);
790 auto const f = env.
current ()->fees ().base;
795 env (
trust (alice, USD (2000)));
796 env (
trust (alice, EUR (2000)));
799 env (
pay (gw1, alice, USD (1)));
800 env (
pay (gw2, alice, EUR (1000)));
803 env (
offer (alice, USD (500), EUR (600)));
811 BEAST_EXPECT(aliceOffers.size () == 1);
812 for (
auto const& offerPtr : aliceOffers)
814 auto const offer = *offerPtr;
820 env (
pay (alice, alice, EUR (600)),
sendmax (USD (500)),
828 BEAST_EXPECT(aliceOffers.size () == 1);
829 for (
auto const& offerPtr : aliceOffers)
831 auto const offer = *offerPtr;
841 testcase (
"Self-payment 2");
848 auto const gw1 =
Account (
"gw1");
849 auto const gw2 =
Account (
"gw2");
850 auto const alice =
Account (
"alice");
851 auto const USD = gw1[
"USD"];
852 auto const EUR = gw2[
"EUR"];
854 Env env (*
this, features);
856 env.
fund (
XRP (1000000), gw1, gw2);
860 auto const f = env.
current ()->fees ().base;
865 env (
trust (alice, USD (506)));
866 env (
trust (alice, EUR (606)));
869 env (
pay (gw1, alice, USD (500)));
870 env (
pay (gw2, alice, EUR (600)));
873 env (
offer (alice, USD (500), EUR (600)));
881 BEAST_EXPECT(aliceOffers.size () == 1);
882 for (
auto const& offerPtr : aliceOffers)
884 auto const offer = *offerPtr;
890 env (
pay (alice, alice, EUR (60)),
sendmax (USD (50)),
898 BEAST_EXPECT(aliceOffers.size () == 1);
899 for (
auto const& offerPtr : aliceOffers)
901 auto const offer = *offerPtr;
914 testcase(
"Self funded XRPEndpoint");
918 Env env(*
this, features);
920 auto const alice =
Account(
"alice");
922 auto const USD = gw[
"USD"];
924 env.
fund(
XRP(10000), alice, gw);
925 env(
trust(alice, USD(20)));
926 env(
pay(gw, alice, USD(10)));
927 env(
offer(alice,
XRP(50000), USD(10)));
931 auto const toSend = consumeOffer ? USD(10) : USD(9);
938 testcase(
"Unfunded Offer");
943 Env env(*
this, features);
945 auto const alice =
Account(
"alice");
946 auto const bob =
Account(
"bob");
948 auto const USD = gw[
"USD"];
950 env.
fund(
XRP(100000), alice, bob, gw);
951 env(
trust(bob, USD(20)));
953 STAmount tinyAmt1{USD.
issue(), 9000000000000000ll, -17,
false,
955 STAmount tinyAmt3{USD.
issue(), 9000000000000003ll, -17,
false,
959 env(
pay(alice, bob, tinyAmt1),
path(~USD),
962 BEAST_EXPECT(!
isOffer(env, gw,
XRP(0), USD(0)));
966 Env env(*
this, features);
968 auto const alice =
Account(
"alice");
969 auto const bob =
Account(
"bob");
971 auto const USD = gw[
"USD"];
973 env.
fund(
XRP(100000), alice, bob, gw);
974 env(
trust(alice, USD(20)));
976 STAmount tinyAmt1{USD.
issue(), 9000000000000000ll, -17,
false,
978 STAmount tinyAmt3{USD.
issue(), 9000000000000003ll, -17,
false,
981 env(
pay(gw, alice, tinyAmt1));
987 BEAST_EXPECT(!
isOffer(env, gw, USD(0),
XRP(0)));
994 testcase(
"ReexecuteDirectStep");
997 Env env(*
this, features);
999 auto const alice =
Account(
"alice");
1000 auto const bob =
Account(
"bob");
1001 auto const gw =
Account(
"gw");
1002 auto const USD = gw[
"USD"];
1003 auto const usdC = USD.currency;
1005 env.
fund(
XRP(10000), alice, bob, gw);
1007 env(
trust(alice, USD(100)));
1048 testcase(
"ripd1443");
1050 using namespace jtx;
1052 auto const alice =
Account(
"alice");
1053 auto const bob =
Account(
"bob");
1054 auto const carol =
Account(
"carol");
1055 auto const gw =
Account(
"gw");
1058 env.
trust(gw[
"USD"](10000), alice, carol);
1060 env.
trust(gw[
"USD"](10000), bob);
1065 env(
pay(gw, alice, gw[
"USD"](1000)));
1068 env(
offer(alice, bob[
"USD"](1000),
XRP(1)));
1076 env.
trust(bob[
"USD"](10000), alice);
1077 env(
pay(bob, alice, bob[
"USD"](1000)));
1079 env(
offer(alice,
XRP(1000), bob[
"USD"](1000)));
1082 env(
pay (carol, carol, gw[
"USD"](1000)),
path(~bob[
"USD"], gw),
1093 testcase(
"ripd1449");
1095 using namespace jtx;
1102 auto const alice =
Account(
"alice");
1103 auto const bob =
Account(
"bob");
1104 auto const carol =
Account(
"carol");
1105 auto const gw =
Account(
"gw");
1106 auto const USD = gw[
"USD"];
1108 env.
fund(
XRP(100000000), alice, bob, carol, gw);
1110 env.
trust(USD(10000), alice, carol);
1112 env.
trust(USD(10000), bob);
1113 env.
trust(bob[
"USD"](10000), carol);
1116 env(
pay(bob, carol, bob[
"USD"](1000)));
1117 env(
pay(gw, bob, USD(1000)));
1120 env(
offer(carol,
XRP(1), bob[
"USD"](1000)));
1123 env(
pay(alice, alice, USD(1000)),
path(~bob[
"USD"], bob, gw),
1135 testcase (
"Self crossing low quality offer");
1137 using namespace jtx;
1139 Env env(*
this, features);
1141 auto const ann =
Account(
"ann");
1142 auto const gw =
Account(
"gateway");
1143 auto const CTB = gw[
"CTB"];
1145 auto const fee = env.
current ()->fees ().base;
1150 env (
rate(gw, 1.002));
1151 env (
trust(ann, CTB(10)));
1154 env (
pay(gw, ann, CTB(2.856)));
1157 env (
offer(ann,
drops(365611702030), CTB(5.713)));
1161 env (
pay(ann, ann, CTB(0.687)),
1168 testcase(
"Empty Strand");
1169 using namespace jtx;
1171 auto const alice =
Account(
"alice");
1173 Env env(*
this, features);
1177 env(
pay(alice, alice,
1179 path(~alice[
"USD"]),
1186 testcase(
"Circular XRP");
1188 using namespace jtx;
1189 auto const alice =
Account(
"alice");
1190 auto const bob =
Account(
"bob");
1191 auto const gw =
Account(
"gw");
1192 auto const USD = gw[
"USD"];
1193 auto const EUR = gw[
"EUR"];
1195 for (
auto const withFix : {
true,
false})
1204 Env env(*
this, feats);
1205 env.
fund(
XRP(10000), alice, bob, gw);
1206 env.
trust(USD(1000), alice, bob);
1207 env.
trust(EUR(1000), alice, bob);
1208 env(
pay(gw, alice, USD(100)));
1209 env(
pay(gw, alice, EUR(100)));
1217 TER const expectedTer =
1219 env(
pay(alice, bob, EUR(1)),
1230 env.
fund(
XRP(10000), alice, bob, gw);
1231 env.
trust(USD(1000), alice, bob);
1232 env.
trust(EUR(1000), alice, bob);
1233 env(
pay(gw, alice, USD(100)));
1234 env(
pay(gw, alice, EUR(100)));
1241 env(
pay(alice, bob,
XRP(1)),
1250 auto const JPY = gw[
"JPY"];
1252 env.
fund(
XRP(10000), alice, bob, gw);
1254 env.
trust(USD(1000), alice, bob);
1255 env.
trust(EUR(1000), alice, bob);
1256 env.
trust(JPY(1000), alice, bob);
1258 env(
pay(gw, alice, USD(100)));
1259 env(
pay(gw, alice, EUR(100)));
1260 env(
pay(gw, alice, JPY(100)));
1269 env(
pay(alice, bob, JPY(1)),
1279 using namespace jtx;
1305 using namespace jtx;
1317 using namespace jtx;