49 using namespace test::jtx;
55 BEAST_EXPECT(env.current()->info().seq == 5);
59 auto const result = env.rpc(
"ledger_request",
"arbitrary_text");
62 result[jss::result][jss::error_message] ==
63 "Ledger index too small");
67 auto const result = env.rpc(
"ledger_request",
"-1");
70 result[jss::result][jss::error_message] ==
71 "Ledger index too small");
75 auto const result = env.rpc(
"ledger_request",
"0");
78 result[jss::result][jss::error_message] ==
79 "Ledger index too small");
83 auto const result = env.rpc(
"ledger_request",
"1");
86 result[jss::result][jss::ledger_index] == 1 &&
87 result[jss::result].isMember(jss::ledger));
89 result[jss::result][jss::ledger].isMember(jss::ledger_hash) &&
90 result[jss::result][jss::ledger][jss::ledger_hash].isString());
94 auto const result = env.rpc(
"ledger_request",
"2");
97 result[jss::result][jss::ledger_index] == 2 &&
98 result[jss::result].isMember(jss::ledger));
100 result[jss::result][jss::ledger].isMember(jss::ledger_hash) &&
101 result[jss::result][jss::ledger][jss::ledger_hash].isString());
105 auto const result = env.rpc(
"ledger_request",
"3");
108 result[jss::result][jss::ledger_index] == 3 &&
109 result[jss::result].isMember(jss::ledger));
111 result[jss::result][jss::ledger].isMember(jss::ledger_hash) &&
112 result[jss::result][jss::ledger][jss::ledger_hash].isString());
114 auto const ledgerHash =
115 result[jss::result][jss::ledger][jss::ledger_hash].asString();
118 auto const r = env.rpc(
"ledger_request", ledgerHash);
121 r[jss::result][jss::ledger_index] == 3 &&
122 r[jss::result].isMember(jss::ledger));
124 r[jss::result][jss::ledger].isMember(jss::ledger_hash) &&
125 r[jss::result][jss::ledger][jss::ledger_hash] ==
133 auto const result = env.rpc(
"ledger_request", ledgerHash);
137 result[jss::result][jss::error_message] ==
138 "Invalid field 'ledger_hash'.");
144 auto const result = env.rpc(
"ledger_request", ledgerHash);
148 result[jss::result][jss::have_header] ==
false);
152 auto const result = env.rpc(
"ledger_request",
"4");
155 result[jss::result][jss::error_message] ==
156 "Ledger index too large");
160 auto const result = env.rpc(
"ledger_request",
"5");
163 result[jss::result][jss::error_message] ==
164 "Ledger index too large");
171 using namespace test::jtx;
173 auto cfg = envconfig();
174 cfg->FEES.reference_fee = 10;
180 Account
const gw{
"gateway"};
181 auto const USD = gw[
"USD"];
182 env.fund(XRP(100000), gw);
186 env.fund(XRP(1000),
"bob");
189 env.memoize(
"alice");
190 env.fund(XRP(1000),
"alice");
193 env.memoize(
"carol");
194 env.fund(XRP(1000),
"carol");
197 auto result = env.rpc(
"ledger_request",
"1")[jss::result];
198 BEAST_EXPECT(result[jss::ledger][jss::ledger_index] ==
"1");
200 result[jss::ledger][jss::total_coins] ==
"100000000000000000");
201 BEAST_EXPECT(result[jss::ledger][jss::closed] ==
true);
202 BEAST_EXPECT(result[jss::ledger][jss::ledger_hash] ==
hash1);
203 BEAST_EXPECT(result[jss::ledger][jss::parent_hash] ==
zerohash);
204 BEAST_EXPECT(result[jss::ledger][jss::account_hash] ==
accounthash1);
205 BEAST_EXPECT(result[jss::ledger][jss::transaction_hash] ==
zerohash);
207 result = env.rpc(
"ledger_request",
"2")[jss::result];
208 constexpr char const* hash2 =
209 "CCC3B3E88CCAC17F1BE6B4A648A55999411F19E3FE55EB721960EB0DF28EDDA5";
210 BEAST_EXPECT(result[jss::ledger][jss::ledger_index] ==
"2");
212 result[jss::ledger][jss::total_coins] ==
"100000000000000000");
213 BEAST_EXPECT(result[jss::ledger][jss::closed] ==
true);
214 BEAST_EXPECT(result[jss::ledger][jss::ledger_hash] == hash2);
215 BEAST_EXPECT(result[jss::ledger][jss::parent_hash] ==
hash1);
217 result[jss::ledger][jss::account_hash] ==
218 "3C834285F7F464FBE99AFEB84D354A968EB2CAA24523FF26797A973D906A3D29");
219 BEAST_EXPECT(result[jss::ledger][jss::transaction_hash] ==
zerohash);
221 result = env.rpc(
"ledger_request",
"3")[jss::result];
222 constexpr char const* hash3 =
223 "8D631B20BC989AF568FBA97375290544B0703A5ADC1CF9E9053580461690C9EE";
224 BEAST_EXPECT(result[jss::ledger][jss::ledger_index] ==
"3");
226 result[jss::ledger][jss::total_coins] ==
"99999999999999980");
227 BEAST_EXPECT(result[jss::ledger][jss::closed] ==
true);
228 BEAST_EXPECT(result[jss::ledger][jss::ledger_hash] == hash3);
229 BEAST_EXPECT(result[jss::ledger][jss::parent_hash] == hash2);
231 result[jss::ledger][jss::account_hash] ==
232 "BC9EF2A16BFF80BCFABA6FA84688D858D33BD0FA0435CAA9DF6DA4105A39A29E");
234 result[jss::ledger][jss::transaction_hash] ==
235 "0213EC486C058B3942FBE3DAC6839949A5C5B02B8B4244C8998EFDF04DBD8222");
237 result = env.rpc(
"ledger_request",
"4")[jss::result];
238 constexpr char const* hash4 =
239 "1A8E7098B23597E73094DADA58C9D62F3AB93A12C6F7666D56CA85A6CFDE530F";
240 BEAST_EXPECT(result[jss::ledger][jss::ledger_index] ==
"4");
242 result[jss::ledger][jss::total_coins] ==
"99999999999999960");
243 BEAST_EXPECT(result[jss::ledger][jss::closed] ==
true);
244 BEAST_EXPECT(result[jss::ledger][jss::ledger_hash] == hash4);
245 BEAST_EXPECT(result[jss::ledger][jss::parent_hash] == hash3);
247 result[jss::ledger][jss::account_hash] ==
248 "C690188F123C91355ADA8BDF4AC5B5C927076D3590C215096868A5255264C6DD");
250 result[jss::ledger][jss::transaction_hash] ==
251 "3CBDB8F42E04333E1642166BFB93AC9A7E1C6C067092CD5D881D6F3AB3D67E76");
253 result = env.rpc(
"ledger_request",
"5")[jss::result];
254 constexpr char const* hash5 =
255 "C6A222D71AE65D7B4F240009EAD5DEB20D7EEDE5A4064F28BBDBFEEB6FBE48E5";
256 BEAST_EXPECT(result[jss::ledger][jss::ledger_index] ==
"5");
258 result[jss::ledger][jss::total_coins] ==
"99999999999999940");
259 BEAST_EXPECT(result[jss::ledger][jss::closed] ==
true);
260 BEAST_EXPECT(result[jss::ledger][jss::ledger_hash] == hash5);
261 BEAST_EXPECT(result[jss::ledger][jss::parent_hash] == hash4);
263 result[jss::ledger][jss::account_hash] ==
264 "EA81CD9D36740736F00CB747E0D0E32D3C10B695823D961F0FB9A1CE7133DD4D");
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(
apiVersion,
"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 cfg->FEES.reference_fee = 10;
326 Account
const gw{
"gateway"};
327 auto const USD = gw[
"USD"];
328 env.fund(XRP(100000), gw);
330 int const max_limit = 256;
332 for (
auto i = 0; i < max_limit + 10; i++)
335 env.fund(XRP(1000), bob);
339 auto result = env.rpc(
"ledger_request",
"1")[jss::result];
340 BEAST_EXPECT(result[jss::ledger][jss::ledger_index] ==
"1");
342 result[jss::ledger][jss::total_coins] ==
"100000000000000000");
343 BEAST_EXPECT(result[jss::ledger][jss::closed] ==
true);
344 BEAST_EXPECT(result[jss::ledger][jss::ledger_hash] ==
hash1);
345 BEAST_EXPECT(result[jss::ledger][jss::parent_hash] ==
zerohash);
346 BEAST_EXPECT(result[jss::ledger][jss::account_hash] ==
accounthash1);
347 BEAST_EXPECT(result[jss::ledger][jss::transaction_hash] ==
zerohash);