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/UintTypes.h>
27 #include <ripple/protocol/jss.h>
28 #include <ripple/rpc/Context.h>
29 #include <ripple/rpc/GRPCHandlers.h>
30 #include <ripple/rpc/impl/GRPCHelpers.h>
31 #include <ripple/rpc/impl/RPCHelpers.h>
32 #include <grpc/status.h>
55 auto& params = context.
params;
58 if (params.isMember(jss::account))
59 strIdent = params[jss::account].asString();
60 else if (params.isMember(jss::ident))
61 strIdent = params[jss::ident].asString();
71 bool bStrict = params.isMember(jss::strict) && params[jss::strict].asBool();
85 params.isMember(jss::queue) && params[jss::queue].asBool();
87 if (queue && !ledger->
open())
96 result[jss::account_data] = jvAccepted;
99 if (params.isMember(jss::signer_lists) &&
100 params[jss::signer_lists].asBool())
112 result[jss::account_data][jss::signer_lists] =
113 std::move(jvSignerList);
124 jvQueueData[jss::txn_count] =
126 jvQueueData[jss::lowest_sequence] = txs.
begin()->first;
127 jvQueueData[jss::highest_sequence] = txs.rbegin()->first;
129 auto& jvQueueTx = jvQueueData[jss::transactions];
132 boost::optional<bool> anyAuthChanged(
false);
133 boost::optional<XRPAmount> totalSpend(0);
135 for (
auto const& [txSeq, txDetails] : txs)
139 jvTx[jss::seq] = txSeq;
140 jvTx[jss::fee_level] =
to_string(txDetails.feeLevel);
141 if (txDetails.lastValid)
142 jvTx[jss::LastLedgerSequence] = *txDetails.lastValid;
143 if (txDetails.consequences)
145 jvTx[jss::fee] =
to_string(txDetails.consequences->fee);
146 auto spend = txDetails.consequences->potentialSpend +
147 txDetails.consequences->fee;
148 jvTx[jss::max_spend_drops] =
to_string(spend);
150 *totalSpend += spend;
151 auto authChanged = txDetails.consequences->category ==
154 anyAuthChanged.emplace(authChanged);
155 jvTx[jss::auth_change] = authChanged;
159 if (anyAuthChanged && !*anyAuthChanged)
160 anyAuthChanged.reset();
164 jvQueueTx.
append(std::move(jvTx));
168 jvQueueData[jss::auth_change_queued] = *anyAuthChanged;
170 jvQueueData[jss::max_spend_drops_total] =
174 jvQueueData[jss::txn_count] = 0u;
176 result[jss::queue_data] = std::move(jvQueueData);
193 org::xrpl::rpc::v1::GetAccountInfoResponse result;
194 grpc::Status status = grpc::Status::OK;
197 org::xrpl::rpc::v1::GetAccountInfoRequest& params = context.
params;
202 if (lgrStatus || !ledger)
204 grpc::Status errorStatus;
207 errorStatus = grpc::Status(
208 grpc::StatusCode::INVALID_ARGUMENT, lgrStatus.message());
213 grpc::Status(grpc::StatusCode::NOT_FOUND, lgrStatus.message());
215 return {result, errorStatus};
218 result.set_ledger_index(ledger->
info().
seq);
219 result.set_validated(
229 grpc::Status errorStatus{
230 grpc::StatusCode::INVALID_ARGUMENT,
"invalid account"};
231 return {result, errorStatus};
238 RPC::convert(*result.mutable_account_data(), *sleAccepted);
241 if (params.signer_lists())
246 org::xrpl::rpc::v1::SignerList& signerListProto =
247 *result.mutable_signer_list();
257 grpc::Status errorStatus{
258 grpc::StatusCode::INVALID_ARGUMENT,
259 "requested queue but ledger is not open"};
260 return {result, errorStatus};
264 org::xrpl::rpc::v1::QueueData& queueData =
265 *result.mutable_queue_data();
271 grpc::Status errorStatus{
272 grpc::StatusCode::NOT_FOUND,
"account not found"};
273 return {result, errorStatus};
276 return {result, status};