22            auto const info = env.
rpc(
"json", 
"account_info", 
"{ }");
 
   24                info[jss::result][jss::error_message] ==
 
   25                "Missing field 'account'.");
 
   29            auto const info = env.
rpc(
 
   33                "\"n94JNrQYkDrpt62bbSR7nVEhdyAvcJXRAsjEkFYyqRkh9SUTYEqV\"}");
 
   37                info[jss::result][jss::error_message] == 
"Account malformed.");
 
   43            params[jss::account] = bogie.human();
 
   49                info[jss::result][jss::error_message] == 
"Account not found.");
 
   54                env.
rpc(
"json", 
"account_info", R
"({"account": "foo"})"); 
   58                info[jss::result][jss::error_message] == "Account malformed.");
 
   63            auto testInvalidAccountParam = [&](
auto const& param) {
 
   65                params[jss::account] = param;
 
   67                    "json", 
"account_info", 
to_string(params))[jss::result];
 
   68                BEAST_EXPECT(jrr[jss::error] == 
"invalidParams");
 
   70                    jrr[jss::error_message] == 
"Invalid field 'account'.");
 
   73            testInvalidAccountParam(1);
 
   74            testInvalidAccountParam(1.1);
 
   75            testInvalidAccountParam(
true);
 
   83            auto testInvalidIdentParam = [&](
auto const& param) {
 
   85                params[jss::ident] = param;
 
   87                    "json", 
"account_info", 
to_string(params))[jss::result];
 
   88                BEAST_EXPECT(jrr[jss::error] == 
"invalidParams");
 
   90                    jrr[jss::error_message] == 
"Invalid field 'ident'.");
 
   93            testInvalidIdentParam(1);
 
   94            testInvalidIdentParam(1.1);
 
   95            testInvalidIdentParam(
true);
 
 
  113        withoutSigners[jss::account] = alice.human();
 
  116        withSigners[jss::account] = alice.human();
 
  117        withSigners[jss::signer_lists] = 
true;
 
  123                env.
rpc(
"json", 
"account_info", 
to_string(withoutSigners));
 
  125                info.isMember(jss::result) &&
 
  126                info[jss::result].isMember(jss::account_data));
 
  127            BEAST_EXPECT(!info[jss::result][jss::account_data].isMember(
 
  133                env.
rpc(
"json", 
"account_info", 
to_string(withSigners));
 
  135                info.isMember(jss::result) &&
 
  136                info[jss::result].isMember(jss::account_data));
 
  137            auto const& 
data = info[jss::result][jss::account_data];
 
  138            BEAST_EXPECT(
data.isMember(jss::signer_lists));
 
  139            auto const& signerLists = 
data[jss::signer_lists];
 
  140            BEAST_EXPECT(signerLists.isArray());
 
  141            BEAST_EXPECT(signerLists.size() == 0);
 
  152                env.
rpc(
"json", 
"account_info", 
to_string(withoutSigners));
 
  154                info.isMember(jss::result) &&
 
  155                info[jss::result].isMember(jss::account_data));
 
  156            BEAST_EXPECT(!info[jss::result][jss::account_data].isMember(
 
  162                env.
rpc(
"json", 
"account_info", 
to_string(withSigners));
 
  164                info.isMember(jss::result) &&
 
  165                info[jss::result].isMember(jss::account_data));
 
  166            auto const& 
data = info[jss::result][jss::account_data];
 
  167            BEAST_EXPECT(
data.isMember(jss::signer_lists));
 
  168            auto const& signerLists = 
data[jss::signer_lists];
 
  169            BEAST_EXPECT(signerLists.isArray());
 
  170            BEAST_EXPECT(signerLists.size() == 1);
 
  171            auto const& 
signers = signerLists[0u];
 
  173            BEAST_EXPECT(
signers[sfSignerQuorum.jsonName] == 2);
 
  174            auto const& signerEntries = 
signers[sfSignerEntries.jsonName];
 
  175            BEAST_EXPECT(signerEntries.size() == 1);
 
  176            auto const& entry0 = signerEntries[0u][sfSignerEntry.jsonName];
 
  177            BEAST_EXPECT(entry0[sfSignerWeight.jsonName] == 3);
 
  206                env.
rpc(
"json", 
"account_info", 
to_string(withSigners));
 
  208                info.isMember(jss::result) &&
 
  209                info[jss::result].isMember(jss::account_data));
 
  210            auto const& 
