19        using namespace test::jtx;
 
   23            auto const lines = env.rpc(
"json", 
"account_lines", 
"{ }");
 
   25                lines[jss::result][jss::error_message] ==
 
   31            params[jss::account] =
 
   32                "n9MJkEKHDhy5eTLuHUQeAAjo382frHNbFK4C8hcwN4nwM2SrLdBj";
 
   34                env.rpc(
"json", 
"account_lines", 
to_string(params));
 
   36                lines[jss::result][jss::error_message] ==
 
   41            auto testInvalidAccountParam = [&](
auto const& param) {
 
   43                params[jss::account] = param;
 
   45                    "json", 
"account_lines", 
to_string(params))[jss::result];
 
   46                BEAST_EXPECT(jrr[jss::error] == 
"invalidParams");
 
   48                    jrr[jss::error_message] == 
"Invalid field 'account'.");
 
   51            testInvalidAccountParam(1);
 
   52            testInvalidAccountParam(1.1);
 
   53            testInvalidAccountParam(
true);
 
   58        Account 
const alice{
"alice"};
 
   62            params[jss::account] = alice.human();
 
   64                env.rpc(
"json", 
"account_lines", 
to_string(params));
 
   66                lines[jss::result][jss::error_message] ==
 
   69        env.fund(XRP(10000), alice);
 
   71        LedgerInfo const ledger3Info = env.closed()->info();
 
   72        BEAST_EXPECT(ledger3Info.
seq == 3);
 
   77            params[jss::account] = alice.human();
 
   79                env.rpc(
"json", 
"account_lines", 
to_string(params));
 
   80            BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
 
   81            BEAST_EXPECT(lines[jss::result][jss::lines].size() == 0);
 
   86            params[jss::account] = alice.human();
 
   87            params[jss::ledger_index] = 
"nonsense";
 
   89                env.rpc(
"json", 
"account_lines", 
to_string(params));
 
   91                lines[jss::result][jss::error_message] ==
 
   92                "ledgerIndexMalformed");
 
   97            params[jss::account] = alice.human();
 
   98            params[jss::ledger_index] = 50000;
 
  100                env.rpc(
"json", 
"account_lines", 
to_string(params));
 
  102                lines[jss::result][jss::error_message] == 
"ledgerNotFound");
 
  105        Account 
const gw1{
"gw1"};
 
  106        env.fund(XRP(10000), gw1);
 
  109        for (
char c = 0; c <= (
'Z' - 
'A'); ++c)
 
  113                gw1[
std::string(
"YA") + 
static_cast<char>(
'A' + c)]);
 
  114            IOU 
const& gw1Currency = gw1Currencies.
back();
 
  117            env(trust(alice, gw1Currency(100 + c)));
 
  118            env(pay(gw1, alice, gw1Currency(50 + c)));
 
  121        LedgerInfo const ledger4Info = env.closed()->info();
 
  122        BEAST_EXPECT(ledger4Info.
seq == 4);
 
  126        Account 
const gw2{
"gw2"};
 
  127        env.fund(XRP(10000), gw2);
 
  134        for (
char c = 0; c <= (
'Z' - 
'A'); ++c)
 
  138                gw2[
std::string(
"ZA") + 
static_cast<char>(
'A' + c)]);
 
  139            IOU 
