20 #include <ripple/app/main/Application.h>
21 #include <ripple/app/misc/TxQ.h>
22 #include <ripple/json/json_value.h>
23 #include <ripple/ledger/ReadView.h>
24 #include <ripple/protocol/ErrorCodes.h>
25 #include <ripple/protocol/Indexes.h>
26 #include <ripple/protocol/jss.h>
27 #include <ripple/protocol/UintTypes.h>
28 #include <ripple/rpc/Context.h>
29 #include <ripple/rpc/GRPCHandlers.h>
30 #include <ripple/rpc/impl/RPCHelpers.h>
31 #include <ripple/rpc/impl/GRPCHelpers.h>
32 #include <grpc/status.h>
54 auto& params = context.
params;
57 if (params.isMember(jss::account))
58 strIdent = params[jss::account].asString();
59 else if (params.isMember(jss::ident))
60 strIdent = params[jss::ident].asString();
70 bool bStrict = params.isMember (jss::strict) && params[jss::strict].asBool ();
83 auto const queue = params.isMember(jss::queue) &&
84 params[jss::queue].asBool();
86 if (queue && !ledger->
open())
95 result[jss::account_data] = jvAccepted;
98 if (params.isMember (jss::signer_lists) &&
99 params[jss::signer_lists].asBool ())
111 result[jss::account_data][jss::signer_lists] =
112 std::move(jvSignerList);
123 jvQueueData[jss::txn_count] =
static_cast<Json::UInt>(txs.size());
124 jvQueueData[jss::lowest_sequence] = txs.
begin()->first;
125 jvQueueData[jss::highest_sequence] = txs.rbegin()->first;
127 auto& jvQueueTx = jvQueueData[jss::transactions];
130 boost::optional<bool> anyAuthChanged(
false);
131 boost::optional<XRPAmount> totalSpend(0);
133 for (
auto const& [txSeq, txDetails] : txs)
137 jvTx[jss::seq] = txSeq;
138 jvTx[jss::fee_level] =
to_string(txDetails.feeLevel);
139 if (txDetails.lastValid)
140 jvTx[jss::LastLedgerSequence] = *txDetails.lastValid;
141 if (txDetails.consequences)
144 txDetails.consequences->fee);
145 auto spend = txDetails.consequences->potentialSpend +
146 txDetails.consequences->fee;
147 jvTx[jss::max_spend_drops] =
to_string(spend);
149 *totalSpend += spend;
150 auto authChanged = txDetails.consequences->category ==
153 anyAuthChanged.emplace(authChanged);
154 jvTx[jss::auth_change] = authChanged;
158 if (anyAuthChanged && !*anyAuthChanged)
159 anyAuthChanged.reset();
163 jvQueueTx.
append(std::move(jvTx));
167 jvQueueData[jss::auth_change_queued] =
170 jvQueueData[jss::max_spend_drops_total] =
174 jvQueueData[jss::txn_count] = 0u;
176 result[jss::queue_data] = std::move(jvQueueData);
192 org::xrpl::rpc::v1::GetAccountInfoResponse result;
193 grpc::Status status = grpc::Status::OK;
196 org::xrpl::rpc::v1::GetAccountInfoRequest& params = context.
params;
201 if (lgrStatus || !ledger)
203 grpc::Status errorStatus;
206 errorStatus = grpc::Status(
207 grpc::StatusCode::INVALID_ARGUMENT, lgrStatus.message());
212 grpc::Status(grpc::StatusCode::NOT_FOUND, lgrStatus.message());
214 return {result, errorStatus};
217 result.set_ledger_index(ledger->
info().
seq);
218 result.set_validated(
228 grpc::Status errorStatus{grpc::StatusCode::INVALID_ARGUMENT,
230 return {result, errorStatus};
237 RPC::convert(*result.mutable_account_data(), *sleAccepted);
240 if (params.signer_lists())
245 org::xrpl::rpc::v1::SignerList& signerListProto =
246 *result.mutable_signer_list();
256 grpc::Status errorStatus{
257 grpc::StatusCode::INVALID_ARGUMENT,
258 "requested queue but ledger is not open"};
259 return {result, errorStatus};
263 org::xrpl::rpc::v1::QueueData& queueData = *result.mutable_queue_data();
269 grpc::Status errorStatus{grpc::StatusCode::NOT_FOUND,
270 "account not found"};
271 return {result, errorStatus};
274 return {result, status};