data = info[jss::result][jss::account_data];
 
  211            BEAST_EXPECT(
data.isMember(jss::signer_lists));
 
  212            auto const& signerLists = 
data[jss::signer_lists];
 
  213            BEAST_EXPECT(signerLists.isArray());
 
  214            BEAST_EXPECT(signerLists.size() == 1);
 
  215            auto const& 
signers = signerLists[0u];
 
  217            BEAST_EXPECT(
signers[sfSignerQuorum.jsonName] == 4);
 
  218            auto const& signerEntries = 
signers[sfSignerEntries.jsonName];
 
  219            BEAST_EXPECT(signerEntries.size() == 8);
 
  220            for (
unsigned i = 0u; i < 8; ++i)
 
  222                auto const& entry = signerEntries[i][sfSignerEntry.jsonName];
 
  223                BEAST_EXPECT(entry.
size() == 2);
 
  224                BEAST_EXPECT(entry.
isMember(sfAccount.jsonName));
 
  225                BEAST_EXPECT(entry[sfSignerWeight.jsonName] == 1);
 
 
  238        env.fund(
XRP(1000), alice);
 
  241        withoutSigners[jss::api_version] = 2;
 
  242        withoutSigners[jss::account] = alice.human();
 
  245        withSigners[jss::api_version] = 2;
 
  246        withSigners[jss::account] = alice.human();
 
  247        withSigners[jss::signer_lists] = 
true;
 
  249        auto const withSignersAsString = 
std::string(
"{ ") +
 
  250            "\"api_version\": 2, \"account\": \"" + alice.human() + 
"\", " +
 
  251            "\"signer_lists\": asdfggh }";
 
  257                env.rpc(
"json", 
"account_info", 
to_string(withoutSigners));
 
  258            BEAST_EXPECT(info.isMember(jss::result));
 
  259            BEAST_EXPECT(!info[jss::result].isMember(jss::signer_lists));
 
  264                env.rpc(
"json", 
"account_info", 
to_string(withSigners));
 
  265            BEAST_EXPECT(info.isMember(jss::result));
 
  266            auto const& 
data = info[jss::result];
 
  267            BEAST_EXPECT(
data.isMember(jss::signer_lists));
 
  268            auto const& signerLists = 
data[jss::signer_lists];
 
  269            BEAST_EXPECT(signerLists.isArray());
 
  270            BEAST_EXPECT(signerLists.size() == 0);
 
  281                env.rpc(
"json", 
"account_info", 
to_string(withoutSigners));
 
  282            BEAST_EXPECT(info.isMember(jss::result));
 
  283            BEAST_EXPECT(!info[jss::result].isMember(jss::signer_lists));
 
  288                env.rpc(
"json", 
"account_info", 
to_string(withSigners));
 
  289            BEAST_EXPECT(info.isMember(jss::result));
 
  290            auto const& 
data = info[jss::result];
 
  291            BEAST_EXPECT(
data.isMember(jss::signer_lists));
 
  292            auto const& signerLists = 
data[jss::signer_lists];
 
  293            BEAST_EXPECT(signerLists.isArray());
 
  294            BEAST_EXPECT(signerLists.size() == 1);
 
  295            auto const& 
signers = signerLists[0u];
 
  297            BEAST_EXPECT(
signers[sfSignerQuorum.jsonName] == 2);
 
  298            auto const& signerEntries = 
