51 uint32_t
const flags = 0,
52 bool const domainOffer =
false)
54 auto offerInDir = [&](
uint256 const& directory,
55 uint64_t
const pageIndex,
62 if (
domain != (*page)[~sfDomainID])
65 auto const& indexes = page->getFieldV256(sfIndexes);
66 for (
auto const& index : indexes)
78 if (sle->getFieldAmount(sfTakerGets) != takerGets)
80 if (sle->getFieldAmount(sfTakerPays) != takerPays)
82 if (sle->getFlags() !=
flags)
84 if (domainOffer && !sle->isFieldPresent(sfDomainID))
86 if (!domainOffer && sle->isFieldPresent(sfDomainID))
89 sle->getFieldH256(sfBookDirectory),
90 sle->getFieldU64(sfBookNode),
96 if (!sle->isFieldPresent(sfDomainID))
98 if (!sle->isFieldPresent(sfAdditionalBooks))
100 if (sle->getFieldArray(sfAdditionalBooks).size() != 1)
103 auto const& additionalBookDirs =
104 sle->getFieldArray(sfAdditionalBooks);
106 for (
auto const& bookDir : additionalBookDirs)
108 auto const& dirIndex = bookDir.getFieldH256(sfBookDirectory);
109 auto const& dirNode = bookDir.getFieldU64(sfBookNode);
119 if (sle->isFieldPresent(sfAdditionalBooks))
176 Env env(*
this, features - featurePermissionedDEX);
177 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
193 Env env(*
this, features);
194 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
201 env.
trust(USD(1000), devin);
203 env(
pay(gw, devin, USD(100)));
230 Env env(*
this, features);
231 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
238 env.
trust(USD(1000), devin);
240 env(
pay(gw, devin, USD(100)));
244 uint32_t
const t = env.
current()
246 .parentCloseTime.time_since_epoch()
248 jv[sfExpiration.jsonName] = t + 20;
270 Env env(*
this, features);
271 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
274 "F10D0CC9A0F9A3CBF585B80BE09A186483668FDBDD39AA7E3370F3649CE134"
286 Env env(*
this, features);
287 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
291 domainOwner, gw, domainOwner, credType));
294 auto const bobOfferSeq{env.
seq(bob)};
299 checkOffer(env, bob, bobOfferSeq,
XRP(10), USD(10), 0,
true));
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, USD(10),
XRP(10), 0,
true));
323 Env env(*
this, features);
324 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
327 auto const bobOfferSeq{env.
seq(bob)};
332 checkOffer(env, bob, bobOfferSeq,
XRP(10), USD(10), 0,
true));
336 env(
offer(carol, USD(10),
XRP(10)));
340 checkOffer(env, bob, bobOfferSeq,
XRP(10), USD(10), 0,
true));
342 auto const aliceOfferSeq{env.
seq(alice)};
346 BEAST_EXPECT(!
offerExists(env, alice, aliceOfferSeq));
353 Env env(*
this, features);
354 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
360 for (
size_t i = 0; i <= 100; i++)
362 auto const bobOfferSeq{env.
seq(bob)};
368 env, bob, bobOfferSeq,
XRP(10), USD(10), 0,
true));
371 for (
auto const offerSeq : offerSeqs)
387 Env env(*
this, features - featurePermissionedDEX);
388 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
391 env(
pay(bob, alice, USD(10)),
404 env(
pay(bob, alice, USD(10)),
413 Env env(*
this, features);
414 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
417 "F10D0CC9A0F9A3CBF585B80BE09A186483668FDBDD39AA7E3370F3649CE134"
420 env(
pay(bob, alice, USD(10)),
430 Env env(*
this, features);
431 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
441 env.
trust(USD(1000), devin);
443 env(
pay(gw, devin, USD(100)));
447 env(
pay(alice, devin, USD(10)),
459 env(
pay(alice, devin, USD(10)),
470 env(
pay(alice, devin, USD(10)),
479 Env env(*
this, features);
480 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
490 env.
trust(USD(1000), devin);
492 env(
pay(gw, devin, USD(100)));
496 env(
pay(devin, alice, USD(10)),
508 env(
pay(devin, alice, USD(10)),
519 env(
pay(devin, alice, USD(10)),
528 Env env(*
this, features);
529 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
536 env(
pay(alice, domainOwner, USD(10)),
546 env(
pay(domainOwner, alice, USD(10)),
561 Env env(*
this, features);
562 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
566 auto const regularOfferSeq{env.
seq(bob)};
572 auto const regularDirKey =
574 BEAST_EXPECT(regularDirKey);
578 env(
pay(alice, carol, USD(10)),
586 auto const domainOfferSeq{env.
seq(bob)};
591 env, bob, domainOfferSeq,
XRP(10), USD(10), 0,
true));
593 auto const domainDirKey =
595 BEAST_EXPECT(domainDirKey);
600 env(
pay(alice, carol, USD(10)),
605 BEAST_EXPECT(!
offerExists(env, bob, domainOfferSeq));
616 Env env(*
this, features);
617 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
620 auto const EUR = gw[
"EUR"];
621 env.
trust(EUR(1000), alice);
623 env.
trust(EUR(1000), bob);
625 env.
trust(EUR(1000), carol);
627 env(
pay(gw, bob, EUR(100)));
631 auto const usdOfferSeq{env.
seq(bob)};
636 checkOffer(env, bob, usdOfferSeq,
XRP(10), USD(10), 0,
true));
639 env(
pay(alice, carol, EUR(10)),
646 checkOffer(env, bob, usdOfferSeq,
XRP(10), USD(10), 0,
true));
649 auto const regularOfferSeq{env.
seq(bob)};
650 env(
offer(bob, USD(10), EUR(10)));
653 checkOffer(env, bob, regularOfferSeq, USD(10), EUR(10)));
657 env(
pay(alice, carol, EUR(10)),
665 auto const eurOfferSeq{env.
seq(bob)};
666 env(
offer(bob, USD(10), EUR(10)),
domain(domainID));
669 checkOffer(env, bob, eurOfferSeq, USD(10), EUR(10), 0,
true));
672 env(
pay(alice, carol, EUR(5)),
681 checkOffer(env, bob, eurOfferSeq, USD(5), EUR(5), 0,
true));
685 env(
pay(alice, carol, EUR(5)),
696 checkOffer(env, bob, regularOfferSeq, USD(10), EUR(10)));
701 Env env(*
this, features);
702 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
706 Account badDomainOwner(
"badDomainOwner");
708 env.
fund(
XRP(1000), badDomainOwner, devin);
710 env.
trust(USD(1000), devin);
712 env(
pay(gw, devin, USD(100)));
715 auto const badCredType =
"badCred";
720 auto const badDomainID = objects.begin()->first;
731 env(
pay(alice, carol, USD(10)),
739 auto const bobOfferSeq{env.
seq(bob)};
743 checkOffer(env, bob, bobOfferSeq,
XRP(10), USD(10), 0,
true));
746 env(
pay(alice, carol, USD(10)),
759 Env env(*
this, features);
760 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
785 Env env(*
this, features);
786 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
793 env.
trust(USD(1000), devin);
795 env(
pay(gw, devin, USD(100)));
799 uint32_t
const t = env.
current()
801 .parentCloseTime.time_since_epoch()
803 jv[sfExpiration.jsonName] = t + 20;
810 auto const offerSeq{env.
seq(devin)};
815 env(
pay(alice, carol, USD(5)),
827 env(
pay(alice, carol, USD(5)),
839 Env env(*
this, features);
840 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
843 auto const offerSeq{env.
seq(bob)};
848 env(
pay(alice, carol, USD(5)),
858 domainOwner, bob, domainOwner, credType));
862 env(
pay(alice, carol, USD(5)),
971 Env env(*
this, features);
972 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
975 auto const aliceOfferSeq{env.
seq(alice)};
979 auto const bobOfferSeq{env.
seq(bob)};
984 checkOffer(env, bob, bobOfferSeq,
XRP(20), USD(20), 0,
true));
986 checkOffer(env, alice, aliceOfferSeq,
XRP(100), USD(100), 0,
true));
989 BEAST_EXPECT(domainDirKey);
996 env(
pay(gw, carol, USD(10)),
1003 checkOffer(env, bob, bobOfferSeq,
XRP(10), USD(10), 0,
true));
1006 BEAST_EXPECT(!
offerExists(env, alice, aliceOfferSeq));
1044 Env env(*
this, features - featurePermissionedDEX);
1045 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
1069 auto const offerSeq{env.
seq(bob)};
1075 env, bob, offerSeq,
XRP(10), USD(10),
lsfHybrid,
true));
1080 Env env(*
this, features);
1081 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
1084 auto const bobOfferSeq{env.
seq(bob)};
1091 env, bob, bobOfferSeq,
XRP(10), USD(10),
lsfHybrid,
true));
1095 auto const aliceOfferSeq{env.
seq(alice)};
1099 BEAST_EXPECT(!
offerExists(env, alice, aliceOfferSeq));
1100 BEAST_EXPECT(!
offerExists(env, bob, bobOfferSeq));
1106 Env env(*
this, features);
1107 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
1110 auto const bobOfferSeq{env.
seq(bob)};
1119 env, bob, bobOfferSeq,
XRP(10), USD(10),
lsfHybrid,
true));
1121 auto const aliceOfferSeq{env.
seq(alice)};
1122 env(
offer(alice, USD(10),
XRP(10)));
1125 BEAST_EXPECT(!
offerExists(env, alice, aliceOfferSeq));
1126 BEAST_EXPECT(!
offerExists(env, bob, bobOfferSeq));
1133 Env env(*
this, features);
1134 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
1137 auto const bobOfferSeq{env.
seq(bob)};
1142 checkOffer(env, bob, bobOfferSeq,
XRP(10), USD(10), 0,
true));
1146 auto const aliceOfferSeq{env.
seq(alice)};
1147 env(
offer(alice, USD(10),
XRP(10)),
1152 BEAST_EXPECT(!
offerExists(env, alice, aliceOfferSeq));
1153 BEAST_EXPECT(!
offerExists(env, bob, bobOfferSeq));
1160 Env env(*
this, features);
1161 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
1164 auto const bobOfferSeq{env.
seq(bob)};
1169 checkOffer(env, bob, bobOfferSeq,
XRP(10), USD(10), 0,
false));
1173 auto const aliceOfferSeq{env.
seq(alice)};
1174 env(
offer(alice, USD(10),
XRP(10)),
1179 BEAST_EXPECT(
offerExists(env, alice, aliceOfferSeq));
1182 checkOffer(env, bob, bobOfferSeq,
XRP(10), USD(10), 0,
false));
1184 env, alice, aliceOfferSeq, USD(10),
XRP(10),
lsfHybrid,
true));
1197 Env env(*
this, features);
1198 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
1201 auto const hybridOfferSeq{env.
seq(bob)};
1211 env(
pay(alice, carol, USD(5)),
1218 env, bob, hybridOfferSeq,
XRP(50), USD(50),
lsfHybrid,
true));
1222 env(
pay(alice, carol, USD(5)),
1228 env, bob, hybridOfferSeq,
XRP(50), USD(50),
lsfHybrid,
true));
1231 auto const regularOfferSeq{env.
seq(bob)};
1234 BEAST_EXPECT(
offerExists(env, bob, regularOfferSeq));
1235 BEAST_EXPECT(
checkOffer(env, bob, regularOfferSeq,
XRP(10), USD(10)));
1237 auto const sleHybridOffer =
1239 BEAST_EXPECT(sleHybridOffer);
1240 auto const openDir =
1241 sleHybridOffer->getFieldArray(sfAdditionalBooks)[0].getFieldH256(
1250 BEAST_EXPECT(!
offerExists(env, bob, hybridOfferSeq));
1251 BEAST_EXPECT(
checkOffer(env, bob, regularOfferSeq,
XRP(5), USD(5)));
1262 Env env(*
this, features);
1263 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
1266 auto const hybridOfferSeq{env.
seq(bob)};
1272 env(
pay(alice, carol, USD(5)),
1278 env, bob, hybridOfferSeq,
XRP(5), USD(5),
lsfHybrid,
true));
1284 BEAST_EXPECT(!
offerExists(env, bob, hybridOfferSeq));
1290 Env env(*
this, features);
1291 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
1295 Account badDomainOwner(
"badDomainOwner");
1297 env.
fund(
XRP(1000), badDomainOwner, devin);
1300 auto const badCredType =
"badCred";
1305 auto const badDomainID = objects.begin()->first;
1312 auto const hybridOfferSeq{env.
seq(bob)};
1319 env(
pay(devin, badDomainOwner, USD(5)),
1326 env, bob, hybridOfferSeq,
XRP(10), USD(10),
lsfHybrid,
true));
1328 env(
pay(alice, carol, USD(5)),
1334 env, bob, hybridOfferSeq,
XRP(5), USD(5),
lsfHybrid,
true));
1340 BEAST_EXPECT(!
offerExists(env, bob, hybridOfferSeq));
1345 Env env(*
this, features);
1346 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
1349 auto const EUR = gw[
"EUR"];
1350 env.
trust(EUR(1000), alice);
1352 env.
trust(EUR(1000), bob);
1354 env.
trust(EUR(1000), carol);
1356 env(
pay(gw, bob, EUR(100)));
1359 auto const usdOfferSeq{env.
seq(bob)};
1364 checkOffer(env, bob, usdOfferSeq,
XRP(10), USD(10), 0,
true));
1367 env(
pay(alice, carol, EUR(5)),
1374 checkOffer(env, bob, usdOfferSeq,
XRP(10), USD(10), 0,
true));
1377 auto const eurOfferSeq{env.
seq(bob)};
1378 env(
offer(bob, USD(10), EUR(10)),
1383 env, bob, eurOfferSeq, USD(10), EUR(10),
lsfHybrid,
true));
1386 env(
pay(alice, carol, EUR(5)),
1393 checkOffer(env, bob, usdOfferSeq,
XRP(5), USD(5), 0,
true));
1395 env, bob, eurOfferSeq, USD(5), EUR(5),
lsfHybrid,
true));
1400 Env env(*
this, features);
1401 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
1404 auto const EUR = gw[
"EUR"];
1405 env.
trust(EUR(1000), alice);
1407 env.
trust(EUR(1000), bob);
1409 env.
trust(EUR(1000), carol);
1411 env(
pay(gw, bob, EUR(100)));
1415 auto const usdOfferSeq{env.
seq(bob)};
1420 checkOffer(env, bob, usdOfferSeq,
XRP(10), USD(10), 0,
false));
1423 auto const eurOfferSeq{env.
seq(bob)};
1424 env(
offer(bob, USD(10), EUR(10)),
1429 env, bob, eurOfferSeq, USD(10), EUR(10),
lsfHybrid,
true));
1436 checkOffer(env, bob, usdOfferSeq,
XRP(5), USD(5), 0,
false));
1438 env, bob, eurOfferSeq, USD(5), EUR(5),
lsfHybrid,
true));