const& gw2Currency = gw2Currencies.
back();
 
  142            env(trust(alice, gw2Currency(200 + c)));
 
  143            env(trust(gw2, gw2Currency(0), alice, 
tfSetfAuth));
 
  145            env(pay(gw2, alice, gw2Currency(100 + c)));
 
  156        LedgerInfo const ledger58Info = env.closed()->info();
 
  157        BEAST_EXPECT(ledger58Info.
seq == 58);
 
  160        auto testAccountLinesHistory = [
this, &env](
 
  161                                           Account 
const& account,
 
  166            paramsSeq[jss::account] = account.human();
 
  167            paramsSeq[jss::ledger_index] = info.seq;
 
  168            auto const linesSeq =
 
  169                env.rpc(
"json", 
"account_lines", 
to_string(paramsSeq));
 
  170            BEAST_EXPECT(linesSeq[jss::result][jss::lines].isArray());
 
  171            BEAST_EXPECT(linesSeq[jss::result][jss::lines].size() == count);
 
  175            paramsHash[jss::account] = account.human();
 
  176            paramsHash[jss::ledger_hash] = 
to_string(info.hash);
 
  177            auto const linesHash =
 
  178                env.rpc(
"json", 
"account_lines", 
to_string(paramsHash));
 
  179            BEAST_EXPECT(linesHash[jss::result][jss::lines].isArray());
 
  180            BEAST_EXPECT(linesHash[jss::result][jss::lines].size() == count);
 
  184        testAccountLinesHistory(alice, ledger3Info, 0);
 
  187        testAccountLinesHistory(alice, ledger4Info, 26);
 
  190        testAccountLinesHistory(alice, ledger58Info, 52);
 
  196            params[jss::account] = alice.human();
 
  198            params[jss::ledger_index] = ledger58Info.
seq;
 
  200                env.rpc(
"json", 
"account_lines", 
to_string(params));
 
  201            BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
 
  202            BEAST_EXPECT(lines[jss::result][jss::lines].size() == 26);
 
  207            params[jss::account] = alice.human();
 
  209                env.rpc(
"json", 
"account_lines", 
to_string(params));
 
  210            BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
 
  211            BEAST_EXPECT(lines[jss::result][jss::lines].size() == 52);
 
  216            params[jss::account] = alice.human();
 
  217            params[jss::peer] = gw1.human();
 
  219                env.rpc(
"json", 
"account_lines", 
to_string(params));
 
  220            BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
 
  221            BEAST_EXPECT(lines[jss::result][jss::lines].size() == 26);
 
  224            auto const& line = lines[jss::result][jss::lines][0u];
 
  225            BEAST_EXPECT(!line[jss::no_ripple].isMember(jss::no_ripple));
 
  230            params[jss::account] = alice.human();
 
  232                "n9MJkEKHDhy5eTLuHUQeAAjo382frHNbFK4C8hcwN4nwM2SrLdBj";
 
  234                env.rpc(
"json", 
"account_lines", 
to_string(params));
 
  236                lines[jss::result][jss::error_message] ==
 
  242            params[jss::account] = alice.human();
 
  243            params[jss::limit] = -1;
 
  245                env.rpc(
"json", 
"account_lines", 
to_string(params));
 
  247                lines[jss::result][jss::error_message] ==
 
  253            paramsA[jss::account] = alice.human();
 
  254            paramsA[jss::limit] = 1;
 
  256                env.rpc(
"json", 
"account_lines", 
to_string(paramsA));
 
  257            BEAST_EXPECT(linesA[jss::result][jss::lines].isArray());
 
  258            BEAST_EXPECT(linesA[jss::result][jss::lines].size() == 1);
 
  261            auto marker = linesA[jss::result][jss::marker].asString();
 
  263            paramsB[jss::account] = alice.human();
 
  264            paramsB[jss::marker] = marker;
 
  266                env.rpc(
"json", 
"account_lines", 
to_string(paramsB));
 
  267            BEAST_EXPECT(linesB[jss::result][jss::lines].isArray());
 
  268            BEAST_EXPECT(linesB[jss::result][jss::lines].size() == 51);
 
  272            paramsC[jss::account] = alice.human();
 
  273            paramsC[jss::limit] = 3;
 
  274            paramsC[jss::marker] = marker;
 
  276                env.rpc(
"json", 
"account_lines", 
to_string(paramsC));
 
  277            BEAST_EXPECT(linesC[jss::result][jss::lines].isArray());
 
  278            BEAST_EXPECT(linesC[jss::result][jss::lines].size() == 3);
 
  281            marker[5] = marker[5] == 
'7' ? 
'8' : 
'7';
 
  283            paramsD[jss::account] = alice.human();
 
  284            paramsD[jss::marker] = marker;
 
  286                env.rpc(
"json", 
"account_lines", 
to_string(paramsD));
 
  288                linesD[jss::result][jss::error_message] ==
 
  294            params[jss::account] = alice.human();
 
  295            params[jss::marker] = 
true;
 
  297                env.rpc(
"json", 
"account_lines", 
to_string(params));
 
  299                lines[jss::result][jss::error_message] ==
 
  305            params[jss::account] = alice.human();
 
  306            params[jss::limit] = 10;
 
  307            params[jss::peer] = gw2.human();
 
  309                env.rpc(
"json", 
"account_lines", 
to_string(params));
 
  310            auto const& line = lines[jss::result][jss::lines][0u];
 
  311            BEAST_EXPECT(line[jss::freeze].asBool() == 
true);
 
  312            BEAST_EXPECT(line[jss::deep_freeze].asBool() == 
true);
 
  313            BEAST_EXPECT(line[jss::no_ripple].asBool() == 
true);
 
  314            BEAST_EXPECT(line[jss::peer_authorized].asBool() == 
true);
 
  319            paramsA[jss::account] = gw2.human();
 
  320            paramsA[jss::limit] = 1;
 
  321            paramsA[jss::peer] = alice.human();
 
  323                env.rpc(
"json", 
"account_lines", 
to_string(paramsA));
 
  324            auto const& lineA = linesA[jss::result][jss::lines][0u];
 
  325            BEAST_EXPECT(lineA[jss::freeze_peer].asBool() == 
true);
 
  326            BEAST_EXPECT(lineA[jss::deep_freeze_peer].asBool() == 
true);
 
  327            BEAST_EXPECT(lineA[jss::no_ripple_peer].asBool() == 
true);
 
  328            BEAST_EXPECT(lineA[jss::authorized].asBool() == 
true);
 
  331            BEAST_EXPECT(linesA[jss::result].isMember(jss::marker));
 
  332            auto const marker = linesA[jss::result][jss::marker].asString();
 
  334            paramsB[jss::account] = gw2.human();
 
  335            paramsB[jss::limit] = 25;
 
  336            paramsB[jss::marker] = marker;
 
  337            paramsB[jss::peer] = alice.human();
 
  339                env.rpc(
"json", 
"account_lines", 
to_string(paramsB));
 
  340            BEAST_EXPECT(linesB[jss::result][jss::lines].isArray());
 
  341            BEAST_EXPECT(linesB[jss::result][jss::lines].size() == 25);
 
  342            BEAST_EXPECT(!linesB[jss::result].isMember(jss::marker));
 
 
  507        testcase(
"Marker can point to any appropriate ledger entry type");
 
  508        using namespace test::jtx;
 
  509        using namespace std::chrono_literals;
 
  518        Account 
const alice{
"alice"};
 
  519        Account 
const becky{
"becky"};
 
  520        Account 
const gw1{
"gw1"};
 
  521        env.fund(XRP(10000), alice, becky, gw1);
 
  524        auto payChan = [](Account 
const& account,
 
  530            jv[jss::TransactionType] = jss::PaymentChannelCreate;
 
  531            jv[jss::Account] = account.human();
 
  532            jv[jss::Destination] = to.human();
 
  534            jv[
"SettleDelay"] = settleDelay.count();
 
  535            jv[
"PublicKey"] = 
strHex(pk.slice());
 
  544        Account 
const bogie{
"bogie"};
 
  545        env(signers(alice, 2, {{bogie, 3}}));
 
  549        env(signers(becky, 2, {{alice, 3}}));
 
  553        auto const EUR = gw1[
"EUR"];
 
  554        env(trust(alice, EUR(200)));
 
  555        env(trust(becky, EUR(200)));
 
  559        env(escrow::create(alice, becky, XRP(1000)),
 
  560            escrow::finish_time(env.now() + 1s));
 
  561        env(escrow::create(becky, alice, XRP(1000)),
 
  562            escrow::finish_time(env.now() + 1s));
 
  565        env(payChan(alice, becky, XRP(1000), 100s, alice.pk()));
 
  566        env(payChan(becky, alice, XRP(1000), 100s, becky.pk()));
 
  578        env(token::createOffer(alice, beckyNFtokenID, drops(1)),
 
  579            token::owner(becky));
 
  580        env(token::createOffer(becky, aliceNFtokenID, drops(1)),
 
  581            token::owner(alice));
 
  583        env(token::createOffer(becky, beckyNFtokenID, drops(1)),
 
  585            token::destination(alice));
 
  586        env(token::createOffer(alice, aliceNFtokenID, drops(1)),
 
  588            token::destination(becky));
 
  590        env(token::createOffer(gw1, beckyNFtokenID, drops(1)),
 
  592            token::destination(alice));
 
  593        env(token::createOffer(gw1, aliceNFtokenID, drops(1)),
 
  595            token::destination(becky));
 
  597        env(token::createOffer(becky, beckyNFtokenID, drops(1)),
 
  599        env(token::createOffer(alice, aliceNFtokenID, drops(1)),
 
  603        env(check::create(alice, becky, XRP(50)));
 
  604        env(check::create(becky, alice, XRP(50)));
 
  607        env(deposit::auth(alice, becky));
 
  608        env(deposit::auth(becky, alice));
 
  612        auto const USDalice = alice[
"USD"];
 
  613        env(offer(alice, EUR(10), XRP(100)));
 
  614        env(offer(becky, USDalice(10), XRP(100)));
 
  617        env(ticket::create(alice, 2));
 
  620        auto const BTCbecky = becky[
"BTC"];
 
  621        env(trust(alice, BTCbecky(200)));
 
  629            auto getNextLine = [](Env& env,
 
  630                                  Account 
const& alice,
 
  633                params[jss::account] = alice.human();
 
  634                params[jss::limit] = 1;
 
  636                    params[jss::marker] = *marker;
 
  638                return env.rpc(
"json", 
"account_lines", 
to_string(params));
 
  641            auto aliceLines = getNextLine(env, alice, 
std::nullopt);
 
  647            auto hasMarker = [](
auto const& aliceLines) {
 
  648                return aliceLines[jss::result].isMember(jss::marker);
 
  650            auto marker = [](
auto const& aliceLines) {
 
  651                return aliceLines[jss::result][jss::marker].asString();
 
  653            auto checkLines = [](
auto const& aliceLines) {
 
  654                return aliceLines.isMember(jss::result) &&
 
  655                    !aliceLines[jss::result].isMember(jss::error_message) &&
 
  656                    aliceLines[jss::result].isMember(jss::lines) &&
 
  657                    aliceLines[jss::result][jss::lines].isArray() &&
 
  658                    aliceLines[jss::result][jss::lines].size() <= 1;
 
  661            BEAST_EXPECT(hasMarker(aliceLines));
 
  662            BEAST_EXPECT(checkLines(aliceLines));
 
  663            BEAST_EXPECT(aliceLines[jss::result][jss::lines].size() == 0);
 
  667            while (hasMarker(aliceLines))
 
  670                aliceLines = getNextLine(env, alice, marker(aliceLines));
 
  671                BEAST_EXPECT(checkLines(aliceLines));
 
  672                foundLines += aliceLines[jss::result][jss::lines].size();
 
  675            BEAST_EXPECT(expectedLines == foundLines);
 
  678            aliceObjectsParams2[jss::account] = alice.human();
 
  679            aliceObjectsParams2[jss::limit] = 200;
 
  681                "json", 
"account_objects", 
to_string(aliceObjectsParams2));
 
  682            BEAST_EXPECT(aliceObjects.
isMember(jss::result));
 
  684                !aliceObjects[jss::result].isMember(jss::error_message));
 
  686                aliceObjects[jss::result].isMember(jss::account_objects));
 
  688                aliceObjects[jss::result][jss::account_objects].isArray());
 
  693                aliceObjects[jss::result][jss::account_objects].size() ==
 
  694                iterations + expectedNFTs);
 
  702            beckyObjectsParams[jss::account] = becky.human();
 
  703            beckyObjectsParams[jss::limit] = 200;
 
  705                "json", 
"account_objects", 
to_string(beckyObjectsParams));
 
  706            BEAST_EXPECT(beckyObjects.
isMember(jss::result));
 
  708                !beckyObjects[jss::result].isMember(jss::error_message));
 
  710                beckyObjects[jss::result].isMember(jss::account_objects));
 
  712                beckyObjects[jss::result][jss::account_objects].isArray());
 
  716                beckyObjects[jss::result][jss::account_objects].size() ==
 
  717                aliceObjects[jss::result][jss::account_objects].size() - 2);
 
 
  727        using namespace test::jtx;
 
  732            request[jss::method] = 
