41 auto const info = env.
rpc(
"json",
"account_info",
"{ }");
43 info[jss::result][jss::error_message] ==
44 "Missing field 'account'.");
48 auto const info = env.
rpc(
52 "\"n94JNrQYkDrpt62bbSR7nVEhdyAvcJXRAsjEkFYyqRkh9SUTYEqV\"}");
56 info[jss::result][jss::error_message] ==
"Account malformed.");
62 params[jss::account] = bogie.human();
68 info[jss::result][jss::error_message] ==
"Account not found.");
73 env.
rpc(
"json",
"account_info", R
"({"account": "foo"})");
77 info[jss::result][jss::error_message] == "Account malformed.");
82 auto testInvalidAccountParam = [&](
auto const& param) {
84 params[jss::account] = param;
86 "json",
"account_info",
to_string(params))[jss::result];
87 BEAST_EXPECT(jrr[jss::error] ==
"invalidParams");
89 jrr[jss::error_message] ==
"Invalid field 'account'.");
92 testInvalidAccountParam(1);
93 testInvalidAccountParam(1.1);
94 testInvalidAccountParam(
true);
102 auto testInvalidIdentParam = [&](
auto const& param) {
104 params[jss::ident] = param;
106 "json",
"account_info",
to_string(params))[jss::result];
107 BEAST_EXPECT(jrr[jss::error] ==
"invalidParams");
109 jrr[jss::error_message] ==
"Invalid field 'ident'.");
112 testInvalidIdentParam(1);
113 testInvalidIdentParam(1.1);
114 testInvalidIdentParam(
true);
132 withoutSigners[jss::account] = alice.human();
135 withSigners[jss::account] = alice.human();
136 withSigners[jss::signer_lists] =
true;
142 env.
rpc(
"json",
"account_info",
to_string(withoutSigners));
144 info.isMember(jss::result) &&
145 info[jss::result].isMember(jss::account_data));
146 BEAST_EXPECT(!info[jss::result][jss::account_data].isMember(
152 env.
rpc(
"json",
"account_info",
to_string(withSigners));
154 info.isMember(jss::result) &&
155 info[jss::result].isMember(jss::account_data));
156 auto const&
data = info[jss::result][jss::account_data];
157 BEAST_EXPECT(
data.isMember(jss::signer_lists));
158 auto const& signerLists =
data[jss::signer_lists];
159 BEAST_EXPECT(signerLists.isArray());
160 BEAST_EXPECT(signerLists.size() == 0);
171 env.
rpc(
"json",
"account_info",
to_string(withoutSigners));
173 info.isMember(jss::result) &&
174 info[jss::result].isMember(jss::account_data));
175 BEAST_EXPECT(!info[jss::result][jss::account_data].isMember(
181 env.
rpc(
"json",
"account_info",
to_string(withSigners));
183 info.isMember(jss::result) &&
184 info[jss::result].isMember(jss::account_data));
185 auto const&
data = info[jss::result][jss::account_data];
186 BEAST_EXPECT(
data.isMember(jss::signer_lists));
187 auto const& signerLists =
data[jss::signer_lists];
188 BEAST_EXPECT(signerLists.isArray());
189 BEAST_EXPECT(signerLists.size() == 1);
190 auto const&
signers = signerLists[0u];
192 BEAST_EXPECT(
signers[sfSignerQuorum.jsonName] == 2);
193 auto const& signerEntries =
signers[sfSignerEntries.jsonName];
194 BEAST_EXPECT(signerEntries.size() == 1);
195 auto const& entry0 = signerEntries[0u][sfSignerEntry.jsonName];
196 BEAST_EXPECT(entry0[sfSignerWeight.jsonName] == 3);
225 env.
rpc(
"json",
"account_info",
to_string(withSigners));
227 info.isMember(jss::result) &&
228 info[jss::result].isMember(jss::account_data));
229 auto const&
data = info[jss::result][jss::account_data];
230 BEAST_EXPECT(
data.isMember(jss::signer_lists));
231 auto const& signerLists =
data[jss::signer_lists];
232 BEAST_EXPECT(signerLists.isArray());
233 BEAST_EXPECT(signerLists.size() == 1);
234 auto const&
signers = signerLists[0u];
236 BEAST_EXPECT(
signers[sfSignerQuorum.jsonName] == 4);
237 auto const& signerEntries =
signers[sfSignerEntries.jsonName];
238 BEAST_EXPECT(signerEntries.size() == 8);
239 for (
unsigned i = 0u; i < 8; ++i)
241 auto const& entry = signerEntries[i][sfSignerEntry.jsonName];
242 BEAST_EXPECT(entry.
size() == 2);
243 BEAST_EXPECT(entry.
isMember(sfAccount.jsonName));
244 BEAST_EXPECT(entry[sfSignerWeight.jsonName] == 1);
257 env.fund(
XRP(1000), alice);
260 withoutSigners[jss::api_version] = 2;
261 withoutSigners[jss::account] = alice.human();
264 withSigners[jss::api_version] = 2;
265 withSigners[jss::account] = alice.human();
266 withSigners[jss::signer_lists] =
true;
268 auto const withSignersAsString =
std::string(
"{ ") +
269 "\"api_version\": 2, \"account\": \"" + alice.human() +
"\", " +
270 "\"signer_lists\": asdfggh }";
276 env.rpc(
"json",
"account_info",
to_string(withoutSigners));
277 BEAST_EXPECT(info.isMember(jss::result));
278 BEAST_EXPECT(!info[jss::result].isMember(jss::signer_lists));
283 env.rpc(
"json",
"account_info",
to_string(withSigners));
284 BEAST_EXPECT(info.isMember(jss::result));
285 auto const&
data = info[jss::result];
286 BEAST_EXPECT(
data.isMember(jss::signer_lists));
287 auto const& signerLists =
data[jss::signer_lists];
288 BEAST_EXPECT(signerLists.isArray());
289 BEAST_EXPECT(signerLists.size() == 0);
300 env.rpc(
"json",
"account_info",
to_string(withoutSigners));
301 BEAST_EXPECT(info.isMember(jss::result));
302 BEAST_EXPECT(!info[jss::result].isMember(jss::signer_lists));
307 env.rpc(
"json",
"account_info",
to_string(withSigners));
308 BEAST_EXPECT(info.isMember(jss::result));
309 auto const&
data = info[jss::result];
310 BEAST_EXPECT(
data.isMember(jss::signer_lists));
311 auto const& signerLists =
data[jss::signer_lists];
312 BEAST_EXPECT(signerLists.isArray());
313 BEAST_EXPECT(signerLists.size() == 1);
314 auto const&
signers = signerLists[0u];
316 BEAST_EXPECT(
signers[sfSignerQuorum.jsonName] == 2);
317 auto const& signerEntries =
signers[sfSignerEntries.jsonName];
318 BEAST_EXPECT(signerEntries.size() == 1);
319 auto const& entry0 = signerEntries[0u][sfSignerEntry.jsonName];
320 BEAST_EXPECT(entry0[sfSignerWeight.jsonName] == 3);
325 env.rpc(
"json",
"account_info", withSignersAsString);
326 BEAST_EXPECT(info[jss::status] ==
"error");
327 BEAST_EXPECT(info[jss::error] ==
"invalidParams");
356 env.rpc(
"json",
"account_info",
to_string(withSigners));
357 BEAST_EXPECT(info.isMember(jss::result));
358 auto const&
data = info[jss::result];
359 BEAST_EXPECT(
data.isMember(jss::signer_lists));
360 auto const& signerLists =
data[jss::signer_lists];
361 BEAST_EXPECT(signerLists.isArray());
362 BEAST_EXPECT(signerLists.size() == 1);
363 auto const&
signers = signerLists[0u];
365 BEAST_EXPECT(
signers[sfSignerQuorum.jsonName] == 4);
366 auto const& signerEntries =
signers[sfSignerEntries.jsonName];
367 BEAST_EXPECT(signerEntries.size() == 8);
368 for (
unsigned i = 0u; i < 8; ++i)
370 auto const& entry = signerEntries[i][sfSignerEntry.jsonName];
371 BEAST_EXPECT(entry.
size() == 2);
372 BEAST_EXPECT(entry.
isMember(sfAccount.jsonName));
373 BEAST_EXPECT(entry[sfSignerWeight.jsonName] == 1);
389 "\"jsonrpc\": \"2.0\", "
390 "\"ripplerpc\": \"2.0\", "
392 "\"method\": \"account_info\", "
395 alice.human() +
"\"}}";
398 "\"jsonrpc\": \"2.0\", "
399 "\"ripplerpc\": \"2.0\", "
401 "\"method\": \"account_info\", "
404 alice.human() +
"\", " +
"\"signer_lists\": true }}";
408 auto const info = env.
rpc(
"json2", withoutSigners);
410 info.isMember(jss::result) &&
411 info[jss::result].isMember(jss::account_data));
412 BEAST_EXPECT(!info[jss::result][jss::account_data].isMember(
415 info.isMember(jss::jsonrpc) && info[jss::jsonrpc] ==
"2.0");
417 info.isMember(jss::ripplerpc) && info[jss::ripplerpc] ==
"2.0");
418 BEAST_EXPECT(info.isMember(jss::id) && info[jss::id] == 5);
422 auto const info = env.
rpc(
"json2", withSigners);
424 info.isMember(jss::result) &&
425 info[jss::result].isMember(jss::account_data));
426 auto const&
data = info[jss::result][jss::account_data];
427 BEAST_EXPECT(
data.isMember(jss::signer_lists));
428 auto const& signerLists =
data[jss::signer_lists];
429 BEAST_EXPECT(signerLists.isArray());
430 BEAST_EXPECT(signerLists.size() == 0);
432 info.isMember(jss::jsonrpc) && info[jss::jsonrpc] ==
"2.0");
434 info.isMember(jss::ripplerpc) && info[jss::ripplerpc] ==
"2.0");
435 BEAST_EXPECT(info.isMember(jss::id) && info[jss::id] == 6);
439 auto const info = env.
rpc(
440 "json2",
'[' + withoutSigners +
", " + withSigners +
']');
442 info[0u].isMember(jss::result) &&
443 info[0u][jss::result].isMember(jss::account_data));
444 BEAST_EXPECT(!info[0u][jss::result][jss::account_data].isMember(
447 info[0u].isMember(jss::jsonrpc) &&
448 info[0u][jss::jsonrpc] ==
"2.0");
450 info[0u].isMember(jss::ripplerpc) &&
451 info[0u][jss::ripplerpc] ==
"2.0");
452 BEAST_EXPECT(info[0u].isMember(jss::id) && info[0u][jss::id] == 5);
455 info[1u].isMember(jss::result) &&
456 info[1u][jss::result].isMember(jss::account_data));
457 auto const&
data = info[1u][jss::result][jss::account_data];
458 BEAST_EXPECT(
data.isMember(jss::signer_lists));
459 auto const& signerLists =
data[jss::signer_lists];
460 BEAST_EXPECT(signerLists.isArray());
461 BEAST_EXPECT(signerLists.size() == 0);
463 info[1u].isMember(jss::jsonrpc) &&
464 info[1u][jss::jsonrpc] ==
"2.0");
466 info[1u].isMember(jss::ripplerpc) &&
467 info[1u][jss::ripplerpc] ==
"2.0");
468 BEAST_EXPECT(info[1u].isMember(jss::id) && info[1u][jss::id] == 6);
478 auto const info = env.
rpc(
"json2", withoutSigners);
480 info.isMember(jss::result) &&
481 info[jss::result].isMember(jss::account_data));
482 BEAST_EXPECT(!info[jss::result][jss::account_data].isMember(
485 info.isMember(jss::jsonrpc) && info[jss::jsonrpc] ==
"2.0");
487 info.isMember(jss::ripplerpc) && info[jss::ripplerpc] ==
"2.0");
488 BEAST_EXPECT(info.isMember(jss::id) && info[jss::id] == 5);
492 auto const info = env.
rpc(
"json2", withSigners);
494 info.isMember(jss::result) &&
495 info[jss::result].isMember(jss::account_data));
496 auto const&
data = info[jss::result][jss::account_data];
497 BEAST_EXPECT(
data.isMember(jss::signer_lists));
498 auto const& signerLists =
data[jss::signer_lists];
499 BEAST_EXPECT(signerLists.isArray());
500 BEAST_EXPECT(signerLists.size() == 1);
501 auto const&
signers = signerLists[0u];
503 BEAST_EXPECT(
signers[sfSignerQuorum.jsonName] == 2);
504 auto const& signerEntries =
signers[sfSignerEntries.jsonName];
505 BEAST_EXPECT(signerEntries.size() == 1);
506 auto const& entry0 = signerEntries[0u][sfSignerEntry.jsonName];
507 BEAST_EXPECT(entry0[sfSignerWeight.jsonName] == 3);
509 info.isMember(jss::jsonrpc) && info[jss::jsonrpc] ==
"2.0");
511 info.isMember(jss::ripplerpc) && info[jss::ripplerpc] ==
"2.0");
512 BEAST_EXPECT(info.isMember(jss::id) && info[jss::id] == 6);
540 auto const info = env.
rpc(
"json2", withSigners);
542 info.isMember(jss::result) &&
543 info[jss::result].isMember(jss::account_data));
544 auto const&
data = info[jss::result][jss::account_data];
545 BEAST_EXPECT(
data.isMember(jss::signer_lists));
546 auto const& signerLists =
data[jss::signer_lists];
547 BEAST_EXPECT(signerLists.isArray());
548 BEAST_EXPECT(signerLists.size() == 1);
549 auto const&
signers = signerLists[0u];
551 BEAST_EXPECT(
signers[sfSignerQuorum.jsonName] == 4);
552 auto const& signerEntries =
signers[sfSignerEntries.jsonName];
553 BEAST_EXPECT(signerEntries.size() == 8);
554 for (
unsigned i = 0u; i < 8; ++i)
556 auto const& entry = signerEntries[i][sfSignerEntry.jsonName];
557 BEAST_EXPECT(entry.
size() == 2);
558 BEAST_EXPECT(entry.
isMember(sfAccount.jsonName));
559 BEAST_EXPECT(entry[sfSignerWeight.jsonName] == 1);
562 info.isMember(jss::jsonrpc) && info[jss::jsonrpc] ==
"2.0");
564 info.isMember(jss::ripplerpc) && info[jss::ripplerpc] ==
"2.0");
565 BEAST_EXPECT(info.isMember(jss::id) && info[jss::id] == 6);
575 Env env(*
this, features);
578 env.
fund(
XRP(1000), alice, bob);
580 auto getAccountFlag = [&env](
584 params[jss::account] = account.human();
589 if (info[jss::result][jss::status] ==
"success" &&
590 info[jss::result][jss::account_flags].isMember(fName.
data()))
591 res.
emplace(info[jss::result][jss::account_flags][fName.
data()]
597 static constexpr std::
608 for (
auto& asf : asFlags)
612 env(
fclear(alice, asf.second));
614 auto const f1 = getAccountFlag(asf.first, alice);
615 BEAST_EXPECT(f1.has_value());
616 BEAST_EXPECT(!f1.value());
620 env(
fset(alice, asf.second));
622 auto const f2 = getAccountFlag(asf.first, alice);
623 BEAST_EXPECT(f2.has_value());
624 BEAST_EXPECT(f2.value());
627 static constexpr std::
629 disallowIncomingFlags{
631 {
"disallowIncomingNFTokenOffer",
634 {
"disallowIncomingTrustline",
637 if (features[featureDisallowIncoming])
639 for (
auto& asf : disallowIncomingFlags)
643 env(
fclear(alice, asf.second));
645 auto const f1 = getAccountFlag(asf.first, alice);
646 BEAST_EXPECT(f1.has_value());
647 BEAST_EXPECT(!f1.value());
651 env(
fset(alice, asf.second));
653 auto const f2 = getAccountFlag(asf.first, alice);
654 BEAST_EXPECT(f2.has_value());
655 BEAST_EXPECT(f2.value());
660 for (
auto& asf : disallowIncomingFlags)
662 BEAST_EXPECT(!getAccountFlag(asf.first, alice));
667 allowTrustLineClawbackFlag{
670 if (features[featureClawback])
674 getAccountFlag(allowTrustLineClawbackFlag.first, bob);
675 BEAST_EXPECT(f1.has_value());
676 BEAST_EXPECT(!f1.value());
679 env(
fset(bob, allowTrustLineClawbackFlag.second));
682 getAccountFlag(allowTrustLineClawbackFlag.first, bob);
683 BEAST_EXPECT(f2.has_value());
684 BEAST_EXPECT(f2.value());
689 !getAccountFlag(allowTrustLineClawbackFlag.first, bob));
693 allowTrustLineLockingFlag{
696 if (features[featureTokenEscrow])
699 getAccountFlag(allowTrustLineLockingFlag.first, bob);
700 BEAST_EXPECT(f1.has_value());
701 BEAST_EXPECT(!f1.value());
704 env(
fset(bob, allowTrustLineLockingFlag.second));
707 getAccountFlag(allowTrustLineLockingFlag.first, bob);
708 BEAST_EXPECT(f2.has_value());
709 BEAST_EXPECT(f2.value());
713 BEAST_EXPECT(!getAccountFlag(allowTrustLineLockingFlag.first, bob));