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";
349 expectedType =
ltAMM;
354 uNodeIndex = beast::zero;
355 jvResult[jss::error] =
"malformedRequest";
362 jvResult[jss::error] =
"malformedRequest";
376 jvResult[jss::error] =
"malformedRequest";
389 uNodeIndex = beast::zero;
390 jvResult[jss::error] =
"malformedRequest";
396 jvResult[jss::error] =
"unknownOption";
398 jvResult[jss::error] =
"invalidParams";
411 jvResult[jss::error] =
"entryNotFound";
414 (expectedType !=
ltANY) && (expectedType != sleNode->getType()))
416 jvResult[jss::error] =
"unexpectedLedgerType";
418 else if (bNodeBinary)
425 jvResult[jss::index] =
to_string(uNodeIndex);
430 jvResult[jss::index] =
to_string(uNodeIndex);
441 org::xrpl::rpc::v1::GetLedgerEntryRequest& request = context.
params;
442 org::xrpl::rpc::v1::GetLedgerEntryResponse response;
443 grpc::Status status = grpc::Status::OK;
448 grpc::Status errorStatus;
451 errorStatus = grpc::Status(
452 grpc::StatusCode::INVALID_ARGUMENT, status.message());
457 grpc::Status(grpc::StatusCode::NOT_FOUND, status.message());
459 return {response, errorStatus};
465 grpc::Status errorStatus{
466 grpc::StatusCode::INVALID_ARGUMENT,
"index malformed"};
467 return {response, errorStatus};
473 grpc::Status errorStatus{
474 grpc::StatusCode::NOT_FOUND,
"object not found"};
475 return {response, errorStatus};
482 auto& stateObject = *response.mutable_ledger_object();
484 stateObject.set_key(request.key());
485 *(response.mutable_ledger()) = request.ledger();
486 return {response, status};