"account_lines";
 
  733            request[jss::jsonrpc] = 
"2.0";
 
  734            request[jss::ripplerpc] = 
"2.0";
 
  735            auto const lines = env.rpc(
"json2", 
to_string(request));
 
  737                lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] == 
"2.0");
 
  739                lines.isMember(jss::ripplerpc) &&
 
  740                lines[jss::ripplerpc] == 
"2.0");
 
  745            request[jss::method] = 
"account_lines";
 
  746            request[jss::jsonrpc] = 
"2.0";
 
  747            request[jss::ripplerpc] = 
"2.0";
 
  748            request[jss::id] = 5;
 
  749            auto const lines = env.rpc(
"json2", 
to_string(request));
 
  751                lines[jss::error][jss::message] ==
 
  754                lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] == 
"2.0");
 
  756                lines.isMember(jss::ripplerpc) &&
 
  757                lines[jss::ripplerpc] == 
"2.0");
 
  758            BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
 
  763            params[jss::account] =
 
  764                "n9MJkEKHDhy5eTLuHUQeAAjo382frHNbFK4C8hcwN4nwM2SrLdBj";
 
  766            request[jss::method] = 
"account_lines";
 
  767            request[jss::jsonrpc] = 
"2.0";
 
  768            request[jss::ripplerpc] = 
