22 auto const info = env.
rpc(
"json",
"account_info",
"{ }");
23 BEAST_EXPECT(info[jss::result][jss::error_message] ==
"Missing field 'account'.");
27 auto const info = env.
rpc(
31 "\"n94JNrQYkDrpt62bbSR7nVEhdyAvcJXRAsjEkFYyqRkh9SUTYEqV\"}");
33 BEAST_EXPECT(info[jss::result][jss::error_message] ==
"Account malformed.");
39 params[jss::account] = bogie.human();
40 auto const info = env.
rpc(
"json",
"account_info",
to_string(params));
42 BEAST_EXPECT(info[jss::result][jss::error_message] ==
"Account not found.");
46 auto const info = env.
rpc(
"json",
"account_info", R
"({"account": "foo"})");
48 BEAST_EXPECT(info[jss::result][jss::error_message] == "Account malformed.");
53 auto testInvalidAccountParam = [&](
auto const& param) {
55 params[jss::account] = param;
56 auto jrr = env.
rpc(
"json",
"account_info",
to_string(params))[jss::result];
57 BEAST_EXPECT(jrr[jss::error] ==
"invalidParams");
58 BEAST_EXPECT(jrr[jss::error_message] ==
"Invalid field 'account'.");
61 testInvalidAccountParam(1);
62 testInvalidAccountParam(1.1);
63 testInvalidAccountParam(
true);
71 auto testInvalidIdentParam = [&](
auto const& param) {
73 params[jss::ident] = param;
74 auto jrr = env.
rpc(
"json",
"account_info",
to_string(params))[jss::result];
75 BEAST_EXPECT(jrr[jss::error] ==
"invalidParams");
76 BEAST_EXPECT(jrr[jss::error_message] ==
"Invalid field 'ident'.");
79 testInvalidIdentParam(1);
80 testInvalidIdentParam(1.1);
81 testInvalidIdentParam(
true);
99 withoutSigners[jss::account] = alice.human();
102 withSigners[jss::account] = alice.human();
103 withSigners[jss::signer_lists] =
true;
108 auto const info = env.
rpc(
"json",
"account_info",
to_string(withoutSigners));
109 BEAST_EXPECT(info.isMember(jss::result) && info[jss::result].isMember(jss::account_data));
110 BEAST_EXPECT(!info[jss::result][jss::account_data].isMember(jss::signer_lists));
114 auto const info = env.
rpc(
"json",
"account_info",
to_string(withSigners));
115 BEAST_EXPECT(info.isMember(jss::result) && info[jss::result].isMember(jss::account_data));
116 auto const&
data = info[jss::result][jss::account_data];
117 BEAST_EXPECT(
data.isMember(jss::signer_lists));
118 auto const& signerLists =
data[jss::signer_lists];
119 BEAST_EXPECT(signerLists.isArray());
120 BEAST_EXPECT(signerLists.size() == 0);
130 auto const info = env.
rpc(
"json",
"account_info",
to_string(withoutSigners));
131 BEAST_EXPECT(info.isMember(jss::result) && info[jss::result].isMember(jss::account_data));
132 BEAST_EXPECT(!info[jss::result][jss::account_data].isMember(jss::signer_lists));
136 auto const info = env.
rpc(
"json",
"account_info",
to_string(withSigners));
137 BEAST_EXPECT(info.isMember(jss::result) && info[jss::result].isMember(jss::account_data));
138 auto const&
data = info[jss::result][jss::account_data];
139 BEAST_EXPECT(
data.isMember(jss::signer_lists));
140 auto const& signerLists =
data[jss::signer_lists];
141 BEAST_EXPECT(signerLists.isArray());
142 BEAST_EXPECT(signerLists.size() == 1);
143 auto const&
signers = signerLists[0u];
145 BEAST_EXPECT(
signers[sfSignerQuorum.jsonName] == 2);
146 auto const& signerEntries =
signers[sfSignerEntries.jsonName];
147 BEAST_EXPECT(signerEntries.size() == 1);
148 auto const& entry0 = signerEntries[0u][sfSignerEntry.jsonName];
149 BEAST_EXPECT(entry0[sfSignerWeight.jsonName] == 3);
177 auto const info = env.
rpc(
"json",
"account_info",
to_string(withSigners));
178 BEAST_EXPECT(info.isMember(jss::result) && info[jss::result].isMember(jss::account_data));
179 auto const&
data = info[jss::result][jss::account_data];
180 BEAST_EXPECT(
data.isMember(jss::signer_lists));
181 auto const& signerLists =
data[jss::signer_lists];
182 BEAST_EXPECT(signerLists.isArray());
183 BEAST_EXPECT(signerLists.size() == 1);
184 auto const&
signers = signerLists[0u];
186 BEAST_EXPECT(
signers[sfSignerQuorum.jsonName] == 4);
187 auto const& signerEntries =
signers[sfSignerEntries.jsonName];
188 BEAST_EXPECT(signerEntries.size() == 8);
189 for (
unsigned i = 0u; i < 8; ++i)
191 auto const& entry = signerEntries[i][sfSignerEntry.jsonName];
192 BEAST_EXPECT(entry.
size() == 2);
193 BEAST_EXPECT(entry.
isMember(sfAccount.jsonName));
194 BEAST_EXPECT(entry[sfSignerWeight.jsonName] == 1);
207 env.fund(
XRP(1000), alice);
210 withoutSigners[jss::api_version] = 2;
211 withoutSigners[jss::account] = alice.human();
214 withSigners[jss::api_version] = 2;
215 withSigners[jss::account] = alice.human();
216 withSigners[jss::signer_lists] =
true;
218 auto const withSignersAsString =
std::string(
"{ ") +
"\"api_version\": 2, \"account\": \"" + alice.human() +
219 "\", " +
"\"signer_lists\": asdfggh }";
224 auto const info = env.rpc(
"json",
"account_info",
to_string(withoutSigners));
225 BEAST_EXPECT(info.isMember(jss::result));
226 BEAST_EXPECT(!info[jss::result].isMember(jss::signer_lists));
230 auto const info = env.rpc(
"json",
"account_info",
to_string(withSigners));
231 BEAST_EXPECT(info.isMember(jss::result));
232 auto const&
data = info[jss::result];
233 BEAST_EXPECT(
data.isMember(jss::signer_lists));
234 auto const& signerLists =
data[jss::signer_lists];
235 BEAST_EXPECT(signerLists.isArray());
236 BEAST_EXPECT(signerLists.size() == 0);
246 auto const info = env.rpc(
"json",
"account_info",
to_string(withoutSigners));
247 BEAST_EXPECT(info.isMember(jss::result));
248 BEAST_EXPECT(!info[jss::result].isMember(jss::signer_lists));
252 auto const info = env.rpc(
"json",
"account_info",
to_string(withSigners));
253 BEAST_EXPECT(info.isMember(jss::result));
254 auto const&
data = info[jss::result];
255 BEAST_EXPECT(
data.isMember(jss::signer_lists));
256 auto const& signerLists =
data[jss::signer_lists];
257 BEAST_EXPECT(signerLists.isArray());
258 BEAST_EXPECT(signerLists.size() == 1);
259 auto const&
signers = signerLists[0u];
261 BEAST_EXPECT(
signers[sfSignerQuorum.jsonName] == 2);
262 auto const& signerEntries =
signers[sfSignerEntries.jsonName];
263 BEAST_EXPECT(signerEntries.size() == 1);
264 auto const& entry0 = signerEntries[0u][sfSignerEntry.jsonName];
265 BEAST_EXPECT(entry0[sfSignerWeight.jsonName] == 3);
269 auto const info = env.rpc(
"json",
"account_info", withSignersAsString);
270 BEAST_EXPECT(info[jss::status] ==
"error");
271 BEAST_EXPECT(info[jss::error] ==
"invalidParams");
299 auto const info = env.rpc(
"json",
"account_info",
to_string(withSigners));
300 BEAST_EXPECT(info.isMember(jss::result));
301 auto const&
data = info[jss::result];
302 BEAST_EXPECT(
data.isMember(jss::signer_lists));
303 auto const& signerLists =
data[jss::signer_lists];
304 BEAST_EXPECT(signerLists.isArray());
305 BEAST_EXPECT(signerLists.size() == 1);
306 auto const&
signers = signerLists[0u];
308 BEAST_EXPECT(
signers[sfSignerQuorum.jsonName] == 4);
309 auto const& signerEntries =
signers[sfSignerEntries.jsonName];
310 BEAST_EXPECT(signerEntries.size() == 8);
311 for (
unsigned i = 0u; i < 8; ++i)
313 auto const& entry = signerEntries[i][sfSignerEntry.jsonName];
314 BEAST_EXPECT(entry.
size() == 2);
315 BEAST_EXPECT(entry.
isMember(sfAccount.jsonName));
316 BEAST_EXPECT(entry[sfSignerWeight.jsonName] == 1);
332 "\"jsonrpc\": \"2.0\", "
333 "\"ripplerpc\": \"2.0\", "
335 "\"method\": \"account_info\", "
338 alice.human() +
"\"}}";
341 "\"jsonrpc\": \"2.0\", "
342 "\"ripplerpc\": \"2.0\", "
344 "\"method\": \"account_info\", "
347 alice.human() +
"\", " +
"\"signer_lists\": true }}";
351 auto const info = env.
rpc(
"json2", withoutSigners);
352 BEAST_EXPECT(info.isMember(jss::result) && info[jss::result].isMember(jss::account_data));
353 BEAST_EXPECT(!info[jss::result][jss::account_data].isMember(jss::signer_lists));
354 BEAST_EXPECT(info.isMember(jss::jsonrpc) && info[jss::jsonrpc] ==
"2.0");
355 BEAST_EXPECT(info.isMember(jss::ripplerpc) && info[jss::ripplerpc] ==
"2.0");
356 BEAST_EXPECT(info.isMember(jss::id) && info[jss::id] == 5);
360 auto const info = env.
rpc(
"json2", withSigners);
361 BEAST_EXPECT(info.isMember(jss::result) && info[jss::result].isMember(jss::account_data));
362 auto const&
data = info[jss::result][jss::account_data];
363 BEAST_EXPECT(
data.isMember(jss::signer_lists));
364 auto const& signerLists =
data[jss::signer_lists];
365 BEAST_EXPECT(signerLists.isArray());
366 BEAST_EXPECT(signerLists.size() == 0);
367 BEAST_EXPECT(info.isMember(jss::jsonrpc) && info[jss::jsonrpc] ==
"2.0");
368 BEAST_EXPECT(info.isMember(jss::ripplerpc) && info[jss::ripplerpc] ==
"2.0");
369 BEAST_EXPECT(info.isMember(jss::id) && info[jss::id] == 6);
373 auto const info = env.
rpc(
"json2",
'[' + withoutSigners +
", " + withSigners +
']');
374 BEAST_EXPECT(info[0u].isMember(jss::result) && info[0u][jss::result].isMember(jss::account_data));
375 BEAST_EXPECT(!info[0u][jss::result][jss::account_data].isMember(jss::signer_lists));
376 BEAST_EXPECT(info[0u].isMember(jss::jsonrpc) && info[0u][jss::jsonrpc] ==
"2.0");
377 BEAST_EXPECT(info[0u].isMember(jss::ripplerpc) && info[0u][jss::ripplerpc] ==
"2.0");
378 BEAST_EXPECT(info[0u].isMember(jss::id) && info[0u][jss::id] == 5);
380 BEAST_EXPECT(info[1u].isMember(jss::result) && info[1u][jss::result].isMember(jss::account_data));
381 auto const&
data = info[1u][jss::result][jss::account_data];
382 BEAST_EXPECT(
data.isMember(jss::signer_lists));
383 auto const& signerLists =
data[jss::signer_lists];
384 BEAST_EXPECT(signerLists.isArray());
385 BEAST_EXPECT(signerLists.size() == 0);
386 BEAST_EXPECT(info[1u].isMember(jss::jsonrpc) && info[1u][jss::jsonrpc] ==
"2.0");
387 BEAST_EXPECT(info[1u].isMember(jss::ripplerpc) && info[1u][jss::ripplerpc] ==
"2.0");
388 BEAST_EXPECT(info[1u].isMember(jss::id) && info[1u][jss::id] == 6);
398 auto const info = env.
rpc(
"json2", withoutSigners);
399 BEAST_EXPECT(info.isMember(jss::result) && info[jss::result].isMember(jss::account_data));
400 BEAST_EXPECT(!info[jss::result][jss::account_data].isMember(jss::signer_lists));
401 BEAST_EXPECT(info.isMember(jss::jsonrpc) && info[jss::jsonrpc] ==
"2.0");
402 BEAST_EXPECT(info.isMember(jss::ripplerpc) && info[jss::ripplerpc] ==
"2.0");
403 BEAST_EXPECT(info.isMember(jss::id) && info[jss::id] == 5);
407 auto const info = env.
rpc(
"json2", withSigners);
408 BEAST_EXPECT(info.isMember(jss::result) && info[jss::result].isMember(jss::account_data));
409 auto const&
data = info[jss::result][jss::account_data];
410 BEAST_EXPECT(
data.isMember(jss::signer_lists));
411 auto const& signerLists =
data[jss::signer_lists];
412 BEAST_EXPECT(signerLists.isArray());
413 BEAST_EXPECT(signerLists.size() == 1);
414 auto const&
signers = signerLists[0u];
416 BEAST_EXPECT(
signers[sfSignerQuorum.jsonName] == 2);
417 auto const& signerEntries =
signers[sfSignerEntries.jsonName];
418 BEAST_EXPECT(signerEntries.size() == 1);
419 auto const& entry0 = signerEntries[0u][sfSignerEntry.jsonName];
420 BEAST_EXPECT(entry0[sfSignerWeight.jsonName] == 3);
421 BEAST_EXPECT(info.isMember(jss::jsonrpc) && info[jss::jsonrpc] ==
"2.0");
422 BEAST_EXPECT(info.isMember(jss::ripplerpc) && info[jss::ripplerpc] ==
"2.0");
423 BEAST_EXPECT(info.isMember(jss::id) && info[jss::id] == 6);
451 auto const info = env.
rpc(
"json2", withSigners);
452 BEAST_EXPECT(info.isMember(jss::result) && info[jss::result].isMember(jss::account_data));
453 auto const&
data = info[jss::result][jss::account_data];
454 BEAST_EXPECT(
data.isMember(jss::signer_lists));
455 auto const& signerLists =
data[jss::signer_lists];
456 BEAST_EXPECT(signerLists.isArray());
457 BEAST_EXPECT(signerLists.size() == 1);
458 auto const&
signers = signerLists[0u];
460 BEAST_EXPECT(
signers[sfSignerQuorum.jsonName] == 4);
461 auto const& signerEntries =
signers[sfSignerEntries.jsonName];
462 BEAST_EXPECT(signerEntries.size() == 8);
463 for (
unsigned i = 0u; i < 8; ++i)
465 auto const& entry = signerEntries[i][sfSignerEntry.jsonName];
466 BEAST_EXPECT(entry.
size() == 2);
467 BEAST_EXPECT(entry.
isMember(sfAccount.jsonName));
468 BEAST_EXPECT(entry[sfSignerWeight.jsonName] == 1);
470 BEAST_EXPECT(info.isMember(jss::jsonrpc) && info[jss::jsonrpc] ==
"2.0");
471 BEAST_EXPECT(info.isMember(jss::ripplerpc) && info[jss::ripplerpc] ==
"2.0");
472 BEAST_EXPECT(info.isMember(jss::id) && info[jss::id] == 6);
482 Env env(*
this, features);
485 env.
fund(
XRP(1000), alice, bob);
489 params[jss::account] = account.human();
490 auto const info = env.
rpc(
"json",
"account_info",
to_string(params));
493 if (info[jss::result][jss::status] ==
"success" &&
494 info[jss::result][jss::account_flags].isMember(fName.
data()))
495 res.
emplace(info[jss::result][jss::account_flags][fName.
data()].asBool());
509 for (
auto& asf : asFlags)
513 env(
fclear(alice, asf.second));
515 auto const f1 = getAccountFlag(asf.first, alice);
516 BEAST_EXPECT(f1.has_value());
517 BEAST_EXPECT(!f1.value());
521 env(
fset(alice, asf.second));
523 auto const f2 = getAccountFlag(asf.first, alice);
524 BEAST_EXPECT(f2.has_value());
525 BEAST_EXPECT(f2.value());
534 for (
auto& asf : disallowIncomingFlags)
538 env(
fclear(alice, asf.second));
540 auto const f1 = getAccountFlag(asf.first, alice);
541 BEAST_EXPECT(f1.has_value());
542 BEAST_EXPECT(!f1.value());
546 env(
fset(alice, asf.second));
548 auto const f2 = getAccountFlag(asf.first, alice);
549 BEAST_EXPECT(f2.has_value());
550 BEAST_EXPECT(f2.value());
556 if (features[featureClawback])
559 auto const f1 = getAccountFlag(allowTrustLineClawbackFlag.first, bob);
560 BEAST_EXPECT(f1.has_value());
561 BEAST_EXPECT(!f1.value());
564 env(
fset(bob, allowTrustLineClawbackFlag.second));
566 auto const f2 = getAccountFlag(allowTrustLineClawbackFlag.first, bob);
567 BEAST_EXPECT(f2.has_value());
568 BEAST_EXPECT(f2.value());
572 BEAST_EXPECT(!getAccountFlag(allowTrustLineClawbackFlag.first, bob));
578 if (features[featureTokenEscrow])
580 auto const f1 = getAccountFlag(allowTrustLineLockingFlag.first, bob);
581 BEAST_EXPECT(f1.has_value());
582 BEAST_EXPECT(!f1.value());
585 env(
fset(bob, allowTrustLineLockingFlag.second));
587 auto const f2 = getAccountFlag(allowTrustLineLockingFlag.first, bob);
588 BEAST_EXPECT(f2.has_value());
589 BEAST_EXPECT(f2.value());
593 BEAST_EXPECT(!getAccountFlag(allowTrustLineLockingFlag.first, bob));