85 auto& params = context.
params;
88 if (params.isMember(jss::account))
90 if (!params[jss::account].isString())
92 strIdent = params[jss::account].asString();
94 else if (params.isMember(jss::ident))
96 if (!params[jss::ident].isString())
98 strIdent = params[jss::ident].asString();
118 auto const accountID{
id.value()};
121 static constexpr auto kAccountRootFlags =
122 std::to_array<std::pair<std::string_view, LedgerSpecificFlags>>(
123 {{
"allowTrustLineClawback", lsfAllowTrustLineClawback},
124 {
"defaultRipple", lsfDefaultRipple},
125 {
"depositAuth", lsfDepositAuth},
126 {
"disableMasterKey", lsfDisableMaster},
127 {
"disallowIncomingCheck", lsfDisallowIncomingCheck},
128 {
"disallowIncomingNFTokenOffer", lsfDisallowIncomingNFTokenOffer},
129 {
"disallowIncomingPayChan", lsfDisallowIncomingPayChan},
130 {
"disallowIncomingTrustline", lsfDisallowIncomingTrustline},
131 {
"disallowIncomingXRP", lsfDisallowXRP},
132 {
"globalFreeze", lsfGlobalFreeze},
133 {
"noFreeze", lsfNoFreeze},
134 {
"passwordSpent", lsfPasswordSpent},
135 {
"requireAuthorization", lsfRequireAuth},
136 {
"requireDestinationTag", lsfRequireDestTag}});
140 static auto const kAmendmentGatedFlags =
141 std::to_array<std::tuple<std::string_view, LedgerSpecificFlags, UInt256 const&>>(
142 {{
"allowTrustLineLocking", lsfAllowTrustLineLocking, featureTokenEscrow}});
148 kAccountRootFlags.size() + kAmendmentGatedFlags.size() == getAccountRootFlags().size(),
149 "xrpl::doAccountInfo",
150 "number of account flags");
155 auto const queue = params.isMember(jss::queue) && params[jss::queue].asBool();
157 if (queue && !ledger->open())
167 result[jss::account_data] = jvAccepted;
170 for (
auto const& [name, flag] : kAccountRootFlags)
171 acctFlags[name.data()] = sleAccepted->isFlag(flag);
173 for (
auto const& [name, flag, amendment] : kAmendmentGatedFlags)
175 if (ledger->rules().enabled(amendment))
176 acctFlags[name.data()] = sleAccepted->isFlag(flag);
179 result[jss::account_flags] = std::move(acctFlags);
182 for (
auto const& pseudoField : pseudoFields)
184 if (sleAccepted->isFieldPresent(*pseudoField))
191 XRPL_ASSERT_PARTS(!name.
empty(),
"xrpl::doAccountInfo",
"name is not empty");
195 result[jss::pseudo_account][jss::type] = name;
204 if (context.
apiVersion > 1u && params.isMember(jss::signer_lists) &&
205 !params[jss::signer_lists].isBool())
212 if (params.isMember(jss::signer_lists) && params[jss::signer_lists].asBool())
230 result[jss::account_data][jss::signer_lists] = std::move(jvSignerList);
234 result[jss::signer_lists] = std::move(jvSignerList);
245 jvQueueData[jss::txn_count] =
static_cast<json::UInt>(txs.size());
247 auto& jvQueueTx = jvQueueData[jss::transactions];
256 bool anyAuthChanged =
false;
262 for (
auto const& tx : txs)
266 if (tx.seqProxy.isSeq())
269 prevSeqProxy < tx.seqProxy,
"doAccountInfo : first sorted proxy");
270 prevSeqProxy = tx.seqProxy;
271 jvTx[jss::seq] = tx.seqProxy.value();
274 lowestSeq = tx.seqProxy.
value();
275 highestSeq = tx.seqProxy.
value();
280 prevSeqProxy < tx.seqProxy,
"doAccountInfo : second sorted proxy");
281 prevSeqProxy = tx.seqProxy;
282 jvTx[jss::ticket] = tx.seqProxy.value();
285 lowestTicket = tx.seqProxy.
value();
286 highestTicket = tx.seqProxy.
value();
289 jvTx[jss::fee_level] =
to_string(tx.feeLevel);
291 jvTx[jss::LastLedgerSequence] = *tx.lastValid;
293 jvTx[jss::fee] =
to_string(tx.consequences.fee());
294 auto const spend = tx.consequences.potentialSpend() + tx.consequences.fee();
295 jvTx[jss::max_spend_drops] =
to_string(spend);
297 bool const authChanged = tx.consequences.isBlocker();
299 anyAuthChanged = authChanged;
300 jvTx[jss::auth_change] = authChanged;
302 jvQueueTx.
append(std::move(jvTx));
306 jvQueueData[jss::sequence_count] = seqCount;
307 if (ticketCount != 0u)
308 jvQueueData[jss::ticket_count] = ticketCount;
310 jvQueueData[jss::lowest_sequence] = *lowestSeq;
312 jvQueueData[jss::highest_sequence] = *highestSeq;
314 jvQueueData[jss::lowest_ticket] = *lowestTicket;
316 jvQueueData[jss::highest_ticket] = *highestTicket;
318 jvQueueData[jss::auth_change_queued] = anyAuthChanged;
319 jvQueueData[jss::max_spend_drops_total] =
to_string(totalSpend);
323 jvQueueData[jss::txn_count] = 0u;
326 result[jss::queue_data] = std::move(jvQueueData);
331 result[jss::account] =
toBase58(accountID);
json::Value getJson(JsonOptions options=JsonOptions::Values::None) const override