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/GRPCHelpers.h>
31 #include <ripple/rpc/impl/RPCHelpers.h>
50 bool bNodeBinary =
false;
57 uNodeIndex = beast::zero;
58 jvResult[jss::error] =
"malformedRequest";
64 auto const account = parseBase58<AccountID>(
66 if (!account || account->
isZero())
67 jvResult[jss::error] =
"malformedAddress";
77 uNodeIndex = beast::zero;
78 jvResult[jss::error] =
"malformedRequest";
91 uNodeIndex = beast::zero;
92 jvResult[jss::error] =
"malformedRequest";
101 jvResult[jss::error] =
"malformedRequest";
105 auto const owner = parseBase58<AccountID>(
108 auto const authorized = parseBase58<AccountID>(
109 context.
params[jss::deposit_preauth][jss::authorized]
113 jvResult[jss::error] =
"malformedOwner";
115 jvResult[jss::error] =
"malformedAuthorized";
125 jvResult[jss::error] =
"malformedRequest";
131 uNodeIndex = beast::zero;
132 jvResult[jss::error] =
"malformedRequest";
139 jvResult[jss::error] =
"malformedRequest";
145 ? context.
params[jss::directory][jss::sub_index].
asUInt()
155 jvResult[jss::error] =
"malformedRequest";
158 context.
params[jss::directory][jss::dir_root]
161 uNodeIndex = beast::zero;
162 jvResult[jss::error] =
"malformedRequest";
171 auto const ownerID = parseBase58<AccountID>(
176 jvResult[jss::error] =
"malformedAddress";
186 jvResult[jss::error] =
"malformedRequest";
197 uNodeIndex = beast::zero;
198 jvResult[jss::error] =
"malformedRequest";
206 jvResult[jss::error] =
"malformedRequest";
210 auto const id = parseBase58<AccountID>(
213 jvResult[jss::error] =
"malformedOwner";
228 uNodeIndex = beast::zero;
229 jvResult[jss::error] =
"malformedRequest";
237 jvResult[jss::error] =
"malformedRequest";
241 auto const id = parseBase58<AccountID>(
244 jvResult[jss::error] =
"malformedAddress";
259 uNodeIndex = beast::zero;
260 jvResult[jss::error] =
"malformedRequest";
270 !jvRippleState.
isMember(jss::currency) ||
271 !jvRippleState.
isMember(jss::accounts) ||
272 !jvRippleState[jss::accounts].
isArray() ||
273 2 != jvRippleState[jss::accounts].
size() ||
274 !jvRippleState[jss::accounts][0u].
isString() ||
275 !jvRippleState[jss::accounts][1u].
isString() ||
276 (jvRippleState[jss::accounts][0u].
asString() ==
277 jvRippleState[jss::accounts][1u].
asString()))
279 jvResult[jss::error] =
"malformedRequest";
283 auto const id1 = parseBase58<AccountID>(
284 jvRippleState[jss::accounts][0u].asString());
285 auto const id2 = parseBase58<AccountID>(
286 jvRippleState[jss::accounts][1u].asString());
289 jvResult[jss::error] =
"malformedAddress";
292 uCurrency, jvRippleState[jss::currency].asString()))
294 jvResult[jss::error] =
"malformedCurrency";
309 uNodeIndex = beast::zero;
310 jvResult[jss::error] =
"malformedRequest";
318 jvResult[jss::error] =
"malformedRequest";
322 auto const id = parseBase58<AccountID>(
325 jvResult[jss::error] =
"malformedAddress";
328 *
id, context.
params[jss::ticket][jss::ticket_seq].
asUInt());
333 jvResult[jss::error] =
"unknownOption";
345 jvResult[jss::error] =
"entryNotFound";
348 (expectedType !=
ltANY) && (expectedType != sleNode->getType()))
350 jvResult[jss::error] =
"malformedRequest";
352 else if (bNodeBinary)
359 jvResult[jss::index] =
to_string(uNodeIndex);
364 jvResult[jss::index] =
to_string(uNodeIndex);
375 org::xrpl::rpc::v1::GetLedgerEntryRequest& request = context.
params;
376 org::xrpl::rpc::v1::GetLedgerEntryResponse response;
377 grpc::Status status = grpc::Status::OK;
382 grpc::Status errorStatus;
385 errorStatus = grpc::Status(
386 grpc::StatusCode::INVALID_ARGUMENT, status.message());
391 grpc::Status(grpc::StatusCode::NOT_FOUND, status.message());
393 return {response, errorStatus};
399 grpc::Status errorStatus{
400 grpc::StatusCode::INVALID_ARGUMENT,
"index malformed"};
401 return {response, errorStatus};
407 grpc::Status errorStatus{
408 grpc::StatusCode::NOT_FOUND,
"object not found"};
409 return {response, errorStatus};
416 auto& stateObject = *response.mutable_ledger_object();
418 stateObject.set_key(request.key());
419 *(response.mutable_ledger()) = request.ledger();
420 return {response, status};