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);
135 jvQueueData[jss::txn_count] =
138 auto& jvQueueTx = jvQueueData[jss::transactions];
147 bool anyAuthChanged =
false;
153 for (
auto const& tx : txs)
157 if (tx.seqProxy.isSeq())
159 assert(prevSeqProxy < tx.seqProxy);
160 prevSeqProxy = tx.seqProxy;
161 jvTx[jss::seq] = tx.seqProxy.value();
164 lowestSeq = tx.seqProxy.
value();
165 highestSeq = tx.seqProxy.
value();
169 assert(prevSeqProxy < tx.seqProxy);
170 prevSeqProxy = tx.seqProxy;
171 jvTx[jss::ticket] = tx.seqProxy.value();
174 lowestTicket = tx.seqProxy.
value();
175 highestTicket = tx.seqProxy.
value();
178 jvTx[jss::fee_level] =
to_string(tx.feeLevel);
180 jvTx[jss::LastLedgerSequence] = *tx.lastValid;
182 jvTx[jss::fee] =
to_string(tx.consequences.fee());
183 auto const spend = tx.consequences.potentialSpend() +
184 tx.consequences.fee();
185 jvTx[jss::max_spend_drops] =
to_string(spend);
187 bool const authChanged = tx.consequences.isBlocker();
189 anyAuthChanged = authChanged;
190 jvTx[jss::auth_change] = authChanged;
192 jvQueueTx.
append(std::move(jvTx));
196 jvQueueData[jss::sequence_count] = seqCount;
198 jvQueueData[jss::ticket_count] = ticketCount;
200 jvQueueData[jss::lowest_sequence] = *lowestSeq;
202 jvQueueData[jss::highest_sequence] = *highestSeq;
204 jvQueueData[jss::lowest_ticket] = *lowestTicket;
206 jvQueueData[jss::highest_ticket] = *highestTicket;
208 jvQueueData[jss::auth_change_queued] = anyAuthChanged;
209 jvQueueData[jss::max_spend_drops_total] =
to_string(totalSpend);
212 jvQueueData[jss::txn_count] = 0u;
214 result[jss::queue_data] = std::move(jvQueueData);
231 org::xrpl::rpc::v1::GetAccountInfoResponse result;
232 grpc::Status status = grpc::Status::OK;
235 org::xrpl::rpc::v1::GetAccountInfoRequest& params = context.
params;
240 if (lgrStatus || !ledger)
242 grpc::Status errorStatus;
245 errorStatus = grpc::Status(
246 grpc::StatusCode::INVALID_ARGUMENT, lgrStatus.message());
251 grpc::Status(grpc::StatusCode::NOT_FOUND, lgrStatus.message());
253 return {result, errorStatus};
256 result.set_ledger_index(ledger->
info().
seq);
257 result.set_validated(
267 grpc::Status errorStatus{
268 grpc::StatusCode::INVALID_ARGUMENT,
"invalid account"};
269 return {result, errorStatus};
276 RPC::convert(*result.mutable_account_data(), *sleAccepted);
279 if (params.signer_lists())
284 org::xrpl::rpc::v1::SignerList& signerListProto =
285 *result.mutable_signer_list();
295 grpc::Status errorStatus{
296 grpc::StatusCode::INVALID_ARGUMENT,
297 "requested queue but ledger is not open"};
298 return {result, errorStatus};
302 org::xrpl::rpc::v1::QueueData& queueData =
303 *result.mutable_queue_data();
309 grpc::Status errorStatus{
310 grpc::StatusCode::NOT_FOUND,
"account not found"};
311 return {result, errorStatus};
314 return {result, status};