19#include <test/jtx/CaptureLogs.h>
20#include <test/jtx/delegate.h>
22#include <xrpl/protocol/Feature.h>
23#include <xrpl/protocol/Permissions.h>
32 testcase(
"test feature not enabled");
35 Env env{*
this, features};
39 env.fund(
XRP(1000000), gw, alice, bob);
42 auto res = features[featurePermissionDelegationV1_1] ?
ter(
tesSUCCESS)
56 testcase(
"test valid request creating, updating, deleting permissions");
62 env.
fund(
XRP(100000), gw, alice);
70 BEAST_EXPECT(entry[jss::result][jss::error] ==
"entryNotFound");
83 auto comparePermissions =
89 !jle[jss::result].isMember(jss::error) &&
90 jle[jss::result].isMember(jss::node));
92 jle[jss::result][jss::node][
"LedgerEntryType"] ==
95 jle[jss::result][jss::node][jss::Account] ==
98 jle[jss::result][jss::node][sfAuthorize.jsonName] ==
101 auto const& jPermissions =
102 jle[jss::result][jss::node][sfPermissions.jsonName];
104 for (
auto const& permission : permissions)
107 jPermissions[i][sfPermission.jsonName]
108 [sfPermissionValue.jsonName] == permission);
119 "Payment",
"AMMCreate",
"AMMDeposit",
"AMMWithdraw"};
134 BEAST_EXPECT(jle[jss::result][jss::error] ==
"entryNotFound");
143 BEAST_EXPECT(response[jss::result][jss::error] ==
"entryNotFound");
149 testcase(
"test invalid DelegateSet");
152 Env env(*
this, features);
156 env.
fund(
XRP(100000), gw, alice, bob);
187 jv[jss::TransactionType] = jss::DelegateSet;
188 jv[jss::Account] = gw.human();
189 jv[sfAuthorize.jsonName] = alice.human();
192 permissionValue[sfPermissionValue.jsonName] =
"Payment";
194 permissionObj[sfPermission.jsonName] = permissionValue;
195 permissionsJson.
append(permissionObj);
196 jv[sfPermissions.jsonName] = permissionsJson;
197 jv[sfFee.jsonName] = -1;
210 "TrustlineAuthorize",
212 "TrustlineAuthorize"}),
252 drops(env.
current()->fees().accountReserve(1)), bob, carol);
306 env.
fund(
XRP(10000), alice, carol);
311 auto aliceBalance = env.
balance(alice);
312 auto bobBalance = env.
balance(bob);
313 auto carolBalance = env.
balance(carol);
315 env(
pay(alice, carol,
XRP(100)),
320 BEAST_EXPECT(env.
balance(alice) == aliceBalance);
321 BEAST_EXPECT(env.
balance(bob) == bobBalance);
322 BEAST_EXPECT(env.
balance(carol) == carolBalance);
330 auto aliceBalance = env.
balance(alice);
331 auto bobBalance = env.
balance(bob);
332 auto carolBalance = env.
balance(carol);
334 auto const sendAmt =
XRP(100);
335 auto const feeAmt =
XRP(10);
338 BEAST_EXPECT(env.
balance(alice) == aliceBalance - sendAmt);
339 BEAST_EXPECT(env.
balance(bob) == bobBalance - feeAmt);
340 BEAST_EXPECT(env.
balance(carol) == carolBalance + sendAmt);
345 auto aliceBalance = env.
balance(alice);
346 auto bobBalance = env.
balance(bob);
347 auto carolBalance = env.
balance(carol);
349 env(
pay(alice, carol,
XRP(100)),
354 BEAST_EXPECT(env.
balance(alice) == aliceBalance);
355 BEAST_EXPECT(env.
balance(bob) == bobBalance);
356 BEAST_EXPECT(env.
balance(carol) == carolBalance);
362 auto aliceBalance = env.
balance(alice);
363 auto bobBalance = env.
balance(bob);
364 auto carolBalance = env.
balance(carol);
365 auto const feeAmt =
XRP(10);
367 env(
pay(alice, carol,
XRP(20000)),
372 BEAST_EXPECT(env.
balance(alice) == aliceBalance);
373 BEAST_EXPECT(env.
balance(bob) == bobBalance - feeAmt);
374 BEAST_EXPECT(env.
balance(carol) == carolBalance);
388 env.
fund(
XRP(10000), alice, bob, carol);
391 auto aliceSeq = env.
seq(alice);
392 auto bobSeq = env.
seq(bob);
396 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
397 BEAST_EXPECT(env.
seq(bob) == bobSeq + 1);
398 aliceSeq = env.
seq(alice);
399 bobSeq = env.
seq(bob);
401 for (
auto i = 0; i < 20; ++i)
406 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
407 BEAST_EXPECT(env.
seq(bob) == bobSeq);
408 aliceSeq = env.
seq(alice);
412 BEAST_EXPECT(env.
seq(alice) == aliceSeq);
413 BEAST_EXPECT(env.
seq(bob) == bobSeq + 1);
414 bobSeq = env.
seq(bob);
419 BEAST_EXPECT(env.
seq(alice) == aliceSeq);
420 BEAST_EXPECT(env.
seq(bob) == bobSeq + 1);
421 bobSeq = env.
seq(bob);
425 BEAST_EXPECT(env.
seq(alice) == aliceSeq + 1);
426 BEAST_EXPECT(env.
seq(bob) == bobSeq);
427 aliceSeq = env.
seq(alice);
440 env.
fund(
XRP(100000), alice, bob);
451 auto const aliceBalance = env.
balance(alice);
452 auto const bobBalance = env.
balance(bob);
455 auto const deleteFee =
drops(env.
current()->fees().increment);
461 BEAST_EXPECT(env.
balance(bob) == bobBalance + aliceBalance - deleteFee);
470 testcase(
"test delegate transaction");
546 auto const USD = gw[
"USD"];
547 auto const EUR = gw2[
"EUR"];
552 env.
trust(USD(200), alice);
553 env.
trust(EUR(400), gw);
563 env(
pay(gw, alice, USD(50)),
575 env(
pay(gw, alice, USD(50)),
591 env(
pay(gw, alice,
XRP(50)),
604 BEAST_EXPECT(env.
balance(bob, USD) == USD(0));
614 BEAST_EXPECT(env.
balance(bob, USD) == USD(0));
632 env(
pay(gw2, gw, EUR(200)));
656 auto const USD = gw[
"USD"];
661 env.
trust(USD(200), alice);
678 env(
pay(gw, alice, USD(50)),
698 BEAST_EXPECT(env.
balance(bob, USD) == USD(0));
704 Env env(*
this, features);
709 auto const USD = gw[
"USD"];
711 env.
fund(
XRP(10000), alice, bob, carol, gw);
713 env.
trust(USD(50000), alice);
714 env.
trust(USD(50000), bob);
715 env.
trust(USD(50000), carol);
716 env(
pay(gw, alice, USD(10000)));
717 env(
pay(gw, bob, USD(10000)));
718 env(
pay(gw, carol, USD(10000)));
723 env(
offer(carol,
XRP(100), USD(501)));
730 env(
pay(gw, alice, USD(5000)),
737 env(
pay(gw, alice, USD(5000)),
751 env(
offer(bob,
XRP(100), USD(501)));
758 env(
pay(alice, gw, USD(5000)),
765 env(
pay(alice, gw, USD(5000)),
786 MPTTester mpt(env, gw, {.holders = {alice, bob}});
790 mpt.authorize({.account = alice});
791 mpt.authorize({.account = bob});
793 auto const MPT = mpt[
"MPT"];
794 env(
pay(gw, alice,
MPT(500)));
795 env(
pay(gw, bob,
MPT(500)));
807 BEAST_EXPECT(env.
balance(bob,
MPT) == bobMPT);
818 BEAST_EXPECT(env.
balance(bob,
MPT) == bobMPT);
825 alice, bob, {
"PaymentBurn",
"PaymentMint",
"Payment"}));
829 BEAST_EXPECT(env.
balance(bob,
MPT) == bobMPT);
832 BEAST_EXPECT(env.
balance(alice,
MPT) == aliceMPT -
MPT(100));
841 testcase(
"test TrustSet granular permissions");
850 env.
fund(
XRP(10000), gw, alice, bob);
858 env(
trust(alice, gw[
"USD"](50)),
864 env(
trust(alice, gw[
"USD"](50)));
912 gw, bob, {
"TrustlineAuthorize",
"TrustlineFreeze"}));
917 gw, bob, {
"TrustlineAuthorize",
"TrustlineUnfreeze"}));
930 env(
trust(alice, gw[
"USD"](100)),
933 env(
trust(gw, alice[
"USD"](100)),
938 auto tx =
trust(alice, gw[
"USD"](50));
939 tx[
"QualityIn"] =
"1000";
941 auto tx2 =
trust(alice, gw[
"USD"](50));
942 tx2[
"QualityOut"] =
"1000";
944 auto tx3 =
trust(gw, alice[
"USD"](50));
945 tx3[
"QualityIn"] =
"1000";
947 auto tx4 =
trust(gw, alice[
"USD"](50));
948 tx4[
"QualityOut"] =
"1000";
954 auto tx5 =
trust(gw, alice[
"USD"](50));
955 tx5[
"QualityOut"] =
"1000";
957 auto tx6 =
trust(alice, gw[
"USD"](50));
958 tx6[
"QualityOut"] =
"1000";
971 env.
fund(
XRP(10000), gw, alice, bob);
976 env(
trust(alice, gw[
"USD"](50)),
980 alice, bob, {
"TrustlineUnfreeze",
"NFTokenCreateOffer"}));
983 env(
trust(alice, gw[
"USD"](50)),
991 {
"TrustlineUnfreeze",
992 "NFTokenCreateOffer",
994 "AccountTransferRateSet"}));
1002 {
"TrustlineUnfreeze",
1003 "NFTokenCreateOffer",
1005 "AccountTransferRateSet"}));
1031 env.
fund(
XRP(10000), gw, alice, bob);
1034 env(
trust(alice, gw[
"USD"](50)));
1048 testcase(
"test AccountSet granular permissions");
1049 using namespace jtx;
1056 auto const alice =
Account{
"alice"};
1057 auto const bob =
Account{
"bob"};
1058 env.
fund(
XRP(10000), alice, bob);
1069 auto jt =
noop(alice);
1071 jt[sfDelegate] = bob.human();
1076 alice, bob, {
"TrustlineUnfreeze",
"AccountEmailHashSet"}));
1091 BEAST_EXPECT(!env.
le(alice)->isFieldPresent(sfDomain));
1094 std::string const failDomain =
"fail_domain_update";
1096 jt[sfDomain] =
strHex(failDomain);
1104 std::string const mh(
"5F31A79367DC3137FADA860C05742EE6");
1105 jt[sfEmailHash] = mh;
1110 alice, bob, {
"AccountDomainSet",
"AccountEmailHashSet"}));
1113 BEAST_EXPECT(
to_string((*env.
le(alice))[sfEmailHash]) == mh);
1118 jt[sfMessageKey] =
strHex(rkp.first.slice());
1125 {
"AccountDomainSet",
1126 "AccountEmailHashSet",
1127 "AccountMessageKeySet"}));
1133 strHex((*env.
le(alice))[sfMessageKey]) ==
1134 strHex(rkp.first.slice()));
1135 jt[sfMessageKey] =
"";
1137 BEAST_EXPECT(!env.
le(alice)->isFieldPresent(sfMessageKey));
1140 env(
rate(alice, 2.0),
1148 {
"AccountDomainSet",
1149 "AccountEmailHashSet",
1150 "AccountMessageKeySet",
1151 "AccountTransferRateSet"}));
1153 auto jtRate =
rate(alice, 2.0);
1154 jtRate[sfDelegate] = bob.human();
1156 BEAST_EXPECT((*env.
le(alice))[sfTransferRate] == 2000000000);
1166 {
"AccountDomainSet",
1167 "AccountEmailHashSet",
1168 "AccountMessageKeySet",
1169 "AccountTransferRateSet",
1170 "AccountTickSizeSet"}));
1173 BEAST_EXPECT((*env.
le(alice))[sfTickSize] == 8);
1200 {
"AccountDomainSet",
1201 "AccountEmailHashSet",
1202 "AccountMessageKeySet"}));
1207 "9633EC8AF54F16B5286DB1D7B519EF49EEFC050C0C8AC4384F1D88ACD1BFDF"
1209 auto jv2 =
noop(alice);
1211 jv2[sfDelegate] = bob.human();
1212 jv2[sfWalletLocator] = locator;
1219 auto const alice =
Account{
"alice"};
1220 auto const bob =
Account{
"bob"};
1221 env.
fund(
XRP(10000), alice, bob);
1226 env(
fset(alice, flag),
1230 env(
fset(alice, flag));
1247 {
"AccountDomainSet",
1248 "AccountEmailHashSet",
1249 "AccountMessageKeySet"}));
1268 BEAST_EXPECT(env.
le(alice)->isFieldPresent(sfAccountTxnID));
1275 jt[sfDelegate] = bob.human();
1276 jt[sfNFTokenMinter] = bob.human();
1283 {
"AccountDomainSet",
1284 "AccountEmailHashSet",
1285 "AccountMessageKeySet"}));
1304 env(
regkey(bob, bobKey));
1317 env.
fund(
XRP(10000), alice, bob);
1321 alice, bob, {
"AccountDomainSet",
"AccountEmailHashSet"}));
1325 auto jt =
noop(alice);
1327 jt[sfDelegate] = bob.human();
1338 testcase(
"test MPTokenIssuanceSet granular");
1339 using namespace jtx;
1346 env.
fund(
XRP(100000), alice, bob);
1373 mpt.set({.account = alice, .flags =
tfMPTLock, .delegate = bob});
1382 alice, bob, {
"MPTokenIssuanceLock",
"MPTokenIssuanceUnlock"}));
1384 mpt.set({.account = alice, .flags =
tfMPTUnlock, .delegate = bob});
1385 mpt.set({.account = alice, .flags =
tfMPTLock, .delegate = bob});
1394 env.
fund(
XRP(100000), alice, bob);
1405 mpt.set({.account = alice, .flags =
tfMPTLock, .delegate = bob});
1418 {
"NFTokenMint",
"MPTokenIssuanceLock",
"NFTokenBurn"}));
1432 "MPTokenIssuanceLock",
1434 "MPTokenIssuanceSet"}));
1435 mpt.set({.account = alice, .flags =
tfMPTUnlock, .delegate = bob});
1437 mpt.set({.account = alice, .flags =
tfMPTLock});
1438 mpt.set({.account = alice, .flags =
tfMPTUnlock, .delegate = bob});
1439 mpt.set({.account = alice, .flags =
tfMPTLock, .delegate = bob});
1447 env.
fund(
XRP(100000), alice, bob);
1469 using namespace jtx;
1475 env.
fund(
XRP(100000), alice, bob, carol);
1481 auto aliceBalance = env.
balance(alice);
1482 auto bobBalance = env.
balance(bob);
1483 auto carolBalance = env.
balance(carol);
1485 env(
pay(alice, carol,
XRP(100)),
1490 BEAST_EXPECT(env.
balance(alice) == aliceBalance -
XRP(100));
1491 BEAST_EXPECT(env.
balance(bob) == bobBalance -
XRP(10));
1492 BEAST_EXPECT(env.
balance(carol) == carolBalance +
XRP(100));
1498 testcase(
"test single sign with bad secret");
1499 using namespace jtx;
1506 env.
fund(
XRP(100000), alice, bob, carol);
1512 auto aliceBalance = env.
balance(alice);
1513 auto bobBalance = env.
balance(bob);
1514 auto carolBalance = env.
balance(carol);
1516 env(
pay(alice, carol,
XRP(100)),
1522 BEAST_EXPECT(env.
balance(alice) == aliceBalance);
1523 BEAST_EXPECT(env.
balance(bob) == bobBalance);
1524 BEAST_EXPECT(env.
balance(carol) == carolBalance);
1529 Account alice{
"alice"}, bob{
"bob"}, carol{
"carol"};
1530 env.
fund(
XRP(100000), alice, bob, carol);
1536 auto aliceBalance = env.
balance(alice);
1537 auto bobBalance = env.
balance(bob);
1538 auto carolBalance = env.
balance(carol);
1540 env(
pay(alice, carol,
XRP(100)),
1546 BEAST_EXPECT(env.
balance(alice) == aliceBalance);
1547 BEAST_EXPECT(env.
balance(bob) == bobBalance);
1548 BEAST_EXPECT(env.
balance(carol) == carolBalance);
1550 env(
pay(alice, carol,
XRP(100)),
1556 BEAST_EXPECT(env.
balance(alice) == aliceBalance);
1557 BEAST_EXPECT(env.
balance(bob) == bobBalance);
1558 BEAST_EXPECT(env.
balance(carol) == carolBalance);
1563 Account alice{
"alice"}, bob{
"bob"}, carol{
"carol"};
1564 env.
fund(
XRP(100000), alice, bob, carol);
1567 auto aliceBalance = env.
balance(alice);
1568 auto bobBalance = env.
balance(bob);
1569 auto carolBalance = env.
balance(carol);
1571 env(
pay(alice, carol,
XRP(100)),
1577 BEAST_EXPECT(env.
balance(alice) == aliceBalance);
1578 BEAST_EXPECT(env.
balance(bob) == bobBalance);
1579 BEAST_EXPECT(env.
balance(carol) == carolBalance);
1581 env(
pay(alice, carol,
XRP(100)),
1587 BEAST_EXPECT(env.
balance(alice) == aliceBalance);
1588 BEAST_EXPECT(env.
balance(bob) == bobBalance);
1589 BEAST_EXPECT(env.
balance(carol) == carolBalance);
1597 using namespace jtx;
1605 env.
fund(
XRP(100000), alice, bob, carol, daria, edward);
1608 env(
signers(bob, 2, {{daria, 1}, {edward, 1}}));
1614 auto aliceBalance = env.
balance(alice);
1615 auto bobBalance = env.
balance(bob);
1616 auto carolBalance = env.
balance(carol);
1617 auto dariaBalance = env.
balance(daria);
1618 auto edwardBalance = env.
balance(edward);
1620 env(
pay(alice, carol,
XRP(100)),
1623 msig(daria, edward));
1625 BEAST_EXPECT(env.
balance(alice) == aliceBalance -
XRP(100));
1626 BEAST_EXPECT(env.
balance(bob) == bobBalance -
XRP(10));
1627 BEAST_EXPECT(env.
balance(carol) == carolBalance +
XRP(100));
1628 BEAST_EXPECT(env.
balance(daria) == dariaBalance);
1629 BEAST_EXPECT(env.
balance(edward) == edwardBalance);
1635 testcase(
"test multi sign which does not meet quorum");
1636 using namespace jtx;
1645 env.
fund(
XRP(100000), alice, bob, carol, daria, edward, fred);
1648 env(
signers(bob, 3, {{daria, 1}, {edward, 1}, {fred, 1}}));
1654 auto aliceBalance = env.
balance(alice);
1655 auto bobBalance = env.
balance(bob);
1656 auto carolBalance = env.
balance(carol);
1657 auto dariaBalance = env.
balance(daria);
1658 auto edwardBalance = env.
balance(edward);
1660 env(
pay(alice, carol,
XRP(100)),
1663 msig(daria, edward),
1666 BEAST_EXPECT(env.
balance(alice) == aliceBalance);
1667 BEAST_EXPECT(env.
balance(bob) == bobBalance);
1668 BEAST_EXPECT(env.
balance(carol) == carolBalance);
1669 BEAST_EXPECT(env.
balance(daria) == dariaBalance);
1670 BEAST_EXPECT(env.
balance(edward) == edwardBalance);
1677 using namespace jtx;
1679 Env env(*
this, features);
1683 env.
fund(
XRP(100000), alice, bob);
1686 auto buildRequest = [&](
auto value) ->
Json::Value {
1688 jv[jss::TransactionType] = jss::DelegateSet;
1689 jv[jss::Account] = alice.human();
1690 jv[sfAuthorize.jsonName] = bob.human();
1694 permissionValue[sfPermissionValue.jsonName] = value;
1696 permissionObj[sfPermission.jsonName] = permissionValue;
1697 permissionsJson.
append(permissionObj);
1698 jv[sfPermissions.jsonName] = permissionsJson;
1705 for (
auto value : {0, 100000, 54321})
1707 auto jv = buildRequest(value);
1715 testcase(
"test delegate disabled tx");
1716 using namespace jtx;
1723 {
"TicketCreate", featureTicketBatch},
1724 {
"CheckCreate", featureChecks},
1725 {
"CheckCash", featureChecks},
1726 {
"CheckCancel", featureChecks},
1727 {
"DepositPreauth", featureDepositPreauth},
1728 {
"Clawback", featureClawback},
1729 {
"AMMClawback", featureAMMClawback},
1730 {
"AMMCreate", featureAMM},
1731 {
"AMMDeposit", featureAMM},
1732 {
"AMMWithdraw", featureAMM},
1733 {
"AMMVote", featureAMM},
1734 {
"AMMBid", featureAMM},
1735 {
"AMMDelete", featureAMM},
1736 {
"XChainCreateClaimID", featureXChainBridge},
1737 {
"XChainCommit", featureXChainBridge},
1738 {
"XChainClaim", featureXChainBridge},
1739 {
"XChainAccountCreateCommit", featureXChainBridge},
1740 {
"XChainAddClaimAttestation", featureXChainBridge},
1741 {
"XChainAddAccountCreateAttestation", featureXChainBridge},
1742 {
"XChainModifyBridge", featureXChainBridge},
1743 {
"XChainCreateBridge", featureXChainBridge},
1744 {
"DIDSet", featureDID},
1745 {
"DIDDelete", featureDID},
1746 {
"OracleSet", featurePriceOracle},
1747 {
"OracleDelete", featurePriceOracle},
1748 {
"LedgerStateFix", fixNFTokenPageLinks},
1749 {
"MPTokenIssuanceCreate", featureMPTokensV1},
1750 {
"MPTokenIssuanceDestroy", featureMPTokensV1},
1751 {
"MPTokenIssuanceSet", featureMPTokensV1},
1752 {
"MPTokenAuthorize", featureMPTokensV1},
1753 {
"CredentialCreate", featureCredentials},
1754 {
"CredentialAccept", featureCredentials},
1755 {
"CredentialDelete", featureCredentials},
1756 {
"NFTokenModify", featureDynamicNFT},
1757 {
"PermissionedDomainSet", featurePermissionedDomains},
1758 {
"PermissionedDomainDelete", featurePermissionedDomains},
1759 {
"VaultCreate", featureSingleAssetVault},
1760 {
"VaultSet", featureSingleAssetVault},
1761 {
"VaultDelete", featureSingleAssetVault},
1762 {
"VaultDeposit", featureSingleAssetVault},
1763 {
"VaultWithdraw", featureSingleAssetVault},
1764 {
"VaultClawback", featureSingleAssetVault}};
1770 BEAST_EXPECT(txRequiredFeatures.contains(tx));
1772 Env env(*
this, features - txRequiredFeatures[tx]);
1776 env.
fund(
XRP(100000), alice, bob);
1782 for (
auto const& tx : txRequiredFeatures)
1783 txAmendmentDisabled(features, tx.first);
1789 auto txAmendmentEnabled = [&](
std::string const& tx) {
1790 Env env(*
this, features);
1794 env.
fund(
XRP(100000), alice, bob);
1800 for (
auto const& tx : txRequiredFeatures)
1801 txAmendmentEnabled(tx.first);
1813 features - featureNonFungibleTokensV1 -
1814 featureNonFungibleTokensV1_1);
1818 env.
fund(
XRP(100000), alice, bob);
1821 for (
auto const tx :
1824 "NFTokenCreateOffer",
1825 "NFTokenCancelOffer",
1826 "NFTokenAcceptOffer"})
1837 for (
auto const feature :
1838 {featureNonFungibleTokensV1, featureNonFungibleTokensV1_1})
1840 Env env(*
this, features - feature);
1843 env.
fund(
XRP(100000), alice, bob);
1846 for (
auto const tx :
1849 "NFTokenCreateOffer",
1850 "NFTokenCancelOffer",
1851 "NFTokenAcceptOffer"})
1883BEAST_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