20 #include <ripple/app/misc/NetworkOPs.h>
21 #include <ripple/core/ConfigSections.h>
22 #include <ripple/protocol/ErrorCodes.h>
23 #include <ripple/protocol/jss.h>
25 #include <test/jtx/WSClient.h>
34 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);
52 env.trust(USD(600), alice);
53 env.trust(USD(700), bob);
54 env(pay(gw, alice, USD(70)));
55 env(pay(gw, bob, USD(50)));
62 auto jr = env.rpc(
"ledger_accept")[jss::result];
63 BEAST_EXPECT(jr[jss::ledger_current_index] ==
current->seq() + 1);
64 BEAST_EXPECT(!jr.isMember(jss::warnings));
67 jr = env.rpc(
"ledger_current")[jss::result];
68 BEAST_EXPECT(jr[jss::ledger_current_index] ==
current->seq() + 1);
69 BEAST_EXPECT(!jr.isMember(jss::warnings));
72 jr = env.rpc(
"owner_info", alice.human())[jss::result];
73 BEAST_EXPECT(jr.isMember(jss::accepted) && jr.isMember(jss::current));
74 BEAST_EXPECT(!jr.isMember(jss::warnings));
78 pf_req[jss::subcommand] =
"create";
79 pf_req[jss::source_account] = alice.human();
80 pf_req[jss::destination_account] = bob.human();
81 pf_req[jss::destination_amount] =
83 jr = wsc->invoke(
"path_find", pf_req)[jss::result];
85 jr.isMember(jss::alternatives) && jr[jss::alternatives].isArray() &&
86 jr[jss::alternatives].size() == 1);
87 BEAST_EXPECT(!jr.isMember(jss::warnings));
90 auto jt = env.jt(noop(alice));
93 jr = env.rpc(
"submit",
strHex(s.
slice()))[jss::result];
95 jr.isMember(jss::engine_result) &&
96 jr[jss::engine_result] ==
"tesSUCCESS");
97 BEAST_EXPECT(!jr.isMember(jss::warnings));
100 env(signers(bob, 1, {{alice, 1}}), sig(bob));
101 env(regkey(alice, ali));
105 set_tx[jss::Account] = bob.human();
106 set_tx[jss::TransactionType] = jss::AccountSet;
107 set_tx[jss::Fee] = (8 * env.current()->fees().base).jsonClipped();
108 set_tx[jss::Sequence] = env.seq(bob);
109 set_tx[jss::SigningPubKey] =
"";
112 sign_for[jss::tx_json] = set_tx;
113 sign_for[jss::account] = alice.human();
114 sign_for[jss::secret] = ali.name();
115 jr = env.rpc(
"json",
"sign_for",
to_string(sign_for))[jss::result];
116 BEAST_EXPECT(jr[jss::status] ==
"success");
117 BEAST_EXPECT(!jr.isMember(jss::warnings));
120 ms_req[jss::tx_json] = jr[jss::tx_json];
122 "json",
"submit_multisigned",
to_string(ms_req))[jss::result];
124 jr.isMember(jss::engine_result) &&
125 jr[jss::engine_result] ==
"tesSUCCESS");
126 BEAST_EXPECT(!jr.isMember(jss::warnings));
130 env.app().getOPs().setAmendmentWarned();
134 jr = env.rpc(
"ledger_accept")[jss::result];
135 BEAST_EXPECT(jr[jss::ledger_current_index] ==
current->seq() + 1);
136 BEAST_EXPECT(!jr.isMember(jss::warnings));
139 jr = env.rpc(
"ledger_current")[jss::result];
140 BEAST_EXPECT(jr[jss::ledger_current_index] ==
current->seq() + 1);
141 BEAST_EXPECT(!jr.isMember(jss::warnings));
144 jr = env.rpc(
"owner_info", alice.human())[jss::result];
145 BEAST_EXPECT(jr.isMember(jss::accepted) && jr.isMember(jss::current));
146 BEAST_EXPECT(!jr.isMember(jss::warnings));
149 pf_req[jss::subcommand] =
"create";
150 pf_req[jss::source_account] = alice.human();
151 pf_req[jss::destination_account] = bob.human();
152 pf_req[jss::destination_amount] =
154 jr = wsc->invoke(
"path_find", pf_req)[jss::result];
156 jr.isMember(jss::alternatives) && jr[jss::alternatives].isArray() &&
157 jr[jss::alternatives].size() == 1);
158 BEAST_EXPECT(!jr.isMember(jss::warnings));
161 jt = env.jt(noop(alice));
164 jr = env.rpc(
"submit",
strHex(s.
slice()))[jss::result];
166 jr.isMember(jss::engine_result) &&
167 jr[jss::engine_result] ==
"tesSUCCESS");
168 BEAST_EXPECT(!jr.isMember(jss::warnings));
171 env(signers(bob, 1, {{alice, 1}}), sig(bob));
172 env(regkey(alice, ali));
175 set_tx[jss::Account] = bob.human();
176 set_tx[jss::TransactionType] = jss::AccountSet;
177 set_tx[jss::Fee] = (8 * env.current()->fees().base).jsonClipped();
178 set_tx[jss::Sequence] = env.seq(bob);
179 set_tx[jss::SigningPubKey] =
"";
181 sign_for[jss::tx_json] = set_tx;
182 sign_for[jss::account] = alice.human();
183 sign_for[jss::secret] = ali.name();
184 jr = env.rpc(
"json",
"sign_for",
to_string(sign_for))[jss::result];
185 BEAST_EXPECT(jr[jss::status] ==
"success");
186 BEAST_EXPECT(!jr.isMember(jss::warnings));
188 ms_req[jss::tx_json] = jr[jss::tx_json];
190 "json",
"submit_multisigned",
to_string(ms_req))[jss::result];
192 jr.isMember(jss::engine_result) &&
193 jr[jss::engine_result] ==
"tesSUCCESS");
194 BEAST_EXPECT(!jr.isMember(jss::warnings));
199 env.app().getOPs().setAmendmentBlocked();
202 jr = env.rpc(
"ledger_accept")[jss::result];
204 jr.isMember(jss::error) && jr[jss::error] ==
"amendmentBlocked");
205 BEAST_EXPECT(jr[jss::status] ==
"error");
206 BEAST_EXPECT(!jr.isMember(jss::warnings));
209 jr = env.rpc(
"ledger_current")[jss::result];
211 jr.isMember(jss::error) && jr[jss::error] ==
"amendmentBlocked");
212 BEAST_EXPECT(jr[jss::status] ==
"error");
213 BEAST_EXPECT(!jr.isMember(jss::warnings));
216 jr = env.rpc(
"owner_info", alice.human())[jss::result];
218 jr.isMember(jss::error) && jr[jss::error] ==
"amendmentBlocked");
219 BEAST_EXPECT(jr[jss::status] ==
"error");
220 BEAST_EXPECT(!jr.isMember(jss::warnings));
223 jr = wsc->invoke(
"path_find", pf_req)[jss::result];
225 jr.isMember(jss::error) && jr[jss::error] ==
"amendmentBlocked");
226 BEAST_EXPECT(jr[jss::status] ==
"error");
227 BEAST_EXPECT(!jr.isMember(jss::warnings));
230 jr = env.rpc(
"submit",
strHex(s.
slice()))[jss::result];
232 jr.isMember(jss::error) && jr[jss::error] ==
"amendmentBlocked");
233 BEAST_EXPECT(jr[jss::status] ==
"error");
234 BEAST_EXPECT(!jr.isMember(jss::warnings));
237 set_tx[jss::Sequence] = env.seq(bob);
238 sign_for[jss::tx_json] = set_tx;
239 jr = env.rpc(
"json",
"sign_for",
to_string(sign_for))[jss::result];
240 BEAST_EXPECT(jr[jss::status] ==
"success");
241 ms_req[jss::tx_json] = jr[jss::tx_json];
243 "json",
"submit_multisigned",
to_string(ms_req))[jss::result];
245 jr.isMember(jss::error) && jr[jss::error] ==
"amendmentBlocked");
246 BEAST_EXPECT(!jr.isMember(jss::warnings));