20 #include <ripple/app/ledger/LedgerMaster.h>
21 #include <ripple/beast/unit_test.h>
22 #include <ripple/protocol/ErrorCodes.h>
23 #include <ripple/protocol/jss.h>
24 #include <ripple/rpc/impl/RPCHelpers.h>
37 using namespace test::jtx;
43 BEAST_EXPECT(env.current()->info().seq == 5);
47 auto const result = env.rpc(
"ledger_request",
"arbitrary_text");
50 result[jss::result][jss::error_message] ==
51 "Ledger index too small");
55 auto const result = env.rpc(
"ledger_request",
"-1");
58 result[jss::result][jss::error_message] ==
59 "Ledger index too small");
63 auto const result = env.rpc(
"ledger_request",
"0");
66 result[jss::result][jss::error_message] ==
67 "Ledger index too small");
71 auto const result = env.rpc(
"ledger_request",
"1");
74 result[jss::result][jss::ledger_index] == 1 &&
75 result[jss::result].isMember(jss::ledger));
77 result[jss::result][jss::ledger].isMember(jss::ledger_hash) &&
78 result[jss::result][jss::ledger][jss::ledger_hash].isString());
82 auto const result = env.rpc(
"ledger_request",
"2");
85 result[jss::result][jss::ledger_index] == 2 &&
86 result[jss::result].isMember(jss::ledger));
88 result[jss::result][jss::ledger].isMember(jss::ledger_hash) &&
89 result[jss::result][jss::ledger][jss::ledger_hash].isString());
93 auto const result = env.rpc(
"ledger_request",
"3");
96 result[jss::result][jss::ledger_index] == 3 &&
97 result[jss::result].isMember(jss::ledger));
99 result[jss::result][jss::ledger].isMember(jss::ledger_hash) &&
100 result[jss::result][jss::ledger][jss::ledger_hash].isString());
102 auto const ledgerHash =
103 result[jss::result][jss::ledger][jss::ledger_hash].asString();
106 auto const r = env.rpc(
"ledger_request", ledgerHash);
109 r[jss::result][jss::ledger_index] == 3 &&
110 r[jss::result].isMember(jss::ledger));
112 r[jss::result][jss::ledger].isMember(jss::ledger_hash) &&
113 r[jss::result][jss::ledger][jss::ledger_hash] ==
121 auto const result = env.rpc(
"ledger_request", ledgerHash);
125 result[jss::result][jss::error_message] ==
126 "Invalid field 'ledger_hash'.");
132 auto const result = env.rpc(
"ledger_request", ledgerHash);
136 result[jss::result][jss::have_header] ==
false);
140 auto const result = env.rpc(
"ledger_request",
"4");
143 result[jss::result][jss::error_message] ==
144 "Ledger index too large");
148 auto const result = env.rpc(
"ledger_request",
"5");
151 result[jss::result][jss::error_message] ==
152 "Ledger index too large");
159 using namespace test::jtx;
162 Account
const gw{
"gateway"};
163 auto const USD = gw[
"USD"];
164 env.fund(XRP(100000), gw);
168 env.fund(XRP(1000),
"bob");
171 env.memoize(
"alice");
172 env.fund(XRP(1000),
"alice");
175 env.memoize(
"carol");
176 env.fund(XRP(1000),
"carol");
179 auto result = env.rpc(
"ledger_request",
"1")[jss::result];
180 BEAST_EXPECT(result[jss::ledger][jss::ledger_index] ==
"1");
182 result[jss::ledger][jss::total_coins] ==
"100000000000000000");
183 BEAST_EXPECT(result[jss::ledger][jss::closed] ==
true);
185 result[jss::ledger][jss::ledger_hash] ==
186 "E9BB323980D202EC7E51BAB2AA8E35353F9C7BDAB59BF17378EADD4D0486EF9F");
188 result[jss::ledger][jss::parent_hash] ==
189 "0000000000000000000000000000000000000000000000000000000000000000");
191 result[jss::ledger][jss::account_hash] ==
192 "A21ED30C04C88046FC61DB9DC19375EEDBD365FD8C17286F27127DF804E9CAA6");
194 result[jss::ledger][jss::transaction_hash] ==
195 "0000000000000000000000000000000000000000000000000000000000000000");
197 result = env.rpc(
"ledger_request",
"2")[jss::result];
198 BEAST_EXPECT(result[jss::ledger][jss::ledger_index] ==
"2");
200 result[jss::ledger][jss::total_coins] ==
"100000000000000000");
201 BEAST_EXPECT(result[jss::ledger][jss::closed] ==
true);
203 result[jss::ledger][jss::ledger_hash] ==
204 "A15F7FBE0B06286915D971BF9802C9431CD7DE40E2AC7D07C409EDB1C0715C60");
206 result[jss::ledger][jss::parent_hash] ==
207 "E9BB323980D202EC7E51BAB2AA8E35353F9C7BDAB59BF17378EADD4D0486EF9F");
209 result[jss::ledger][jss::account_hash] ==
210 "CB07F3CA0398BE969A5B88F874629D4DBB6E103DE7C6DB8037281A89E51AA8C6");
212 result[jss::ledger][jss::transaction_hash] ==
213 "0000000000000000000000000000000000000000000000000000000000000000");
215 result = env.rpc(
"ledger_request",
"3")[jss::result];
216 BEAST_EXPECT(result[jss::ledger][jss::ledger_index] ==
"3");
218 result[jss::ledger][jss::total_coins] ==
"99999999999999980");
219 BEAST_EXPECT(result[jss::ledger][jss::closed] ==
true);
221 result[jss::ledger][jss::ledger_hash] ==
222 "9BCA8AE5FD41D223D82E1B8288961D693EB1B2EFA10F51827A641AD4B12111D7");
224 result[jss::ledger][jss::parent_hash] ==
225 "A15F7FBE0B06286915D971BF9802C9431CD7DE40E2AC7D07C409EDB1C0715C60");
227 result[jss::ledger][jss::account_hash] ==
228 "5B793533909906D15CE27D1A423732D113160AB166188D89A2DFD8737CBDCBD5");
230 result[jss::ledger][jss::transaction_hash] ==
231 "0213EC486C058B3942FBE3DAC6839949A5C5B02B8B4244C8998EFDF04DBD8222");
233 result = env.rpc(
"ledger_request",
"4")[jss::result];
234 BEAST_EXPECT(result[jss::ledger][jss::ledger_index] ==
"4");
236 result[jss::ledger][jss::total_coins] ==
"99999999999999960");
237 BEAST_EXPECT(result[jss::ledger][jss::closed] ==
true);
239 result[jss::ledger][jss::ledger_hash] ==
240 "433D1E42F2735F926BF594E4F3DFC70AE3E74F51464156ED83A33D0FF121D136");
242 result[jss::ledger][jss::parent_hash] ==
243 "9BCA8AE5FD41D223D82E1B8288961D693EB1B2EFA10F51827A641AD4B12111D7");
245 result[jss::ledger][jss::account_hash] ==
246 "39C91E2227ACECD057AFDC64AE8FEFF5A0E07CF26ED29D1AECC55B0385F3EFDE");
248 result[jss::ledger][jss::transaction_hash] ==
249 "3CBDB8F42E04333E1642166BFB93AC9A7E1C6C067092CD5D881D6F3AB3D67E76");
251 result = env.rpc(
"ledger_request",
"5")[jss::result];
252 BEAST_EXPECT(result[jss::ledger][jss::ledger_index] ==
"5");
254 result[jss::ledger][jss::total_coins] ==
"99999999999999940");
255 BEAST_EXPECT(result[jss::ledger][jss::closed] ==
true);
257 result[jss::ledger][jss::ledger_hash] ==
258 "9ED4D0C397810980904AF3FC08583D23B09C3C7CCF835D2A4768145A8BAC1175");
260 result[jss::ledger][jss::parent_hash] ==
261 "433D1E42F2735F926BF594E4F3DFC70AE3E74F51464156ED83A33D0FF121D136");
263 result[jss::ledger][jss::account_hash] ==
264 "8F047B6A0D2083DF4F69C17F7CC9AE997B0D59020A43D9799A31D22F55837147");
266 result[jss::ledger][jss::transaction_hash] ==
267 "C3D086CD6BDB9E97AD1D513B2C049EF2840BD21D0B3E22D84EBBB89B6D2EF59D");
269 result = env.rpc(
"ledger_request",
"6")[jss::result];
270 BEAST_EXPECT(result[jss::error] ==
"invalidParams");
271 BEAST_EXPECT(result[jss::status] ==
"error");
272 BEAST_EXPECT(result[jss::error_message] ==
"Ledger index too large");
278 using namespace test::jtx;
280 Account
const gw{
"gateway"};
281 auto const USD = gw[
"USD"];
282 env.fund(XRP(100000), gw);
286 jvParams[jss::ledger_hash] =
287 "AB868A6CFEEC779C2FF845C0AF00A642259986AF40C01976A7F842B6918936C7";
288 jvParams[jss::ledger_index] =
"1";
289 auto result = env.rpc(
290 "json",
"ledger_request", jvParams.
toStyledString())[jss::result];
291 BEAST_EXPECT(result[jss::error] ==
"invalidParams");
292 BEAST_EXPECT(result[jss::status] ==
"error");
294 result[jss::error_message] ==
295 "Exactly one of ledger_hash and ledger_index can be set.");
299 env.timeKeeper().adjustCloseTime(
weeks{3});
300 result = env.rpc(
"ledger_request",
"1")[jss::result];
301 BEAST_EXPECT(result[jss::status] ==
"error");
304 BEAST_EXPECT(result[jss::error] ==
"noCurrent");
306 result[jss::error_message] ==
"Current ledger is unavailable.");
310 BEAST_EXPECT(result[jss::error] ==
"notSynced");
312 result[jss::error_message] ==
"Not synced to the network.");
319 using namespace test::jtx;
320 using namespace std::chrono_literals;
322 Account
const gw{
"gateway"};
323 env.app().getLedgerMaster().tune(0, 1h);
324 auto const USD = gw[
"USD"];
325 env.fund(XRP(100000), gw);
327 int const max_limit = 256;
329 for (
auto i = 0; i < max_limit + 10; i++)
332 env.fund(XRP(1000), bob);
336 auto result = env.rpc(
"ledger_request",
"1")[jss::result];
337 BEAST_EXPECT(result[jss::ledger][jss::ledger_index] ==
"1");
339 result[jss::ledger][jss::total_coins] ==
"100000000000000000");
340 BEAST_EXPECT(result[jss::ledger][jss::closed] ==
true);
342 result[jss::ledger][jss::ledger_hash] ==
343 "E9BB323980D202EC7E51BAB2AA8E35353F9C7BDAB59BF17378EADD4D0486EF9F");
345 result[jss::ledger][jss::parent_hash] ==
346 "0000000000000000000000000000000000000000000000000000000000000000");
348 result[jss::ledger][jss::account_hash] ==
349 "A21ED30C04C88046FC61DB9DC19375EEDBD365FD8C17286F27127DF804E9CAA6");
351 result[jss::ledger][jss::transaction_hash] ==
352 "0000000000000000000000000000000000000000000000000000000000000000");
358 using namespace test::jtx;
359 Env env{*
this, envconfig(no_admin)};
360 Account
const gw{
"gateway"};
361 auto const USD = gw[
"USD"];
362 env.fund(XRP(100000), gw);
365 auto const result = env.rpc(
"ledger_request",
"1")[jss::result];