20 #include <ripple/app/main/Application.h>
21 #include <ripple/basics/StringUtilities.h>
22 #include <ripple/basics/strHex.h>
23 #include <ripple/ledger/ReadView.h>
24 #include <ripple/net/RPCErr.h>
25 #include <ripple/protocol/ErrorCodes.h>
26 #include <ripple/protocol/Indexes.h>
27 #include <ripple/protocol/jss.h>
28 #include <ripple/rpc/Context.h>
29 #include <ripple/rpc/GRPCHandlers.h>
30 #include <ripple/rpc/impl/RPCHelpers.h>
49 bool bNodeBinary =
false;
56 uNodeIndex = beast::zero;
57 jvResult[jss::error] =
"malformedRequest";
63 auto const account = parseBase58<AccountID>(
65 if (!account || account->
isZero())
66 jvResult[jss::error] =
"malformedAddress";
76 uNodeIndex = beast::zero;
77 jvResult[jss::error] =
"malformedRequest";
90 uNodeIndex = beast::zero;
91 jvResult[jss::error] =
"malformedRequest";
100 jvResult[jss::error] =
"malformedRequest";
104 auto const owner = parseBase58<AccountID>(
107 auto const authorized = parseBase58<AccountID>(
108 context.
params[jss::deposit_preauth][jss::authorized]
112 jvResult[jss::error] =
"malformedOwner";
114 jvResult[jss::error] =
"malformedAuthorized";
124 jvResult[jss::error] =
"malformedRequest";
130 uNodeIndex = beast::zero;
131 jvResult[jss::error] =
"malformedRequest";
138 jvResult[jss::error] =
"malformedRequest";
144 ? context.
params[jss::directory][jss::sub_index].
asUInt()
154 jvResult[jss::error] =
"malformedRequest";
157 context.
params[jss::directory][jss::dir_root]
160 uNodeIndex = beast::zero;
161 jvResult[jss::error] =
"malformedRequest";
170 auto const ownerID = parseBase58<AccountID>(
175 jvResult[jss::error] =
"malformedAddress";
185 jvResult[jss::error] =
"malformedRequest";
196 uNodeIndex = beast::zero;
197 jvResult[jss::error] =
"malformedRequest";
205 jvResult[jss::error] =
"malformedRequest";
209 auto const id = parseBase58<AccountID>(
212 jvResult[jss::error] =
"malformedOwner";
227 uNodeIndex = beast::zero;
228 jvResult[jss::error] =
"malformedRequest";
236 jvResult[jss::error] =
"malformedRequest";
240 auto const id = parseBase58<AccountID>(
243 jvResult[jss::error] =
"malformedAddress";
258 uNodeIndex = beast::zero;
259 jvResult[jss::error] =
"malformedRequest";
269 !jvRippleState.
isMember(jss::currency) ||
270 !jvRippleState.
isMember(jss::accounts) ||
271 !jvRippleState[jss::accounts].
isArray() ||
272 2 != jvRippleState[jss::accounts].
size() ||
273 !jvRippleState[jss::accounts][0u].
isString() ||
274 !jvRippleState[jss::accounts][1u].
isString() ||
275 (jvRippleState[jss::accounts][0u].
asString() ==
276 jvRippleState[jss::accounts][1u].
asString()))
278 jvResult[jss::error] =
"malformedRequest";
282 auto const id1 = parseBase58<AccountID>(
283 jvRippleState[jss::accounts][0u].asString());
284 auto const id2 = parseBase58<AccountID>(
285 jvRippleState[jss::accounts][1u].asString());
288 jvResult[jss::error] =
"malformedAddress";
291 uCurrency, jvRippleState[jss::currency].asString()))
293 jvResult[jss::error] =
"malformedCurrency";
308 uNodeIndex = beast::zero;
309 jvResult[jss::error] =
"malformedRequest";
317 jvResult[jss::error] =
"malformedRequest";
321 auto const id = parseBase58<AccountID>(
324 jvResult[jss::error] =
"malformedAddress";
327 *
id, context.
params[jss::ticket][jss::ticket_seq].
asUInt());
338 uNodeIndex = beast::zero;
339 jvResult[jss::error] =
"malformedRequest";
344 jvResult[jss::error] =
"malformedRequest";
356 uNodeIndex = beast::zero;
357 jvResult[jss::error] =
"malformedRequest";
361 jvResult[jss::error] =
"unknownOption";
373 jvResult[jss::error] =
"entryNotFound";
376 (expectedType !=
ltANY) && (expectedType != sleNode->getType()))
378 jvResult[jss::error] =
"unexpectedLedgerType";
380 else if (bNodeBinary)
387 jvResult[jss::index] =
to_string(uNodeIndex);
392 jvResult[jss::index] =
to_string(uNodeIndex);
403 org::xrpl::rpc::v1::GetLedgerEntryRequest& request = context.
params;
404 org::xrpl::rpc::v1::GetLedgerEntryResponse response;
405 grpc::Status status = grpc::Status::OK;
410 grpc::Status errorStatus;
413 errorStatus = grpc::Status(
414 grpc::StatusCode::INVALID_ARGUMENT, status.message());
419 grpc::Status(grpc::StatusCode::NOT_FOUND, status.message());
421 return {response, errorStatus};
427 grpc::Status errorStatus{
428 grpc::StatusCode::INVALID_ARGUMENT,
"index malformed"};
429 return {response, errorStatus};
435 grpc::Status errorStatus{
436 grpc::StatusCode::NOT_FOUND,
"object not found"};
437 return {response, errorStatus};
444 auto& stateObject = *response.mutable_ledger_object();
446 stateObject.set_key(request.key());
447 *(response.mutable_ledger()) = request.ledger();
448 return {response, status};