70 uint32_t
const flags = 0,
71 bool const domainOffer =
false)
73 auto offerInDir = [&](
uint256 const& directory,
74 uint64_t
const pageIndex,
81 if (
domain != (*page)[~sfDomainID])
84 auto const& indexes = page->getFieldV256(sfIndexes);
85 for (
auto const& index : indexes)
97 if (sle->getFieldAmount(sfTakerGets) != takerGets)
99 if (sle->getFieldAmount(sfTakerPays) != takerPays)
101 if (sle->getFlags() !=
flags)
103 if (domainOffer && !sle->isFieldPresent(sfDomainID))
105 if (!domainOffer && sle->isFieldPresent(sfDomainID))
108 sle->getFieldH256(sfBookDirectory),
109 sle->getFieldU64(sfBookNode),
110 (*sle)[~sfDomainID]))
115 if (!sle->isFieldPresent(sfDomainID))
117 if (!sle->isFieldPresent(sfAdditionalBooks))
119 if (sle->getFieldArray(sfAdditionalBooks).size() != 1)
122 auto const& additionalBookDirs =
123 sle->getFieldArray(sfAdditionalBooks);
125 for (
auto const& bookDir : additionalBookDirs)
127 auto const& dirIndex = bookDir.getFieldH256(sfBookDirectory);
128 auto const& dirNode = bookDir.getFieldU64(sfBookNode);
138 if (sle->isFieldPresent(sfAdditionalBooks))
195 Env env(*
this, features - featurePermissionedDEX);
196 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
212 Env env(*
this, features);
213 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
220 env.
trust(USD(1000), devin);
222 env(
pay(gw, devin, USD(100)));
249 Env env(*
this, features);
250 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
257 env.
trust(USD(1000), devin);
259 env(
pay(gw, devin, USD(100)));
263 uint32_t
const t = env.
current()
265 .parentCloseTime.time_since_epoch()
267 jv[sfExpiration.jsonName] = t + 20;
289 Env env(*
this, features);
290 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
293 "F10D0CC9A0F9A3CBF585B80BE09A186483668FDBDD39AA7E3370F3649CE134"
305 Env env(*
this, features);
306 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
310 domainOwner, gw, domainOwner, credType));
313 auto const bobOfferSeq{env.
seq(bob)};
318 checkOffer(env, bob, bobOfferSeq,
XRP(10), USD(10), 0,
true));
324 Env env(*
this, features);
325 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
329 domainOwner, gw, domainOwner, credType));
332 auto const bobOfferSeq{env.
seq(bob)};
337 checkOffer(env, bob, bobOfferSeq, USD(10),
XRP(10), 0,
true));
342 Env env(*
this, features);
343 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
346 auto const bobOfferSeq{env.
seq(bob)};
351 checkOffer(env, bob, bobOfferSeq,
XRP(10), USD(10), 0,
true));
355 env(
offer(carol, USD(10),
XRP(10)));
359 checkOffer(env, bob, bobOfferSeq,
XRP(10), USD(10), 0,
true));
361 auto const aliceOfferSeq{env.
seq(alice)};
365 BEAST_EXPECT(!
offerExists(env, alice, aliceOfferSeq));
372 Env env(*
this, features);
373 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
379 for (
size_t i = 0; i <= 100; i++)
381 auto const bobOfferSeq{env.
seq(bob)};
387 env, bob, bobOfferSeq,
XRP(10), USD(10), 0,
true));
390 for (
auto const offerSeq : offerSeqs)
406 Env env(*
this, features - featurePermissionedDEX);
407 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
410 env(
pay(bob, alice, USD(10)),
423 env(
pay(bob, alice, USD(10)),
432 Env env(*
this, features);
433 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
436 "F10D0CC9A0F9A3CBF585B80BE09A186483668FDBDD39AA7E3370F3649CE134"
439 env(
pay(bob, alice, USD(10)),
449 Env env(*
this, features);
450 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
460 env.
trust(USD(1000), devin);
462 env(
pay(gw, devin, USD(100)));
466 env(
pay(alice, devin, USD(10)),
478 env(
pay(alice, devin, USD(10)),
489 env(
pay(alice, devin, USD(10)),
498 Env env(*
this, features);
499 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
509 env.
trust(USD(1000), devin);
511 env(
pay(gw, devin, USD(100)));
515 env(
pay(devin, alice, USD(10)),
527 env(
pay(devin, alice, USD(10)),
538 env(
pay(devin, alice, USD(10)),
547 Env env(*
this, features);
548 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
555 env(
pay(alice, domainOwner, USD(10)),
565 env(
pay(domainOwner, alice, USD(10)),
580 Env env(*
this, features);
581 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
585 auto const regularOfferSeq{env.
seq(bob)};
591 auto const regularDirKey =
593 BEAST_EXPECT(regularDirKey);
597 env(
pay(alice, carol, USD(10)),
605 auto const domainOfferSeq{env.
seq(bob)};
610 env, bob, domainOfferSeq,
XRP(10), USD(10), 0,
true));
612 auto const domainDirKey =
614 BEAST_EXPECT(domainDirKey);
619 env(
pay(alice, carol, USD(10)),
624 BEAST_EXPECT(!
offerExists(env, bob, domainOfferSeq));
635 Env env(*
this, features);
636 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
639 auto const EUR = gw[
"EUR"];
640 env.
trust(EUR(1000), alice);
642 env.
trust(EUR(1000), bob);
644 env.
trust(EUR(1000), carol);
646 env(
pay(gw, bob, EUR(100)));
650 auto const usdOfferSeq{env.
seq(bob)};
655 checkOffer(env, bob, usdOfferSeq,
XRP(10), USD(10), 0,
true));
658 env(
pay(alice, carol, EUR(10)),
665 checkOffer(env, bob, usdOfferSeq,
XRP(10), USD(10), 0,
true));
668 auto const regularOfferSeq{env.
seq(bob)};
669 env(
offer(bob, USD(10), EUR(10)));
672 checkOffer(env, bob, regularOfferSeq, USD(10), EUR(10)));
676 env(
pay(alice, carol, EUR(10)),
684 auto const eurOfferSeq{env.
seq(bob)};
685 env(
offer(bob, USD(10), EUR(10)),
domain(domainID));
688 checkOffer(env, bob, eurOfferSeq, USD(10), EUR(10), 0,
true));
691 env(
pay(alice, carol, EUR(5)),
700 checkOffer(env, bob, eurOfferSeq, USD(5), EUR(5), 0,
true));
704 env(
pay(alice, carol, EUR(5)),
715 checkOffer(env, bob, regularOfferSeq, USD(10), EUR(10)));
720 Env env(*
this, features);
721 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
725 Account badDomainOwner(
"badDomainOwner");
727 env.
fund(
XRP(1000), badDomainOwner, devin);
729 env.
trust(USD(1000), devin);
731 env(
pay(gw, devin, USD(100)));
734 auto const badCredType =
"badCred";
739 auto const badDomainID = objects.begin()->first;
750 env(
pay(alice, carol, USD(10)),
758 auto const bobOfferSeq{env.
seq(bob)};
762 checkOffer(env, bob, bobOfferSeq,
XRP(10), USD(10), 0,
true));
765 env(
pay(alice, carol, USD(10)),
778 Env env(*
this, features);
779 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
804 Env env(*
this, features);
805 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
812 env.
trust(USD(1000), devin);
814 env(
pay(gw, devin, USD(100)));
818 uint32_t
const t = env.
current()
820 .parentCloseTime.time_since_epoch()
822 jv[sfExpiration.jsonName] = t + 20;
829 auto const offerSeq{env.
seq(devin)};
834 env(
pay(alice, carol, USD(5)),
846 env(
pay(alice, carol, USD(5)),
858 Env env(*
this, features);
859 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
862 auto const offerSeq{env.
seq(bob)};
867 env(
pay(alice, carol, USD(5)),
877 domainOwner, bob, domainOwner, credType));
881 env(
pay(alice, carol, USD(5)),
990 Env env(*
this, features);
991 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
994 auto const aliceOfferSeq{env.
seq(alice)};
998 auto const bobOfferSeq{env.
seq(bob)};
1003 checkOffer(env, bob, bobOfferSeq,
XRP(20), USD(20), 0,
true));
1005 checkOffer(env, alice, aliceOfferSeq,
XRP(100), USD(100), 0,
true));
1008 BEAST_EXPECT(domainDirKey);
1015 env(
pay(gw, carol, USD(10)),
1022 checkOffer(env, bob, bobOfferSeq,
XRP(10), USD(10), 0,
true));
1025 BEAST_EXPECT(!
offerExists(env, alice, aliceOfferSeq));
1063 Env env(*
this, features - featurePermissionedDEX);
1064 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
1088 auto const offerSeq{env.
seq(bob)};
1094 env, bob, offerSeq,
XRP(10), USD(10),
lsfHybrid,
true));
1099 Env env(*
this, features);
1100 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
1103 auto const bobOfferSeq{env.
seq(bob)};
1110 env, bob, bobOfferSeq,
XRP(10), USD(10),
lsfHybrid,
true));
1114 auto const aliceOfferSeq{env.
seq(alice)};
1118 BEAST_EXPECT(!
offerExists(env, alice, aliceOfferSeq));
1119 BEAST_EXPECT(!
offerExists(env, bob, bobOfferSeq));
1125 Env env(*
this, features);
1126 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
1129 auto const bobOfferSeq{env.
seq(bob)};
1138 env, bob, bobOfferSeq,
XRP(10), USD(10),
lsfHybrid,
true));
1140 auto const aliceOfferSeq{env.
seq(alice)};
1141 env(
offer(alice, USD(10),
XRP(10)));
1144 BEAST_EXPECT(!
offerExists(env, alice, aliceOfferSeq));
1145 BEAST_EXPECT(!
offerExists(env, bob, bobOfferSeq));
1152 Env env(*
this, features);
1153 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
1156 auto const bobOfferSeq{env.
seq(bob)};
1161 checkOffer(env, bob, bobOfferSeq,
XRP(10), USD(10), 0,
true));
1165 auto const aliceOfferSeq{env.
seq(alice)};
1166 env(
offer(alice, USD(10),
XRP(10)),
1171 BEAST_EXPECT(!
offerExists(env, alice, aliceOfferSeq));
1172 BEAST_EXPECT(!
offerExists(env, bob, bobOfferSeq));
1179 Env env(*
this, features);
1180 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
1183 auto const bobOfferSeq{env.
seq(bob)};
1188 checkOffer(env, bob, bobOfferSeq,
XRP(10), USD(10), 0,
false));
1192 auto const aliceOfferSeq{env.
seq(alice)};
1193 env(
offer(alice, USD(10),
XRP(10)),
1198 BEAST_EXPECT(
offerExists(env, alice, aliceOfferSeq));
1201 checkOffer(env, bob, bobOfferSeq,
XRP(10), USD(10), 0,
false));
1203 env, alice, aliceOfferSeq, USD(10),
XRP(10),
lsfHybrid,
true));
1216 Env env(*
this, features);
1217 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
1220 auto const hybridOfferSeq{env.
seq(bob)};
1230 env(
pay(alice, carol, USD(5)),
1237 env, bob, hybridOfferSeq,
XRP(50), USD(50),
lsfHybrid,
true));
1241 env(
pay(alice, carol, USD(5)),
1247 env, bob, hybridOfferSeq,
XRP(50), USD(50),
lsfHybrid,
true));
1250 auto const regularOfferSeq{env.
seq(bob)};
1253 BEAST_EXPECT(
offerExists(env, bob, regularOfferSeq));
1254 BEAST_EXPECT(
checkOffer(env, bob, regularOfferSeq,
XRP(10), USD(10)));
1256 auto const sleHybridOffer =
1258 BEAST_EXPECT(sleHybridOffer);
1259 auto const openDir =
1260 sleHybridOffer->getFieldArray(sfAdditionalBooks)[0].getFieldH256(
1269 BEAST_EXPECT(!
offerExists(env, bob, hybridOfferSeq));
1270 BEAST_EXPECT(
checkOffer(env, bob, regularOfferSeq,
XRP(5), USD(5)));
1281 Env env(*
this, features);
1282 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
1285 auto const hybridOfferSeq{env.
seq(bob)};
1291 env(
pay(alice, carol, USD(5)),
1297 env, bob, hybridOfferSeq,
XRP(5), USD(5),
lsfHybrid,
true));
1303 BEAST_EXPECT(!
offerExists(env, bob, hybridOfferSeq));
1309 Env env(*
this, features);
1310 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
1314 Account badDomainOwner(
"badDomainOwner");
1316 env.
fund(
XRP(1000), badDomainOwner, devin);
1319 auto const badCredType =
"badCred";
1324 auto const badDomainID = objects.begin()->first;
1331 auto const hybridOfferSeq{env.
seq(bob)};
1338 env(
pay(devin, badDomainOwner, USD(5)),
1345 env, bob, hybridOfferSeq,
XRP(10), USD(10),
lsfHybrid,
true));
1347 env(
pay(alice, carol, USD(5)),
1353 env, bob, hybridOfferSeq,
XRP(5), USD(5),
lsfHybrid,
true));
1359 BEAST_EXPECT(!
offerExists(env, bob, hybridOfferSeq));
1364 Env env(*
this, features);
1365 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
1368 auto const EUR = gw[
"EUR"];
1369 env.
trust(EUR(1000), alice);
1371 env.
trust(EUR(1000), bob);
1373 env.
trust(EUR(1000), carol);
1375 env(
pay(gw, bob, EUR(100)));
1378 auto const usdOfferSeq{env.
seq(bob)};
1383 checkOffer(env, bob, usdOfferSeq,
XRP(10), USD(10), 0,
true));
1386 env(
pay(alice, carol, EUR(5)),
1393 checkOffer(env, bob, usdOfferSeq,
XRP(10), USD(10), 0,
true));
1396 auto const eurOfferSeq{env.
seq(bob)};
1397 env(
offer(bob, USD(10), EUR(10)),
1402 env, bob, eurOfferSeq, USD(10), EUR(10),
lsfHybrid,
true));
1405 env(
pay(alice, carol, EUR(5)),
1412 checkOffer(env, bob, usdOfferSeq,
XRP(5), USD(5), 0,
true));
1414 env, bob, eurOfferSeq, USD(5), EUR(5),
lsfHybrid,
true));
1419 Env env(*
this, features);
1420 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
1423 auto const EUR = gw[
"EUR"];
1424 env.
trust(EUR(1000), alice);
1426 env.
trust(EUR(1000), bob);
1428 env.
trust(EUR(1000), carol);
1430 env(
pay(gw, bob, EUR(100)));
1434 auto const usdOfferSeq{env.
seq(bob)};
1439 checkOffer(env, bob, usdOfferSeq,
XRP(10), USD(10), 0,
false));
1442 auto const eurOfferSeq{env.
seq(bob)};
1443 env(
offer(bob, USD(10), EUR(10)),
1448 env, bob, eurOfferSeq, USD(10), EUR(10),
lsfHybrid,
true));
1455 checkOffer(env, bob, usdOfferSeq,
XRP(5), USD(5), 0,
false));
1457 env, bob, eurOfferSeq, USD(5), EUR(5),
lsfHybrid,
true));