35 using namespace test::jtx;
37 cfg->loadFromString(
"[" SECTION_SIGNING_SUPPORT
"]\ntrue");
40 auto const gw = Account{
"gateway"};
41 auto const USD = gw[
"USD"];
42 auto const alice = Account{
"alice"};
43 auto const bob = Account{
"bob"};
45 env.fund(XRP(10000), alice, bob, gw);
53 env.trust(USD(600), alice);
54 env.trust(USD(700), bob);
55 env(pay(gw, alice, USD(70)));
56 env(pay(gw, bob, USD(50)));
63 auto jr = env.rpc(
"ledger_accept")[jss::result];
64 BEAST_EXPECT(jr[jss::ledger_current_index] ==
current->seq() + 1);
65 BEAST_EXPECT(!jr.isMember(jss::warnings));
68 jr = env.rpc(
"ledger_current")[jss::result];
69 BEAST_EXPECT(jr[jss::ledger_current_index] ==
current->seq() + 1);
70 BEAST_EXPECT(!jr.isMember(jss::warnings));
73 jr = env.rpc(
"owner_info", alice.human())[jss::result];
74 BEAST_EXPECT(jr.isMember(jss::accepted) && jr.isMember(jss::current));
75 BEAST_EXPECT(!jr.isMember(jss::warnings));
79 pf_req[jss::subcommand] =
"create";
80 pf_req[jss::source_account] = alice.human();
81 pf_req[jss::destination_account] = bob.human();
82 pf_req[jss::destination_amount] =
84 jr = wsc->invoke(
"path_find", pf_req)[jss::result];
86 jr.isMember(jss::alternatives) && jr[jss::alternatives].isArray() &&
87 jr[jss::alternatives].size() == 1);
88 BEAST_EXPECT(!jr.isMember(jss::warnings));
91 auto jt = env.jt(
noop(alice));
94 jr = env.rpc(
"submit",
strHex(s.
slice()))[jss::result];
96 jr.isMember(jss::engine_result) &&
97 jr[jss::engine_result] ==
"tesSUCCESS");
98 BEAST_EXPECT(!jr.isMember(jss::warnings));
101 env(signers(bob, 1, {{alice, 1}}), sig(bob));
102 env(regkey(alice, ali));
106 set_tx[jss::Account] = bob.human();
107 set_tx[jss::TransactionType] = jss::AccountSet;
108 set_tx[jss::Fee] = (8 * env.current()->fees().base).jsonClipped();
109 set_tx[jss::Sequence] = env.seq(bob);
110 set_tx[jss::SigningPubKey] =
"";
113 sign_for[jss::tx_json] = set_tx;
114 sign_for[jss::account] = alice.human();
115 sign_for[jss::secret] = ali.name();
116 jr = env.rpc(
"json",
"sign_for",
to_string(sign_for))[jss::result];
117 BEAST_EXPECT(jr[jss::status] ==
"success");
118 BEAST_EXPECT(!jr.isMember(jss::warnings));
121 ms_req[jss::tx_json] = jr[jss::tx_json];
123 "json",
"submit_multisigned",
to_string(ms_req))[jss::result];
125 jr.isMember(jss::engine_result) &&
126 jr[jss::engine_result] ==
"tesSUCCESS");
127 BEAST_EXPECT(!jr.isMember(jss::warnings));
131 env.app().getOPs().setAmendmentWarned();
135 jr = env.rpc(
"ledger_accept")[jss::result];
136 BEAST_EXPECT(jr[jss::ledger_current_index] ==
current->seq() + 1);
137 BEAST_EXPECT(!jr.isMember(jss::warnings));
140 jr = env.rpc(
"ledger_current")[jss::result];
141 BEAST_EXPECT(jr[jss::ledger_current_index] ==
current->seq() + 1);
142 BEAST_EXPECT(!jr.isMember(jss::warnings));
145 jr = env.rpc(
"owner_info", alice.human())[jss::result];
146 BEAST_EXPECT(jr.isMember(jss::accepted) && jr.isMember(jss::current));
147 BEAST_EXPECT(!jr.isMember(jss::warnings));
150 pf_req[jss::subcommand] =
"create";
151 pf_req[jss::source_account] = alice.human();
152 pf_req[jss::destination_account] = bob.human();
153 pf_req[jss::destination_amount] =
155 jr = wsc->invoke(
"path_find", pf_req)[jss::result];
157 jr.isMember(jss::alternatives) && jr[jss::alternatives].isArray() &&
158 jr[jss::alternatives].size() == 1);
159 BEAST_EXPECT(!jr.isMember(jss::warnings));
162 jt = env.jt(
noop(alice));
165 jr = env.rpc(
"submit",
strHex(s.
slice()))[jss::result];
167 jr.isMember(jss::engine_result) &&
168 jr[jss::engine_result] ==
"tesSUCCESS");
169 BEAST_EXPECT(!jr.isMember(jss::warnings));
172 env(signers(bob, 1, {{alice, 1}}), sig(bob));
173 env(regkey(alice, ali));
176 set_tx[jss::Account] = bob.human();
177 set_tx[jss::TransactionType] = jss::AccountSet;
178 set_tx[jss::Fee] = (8 * env.current()->fees().base).jsonClipped();
179 set_tx[jss::Sequence] = env.seq(bob);
180 set_tx[jss::SigningPubKey] =
"";
182 sign_for[jss::tx_json] = set_tx;
183 sign_for[jss::account] = alice.human();
184 sign_for[jss::secret] = ali.name();
185 jr = env.rpc(
"json",
"sign_for",
to_string(sign_for))[jss::result];
186 BEAST_EXPECT(jr[jss::status] ==
"success");
187 BEAST_EXPECT(!jr.isMember(jss::warnings));
189 ms_req[jss::tx_json] = jr[jss::tx_json];
191 "json",
"submit_multisigned",
to_string(ms_req))[jss::result];
193 jr.isMember(jss::engine_result) &&
194 jr[jss::engine_result] ==
"tesSUCCESS");
195 BEAST_EXPECT(!jr.isMember(jss::warnings));
200 env.app().getOPs().setAmendmentBlocked();
203 jr = env.rpc(
"ledger_accept")[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(
"ledger_current")[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 = env.rpc(
"owner_info", alice.human())[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 = wsc->invoke(
"path_find", pf_req)[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 jr = env.rpc(
"submit",
strHex(s.
slice()))[jss::result];
233 jr.isMember(jss::error) && jr[jss::error] ==
"amendmentBlocked");
234 BEAST_EXPECT(jr[jss::status] ==
"error");
235 BEAST_EXPECT(!jr.isMember(jss::warnings));
238 set_tx[jss::Sequence] = env.seq(bob);
239 sign_for[jss::tx_json] = set_tx;
240 jr = env.rpc(
"json",
"sign_for",
to_string(sign_for))[jss::result];
241 BEAST_EXPECT(jr[jss::status] ==
"success");
242 ms_req[jss::tx_json] = jr[jss::tx_json];
244 "json",
"submit_multisigned",
to_string(ms_req))[jss::result];
246 jr.isMember(jss::error) && jr[jss::error] ==
"amendmentBlocked");
247 BEAST_EXPECT(!jr.isMember(jss::warnings));