37 auto const gw =
Account{
"gateway"};
38 auto const usd = gw[
"USD"];
39 auto const alice =
Account{
"alice"};
40 auto const bob =
Account{
"bob"};
42 env.fund(XRP(10000), alice, bob, gw);
50 env.trust(usd(600), alice);
51 env.trust(usd(700), bob);
52 env(pay(gw, alice, usd(70)));
53 env(pay(gw, bob, usd(50)));
58 auto current = env.current();
60 auto jr = env.rpc(
"ledger_accept")[jss::result];
61 BEAST_EXPECT(jr[jss::ledger_current_index] == current->seq() + 1);
62 BEAST_EXPECT(!jr.isMember(jss::warnings));
65 jr = env.rpc(
"ledger_current")[jss::result];
66 BEAST_EXPECT(jr[jss::ledger_current_index] == current->seq() + 1);
67 BEAST_EXPECT(!jr.isMember(jss::warnings));
70 jr = env.rpc(
"owner_info", alice.human())[jss::result];
71 BEAST_EXPECT(jr.isMember(jss::accepted) && jr.isMember(jss::current));
72 BEAST_EXPECT(!jr.isMember(jss::warnings));
76 pfReq[jss::subcommand] =
"create";
77 pfReq[jss::source_account] = alice.human();
78 pfReq[jss::destination_account] = bob.human();
80 jr = wsc->invoke(
"path_find", pfReq)[jss::result];
82 jr.isMember(jss::alternatives) && jr[jss::alternatives].isArray() &&
83 jr[jss::alternatives].size() == 1);
84 BEAST_EXPECT(!jr.isMember(jss::warnings));
87 auto jt = env.jt(noop(alice));
90 jr = env.rpc(
"submit",
strHex(s.
slice()))[jss::result];
91 BEAST_EXPECT(jr.isMember(jss::engine_result) && jr[jss::engine_result] ==
"tesSUCCESS");
92 BEAST_EXPECT(!jr.isMember(jss::warnings));
95 env(signers(bob, 1, {{alice, 1}}), Sig(bob));
96 env(regkey(alice, ali));
100 setTx[jss::Account] = bob.human();
101 setTx[jss::TransactionType] = jss::AccountSet;
102 setTx[jss::Fee] = (8 * env.current()->fees().base).jsonClipped();
103 setTx[jss::Sequence] = env.seq(bob);
104 setTx[jss::SigningPubKey] =
"";
107 signFor[jss::tx_json] = setTx;
108 signFor[jss::account] = alice.human();
109 signFor[jss::secret] = ali.name();
110 jr = env.rpc(
"json",
"sign_for",
to_string(signFor))[jss::result];
111 BEAST_EXPECT(jr[jss::status] ==
"success");
112 BEAST_EXPECT(!jr.isMember(jss::warnings));
115 msReq[jss::tx_json] = jr[jss::tx_json];
116 jr = env.rpc(
"json",
"submit_multisigned",
to_string(msReq))[jss::result];
117 BEAST_EXPECT(jr.isMember(jss::engine_result) && jr[jss::engine_result] ==
"tesSUCCESS");
118 BEAST_EXPECT(!jr.isMember(jss::warnings));
122 env.app().getOPs().setAmendmentWarned();
124 current = env.current();
126 jr = env.rpc(
"ledger_accept")[jss::result];
127 BEAST_EXPECT(jr[jss::ledger_current_index] == current->seq() + 1);
128 BEAST_EXPECT(!jr.isMember(jss::warnings));
131 jr = env.rpc(
"ledger_current")[jss::result];
132 BEAST_EXPECT(jr[jss::ledger_current_index] == current->seq() + 1);
133 BEAST_EXPECT(!jr.isMember(jss::warnings));
136 jr = env.rpc(
"owner_info", alice.human())[jss::result];
137 BEAST_EXPECT(jr.isMember(jss::accepted) && jr.isMember(jss::current));
138 BEAST_EXPECT(!jr.isMember(jss::warnings));
141 pfReq[jss::subcommand] =
"create";
142 pfReq[jss::source_account] = alice.human();
143 pfReq[jss::destination_account] = bob.human();
145 jr = wsc->invoke(
"path_find", pfReq)[jss::result];
147 jr.isMember(jss::alternatives) && jr[jss::alternatives].isArray() &&
148 jr[jss::alternatives].size() == 1);
149 BEAST_EXPECT(!jr.isMember(jss::warnings));
152 jt = env.jt(noop(alice));
155 jr = env.rpc(
"submit",
strHex(s.
slice()))[jss::result];
156 BEAST_EXPECT(jr.isMember(jss::engine_result) && jr[jss::engine_result] ==
"tesSUCCESS");
157 BEAST_EXPECT(!jr.isMember(jss::warnings));
160 env(signers(bob, 1, {{alice, 1}}), Sig(bob));
161 env(regkey(alice, ali));
164 setTx[jss::Account] = bob.human();
165 setTx[jss::TransactionType] = jss::AccountSet;
166 setTx[jss::Fee] = (8 * env.current()->fees().base).jsonClipped();
167 setTx[jss::Sequence] = env.seq(bob);
168 setTx[jss::SigningPubKey] =
"";
170 signFor[jss::tx_json] = setTx;
171 signFor[jss::account] = alice.human();
172 signFor[jss::secret] = ali.name();
173 jr = env.rpc(
"json",
"sign_for",
to_string(signFor))[jss::result];
174 BEAST_EXPECT(jr[jss::status] ==
"success");
175 BEAST_EXPECT(!jr.isMember(jss::warnings));
177 msReq[jss::tx_json] = jr[jss::tx_json];
178 jr = env.rpc(
"json",
"submit_multisigned",
to_string(msReq))[jss::result];
179 BEAST_EXPECT(jr.isMember(jss::engine_result) && jr[jss::engine_result] ==
"tesSUCCESS");
180 BEAST_EXPECT(!jr.isMember(jss::warnings));
185 env.app().getOPs().setAmendmentBlocked();
188 jr = env.rpc(
"ledger_accept")[jss::result];
189 BEAST_EXPECT(jr.isMember(jss::error) && jr[jss::error] ==
"amendmentBlocked");
190 BEAST_EXPECT(jr[jss::status] ==
"error");
191 BEAST_EXPECT(!jr.isMember(jss::warnings));
194 jr = env.rpc(
"ledger_current")[jss::result];
195 BEAST_EXPECT(jr.isMember(jss::error) && jr[jss::error] ==
"amendmentBlocked");
196 BEAST_EXPECT(jr[jss::status] ==
"error");
197 BEAST_EXPECT(!jr.isMember(jss::warnings));
200 jr = env.rpc(
"owner_info", alice.human())[jss::result];
201 BEAST_EXPECT(jr.isMember(jss::error) && jr[jss::error] ==
"amendmentBlocked");
202 BEAST_EXPECT(jr[jss::status] ==
"error");
203 BEAST_EXPECT(!jr.isMember(jss::warnings));
206 jr = wsc->invoke(
"path_find", pfReq)[jss::result];
207 BEAST_EXPECT(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];
213 BEAST_EXPECT(jr.isMember(jss::error) && jr[jss::error] ==
"amendmentBlocked");
214 BEAST_EXPECT(jr[jss::status] ==
"error");
215 BEAST_EXPECT(!jr.isMember(jss::warnings));
218 setTx[jss::Sequence] = env.seq(bob);
219 signFor[jss::tx_json] = setTx;
220 jr = env.rpc(
"json",
"sign_for",
to_string(signFor))[jss::result];
221 BEAST_EXPECT(jr[jss::status] ==
"success");
222 msReq[jss::tx_json] = jr[jss::tx_json];
223 jr = env.rpc(
"json",
"submit_multisigned",
to_string(msReq))[jss::result];
224 BEAST_EXPECT(jr.isMember(jss::error) && jr[jss::error] ==
"amendmentBlocked");
225 BEAST_EXPECT(!jr.isMember(jss::warnings));