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            {
"TicketCreate", featureTicketBatch},
 
 1707            {
"CheckCreate", featureChecks},
 
 1708            {
"CheckCash", featureChecks},
 
 1709            {
"CheckCancel", featureChecks},
 
 1710            {
"DepositPreauth", featureDepositPreauth},
 
 1711            {
"Clawback", featureClawback},
 
 1712            {
"AMMClawback", featureAMMClawback},
 
 1713            {
"AMMCreate", featureAMM},
 
 1714            {
"AMMDeposit", featureAMM},
 
 1715            {
"AMMWithdraw", featureAMM},
 
 1716            {
"AMMVote", featureAMM},
 
 1717            {
"AMMBid", featureAMM},
 
 1718            {
"AMMDelete", featureAMM},
 
 1719            {
"XChainCreateClaimID", featureXChainBridge},
 
 1720            {
"XChainCommit", featureXChainBridge},
 
 1721            {
"XChainClaim", featureXChainBridge},
 
 1722            {
"XChainAccountCreateCommit", featureXChainBridge},
 
 1723            {
"XChainAddClaimAttestation", featureXChainBridge},
 
 1724            {
"XChainAddAccountCreateAttestation", featureXChainBridge},
 
 1725            {
"XChainModifyBridge", featureXChainBridge},
 
 1726            {
"XChainCreateBridge", featureXChainBridge},
 
 1727            {
"DIDSet", featureDID},
 
 1728            {
"DIDDelete", featureDID},
 
 1729            {
"OracleSet", featurePriceOracle},
 
 1730            {
"OracleDelete", featurePriceOracle},
 
 1731            {
"LedgerStateFix", fixNFTokenPageLinks},
 
 1732            {
"MPTokenIssuanceCreate", featureMPTokensV1},
 
 1733            {
"MPTokenIssuanceDestroy", featureMPTokensV1},
 
 1734            {
"MPTokenIssuanceSet", featureMPTokensV1},
 
 1735            {
"MPTokenAuthorize", featureMPTokensV1},
 
 1736            {
"CredentialCreate", featureCredentials},
 
 1737            {
"CredentialAccept", featureCredentials},
 
 1738            {
"CredentialDelete", featureCredentials},
 
 1739            {
"NFTokenModify", featureDynamicNFT},
 
 1740            {
"PermissionedDomainSet", featurePermissionedDomains},
 
 1741            {
"PermissionedDomainDelete", featurePermissionedDomains},
 
 1742            {
"VaultCreate", featureSingleAssetVault},
 
 1743            {
"VaultSet", featureSingleAssetVault},
 
 1744            {
"VaultDelete", featureSingleAssetVault},
 
 1745            {
"VaultDeposit", featureSingleAssetVault},
 
 1746            {
"VaultWithdraw", featureSingleAssetVault},
 
 1747            {
"VaultClawback", featureSingleAssetVault}};
 
 1753                BEAST_EXPECT(txRequiredFeatures.contains(tx));
 
 1755                Env env(*
this, features - txRequiredFeatures[tx]);
 
 1759                env.
fund(
XRP(100000), alice, bob);
 
 1765            for (
auto const& tx : txRequiredFeatures)
 
 1766                txAmendmentDisabled(features, tx.first);
 
 1772            auto txAmendmentEnabled = [&](
std::string const& tx) {
 
 1773                Env env(*
this, features);
 
 1777                env.
fund(
XRP(100000), alice, bob);
 
 1783            for (
auto const& tx : txRequiredFeatures)
 
 1784                txAmendmentEnabled(tx.first);
 
 
 
 1814BEAST_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