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] =
213 Env env(*
this, features - featureFlowCross);
214 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
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)));
267 Env env(*
this, features);
268 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
275 env.
trust(USD(1000), devin);
277 env(
pay(gw, devin, USD(100)));
281 uint32_t
const t = env.
current()
283 .parentCloseTime.time_since_epoch()
285 jv[sfExpiration.jsonName] = t + 20;
307 Env env(*
this, features);
308 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
311 "F10D0CC9A0F9A3CBF585B80BE09A186483668FDBDD39AA7E3370F3649CE134"
323 Env env(*
this, features);
324 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
328 domainOwner, gw, domainOwner, credType));
331 auto const bobOfferSeq{env.
seq(bob)};
336 checkOffer(env, bob, bobOfferSeq,
XRP(10), USD(10), 0,
true));
342 Env env(*
this, features);
343 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
347 domainOwner, gw, domainOwner, credType));
350 auto const bobOfferSeq{env.
seq(bob)};
355 checkOffer(env, bob, bobOfferSeq, USD(10),
XRP(10), 0,
true));
360 Env env(*
this, features);
361 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
364 auto const bobOfferSeq{env.
seq(bob)};
369 checkOffer(env, bob, bobOfferSeq,
XRP(10), USD(10), 0,
true));
373 env(
offer(carol, USD(10),
XRP(10)));
377 checkOffer(env, bob, bobOfferSeq,
XRP(10), USD(10), 0,
true));
379 auto const aliceOfferSeq{env.
seq(alice)};
383 BEAST_EXPECT(!
offerExists(env, alice, aliceOfferSeq));
390 Env env(*
this, features);
391 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
397 for (
size_t i = 0; i <= 100; i++)
399 auto const bobOfferSeq{env.
seq(bob)};
405 env, bob, bobOfferSeq,
XRP(10), USD(10), 0,
true));
408 for (
auto const offerSeq : offerSeqs)
424 Env env(*
this, features - featurePermissionedDEX);
425 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
428 env(
pay(bob, alice, USD(10)),
441 env(
pay(bob, alice, USD(10)),
450 Env env(*
this, features);
451 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
454 "F10D0CC9A0F9A3CBF585B80BE09A186483668FDBDD39AA7E3370F3649CE134"
457 env(
pay(bob, alice, USD(10)),
467 Env env(*
this, features);
468 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
478 env.
trust(USD(1000), devin);
480 env(
pay(gw, devin, USD(100)));
484 env(
pay(alice, devin, USD(10)),
496 env(
pay(alice, devin, USD(10)),
507 env(
pay(alice, devin, USD(10)),
516 Env env(*
this, features);
517 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
527 env.
trust(USD(1000), devin);
529 env(
pay(gw, devin, USD(100)));
533 env(
pay(devin, alice, USD(10)),
545 env(
pay(devin, alice, USD(10)),
556 env(
pay(devin, alice, USD(10)),
565 Env env(*
this, features);
566 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
573 env(
pay(alice, domainOwner, USD(10)),
583 env(
pay(domainOwner, alice, USD(10)),
598 Env env(*
this, features);
599 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
603 auto const regularOfferSeq{env.
seq(bob)};
609 auto const regularDirKey =
611 BEAST_EXPECT(regularDirKey);
615 env(
pay(alice, carol, USD(10)),
623 auto const domainOfferSeq{env.
seq(bob)};
628 env, bob, domainOfferSeq,
XRP(10), USD(10), 0,
true));
630 auto const domainDirKey =
632 BEAST_EXPECT(domainDirKey);
637 env(
pay(alice, carol, USD(10)),
642 BEAST_EXPECT(!
offerExists(env, bob, domainOfferSeq));
653 Env env(*
this, features);
654 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
657 auto const EUR = gw[
"EUR"];
658 env.
trust(EUR(1000), alice);
660 env.
trust(EUR(1000), bob);
662 env.
trust(EUR(1000), carol);
664 env(
pay(gw, bob, EUR(100)));
668 auto const usdOfferSeq{env.
seq(bob)};
673 checkOffer(env, bob, usdOfferSeq,
XRP(10), USD(10), 0,
true));
676 env(
pay(alice, carol, EUR(10)),
683 checkOffer(env, bob, usdOfferSeq,
XRP(10), USD(10), 0,
true));
686 auto const regularOfferSeq{env.
seq(bob)};
687 env(
offer(bob, USD(10), EUR(10)));
690 checkOffer(env, bob, regularOfferSeq, USD(10), EUR(10)));
694 env(
pay(alice, carol, EUR(10)),
702 auto const eurOfferSeq{env.
seq(bob)};
703 env(
offer(bob, USD(10), EUR(10)),
domain(domainID));
706 checkOffer(env, bob, eurOfferSeq, USD(10), EUR(10), 0,
true));
709 env(
pay(alice, carol, EUR(5)),
718 checkOffer(env, bob, eurOfferSeq, USD(5), EUR(5), 0,
true));
722 env(
pay(alice, carol, EUR(5)),
733 checkOffer(env, bob, regularOfferSeq, USD(10), EUR(10)));
738 Env env(*
this, features);
739 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
743 Account badDomainOwner(
"badDomainOwner");
745 env.
fund(
XRP(1000), badDomainOwner, devin);
747 env.
trust(USD(1000), devin);
749 env(
pay(gw, devin, USD(100)));
752 auto const badCredType =
"badCred";
757 auto const badDomainID = objects.begin()->first;
768 env(
pay(alice, carol, USD(10)),
776 auto const bobOfferSeq{env.
seq(bob)};
780 checkOffer(env, bob, bobOfferSeq,
XRP(10), USD(10), 0,
true));
783 env(
pay(alice, carol, USD(10)),
796 Env env(*
this, features);
797 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
822 Env env(*
this, features);
823 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
830 env.
trust(USD(1000), devin);
832 env(
pay(gw, devin, USD(100)));
836 uint32_t
const t = env.
current()
838 .parentCloseTime.time_since_epoch()
840 jv[sfExpiration.jsonName] = t + 20;
847 auto const offerSeq{env.
seq(devin)};
852 env(
pay(alice, carol, USD(5)),
864 env(
pay(alice, carol, USD(5)),
876 Env env(*
this, features);
877 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
880 auto const offerSeq{env.
seq(bob)};
885 env(
pay(alice, carol, USD(5)),
895 domainOwner, bob, domainOwner, credType));
899 env(
pay(alice, carol, USD(5)),
918 Env env(*
this, features);
919 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
922 auto const EURA = alice[
"EUR"];
923 auto const EURB = bob[
"EUR"];
925 env.
trust(EURA(100), bob);
926 env.
trust(EURB(100), carol);
944 env(
pay(alice, carol, EURB(5)),
955 testcase(
"Offer token issuer in domain");
959 Env env(*
this, features);
960 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
964 auto const bobOffer1Seq{env.
seq(bob)};
969 auto const bobOffer2Seq{env.
seq(bob)};
974 checkOffer(env, bob, bobOffer1Seq,
XRP(10), USD(10), 0,
true));
976 env, bob, bobOffer2Seq, USD(10),
XRP(10),
lsfPassive,
true));
984 env(
pay(alice, carol, USD(10)),
989 BEAST_EXPECT(!
offerExists(env, bob, bobOffer1Seq));
993 env(
pay(alice, carol,
XRP(10)),
998 BEAST_EXPECT(!
offerExists(env, bob, bobOffer2Seq));
1008 Env env(*
this, features);
1009 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
1012 auto const aliceOfferSeq{env.
seq(alice)};
1016 auto const bobOfferSeq{env.
seq(bob)};
1021 checkOffer(env, bob, bobOfferSeq,
XRP(20), USD(20), 0,
true));
1023 checkOffer(env, alice, aliceOfferSeq,
XRP(100), USD(100), 0,
true));
1026 BEAST_EXPECT(domainDirKey);
1033 env(
pay(gw, carol, USD(10)),
1040 checkOffer(env, bob, bobOfferSeq,
XRP(10), USD(10), 0,
true));
1043 BEAST_EXPECT(!
offerExists(env, alice, aliceOfferSeq));
1052 Env env(*
this, features);
1053 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
1055 AMM amm(env, alice,
XRP(10), USD(50));
1058 env(
pay(bob, carol, USD(5)),
1070 auto [xrp, usd, lpt] = amm.balances(
XRP, USD);
1071 BEAST_EXPECT(usd == USD(45));
1081 Env env(*
this, features - featurePermissionedDEX);
1082 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
1106 auto const offerSeq{env.
seq(bob)};
1112 env, bob, offerSeq,
XRP(10), USD(10),
lsfHybrid,
true));
1117 Env env(*
this, features);
1118 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
1121 auto const bobOfferSeq{env.
seq(bob)};
1128 env, bob, bobOfferSeq,
XRP(10), USD(10),
lsfHybrid,
true));
1132 auto const aliceOfferSeq{env.
seq(alice)};
1136 BEAST_EXPECT(!
offerExists(env, alice, aliceOfferSeq));
1137 BEAST_EXPECT(!
offerExists(env, bob, bobOfferSeq));
1143 Env env(*
this, features);
1144 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
1147 auto const bobOfferSeq{env.
seq(bob)};
1156 env, bob, bobOfferSeq,
XRP(10), USD(10),
lsfHybrid,
true));
1158 auto const aliceOfferSeq{env.
seq(alice)};
1159 env(
offer(alice, USD(10),
XRP(10)));
1162 BEAST_EXPECT(!
offerExists(env, alice, aliceOfferSeq));
1163 BEAST_EXPECT(!
offerExists(env, bob, bobOfferSeq));
1170 Env env(*
this, features);
1171 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
1174 auto const bobOfferSeq{env.
seq(bob)};
1179 checkOffer(env, bob, bobOfferSeq,
XRP(10), USD(10), 0,
true));
1183 auto const aliceOfferSeq{env.
seq(alice)};
1184 env(
offer(alice, USD(10),
XRP(10)),
1189 BEAST_EXPECT(!
offerExists(env, alice, aliceOfferSeq));
1190 BEAST_EXPECT(!
offerExists(env, bob, bobOfferSeq));
1197 Env env(*
this, features);
1198 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
1201 auto const bobOfferSeq{env.
seq(bob)};
1206 checkOffer(env, bob, bobOfferSeq,
XRP(10), USD(10), 0,
false));
1210 auto const aliceOfferSeq{env.
seq(alice)};
1211 env(
offer(alice, USD(10),
XRP(10)),
1216 BEAST_EXPECT(
offerExists(env, alice, aliceOfferSeq));
1219 checkOffer(env, bob, bobOfferSeq,
XRP(10), USD(10), 0,
false));
1221 env, alice, aliceOfferSeq, USD(10),
XRP(10),
lsfHybrid,
true));
1234 Env env(*
this, features);
1235 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
1238 auto const hybridOfferSeq{env.
seq(bob)};
1248 env(
pay(alice, carol, USD(5)),
1255 env, bob, hybridOfferSeq,
XRP(50), USD(50),
lsfHybrid,
true));
1259 env(
pay(alice, carol, USD(5)),
1265 env, bob, hybridOfferSeq,
XRP(50), USD(50),
lsfHybrid,
true));
1268 auto const regularOfferSeq{env.
seq(bob)};
1271 BEAST_EXPECT(
offerExists(env, bob, regularOfferSeq));
1272 BEAST_EXPECT(
checkOffer(env, bob, regularOfferSeq,
XRP(10), USD(10)));
1274 auto const sleHybridOffer =
1276 BEAST_EXPECT(sleHybridOffer);
1277 auto const openDir =
1278 sleHybridOffer->getFieldArray(sfAdditionalBooks)[0].getFieldH256(
1287 BEAST_EXPECT(!
offerExists(env, bob, hybridOfferSeq));
1288 BEAST_EXPECT(
checkOffer(env, bob, regularOfferSeq,
XRP(5), USD(5)));
1299 Env env(*
this, features);
1300 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
1303 auto const hybridOfferSeq{env.
seq(bob)};
1309 env(
pay(alice, carol, USD(5)),
1315 env, bob, hybridOfferSeq,
XRP(5), USD(5),
lsfHybrid,
true));
1321 BEAST_EXPECT(!
offerExists(env, bob, hybridOfferSeq));
1327 Env env(*
this, features);
1328 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
1332 Account badDomainOwner(
"badDomainOwner");
1334 env.
fund(
XRP(1000), badDomainOwner, devin);
1337 auto const badCredType =
"badCred";
1342 auto const badDomainID = objects.begin()->first;
1349 auto const hybridOfferSeq{env.
seq(bob)};
1356 env(
pay(devin, badDomainOwner, USD(5)),
1363 env, bob, hybridOfferSeq,
XRP(10), USD(10),
lsfHybrid,
true));
1365 env(
pay(alice, carol, USD(5)),
1371 env, bob, hybridOfferSeq,
XRP(5), USD(5),
lsfHybrid,
true));
1377 BEAST_EXPECT(!
offerExists(env, bob, hybridOfferSeq));
1382 Env env(*
this, features);
1383 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
1386 auto const EUR = gw[
"EUR"];
1387 env.
trust(EUR(1000), alice);
1389 env.
trust(EUR(1000), bob);
1391 env.
trust(EUR(1000), carol);
1393 env(
pay(gw, bob, EUR(100)));
1396 auto const usdOfferSeq{env.
seq(bob)};
1401 checkOffer(env, bob, usdOfferSeq,
XRP(10), USD(10), 0,
true));
1404 env(
pay(alice, carol, EUR(5)),
1411 checkOffer(env, bob, usdOfferSeq,
XRP(10), USD(10), 0,
true));
1414 auto const eurOfferSeq{env.
seq(bob)};
1415 env(
offer(bob, USD(10), EUR(10)),
1420 env, bob, eurOfferSeq, USD(10), EUR(10),
lsfHybrid,
true));
1423 env(
pay(alice, carol, EUR(5)),
1430 checkOffer(env, bob, usdOfferSeq,
XRP(5), USD(5), 0,
true));
1432 env, bob, eurOfferSeq, USD(5), EUR(5),
lsfHybrid,
true));
1437 Env env(*
this, features);
1438 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
1441 auto const EUR = gw[
"EUR"];
1442 env.
trust(EUR(1000), alice);
1444 env.
trust(EUR(1000), bob);
1446 env.
trust(EUR(1000), carol);
1448 env(
pay(gw, bob, EUR(100)));
1452 auto const usdOfferSeq{env.
seq(bob)};
1457 checkOffer(env, bob, usdOfferSeq,
XRP(10), USD(10), 0,
false));
1460 auto const eurOfferSeq{env.
seq(bob)};
1461 env(
offer(bob, USD(10), EUR(10)),
1466 env, bob, eurOfferSeq, USD(10), EUR(10),
lsfHybrid,
true));
1473 checkOffer(env, bob, usdOfferSeq,
XRP(5), USD(5), 0,
false));
1475 env, bob, eurOfferSeq, USD(5), EUR(5),
lsfHybrid,
true));
1482 Env env(*
this, features);
1483 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
1495 size_t dirCnt = 100;
1497 for (
size_t i = 1; i <= dirCnt; i++)
1499 auto const bobOfferSeq{env.
seq(bob)};
1507 BEAST_EXPECT(sleOffer);
1508 BEAST_EXPECT(sleOffer->getFieldH256(sfBookDirectory) == domainDir);
1510 sleOffer->getFieldArray(sfAdditionalBooks).size() == 1);
1512 sleOffer->getFieldArray(sfAdditionalBooks)[0].getFieldH256(
1513 sfBookDirectory) == openDir);
1516 env, bob, bobOfferSeq,
XRP(10), USD(10),
lsfHybrid,
true));
1521 for (
auto const offerSeq : offerSeqs)
1537 Env env(*
this, features);
1538 auto const& [gw, domainOwner, alice, bob, carol, USD, domainID, credType] =
1540 auto const EUR = gw[
"EUR"];
1542 for (
auto const& account : {alice, bob, carol})
1544 env(
trust(account, EUR(10000)));
1548 env(
pay(gw, carol, EUR(1)));
1551 auto const aliceOfferSeq{env.
seq(alice)};
1552 auto const bobOfferSeq{env.
seq(bob)};
1559 auto const carolOfferSeq{env.
seq(carol)};
1560 env(
offer(carol, USD(1), EUR(1)),
domain(domainID));
1563 BEAST_EXPECT(!
offerExists(env, bob, aliceOfferSeq));
1564 BEAST_EXPECT(!
offerExists(env, bob, bobOfferSeq));
1565 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.
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.
FeatureBitset supported_amendments()
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.