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));
110 info.isMember(jss::result) && info[jss::result].isMember(jss::account_data));
111 BEAST_EXPECT(!info[jss::result][jss::account_data].isMember(jss::signer_lists));
115 auto const info = env.
rpc(
"json",
"account_info",
to_string(withSigners));
117 info.isMember(jss::result) && info[jss::result].isMember(jss::account_data));
118 auto const&
data = info[jss::result][jss::account_data];
119 BEAST_EXPECT(
data.isMember(jss::signer_lists));
120 auto const& signerLists =
data[jss::signer_lists];
121 BEAST_EXPECT(signerLists.isArray());
122 BEAST_EXPECT(signerLists.size() == 0);
132 auto const info = env.
rpc(
"json",
"account_info",
to_string(withoutSigners));
134 info.isMember(jss::result) && info[jss::result].isMember(jss::account_data));
135 BEAST_EXPECT(!info[jss::result][jss::account_data].isMember(jss::signer_lists));
139 auto const info = env.
rpc(
"json",
"account_info",
to_string(withSigners));
141 info.isMember(jss::result) && info[jss::result].isMember(jss::account_data));
142 auto const&
data = info[jss::result][jss::account_data];
143 BEAST_EXPECT(
data.isMember(jss::signer_lists));
144 auto const& signerLists =
data[jss::signer_lists];
145 BEAST_EXPECT(signerLists.isArray());
146 BEAST_EXPECT(signerLists.size() == 1);
147 auto const&
signers = signerLists[0u];
149 BEAST_EXPECT(
signers[sfSignerQuorum.jsonName] == 2);
150 auto const& signerEntries =
signers[sfSignerEntries.jsonName];
151 BEAST_EXPECT(signerEntries.size() == 1);
152 auto const& entry0 = signerEntries[0u][sfSignerEntry.jsonName];
153 BEAST_EXPECT(entry0[sfSignerWeight.jsonName] == 3);
181 auto const info = env.
rpc(
"json",
"account_info",
to_string(withSigners));
183 info.isMember(jss::result) && info[jss::result].isMember(jss::account_data));
184 auto const&
data = info[jss::result][jss::account_data];
185 BEAST_EXPECT(
data.isMember(jss::signer_lists));
186 auto const& signerLists =
data[jss::signer_lists];
187 BEAST_EXPECT(signerLists.isArray());
188 BEAST_EXPECT(signerLists.size() == 1);
189 auto const&
signers = signerLists[0u];
191 BEAST_EXPECT(
signers[sfSignerQuorum.jsonName] == 4);
192 auto const& signerEntries =
signers[sfSignerEntries.jsonName];
193 BEAST_EXPECT(signerEntries.size() == 8);
194 for (
unsigned i = 0u; i < 8; ++i)
196 auto const& entry = signerEntries[i][sfSignerEntry.jsonName];
197 BEAST_EXPECT(entry.
size() == 2);
198 BEAST_EXPECT(entry.
isMember(sfAccount.jsonName));
199 BEAST_EXPECT(entry[sfSignerWeight.jsonName] == 1);
212 env.fund(
XRP(1000), alice);
215 withoutSigners[jss::api_version] = 2;
216 withoutSigners[jss::account] = alice.human();
219 withSigners[jss::api_version] = 2;
220 withSigners[jss::account] = alice.human();
221 withSigners[jss::signer_lists] =
true;
223 auto const withSignersAsString =
std::string(
"{ ") +
"\"api_version\": 2, \"account\": \"" +
224 alice.human() +
"\", " +
"\"signer_lists\": asdfggh }";
229 auto const info = env.rpc(
"json",
"account_info",
to_string(withoutSigners));
230 BEAST_EXPECT(info.isMember(jss::result));
231 BEAST_EXPECT(!info[jss::result].isMember(jss::signer_lists));
235 auto const info = env.rpc(
"json",
"account_info",
to_string(withSigners));
236 BEAST_EXPECT(info.isMember(jss::result));
237 auto const&
data = info[jss::result];
238 BEAST_EXPECT(
data.isMember(jss::signer_lists));
239 auto const& signerLists =
data[jss::signer_lists];
240 BEAST_EXPECT(signerLists.isArray());
241 BEAST_EXPECT(signerLists.size() == 0);
251 auto const info = env.rpc(
"json",
"account_info",
to_string(withoutSigners));
252 BEAST_EXPECT(info.isMember(jss::result));
253 BEAST_EXPECT(!info[jss::result].isMember(jss::signer_lists));
257 auto const info = env.rpc(
"json",
"account_info",
to_string(withSigners));
258 BEAST_EXPECT(info.isMember(jss::result));
259 auto const&
data = info[jss::result];
260 BEAST_EXPECT(
data.isMember(jss::signer_lists));
261 auto const& signerLists =
data[jss::signer_lists];
262 BEAST_EXPECT(signerLists.isArray());
263 BEAST_EXPECT(signerLists.size() == 1);
264 auto const&
signers = signerLists[0u];
266 BEAST_EXPECT(
signers[sfSignerQuorum.jsonName] == 2);
267 auto const& signerEntries =
signers[sfSignerEntries.jsonName];
268 BEAST_EXPECT(signerEntries.size() == 1);
269 auto const& entry0 = signerEntries[0u][sfSignerEntry.jsonName];
270 BEAST_EXPECT(entry0[sfSignerWeight.jsonName] == 3);
274 auto const info = env.rpc(
"json",
"account_info", withSignersAsString);
275 BEAST_EXPECT(info[jss::status] ==
"error");
276 BEAST_EXPECT(info[jss::error] ==
"invalidParams");
304 auto const info = env.rpc(
"json",
"account_info",
to_string(withSigners));
305 BEAST_EXPECT(info.isMember(jss::result));
306 auto const&
data = info[jss::result];
307 BEAST_EXPECT(
data.isMember(jss::signer_lists));
308 auto const& signerLists =
data[jss::signer_lists];
309 BEAST_EXPECT(signerLists.isArray());
310 BEAST_EXPECT(signerLists.size() == 1);
311 auto const&
signers = signerLists[0u];
313 BEAST_EXPECT(
signers[sfSignerQuorum.jsonName] == 4);
314 auto const& signerEntries =
signers[sfSignerEntries.jsonName];
315 BEAST_EXPECT(signerEntries.size() == 8);
316 for (
unsigned i = 0u; i < 8; ++i)
318 auto const& entry = signerEntries[i][sfSignerEntry.jsonName];
319 BEAST_EXPECT(entry.
size() == 2);
320 BEAST_EXPECT(entry.
isMember(sfAccount.jsonName));
321 BEAST_EXPECT(entry[sfSignerWeight.jsonName] == 1);
337 "\"jsonrpc\": \"2.0\", "
338 "\"ripplerpc\": \"2.0\", "
340 "\"method\": \"account_info\", "
343 alice.human() +
"\"}}";
346 "\"jsonrpc\": \"2.0\", "
347 "\"ripplerpc\": \"2.0\", "
349 "\"method\": \"account_info\", "
352 alice.human() +
"\", " +
"\"signer_lists\": true }}";
356 auto const info = env.
rpc(
"json2", withoutSigners);
358 info.isMember(jss::result) && info[jss::result].isMember(jss::account_data));
359 BEAST_EXPECT(!info[jss::result][jss::account_data].isMember(jss::signer_lists));
360 BEAST_EXPECT(info.isMember(jss::jsonrpc) && info[jss::jsonrpc] ==
"2.0");
361 BEAST_EXPECT(info.isMember(jss::ripplerpc) && info[jss::ripplerpc] ==
"2.0");
362 BEAST_EXPECT(info.isMember(jss::id) && info[jss::id] == 5);
366 auto const info = env.
rpc(
"json2", withSigners);
368 info.isMember(jss::result) && info[jss::result].isMember(jss::account_data));
369 auto const&
data = info[jss::result][jss::account_data];
370 BEAST_EXPECT(
data.isMember(jss::signer_lists));
371 auto const& signerLists =
data[jss::signer_lists];
372 BEAST_EXPECT(signerLists.isArray());
373 BEAST_EXPECT(signerLists.size() == 0);
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] == 6);
380 auto const info = env.
rpc(
"json2",
'[' + withoutSigners +
", " + withSigners +
']');
382 info[0u].isMember(jss::result) &&
383 info[0u][jss::result].isMember(jss::account_data));
384 BEAST_EXPECT(!info[0u][jss::result][jss::account_data].isMember(jss::signer_lists));
385 BEAST_EXPECT(info[0u].isMember(jss::jsonrpc) && info[0u][jss::jsonrpc] ==
"2.0");
386 BEAST_EXPECT(info[0u].isMember(jss::ripplerpc) && info[0u][jss::ripplerpc] ==
"2.0");
387 BEAST_EXPECT(info[0u].isMember(jss::id) && info[0u][jss::id] == 5);
390 info[1u].isMember(jss::result) &&
391 info[1u][jss::result].isMember(jss::account_data));
392 auto const&
data = info[1u][jss::result][jss::account_data];
393 BEAST_EXPECT(
data.isMember(jss::signer_lists));
394 auto const& signerLists =
data[jss::signer_lists];
395 BEAST_EXPECT(signerLists.isArray());
396 BEAST_EXPECT(signerLists.size() == 0);
397 BEAST_EXPECT(info[1u].isMember(jss::jsonrpc) && info[1u][jss::jsonrpc] ==
"2.0");
398 BEAST_EXPECT(info[1u].isMember(jss::ripplerpc) && info[1u][jss::ripplerpc] ==
"2.0");
399 BEAST_EXPECT(info[1u].isMember(jss::id) && info[1u][jss::id] == 6);
409 auto const info = env.
rpc(
"json2", withoutSigners);
411 info.isMember(jss::result) && info[jss::result].isMember(jss::account_data));
412 BEAST_EXPECT(!info[jss::result][jss::account_data].isMember(jss::signer_lists));
413 BEAST_EXPECT(info.isMember(jss::jsonrpc) && info[jss::jsonrpc] ==
"2.0");
414 BEAST_EXPECT(info.isMember(jss::ripplerpc) && info[jss::ripplerpc] ==
"2.0");
415 BEAST_EXPECT(info.isMember(jss::id) && info[jss::id] == 5);
419 auto const info = env.
rpc(
"json2", withSigners);
421 info.isMember(jss::result) && info[jss::result].isMember(jss::account_data));
422 auto const&
data = info[jss::result][jss::account_data];
423 BEAST_EXPECT(
data.isMember(jss::signer_lists));
424 auto const& signerLists =
data[jss::signer_lists];
425 BEAST_EXPECT(signerLists.isArray());
426 BEAST_EXPECT(signerLists.size() == 1);
427 auto const&
signers = signerLists[0u];
429 BEAST_EXPECT(
signers[sfSignerQuorum.jsonName] == 2);
430 auto const& signerEntries =
signers[sfSignerEntries.jsonName];
431 BEAST_EXPECT(signerEntries.size() == 1);
432 auto const& entry0 = signerEntries[0u][sfSignerEntry.jsonName];
433 BEAST_EXPECT(entry0[sfSignerWeight.jsonName] == 3);
434 BEAST_EXPECT(info.isMember(jss::jsonrpc) && info[jss::jsonrpc] ==
"2.0");
435 BEAST_EXPECT(info.isMember(jss::ripplerpc) && info[jss::ripplerpc] ==
"2.0");
436 BEAST_EXPECT(info.isMember(jss::id) && info[jss::id] == 6);
464 auto const info = env.
rpc(
"json2", withSigners);
466 info.isMember(jss::result) && info[jss::result].isMember(jss::account_data));
467 auto const&
data = info[jss::result][jss::account_data];
468 BEAST_EXPECT(
data.isMember(jss::signer_lists));
469 auto const& signerLists =
data[jss::signer_lists];
470 BEAST_EXPECT(signerLists.isArray());
471 BEAST_EXPECT(signerLists.size() == 1);
472 auto const&
signers = signerLists[0u];
474 BEAST_EXPECT(
signers[sfSignerQuorum.jsonName] == 4);
475 auto const& signerEntries =
signers[sfSignerEntries.jsonName];
476 BEAST_EXPECT(signerEntries.size() == 8);
477 for (
unsigned i = 0u; i < 8; ++i)
479 auto const& entry = signerEntries[i][sfSignerEntry.jsonName];
480 BEAST_EXPECT(entry.
size() == 2);
481 BEAST_EXPECT(entry.
isMember(sfAccount.jsonName));
482 BEAST_EXPECT(entry[sfSignerWeight.jsonName] == 1);
484 BEAST_EXPECT(info.isMember(jss::jsonrpc) && info[jss::jsonrpc] ==
"2.0");
485 BEAST_EXPECT(info.isMember(jss::ripplerpc) && info[jss::ripplerpc] ==
"2.0");
486 BEAST_EXPECT(info.isMember(jss::id) && info[jss::id] == 6);
496 Env env(*
this, features);
499 env.
fund(
XRP(1000), alice, bob);
503 params[jss::account] = account.human();
504 auto const info = env.
rpc(
"json",
"account_info",
to_string(params));
508 if (info[jss::result][jss::status] ==
"success" &&
509 info[jss::result][jss::account_flags].isMember(name))
510 res.
emplace(info[jss::result][jss::account_flags][name].asBool());
516 {{
"defaultRipple", asfDefaultRipple},
517 {
"depositAuth", asfDepositAuth},
518 {
"disallowIncomingXRP", asfDisallowXRP},
519 {
"globalFreeze", asfGlobalFreeze},
520 {
"noFreeze", asfNoFreeze},
521 {
"requireAuthorization", asfRequireAuth},
522 {
"requireDestinationTag", asfRequireDest}}};
524 for (
auto& asf : asFlags)
528 env(
fclear(alice, asf.second));
530 auto const f1 = getAccountFlag(asf.first, alice);
531 BEAST_EXPECT(f1.has_value());
532 BEAST_EXPECT(!f1.value());
536 env(
fset(alice, asf.second));
538 auto const f2 = getAccountFlag(asf.first, alice);
539 BEAST_EXPECT(f2.has_value());
540 BEAST_EXPECT(f2.value());
544 disallowIncomingFlags{
545 {{
"disallowIncomingCheck", asfDisallowIncomingCheck},
546 {
"disallowIncomingNFTokenOffer", asfDisallowIncomingNFTokenOffer},
547 {
"disallowIncomingPayChan", asfDisallowIncomingPayChan},
548 {
"disallowIncomingTrustline", asfDisallowIncomingTrustline}}};
550 for (
auto& asf : disallowIncomingFlags)
554 env(
fclear(alice, asf.second));
556 auto const f1 = getAccountFlag(asf.first, alice);
557 BEAST_EXPECT(f1.has_value());
558 BEAST_EXPECT(!f1.value());
562 env(
fset(alice, asf.second));
564 auto const f2 = getAccountFlag(asf.first, alice);
565 BEAST_EXPECT(f2.has_value());
566 BEAST_EXPECT(f2.value());
570 "allowTrustLineClawback", asfAllowTrustLineClawback};
572 if (features[featureClawback])
575 auto const f1 = getAccountFlag(allowTrustLineClawbackFlag.first, bob);
576 BEAST_EXPECT(f1.has_value());
577 BEAST_EXPECT(!f1.value());
580 env(
fset(bob, allowTrustLineClawbackFlag.second));
582 auto const f2 = getAccountFlag(allowTrustLineClawbackFlag.first, bob);
583 BEAST_EXPECT(f2.has_value());
584 BEAST_EXPECT(f2.value());
588 BEAST_EXPECT(!getAccountFlag(allowTrustLineClawbackFlag.first, bob));
592 "allowTrustLineLocking", asfAllowTrustLineLocking};
594 if (features[featureTokenEscrow])
596 auto const f1 = getAccountFlag(allowTrustLineLockingFlag.first, bob);
597 BEAST_EXPECT(f1.has_value());
598 BEAST_EXPECT(!f1.value());
601 env(
fset(bob, allowTrustLineLockingFlag.second));
603 auto const f2 = getAccountFlag(allowTrustLineLockingFlag.first, bob);
604 BEAST_EXPECT(f2.has_value());
605 BEAST_EXPECT(f2.value());
609 BEAST_EXPECT(!getAccountFlag(allowTrustLineLockingFlag.first, bob));