50 uint32_t
const flags = 0,
51 bool const domainOffer =
false)
53 auto offerInDir = [&](
uint256 const& directory,
54 uint64_t
const pageIndex,
60 if (
domain != (*page)[~sfDomainID])
63 auto const& indexes = page->getFieldV256(sfIndexes);
64 for (
auto const& index : indexes)
76 if (sle->getFieldAmount(sfTakerGets) != takerGets)
78 if (sle->getFieldAmount(sfTakerPays) != takerPays)
80 if (sle->getFlags() !=
flags)
82 if (domainOffer && !sle->isFieldPresent(sfDomainID))
84 if (!domainOffer && sle->isFieldPresent(sfDomainID))
87 sle->getFieldH256(sfBookDirectory),
88 sle->getFieldU64(sfBookNode),
92 if (sle->isFlag(lsfHybrid))
94 if (!sle->isFieldPresent(sfDomainID))
96 if (!sle->isFieldPresent(sfAdditionalBooks))
98 if (sle->getFieldArray(sfAdditionalBooks).size() != 1)
101 auto const& additionalBookDirs = sle->getFieldArray(sfAdditionalBooks);
103 for (
auto const& bookDir : additionalBookDirs)
105 auto const& dirIndex = bookDir.getFieldH256(sfBookDirectory);
106 auto const& dirNode = bookDir.getFieldU64(sfBookNode);
116 if (sle->isFieldPresent(sfAdditionalBooks))
166 Env env(*
this, features - featurePermissionedDEX);
167 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
181 Env env(*
this, features);
182 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
189 env.
trust(USD(1000), devin);
191 env(
pay(gw, devin, USD(100)));
214 Env env(*
this, features);
215 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
222 env.
trust(USD(1000), devin);
224 env(
pay(gw, devin, USD(100)));
228 uint32_t
const t = env.
current()->header().parentCloseTime.time_since_epoch().count();
229 jv[sfExpiration.jsonName] = t + 20;
249 Env env(*
this, features);
250 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
253 "F10D0CC9A0F9A3CBF585B80BE09A186483668FDBDD39AA7E3370F3649CE134"
263 Env env(*
this, features);
264 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
270 auto const bobOfferSeq{env.
seq(bob)};
274 BEAST_EXPECT(
checkOffer(env, bob, bobOfferSeq,
XRP(10), USD(10), 0,
true));
280 Env env(*
this, features);
281 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
287 auto const bobOfferSeq{env.
seq(bob)};
291 BEAST_EXPECT(
checkOffer(env, bob, bobOfferSeq, USD(10),
XRP(10), 0,
true));
296 Env env(*
this, features);
297 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
300 auto const bobOfferSeq{env.
seq(bob)};
304 BEAST_EXPECT(
checkOffer(env, bob, bobOfferSeq,
XRP(10), USD(10), 0,
true));
308 env(
offer(carol, USD(10),
XRP(10)));
311 BEAST_EXPECT(
checkOffer(env, bob, bobOfferSeq,
XRP(10), USD(10), 0,
true));
313 auto const aliceOfferSeq{env.
seq(alice)};
317 BEAST_EXPECT(!
offerExists(env, alice, aliceOfferSeq));
324 Env env(*
this, features);
325 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
331 for (
size_t i = 0; i <= 100; i++)
333 auto const bobOfferSeq{env.
seq(bob)};
338 BEAST_EXPECT(
checkOffer(env, bob, bobOfferSeq,
XRP(10), USD(10), 0,
true));
341 for (
auto const offerSeq : offerSeqs)
357 Env env(*
this, features - featurePermissionedDEX);
358 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
361 env(
pay(bob, alice, USD(10)),
380 Env env(*
this, features);
381 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
384 "F10D0CC9A0F9A3CBF585B80BE09A186483668FDBDD39AA7E3370F3649CE134"
387 env(
pay(bob, alice, USD(10)),
397 Env env(*
this, features);
398 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
408 env.
trust(USD(1000), devin);
410 env(
pay(gw, devin, USD(100)));
414 env(
pay(alice, devin, USD(10)),
426 env(
pay(alice, devin, USD(10)),
443 Env env(*
this, features);
444 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
454 env.
trust(USD(1000), devin);
456 env(
pay(gw, devin, USD(100)));
460 env(
pay(devin, alice, USD(10)),
472 env(
pay(devin, alice, USD(10)),
489 Env env(*
this, features);
490 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
516 Env env(*
this, features);
517 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
521 auto const regularOfferSeq{env.
seq(bob)};
524 BEAST_EXPECT(
checkOffer(env, bob, regularOfferSeq,
XRP(10), USD(10)));
527 BEAST_EXPECT(regularDirKey);
529 env, *regularDirKey, 1));
532 env(
pay(alice, carol, USD(10)),
540 auto const domainOfferSeq{env.
seq(bob)};
544 BEAST_EXPECT(
checkOffer(env, bob, domainOfferSeq,
XRP(10), USD(10), 0,
true));
547 BEAST_EXPECT(domainDirKey);
549 env, *domainDirKey, 1));
555 BEAST_EXPECT(!
offerExists(env, bob, domainOfferSeq));
556 BEAST_EXPECT(
checkOffer(env, bob, regularOfferSeq,
XRP(10), USD(10)));
560 env, *domainDirKey, 0));
562 env, *regularDirKey, 1));
567 Env env(*
this, features);
568 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
571 auto const EUR = gw[
"EUR"];
572 env.
trust(EUR(1000), alice);
574 env.
trust(EUR(1000), bob);
576 env.
trust(EUR(1000), carol);
578 env(
pay(gw, bob, EUR(100)));
582 auto const usdOfferSeq{env.
seq(bob)};
586 BEAST_EXPECT(
checkOffer(env, bob, usdOfferSeq,
XRP(10), USD(10), 0,
true));
589 env(
pay(alice, carol, EUR(10)),
595 BEAST_EXPECT(
checkOffer(env, bob, usdOfferSeq,
XRP(10), USD(10), 0,
true));
598 auto const regularOfferSeq{env.
seq(bob)};
599 env(
offer(bob, USD(10), EUR(10)));
601 BEAST_EXPECT(
checkOffer(env, bob, regularOfferSeq, USD(10), EUR(10)));
605 env(
pay(alice, carol, EUR(10)),
613 auto const eurOfferSeq{env.
seq(bob)};
614 env(
offer(bob, USD(10), EUR(10)),
domain(domainID));
616 BEAST_EXPECT(
checkOffer(env, bob, eurOfferSeq, USD(10), EUR(10), 0,
true));
622 BEAST_EXPECT(
checkOffer(env, bob, usdOfferSeq,
XRP(5), USD(5), 0,
true));
623 BEAST_EXPECT(
checkOffer(env, bob, eurOfferSeq, USD(5), EUR(5), 0,
true));
634 BEAST_EXPECT(
checkOffer(env, bob, regularOfferSeq, USD(10), EUR(10)));
639 Env env(*
this, features);
640 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
644 Account badDomainOwner(
"badDomainOwner");
646 env.
fund(
XRP(1000), badDomainOwner, devin);
648 env.
trust(USD(1000), devin);
650 env(
pay(gw, devin, USD(100)));
653 auto const badCredType =
"badCred";
658 auto const badDomainID = objects.begin()->first;
669 env(
pay(alice, carol, USD(10)),
677 auto const bobOfferSeq{env.
seq(bob)};
680 BEAST_EXPECT(
checkOffer(env, bob, bobOfferSeq,
XRP(10), USD(10), 0,
true));
693 Env env(*
this, features);
694 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
719 Env env(*
this, features);
720 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
727 env.
trust(USD(1000), devin);
729 env(
pay(gw, devin, USD(100)));
733 uint32_t
const t = env.
current()->header().parentCloseTime.time_since_epoch().count();
734 jv[sfExpiration.jsonName] = t + 20;
741 auto const offerSeq{env.
seq(devin)};
748 BEAST_EXPECT(
checkOffer(env, devin, offerSeq,
XRP(5), USD(5), 0,
true));
754 env(
pay(alice, carol, USD(5)),
760 BEAST_EXPECT(
checkOffer(env, devin, offerSeq,
XRP(5), USD(5), 0,
true));
765 Env env(*
this, features);
766 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
769 auto const offerSeq{env.
seq(bob)};
776 BEAST_EXPECT(
checkOffer(env, bob, offerSeq,
XRP(5), USD(5), 0,
true));
783 env(
pay(alice, carol, USD(5)),
789 BEAST_EXPECT(
checkOffer(env, bob, offerSeq,
XRP(5), USD(5), 0,
true));
949 Env env(*
this, features - featurePermissionedDEX);
950 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
970 auto const offerSeq{env.
seq(bob)};
973 BEAST_EXPECT(
checkOffer(env, bob, offerSeq,
XRP(10), USD(10), lsfHybrid,
true));
978 Env env(*
this, features);
979 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
982 auto const bobOfferSeq{env.
seq(bob)};
986 BEAST_EXPECT(
checkOffer(env, bob, bobOfferSeq,
XRP(10), USD(10), lsfHybrid,
true));
990 auto const aliceOfferSeq{env.
seq(alice)};
994 BEAST_EXPECT(!
offerExists(env, alice, aliceOfferSeq));
1001 Env env(*
this, features);
1002 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
1005 auto const bobOfferSeq{env.
seq(bob)};
1011 BEAST_EXPECT(
checkOffer(env, bob, bobOfferSeq,
XRP(10), USD(10), lsfHybrid,
true));
1013 auto const aliceOfferSeq{env.
seq(alice)};
1014 env(
offer(alice, USD(10),
XRP(10)));
1017 BEAST_EXPECT(!
offerExists(env, alice, aliceOfferSeq));
1018 BEAST_EXPECT(!
offerExists(env, bob, bobOfferSeq));
1025 Env env(*
this, features);
1026 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
1029 auto const bobOfferSeq{env.
seq(bob)};
1033 BEAST_EXPECT(
checkOffer(env, bob, bobOfferSeq,
XRP(10), USD(10), 0,
true));
1037 auto const aliceOfferSeq{env.
seq(alice)};
1041 BEAST_EXPECT(!
offerExists(env, alice, aliceOfferSeq));
1042 BEAST_EXPECT(!
offerExists(env, bob, bobOfferSeq));
1049 Env env(*
this, features);
1050 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
1053 auto const bobOfferSeq{env.
seq(bob)};
1057 BEAST_EXPECT(
checkOffer(env, bob, bobOfferSeq,
XRP(10), USD(10), 0,
false));
1061 auto const aliceOfferSeq{env.
seq(alice)};
1065 BEAST_EXPECT(
offerExists(env, alice, aliceOfferSeq));
1067 BEAST_EXPECT(
checkOffer(env, bob, bobOfferSeq,
XRP(10), USD(10), 0,
false));
1068 BEAST_EXPECT(
checkOffer(env, alice, aliceOfferSeq, USD(10),
XRP(10), lsfHybrid,
true));
1081 Env env(*
this, features);
1082 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
1085 auto const hybridOfferSeq{env.
seq(bob)};
1095 env(
pay(alice, carol, USD(5)),
1101 BEAST_EXPECT(
checkOffer(env, bob, hybridOfferSeq,
XRP(50), USD(50), lsfHybrid,
true));
1107 BEAST_EXPECT(
checkOffer(env, bob, hybridOfferSeq,
XRP(50), USD(50), lsfHybrid,
true));
1110 auto const regularOfferSeq{env.
seq(bob)};
1113 BEAST_EXPECT(
offerExists(env, bob, regularOfferSeq));
1114 BEAST_EXPECT(
checkOffer(env, bob, regularOfferSeq,
XRP(10), USD(10)));
1116 auto const sleHybridOffer = env.
le(
keylet::offer(bob.id(), hybridOfferSeq));
1117 BEAST_EXPECT(sleHybridOffer);
1118 auto const openDir =
1119 sleHybridOffer->getFieldArray(sfAdditionalBooks)[0].getFieldH256(sfBookDirectory);
1127 BEAST_EXPECT(!
offerExists(env, bob, hybridOfferSeq));
1128 BEAST_EXPECT(
checkOffer(env, bob, regularOfferSeq,
XRP(5), USD(5)));
1139 Env env(*
this, features);
1140 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
1143 auto const hybridOfferSeq{env.
seq(bob)};
1149 BEAST_EXPECT(
checkOffer(env, bob, hybridOfferSeq,
XRP(5), USD(5), lsfHybrid,
true));
1155 BEAST_EXPECT(!
offerExists(env, bob, hybridOfferSeq));
1161 Env env(*
this, features);
1162 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
1166 Account badDomainOwner(
"badDomainOwner");
1168 env.
fund(
XRP(1000), badDomainOwner, devin);
1171 auto const badCredType =
"badCred";
1176 auto const badDomainID = objects.begin()->first;
1183 auto const hybridOfferSeq{env.
seq(bob)};
1188 env(
pay(devin, badDomainOwner, USD(5)),
1194 BEAST_EXPECT(
checkOffer(env, bob, hybridOfferSeq,
XRP(10), USD(10), lsfHybrid,
true));
1198 BEAST_EXPECT(
checkOffer(env, bob, hybridOfferSeq,
XRP(5), USD(5), lsfHybrid,
true));
1204 BEAST_EXPECT(!
offerExists(env, bob, hybridOfferSeq));
1209 Env env(*
this, features);
1210 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
1213 auto const EUR = gw[
"EUR"];
1214 env.
trust(EUR(1000), alice);
1216 env.
trust(EUR(1000), bob);
1218 env.
trust(EUR(1000), carol);
1220 env(
pay(gw, bob, EUR(100)));
1223 auto const usdOfferSeq{env.
seq(bob)};
1227 BEAST_EXPECT(
checkOffer(env, bob, usdOfferSeq,
XRP(10), USD(10), 0,
true));
1230 env(
pay(alice, carol, EUR(5)),
1236 BEAST_EXPECT(
checkOffer(env, bob, usdOfferSeq,
XRP(10), USD(10), 0,
true));
1239 auto const eurOfferSeq{env.
seq(bob)};
1242 BEAST_EXPECT(
checkOffer(env, bob, eurOfferSeq, USD(10), EUR(10), lsfHybrid,
true));
1248 BEAST_EXPECT(
checkOffer(env, bob, usdOfferSeq,
XRP(5), USD(5), 0,
true));
1249 BEAST_EXPECT(
checkOffer(env, bob, eurOfferSeq, USD(5), EUR(5), lsfHybrid,
true));
1254 Env env(*
this, features);
1255 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
1258 auto const EUR = gw[
"EUR"];
1259 env.
trust(EUR(1000), alice);
1261 env.
trust(EUR(1000), bob);
1263 env.
trust(EUR(1000), carol);
1265 env(
pay(gw, bob, EUR(100)));
1269 auto const usdOfferSeq{env.
seq(bob)};
1273 BEAST_EXPECT(
checkOffer(env, bob, usdOfferSeq,
XRP(10), USD(10), 0,
false));
1276 auto const eurOfferSeq{env.
seq(bob)};
1279 BEAST_EXPECT(
checkOffer(env, bob, eurOfferSeq, USD(10), EUR(10), lsfHybrid,
true));
1285 BEAST_EXPECT(
checkOffer(env, bob, usdOfferSeq,
XRP(5), USD(5), 0,
false));
1286 BEAST_EXPECT(
checkOffer(env, bob, eurOfferSeq, USD(5), EUR(5), lsfHybrid,
true));