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] =
65 jr = wsc->invoke(
"path_find", pf_req)[jss::result];
67 jr.isMember(jss::alternatives) && jr[jss::alternatives].isArray() &&
68 jr[jss::alternatives].size() == 1);
69 BEAST_EXPECT(!jr.isMember(jss::warnings));
72 auto jt = env.jt(
noop(alice));
75 jr = env.rpc(
"submit",
strHex(s.
slice()))[jss::result];
77 jr.isMember(jss::engine_result) &&
78 jr[jss::engine_result] ==
"tesSUCCESS");
79 BEAST_EXPECT(!jr.isMember(jss::warnings));
82 env(signers(bob, 1, {{alice, 1}}), sig(bob));
83 env(regkey(alice, ali));
87 set_tx[jss::Account] = bob.human();
88 set_tx[jss::TransactionType] = jss::AccountSet;
89 set_tx[jss::Fee] = (8 * env.current()->fees().base).jsonClipped();
90 set_tx[jss::Sequence] = env.seq(bob);
91 set_tx[jss::SigningPubKey] =
"";
94 sign_for[jss::tx_json] = set_tx;
95 sign_for[jss::account] = alice.human();
96 sign_for[jss::secret] = ali.name();
97 jr = env.rpc(
"json",
"sign_for",
to_string(sign_for))[jss::result];
98 BEAST_EXPECT(jr[jss::status] ==
"success");
99 BEAST_EXPECT(!jr.isMember(jss::warnings));
102 ms_req[jss::tx_json] = jr[jss::tx_json];
104 "json",
"submit_multisigned",
to_string(ms_req))[jss::result];
106 jr.isMember(jss::engine_result) &&
107 jr[jss::engine_result] ==
"tesSUCCESS");
108 BEAST_EXPECT(!jr.isMember(jss::warnings));
112 env.app().getOPs().setAmendmentWarned();
116 jr = env.rpc(
"ledger_accept")[jss::result];
117 BEAST_EXPECT(jr[jss::ledger_current_index] ==
current->seq() + 1);
118 BEAST_EXPECT(!jr.isMember(jss::warnings));
121 jr = env.rpc(
"ledger_current")[jss::result];
122 BEAST_EXPECT(jr[jss::ledger_current_index] ==
current->seq() + 1);
123 BEAST_EXPECT(!jr.isMember(jss::warnings));
126 jr = env.rpc(
"owner_info", alice.human())[jss::result];
127 BEAST_EXPECT(jr.isMember(jss::accepted) && jr.isMember(jss::current));
128 BEAST_EXPECT(!jr.isMember(jss::warnings));
131 pf_req[jss::subcommand] =
"create";
132 pf_req[jss::source_account] = alice.human();
133 pf_req[jss::destination_account] = bob.human();
134 pf_req[jss::destination_amount] =
136 jr = wsc->invoke(
"path_find", pf_req)[jss::result];
138 jr.isMember(jss::alternatives) && jr[jss::alternatives].isArray() &&
139 jr[jss::alternatives].size() == 1);
140 BEAST_EXPECT(!jr.isMember(jss::warnings));
143 jt = env.jt(
noop(alice));
146 jr = env.rpc(
"submit",
strHex(s.
slice()))[jss::result];
148 jr.isMember(jss::engine_result) &&
149 jr[jss::engine_result] ==
"tesSUCCESS");
150 BEAST_EXPECT(!jr.isMember(jss::warnings));
153 env(signers(bob, 1, {{alice, 1}}), sig(bob));
154 env(regkey(alice, ali));
157 set_tx[jss::Account] = bob.human();
158 set_tx[jss::TransactionType] = jss::AccountSet;
159 set_tx[jss::Fee] = (8 * env.current()->fees().base).jsonClipped();
160 set_tx[jss::Sequence] = env.seq(bob);
161 set_tx[jss::SigningPubKey] =
"";
163 sign_for[jss::tx_json] = set_tx;
164 sign_for[jss::account] = alice.human();
165 sign_for[jss::secret] = ali.name();
166 jr = env.rpc(
"json",
"sign_for",
to_string(sign_for))[jss::result];
167 BEAST_EXPECT(jr[jss::status] ==
"success");
168 BEAST_EXPECT(!jr.isMember(jss::warnings));
170 ms_req[jss::tx_json] = jr[jss::tx_json];
172 "json",
"submit_multisigned",
to_string(ms_req))[jss::result];
174 jr.isMember(jss::engine_result) &&
175 jr[jss::engine_result] ==
"tesSUCCESS");
176 BEAST_EXPECT(!jr.isMember(jss::warnings));
181 env.app().getOPs().setAmendmentBlocked();
184 jr = env.rpc(
"ledger_accept")[jss::result];
186 jr.isMember(jss::error) && jr[jss::error] ==
"amendmentBlocked");
187 BEAST_EXPECT(jr[jss::status] ==
"error");
188 BEAST_EXPECT(!jr.isMember(jss::warnings));
191 jr = env.rpc(
"ledger_current")[jss::result];
193 jr.isMember(jss::error) && jr[jss::error] ==
"amendmentBlocked");
194 BEAST_EXPECT(jr[jss::status] ==
"error");
195 BEAST_EXPECT(!jr.isMember(jss::warnings));
198 jr = env.rpc(
"owner_info", alice.human())[jss::result];
200 jr.isMember(jss::error) && jr[jss::error] ==
"amendmentBlocked");
201 BEAST_EXPECT(jr[jss::status] ==
"error");
202 BEAST_EXPECT(!jr.isMember(jss::warnings));
205 jr = wsc->invoke(
"path_find", pf_req)[jss::result];
207 jr.isMember(jss::error) && jr[jss::error] ==
"amendmentBlocked");
208 BEAST_EXPECT(jr[jss::status] ==
"error");
209 BEAST_EXPECT(!jr.isMember(jss::warnings));
212 jr = env.rpc(
"submit",
strHex(s.
slice()))[jss::result];
214 jr.isMember(jss::error) && jr[jss::error] ==
"amendmentBlocked");
215 BEAST_EXPECT(jr[jss::status] ==
"error");
216 BEAST_EXPECT(!jr.isMember(jss::warnings));
219 set_tx[jss::Sequence] = env.seq(bob);
220 sign_for[jss::tx_json] = set_tx;
221 jr = env.rpc(
"json",
"sign_for",
to_string(sign_for))[jss::result];
222 BEAST_EXPECT(jr[jss::status] ==
"success");
223 ms_req[jss::tx_json] = jr[jss::tx_json];
225 "json",
"submit_multisigned",
to_string(ms_req))[jss::result];
227 jr.isMember(jss::error) && jr[jss::error] ==
"amendmentBlocked");
228 BEAST_EXPECT(!jr.isMember(jss::warnings));