"2.0";
 
  769            request[jss::id] = 5;
 
  770            request[jss::params] = params;
 
  771            auto const lines = env.rpc(
"json2", 
to_string(request));
 
  773                lines[jss::error][jss::message] ==
 
  776                lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] == 
"2.0");
 
  778                lines.isMember(jss::ripplerpc) &&
 
  779                lines[jss::ripplerpc] == 
"2.0");
 
  780            BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
 
  782        Account 
const alice{
"alice"};
 
  786            params[jss::account] = alice.human();
 
  788            request[jss::method] = 
"account_lines";
 
  789            request[jss::jsonrpc] = 
"2.0";
 
  790            request[jss::ripplerpc] = 
"2.0";
 
  791            request[jss::id] = 5;
 
  792            request[jss::params] = params;
 
  793            auto const lines = env.rpc(
"json2", 
to_string(request));
 
  795                lines[jss::error][jss::message] ==
 
  798                lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] == 
"2.0");
 
  800                lines.isMember(jss::ripplerpc) &&
 
  801                lines[jss::ripplerpc] == 
"2.0");
 
  802            BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
 
  804        env.fund(XRP(10000), alice);
 
  806        LedgerInfo const ledger3Info = env.closed()->info();
 
  807        BEAST_EXPECT(ledger3Info.
seq == 3);
 
  812            params[jss::account] = alice.human();
 
  814            request[jss::method] = 
