2#include <test/jtx/CaptureLogs.h>
3#include <test/jtx/delegate.h>
5#include <xrpl/protocol/Feature.h>
6#include <xrpl/protocol/Permissions.h>
15 testcase(
"test feature not enabled");
18 Env env{*
this, features};
22 env.fund(
XRP(1000000), gw, alice, bob);
38 testcase(
"test valid request creating, updating, deleting permissions");
44 env.
fund(
XRP(100000), gw, alice);
52 BEAST_EXPECT(entry[jss::result][jss::error] ==
"entryNotFound");
54 auto const permissions =
61 auto comparePermissions = [&](
Json::Value const& jle,
65 BEAST_EXPECT(!jle[jss::result].isMember(jss::error) && jle[jss::result].isMember(jss::node));
66 BEAST_EXPECT(jle[jss::result][jss::node][
"LedgerEntryType"] == jss::Delegate);
67 BEAST_EXPECT(jle[jss::result][jss::node][jss::Account] == account.human());
68 BEAST_EXPECT(jle[jss::result][jss::node][sfAuthorize.jsonName] == authorize.human());
70 auto const& jPermissions = jle[jss::result][jss::node][sfPermissions.jsonName];
72 for (
auto const& permission : permissions)
74 BEAST_EXPECT(jPermissions[i][sfPermission.jsonName][sfPermissionValue.jsonName] == permission);
80 comparePermissions(
delegate::entry(env, gw, alice), permissions, gw, alice);
89 comparePermissions(
delegate::entry(env, gw, alice), newPermissions, gw, alice);
97 BEAST_EXPECT(jle[jss::result][jss::error] ==
"entryNotFound");
102 comparePermissions(
delegate::entry(env, alice, gw), permissions, alice, gw);
105 BEAST_EXPECT(response[jss::result][jss::error] ==
"entryNotFound");
111 testcase(
"test invalid DelegateSet");
114 Env env(*
this, features);
118 env.
fund(
XRP(100000), gw, alice, bob);
149 jv[jss::TransactionType] = jss::DelegateSet;
150 jv[jss::Account] = gw.human();
151 jv[sfAuthorize.jsonName] = alice.human();
154 permissionValue[sfPermissionValue.jsonName] =
"Payment";
156 permissionObj[sfPermission.jsonName] = permissionValue;
157 permissionsJson.
append(permissionObj);
158 jv[sfPermissions.jsonName] = permissionsJson;
159 jv[sfFee.jsonName] = -1;
172 "TrustlineAuthorize",
174 "TrustlineAuthorize"}),
260 env.
fund(
XRP(10000), alice, carol);
265 auto aliceBalance = env.
balance(alice);
266 auto bobBalance = env.
balance(bob);
267 auto carolBalance = env.
balance(carol);
271 BEAST_EXPECT(env.
balance(alice) == aliceBalance);
272 BEAST_EXPECT(env.
balance(bob) == bobBalance);
273 BEAST_EXPECT(env.
balance(carol) == carolBalance);
281 auto aliceBalance = env.
balance(alice);
282 auto bobBalance = env.
balance(bob);
283 auto carolBalance = env.
balance(carol);
285 auto const sendAmt =
XRP(100);
286 auto const feeAmt =
XRP(10);
289 BEAST_EXPECT(env.
balance(alice) == aliceBalance - sendAmt);
290 BEAST_EXPECT(env.
balance(bob) == bobBalance - feeAmt);
291 BEAST_EXPECT(env.
balance(carol) == carolBalance + sendAmt);
296 auto aliceBalance = env.
balance(alice);
297 auto bobBalance = env.
balance(bob);
298 auto carolBalance = env.
balance(carol);
302 BEAST_EXPECT(env.
balance(alice) == aliceBalance);
303 BEAST_EXPECT(env.
balance(bob) == bobBalance);
304 BEAST_EXPECT(env.
balance(carol) == carolBalance);
310 auto aliceBalance = env.
balance(alice);
311 auto bobBalance = env.
balance(bob);
312 auto carolBalance = env.
balance(carol);
313 auto const feeAmt =
XRP(10);
317 BEAST_EXPECT(env.
balance(alice) == aliceBalance);
318 BEAST_EXPECT(env.
balance(bob) == bobBalance - feeAmt);
319 BEAST_EXPECT(env.
balance(carol) == carolBalance);
333 env.
fund(
XRP(10000), alice, bob, carol);
336 auto aliceSeq = env.
seq(alice);
337 auto bobSeq = env.
seq(bob);
341 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
342 BEAST_EXPECT(env.
seq(bob) == bobSeq + 1);
343 aliceSeq = env.
seq(alice);
344 bobSeq = env.
seq(bob);
346 for (
auto i = 0; i < 20; ++i)
351 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
352 BEAST_EXPECT(env.
seq(bob) == bobSeq);
353 aliceSeq = env.
seq(alice);
357 BEAST_EXPECT(env.
seq(alice) == aliceSeq);
358 BEAST_EXPECT(env.
seq(bob) == bobSeq + 1);
359 bobSeq = env.
seq(bob);
364 BEAST_EXPECT(env.
seq(alice) == aliceSeq);
365 BEAST_EXPECT(env.
seq(bob) == bobSeq + 1);
366 bobSeq = env.
seq(bob);
370 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
371 BEAST_EXPECT(env.
seq(bob) == bobSeq);
372 aliceSeq = env.
seq(alice);
385 env.
fund(
XRP(100000), alice, bob);
395 auto const aliceBalance = env.
balance(alice);
396 auto const bobBalance = env.
balance(bob);
399 auto const deleteFee =
drops(env.
current()->fees().increment);
405 BEAST_EXPECT(env.
balance(bob) == bobBalance + aliceBalance - deleteFee);
413 testcase(
"test delegate transaction");
485 auto const USD = gw[
"USD"];
486 auto const EUR = gw2[
"EUR"];
491 env.
trust(USD(200), alice);
492 env.
trust(EUR(400), gw);
537 BEAST_EXPECT(env.
balance(bob, USD) == USD(0));
547 BEAST_EXPECT(env.
balance(bob, USD) == USD(0));
565 env(
pay(gw2, gw, EUR(200)));
589 auto const USD = gw[
"USD"];
594 env.
trust(USD(200), alice);
629 BEAST_EXPECT(env.
balance(bob, USD) == USD(0));
635 Env env(*
this, features);
640 auto const USD = gw[
"USD"];
642 env.
fund(
XRP(10000), alice, bob, carol, gw);
644 env.
trust(USD(50000), alice);
645 env.
trust(USD(50000), bob);
646 env.
trust(USD(50000), carol);
647 env(
pay(gw, alice, USD(10000)));
648 env(
pay(gw, bob, USD(10000)));
649 env(
pay(gw, carol, USD(10000)));
654 env(
offer(carol,
XRP(100), USD(501)));
661 env(
pay(gw, alice, USD(5000)),
668 env(
pay(gw, alice, USD(5000)),
682 env(
offer(bob,
XRP(100), USD(501)));
689 env(
pay(alice, gw, USD(5000)),
696 env(
pay(alice, gw, USD(5000)),
717 MPTTester mpt(env, gw, {.holders = {alice, bob}});
720 mpt.authorize({.account = alice});
721 mpt.authorize({.account = bob});
723 auto const MPT = mpt[
"MPT"];
724 env(
pay(gw, alice,
MPT(500)));
725 env(
pay(gw, bob,
MPT(500)));
737 BEAST_EXPECT(env.
balance(bob,
MPT) == bobMPT);
748 BEAST_EXPECT(env.
balance(bob,
MPT) == bobMPT);
754 env(
delegate::set(alice, bob, {
"PaymentBurn",
"PaymentMint",
"Payment"}));
758 BEAST_EXPECT(env.
balance(bob,
MPT) == bobMPT);
761 BEAST_EXPECT(env.
balance(alice,
MPT) == aliceMPT -
MPT(100));
770 testcase(
"test TrustSet granular permissions");
779 env.
fund(
XRP(10000), gw, alice, bob);
791 env(
trust(alice, gw[
"USD"](50)));
822 env(
delegate::set(gw, bob, {
"TrustlineAuthorize",
"TrustlineFreeze"}));
826 env(
delegate::set(gw, bob, {
"TrustlineAuthorize",
"TrustlineUnfreeze"}));
840 auto tx =
trust(alice, gw[
"USD"](50));
841 tx[
"QualityIn"] =
"1000";
843 auto tx2 =
trust(alice, gw[
"USD"](50));
844 tx2[
"QualityOut"] =
"1000";
846 auto tx3 =
trust(gw, alice[
"USD"](50));
847 tx3[
"QualityIn"] =
"1000";
849 auto tx4 =
trust(gw, alice[
"USD"](50));
850 tx4[
"QualityOut"] =
"1000";
856 auto tx5 =
trust(gw, alice[
"USD"](50));
857 tx5[
"QualityOut"] =
"1000";
859 auto tx6 =
trust(alice, gw[
"USD"](50));
860 tx6[
"QualityOut"] =
"1000";
873 env.
fund(
XRP(10000), gw, alice, bob);
879 env(
delegate::set(alice, bob, {
"TrustlineUnfreeze",
"NFTokenCreateOffer"}));
886 alice, bob, {
"TrustlineUnfreeze",
"NFTokenCreateOffer",
"TrustSet",
"AccountTransferRateSet"}));
892 gw, bob, {
"TrustlineUnfreeze",
"NFTokenCreateOffer",
"TrustSet",
"AccountTransferRateSet"}));
914 env.
fund(
XRP(10000), gw, alice, bob);
917 env(
trust(alice, gw[
"USD"](50)));
929 testcase(
"test AccountSet granular permissions");
937 auto const alice =
Account{
"alice"};
938 auto const bob =
Account{
"bob"};
939 env.
fund(
XRP(10000), alice, bob);
950 auto jt =
noop(alice);
952 jt[sfDelegate] = bob.human();
956 env(
delegate::set(alice, bob, {
"TrustlineUnfreeze",
"AccountEmailHashSet"}));
971 BEAST_EXPECT(!env.
le(alice)->isFieldPresent(sfDomain));
974 std::string const failDomain =
"fail_domain_update";
976 jt[sfDomain] =
strHex(failDomain);
984 std::string const mh(
"5F31A79367DC3137FADA860C05742EE6");
985 jt[sfEmailHash] = mh;
989 env(
delegate::set(alice, bob, {
"AccountDomainSet",
"AccountEmailHashSet"}));
992 BEAST_EXPECT(
to_string((*env.
le(alice))[sfEmailHash]) == mh);
997 jt[sfMessageKey] =
strHex(rkp.first.slice());
1001 env(
delegate::set(alice, bob, {
"AccountDomainSet",
"AccountEmailHashSet",
"AccountMessageKeySet"}));
1006 BEAST_EXPECT(
strHex((*env.
le(alice))[sfMessageKey]) ==
strHex(rkp.first.slice()));
1007 jt[sfMessageKey] =
"";
1009 BEAST_EXPECT(!env.
le(alice)->isFieldPresent(sfMessageKey));
1018 {
"AccountDomainSet",
"AccountEmailHashSet",
"AccountMessageKeySet",
"AccountTransferRateSet"}));
1020 auto jtRate =
rate(alice, 2.0);
1021 jtRate[sfDelegate] = bob.human();
1023 BEAST_EXPECT((*env.
le(alice))[sfTransferRate] == 2000000000);
1033 {
"AccountDomainSet",
1034 "AccountEmailHashSet",
1035 "AccountMessageKeySet",
1036 "AccountTransferRateSet",
1037 "AccountTickSizeSet"}));
1040 BEAST_EXPECT((*env.
le(alice))[sfTickSize] == 8);
1060 env(
delegate::set(alice, bob, {
"AccountDomainSet",
"AccountEmailHashSet",
"AccountMessageKeySet"}));
1065 "9633EC8AF54F16B5286DB1D7B519EF49EEFC050C0C8AC4384F1D88ACD1BFDF"
1067 auto jv2 =
noop(alice);
1069 jv2[sfDelegate] = bob.human();
1070 jv2[sfWalletLocator] = locator;
1077 auto const alice =
Account{
"alice"};
1078 auto const bob =
Account{
"bob"};
1079 env.
fund(
XRP(10000), alice, bob);
1086 env(
fset(alice, flag));
1098 env(
delegate::set(alice, bob, {
"AccountDomainSet",
"AccountEmailHashSet",
"AccountMessageKeySet"}));
1115 BEAST_EXPECT(env.
le(alice)->isFieldPresent(sfAccountTxnID));
1120 jt[sfDelegate] = bob.human();
1121 jt[sfNFTokenMinter] = bob.human();
1125 env(
delegate::set(bob, alice, {
"AccountDomainSet",
"AccountEmailHashSet",
"AccountMessageKeySet"}));
1140 env(
regkey(bob, bobKey));
1150 env.
fund(
XRP(10000), alice, bob);
1153 env(
delegate::set(alice, bob, {
"AccountDomainSet",
"AccountEmailHashSet"}));
1157 auto jt =
noop(alice);
1159 jt[sfDelegate] = bob.human();
1170 testcase(
"test MPTokenIssuanceSet granular");
1171 using namespace jtx;
1178 env.
fund(
XRP(100000), alice, bob);
1197 mpt.set({.account = alice, .flags =
tfMPTLock, .delegate = bob});
1201 env(
delegate::set(alice, bob, {
"MPTokenIssuanceLock",
"MPTokenIssuanceUnlock"}));
1203 mpt.set({.account = alice, .flags =
tfMPTUnlock, .delegate = bob});
1204 mpt.set({.account = alice, .flags =
tfMPTLock, .delegate = bob});
1213 env.
fund(
XRP(100000), alice, bob);
1224 mpt.set({.account = alice, .flags =
tfMPTLock, .delegate = bob});
1230 env(
delegate::set(alice, bob, {
"NFTokenMint",
"MPTokenIssuanceLock",
"NFTokenBurn"}));
1236 env(
delegate::set(alice, bob, {
"NFTokenMint",
"MPTokenIssuanceLock",
"NFTokenBurn",
"MPTokenIssuanceSet"}));
1237 mpt.set({.account = alice, .flags =
tfMPTUnlock, .delegate = bob});
1239 mpt.set({.account = alice, .flags =
tfMPTLock});
1240 mpt.set({.account = alice, .flags =
tfMPTUnlock, .delegate = bob});
1241 mpt.set({.account = alice, .flags =
tfMPTLock, .delegate = bob});
1249 env.
fund(
XRP(100000), alice, bob);
1268 using namespace jtx;
1274 env.
fund(
XRP(100000), alice, bob, carol);
1280 auto aliceBalance = env.
balance(alice);
1281 auto bobBalance = env.
balance(bob);
1282 auto carolBalance = env.
balance(carol);
1286 BEAST_EXPECT(env.
balance(alice) == aliceBalance -
XRP(100));
1287 BEAST_EXPECT(env.
balance(bob) == bobBalance -
XRP(10));
1288 BEAST_EXPECT(env.
balance(carol) == carolBalance +
XRP(100));
1294 testcase(
"test single sign with bad secret");
1295 using namespace jtx;
1302 env.
fund(
XRP(100000), alice, bob, carol);
1308 auto aliceBalance = env.
balance(alice);
1309 auto bobBalance = env.
balance(bob);
1310 auto carolBalance = env.
balance(carol);
1314 BEAST_EXPECT(env.
balance(alice) == aliceBalance);
1315 BEAST_EXPECT(env.
balance(bob) == bobBalance);
1316 BEAST_EXPECT(env.
balance(carol) == carolBalance);
1321 Account alice{
"alice"}, bob{
"bob"}, carol{
"carol"};
1322 env.
fund(
XRP(100000), alice, bob, carol);
1328 auto aliceBalance = env.
balance(alice);
1329 auto bobBalance = env.
balance(bob);
1330 auto carolBalance = env.
balance(carol);
1332 env(
pay(alice, carol,
XRP(100)),
1338 BEAST_EXPECT(env.
balance(alice) == aliceBalance);
1339 BEAST_EXPECT(env.
balance(bob) == bobBalance);
1340 BEAST_EXPECT(env.
balance(carol) == carolBalance);
1342 env(
pay(alice, carol,
XRP(100)),
1348 BEAST_EXPECT(env.
balance(alice) == aliceBalance);
1349 BEAST_EXPECT(env.
balance(bob) == bobBalance);
1350 BEAST_EXPECT(env.
balance(carol) == carolBalance);
1355 Account alice{
"alice"}, bob{
"bob"}, carol{
"carol"};
1356 env.
fund(
XRP(100000), alice, bob, carol);
1359 auto aliceBalance = env.
balance(alice);
1360 auto bobBalance = env.
balance(bob);
1361 auto carolBalance = env.
balance(carol);
1363 env(
pay(alice, carol,
XRP(100)),
1369 BEAST_EXPECT(env.
balance(alice) == aliceBalance);
1370 BEAST_EXPECT(env.
balance(bob) == bobBalance);
1371 BEAST_EXPECT(env.
balance(carol) == carolBalance);
1373 env(
pay(alice, carol,
XRP(100)),
1379 BEAST_EXPECT(env.
balance(alice) == aliceBalance);
1380 BEAST_EXPECT(env.
balance(bob) == bobBalance);
1381 BEAST_EXPECT(env.
balance(carol) == carolBalance);
1389 using namespace jtx;
1397 env.
fund(
XRP(100000), alice, bob, carol, daria, edward);
1400 env(
signers(bob, 2, {{daria, 1}, {edward, 1}}));
1406 auto aliceBalance = env.
balance(alice);
1407 auto bobBalance = env.
balance(bob);
1408 auto carolBalance = env.
balance(carol);
1409 auto dariaBalance = env.
balance(daria);
1410 auto edwardBalance = env.
balance(edward);
1414 BEAST_EXPECT(env.
balance(alice) == aliceBalance -
XRP(100));
1415 BEAST_EXPECT(env.
balance(bob) == bobBalance -
XRP(10));
1416 BEAST_EXPECT(env.
balance(carol) == carolBalance +
XRP(100));
1417 BEAST_EXPECT(env.
balance(daria) == dariaBalance);
1418 BEAST_EXPECT(env.
balance(edward) == edwardBalance);
1424 testcase(
"test multi sign which does not meet quorum");
1425 using namespace jtx;
1434 env.
fund(
XRP(100000), alice, bob, carol, daria, edward, fred);
1437 env(
signers(bob, 3, {{daria, 1}, {edward, 1}, {fred, 1}}));
1443 auto aliceBalance = env.
balance(alice);
1444 auto bobBalance = env.
balance(bob);
1445 auto carolBalance = env.
balance(carol);
1446 auto dariaBalance = env.
balance(daria);
1447 auto edwardBalance = env.
balance(edward);
1451 BEAST_EXPECT(env.
balance(alice) == aliceBalance);
1452 BEAST_EXPECT(env.
balance(bob) == bobBalance);
1453 BEAST_EXPECT(env.
balance(carol) == carolBalance);
1454 BEAST_EXPECT(env.
balance(daria) == dariaBalance);
1455 BEAST_EXPECT(env.
balance(edward) == edwardBalance);
1462 using namespace jtx;
1464 Env env(*
this, features);
1468 env.
fund(
XRP(100000), alice, bob);
1471 auto buildRequest = [&](
auto value) ->
Json::Value {
1473 jv[jss::TransactionType] = jss::DelegateSet;
1474 jv[jss::Account] = alice.human();
1475 jv[sfAuthorize.jsonName] = bob.human();
1479 permissionValue[sfPermissionValue.jsonName] = value;
1481 permissionObj[sfPermission.jsonName] = permissionValue;
1482 permissionsJson.
append(permissionObj);
1483 jv[sfPermissions.jsonName] = permissionsJson;
1490 for (
auto value : {0, 100000, 54321})
1492 auto jv = buildRequest(value);
1500 testcase(
"test delegate disabled tx");
1501 using namespace jtx;
1508 {
"Clawback", featureClawback},
1509 {
"AMMClawback", featureAMMClawback},
1510 {
"AMMCreate", featureAMM},
1511 {
"AMMDeposit", featureAMM},
1512 {
"AMMWithdraw", featureAMM},
1513 {
"AMMVote", featureAMM},
1514 {
"AMMBid", featureAMM},
1515 {
"AMMDelete", featureAMM},
1516 {
"XChainCreateClaimID", featureXChainBridge},
1517 {
"XChainCommit", featureXChainBridge},
1518 {
"XChainClaim", featureXChainBridge},
1519 {
"XChainAccountCreateCommit", featureXChainBridge},
1520 {
"XChainAddClaimAttestation", featureXChainBridge},
1521 {
"XChainAddAccountCreateAttestation", featureXChainBridge},
1522 {
"XChainModifyBridge", featureXChainBridge},
1523 {
"XChainCreateBridge", featureXChainBridge},
1524 {
"DIDSet", featureDID},
1525 {
"DIDDelete", featureDID},
1526 {
"OracleSet", featurePriceOracle},
1527 {
"OracleDelete", featurePriceOracle},
1528 {
"LedgerStateFix", fixNFTokenPageLinks},
1529 {
"MPTokenIssuanceCreate", featureMPTokensV1},
1530 {
"MPTokenIssuanceDestroy", featureMPTokensV1},
1531 {
"MPTokenIssuanceSet", featureMPTokensV1},
1532 {
"MPTokenAuthorize", featureMPTokensV1},
1533 {
"CredentialCreate", featureCredentials},
1534 {
"CredentialAccept", featureCredentials},
1535 {
"CredentialDelete", featureCredentials},
1536 {
"NFTokenModify", featureDynamicNFT},
1537 {
"PermissionedDomainSet", featurePermissionedDomains},
1538 {
"PermissionedDomainDelete", featurePermissionedDomains},
1539 {
"VaultCreate", featureSingleAssetVault},
1540 {
"VaultSet", featureSingleAssetVault},
1541 {
"VaultDelete", featureSingleAssetVault},
1542 {
"VaultDeposit", featureSingleAssetVault},
1543 {
"VaultWithdraw", featureSingleAssetVault},
1544 {
"VaultClawback", featureSingleAssetVault}};
1549 BEAST_EXPECT(txRequiredFeatures.contains(tx));
1551 Env env(*
this, features - txRequiredFeatures[tx]);
1555 env.
fund(
XRP(100000), alice, bob);
1561 for (
auto const& tx : txRequiredFeatures)
1562 txAmendmentDisabled(features, tx.first);
1568 auto txAmendmentEnabled = [&](
std::string const& tx) {
1569 Env env(*
this, features);
1573 env.
fund(
XRP(100000), alice, bob);
1579 for (
auto const& tx : txRequiredFeatures)
1580 txAmendmentEnabled(tx.first);
1610BEAST_DEFINE_TESTSUITE(Delegate, app,
xrpl);
Value & append(Value const &value)
Append value to array at the end.
testcase_t testcase
Memberspace for declaring test cases.
void testMultiSignQuorumNotMet()
void testTrustSetGranular()
void testFeatureDisabled(FeatureBitset features)
void testInvalidRequest(FeatureBitset features)
void run() override
Runs the suite.
void testMPTokenIssuanceSetGranular()
void testDelegateTransaction()
void testSingleSignBadSecret()
void testPaymentGranular(FeatureBitset features)
void testPermissionValue(FeatureBitset features)
void testAccountSetGranular()
void testTxRequireFeatures(FeatureBitset features)
Immutable cryptographic account descriptor.
A transaction testing environment.
bool close(NetClock::time_point closeTime, std::optional< std::chrono::milliseconds > consensusDelay=std::nullopt)
Close and advance the ledger.
std::shared_ptr< ReadView const > closed()
Returns the last closed ledger.
std::shared_ptr< SLE const > le(Account const &account) const
Return an account root.
void fund(bool setDefaultRipple, STAmount const &amount, Account const &account)
std::uint32_t seq(Account const &account) const
Returns the next sequence number on account.
PrettyAmount balance(Account const &account) const
Returns the XRP balance on an account.
void trust(STAmount const &amount, Account const &account)
Establish trust lines.
void require(Args const &... args)
Check a set of requirements.
std::shared_ptr< OpenView const > current() const
Returns the current ledger.
void create(MPTCreate const &arg=MPTCreate{})
Converts to MPT Issue or STAmount.
Sets the optional URI on a DIDSet.
Set a multisignature on a JTx.
Sets the SendMax on a JTx.
Set the regular signature on a JTx.
Set the expected result code for a JTx The test will fail if the code doesn't match.
@ arrayValue
array value (ordered list)
Keylet ownerDir(AccountID const &id) noexcept
The root page of an account's directory.
Keylet delegate(AccountID const &account, AccountID const &authorizedAccount) noexcept
A keylet for Delegate object.
Keylet account(AccountID const &id) noexcept
AccountID root.
Json::Value create(A const &account, A const &dest, STAmount const &sendMax)
Create a check.
Json::Value set(jtx::Account const &account, jtx::Account const &authorize, std::vector< std::string > const &permissions)
Json::Value entry(jtx::Env &env, jtx::Account const &account, jtx::Account const &authorize)
Json::Value set(jtx::Account const &account)
bool expectOffers(Env &env, AccountID const &account, std::uint16_t size, std::vector< Amounts > const &toMatch)
Json::Value trust(Account const &account, STAmount const &amount, std::uint32_t flags)
Modify a trust line.
Json::Value signers(Account const &account, std::uint32_t quorum, std::vector< signer > const &v)
Json::Value rate(Account const &account, double multiplier)
Set a transfer rate.
XRP_t const XRP
Converts to XRP Issue or STAmount.
Json::Value pay(AccountID const &account, AccountID const &to, AnyAmount amount)
Create a payment.
Json::Value fclear(Account const &account, std::uint32_t off)
Remove account flag.
FeatureBitset testable_amendments()
Json::Value regkey(Account const &account, disabled_t)
Disable the regular key.
Json::Value fset(Account const &account, std::uint32_t on, std::uint32_t off=0)
Add and/or remove flag.
Json::Value acctdelete(Account const &account, Account const &dest)
Delete account.
PrettyAmount drops(Integer i)
Returns an XRP PrettyAmount, which is trivially convertible to STAmount.
Json::Value offer(Account const &account, STAmount const &takerPays, STAmount const &takerGets, std::uint32_t flags)
Create an offer.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
constexpr std::uint32_t asfAllowTrustLineClawback
@ terNO_DELEGATE_PERMISSION
constexpr std::uint32_t asfGlobalFreeze
constexpr std::uint32_t asfRequireDest
std::pair< PublicKey, SecretKey > randomKeyPair(KeyType type)
Create a key pair using secure random numbers.
constexpr std::uint32_t asfDisableMaster
constexpr std::uint32_t const tfMPTCanTransfer
std::string to_string(base_uint< Bits, Tag > const &a)
std::string strHex(FwdIt begin, FwdIt end)
constexpr std::uint32_t tfSetNoRipple
constexpr std::uint32_t asfAccountTxnID
constexpr std::uint32_t asfDisallowIncomingPayChan
constexpr std::uint32_t asfDepositAuth
constexpr std::uint32_t const tfMPTUnlock
constexpr std::uint32_t const tfMPTCanLock
constexpr std::uint32_t tfRequireAuth
constexpr std::uint32_t asfDefaultRipple
constexpr std::uint32_t asfDisallowIncomingTrustline
constexpr std::uint32_t tfClearFreeze
constexpr std::uint32_t asfAuthorizedNFTokenMinter
constexpr std::uint32_t const tfMPTLock
constexpr std::uint32_t tfFullyCanonicalSig
Transaction flags.
constexpr std::uint32_t tfClearDeepFreeze
constexpr std::uint32_t tfSetDeepFreeze
constexpr std::uint32_t tfClearNoRipple
constexpr std::uint32_t tfSetfAuth
constexpr std::uint32_t asfDisallowIncomingCheck
constexpr std::uint32_t asfRequireAuth
constexpr std::uint32_t asfNoFreeze
constexpr std::uint32_t asfDisallowXRP
@ tecINSUFFICIENT_RESERVE
std::enable_if_t< std::is_same< T, char >::value||std::is_same< T, unsigned char >::value, Slice > makeSlice(std::array< T, N > const &a)
constexpr std::uint32_t tfPartialPayment
constexpr std::uint32_t tfSetFreeze
constexpr std::uint32_t asfDisallowIncomingNFTokenOffer