36 auto const info = env.
rpc(
"json",
"account_info",
"{ }");
37 BEAST_EXPECT(info[jss::result][jss::error_message] ==
"Missing field 'account'.");
41 auto const info = env.
rpc(
45 "\"n94JNrQYkDrpt62bbSR7nVEhdyAvcJXRAsjEkFYyqRkh9SUTYEqV\"}");
47 BEAST_EXPECT(info[jss::result][jss::error_message] ==
"Account malformed.");
53 params[jss::account] = bogie.
human();
54 auto const info = env.
rpc(
"json",
"account_info",
to_string(params));
55 BEAST_EXPECT(info[jss::result][jss::error_code] ==
RpcActNotFound);
56 BEAST_EXPECT(info[jss::result][jss::error_message] ==
"Account not found.");
60 auto const info = env.
rpc(
"json",
"account_info", R
"({"account": "foo"})");
62 BEAST_EXPECT(info[jss::result][jss::error_message] == "Account malformed.");
67 auto testInvalidAccountParam = [&](
auto const& param) {
69 params[jss::account] = param;
70 auto jrr = env.
rpc(
"json",
"account_info",
to_string(params))[jss::result];
71 BEAST_EXPECT(jrr[jss::error] ==
"invalidParams");
72 BEAST_EXPECT(jrr[jss::error_message] ==
"Invalid field 'account'.");
75 testInvalidAccountParam(1);
76 testInvalidAccountParam(1.1);
77 testInvalidAccountParam(
true);
85 auto testInvalidIdentParam = [&](
auto const& param) {
87 params[jss::ident] = param;
88 auto jrr = env.
rpc(
"json",
"account_info",
to_string(params))[jss::result];
89 BEAST_EXPECT(jrr[jss::error] ==
"invalidParams");
90 BEAST_EXPECT(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;
122 auto const info = env.
rpc(
"json",
"account_info",
to_string(withoutSigners));
124 info.isMember(jss::result) && info[jss::result].isMember(jss::account_data));
125 BEAST_EXPECT(!info[jss::result][jss::account_data].isMember(jss::signer_lists));
129 auto const info = env.
rpc(
"json",
"account_info",
to_string(withSigners));
131 info.isMember(jss::result) && info[jss::result].isMember(jss::account_data));
132 auto const& data = info[jss::result][jss::account_data];
133 BEAST_EXPECT(data.isMember(jss::signer_lists));
134 auto const& signerLists = data[jss::signer_lists];
135 BEAST_EXPECT(signerLists.isArray());
136 BEAST_EXPECT(signerLists.size() == 0);
146 auto const info = env.
rpc(
"json",
"account_info",
to_string(withoutSigners));
148 info.isMember(jss::result) && info[jss::result].isMember(jss::account_data));
149 BEAST_EXPECT(!info[jss::result][jss::account_data].isMember(jss::signer_lists));
153 auto const info = env.
rpc(
"json",
"account_info",
to_string(withSigners));
155 info.isMember(jss::result) && 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() == 1);
161 auto const&
signers = signerLists[0u];
162 BEAST_EXPECT(
signers.isObject());
163 BEAST_EXPECT(
signers[sfSignerQuorum.jsonName] == 2);
164 auto const& signerEntries =
signers[sfSignerEntries.jsonName];
165 BEAST_EXPECT(signerEntries.size() == 1);
166 auto const& entry0 = signerEntries[0u][sfSignerEntry.jsonName];
167 BEAST_EXPECT(entry0[sfSignerWeight.jsonName] == 3);
195 auto const info = env.
rpc(
"json",
"account_info",
to_string(withSigners));
197 info.isMember(jss::result) && info[jss::result].isMember(jss::account_data));
198 auto const& data = info[jss::result][jss::account_data];
199 BEAST_EXPECT(data.isMember(jss::signer_lists));
200 auto const& signerLists = data[jss::signer_lists];
201 BEAST_EXPECT(signerLists.isArray());
202 BEAST_EXPECT(signerLists.size() == 1);
203 auto const&
signers = signerLists[0u];
204 BEAST_EXPECT(
signers.isObject());
205 BEAST_EXPECT(
signers[sfSignerQuorum.jsonName] == 4);
206 auto const& signerEntries =
signers[sfSignerEntries.jsonName];
207 BEAST_EXPECT(signerEntries.size() == 8);
208 for (
unsigned i = 0u; i < 8; ++i)
210 auto const& entry = signerEntries[i][sfSignerEntry.jsonName];
211 BEAST_EXPECT(entry.
size() == 2);
212 BEAST_EXPECT(entry.
isMember(sfAccount.jsonName));
213 BEAST_EXPECT(entry[sfSignerWeight.jsonName] == 1);
229 withoutSigners[jss::api_version] = 2;
230 withoutSigners[jss::account] = alice.
human();
233 withSigners[jss::api_version] = 2;
234 withSigners[jss::account] = alice.
human();
235 withSigners[jss::signer_lists] =
true;
237 auto const withSignersAsString =
std::string(
"{ ") +
"\"api_version\": 2, \"account\": \"" +
238 alice.
human() +
"\", " +
"\"signer_lists\": asdfggh }";
243 auto const info = env.
rpc(
"json",
"account_info",
to_string(withoutSigners));
244 BEAST_EXPECT(info.isMember(jss::result));
245 BEAST_EXPECT(!info[jss::result].isMember(jss::signer_lists));
249 auto const info = env.
rpc(
"json",
"account_info",
to_string(withSigners));
250 BEAST_EXPECT(info.isMember(jss::result));
251 auto const& data = info[jss::result];
252 BEAST_EXPECT(data.isMember(jss::signer_lists));
253 auto const& signerLists = data[jss::signer_lists];
254 BEAST_EXPECT(signerLists.isArray());
255 BEAST_EXPECT(signerLists.size() == 0);
265 auto const info = env.
rpc(
"json",
"account_info",
to_string(withoutSigners));
266 BEAST_EXPECT(info.isMember(jss::result));
267 BEAST_EXPECT(!info[jss::result].isMember(jss::signer_lists));
271 auto const info = env.
rpc(
"json",
"account_info",
to_string(withSigners));
272 BEAST_EXPECT(info.isMember(jss::result));
273 auto const& data = info[jss::result];
274 BEAST_EXPECT(data.isMember(jss::signer_lists));
275 auto const& signerLists = data[jss::signer_lists];
276 BEAST_EXPECT(signerLists.isArray());
277 BEAST_EXPECT(signerLists.size() == 1);
278 auto const&
signers = signerLists[0u];
279 BEAST_EXPECT(
signers.isObject());
280 BEAST_EXPECT(
signers[sfSignerQuorum.jsonName] == 2);
281 auto const& signerEntries =
signers[sfSignerEntries.jsonName];
282 BEAST_EXPECT(signerEntries.size() == 1);
283 auto const& entry0 = signerEntries[0u][sfSignerEntry.jsonName];
284 BEAST_EXPECT(entry0[sfSignerWeight.jsonName] == 3);
288 auto const info = env.
rpc(
"json",
"account_info", withSignersAsString);
289 BEAST_EXPECT(info[jss::status] ==
"error");
290 BEAST_EXPECT(info[jss::error] ==
"invalidParams");
318 auto const info = env.
rpc(
"json",
"account_info",
to_string(withSigners));
319 BEAST_EXPECT(info.isMember(jss::result));
320 auto const& data = info[jss::result];
321 BEAST_EXPECT(data.isMember(jss::signer_lists));
322 auto const& signerLists = data[jss::signer_lists];
323 BEAST_EXPECT(signerLists.isArray());
324 BEAST_EXPECT(signerLists.size() == 1);
325 auto const&
signers = signerLists[0u];
326 BEAST_EXPECT(
signers.isObject());
327 BEAST_EXPECT(
signers[sfSignerQuorum.jsonName] == 4);
328 auto const& signerEntries =
signers[sfSignerEntries.jsonName];
329 BEAST_EXPECT(signerEntries.size() == 8);
330 for (
unsigned i = 0u; i < 8; ++i)
332 auto const& entry = signerEntries[i][sfSignerEntry.jsonName];
333 BEAST_EXPECT(entry.
size() == 2);
334 BEAST_EXPECT(entry.
isMember(sfAccount.jsonName));
335 BEAST_EXPECT(entry[sfSignerWeight.jsonName] == 1);
351 "\"jsonrpc\": \"2.0\", "
352 "\"ripplerpc\": \"2.0\", "
354 "\"method\": \"account_info\", "
357 alice.
human() +
"\"}}";
360 "\"jsonrpc\": \"2.0\", "
361 "\"ripplerpc\": \"2.0\", "
363 "\"method\": \"account_info\", "
366 alice.
human() +
"\", " +
"\"signer_lists\": true }}";
370 auto const info = env.
rpc(
"json2", withoutSigners);
372 info.isMember(jss::result) && info[jss::result].isMember(jss::account_data));
373 BEAST_EXPECT(!info[jss::result][jss::account_data].isMember(jss::signer_lists));
374 BEAST_EXPECT(info.isMember(jss::jsonrpc) && info[jss::jsonrpc] ==
"2.0");
375 BEAST_EXPECT(info.isMember(jss::ripplerpc) && info[jss::ripplerpc] ==
"2.0");
376 BEAST_EXPECT(info.isMember(jss::id) && info[jss::id] == 5);
380 auto const info = env.
rpc(
"json2", withSigners);
382 info.isMember(jss::result) && info[jss::result].isMember(jss::account_data));
383 auto const& data = info[jss::result][jss::account_data];
384 BEAST_EXPECT(data.isMember(jss::signer_lists));
385 auto const& signerLists = data[jss::signer_lists];
386 BEAST_EXPECT(signerLists.isArray());
387 BEAST_EXPECT(signerLists.size() == 0);
388 BEAST_EXPECT(info.isMember(jss::jsonrpc) && info[jss::jsonrpc] ==
"2.0");
389 BEAST_EXPECT(info.isMember(jss::ripplerpc) && info[jss::ripplerpc] ==
"2.0");
390 BEAST_EXPECT(info.isMember(jss::id) && info[jss::id] == 6);
394 auto const info = env.
rpc(
"json2",
'[' + withoutSigners +
", " + withSigners +
']');
396 info[0u].isMember(jss::result) &&
397 info[0u][jss::result].isMember(jss::account_data));
398 BEAST_EXPECT(!info[0u][jss::result][jss::account_data].isMember(jss::signer_lists));
399 BEAST_EXPECT(info[0u].isMember(jss::jsonrpc) && info[0u][jss::jsonrpc] ==
"2.0");
400 BEAST_EXPECT(info[0u].isMember(jss::ripplerpc) && info[0u][jss::ripplerpc] ==
"2.0");
401 BEAST_EXPECT(info[0u].isMember(jss::id) && info[0u][jss::id] == 5);
404 info[1u].isMember(jss::result) &&
405 info[1u][jss::result].isMember(jss::account_data));
406 auto const& data = info[1u][jss::result][jss::account_data];
407 BEAST_EXPECT(data.isMember(jss::signer_lists));
408 auto const& signerLists = data[jss::signer_lists];
409 BEAST_EXPECT(signerLists.isArray());
410 BEAST_EXPECT(signerLists.size() == 0);
411 BEAST_EXPECT(info[1u].isMember(jss::jsonrpc) && info[1u][jss::jsonrpc] ==
"2.0");
412 BEAST_EXPECT(info[1u].isMember(jss::ripplerpc) && info[1u][jss::ripplerpc] ==
"2.0");
413 BEAST_EXPECT(info[1u].isMember(jss::id) && info[1u][jss::id] == 6);
423 auto const info = env.
rpc(
"json2", withoutSigners);
425 info.isMember(jss::result) && info[jss::result].isMember(jss::account_data));
426 BEAST_EXPECT(!info[jss::result][jss::account_data].isMember(jss::signer_lists));
427 BEAST_EXPECT(info.isMember(jss::jsonrpc) && info[jss::jsonrpc] ==
"2.0");
428 BEAST_EXPECT(info.isMember(jss::ripplerpc) && info[jss::ripplerpc] ==
"2.0");
429 BEAST_EXPECT(info.isMember(jss::id) && info[jss::id] == 5);
433 auto const info = env.
rpc(
"json2", withSigners);
435 info.isMember(jss::result) && info[jss::result].isMember(jss::account_data));
436 auto const& data = info[jss::result][jss::account_data];
437 BEAST_EXPECT(data.isMember(jss::signer_lists));
438 auto const& signerLists = data[jss::signer_lists];
439 BEAST_EXPECT(signerLists.isArray());
440 BEAST_EXPECT(signerLists.size() == 1);
441 auto const&
signers = signerLists[0u];
442 BEAST_EXPECT(
signers.isObject());
443 BEAST_EXPECT(
signers[sfSignerQuorum.jsonName] == 2);
444 auto const& signerEntries =
signers[sfSignerEntries.jsonName];
445 BEAST_EXPECT(signerEntries.size() == 1);
446 auto const& entry0 = signerEntries[0u][sfSignerEntry.jsonName];
447 BEAST_EXPECT(entry0[sfSignerWeight.jsonName] == 3);
448 BEAST_EXPECT(info.isMember(jss::jsonrpc) && info[jss::jsonrpc] ==
"2.0");
449 BEAST_EXPECT(info.isMember(jss::ripplerpc) && info[jss::ripplerpc] ==
"2.0");
450 BEAST_EXPECT(info.isMember(jss::id) && info[jss::id] == 6);
478 auto const info = env.
rpc(
"json2", withSigners);
480 info.isMember(jss::result) && info[jss::result].isMember(jss::account_data));
481 auto const& data = info[jss::result][jss::account_data];
482 BEAST_EXPECT(data.isMember(jss::signer_lists));
483 auto const& signerLists = data[jss::signer_lists];
484 BEAST_EXPECT(signerLists.isArray());
485 BEAST_EXPECT(signerLists.size() == 1);
486 auto const&
signers = signerLists[0u];
487 BEAST_EXPECT(
signers.isObject());
488 BEAST_EXPECT(
signers[sfSignerQuorum.jsonName] == 4);
489 auto const& signerEntries =
signers[sfSignerEntries.jsonName];
490 BEAST_EXPECT(signerEntries.size() == 8);
491 for (
unsigned i = 0u; i < 8; ++i)
493 auto const& entry = signerEntries[i][sfSignerEntry.jsonName];
494 BEAST_EXPECT(entry.
size() == 2);
495 BEAST_EXPECT(entry.
isMember(sfAccount.jsonName));
496 BEAST_EXPECT(entry[sfSignerWeight.jsonName] == 1);
498 BEAST_EXPECT(info.isMember(jss::jsonrpc) && info[jss::jsonrpc] ==
"2.0");
499 BEAST_EXPECT(info.isMember(jss::ripplerpc) && info[jss::ripplerpc] ==
"2.0");
500 BEAST_EXPECT(info.isMember(jss::id) && info[jss::id] == 6);
510 Env env(*
this, features);
513 env.
fund(
XRP(1000), alice, bob);
517 params[jss::account] = account.human();
518 auto const info = env.
rpc(
"json",
"account_info",
to_string(params));
522 if (info[jss::result][jss::status] ==
"success" &&
523 info[jss::result][jss::account_flags].isMember(name))
524 res.
emplace(info[jss::result][jss::account_flags][name].asBool());
530 {{
"defaultRipple", asfDefaultRipple},
531 {
"depositAuth", asfDepositAuth},
532 {
"disallowIncomingXRP", asfDisallowXRP},
533 {
"globalFreeze", asfGlobalFreeze},
534 {
"noFreeze", asfNoFreeze},
535 {
"requireAuthorization", asfRequireAuth},
536 {
"requireDestinationTag", asfRequireDest}}};
538 for (
auto& asf : kAsFlags)
542 env(
fclear(alice, asf.second));
544 auto const f1 = getAccountFlag(asf.first, alice);
545 BEAST_EXPECT(f1.has_value());
546 BEAST_EXPECT(!f1.value());
550 env(
fset(alice, asf.second));
552 auto const f2 = getAccountFlag(asf.first, alice);
553 BEAST_EXPECT(f2.has_value());
554 BEAST_EXPECT(f2.value());
558 kDisallowIncomingFlags{
559 {{
"disallowIncomingCheck", asfDisallowIncomingCheck},
560 {
"disallowIncomingNFTokenOffer", asfDisallowIncomingNFTokenOffer},
561 {
"disallowIncomingPayChan", asfDisallowIncomingPayChan},
562 {
"disallowIncomingTrustline", asfDisallowIncomingTrustline}}};
564 for (
auto& asf : kDisallowIncomingFlags)
568 env(
fclear(alice, asf.second));
570 auto const f1 = getAccountFlag(asf.first, alice);
571 BEAST_EXPECT(f1.has_value());
572 BEAST_EXPECT(!f1.value());
576 env(
fset(alice, asf.second));
578 auto const f2 = getAccountFlag(asf.first, alice);
579 BEAST_EXPECT(f2.has_value());
580 BEAST_EXPECT(f2.value());
584 "allowTrustLineClawback", asfAllowTrustLineClawback};
587 auto const f1 = getAccountFlag(kAllowTrustLineClawbackFlag.
first, bob);
588 BEAST_EXPECT(f1.has_value());
589 BEAST_EXPECT(!f1.value());
592 env(
fset(bob, kAllowTrustLineClawbackFlag.
second));
594 auto const f2 = getAccountFlag(kAllowTrustLineClawbackFlag.
first, bob);
595 BEAST_EXPECT(f2.has_value());
596 BEAST_EXPECT(f2.value());
599 "allowTrustLineLocking", asfAllowTrustLineLocking};
601 if (features[featureTokenEscrow])
603 auto const f1 = getAccountFlag(kAllowTrustLineLockingFlag.
first, bob);
604 BEAST_EXPECT(f1.has_value());
605 BEAST_EXPECT(!f1.value());
608 env(
fset(bob, kAllowTrustLineLockingFlag.
second));
610 auto const f2 = getAccountFlag(kAllowTrustLineLockingFlag.
first, bob);
611 BEAST_EXPECT(f2.has_value());
612 BEAST_EXPECT(f2.value());
616 BEAST_EXPECT(!getAccountFlag(kAllowTrustLineLockingFlag.
first, bob));