"account_lines";
 
  815            request[jss::jsonrpc] = 
"2.0";
 
  816            request[jss::ripplerpc] = 
"2.0";
 
  817            request[jss::id] = 5;
 
  818            request[jss::params] = params;
 
  819            auto const lines = env.rpc(
"json2", 
to_string(request));
 
  820            BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
 
  821            BEAST_EXPECT(lines[jss::result][jss::lines].size() == 0);
 
  823                lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] == 
"2.0");
 
  825                lines.isMember(jss::ripplerpc) &&
 
  826                lines[jss::ripplerpc] == 
"2.0");
 
  827            BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
 
  832            params[jss::account] = alice.human();
 
  833            params[jss::ledger_index] = 
"nonsense";
 
  835            request[jss::method] = 
"account_lines";
 
  836            request[jss::jsonrpc] = 
"2.0";
 
  837            request[jss::ripplerpc] = 
"2.0";
 
  838            request[jss::id] = 5;
 
  839            request[jss::params] = params;
 
  840            auto const lines = env.rpc(
"json2", 
to_string(request));
 
  842                lines[jss::error][jss::message] == 
"ledgerIndexMalformed");
 
  844                lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] == 
"2.0");
 
  846                lines.isMember(jss::ripplerpc) &&
 
  847                lines[jss::ripplerpc] == 
"2.0");
 
  848            BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
 
  853            params[jss::account] = alice.human();
 
  854            params[jss::ledger_index] = 50000;
 
  856            request[jss::method] = 
"account_lines";
 
  857            request[jss::jsonrpc] = 
"2.0";
 
  858            request[jss::ripplerpc] = 
"2.0";
 
  859            request[jss::id] = 5;
 
  860            request[jss::params] = params;
 
  861            auto const lines = env.rpc(
"json2", 
to_string(request));
 
  862            BEAST_EXPECT(lines[jss::error][jss::message] == 
"ledgerNotFound");
 
  864                lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] == 
"2.0");
 
  866                lines.isMember(jss::ripplerpc) &&
 
  867                lines[jss::ripplerpc] == 
"2.0");
 
  868            BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
 
  871        Account 
const gw1{
"gw1"};
 
  872        env.fund(XRP(10000), gw1);
 
  875        for (
char c = 0; c <= (
'Z' - 
'A'); ++c)
 
  879                gw1[
std::string(
"YA") + 
static_cast<char>(
'A' + c)]);
 
  880            IOU 
const& gw1Currency = gw1Currencies.
back();
 
  883            env(trust(alice, gw1Currency(100 + c)));
 
  884            env(pay(gw1, alice, gw1Currency(50 + c)));
 
  887        LedgerInfo const ledger4Info = env.closed()->info();
 
  888        BEAST_EXPECT(ledger4Info.
seq == 4);
 
  892        Account 
const gw2{
"gw2"};
 
  893        env.fund(XRP(10000), gw2);
 
  900        for (
char c = 0; c <= (
'Z' - 
'A'); ++c)
 
  904                gw2[
std::string(
"ZA") + 
static_cast<char>(
'A' + c)]);
 
  905            IOU 
const& gw2Currency = gw2Currencies.
back();
 
  908            env(trust(alice, gw2Currency(200 + c)));
 
  909            env(trust(gw2, gw2Currency(0), alice, 
tfSetfAuth));
 
  911            env(pay(gw2, alice, gw2Currency(100 + c)));
 
  922        LedgerInfo const ledger58Info = env.closed()->info();
 
  923        BEAST_EXPECT(ledger58Info.
seq == 58);
 
  926        auto testAccountLinesHistory = [
this, &env](
 
  927                                           Account 
const& account,
 
  932            paramsSeq[jss::account] = account.human();
 
  933            paramsSeq[jss::ledger_index] = info.seq;
 
  935            requestSeq[jss::method] = 
"account_lines";
 
  936            requestSeq[jss::jsonrpc] = 
"2.0";
 
  937            requestSeq[jss::ripplerpc] = 
"2.0";
 
  938            requestSeq[jss::id] = 5;
 
  939            requestSeq[jss::params] = paramsSeq;
 
  940            auto const linesSeq = env.rpc(
"json2", 
to_string(requestSeq));
 
  941            BEAST_EXPECT(linesSeq[jss::result][jss::lines].isArray());
 
  942            BEAST_EXPECT(linesSeq[jss::result][jss::lines].size() == count);
 
  944                linesSeq.isMember(jss::jsonrpc) &&
 
  945                linesSeq[jss::jsonrpc] == 
"2.0");
 
  947                linesSeq.isMember(jss::ripplerpc) &&
 
  948                linesSeq[jss::ripplerpc] == 
"2.0");
 
  949            BEAST_EXPECT(linesSeq.isMember(jss::id) && linesSeq[jss::id] == 5);
 
  953            paramsHash[jss::account] = account.human();
 
  954            paramsHash[jss::ledger_hash] = 