signers[sfSignerEntries.jsonName];
 
  299            BEAST_EXPECT(signerEntries.size() == 1);
 
  300            auto const& entry0 = signerEntries[0u][sfSignerEntry.jsonName];
 
  301            BEAST_EXPECT(entry0[sfSignerWeight.jsonName] == 3);
 
  306                env.rpc(
"json", 
"account_info", withSignersAsString);
 
  307            BEAST_EXPECT(info[jss::status] == 
"error");
 
  308            BEAST_EXPECT(info[jss::error] == 
"invalidParams");
 
  337                env.rpc(
"json", 
"account_info", 
to_string(withSigners));
 
  338            BEAST_EXPECT(info.isMember(jss::result));
 
  339            auto const& 
data = info[jss::result];
 
  340            BEAST_EXPECT(
data.isMember(jss::signer_lists));
 
  341            auto const& signerLists = 
data[jss::signer_lists];
 
  342            BEAST_EXPECT(signerLists.isArray());
 
  343            BEAST_EXPECT(signerLists.size() == 1);
 
  344            auto const& 
signers = signerLists[0u];
 
  346            BEAST_EXPECT(
signers[sfSignerQuorum.jsonName] == 4);
 
  347            auto const& signerEntries = 
signers[sfSignerEntries.jsonName];
 
  348            BEAST_EXPECT(signerEntries.size() == 8);
 
  349            for (
unsigned i = 0u; i < 8; ++i)
 
  351                auto const& entry = signerEntries[i][sfSignerEntry.jsonName];
 
  352                BEAST_EXPECT(entry.
size() == 2);
 
  353                BEAST_EXPECT(entry.
isMember(sfAccount.jsonName));
 
  354                BEAST_EXPECT(entry[sfSignerWeight.jsonName] == 1);
 
 
  370            "\"jsonrpc\": \"2.0\", " 
  371            "\"ripplerpc\": \"2.0\", " 
  373            "\"method\": \"account_info\", " 
  376            alice.human() + 
"\"}}";
 
  379            "\"jsonrpc\": \"2.0\", " 
  380            "\"ripplerpc\": \"2.0\", " 
  382            "\"method\": \"account_info\", " 
  385            alice.human() + 
"\", " + 
"\"signer_lists\": true }}";
 
  389            auto const info = env.
rpc(
"json2", withoutSigners);
 
  391                info.isMember(jss::result) &&
 
  392                info[jss::result].isMember(jss::account_data));
 
  393            BEAST_EXPECT(!info[jss::result][jss::account_data].isMember(
 
  396                info.isMember(jss::jsonrpc) && info[jss::jsonrpc] == 
"2.0");
 
  398                info.isMember(jss::ripplerpc) && info[jss::ripplerpc] == 
"2.0");
 
  399            BEAST_EXPECT(info.isMember(jss::id) && info[jss::id] == 5);
 
  403            auto const info = env.
rpc(
"json2", withSigners);
 
  405                info.isMember(jss::result) &&
 
  406                info[jss::result].isMember(jss::account_data));
 
  407            auto const& 
data = info[jss::result][jss::account_data];
 
  408            BEAST_EXPECT(
data.isMember(jss::signer_lists));
 
  409            auto const& signerLists = 
data[jss::signer_lists];
 
  410            BEAST_EXPECT(signerLists.isArray());
 
  411            BEAST_EXPECT(signerLists.size() == 0);
 
  413                info.isMember(jss::jsonrpc) && info[jss::jsonrpc] == 
"2.0");
 
  415                info.isMember(jss::ripplerpc) && info[jss::ripplerpc] == 
"2.0");
 
  416            BEAST_EXPECT(info.isMember(jss::id) && info[jss::id] == 6);
 
  420            auto const info = env.
rpc(
 
  421                "json2", 
'[' + withoutSigners + 
", " + withSigners + 
']');
 
  423                info[0u].isMember(jss::result) &&
 
  424                info[0u][jss::result].isMember(jss::account_data));
 
  425            BEAST_EXPECT(!info[0u][jss::result][jss::account_data].isMember(
 
  428                info[0u].isMember(jss::jsonrpc) &&
 
  429                info[0u][jss::jsonrpc] == 
"2.0");
 
  431                info[0u].isMember(jss::ripplerpc) &&
 
  432                info[0u][jss::ripplerpc] == 
"2.0");
 
  433            BEAST_EXPECT(info[0u].isMember(jss::id) && info[0u][jss::id] == 5);
 
  436                info[1u].isMember(jss::result) &&
 
  437                info[1u][jss::result].isMember(jss::account_data));
 
  438            auto const& 
