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())
118 result[jss::account_data][jss::signer_lists] =
119 std::move(jvSignerList);
123 result[jss::signer_lists] = std::move(jvSignerList);
134 jvQueueData[jss::txn_count] =
137 auto& jvQueueTx = jvQueueData[jss::transactions];
146 bool anyAuthChanged =
false;
152 for (
auto const& tx : txs)
156 if (tx.seqProxy.isSeq())
158 assert(prevSeqProxy < tx.seqProxy);
159 prevSeqProxy = tx.seqProxy;
160 jvTx[jss::seq] = tx.seqProxy.value();
163 lowestSeq = tx.seqProxy.
value();
164 highestSeq = tx.seqProxy.
value();
168 assert(prevSeqProxy < tx.seqProxy);
169 prevSeqProxy = tx.seqProxy;
170 jvTx[jss::ticket] = tx.seqProxy.value();
173 lowestTicket = tx.seqProxy.
value();
174 highestTicket = tx.seqProxy.
value();
177 jvTx[jss::fee_level] =
to_string(tx.feeLevel);
179 jvTx[jss::LastLedgerSequence] = *tx.lastValid;
181 jvTx[jss::fee] =
to_string(tx.consequences.fee());
182 auto const spend = tx.consequences.potentialSpend() +
183 tx.consequences.fee();
184 jvTx[jss::max_spend_drops] =
to_string(spend);
186 bool const authChanged = tx.consequences.isBlocker();
188 anyAuthChanged = authChanged;
189 jvTx[jss::auth_change] = authChanged;
191 jvQueueTx.
append(std::move(jvTx));
195 jvQueueData[jss::sequence_count] = seqCount;
197 jvQueueData[jss::ticket_count] = ticketCount;
199 jvQueueData[jss::lowest_sequence] = *lowestSeq;
201 jvQueueData[jss::highest_sequence] = *highestSeq;
203 jvQueueData[jss::lowest_ticket] = *lowestTicket;
205 jvQueueData[jss::highest_ticket] = *highestTicket;
207 jvQueueData[jss::auth_change_queued] = anyAuthChanged;
208 jvQueueData[jss::max_spend_drops_total] =
to_string(totalSpend);
211 jvQueueData[jss::txn_count] = 0u;
213 result[jss::queue_data] = std::move(jvQueueData);
218 result[jss::account] =
toBase58(accountID);
230 org::xrpl::rpc::v1::GetAccountInfoResponse result;
231 grpc::Status status = grpc::Status::OK;
234 org::xrpl::rpc::v1::GetAccountInfoRequest& params = context.
params;
239 if (lgrStatus || !ledger)
241 grpc::Status errorStatus;
244 errorStatus = grpc::Status(
245 grpc::StatusCode::INVALID_ARGUMENT, lgrStatus.message());
250 grpc::Status(grpc::StatusCode::NOT_FOUND, lgrStatus.message());
252 return {result, errorStatus};
255 result.set_ledger_index(ledger->
info().
seq);
256 result.set_validated(
266 grpc::Status errorStatus{
267 grpc::StatusCode::INVALID_ARGUMENT,
"invalid account"};
268 return {result, errorStatus};
275 RPC::convert(*result.mutable_account_data(), *sleAccepted);
278 if (params.signer_lists())
283 org::xrpl::rpc::v1::SignerList& signerListProto =
284 *result.mutable_signer_list();
294 grpc::Status errorStatus{
295 grpc::StatusCode::INVALID_ARGUMENT,
296 "requested queue but ledger is not open"};
297 return {result, errorStatus};
301 org::xrpl::rpc::v1::QueueData& queueData =
302 *result.mutable_queue_data();
308 grpc::Status errorStatus{
309 grpc::StatusCode::NOT_FOUND,
"account not found"};
310 return {result, errorStatus};
313 return {result, status};