21#include <test/jtx/AMM.h>
22#include <test/jtx/AMMTest.h>
24#include <xrpld/app/tx/detail/PermissionedDomainSet.h>
25#include <xrpld/ledger/ApplyViewImpl.h>
27#include <xrpl/basics/Blob.h>
28#include <xrpl/basics/Slice.h>
29#include <xrpl/beast/unit_test/suite.h>
30#include <xrpl/protocol/Feature.h>
31#include <xrpl/protocol/IOUAmount.h>
32#include <xrpl/protocol/Indexes.h>
33#include <xrpl/protocol/Issue.h>
34#include <xrpl/protocol/Keylet.h>
35#include <xrpl/protocol/LedgerFormats.h>
36#include <xrpl/protocol/STAmount.h>
37#include <xrpl/protocol/TER.h>
38#include <xrpl/protocol/TxFlags.h>
39#include <xrpl/protocol/jss.h>
60 return static_cast<bool>(env.
le(
keylet::offer(account.id(), offerSeq)));
70 uint32_t
const flags = 0,
71 bool const domainOffer =
false)
73 auto offerInDir = [&](
uint256 const& directory,
74 uint64_t
const pageIndex,
76 std::nullopt) ->
bool {
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);
132 if (!offerInDir(dirIndex, dirNode, std::nullopt))
138 if (sle->isFieldPresent(sfAdditionalBooks))
163 return Keylet(ltDIR_NODE, (*sle)[sfBookDirectory]).
key;
180 pageIndex = (*page)[~sfIndexNext];
181 dirCnt += (*page)[sfIndexes].size();
183 }
while (pageIndex.value_or(0));
185 return dirCnt == dirSize;
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)),
900 Env env(*
this, features);
901 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
904 auto const EURA = alice[
"EUR"];
905 auto const EURB = bob[
"EUR"];
907 env.
trust(EURA(100), bob);
908 env.
trust(EURB(100), carol);
926 env(
pay(alice, carol, EURB(5)),
937 testcase(
"Offer token issuer in domain");
941 Env env(*
this, features);
942 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
946 auto const bobOffer1Seq{env.
seq(bob)};
951 auto const bobOffer2Seq{env.
seq(bob)};
956 checkOffer(env, bob, bobOffer1Seq,
XRP(10), USD(10), 0,
true));
958 env, bob, bobOffer2Seq, USD(10),
XRP(10),
lsfPassive,
true));
966 env(
pay(alice, carol, USD(10)),
971 BEAST_EXPECT(!
offerExists(env, bob, bobOffer1Seq));
975 env(
pay(alice, carol,
XRP(10)),
980 BEAST_EXPECT(!
offerExists(env, bob, bobOffer2Seq));
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));
1034 Env env(*
this, features);
1035 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
1037 AMM amm(env, alice,
XRP(10), USD(50));
1040 env(
pay(bob, carol, USD(5)),
1052 auto [xrp, usd, lpt] = amm.balances(
XRP, USD);
1053 BEAST_EXPECT(usd == USD(45));
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));
1464 Env env(*
this, features);
1465 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
1477 size_t dirCnt = 100;
1479 for (
size_t i = 1; i <= dirCnt; i++)
1481 auto const bobOfferSeq{env.
seq(bob)};
1489 BEAST_EXPECT(sleOffer);
1490 BEAST_EXPECT(sleOffer->getFieldH256(sfBookDirectory) == domainDir);
1492 sleOffer->getFieldArray(sfAdditionalBooks).size() == 1);
1494 sleOffer->getFieldArray(sfAdditionalBooks)[0].getFieldH256(
1495 sfBookDirectory) == openDir);
1498 env, bob, bobOfferSeq,
XRP(10), USD(10),
lsfHybrid,
true));
1503 for (
auto const offerSeq : offerSeqs)
1519 Env env(*
this, features);
1520 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
1522 auto const EUR = gw[
"EUR"];
1524 for (
auto const& account : {alice, bob, carol})
1526 env(
trust(account, EUR(10000)));
1530 env(
pay(gw, carol, EUR(1)));
1533 auto const aliceOfferSeq{env.
seq(alice)};
1534 auto const bobOfferSeq{env.
seq(bob)};
1541 auto const carolOfferSeq{env.
seq(carol)};
1542 env(
offer(carol, USD(1), EUR(1)),
domain(domainID));
1545 BEAST_EXPECT(!
offerExists(env, bob, aliceOfferSeq));
1546 BEAST_EXPECT(!
offerExists(env, bob, bobOfferSeq));
1547 BEAST_EXPECT(!
offerExists(env, bob, carolOfferSeq));
testcase_t testcase
Memberspace for declaring test cases.
A currency issued by an account.
void testOfferTokenIssuerInDomain(FeatureBitset features)
void testPayment(FeatureBitset features)
void testRippling(FeatureBitset features)
bool checkOffer(Env const &env, Account const &account, std::uint32_t offerSeq, STAmount const &takerPays, STAmount const &takerGets, uint32_t const flags=0, bool const domainOffer=false)
void testOfferCreate(FeatureBitset features)
void testHybridBookStep(FeatureBitset features)
bool checkDirectorySize(Env const &env, uint256 directory, std::uint32_t dirSize)
void run() override
Runs the suite.
void testHybridOfferCreate(FeatureBitset features)
void testAutoBridge(FeatureBitset features)
std::optional< uint256 > getDefaultOfferDirKey(Env const &env, Account const &account, std::uint32_t offerSeq)
void testBookStep(FeatureBitset features)
void testHybridOfferDirectories(FeatureBitset features)
bool offerExists(Env const &env, Account const &account, std::uint32_t offerSeq)
uint256 getBookDirKey(Book const &book, STAmount const &takerPays, STAmount const &takerGets)
void testHybridInvalidOffer(FeatureBitset features)
void testRemoveUnfundedOffer(FeatureBitset features)
void testAmmNotUsed(FeatureBitset features)
Convenience class to test AMM functionality.
Immutable cryptographic account descriptor.
A transaction testing environment.
std::uint32_t seq(Account const &account) const
Returns the next sequence number on account.
void require(Args const &... args)
Check a set of requirements.
std::shared_ptr< OpenView const > current() const
Returns the current ledger.
bool close(NetClock::time_point closeTime, std::optional< std::chrono::milliseconds > consensusDelay=std::nullopt)
Close and advance the ledger.
void trust(STAmount const &amount, Account const &account)
Establish trust lines.
void enableFeature(uint256 const feature)
void fund(bool setDefaultRipple, STAmount const &amount, Account const &account)
std::shared_ptr< SLE const > le(Account const &account) const
Return an account root.
Set Paths, SendMax on a JTx.
Sets the SendMax on a JTx.
Set the expected result code for a JTx The test will fail if the code doesn't match.
T emplace_back(T... args)
Keylet quality(Keylet const &k, std::uint64_t q) noexcept
The initial directory page for a specific quality.
Keylet page(uint256 const &root, std::uint64_t index=0) noexcept
A page in a directory.
Keylet offer(AccountID const &id, std::uint32_t seq) noexcept
An offer from an account.
Json::Value create(jtx::Account const &subject, jtx::Account const &issuer, std::string_view credType)
Json::Value accept(jtx::Account const &subject, jtx::Account const &issuer, std::string_view credType)
Json::Value deleteCred(jtx::Account const &acc, jtx::Account const &subject, jtx::Account const &issuer, std::string_view credType)
Json::Value setTx(AccountID const &account, Credentials const &credentials, std::optional< uint256 > domain)
std::map< uint256, Json::Value > getObjects(Account const &account, Env &env, bool withType)
std::uint32_t ownerCount(Env const &env, Account const &account)
Json::Value trust(Account const &account, STAmount const &amount, std::uint32_t flags)
Modify a trust line.
Json::Value pay(AccountID const &account, AccountID const &to, AnyAmount amount)
Create a payment.
FeatureBitset testable_amendments()
Json::Value offer(Account const &account, STAmount const &takerPays, STAmount const &takerGets, std::uint32_t flags)
Create an offer.
XRP_t const XRP
Converts to XRP Issue or STAmount.
Json::Value offer_cancel(Account const &account, std::uint32_t offerSeq)
Cancel an offer.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
constexpr std::uint32_t tfHybrid
constexpr std::uint32_t tfPassive
std::uint64_t getRate(STAmount const &offerOut, STAmount const &offerIn)
constexpr std::uint32_t tfSetNoRipple
A pair of SHAMap key and LedgerEntryType.