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] = bob[
"USD"](20).value().getJson(
JsonOptions::none);
64 jr = wsc->invoke(
"path_find", pf_req)[jss::result];
66 jr.isMember(jss::alternatives) && jr[jss::alternatives].isArray() &&
67 jr[jss::alternatives].size() == 1);
68 BEAST_EXPECT(!jr.isMember(jss::warnings));
71 auto jt = env.jt(
noop(alice));
74 jr = env.rpc(
"submit",
strHex(s.
slice()))[jss::result];
75 BEAST_EXPECT(jr.isMember(jss::engine_result) && jr[jss::engine_result] ==
"tesSUCCESS");
76 BEAST_EXPECT(!jr.isMember(jss::warnings));
79 env(signers(bob, 1, {{alice, 1}}), sig(bob));
80 env(regkey(alice, ali));
84 set_tx[jss::Account] = bob.human();
85 set_tx[jss::TransactionType] = jss::AccountSet;
86 set_tx[jss::Fee] = (8 * env.current()->fees().base).jsonClipped();
87 set_tx[jss::Sequence] = env.seq(bob);
88 set_tx[jss::SigningPubKey] =
"";
91 sign_for[jss::tx_json] = set_tx;
92 sign_for[jss::account] = alice.human();
93 sign_for[jss::secret] = ali.name();
94 jr = env.rpc(
"json",
"sign_for",
to_string(sign_for))[jss::result];
95 BEAST_EXPECT(jr[jss::status] ==
"success");
96 BEAST_EXPECT(!jr.isMember(jss::warnings));
99 ms_req[jss::tx_json] = jr[jss::tx_json];
100 jr = env.rpc(
"json",
"submit_multisigned",
to_string(ms_req))[jss::result];
101 BEAST_EXPECT(jr.isMember(jss::engine_result) && jr[jss::engine_result] ==
"tesSUCCESS");
102 BEAST_EXPECT(!jr.isMember(jss::warnings));
106 env.app().getOPs().setAmendmentWarned();
110 jr = env.rpc(
"ledger_accept")[jss::result];
111 BEAST_EXPECT(jr[jss::ledger_current_index] ==
current->seq() + 1);
112 BEAST_EXPECT(!jr.isMember(jss::warnings));
115 jr = env.rpc(
"ledger_current")[jss::result];
116 BEAST_EXPECT(jr[jss::ledger_current_index] ==
current->seq() + 1);
117 BEAST_EXPECT(!jr.isMember(jss::warnings));
120 jr = env.rpc(
"owner_info", alice.human())[jss::result];
121 BEAST_EXPECT(jr.isMember(jss::accepted) && jr.isMember(jss::current));
122 BEAST_EXPECT(!jr.isMember(jss::warnings));
125 pf_req[jss::subcommand] =
"create";
126 pf_req[jss::source_account] = alice.human();
127 pf_req[jss::destination_account] = bob.human();
128 pf_req[jss::destination_amount] = bob[
"USD"](20).value().getJson(
JsonOptions::none);
129 jr = wsc->invoke(
"path_find", pf_req)[jss::result];
131 jr.isMember(jss::alternatives) && jr[jss::alternatives].isArray() &&
132 jr[jss::alternatives].size() == 1);
133 BEAST_EXPECT(!jr.isMember(jss::warnings));
136 jt = env.jt(
noop(alice));
139 jr = env.rpc(
"submit",
strHex(s.
slice()))[jss::result];
140 BEAST_EXPECT(jr.isMember(jss::engine_result) && jr[jss::engine_result] ==
"tesSUCCESS");
141 BEAST_EXPECT(!jr.isMember(jss::warnings));
144 env(signers(bob, 1, {{alice, 1}}), sig(bob));
145 env(regkey(alice, ali));
148 set_tx[jss::Account] = bob.human();
149 set_tx[jss::TransactionType] = jss::AccountSet;
150 set_tx[jss::Fee] = (8 * env.current()->fees().base).jsonClipped();
151 set_tx[jss::Sequence] = env.seq(bob);
152 set_tx[jss::SigningPubKey] =
"";
154 sign_for[jss::tx_json] = set_tx;
155 sign_for[jss::account] = alice.human();
156 sign_for[jss::secret] = ali.name();
157 jr = env.rpc(
"json",
"sign_for",
to_string(sign_for))[jss::result];
158 BEAST_EXPECT(jr[jss::status] ==
"success");
159 BEAST_EXPECT(!jr.isMember(jss::warnings));
161 ms_req[jss::tx_json] = jr[jss::tx_json];
162 jr = env.rpc(
"json",
"submit_multisigned",
to_string(ms_req))[jss::result];
163 BEAST_EXPECT(jr.isMember(jss::engine_result) && jr[jss::engine_result] ==
"tesSUCCESS");
164 BEAST_EXPECT(!jr.isMember(jss::warnings));
169 env.app().getOPs().setAmendmentBlocked();
172 jr = env.rpc(
"ledger_accept")[jss::result];
173 BEAST_EXPECT(jr.isMember(jss::error) && jr[jss::error] ==
"amendmentBlocked");
174 BEAST_EXPECT(jr[jss::status] ==
"error");
175 BEAST_EXPECT(!jr.isMember(jss::warnings));
178 jr = env.rpc(
"ledger_current")[jss::result];
179 BEAST_EXPECT(jr.isMember(jss::error) && jr[jss::error] ==
"amendmentBlocked");
180 BEAST_EXPECT(jr[jss::status] ==
"error");
181 BEAST_EXPECT(!jr.isMember(jss::warnings));
184 jr = env.rpc(
"owner_info", alice.human())[jss::result];
185 BEAST_EXPECT(jr.isMember(jss::error) && jr[jss::error] ==
"amendmentBlocked");
186 BEAST_EXPECT(jr[jss::status] ==
"error");
187 BEAST_EXPECT(!jr.isMember(jss::warnings));
190 jr = wsc->invoke(
"path_find", pf_req)[jss::result];
191 BEAST_EXPECT(jr.isMember(jss::error) && jr[jss::error] ==
"amendmentBlocked");
192 BEAST_EXPECT(jr[jss::status] ==
"error");
193 BEAST_EXPECT(!jr.isMember(jss::warnings));
196 jr = env.rpc(
"submit",
strHex(s.
slice()))[jss::result];
197 BEAST_EXPECT(jr.isMember(jss::error) && jr[jss::error] ==
"amendmentBlocked");
198 BEAST_EXPECT(jr[jss::status] ==
"error");
199 BEAST_EXPECT(!jr.isMember(jss::warnings));
202 set_tx[jss::Sequence] = env.seq(bob);
203 sign_for[jss::tx_json] = set_tx;
204 jr = env.rpc(
"json",
"sign_for",
to_string(sign_for))[jss::result];
205 BEAST_EXPECT(jr[jss::status] ==
"success");
206 ms_req[jss::tx_json] = jr[jss::tx_json];
207 jr = env.rpc(
"json",
"submit_multisigned",
to_string(ms_req))[jss::result];
208 BEAST_EXPECT(jr.isMember(jss::error) && jr[jss::error] ==
"amendmentBlocked");
209 BEAST_EXPECT(!jr.isMember(jss::warnings));