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);
25 auto res = features[featurePermissionDelegationV1_1] ?
ter(
tesSUCCESS)
39 testcase(
"test valid request creating, updating, deleting permissions");
45 env.
fund(
XRP(100000), gw, alice);
53 BEAST_EXPECT(entry[jss::result][jss::error] ==
"entryNotFound");
66 auto comparePermissions =
72 !jle[jss::result].isMember(jss::error) &&
73 jle[jss::result].isMember(jss::node));
75 jle[jss::result][jss::node][
"LedgerEntryType"] ==
78 jle[jss::result][jss::node][jss::Account] ==
81 jle[jss::result][jss::node][sfAuthorize.jsonName] ==
84 auto const& jPermissions =
85 jle[jss::result][jss::node][sfPermissions.jsonName];
87 for (
auto const& permission : permissions)
90 jPermissions[i][sfPermission.jsonName]
91 [sfPermissionValue.jsonName] == permission);
102 "Payment",
"AMMCreate",
"AMMDeposit",
"AMMWithdraw"};
117 BEAST_EXPECT(jle[jss::result][jss::error] ==
"entryNotFound");
126 BEAST_EXPECT(response[jss::result][jss::error] ==
"entryNotFound");
132 testcase(
"test invalid DelegateSet");
135 Env env(*
this, features);
139 env.
fund(
XRP(100000), gw, alice, bob);
170 jv[jss::TransactionType] = jss::DelegateSet;
171 jv[jss::Account] = gw.human();
172 jv[sfAuthorize.jsonName] = alice.human();
175 permissionValue[sfPermissionValue.jsonName] =
"Payment";
177 permissionObj[sfPermission.jsonName] = permissionValue;
178 permissionsJson.
append(permissionObj);
179 jv[sfPermissions.jsonName] = permissionsJson;
180 jv[sfFee.jsonName] = -1;
193 "TrustlineAuthorize",
195 "TrustlineAuthorize"}),
235 drops(env.
current()->fees().accountReserve(1)), bob, carol);
289 env.
fund(
XRP(10000), alice, carol);
294 auto aliceBalance = env.
balance(alice);
295 auto bobBalance = env.
balance(bob);
296 auto carolBalance = env.
balance(carol);
298 env(
pay(alice, carol,
XRP(100)),
303 BEAST_EXPECT(env.
balance(alice) == aliceBalance);
304 BEAST_EXPECT(env.
balance(bob) == bobBalance);
305 BEAST_EXPECT(env.
balance(carol) == carolBalance);
313 auto aliceBalance = env.
balance(alice);
314 auto bobBalance = env.
balance(bob);
315 auto carolBalance = env.
balance(carol);
317 auto const sendAmt =
XRP(100);
318 auto const feeAmt =
XRP(10);
321 BEAST_EXPECT(env.
balance(alice) == aliceBalance - sendAmt);
322 BEAST_EXPECT(env.
balance(bob) == bobBalance - feeAmt);
323 BEAST_EXPECT(env.
balance(carol) == carolBalance + sendAmt);
328 auto aliceBalance = env.
balance(alice);
329 auto bobBalance = env.
balance(bob);
330 auto carolBalance = env.
balance(carol);
332 env(
pay(alice, carol,
XRP(100)),
337 BEAST_EXPECT(env.
balance(alice) == aliceBalance);
338 BEAST_EXPECT(env.
balance(bob) == bobBalance);
339 BEAST_EXPECT(env.
balance(carol) == carolBalance);
345 auto aliceBalance = env.
balance(alice);
346 auto bobBalance = env.
balance(bob);
347 auto carolBalance = env.
balance(carol);
348 auto const feeAmt =
XRP(10);
350 env(
pay(alice, carol,
XRP(20000)),
355 BEAST_EXPECT(env.
balance(alice) == aliceBalance);
356 BEAST_EXPECT(env.
balance(bob) == bobBalance - feeAmt);
357 BEAST_EXPECT(env.
balance(carol) == carolBalance);
371 env.
fund(
XRP(10000), alice, bob, carol);
374 auto aliceSeq = env.
seq(alice);
375 auto bobSeq = env.
seq(bob);
379 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
380 BEAST_EXPECT(env.
seq(bob) == bobSeq + 1);
381 aliceSeq = env.
seq(alice);
382 bobSeq = env.
seq(bob);
384 for (
auto i = 0; i < 20; ++i)
389 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
390 BEAST_EXPECT(env.
seq(bob) == bobSeq);
391 aliceSeq = env.
seq(alice);
395 BEAST_EXPECT(env.
seq(alice) == aliceSeq);
396 BEAST_EXPECT(env.
seq(bob) == bobSeq + 1);
397 bobSeq = env.
seq(bob);
402 BEAST_EXPECT(env.
seq(alice) == aliceSeq);
403 BEAST_EXPECT(env.
seq(bob) == bobSeq + 1);
404 bobSeq = env.
seq(bob);
408 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
409 BEAST_EXPECT(env.
seq(bob) == bobSeq);
410 aliceSeq = env.
seq(alice);
423 env.
fund(
XRP(100000), alice, bob);
434 auto const aliceBalance = env.
balance(alice);
435 auto const bobBalance = env.
balance(bob);
438 auto const deleteFee =
drops(env.
current()->fees().increment);
444 BEAST_EXPECT(env.
balance(bob) == bobBalance + aliceBalance - deleteFee);
453 testcase(
"test delegate transaction");
529 auto const USD = gw[
"USD"];
530 auto const EUR = gw2[
"EUR"];
535 env.
trust(USD(200), alice);
536 env.
trust(EUR(400), gw);
546 env(
pay(gw, alice, USD(50)),
558 env(
pay(gw, alice, USD(50)),
574 env(
pay(gw, alice,
XRP(50)),
587 BEAST_EXPECT(env.
balance(bob, USD) == USD(0));
597 BEAST_EXPECT(env.
balance(bob, USD) == USD(0));
615 env(
pay(gw2, gw, EUR(200)));
639 auto const USD = gw[
"USD"];
644 env.
trust(USD(200), alice);
661 env(
pay(gw, alice, USD(50)),
681 BEAST_EXPECT(env.
balance(bob, USD) == USD(0));
687 Env env(*
this, features);
692 auto const USD = gw[
"USD"];
694 env.
fund(
XRP(10000), alice, bob, carol, gw);
696 env.
trust(USD(50000), alice);
697 env.
trust(USD(50000), bob);
698 env.
trust(USD(50000), carol);
699 env(
pay(gw, alice, USD(10000)));
700 env(
pay(gw, bob, USD(10000)));
701 env(
pay(gw, carol, USD(10000)));
706 env(
offer(carol,
XRP(100), USD(501)));
713 env(
pay(gw, alice, USD(5000)),
720 env(
pay(gw, alice, USD(5000)),
734 env(
offer(bob,
XRP(100), USD(501)));
741 env(
pay(alice, gw, USD(5000)),
748 env(
pay(alice, gw, USD(5000)),
769 MPTTester mpt(env, gw, {.holders = {alice, bob}});
773 mpt.authorize({.account = alice});
774 mpt.authorize({.account = bob});
776 auto const MPT = mpt[
"MPT"];
777 env(
pay(gw, alice,
MPT(500)));
778 env(
pay(gw, bob,
MPT(500)));
790 BEAST_EXPECT(env.
balance(bob,
MPT) == bobMPT);
801 BEAST_EXPECT(env.
balance(bob,
MPT) == bobMPT);
808 alice, bob, {
"PaymentBurn",
"PaymentMint",
"Payment"}));
812 BEAST_EXPECT(env.
balance(bob,
MPT) == bobMPT);
815 BEAST_EXPECT(env.
balance(alice,
MPT) == aliceMPT -
MPT(100));
824 testcase(
"test TrustSet granular permissions");
833 env.
fund(
XRP(10000), gw, alice, bob);
841 env(
trust(alice, gw[
"USD"](50)),
847 env(
trust(alice, gw[
"USD"](50)));
895 gw, bob, {
"TrustlineAuthorize",
"TrustlineFreeze"}));
900 gw, bob, {
"TrustlineAuthorize",
"TrustlineUnfreeze"}));
913 env(
trust(alice, gw[
"USD"](100)),
916 env(
trust(gw, alice[
"USD"](100)),
921 auto tx =
trust(alice, gw[
"USD"](50));
922 tx[
"QualityIn"] =
"1000";
924 auto tx2 =
trust(alice, gw[
"USD"](50));
925 tx2[
"QualityOut"] =
"1000";
927 auto tx3 =
trust(gw, alice[
"USD"](50));
928 tx3[
"QualityIn"] =
"1000";
930 auto tx4 =
trust(gw, alice[
"USD"](50));
931 tx4[
"QualityOut"] =
"1000";
937 auto tx5 =
trust(gw, alice[
"USD"](50));
938 tx5[
"QualityOut"] =
"1000";
940 auto tx6 =
trust(alice, gw[
"USD"](50));
941 tx6[
"QualityOut"] =
"1000";
954 env.
fund(
XRP(10000), gw, alice, bob);
959 env(
trust(alice, gw[
"USD"](50)),
963 alice, bob, {
"TrustlineUnfreeze",
"NFTokenCreateOffer"}));
966 env(
trust(alice, gw[
"USD"](50)),
974 {
"TrustlineUnfreeze",
975 "NFTokenCreateOffer",
977 "AccountTransferRateSet"}));
985 {
"TrustlineUnfreeze",
986 "NFTokenCreateOffer",
988 "AccountTransferRateSet"}));
1014 env.
fund(
XRP(10000), gw, alice, bob);
1017 env(
trust(alice, gw[
"USD"](50)));
1031 testcase(
"test AccountSet granular permissions");
1032 using namespace jtx;
1039 auto const alice =
Account{
"alice"};
1040 auto const bob =
Account{
"bob"};
1041 env.
fund(
XRP(10000), alice, bob);
1052 auto jt =
noop(alice);
1054 jt[sfDelegate] = bob.human();
1059 alice, bob, {
"TrustlineUnfreeze",
"AccountEmailHashSet"}));
1074 BEAST_EXPECT(!env.
le(alice)->isFieldPresent(sfDomain));
1077 std::string const failDomain =
"fail_domain_update";
1079 jt[sfDomain] =
strHex(failDomain);
1087 std::string const mh(
"5F31A79367DC3137FADA860C05742EE6");
1088 jt[sfEmailHash] = mh;
1093 alice, bob, {
"AccountDomainSet",
"AccountEmailHashSet"}));
1096 BEAST_EXPECT(
to_string((*env.
le(alice))[sfEmailHash]) == mh);
1101 jt[sfMessageKey] =
strHex(rkp.first.slice());
1108 {
"AccountDomainSet",
1109 "AccountEmailHashSet",
1110 "AccountMessageKeySet"}));
1116 strHex((*env.
le(alice))[sfMessageKey]) ==
1117 strHex(rkp.first.slice()));
1118 jt[sfMessageKey] =
"";
1120 BEAST_EXPECT(!env.
le(alice)->isFieldPresent(sfMessageKey));
1123 env(
rate(alice, 2.0),
1131 {
"AccountDomainSet",
1132 "AccountEmailHashSet",
1133 "AccountMessageKeySet",
1134 "AccountTransferRateSet"}));
1136 auto jtRate =
rate(alice, 2.0);
1137 jtRate[sfDelegate] = bob.human();
1139 BEAST_EXPECT((*env.
le(alice))[sfTransferRate] == 2000000000);
1149 {
"AccountDomainSet",
1150 "AccountEmailHashSet",
1151 "AccountMessageKeySet",
1152 "AccountTransferRateSet",
1153 "AccountTickSizeSet"}));
1156 BEAST_EXPECT((*env.
le(alice))[sfTickSize] == 8);
1183 {
"AccountDomainSet",
1184 "AccountEmailHashSet",
1185 "AccountMessageKeySet"}));
1190 "9633EC8AF54F16B5286DB1D7B519EF49EEFC050C0C8AC4384F1D88ACD1BFDF"
1192 auto jv2 =
noop(alice);
1194 jv2[sfDelegate] = bob.human();
1195 jv2[sfWalletLocator] = locator;
1202 auto const alice =
Account{
"alice"};
1203 auto const bob =
Account{
"bob"};
1204 env.
fund(
XRP(10000), alice, bob);
1209 env(
fset(alice, flag),
1213 env(
fset(alice, flag));
1230 {
"AccountDomainSet",
1231 "AccountEmailHashSet",
1232 "AccountMessageKeySet"}));
1251 BEAST_EXPECT(env.
le(alice)->isFieldPresent(sfAccountTxnID));
1258 jt[sfDelegate] = bob.human();
1259 jt[sfNFTokenMinter] = bob.human();
1266 {
"AccountDomainSet",
1267 "AccountEmailHashSet",
1268 "AccountMessageKeySet"}));
1287 env(
regkey(bob, bobKey));
1300 env.
fund(
XRP(10000), alice, bob);
1304 alice, bob, {
"AccountDomainSet",
"AccountEmailHashSet"}));
1308 auto jt =
noop(alice);
1310 jt[sfDelegate] = bob.human();
1321 testcase(
"test MPTokenIssuanceSet granular");
1322 using namespace jtx;
1329 env.
fund(
XRP(100000), alice, bob);
1356 mpt.set({.account = alice, .flags =
tfMPTLock, .delegate = bob});
1365 alice, bob, {
"MPTokenIssuanceLock",
"MPTokenIssuanceUnlock"}));
1367 mpt.set({.account = alice, .flags =
tfMPTUnlock, .delegate = bob});
1368 mpt.set({.account = alice, .flags =
tfMPTLock, .delegate = bob});
1377 env.
fund(
XRP(100000), alice, bob);
1388 mpt.set({.account = alice, .flags =
tfMPTLock, .delegate = bob});
1401 {
"NFTokenMint",
"MPTokenIssuanceLock",
"NFTokenBurn"}));
1415 "MPTokenIssuanceLock",
1417 "MPTokenIssuanceSet"}));
1418 mpt.set({.account = alice, .flags =
tfMPTUnlock, .delegate = bob});
1420 mpt.set({.account = alice, .flags =
tfMPTLock});
1421 mpt.set({.account = alice, .flags =
tfMPTUnlock, .delegate = bob});
1422 mpt.set({.account = alice, .flags =
tfMPTLock, .delegate = bob});
1430 env.
fund(
XRP(100000), alice, bob);
1452 using namespace jtx;
1458 env.
fund(
XRP(100000), alice, bob, carol);
1464 auto aliceBalance = env.
balance(alice);
1465 auto bobBalance = env.
balance(bob);
1466 auto carolBalance = env.
balance(carol);
1468 env(
pay(alice, carol,
XRP(100)),
1473 BEAST_EXPECT(env.
balance(alice) == aliceBalance -
XRP(100));
1474 BEAST_EXPECT(env.
balance(bob) == bobBalance -
XRP(10));
1475 BEAST_EXPECT(env.
balance(carol) == carolBalance +
XRP(100));
1481 testcase(
"test single sign with bad secret");
1482 using namespace jtx;
1489 env.
fund(
XRP(100000), alice, bob, carol);
1495 auto aliceBalance = env.
balance(alice);
1496 auto bobBalance = env.
balance(bob);
1497 auto carolBalance = env.
balance(carol);
1499 env(
pay(alice, carol,
XRP(100)),
1505 BEAST_EXPECT(env.
balance(alice) == aliceBalance);
1506 BEAST_EXPECT(env.
balance(bob) == bobBalance);
1507 BEAST_EXPECT(env.
balance(carol) == carolBalance);
1512 Account alice{
"alice"}, bob{
"bob"}, carol{
"carol"};
1513 env.
fund(
XRP(100000), alice, bob, carol);
1519 auto aliceBalance = env.
balance(alice);
1520 auto bobBalance = env.
balance(bob);
1521 auto carolBalance = env.
balance(carol);
1523 env(
pay(alice, carol,
XRP(100)),
1529 BEAST_EXPECT(env.
balance(alice) == aliceBalance);
1530 BEAST_EXPECT(env.
balance(bob) == bobBalance);
1531 BEAST_EXPECT(env.
balance(carol) == carolBalance);
1533 env(
pay(alice, carol,
XRP(100)),
1539 BEAST_EXPECT(env.
balance(alice) == aliceBalance);
1540 BEAST_EXPECT(env.
balance(bob) == bobBalance);
1541 BEAST_EXPECT(env.
balance(carol) == carolBalance);
1546 Account alice{
"alice"}, bob{
"bob"}, carol{
"carol"};
1547 env.
fund(
XRP(100000), alice, bob, carol);
1550 auto aliceBalance = env.
balance(alice);
1551 auto bobBalance = env.
balance(bob);
1552 auto carolBalance = env.
balance(carol);
1554 env(
pay(alice, carol,
XRP(100)),
1560 BEAST_EXPECT(env.
balance(alice) == aliceBalance);
1561 BEAST_EXPECT(env.
balance(bob) == bobBalance);
1562 BEAST_EXPECT(env.
balance(carol) == carolBalance);
1564 env(
pay(alice, carol,
XRP(100)),
1570 BEAST_EXPECT(env.
balance(alice) == aliceBalance);
1571 BEAST_EXPECT(env.
balance(bob) == bobBalance);
1572 BEAST_EXPECT(env.
balance(carol) == carolBalance);
1580 using namespace jtx;
1588 env.
fund(
XRP(100000), alice, bob, carol, daria, edward);
1591 env(
signers(bob, 2, {{daria, 1}, {edward, 1}}));
1597 auto aliceBalance = env.
balance(alice);
1598 auto bobBalance = env.
balance(bob);
1599 auto carolBalance = env.
balance(carol);
1600 auto dariaBalance = env.
balance(daria);
1601 auto edwardBalance = env.
balance(edward);
1603 env(
pay(alice, carol,
XRP(100)),
1606 msig(daria, edward));
1608 BEAST_EXPECT(env.
balance(alice) == aliceBalance -
XRP(100));
1609 BEAST_EXPECT(env.
balance(bob) == bobBalance -
XRP(10));
1610 BEAST_EXPECT(env.
balance(carol) == carolBalance +
XRP(100));
1611 BEAST_EXPECT(env.
balance(daria) == dariaBalance);
1612 BEAST_EXPECT(env.
balance(edward) == edwardBalance);
1618 testcase(
"test multi sign which does not meet quorum");
1619 using namespace jtx;
1628 env.
fund(
XRP(100000), alice, bob, carol, daria, edward, fred);
1631 env(
signers(bob, 3, {{daria, 1}, {edward, 1}, {fred, 1}}));
1637 auto aliceBalance = env.
balance(alice);
1638 auto bobBalance = env.
balance(bob);
1639 auto carolBalance = env.
balance(carol);
1640 auto dariaBalance = env.
balance(daria);
1641 auto edwardBalance = env.
balance(edward);
1643 env(
pay(alice, carol,
XRP(100)),
1646 msig(daria, edward),
1649 BEAST_EXPECT(env.
balance(alice) == aliceBalance);
1650 BEAST_EXPECT(env.
balance(bob) == bobBalance);
1651 BEAST_EXPECT(env.
balance(carol) == carolBalance);
1652 BEAST_EXPECT(env.
balance(daria) == dariaBalance);
1653 BEAST_EXPECT(env.
balance(edward) == edwardBalance);
1660 using namespace jtx;
1662 Env env(*
this, features);
1666 env.
fund(
XRP(100000), alice, bob);
1669 auto buildRequest = [&](
auto value) ->
Json::Value {
1671 jv[jss::TransactionType] = jss::DelegateSet;
1672 jv[jss::Account] = alice.human();
1673 jv[sfAuthorize.jsonName] = bob.human();
1677 permissionValue[sfPermissionValue.jsonName] = value;
1679 permissionObj[sfPermission.jsonName] = permissionValue;
1680 permissionsJson.
append(permissionObj);
1681 jv[sfPermissions.jsonName] = permissionsJson;
1688 for (
auto value : {0, 100000, 54321})
1690 auto jv = buildRequest(value);
1698 testcase(
"test delegate disabled tx");
1699 using namespace jtx;
1706 {
"CheckCreate", featureChecks},
1707 {
"CheckCash", featureChecks},
1708 {
"CheckCancel", featureChecks},
1709 {
"Clawback", featureClawback},
1710 {
"AMMClawback", featureAMMClawback},
1711 {
"AMMCreate", featureAMM},
1712 {
"AMMDeposit", featureAMM},
1713 {
"AMMWithdraw", featureAMM},
1714 {
"AMMVote", featureAMM},
1715 {
"AMMBid", featureAMM},
1716 {
"AMMDelete", featureAMM},
1717 {
"XChainCreateClaimID", featureXChainBridge},
1718 {
"XChainCommit", featureXChainBridge},
1719 {
"XChainClaim", featureXChainBridge},
1720 {
"XChainAccountCreateCommit", featureXChainBridge},
1721 {
"XChainAddClaimAttestation", featureXChainBridge},
1722 {
"XChainAddAccountCreateAttestation", featureXChainBridge},
1723 {
"XChainModifyBridge", featureXChainBridge},
1724 {
"XChainCreateBridge", featureXChainBridge},
1725 {
"DIDSet", featureDID},
1726 {
"DIDDelete", featureDID},
1727 {
"OracleSet", featurePriceOracle},
1728 {
"OracleDelete", featurePriceOracle},
1729 {
"LedgerStateFix", fixNFTokenPageLinks},
1730 {
"MPTokenIssuanceCreate", featureMPTokensV1},
1731 {
"MPTokenIssuanceDestroy", featureMPTokensV1},
1732 {
"MPTokenIssuanceSet", featureMPTokensV1},
1733 {
"MPTokenAuthorize", featureMPTokensV1},
1734 {
"CredentialCreate", featureCredentials},
1735 {
"CredentialAccept", featureCredentials},
1736 {
"CredentialDelete", featureCredentials},
1737 {
"NFTokenModify", featureDynamicNFT},
1738 {
"PermissionedDomainSet", featurePermissionedDomains},
1739 {
"PermissionedDomainDelete", featurePermissionedDomains},
1740 {
"VaultCreate", featureSingleAssetVault},
1741 {
"VaultSet", featureSingleAssetVault},
1742 {
"VaultDelete", featureSingleAssetVault},
1743 {
"VaultDeposit", featureSingleAssetVault},
1744 {
"VaultWithdraw", featureSingleAssetVault},
1745 {
"VaultClawback", featureSingleAssetVault}};
1751 BEAST_EXPECT(txRequiredFeatures.contains(tx));
1753 Env env(*
this, features - txRequiredFeatures[tx]);
1757 env.
fund(
XRP(100000), alice, bob);
1763 for (
auto const& tx : txRequiredFeatures)
1764 txAmendmentDisabled(features, tx.first);
1770 auto txAmendmentEnabled = [&](
std::string const& tx) {
1771 Env env(*
this, features);
1775 env.
fund(
XRP(100000), alice, bob);
1781 for (
auto const& tx : txRequiredFeatures)
1782 txAmendmentEnabled(tx.first);
1812BEAST_DEFINE_TESTSUITE(Delegate, app,
ripple);
Value & append(Value const &value)
Append value to array at the end.
testcase_t testcase
Memberspace for declaring test cases.
void testTrustSetGranular()
void run() override
Runs the suite.
void testMPTokenIssuanceSetGranular()
void testSingleSignBadSecret()
void testPermissionValue(FeatureBitset features)
void testDelegateTransaction()
void testFeatureDisabled(FeatureBitset features)
void testTxReqireFeatures(FeatureBitset features)
void testInvalidRequest(FeatureBitset features)
void testMultiSignQuorumNotMet()
void testPaymentGranular(FeatureBitset features)
void testAccountSetGranular()
Immutable cryptographic account descriptor.
A transaction testing environment.
std::shared_ptr< ReadView const > closed()
Returns the last closed ledger.
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 fund(bool setDefaultRipple, STAmount const &amount, Account const &account)
PrettyAmount balance(Account const &account) const
Returns the XRP balance on an account.
std::shared_ptr< SLE const > le(Account const &account) const
Return an account root.
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 delegate(AccountID const &account, AccountID const &authorizedAccount) noexcept
A keylet for Delegate object.
Keylet account(AccountID const &id) noexcept
AccountID root.
Keylet ownerDir(AccountID const &id) noexcept
The root page of an account's directory.
Json::Value create(A const &account, A const &dest, STAmount const &sendMax)
Create a check.
Json::Value entry(jtx::Env &env, jtx::Account const &account, jtx::Account const &authorize)
Json::Value set(jtx::Account const &account, jtx::Account const &authorize, std::vector< std::string > const &permissions)
Json::Value set(jtx::Account const &account)
Json::Value fclear(Account const &account, std::uint32_t off)
Remove account flag.
Json::Value regkey(Account const &account, disabled_t)
Disable the regular key.
Json::Value signers(Account const &account, std::uint32_t quorum, std::vector< signer > const &v)
bool expectOffers(Env &env, AccountID const &account, std::uint16_t size, std::vector< Amounts > const &toMatch)
PrettyAmount drops(Integer i)
Returns an XRP PrettyAmount, which is trivially convertible to STAmount.
Json::Value trust(Account const &account, STAmount const &amount, std::uint32_t flags)
Modify a trust line.
Json::Value fset(Account const &account, std::uint32_t on, std::uint32_t off=0)
Add and/or remove flag.
Json::Value pay(AccountID const &account, AccountID const &to, AnyAmount amount)
Create a payment.
FeatureBitset testable_amendments()
Json::Value rate(Account const &account, double multiplier)
Set a transfer rate.
Json::Value offer(Account const &account, STAmount const &takerPays, STAmount const &takerGets, std::uint32_t flags)
Create an offer.
Json::Value acctdelete(Account const &account, Account const &dest)
Delete account.
XRP_t const XRP
Converts to XRP Issue or STAmount.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
constexpr std::uint32_t asfGlobalFreeze
constexpr std::uint32_t asfDepositAuth
constexpr std::uint32_t asfDisallowIncomingNFTokenOffer
constexpr std::uint32_t tfSetDeepFreeze
constexpr std::uint32_t const tfMPTCanTransfer
constexpr std::uint32_t asfRequireDest
constexpr std::uint32_t const tfMPTUnlock
constexpr std::uint32_t asfAuthorizedNFTokenMinter
constexpr std::uint32_t asfNoFreeze
constexpr std::uint32_t asfDisableMaster
constexpr std::uint32_t asfDisallowIncomingTrustline
constexpr std::uint32_t tfPartialPayment
constexpr std::uint32_t tfClearNoRipple
std::string strHex(FwdIt begin, FwdIt end)
constexpr std::uint32_t tfSetfAuth
constexpr std::uint32_t asfAccountTxnID
constexpr std::uint32_t asfDefaultRipple
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 asfDisallowIncomingCheck
constexpr std::uint32_t tfClearFreeze
constexpr std::uint32_t tfRequireAuth
@ tecINSUFFICIENT_RESERVE
constexpr std::uint32_t const tfMPTLock
constexpr std::uint32_t tfClearDeepFreeze
std::string to_string(base_uint< Bits, Tag > const &a)
constexpr std::uint32_t asfDisallowIncomingPayChan
std::pair< PublicKey, SecretKey > randomKeyPair(KeyType type)
Create a key pair using secure random numbers.
constexpr std::uint32_t tfFullyCanonicalSig
Transaction flags.
constexpr std::uint32_t asfAllowTrustLineClawback
constexpr std::uint32_t asfRequireAuth
@ terNO_DELEGATE_PERMISSION
constexpr std::uint32_t tfSetFreeze
constexpr std::uint32_t tfSetNoRipple
constexpr std::uint32_t const tfMPTCanLock
constexpr std::uint32_t asfDisallowXRP