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] =
127 auto& jvQueueTx = jvQueueData[jss::transactions];
132 boost::optional<std::uint32_t> lowestSeq;
133 boost::optional<std::uint32_t> highestSeq;
134 boost::optional<std::uint32_t> lowestTicket;
135 boost::optional<std::uint32_t> highestTicket;
136 bool anyAuthChanged =
false;
142 for (
auto const& tx : txs)
146 if (tx.seqProxy.isSeq())
148 assert(prevSeqProxy < tx.seqProxy);
149 prevSeqProxy = tx.seqProxy;
150 jvTx[jss::seq] = tx.seqProxy.value();
153 lowestSeq = tx.seqProxy.value();
154 highestSeq = tx.seqProxy.value();
158 assert(prevSeqProxy < tx.seqProxy);
159 prevSeqProxy = tx.seqProxy;
160 jvTx[jss::ticket] = tx.seqProxy.value();
163 lowestTicket = tx.seqProxy.value();
164 highestTicket = tx.seqProxy.value();
167 jvTx[jss::fee_level] =
to_string(tx.feeLevel);
169 jvTx[jss::LastLedgerSequence] = *tx.lastValid;
171 jvTx[jss::fee] =
to_string(tx.consequences.fee());
172 auto const spend = tx.consequences.potentialSpend() +
173 tx.consequences.fee();
174 jvTx[jss::max_spend_drops] =
to_string(spend);
176 bool const authChanged = tx.consequences.isBlocker();
178 anyAuthChanged = authChanged;
179 jvTx[jss::auth_change] = authChanged;
181 jvQueueTx.
append(std::move(jvTx));
185 jvQueueData[jss::sequence_count] = seqCount;
187 jvQueueData[jss::ticket_count] = ticketCount;
189 jvQueueData[jss::lowest_sequence] = *lowestSeq;
191 jvQueueData[jss::highest_sequence] = *highestSeq;
193 jvQueueData[jss::lowest_ticket] = *lowestTicket;
195 jvQueueData[jss::highest_ticket] = *highestTicket;
197 jvQueueData[jss::auth_change_queued] = anyAuthChanged;
198 jvQueueData[jss::max_spend_drops_total] =
to_string(totalSpend);
201 jvQueueData[jss::txn_count] = 0u;
203 result[jss::queue_data] = std::move(jvQueueData);
220 org::xrpl::rpc::v1::GetAccountInfoResponse result;
221 grpc::Status status = grpc::Status::OK;
224 org::xrpl::rpc::v1::GetAccountInfoRequest& params = context.
params;
229 if (lgrStatus || !ledger)
231 grpc::Status errorStatus;
234 errorStatus = grpc::Status(
235 grpc::StatusCode::INVALID_ARGUMENT, lgrStatus.message());
240 grpc::Status(grpc::StatusCode::NOT_FOUND, lgrStatus.message());
242 return {result, errorStatus};
245 result.set_ledger_index(ledger->
info().
seq);
246 result.set_validated(
256 grpc::Status errorStatus{
257 grpc::StatusCode::INVALID_ARGUMENT,
"invalid account"};
258 return {result, errorStatus};
265 RPC::convert(*result.mutable_account_data(), *sleAccepted);
268 if (params.signer_lists())
273 org::xrpl::rpc::v1::SignerList& signerListProto =
274 *result.mutable_signer_list();
284 grpc::Status errorStatus{
285 grpc::StatusCode::INVALID_ARGUMENT,
286 "requested queue but ledger is not open"};
287 return {result, errorStatus};
291 org::xrpl::rpc::v1::QueueData& queueData =
292 *result.mutable_queue_data();
298 grpc::Status errorStatus{
299 grpc::StatusCode::NOT_FOUND,
"account not found"};
300 return {result, errorStatus};
303 return {result, status};