16        using namespace test::jtx;
 
   18                    cfg->loadFromString(
"[" SECTION_SIGNING_SUPPORT 
"]\ntrue");
 
   21        auto const gw = Account{
"gateway"};
 
   22        auto const USD = gw[
"USD"];
 
   23        auto const alice = Account{
"alice"};
 
   24        auto const bob = Account{
"bob"};
 
   26        env.fund(XRP(10000), alice, bob, gw);
 
   34        env.trust(USD(600), alice);
 
   35        env.trust(USD(700), bob);
 
   36        env(pay(gw, alice, USD(70)));
 
   37        env(pay(gw, bob, USD(50)));
 
   44        auto jr = env.rpc(
"ledger_accept")[jss::result];
 
   45        BEAST_EXPECT(jr[jss::ledger_current_index] == 
current->seq() + 1);
 
   46        BEAST_EXPECT(!jr.isMember(jss::warnings));
 
   49        jr = env.rpc(
"ledger_current")[jss::result];
 
   50        BEAST_EXPECT(jr[jss::ledger_current_index] == 
current->seq() + 1);
 
   51        BEAST_EXPECT(!jr.isMember(jss::warnings));
 
   54        jr = env.rpc(
"owner_info", alice.human())[jss::result];
 
   55        BEAST_EXPECT(jr.isMember(jss::accepted) && jr.isMember(jss::current));
 
   56        BEAST_EXPECT(!jr.isMember(jss::warnings));
 
   60        pf_req[jss::subcommand] = 
"create";
 
   61        pf_req[jss::source_account] = alice.human();
 
   62        pf_req[jss::destination_account] = bob.human();
 
   63        pf_req[jss::destination_amount] =
 
   65        jr = wsc->invoke(
"path_find", pf_req)[jss::result];
 
   67            jr.isMember(jss::alternatives) && jr[jss::alternatives].isArray() &&
 
   68            jr[jss::alternatives].size() == 1);
 
   69        BEAST_EXPECT(!jr.isMember(jss::warnings));
 
   72        auto jt = env.jt(
noop(alice));
 
   75        jr = env.rpc(
"submit", 
strHex(s.
slice()))[jss::result];
 
   77            jr.isMember(jss::engine_result) &&
 
   78            jr[jss::engine_result] == 
"tesSUCCESS");
 
   79        BEAST_EXPECT(!jr.isMember(jss::warnings));
 
   82        env(signers(bob, 1, {{alice, 1}}), sig(bob));
 
   83        env(regkey(alice, ali));
 
   87        set_tx[jss::Account] = bob.human();
 
   88        set_tx[jss::TransactionType] = jss::AccountSet;
 
   89        set_tx[jss::Fee] = (8 * env.current()->fees().base).jsonClipped();
 
   90        set_tx[jss::Sequence] = env.seq(bob);
 
   91        set_tx[jss::SigningPubKey] = 
"";
 
   94        sign_for[jss::tx_json] = set_tx;
 
   95        sign_for[jss::account] = alice.human();
 
   96        sign_for[jss::secret] = ali.name();
 
   97        jr = env.rpc(
"json", 
"sign_for", 
to_string(sign_for))[jss::result];
 
   98        BEAST_EXPECT(jr[jss::status] == 
"success");
 
   99        BEAST_EXPECT(!jr.isMember(jss::warnings));
 
  102        ms_req[jss::tx_json] = jr[jss::tx_json];
 
  104            "json", 
"submit_multisigned", 
to_string(ms_req))[jss::result];
 
  106            jr.isMember(jss::engine_result) &&
 
  107            jr[jss::engine_result] == 
"tesSUCCESS");
 
  108        BEAST_EXPECT(!jr.isMember(jss::warnings));
 
  112        env.app().getOPs().setAmendmentWarned();
 
  116        jr = env.rpc(
"ledger_accept")[jss::result];
 
  117        BEAST_EXPECT(jr[jss::ledger_current_index] == 
current->seq() + 1);
 
  118        BEAST_EXPECT(!jr.isMember(jss::warnings));
 
  121        jr = env.rpc(
"ledger_current")[jss::result];
 
  122        BEAST_EXPECT(jr[jss::ledger_current_index] == 
current->seq() + 1);
 
  123        BEAST_EXPECT(!jr.isMember(jss::warnings));
 
  126        jr = env.rpc(
"owner_info", alice.human())[jss::result];
 
  127        BEAST_EXPECT(jr.isMember(jss::accepted) && jr.isMember(jss::current));
 
  128        BEAST_EXPECT(!jr.isMember(jss::warnings));
 
  131        pf_req[jss::subcommand] = 
