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>
33 static constexpr
char const*
hash1 =
34 "3020EB9E7BE24EF7D7A060CB051583EC117384636D1781AFB5B87F3E348DA489";
36 "BD8A3D72CA73DDE887AD63666EC2BAD07875CBA997A102579B5B95ECDFFEAED8";
39 "0000000000000000000000000000000000000000000000000000000000000000";
45 using namespace test::jtx;
51 BEAST_EXPECT(env.current()->info().seq == 5);
55 auto const result = env.rpc(
"ledger_request",
"arbitrary_text");
58 result[jss::result][jss::error_message] ==
59 "Ledger index too small");
63 auto const result = env.rpc(
"ledger_request",
"-1");
66 result[jss::result][jss::error_message] ==
67 "Ledger index too small");
71 auto const result = env.rpc(
"ledger_request",
"0");
74 result[jss::result][jss::error_message] ==
75 "Ledger index too small");
79 auto const result = env.rpc(
"ledger_request",
"1");
82 result[jss::result][jss::ledger_index] == 1 &&
83 result[jss::result].isMember(jss::ledger));
85 result[jss::result][jss::ledger].isMember(jss::ledger_hash) &&
86 result[jss::result][jss::ledger][jss::ledger_hash].isString());
90 auto const result = env.rpc(
"ledger_request",
"2");
93 result[jss::result][jss::ledger_index] == 2 &&
94 result[jss::result].isMember(jss::ledger));
96 result[jss::result][jss::ledger].isMember(jss::ledger_hash) &&
97 result[jss::result][jss::ledger][jss::ledger_hash].isString());
101 auto const result = env.rpc(
"ledger_request",
"3");
104 result[jss::result][jss::ledger_index] == 3 &&
105 result[jss::result].isMember(jss::ledger));
107 result[jss::result][jss::ledger].isMember(jss::ledger_hash) &&
108 result[jss::result][jss::ledger][jss::ledger_hash].isString());
110 auto const ledgerHash =
111 result[jss::result][jss::ledger][jss::ledger_hash].asString();
114 auto const r = env.rpc(
"ledger_request", ledgerHash);
117 r[jss::result][jss::ledger_index] == 3 &&
118 r[jss::result].isMember(jss::ledger));
120 r[jss::result][jss::ledger].isMember(jss::ledger_hash) &&
121 r[jss::result][jss::ledger][jss::ledger_hash] ==
129 auto const result = env.rpc(
"ledger_request", ledgerHash);
133 result[jss::result][jss::error_message] ==
134 "Invalid field 'ledger_hash'.");
140 auto const result = env.rpc(
"ledger_request", ledgerHash);
144 result[jss::result][jss::have_header] ==
false);
148 auto const result = env.rpc(
"ledger_request",
"4");
151 result[jss::result][jss::error_message] ==
152 "Ledger index too large");
156 auto const result = env.rpc(
"ledger_request",
"5");
159 result[jss::result][jss::error_message] ==
160 "Ledger index too large");
167 using namespace test::jtx;
170 Account
const gw{
"gateway"};
171 auto const USD = gw[
"USD"];
172 env.fund(XRP(100000), gw);
176 env.fund(XRP(1000),
"bob");
179 env.memoize(
"alice");
180 env.fund(XRP(1000),
"alice");
183 env.memoize(
"carol");
184 env.fund(XRP(1000),
"carol");
187 auto result = env.rpc(
"ledger_request",
"1")[jss::result];
188 BEAST_EXPECT(result[jss::ledger][jss::ledger_index] ==
"1");
190 result[jss::ledger][jss::total_coins] ==
"100000000000000000");
191 BEAST_EXPECT(result[jss::ledger][jss::closed] ==
true);
192 BEAST_EXPECT(result[jss::ledger][jss::ledger_hash] ==
hash1);
193 BEAST_EXPECT(result[jss::ledger][jss::parent_hash] ==
zerohash);
194 BEAST_EXPECT(result[jss::ledger][jss::account_hash] ==
accounthash1);
195 BEAST_EXPECT(result[jss::ledger][jss::transaction_hash] ==
zerohash);
197 result = env.rpc(
"ledger_request",
"2")[jss::result];
198 constexpr
char const* hash2 =
199 "CCC3B3E88CCAC17F1BE6B4A648A55999411F19E3FE55EB721960EB0DF28EDDA5";
200 BEAST_EXPECT(result[jss::ledger][jss::ledger_index] ==
"2");
202 result[jss::ledger][jss::total_coins] ==
"100000000000000000");
203 BEAST_EXPECT(result[jss::ledger][jss::closed] ==
true);
204 BEAST_EXPECT(result[jss::ledger][jss::ledger_hash] == hash2);
205 BEAST_EXPECT(result[jss::ledger][jss::parent_hash] ==
hash1);
207 result[jss::ledger][jss::account_hash] ==
208 "3C834285F7F464FBE99AFEB84D354A968EB2CAA24523FF26797A973D906A3D29");
209 BEAST_EXPECT(result[jss::ledger][jss::transaction_hash] ==
zerohash);
211 result = env.rpc(
"ledger_request",
"3")[jss::result];
212 constexpr
char const* hash3 =
213 "8D631B20BC989AF568FBA97375290544B0703A5ADC1CF9E9053580461690C9EE";
214 BEAST_EXPECT(result[jss::ledger][jss::ledger_index] ==
"3");
216 result[jss::ledger][jss::total_coins] ==
"99999999999999980");
217 BEAST_EXPECT(result[jss::ledger][jss::closed] ==
true);
218 BEAST_EXPECT(result[jss::ledger][jss::ledger_hash] == hash3);
219 BEAST_EXPECT(result[jss::ledger][jss::parent_hash] == hash2);
221 result[jss::ledger][jss::account_hash] ==
222 "BC9EF2A16BFF80BCFABA6FA84688D858D33BD0FA0435CAA9DF6DA4105A39A29E");
224 result[jss::ledger][jss::transaction_hash] ==
225 "0213EC486C058B3942FBE3DAC6839949A5C5B02B8B4244C8998EFDF04DBD8222");
227 result = env.rpc(
"ledger_request",
"4")[jss::result];
228 constexpr
char const* hash4 =
229 "1A8E7098B23597E73094DADA58C9D62F3AB93A12C6F7666D56CA85A6CFDE530F";
230 BEAST_EXPECT(result[jss::ledger][jss::ledger_index] ==
"4");
232 result[jss::ledger][jss::total_coins] ==
"99999999999999960");
233 BEAST_EXPECT(result[jss::ledger][jss::closed] ==
true);
234 BEAST_EXPECT(result[jss::ledger][jss::ledger_hash] == hash4);
235 BEAST_EXPECT(result[jss::ledger][jss::parent_hash] == hash3);
237 result[jss::ledger][jss::account_hash] ==
238 "C690188F123C91355ADA8BDF4AC5B5C927076D3590C215096868A5255264C6DD");
240 result[jss::ledger][jss::transaction_hash] ==
241 "3CBDB8F42E04333E1642166BFB93AC9A7E1C6C067092CD5D881D6F3AB3D67E76");
243 result = env.rpc(
"ledger_request",
"5")[jss::result];
244 constexpr
char const* hash5 =
245 "C6A222D71AE65D7B4F240009EAD5DEB20D7EEDE5A4064F28BBDBFEEB6FBE48E5";
246 BEAST_EXPECT(result[jss::ledger][jss::ledger_index] ==
"5");
248 result[jss::ledger][jss::total_coins] ==
"99999999999999940");
249 BEAST_EXPECT(result[jss::ledger][jss::closed] ==
true);
250 BEAST_EXPECT(result[jss::ledger][jss::ledger_hash] == hash5);
251 BEAST_EXPECT(result[jss::ledger][jss::parent_hash] == hash4);
253 result[jss::ledger][jss::account_hash] ==
254 "EA81CD9D36740736F00CB747E0D0E32D3C10B695823D961F0FB9A1CE7133DD4D");
256 result[jss::ledger][jss::transaction_hash] ==
257 "C3D086CD6BDB9E97AD1D513B2C049EF2840BD21D0B3E22D84EBBB89B6D2EF59D");
259 result = env.rpc(
"ledger_request",
"6")[jss::result];
260 BEAST_EXPECT(result[jss::error] ==
"invalidParams");
261 BEAST_EXPECT(result[jss::status] ==
"error");
262 BEAST_EXPECT(result[jss::error_message] ==
"Ledger index too large");
268 using namespace test::jtx;
270 Account
const gw{
"gateway"};
271 auto const USD = gw[
"USD"];
272 env.fund(XRP(100000), gw);
276 jvParams[jss::ledger_hash] =
277 "AB868A6CFEEC779C2FF845C0AF00A642259986AF40C01976A7F842B6918936C7";
278 jvParams[jss::ledger_index] =
"1";
279 auto result = env.rpc(
280 "json",
"ledger_request", jvParams.
toStyledString())[jss::result];
281 BEAST_EXPECT(result[jss::error] ==
"invalidParams");
282 BEAST_EXPECT(result[jss::status] ==
"error");
284 result[jss::error_message] ==
285 "Exactly one of ledger_hash and ledger_index can be set.");
289 env.timeKeeper().adjustCloseTime(
weeks{3});
290 result = env.rpc(
"ledger_request",
"1")[jss::result];
291 BEAST_EXPECT(result[jss::status] ==
"error");
294 BEAST_EXPECT(result[jss::error] ==
"noCurrent");
296 result[jss::error_message] ==
"Current ledger is unavailable.");
300 BEAST_EXPECT(result[jss::error] ==
"notSynced");
302 result[jss::error_message] ==
"Not synced to the network.");
309 using namespace test::jtx;
310 using namespace std::chrono_literals;
315 Account
const gw{
"gateway"};
316 auto const USD = gw[
"USD"];
317 env.fund(XRP(100000), gw);
319 int const max_limit = 256;
321 for (
auto i = 0; i < max_limit + 10; i++)
324 env.fund(XRP(1000), bob);
328 auto result = env.rpc(
"ledger_request",
"1")[jss::result];
329 BEAST_EXPECT(result[jss::ledger][jss::ledger_index] ==
"1");
331 result[jss::ledger][jss::total_coins] ==
"100000000000000000");
332 BEAST_EXPECT(result[jss::ledger][jss::closed] ==
true);
333 BEAST_EXPECT(result[jss::ledger][jss::ledger_hash] ==
hash1);
334 BEAST_EXPECT(result[jss::ledger][jss::parent_hash] ==
zerohash);
335 BEAST_EXPECT(result[jss::ledger][jss::account_hash] ==
accounthash1);
336 BEAST_EXPECT(result[jss::ledger][jss::transaction_hash] ==
zerohash);
342 using namespace test::jtx;
343 Env env{*
this, envconfig(no_admin)};
344 Account
const gw{
"gateway"};
345 auto const USD = gw[
"USD"];
346 env.fund(XRP(100000), gw);
348 auto const result = env.rpc(
"ledger_request",
"1")[jss::result];