data = info[1u][jss::result][jss::account_data];
 
  439            BEAST_EXPECT(
data.isMember(jss::signer_lists));
 
  440            auto const& signerLists = 
data[jss::signer_lists];
 
  441            BEAST_EXPECT(signerLists.isArray());
 
  442            BEAST_EXPECT(signerLists.size() == 0);
 
  444                info[1u].isMember(jss::jsonrpc) &&
 
  445                info[1u][jss::jsonrpc] == 
"2.0");
 
  447                info[1u].isMember(jss::ripplerpc) &&
 
  448                info[1u][jss::ripplerpc] == 
"2.0");
 
  449            BEAST_EXPECT(info[1u].isMember(jss::id) && info[1u][jss::id] == 6);
 
  459            auto const info = env.
rpc(
"json2", withoutSigners);
 
  461                info.isMember(jss::result) &&
 
  462                info[jss::result].isMember(jss::account_data));
 
  463            BEAST_EXPECT(!info[jss::result][jss::account_data].isMember(
 
  466                info.isMember(jss::jsonrpc) && info[jss::jsonrpc] == 
"2.0");
 
  468                info.isMember(jss::ripplerpc) && info[jss::ripplerpc] == 
"2.0");
 
  469            BEAST_EXPECT(info.isMember(jss::id) && info[jss::id] == 5);
 
  473            auto const info = env.
rpc(
"json2", withSigners);
 
  475                info.isMember(jss::result) &&
 
  476                info[jss::result].isMember(jss::account_data));
 
  477            auto const& 
data = info[jss::result][jss::account_data];
 
  478            BEAST_EXPECT(
data.isMember(jss::signer_lists));
 
  479            auto const& signerLists = 
data[jss::signer_lists];
 
  480            BEAST_EXPECT(signerLists.isArray());
 
  481            BEAST_EXPECT(signerLists.size() == 1);
 
  482            auto const& 
signers = signerLists[0u];
 
  484            BEAST_EXPECT(
signers[sfSignerQuorum.jsonName] == 2);
 
  485            auto const& signerEntries = 
signers[sfSignerEntries.jsonName];
 
  486            BEAST_EXPECT(signerEntries.size() == 1);
 
  487            auto const& entry0 = signerEntries[0u][sfSignerEntry.jsonName];
 
  488            BEAST_EXPECT(entry0[sfSignerWeight.jsonName] == 3);
 
  490                info.isMember(jss::jsonrpc) && info[jss::jsonrpc] == 
"2.0");
 
  492                info.isMember(jss::ripplerpc) && info[jss::ripplerpc] == 
"2.0");
 
  493            BEAST_EXPECT(info.isMember(jss::id) && info[jss::id] == 6);
 
  521            auto const info = env.
rpc(
"json2", withSigners);
 
  523                info.isMember(jss::result) &&
 
  524                info[jss::result].isMember(jss::account_data));
 
  525            auto const& 
data = info[jss::result][jss::account_data];
 
  526            BEAST_EXPECT(
data.isMember(jss::signer_lists));
 
  527            auto const& signerLists = 
data[jss::signer_lists];
 
  528            BEAST_EXPECT(signerLists.isArray());
 
  529            BEAST_EXPECT(signerLists.size() == 1);
 
  530            auto const& 
signers = signerLists[0u];
 
  532            BEAST_EXPECT(
signers[sfSignerQuorum.jsonName] == 4);
 
  533            auto const& signerEntries = 
