21 #include <ripple/core/ConfigSections.h>
22 #include <ripple/protocol/jss.h>
23 #include <ripple/protocol/ErrorCodes.h>
24 #include <ripple/app/misc/NetworkOPs.h>
25 #include <test/jtx/WSClient.h>
33 using namespace test::jtx;
36 cfg->loadFromString (
"[" SECTION_SIGNING_SUPPORT
"]\ntrue");
39 auto const gw = Account {
"gateway"};
40 auto const USD = gw[
"USD"];
41 auto const alice = Account {
"alice"};
42 auto const bob = Account {
"bob"};
44 env.fund (XRP(10000), alice, bob, gw);
46 env.trust (USD(600), alice);
47 env.trust (USD(700), bob);
48 env(pay (gw, alice, USD(70)));
49 env(pay (gw, bob, USD(50)));
56 auto jr = env.rpc (
"ledger_accept") [jss::result];
57 BEAST_EXPECT (jr[jss::ledger_current_index] ==
current->seq ()+1);
58 BEAST_EXPECT(!jr.isMember(jss::warnings));
61 jr = env.rpc (
"ledger_current") [jss::result];
62 BEAST_EXPECT (jr[jss::ledger_current_index] ==
current->seq ()+1);
63 BEAST_EXPECT(!jr.isMember(jss::warnings));
66 jr = env.rpc (
"owner_info", alice.human()) [jss::result];
67 BEAST_EXPECT (jr.isMember (jss::accepted) && jr.isMember (jss::current));
68 BEAST_EXPECT(!jr.isMember(jss::warnings));
72 pf_req[jss::subcommand] =
"create";
73 pf_req[jss::source_account] = alice.human();
74 pf_req[jss::destination_account] = bob.human();
75 pf_req[jss::destination_amount] =
77 jr = wsc->invoke(
"path_find", pf_req) [jss::result];
78 BEAST_EXPECT (jr.isMember (jss::alternatives) &&
79 jr[jss::alternatives].isArray() &&
80 jr[jss::alternatives].size () == 1);
81 BEAST_EXPECT(!jr.isMember(jss::warnings));
84 auto jt = env.jt (noop (alice));
87 jr = env.rpc (
"submit",
strHex (s.
slice ())) [jss::result];
88 BEAST_EXPECT (jr.isMember (jss::engine_result) &&
89 jr[jss::engine_result] ==
"tesSUCCESS");
90 BEAST_EXPECT(!jr.isMember(jss::warnings));
93 env(signers(bob, 1, {{alice, 1}}), sig (bob));
94 env(regkey (alice, ali));
98 set_tx[jss::Account] = bob.human();
99 set_tx[jss::TransactionType] = jss::AccountSet;
101 (8 * env.current()->fees().base).jsonClipped();
102 set_tx[jss::Sequence] = env.seq(bob);
103 set_tx[jss::SigningPubKey] =
"";
106 sign_for[jss::tx_json] = set_tx;
107 sign_for[jss::account] = alice.human();
108 sign_for[jss::secret] = ali.name();
109 jr = env.rpc(
"json",
"sign_for",
to_string(sign_for)) [jss::result];
110 BEAST_EXPECT(jr[jss::status] ==
"success");
111 BEAST_EXPECT(!jr.isMember(jss::warnings));
114 ms_req[jss::tx_json] = jr[jss::tx_json];
115 jr = env.rpc(
"json",
"submit_multisigned",
to_string(ms_req))
117 BEAST_EXPECT (jr.isMember (jss::engine_result) &&
118 jr[jss::engine_result] ==
"tesSUCCESS");
119 BEAST_EXPECT(!jr.isMember(jss::warnings));
123 env.app ().getOPs ().setAmendmentWarned ();
127 jr = env.rpc (
"ledger_accept") [jss::result];
128 BEAST_EXPECT (jr[jss::ledger_current_index] ==
current->seq ()+1);
129 BEAST_EXPECT(!jr.isMember(jss::warnings));
132 jr = env.rpc (
"ledger_current") [jss::result];
133 BEAST_EXPECT (jr[jss::ledger_current_index] ==
current->seq ()+1);
134 BEAST_EXPECT(!jr.isMember(jss::warnings));
137 jr = env.rpc (
"owner_info", alice.human()) [jss::result];
138 BEAST_EXPECT (jr.isMember (jss::accepted) && jr.isMember (jss::current));
139 BEAST_EXPECT(!jr.isMember(jss::warnings));
142 pf_req[jss::subcommand] =
"create";
143 pf_req[jss::source_account] = alice.human();
144 pf_req[jss::destination_account] = bob.human();
145 pf_req[jss::destination_amount] =
147 jr = wsc->invoke(
"path_find", pf_req) [jss::result];
148 BEAST_EXPECT (jr.isMember (jss::alternatives) &&
149 jr[jss::alternatives].isArray() &&
150 jr[jss::alternatives].size () == 1);
151 BEAST_EXPECT(!jr.isMember(jss::warnings));
154 jt = env.jt (noop (alice));
157 jr = env.rpc (
"submit",
strHex (s.
slice ())) [jss::result];
158 BEAST_EXPECT (jr.isMember (jss::engine_result) &&
159 jr[jss::engine_result] ==
"tesSUCCESS");
160 BEAST_EXPECT(!jr.isMember(jss::warnings));
163 env(signers(bob, 1, {{alice, 1}}), sig (bob));
164 env(regkey (alice, ali));
167 set_tx[jss::Account] = bob.human();
168 set_tx[jss::TransactionType] = jss::AccountSet;
170 (8 * env.current()->fees().base).jsonClipped();
171 set_tx[jss::Sequence] = env.seq(bob);
172 set_tx[jss::SigningPubKey] =
"";
174 sign_for[jss::tx_json] = set_tx;
175 sign_for[jss::account] = alice.human();
176 sign_for[jss::secret] = ali.name();
177 jr = env.rpc(
"json",
"sign_for",
to_string(sign_for)) [jss::result];
178 BEAST_EXPECT(jr[jss::status] ==
"success");
179 BEAST_EXPECT(!jr.isMember(jss::warnings));
181 ms_req[jss::tx_json] = jr[jss::tx_json];
182 jr = env.rpc(
"json",
"submit_multisigned",
to_string(ms_req))
184 BEAST_EXPECT (jr.isMember (jss::engine_result) &&
185 jr[jss::engine_result] ==
"tesSUCCESS");
186 BEAST_EXPECT(!jr.isMember(jss::warnings));
191 env.app ().getOPs ().setAmendmentBlocked ();
194 jr = env.rpc (
"ledger_accept") [jss::result];
196 jr.isMember (jss::error) &&
197 jr[jss::error] ==
"amendmentBlocked");
198 BEAST_EXPECT(jr[jss::status] ==
"error");
199 BEAST_EXPECT(!jr.isMember(jss::warnings));
202 jr = env.rpc (
"ledger_current") [jss::result];
204 jr.isMember (jss::error) &&
205 jr[jss::error] ==
"amendmentBlocked");
206 BEAST_EXPECT(jr[jss::status] ==
"error");
207 BEAST_EXPECT(!jr.isMember(jss::warnings));
210 jr = env.rpc (
"owner_info", alice.human()) [jss::result];
212 jr.isMember (jss::error) &&
213 jr[jss::error] ==
"amendmentBlocked");
214 BEAST_EXPECT(jr[jss::status] ==
"error");
215 BEAST_EXPECT(!jr.isMember(jss::warnings));
218 jr = wsc->invoke(
"path_find", pf_req) [jss::result];
220 jr.isMember (jss::error) &&
221 jr[jss::error] ==
"amendmentBlocked");
222 BEAST_EXPECT(jr[jss::status] ==
"error");
223 BEAST_EXPECT(!jr.isMember(jss::warnings));
226 jr = env.rpc(
"submit",
strHex(s.
slice())) [jss::result];
228 jr.isMember (jss::error) &&
229 jr[jss::error] ==
"amendmentBlocked");
230 BEAST_EXPECT(jr[jss::status] ==
"error");
231 BEAST_EXPECT(!jr.isMember(jss::warnings));
234 set_tx[jss::Sequence] = env.seq(bob);
235 sign_for[jss::tx_json] = set_tx;
236 jr = env.rpc(
"json",
"sign_for",
to_string(sign_for)) [jss::result];
237 BEAST_EXPECT(jr[jss::status] ==
"success");
238 ms_req[jss::tx_json] = jr[jss::tx_json];
239 jr = env.rpc(
"json",
"submit_multisigned",
to_string(ms_req))
242 jr.isMember (jss::error) &&
243 jr[jss::error] ==
"amendmentBlocked");
244 BEAST_EXPECT(!jr.isMember(jss::warnings));