to_string(info.hash);
 
  956            requestHash[jss::method] = 
"account_lines";
 
  957            requestHash[jss::jsonrpc] = 
"2.0";
 
  958            requestHash[jss::ripplerpc] = 
"2.0";
 
  959            requestHash[jss::id] = 5;
 
  960            requestHash[jss::params] = paramsHash;
 
  961            auto const linesHash = env.rpc(
"json2", 
to_string(requestHash));
 
  962            BEAST_EXPECT(linesHash[jss::result][jss::lines].isArray());
 
  963            BEAST_EXPECT(linesHash[jss::result][jss::lines].size() == count);
 
  965                linesHash.isMember(jss::jsonrpc) &&
 
  966                linesHash[jss::jsonrpc] == 
"2.0");
 
  968                linesHash.isMember(jss::ripplerpc) &&
 
  969                linesHash[jss::ripplerpc] == 
"2.0");
 
  971                linesHash.isMember(jss::id) && linesHash[jss::id] == 5);
 
  975        testAccountLinesHistory(alice, ledger3Info, 0);
 
  978        testAccountLinesHistory(alice, ledger4Info, 26);
 
  981        testAccountLinesHistory(alice, ledger58Info, 52);
 
  987            params[jss::account] = alice.human();
 
  989            params[jss::ledger_index] = ledger58Info.
seq;
 
  991            request[jss::method] = 
"account_lines";
 
  992            request[jss::jsonrpc] = 
"2.0";
 
  993            request[jss::ripplerpc] = 
"2.0";
 
  994            request[jss::id] = 5;
 
  995            request[jss::params] = params;
 
  996            auto const lines = env.rpc(
"json2", 
to_string(request));
 
  997            BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
 
  998            BEAST_EXPECT(lines[jss::result][jss::lines].size() == 26);
 
 1000                lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] == 
"2.0");
 
 1002                lines.isMember(jss::ripplerpc) &&
 
 1003                lines[jss::ripplerpc] == 
"2.0");
 
 1004            BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
 
 1009            params[jss::account] = alice.human();
 
 1011            request[jss::method] = 
"account_lines";
 
 1012            request[jss::jsonrpc] = 
"2.0";
 
 1013            request[jss::ripplerpc] = 
"2.0";
 
 1014            request[jss::id] = 5;
 
 1015            request[jss::params] = params;
 
 1016            auto const lines = env.rpc(
"json2", 
to_string(request));
 
 1017            BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
 
 1018            BEAST_EXPECT(lines[jss::result][jss::lines].size() == 52);
 
 1020                lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] == 
"2.0");
 
 1022                lines.isMember(jss::ripplerpc) &&
 
 1023                lines[jss::ripplerpc] == 
"2.0");
 
 1024            BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
 
 1029            params[jss::account] = alice.human();
 
 1030            params[jss::peer] = gw1.human();
 
 1032            request[jss::method] = 
"account_lines";
 
 1033            request[jss::jsonrpc] = 
"2.0";
 
 1034            request[jss::ripplerpc] = 
"2.0";
 
 1035            request[jss::id] = 5;
 
 1036            request[jss::params] = params;
 
 1037            auto const lines = env.rpc(
"json2", 
to_string(request));
 
 1038            BEAST_EXPECT(lines[jss::result][jss::lines].isArray());
 
 1039            BEAST_EXPECT(lines[jss::result][jss::lines].size() == 26);
 
 1041                lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] == 
"2.0");
 
 1043                lines.isMember(jss::ripplerpc) &&
 
 1044                lines[jss::ripplerpc] == 
"2.0");
 
 1045            BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
 
 1050            params[jss::account] = alice.human();
 
 1052                "n9MJkEKHDhy5eTLuHUQeAAjo382frHNbFK4C8hcwN4nwM2SrLdBj";
 
 1054            request[jss::method] = 
"account_lines";
 
 1055            request[jss::jsonrpc] = 
"2.0";
 
 1056            request[jss::ripplerpc] = 
"2.0";
 
 1057            request[jss::id] = 5;
 
 1058            request[jss::params] = params;
 
 1059            auto const lines = env.rpc(
"json2", 
to_string(request));
 
 1061                lines[jss::error][jss::message] ==
 
 1064                lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] == 
"2.0");
 
 1066                lines.isMember(jss::ripplerpc) &&
 
 1067                lines[jss::ripplerpc] == 
"2.0");
 
 1068            BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
 
 1073            params[jss::account] = alice.human();
 
 1074            params[jss::limit] = -1;
 
 1076            request[jss::method] = 
"account_lines";
 
 1077            request[jss::jsonrpc] = 
"2.0";
 
 1078            request[jss::ripplerpc] = 
