22 auto const info = env.
rpc(
"json",
"account_info",
"{ }");
24 info[jss::result][jss::error_message] ==
25 "Missing field 'account'.");
29 auto const info = env.
rpc(
33 "\"n94JNrQYkDrpt62bbSR7nVEhdyAvcJXRAsjEkFYyqRkh9SUTYEqV\"}");
37 info[jss::result][jss::error_message] ==
"Account malformed.");
43 params[jss::account] = bogie.human();
49 info[jss::result][jss::error_message] ==
"Account not found.");
54 env.
rpc(
"json",
"account_info", R
"({"account": "foo"})");
58 info[jss::result][jss::error_message] == "Account malformed.");
63 auto testInvalidAccountParam = [&](
auto const& param) {
65 params[jss::account] = param;
67 "json",
"account_info",
to_string(params))[jss::result];
68 BEAST_EXPECT(jrr[jss::error] ==
"invalidParams");
70 jrr[jss::error_message] ==
"Invalid field 'account'.");
73 testInvalidAccountParam(1);
74 testInvalidAccountParam(1.1);
75 testInvalidAccountParam(
true);
83 auto testInvalidIdentParam = [&](
auto const& param) {
85 params[jss::ident] = param;
87 "json",
"account_info",
to_string(params))[jss::result];
88 BEAST_EXPECT(jrr[jss::error] ==
"invalidParams");
90 jrr[jss::error_message] ==
"Invalid field 'ident'.");
93 testInvalidIdentParam(1);
94 testInvalidIdentParam(1.1);
95 testInvalidIdentParam(
true);
113 withoutSigners[jss::account] = alice.human();
116 withSigners[jss::account] = alice.human();
117 withSigners[jss::signer_lists] =
true;
123 env.
rpc(
"json",
"account_info",
to_string(withoutSigners));
125 info.isMember(jss::result) &&
126 info[jss::result].isMember(jss::account_data));
127 BEAST_EXPECT(!info[jss::result][jss::account_data].isMember(
133 env.
rpc(
"json",
"account_info",
to_string(withSigners));
135 info.isMember(jss::result) &&
136 info[jss::result].isMember(jss::account_data));
137 auto const&
data = info[jss::result][jss::account_data];
138 BEAST_EXPECT(
data.isMember(jss::signer_lists));
139 auto const& signerLists =
data[jss::signer_lists];
140 BEAST_EXPECT(signerLists.isArray());
141 BEAST_EXPECT(signerLists.size() == 0);
152 env.
rpc(
"json",
"account_info",
to_string(withoutSigners));
154 info.isMember(jss::result) &&
155 info[jss::result].isMember(jss::account_data));
156 BEAST_EXPECT(!info[jss::result][jss::account_data].isMember(
162 env.
rpc(
"json",
"account_info",
to_string(withSigners));
164 info.isMember(jss::result) &&
165 info[jss::result].isMember(jss::account_data));
166 auto const&
data = info[jss::result][jss::account_data];
167 BEAST_EXPECT(
data.isMember(jss::signer_lists));
168 auto const& signerLists =
data[jss::signer_lists];
169 BEAST_EXPECT(signerLists.isArray());
170 BEAST_EXPECT(signerLists.size() == 1);
171 auto const&
signers = signerLists[0u];
173 BEAST_EXPECT(
signers[sfSignerQuorum.jsonName] == 2);
174 auto const& signerEntries =
signers[sfSignerEntries.jsonName];
175 BEAST_EXPECT(signerEntries.size() == 1);
176 auto const& entry0 = signerEntries[0u][sfSignerEntry.jsonName];
177 BEAST_EXPECT(entry0[sfSignerWeight.jsonName] == 3);
206 env.
rpc(
"json",
"account_info",
to_string(withSigners));
208 info.isMember(jss::result) &&
209 info[jss::result].isMember(jss::account_data));
210 auto const&
data = info[jss::result][jss::account_data];
211 BEAST_EXPECT(
data.isMember(jss::signer_lists));
212 auto const& signerLists =
data[jss::signer_lists];
213 BEAST_EXPECT(signerLists.isArray());
214 BEAST_EXPECT(signerLists.size() == 1);
215 auto const&
signers = signerLists[0u];
217 BEAST_EXPECT(
signers[sfSignerQuorum.jsonName] == 4);
218 auto const& signerEntries =
signers[sfSignerEntries.jsonName];
219 BEAST_EXPECT(signerEntries.size() == 8);
220 for (
unsigned i = 0u; i < 8; ++i)
222 auto const& entry = signerEntries[i][sfSignerEntry.jsonName];
223 BEAST_EXPECT(entry.
size() == 2);
224 BEAST_EXPECT(entry.
isMember(sfAccount.jsonName));
225 BEAST_EXPECT(entry[sfSignerWeight.jsonName] == 1);
238 env.fund(
XRP(1000), alice);
241 withoutSigners[jss::api_version] = 2;
242 withoutSigners[jss::account] = alice.human();
245 withSigners[jss::api_version] = 2;
246 withSigners[jss::account] = alice.human();
247 withSigners[jss::signer_lists] =
true;
249 auto const withSignersAsString =
std::string(
"{ ") +
250 "\"api_version\": 2, \"account\": \"" + alice.human() +
"\", " +
251 "\"signer_lists\": asdfggh }";
257 env.rpc(
"json",
"account_info",
to_string(withoutSigners));
258 BEAST_EXPECT(info.isMember(jss::result));
259 BEAST_EXPECT(!info[jss::result].isMember(jss::signer_lists));
264 env.rpc(
"json",
"account_info",
to_string(withSigners));
265 BEAST_EXPECT(info.isMember(jss::result));
266 auto const&
data = info[jss::result];
267 BEAST_EXPECT(
data.isMember(jss::signer_lists));
268 auto const& signerLists =
data[jss::signer_lists];
269 BEAST_EXPECT(signerLists.isArray());
270 BEAST_EXPECT(signerLists.size() == 0);
281 env.rpc(
"json",
"account_info",
to_string(withoutSigners));
282 BEAST_EXPECT(info.isMember(jss::result));
283 BEAST_EXPECT(!info[jss::result].isMember(jss::signer_lists));
288 env.rpc(
"json",
"account_info",
to_string(withSigners));
289 BEAST_EXPECT(info.isMember(jss::result));
290 auto const&
data = info[jss::result];
291 BEAST_EXPECT(
data.isMember(jss::signer_lists));
292 auto const& signerLists =
data[jss::signer_lists];
293 BEAST_EXPECT(signerLists.isArray());
294 BEAST_EXPECT(signerLists.size() == 1);
295 auto const&
signers = signerLists[0u];
297 BEAST_EXPECT(
signers[sfSignerQuorum.jsonName] == 2);
298 auto const& signerEntries =
signers[sfSignerEntries.jsonName];
299 BEAST_EXPECT(signerEntries.size() == 1);
300 auto const& entry0 = signerEntries[0u][sfSignerEntry.jsonName];
301 BEAST_EXPECT(entry0[sfSignerWeight.jsonName] == 3);
306 env.rpc(
"json",
"account_info", withSignersAsString);
307 BEAST_EXPECT(info[jss::status] ==
"error");
308 BEAST_EXPECT(info[jss::error] ==
"invalidParams");
337 env.rpc(
"json",
"account_info",
to_string(withSigners));
338 BEAST_EXPECT(info.isMember(jss::result));
339 auto const&
data = info[jss::result];
340 BEAST_EXPECT(
data.isMember(jss::signer_lists));
341 auto const& signerLists =
data[jss::signer_lists];
342 BEAST_EXPECT(signerLists.isArray());
343 BEAST_EXPECT(signerLists.size() == 1);
344 auto const&
signers = signerLists[0u];
346 BEAST_EXPECT(
signers[sfSignerQuorum.jsonName] == 4);
347 auto const& signerEntries =
signers[sfSignerEntries.jsonName];
348 BEAST_EXPECT(signerEntries.size() == 8);
349 for (
unsigned i = 0u; i < 8; ++i)
351 auto const& entry = signerEntries[i][sfSignerEntry.jsonName];
352 BEAST_EXPECT(entry.
size() == 2);
353 BEAST_EXPECT(entry.
isMember(sfAccount.jsonName));
354 BEAST_EXPECT(entry[sfSignerWeight.jsonName] == 1);
370 "\"jsonrpc\": \"2.0\", "
371 "\"ripplerpc\": \"2.0\", "
373 "\"method\": \"account_info\", "
376 alice.human() +
"\"}}";
379 "\"jsonrpc\": \"2.0\", "
380 "\"ripplerpc\": \"2.0\", "
382 "\"method\": \"account_info\", "
385 alice.human() +
"\", " +
"\"signer_lists\": true }}";
389 auto const info = env.
rpc(
"json2", withoutSigners);
391 info.isMember(jss::result) &&
392 info[jss::result].isMember(jss::account_data));
393 BEAST_EXPECT(!info[jss::result][jss::account_data].isMember(
396 info.isMember(jss::jsonrpc) && info[jss::jsonrpc] ==
"2.0");
398 info.isMember(jss::ripplerpc) && info[jss::ripplerpc] ==
"2.0");
399 BEAST_EXPECT(info.isMember(jss::id) && info[jss::id] == 5);
403 auto const info = env.
rpc(
"json2", withSigners);
405 info.isMember(jss::result) &&
406 info[jss::result].isMember(jss::account_data));
407 auto const&
data = info[jss::result][jss::account_data];
408 BEAST_EXPECT(
data.isMember(jss::signer_lists));
409 auto const& signerLists =
data[jss::signer_lists];
410 BEAST_EXPECT(signerLists.isArray());
411 BEAST_EXPECT(signerLists.size() == 0);
413 info.isMember(jss::jsonrpc) && info[jss::jsonrpc] ==
"2.0");
415 info.isMember(jss::ripplerpc) && info[jss::ripplerpc] ==
"2.0");
416 BEAST_EXPECT(info.isMember(jss::id) && info[jss::id] == 6);
420 auto const info = env.
rpc(
421 "json2",
'[' + withoutSigners +
", " + withSigners +
']');
423 info[0u].isMember(jss::result) &&
424 info[0u][jss::result].isMember(jss::account_data));
425 BEAST_EXPECT(!info[0u][jss::result][jss::account_data].isMember(
428 info[0u].isMember(jss::jsonrpc) &&
429 info[0u][jss::jsonrpc] ==
"2.0");
431 info[0u].isMember(jss::ripplerpc) &&
432 info[0u][jss::ripplerpc] ==
"2.0");
433 BEAST_EXPECT(info[0u].isMember(jss::id) && info[0u][jss::id] == 5);
436 info[1u].isMember(jss::result) &&
437 info[1u][jss::result].isMember(jss::account_data));
438 auto const&
data = info[1u][jss::result][jss::account_data];
439 BEAST_EXPECT(
data.isMember(jss::signer_lists));
440 auto const& signerLists =
data[jss::signer_lists];
441 BEAST_EXPECT(signerLists.isArray());
442 BEAST_EXPECT(signerLists.size() == 0);
444 info[1u].isMember(jss::jsonrpc) &&
445 info[1u][jss::jsonrpc] ==
"2.0");
447 info[1u].isMember(jss::ripplerpc) &&
448 info[1u][jss::ripplerpc] ==
"2.0");
449 BEAST_EXPECT(info[1u].isMember(jss::id) && info[1u][jss::id] == 6);
459 auto const info = env.
rpc(
"json2", withoutSigners);
461 info.isMember(jss::result) &&
462 info[jss::result].isMember(jss::account_data));
463 BEAST_EXPECT(!info[jss::result][jss::account_data].isMember(
466 info.isMember(jss::jsonrpc) && info[jss::jsonrpc] ==
"2.0");
468 info.isMember(jss::ripplerpc) && info[jss::ripplerpc] ==
"2.0");
469 BEAST_EXPECT(info.isMember(jss::id) && info[jss::id] == 5);
473 auto const info = env.
rpc(
"json2", withSigners);
475 info.isMember(jss::result) &&
476 info[jss::result].isMember(jss::account_data));
477 auto const&
data = info[jss::result][jss::account_data];
478 BEAST_EXPECT(
data.isMember(jss::signer_lists));
479 auto const& signerLists =
data[jss::signer_lists];
480 BEAST_EXPECT(signerLists.isArray());
481 BEAST_EXPECT(signerLists.size() == 1);
482 auto const&
signers = signerLists[0u];
484 BEAST_EXPECT(
signers[sfSignerQuorum.jsonName] == 2);
485 auto const& signerEntries =
signers[sfSignerEntries.jsonName];
486 BEAST_EXPECT(signerEntries.size() == 1);
487 auto const& entry0 = signerEntries[0u][sfSignerEntry.jsonName];
488 BEAST_EXPECT(entry0[sfSignerWeight.jsonName] == 3);
490 info.isMember(jss::jsonrpc) && info[jss::jsonrpc] ==
"2.0");
492 info.isMember(jss::ripplerpc) && info[jss::ripplerpc] ==
"2.0");
493 BEAST_EXPECT(info.isMember(jss::id) && info[jss::id] == 6);
521 auto const info = env.
rpc(
"json2", withSigners);
523 info.isMember(jss::result) &&
524 info[jss::result].isMember(jss::account_data));
525 auto const&
data = info[jss::result][jss::account_data];
526 BEAST_EXPECT(
data.isMember(jss::signer_lists));
527 auto const& signerLists =
data[jss::signer_lists];
528 BEAST_EXPECT(signerLists.isArray());
529 BEAST_EXPECT(signerLists.size() == 1);
530 auto const&
signers = signerLists[0u];
532 BEAST_EXPECT(
signers[sfSignerQuorum.jsonName] == 4);
533 auto const& signerEntries =
signers[sfSignerEntries.jsonName];
534 BEAST_EXPECT(signerEntries.size() == 8);
535 for (
unsigned i = 0u; i < 8; ++i)
537 auto const& entry = signerEntries[i][sfSignerEntry.jsonName];
538 BEAST_EXPECT(entry.
size() == 2);
539 BEAST_EXPECT(entry.
isMember(sfAccount.jsonName));
540 BEAST_EXPECT(entry[sfSignerWeight.jsonName] == 1);
543 info.isMember(jss::jsonrpc) && info[jss::jsonrpc] ==
"2.0");
545 info.isMember(jss::ripplerpc) && info[jss::ripplerpc] ==
"2.0");
546 BEAST_EXPECT(info.isMember(jss::id) && info[jss::id] == 6);
556 Env env(*
this, features);
559 env.
fund(
XRP(1000), alice, bob);
561 auto getAccountFlag = [&env](
565 params[jss::account] = account.human();
570 if (info[jss::result][jss::status] ==
"success" &&
571 info[jss::result][jss::account_flags].isMember(fName.
data()))
572 res.
emplace(info[jss::result][jss::account_flags][fName.
data()]
578 static constexpr std::
589 for (
auto& asf : asFlags)
593 env(
fclear(alice, asf.second));
595 auto const f1 = getAccountFlag(asf.first, alice);
596 BEAST_EXPECT(f1.has_value());
597 BEAST_EXPECT(!f1.value());
601 env(
fset(alice, asf.second));
603 auto const f2 = getAccountFlag(asf.first, alice);
604 BEAST_EXPECT(f2.has_value());
605 BEAST_EXPECT(f2.value());
608 static constexpr std::
610 disallowIncomingFlags{
612 {
"disallowIncomingNFTokenOffer",
615 {
"disallowIncomingTrustline",
618 if (features[featureDisallowIncoming])
620 for (
auto& asf : disallowIncomingFlags)
624 env(
fclear(alice, asf.second));
626 auto const f1 = getAccountFlag(asf.first, alice);
627 BEAST_EXPECT(f1.has_value());
628 BEAST_EXPECT(!f1.value());
632 env(
fset(alice, asf.second));
634 auto const f2 = getAccountFlag(asf.first, alice);
635 BEAST_EXPECT(f2.has_value());
636 BEAST_EXPECT(f2.value());
641 for (
auto& asf : disallowIncomingFlags)
643 BEAST_EXPECT(!getAccountFlag(asf.first, alice));
648 allowTrustLineClawbackFlag{
651 if (features[featureClawback])
655 getAccountFlag(allowTrustLineClawbackFlag.first, bob);
656 BEAST_EXPECT(f1.has_value());
657 BEAST_EXPECT(!f1.value());
660 env(
fset(bob, allowTrustLineClawbackFlag.second));
663 getAccountFlag(allowTrustLineClawbackFlag.first, bob);
664 BEAST_EXPECT(f2.has_value());
665 BEAST_EXPECT(f2.value());
670 !getAccountFlag(allowTrustLineClawbackFlag.first, bob));
674 allowTrustLineLockingFlag{
677 if (features[featureTokenEscrow])
680 getAccountFlag(allowTrustLineLockingFlag.first, bob);
681 BEAST_EXPECT(f1.has_value());
682 BEAST_EXPECT(!f1.value());
685 env(
fset(bob, allowTrustLineLockingFlag.second));
688 getAccountFlag(allowTrustLineLockingFlag.first, bob);
689 BEAST_EXPECT(f2.has_value());
690 BEAST_EXPECT(f2.value());
694 BEAST_EXPECT(!getAccountFlag(allowTrustLineLockingFlag.first, bob));