signers[sfSignerEntries.jsonName];
 
  534            BEAST_EXPECT(signerEntries.size() == 8);
 
  535            for (
unsigned i = 0u; i < 8; ++i)
 
  537                auto const& entry = signerEntries[i][sfSignerEntry.jsonName];
 
  538                BEAST_EXPECT(entry.
size() == 2);
 
  539                BEAST_EXPECT(entry.
isMember(sfAccount.jsonName));
 
  540                BEAST_EXPECT(entry[sfSignerWeight.jsonName] == 1);
 
  543                info.isMember(jss::jsonrpc) && info[jss::jsonrpc] == 
"2.0");
 
  545                info.isMember(jss::ripplerpc) && info[jss::ripplerpc] == 
"2.0");
 
  546            BEAST_EXPECT(info.isMember(jss::id) && info[jss::id] == 6);
 
 
  556        Env env(*
this, features);
 
  559        env.
fund(
XRP(1000), alice, bob);
 
  561        auto getAccountFlag = [&env](
 
  565            params[jss::account] = account.human();
 
  570            if (info[jss::result][jss::status] == 
"success" &&
 
  571                info[jss::result][jss::account_flags].isMember(fName.
data()))
 
  572                res.
emplace(info[jss::result][jss::account_flags][fName.
data()]
 
  578        static constexpr std:: 
  589        for (
auto& asf : asFlags)
 
  593            env(
fclear(alice, asf.second));
 
  595            auto const f1 = getAccountFlag(asf.first, alice);
 
  596            BEAST_EXPECT(f1.has_value());
 
  597            BEAST_EXPECT(!f1.value());
 
  601            env(
fset(alice, asf.second));
 
  603            auto const f2 = getAccountFlag(asf.first, alice);
 
  604            BEAST_EXPECT(f2.has_value());
 
  605            BEAST_EXPECT(f2.value());
 
  608        static constexpr std:: 
  610                disallowIncomingFlags{
 
  612                     {
"disallowIncomingNFTokenOffer",
 
  615                     {
"disallowIncomingTrustline",
 
  618        if (features[featureDisallowIncoming])
 
  620            for (
auto& asf : disallowIncomingFlags)
 
  624                env(
fclear(alice, asf.second));
 
  626                auto const f1 = getAccountFlag(asf.first, alice);
 
  627                BEAST_EXPECT(f1.has_value());
 
  628                BEAST_EXPECT(!f1.value());
 
  632                env(
fset(alice, asf.second));
 
  634                auto const f2 = getAccountFlag(asf.first, alice);
 
  635                BEAST_EXPECT(f2.has_value());
 
  636                BEAST_EXPECT(f2.value());
 
  641            for (
auto& asf : disallowIncomingFlags)
 
  643                BEAST_EXPECT(!getAccountFlag(asf.first, alice));
 
  648            allowTrustLineClawbackFlag{
 
  651        if (features[featureClawback])
 
  655                getAccountFlag(allowTrustLineClawbackFlag.first, bob);
 
  656            BEAST_EXPECT(f1.has_value());
 
  657            BEAST_EXPECT(!f1.value());
 
  660            env(
fset(bob, allowTrustLineClawbackFlag.second));
 
  663                getAccountFlag(allowTrustLineClawbackFlag.first, bob);
 
  664            BEAST_EXPECT(f2.has_value());
 
  665            BEAST_EXPECT(f2.value());
 
  670                !getAccountFlag(allowTrustLineClawbackFlag.first, bob));
 
  674            allowTrustLineLockingFlag{
 
  677        if (features[featureTokenEscrow])
 
  680                getAccountFlag(allowTrustLineLockingFlag.first, bob);
 
  681            BEAST_EXPECT(f1.has_value());
 
  682            BEAST_EXPECT(!f1.value());
 
  685            env(
fset(bob, allowTrustLineLockingFlag.second));
 
  688                getAccountFlag(allowTrustLineLockingFlag.first, bob);
 
  689            BEAST_EXPECT(f2.has_value());
 
  690            BEAST_EXPECT(f2.value());
 
  694            BEAST_EXPECT(!getAccountFlag(allowTrustLineLockingFlag.first, bob));