20 #include <ripple/app/main/Application.h>
21 #include <ripple/basics/StringUtilities.h>
22 #include <ripple/basics/strHex.h>
23 #include <ripple/json/json_errors.h>
24 #include <ripple/ledger/ReadView.h>
25 #include <ripple/net/RPCErr.h>
26 #include <ripple/protocol/ErrorCodes.h>
27 #include <ripple/protocol/Indexes.h>
28 #include <ripple/protocol/jss.h>
29 #include <ripple/rpc/Context.h>
30 #include <ripple/rpc/GRPCHandlers.h>
31 #include <ripple/rpc/impl/RPCHelpers.h>
50 bool bNodeBinary =
false;
59 uNodeIndex = beast::zero;
60 jvResult[jss::error] =
"malformedRequest";
66 auto const account = parseBase58<AccountID>(
68 if (!account || account->
isZero())
69 jvResult[jss::error] =
"malformedAddress";
78 uNodeIndex = beast::zero;
79 jvResult[jss::error] =
"malformedRequest";
92 uNodeIndex = beast::zero;
93 jvResult[jss::error] =
"malformedRequest";
101 !context.
params[jss::deposit_preauth][jss::authorized]
104 jvResult[jss::error] =
"malformedRequest";
108 auto const owner = parseBase58<AccountID>(
109 context.
params[jss::deposit_preauth][jss::owner]
112 auto const authorized = parseBase58<AccountID>(
113 context.
params[jss::deposit_preauth][jss::authorized]
117 jvResult[jss::error] =
"malformedOwner";
119 jvResult[jss::error] =
"malformedAuthorized";
130 jvResult[jss::error] =
"malformedRequest";
137 uNodeIndex = beast::zero;
138 jvResult[jss::error] =
"malformedRequest";
145 jvResult[jss::error] =
"malformedRequest";
151 ? context.
params[jss::directory][jss::sub_index].
asUInt()
161 jvResult[jss::error] =
"malformedRequest";
164 context.
params[jss::directory][jss::dir_root]
167 uNodeIndex = beast::zero;
168 jvResult[jss::error] =
"malformedRequest";
177 auto const ownerID = parseBase58<AccountID>(
182 jvResult[jss::error] =
"malformedAddress";
193 jvResult[jss::error] =
"malformedRequest";
205 uNodeIndex = beast::zero;
206 jvResult[jss::error] =
"malformedRequest";
214 jvResult[jss::error] =
"malformedRequest";
218 auto const id = parseBase58<AccountID>(
221 jvResult[jss::error] =
"malformedOwner";
236 uNodeIndex = beast::zero;
237 jvResult[jss::error] =
"malformedRequest";
245 jvResult[jss::error] =
"malformedRequest";
249 auto const id = parseBase58<AccountID>(
252 jvResult[jss::error] =
"malformedAddress";
267 uNodeIndex = beast::zero;
268 jvResult[jss::error] =
"malformedRequest";
278 !jvRippleState.
isMember(jss::currency) ||
279 !jvRippleState.
isMember(jss::accounts) ||
280 !jvRippleState[jss::accounts].
isArray() ||
281 2 != jvRippleState[jss::accounts].
size() ||
282 !jvRippleState[jss::accounts][0u].
isString() ||
283 !jvRippleState[jss::accounts][1u].
isString() ||
284 (jvRippleState[jss::accounts][0u].
asString() ==
285 jvRippleState[jss::accounts][1u].
asString()))
287 jvResult[jss::error] =
"malformedRequest";
291 auto const id1 = parseBase58<AccountID>(
292 jvRippleState[jss::accounts][0u].asString());
293 auto const id2 = parseBase58<AccountID>(
294 jvRippleState[jss::accounts][1u].asString());
297 jvResult[jss::error] =
"malformedAddress";
301 jvRippleState[jss::currency].asString()))
303 jvResult[jss::error] =
"malformedCurrency";
319 uNodeIndex = beast::zero;
320 jvResult[jss::error] =
"malformedRequest";
328 jvResult[jss::error] =
"malformedRequest";
332 auto const id = parseBase58<AccountID>(
335 jvResult[jss::error] =
"malformedAddress";
351 uNodeIndex = beast::zero;
352 jvResult[jss::error] =
"malformedRequest";
357 jvResult[jss::error] =
"malformedRequest";
362 expectedType =
ltAMM;
367 uNodeIndex = beast::zero;
368 jvResult[jss::error] =
"malformedRequest";
375 jvResult[jss::error] =
"malformedRequest";
389 jvResult[jss::error] =
"malformedRequest";
403 uNodeIndex = beast::zero;
404 jvResult[jss::error] =
"malformedRequest";
410 jvResult[jss::error] =
"unknownOption";
412 jvResult[jss::error] =
"invalidParams";
423 uNodeIndex = beast::zero;
424 jvResult[jss::error] =
"invalidParams";
439 jvResult[jss::error] =
"entryNotFound";
442 (expectedType !=
ltANY) && (expectedType != sleNode->getType()))
444 jvResult[jss::error] =
"unexpectedLedgerType";
446 else if (bNodeBinary)
453 jvResult[jss::index] =
to_string(uNodeIndex);
458 jvResult[jss::index] =
to_string(uNodeIndex);
469 org::xrpl::rpc::v1::GetLedgerEntryRequest& request = context.
params;
470 org::xrpl::rpc::v1::GetLedgerEntryResponse response;
471 grpc::Status status = grpc::Status::OK;
476 grpc::Status errorStatus;
479 errorStatus = grpc::Status(
480 grpc::StatusCode::INVALID_ARGUMENT, status.message());
485 grpc::Status(grpc::StatusCode::NOT_FOUND, status.message());
487 return {response, errorStatus};
493 grpc::Status errorStatus{
494 grpc::StatusCode::INVALID_ARGUMENT,
"index malformed"};
495 return {response, errorStatus};
501 grpc::Status errorStatus{
502 grpc::StatusCode::NOT_FOUND,
"object not found"};
503 return {response, errorStatus};
510 auto& stateObject = *response.mutable_ledger_object();
512 stateObject.set_key(request.key());
513 *(response.mutable_ledger()) = request.ledger();
514 return {response, status};