"2.0";
 
 1079            request[jss::id] = 5;
 
 1080            request[jss::params] = params;
 
 1081            auto const lines = env.rpc(
"json2", 
to_string(request));
 
 1083                lines[jss::error][jss::message] ==
 
 1086                lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] == 
"2.0");
 
 1088                lines.isMember(jss::ripplerpc) &&
 
 1089                lines[jss::ripplerpc] == 
"2.0");
 
 1090            BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
 
 1095            paramsA[jss::account] = alice.human();
 
 1096            paramsA[jss::limit] = 1;
 
 1098            requestA[jss::method] = 
"account_lines";
 
 1099            requestA[jss::jsonrpc] = 
"2.0";
 
 1100            requestA[jss::ripplerpc] = 
"2.0";
 
 1101            requestA[jss::id] = 5;
 
 1102            requestA[jss::params] = paramsA;
 
 1103            auto const linesA = env.rpc(
"json2", 
to_string(requestA));
 
 1104            BEAST_EXPECT(linesA[jss::result][jss::lines].isArray());
 
 1105            BEAST_EXPECT(linesA[jss::result][jss::lines].size() == 1);
 
 1107                linesA.isMember(jss::jsonrpc) && linesA[jss::jsonrpc] == 
"2.0");
 
 1109                linesA.isMember(jss::ripplerpc) &&
 
 1110                linesA[jss::ripplerpc] == 
"2.0");
 
 1111            BEAST_EXPECT(linesA.isMember(jss::id) && linesA[jss::id] == 5);
 
 1114            auto marker = linesA[jss::result][jss::marker].asString();
 
 1116            paramsB[jss::account] = alice.human();
 
 1117            paramsB[jss::marker] = marker;
 
 1119            requestB[jss::method] = 
"account_lines";
 
 1120            requestB[jss::jsonrpc] = 
"2.0";
 
 1121            requestB[jss::ripplerpc] = 
"2.0";
 
 1122            requestB[jss::id] = 5;
 
 1123            requestB[jss::params] = paramsB;
 
 1124            auto const linesB = env.rpc(
"json2", 
to_string(requestB));
 
 1125            BEAST_EXPECT(linesB[jss::result][jss::lines].isArray());
 
 1126            BEAST_EXPECT(linesB[jss::result][jss::lines].size() == 51);
 
 1128                linesB.isMember(jss::jsonrpc) && linesB[jss::jsonrpc] == 
"2.0");
 
 1130                linesB.isMember(jss::ripplerpc) &&
 
 1131                linesB[jss::ripplerpc] == 
"2.0");
 
 1132            BEAST_EXPECT(linesB.isMember(jss::id) && linesB[jss::id] == 5);
 
 1136            paramsC[jss::account] = alice.human();
 
 1137            paramsC[jss::limit] = 3;
 
 1138            paramsC[jss::marker] = marker;
 
 1140            requestC[jss::method] = 
"account_lines";
 
 1141            requestC[jss::jsonrpc] = 
"2.0";
 
 1142            requestC[jss::ripplerpc] = 
"2.0";
 
 1143            requestC[jss::id] = 5;
 
 1144            requestC[jss::params] = paramsC;
 
 1145            auto const linesC = env.rpc(
"json2", 
to_string(requestC));
 
 1146            BEAST_EXPECT(linesC[jss::result][jss::lines].isArray());
 
 1147            BEAST_EXPECT(linesC[jss::result][jss::lines].size() == 3);
 
 1149                linesC.isMember(jss::jsonrpc) && linesC[jss::jsonrpc] == 
"2.0");
 
 1151                linesC.isMember(jss::ripplerpc) &&
 
 1152                linesC[jss::ripplerpc] == 
"2.0");
 
 1153            BEAST_EXPECT(linesC.isMember(jss::id) && linesC[jss::id] == 5);
 
 1156            marker[5] = marker[5] == 
'7' ? 
'8' : 
'7';
 
 1158            paramsD[jss::account] = alice.human();
 
 1159            paramsD[jss::marker] = marker;
 
 1161            requestD[jss::method] = 
"account_lines";
 
 1162            requestD[jss::jsonrpc] = 
"2.0";
 
 1163            requestD[jss::ripplerpc] = 
"2.0";
 
 1164            requestD[jss::id] = 5;
 
 1165            requestD[jss::params] = paramsD;
 
 1166            auto const linesD = env.rpc(
"json2", 
to_string(requestD));
 
 1168                linesD[jss::error][jss::message] ==
 
 1171                linesD.isMember(jss::jsonrpc) && linesD[jss::jsonrpc] == 
"2.0");
 
 1173                linesD.isMember(jss::ripplerpc) &&
 
 1174                linesD[jss::ripplerpc] == 
"2.0");
 
 1175            BEAST_EXPECT(linesD.isMember(jss::id) && linesD[jss::id] == 5);
 
 1180            params[jss::account] = alice.human();
 
 1181            params[jss::marker] = 