"create";
 
  132        pf_req[jss::source_account] = alice.human();
 
  133        pf_req[jss::destination_account] = bob.human();
 
  134        pf_req[jss::destination_amount] =
 
  136        jr = wsc->invoke(
"path_find", pf_req)[jss::result];
 
  138            jr.isMember(jss::alternatives) && jr[jss::alternatives].isArray() &&
 
  139            jr[jss::alternatives].size() == 1);
 
  140        BEAST_EXPECT(!jr.isMember(jss::warnings));
 
  143        jt = env.jt(
noop(alice));
 
  146        jr = env.rpc(
"submit", 
strHex(s.
slice()))[jss::result];
 
  148            jr.isMember(jss::engine_result) &&
 
  149            jr[jss::engine_result] == 
"tesSUCCESS");
 
  150        BEAST_EXPECT(!jr.isMember(jss::warnings));
 
  153        env(signers(bob, 1, {{alice, 1}}), sig(bob));
 
  154        env(regkey(alice, ali));
 
  157        set_tx[jss::Account] = bob.human();
 
  158        set_tx[jss::TransactionType] = jss::AccountSet;
 
  159        set_tx[jss::Fee] = (8 * env.current()->fees().base).jsonClipped();
 
  160        set_tx[jss::Sequence] = env.seq(bob);
 
  161        set_tx[jss::SigningPubKey] = 
"";
 
  163        sign_for[jss::tx_json] = set_tx;
 
  164        sign_for[jss::account] = alice.human();
 
  165        sign_for[jss::secret] = ali.name();
 
  166        jr = env.rpc(
"json", 
"sign_for", 
to_string(sign_for))[jss::result];
 
  167        BEAST_EXPECT(jr[jss::status] == 
"success");
 
  168        BEAST_EXPECT(!jr.isMember(jss::warnings));
 
  170        ms_req[jss::tx_json] = jr[jss::tx_json];
 
  172            "json", 
"submit_multisigned", 
to_string(ms_req))[jss::result];
 
  174            jr.isMember(jss::engine_result) &&
 
  175            jr[jss::engine_result] == 
"tesSUCCESS");
 
  176        BEAST_EXPECT(!jr.isMember(jss::warnings));
 
  181        env.app().getOPs().setAmendmentBlocked();
 
  184        jr = env.rpc(
"ledger_accept")[jss::result];
 
  186            jr.isMember(jss::error) && jr[jss::error] == 
"amendmentBlocked");
 
  187        BEAST_EXPECT(jr[jss::status] == 
"error");
 
  188        BEAST_EXPECT(!jr.isMember(jss::warnings));
 
  191        jr = env.rpc(
"ledger_current")[jss::result];
 
  193            jr.isMember(jss::error) && jr[jss::error] == 
"amendmentBlocked");
 
  194        BEAST_EXPECT(jr[jss::status] == 
"error");
 
  195        BEAST_EXPECT(!jr.isMember(jss::warnings));
 
  198        jr = env.rpc(
"owner_info", alice.human())[jss::result];
 
  200            jr.isMember(jss::error) && jr[jss::error] == 
"amendmentBlocked");
 
  201        BEAST_EXPECT(jr[jss::status] == 
"error");
 
  202        BEAST_EXPECT(!jr.isMember(jss::warnings));
 
  205        jr = wsc->invoke(
"path_find", pf_req)[jss::result];
 
  207            jr.isMember(jss::error) && jr[jss::error] == 
"amendmentBlocked");
 
  208        BEAST_EXPECT(jr[jss::status] == 
"error");
 
  209        BEAST_EXPECT(!jr.isMember(jss::warnings));
 
  212        jr = env.rpc(
"submit", 
strHex(s.
slice()))[jss::result];
 
  214            jr.isMember(jss::error) && jr[jss::error] == 
"amendmentBlocked");
 
  215        BEAST_EXPECT(jr[jss::status] == 
"error");
 
  216        BEAST_EXPECT(!jr.isMember(jss::warnings));
 
  219        set_tx[jss::Sequence] = env.seq(bob);
 
  220        sign_for[jss::tx_json] = set_tx;
 
  221        jr = env.rpc(
"json", 
"sign_for", 
to_string(sign_for))[jss::result];
 
  222        BEAST_EXPECT(jr[jss::status] == 
"success");
 
  223        ms_req[jss::tx_json] = jr[jss::tx_json];
 
  225            "json", 
"submit_multisigned", 
to_string(ms_req))[jss::result];
 
  227            jr.isMember(jss::error) && jr[jss::error] == 
"amendmentBlocked");
 
  228        BEAST_EXPECT(!jr.isMember(jss::warnings));