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);
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];
79 jr.isMember(jss::alternatives) && 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];
89 jr.isMember(jss::engine_result) &&
90 jr[jss::engine_result] ==
"tesSUCCESS");
91 BEAST_EXPECT(!jr.isMember(jss::warnings));
94 env(signers(bob, 1, {{alice, 1}}), sig(bob));
95 env(regkey(alice, ali));
99 set_tx[jss::Account] = bob.human();
100 set_tx[jss::TransactionType] = jss::AccountSet;
101 set_tx[jss::Fee] = (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];
116 "json",
"submit_multisigned",
to_string(ms_req))[jss::result];
118 jr.isMember(jss::engine_result) &&
119 jr[jss::engine_result] ==
"tesSUCCESS");
120 BEAST_EXPECT(!jr.isMember(jss::warnings));
124 env.app().getOPs().setAmendmentWarned();
128 jr = env.rpc(
"ledger_accept")[jss::result];
129 BEAST_EXPECT(jr[jss::ledger_current_index] ==
current->seq() + 1);
130 BEAST_EXPECT(!jr.isMember(jss::warnings));
133 jr = env.rpc(
"ledger_current")[jss::result];
134 BEAST_EXPECT(jr[jss::ledger_current_index] ==
current->seq() + 1);
135 BEAST_EXPECT(!jr.isMember(jss::warnings));
138 jr = env.rpc(
"owner_info", alice.human())[jss::result];
139 BEAST_EXPECT(jr.isMember(jss::accepted) && jr.isMember(jss::current));
140 BEAST_EXPECT(!jr.isMember(jss::warnings));
143 pf_req[jss::subcommand] =
"create";
144 pf_req[jss::source_account] = alice.human();
145 pf_req[jss::destination_account] = bob.human();
146 pf_req[jss::destination_amount] =
148 jr = wsc->invoke(
"path_find", pf_req)[jss::result];
150 jr.isMember(jss::alternatives) && jr[jss::alternatives].isArray() &&
151 jr[jss::alternatives].size() == 1);
152 BEAST_EXPECT(!jr.isMember(jss::warnings));
155 jt = env.jt(noop(alice));
158 jr = env.rpc(
"submit",
strHex(s.
slice()))[jss::result];
160 jr.isMember(jss::engine_result) &&
161 jr[jss::engine_result] ==
"tesSUCCESS");
162 BEAST_EXPECT(!jr.isMember(jss::warnings));
165 env(signers(bob, 1, {{alice, 1}}), sig(bob));
166 env(regkey(alice, ali));
169 set_tx[jss::Account] = bob.human();
170 set_tx[jss::TransactionType] = jss::AccountSet;
171 set_tx[jss::Fee] = (8 * env.current()->fees().base).jsonClipped();
172 set_tx[jss::Sequence] = env.seq(bob);
173 set_tx[jss::SigningPubKey] =
"";
175 sign_for[jss::tx_json] = set_tx;
176 sign_for[jss::account] = alice.human();
177 sign_for[jss::secret] = ali.name();
178 jr = env.rpc(
"json",
"sign_for",
to_string(sign_for))[jss::result];
179 BEAST_EXPECT(jr[jss::status] ==
"success");
180 BEAST_EXPECT(!jr.isMember(jss::warnings));
182 ms_req[jss::tx_json] = jr[jss::tx_json];
184 "json",
"submit_multisigned",
to_string(ms_req))[jss::result];
186 jr.isMember(jss::engine_result) &&
187 jr[jss::engine_result] ==
"tesSUCCESS");
188 BEAST_EXPECT(!jr.isMember(jss::warnings));
193 env.app().getOPs().setAmendmentBlocked();
196 jr = env.rpc(
"ledger_accept")[jss::result];
198 jr.isMember(jss::error) && jr[jss::error] ==
"amendmentBlocked");
199 BEAST_EXPECT(jr[jss::status] ==
"error");
200 BEAST_EXPECT(!jr.isMember(jss::warnings));
203 jr = env.rpc(
"ledger_current")[jss::result];
205 jr.isMember(jss::error) && 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) && jr[jss::error] ==
"amendmentBlocked");
213 BEAST_EXPECT(jr[jss::status] ==
"error");
214 BEAST_EXPECT(!jr.isMember(jss::warnings));
217 jr = wsc->invoke(
"path_find", pf_req)[jss::result];
219 jr.isMember(jss::error) && jr[jss::error] ==
"amendmentBlocked");
220 BEAST_EXPECT(jr[jss::status] ==
"error");
221 BEAST_EXPECT(!jr.isMember(jss::warnings));
224 jr = env.rpc(
"submit",
strHex(s.
slice()))[jss::result];
226 jr.isMember(jss::error) && jr[jss::error] ==
"amendmentBlocked");
227 BEAST_EXPECT(jr[jss::status] ==
"error");
228 BEAST_EXPECT(!jr.isMember(jss::warnings));
231 set_tx[jss::Sequence] = env.seq(bob);
232 sign_for[jss::tx_json] = set_tx;
233 jr = env.rpc(
"json",
"sign_for",
to_string(sign_for))[jss::result];
234 BEAST_EXPECT(jr[jss::status] ==
"success");
235 ms_req[jss::tx_json] = jr[jss::tx_json];
237 "json",
"submit_multisigned",
to_string(ms_req))[jss::result];
239 jr.isMember(jss::error) && jr[jss::error] ==
"amendmentBlocked");
240 BEAST_EXPECT(!jr.isMember(jss::warnings));