true;
 
 1183            request[jss::method] = 
"account_lines";
 
 1184            request[jss::jsonrpc] = 
"2.0";
 
 1185            request[jss::ripplerpc] = 
"2.0";
 
 1186            request[jss::id] = 5;
 
 1187            request[jss::params] = params;
 
 1188            auto const lines = env.rpc(
"json2", 
to_string(request));
 
 1190                lines[jss::error][jss::message] ==
 
 1193                lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] == 
"2.0");
 
 1195                lines.isMember(jss::ripplerpc) &&
 
 1196                lines[jss::ripplerpc] == 
"2.0");
 
 1197            BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
 
 1202            params[jss::account] = alice.human();
 
 1203            params[jss::limit] = 10;
 
 1204            params[jss::peer] = gw2.human();
 
 1206            request[jss::method] = 
"account_lines";
 
 1207            request[jss::jsonrpc] = 
"2.0";
 
 1208            request[jss::ripplerpc] = 
"2.0";
 
 1209            request[jss::id] = 5;
 
 1210            request[jss::params] = params;
 
 1211            auto const lines = env.rpc(
"json2", 
to_string(request));
 
 1212            auto const& line = lines[jss::result][jss::lines][0u];
 
 1213            BEAST_EXPECT(line[jss::freeze].asBool() == 
true);
 
 1214            BEAST_EXPECT(line[jss::deep_freeze].asBool() == 
true);
 
 1215            BEAST_EXPECT(line[jss::no_ripple].asBool() == 
true);
 
 1216            BEAST_EXPECT(line[jss::peer_authorized].asBool() == 
true);
 
 1218                lines.isMember(jss::jsonrpc) && lines[jss::jsonrpc] == 
"2.0");
 
 1220                lines.isMember(jss::ripplerpc) &&
 
 1221                lines[jss::ripplerpc] == 
"2.0");
 
 1222            BEAST_EXPECT(lines.isMember(jss::id) && lines[jss::id] == 5);
 
 1227            paramsA[jss::account] = gw2.human();
 
 1228            paramsA[jss::limit] = 1;
 
 1229            paramsA[jss::peer] = alice.human();
 
 1231            requestA[jss::method] = 
"account_lines";
 
 1232            requestA[jss::jsonrpc] = 
"2.0";
 
 1233            requestA[jss::ripplerpc] = 
"2.0";
 
 1234            requestA[jss::id] = 5;
 
 1235            requestA[jss::params] = paramsA;
 
 1236            auto const linesA = env.rpc(
"json2", 
to_string(requestA));
 
 1237            auto const& lineA = linesA[jss::result][jss::lines][0u];
 
 1238            BEAST_EXPECT(lineA[jss::freeze_peer].asBool() == 
true);
 
 1239            BEAST_EXPECT(lineA[jss::deep_freeze_peer].asBool() == 
true);
 
 1240            BEAST_EXPECT(lineA[jss::no_ripple_peer].asBool() == 
true);
 
 1241            BEAST_EXPECT(lineA[jss::authorized].asBool() == 
true);
 
 1243                linesA.isMember(jss::jsonrpc) && linesA[jss::jsonrpc] == 
"2.0");
 
 1245                linesA.isMember(jss::ripplerpc) &&
 
 1246                linesA[jss::ripplerpc] == 
"2.0");
 
 1247            BEAST_EXPECT(linesA.isMember(jss::id) && linesA[jss::id] == 5);
 
 1250            BEAST_EXPECT(linesA[jss::result].isMember(jss::marker));
 
 1251            auto const marker = linesA[jss::result][jss::marker].asString();
 
 1253            paramsB[jss::account] = gw2.human();
 
 1254            paramsB[jss::limit] = 25;
 
 1255            paramsB[jss::marker] = marker;
 
 1256            paramsB[jss::peer] = alice.human();
 
 1258            requestB[jss::method] = 
"account_lines";
 
 1259            requestB[jss::jsonrpc] = 
"2.0";
 
 1260            requestB[jss::ripplerpc] = 
"2.0";
 
 1261            requestB[jss::id] = 5;
 
 1262            requestB[jss::params] = paramsB;
 
 1263            auto const linesB = env.rpc(
"json2", 
to_string(requestB));
 
 1264            BEAST_EXPECT(linesB[jss::result][jss::lines].isArray());
 
 1265            BEAST_EXPECT(linesB[jss::result][jss::lines].size() == 25);
 
 1266            BEAST_EXPECT(!linesB[jss::result].isMember(jss::marker));
 
 1268                linesB.isMember(jss::jsonrpc) && linesB[jss::jsonrpc] == 
"2.0");
 
 1270                linesB.isMember(jss::ripplerpc) &&
 
 1271                linesB[jss::ripplerpc] == 
"2.0");
 
 1272            BEAST_EXPECT(linesB.isMember(jss::id) && linesB[jss::id] == 5);