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/STXChainBridge.h>
29 #include <ripple/protocol/jss.h>
30 #include <ripple/rpc/Context.h>
31 #include <ripple/rpc/GRPCHandlers.h>
32 #include <ripple/rpc/impl/RPCHelpers.h>
51 bool bNodeBinary =
false;
60 uNodeIndex = beast::zero;
61 jvResult[jss::error] =
"malformedRequest";
67 auto const account = parseBase58<AccountID>(
69 if (!account || account->
isZero())
70 jvResult[jss::error] =
"malformedAddress";
79 uNodeIndex = beast::zero;
80 jvResult[jss::error] =
"malformedRequest";
93 uNodeIndex = beast::zero;
94 jvResult[jss::error] =
"malformedRequest";
102 !context.
params[jss::deposit_preauth][jss::authorized]
105 jvResult[jss::error] =
"malformedRequest";
109 auto const owner = parseBase58<AccountID>(
110 context.
params[jss::deposit_preauth][jss::owner]
113 auto const authorized = parseBase58<AccountID>(
114 context.
params[jss::deposit_preauth][jss::authorized]
118 jvResult[jss::error] =
"malformedOwner";
120 jvResult[jss::error] =
"malformedAuthorized";
131 jvResult[jss::error] =
"malformedRequest";
138 uNodeIndex = beast::zero;
139 jvResult[jss::error] =
"malformedRequest";
146 jvResult[jss::error] =
"malformedRequest";
152 ? context.
params[jss::directory][jss::sub_index].
asUInt()
162 jvResult[jss::error] =
"malformedRequest";
165 context.
params[jss::directory][jss::dir_root]
168 uNodeIndex = beast::zero;
169 jvResult[jss::error] =
"malformedRequest";
178 auto const ownerID = parseBase58<AccountID>(
183 jvResult[jss::error] =
"malformedAddress";
194 jvResult[jss::error] =
"malformedRequest";
206 uNodeIndex = beast::zero;
207 jvResult[jss::error] =
"malformedRequest";
215 jvResult[jss::error] =
"malformedRequest";
219 auto const id = parseBase58<AccountID>(
222 jvResult[jss::error] =
"malformedOwner";
237 uNodeIndex = beast::zero;
238 jvResult[jss::error] =
"malformedRequest";
246 jvResult[jss::error] =
"malformedRequest";
250 auto const id = parseBase58<AccountID>(
253 jvResult[jss::error] =
"malformedAddress";
268 uNodeIndex = beast::zero;
269 jvResult[jss::error] =
"malformedRequest";
279 !jvRippleState.
isMember(jss::currency) ||
280 !jvRippleState.
isMember(jss::accounts) ||
281 !jvRippleState[jss::accounts].
isArray() ||
282 2 != jvRippleState[jss::accounts].
size() ||
283 !jvRippleState[jss::accounts][0u].
isString() ||
284 !jvRippleState[jss::accounts][1u].
isString() ||
285 (jvRippleState[jss::accounts][0u].
asString() ==
286 jvRippleState[jss::accounts][1u].
asString()))
288 jvResult[jss::error] =
"malformedRequest";
292 auto const id1 = parseBase58<AccountID>(
293 jvRippleState[jss::accounts][0u].asString());
294 auto const id2 = parseBase58<AccountID>(
295 jvRippleState[jss::accounts][1u].asString());
298 jvResult[jss::error] =
"malformedAddress";
302 jvRippleState[jss::currency].asString()))
304 jvResult[jss::error] =
"malformedCurrency";
320 uNodeIndex = beast::zero;
321 jvResult[jss::error] =
"malformedRequest";
329 jvResult[jss::error] =
"malformedRequest";
333 auto const id = parseBase58<AccountID>(
336 jvResult[jss::error] =
"malformedAddress";
352 uNodeIndex = beast::zero;
353 jvResult[jss::error] =
"malformedRequest";
358 jvResult[jss::error] =
"malformedRequest";
363 expectedType =
ltAMM;
368 uNodeIndex = beast::zero;
369 jvResult[jss::error] =
"malformedRequest";
376 jvResult[jss::error] =
"malformedRequest";
390 jvResult[jss::error] =
"malformedRequest";
406 auto const& jsBridgeAccount =
407 context.
params[jss::bridge_account];
408 if (!jsBridgeAccount.isString())
413 parseBase58<AccountID>(jsBridgeAccount.asString());
414 if (!account || account->
isZero())
425 account == bridge.lockingChainDoor());
426 if (account != bridge.door(chainType))
439 uNodeIndex = maybeKeylet->key;
443 uNodeIndex = beast::zero;
444 jvResult[jss::error] =
"malformedRequest";
450 auto& claim_id = context.
params[jss::xchain_owned_claim_id];
451 if (claim_id.isString())
454 if (!uNodeIndex.
parseHex(claim_id.asString()))
456 uNodeIndex = beast::zero;
457 jvResult[jss::error] =
"malformedRequest";
461 !claim_id.isObject() ||
468 !claim_id.isMember(jss::xchain_owned_claim_id))
470 jvResult[jss::error] =
"malformedRequest";
478 auto lockingChainDoor = parseBase58<AccountID>(
480 auto issuingChainDoor = parseBase58<AccountID>(
482 Issue lockingChainIssue, issuingChainIssue;
483 bool valid = lockingChainDoor && issuingChainDoor;
496 jvResult[jss::error] =
"malformedRequest";
500 if (valid && claim_id[jss::xchain_owned_claim_id].isIntegral())
502 auto seq = claim_id[jss::xchain_owned_claim_id].asUInt();
510 uNodeIndex = keylet.
key;
515 jss::xchain_owned_create_account_claim_id))
520 context.
params[jss::xchain_owned_create_account_claim_id];
521 if (claim_id.isString())
525 if (!uNodeIndex.
parseHex(claim_id.asString()))
527 uNodeIndex = beast::zero;
528 jvResult[jss::error] =
"malformedRequest";
532 !claim_id.isObject() ||
539 !claim_id.isMember(jss::xchain_owned_create_account_claim_id))
541 jvResult[jss::error] =
"malformedRequest";
550 auto lockingChainDoor = parseBase58<AccountID>(
552 auto issuingChainDoor = parseBase58<AccountID>(
554 Issue lockingChainIssue, issuingChainIssue;
555 bool valid = lockingChainDoor && issuingChainDoor;
568 jvResult[jss::error] =
"malformedRequest";
573 claim_id[jss::xchain_owned_create_account_claim_id]
577 claim_id[jss::xchain_owned_create_account_claim_id]
587 uNodeIndex = keylet.
key;
593 expectedType =
ltDID;
596 if (!account || account->
isZero())
597 jvResult[jss::error] =
"malformedAddress";
611 uNodeIndex = beast::zero;
612 jvResult[jss::error] =
"malformedRequest";
618 jvResult[jss::error] =
"unknownOption";
620 jvResult[jss::error] =
"invalidParams";
631 uNodeIndex = beast::zero;
632 jvResult[jss::error] =
"invalidParams";
647 jvResult[jss::error] =
"entryNotFound";
650 (expectedType !=
ltANY) && (expectedType != sleNode->getType()))
652 jvResult[jss::error] =
"unexpectedLedgerType";
654 else if (bNodeBinary)
661 jvResult[jss::index] =
to_string(uNodeIndex);
666 jvResult[jss::index] =
to_string(uNodeIndex);
677 org::xrpl::rpc::v1::GetLedgerEntryRequest& request = context.
params;
678 org::xrpl::rpc::v1::GetLedgerEntryResponse response;
679 grpc::Status status = grpc::Status::OK;
684 grpc::Status errorStatus;
687 errorStatus = grpc::Status(
688 grpc::StatusCode::INVALID_ARGUMENT, status.message());
693 grpc::Status(grpc::StatusCode::NOT_FOUND, status.message());
695 return {response, errorStatus};
701 grpc::Status errorStatus{
702 grpc::StatusCode::INVALID_ARGUMENT,
"index malformed"};
703 return {response, errorStatus};
709 grpc::Status errorStatus{
710 grpc::StatusCode::NOT_FOUND,
"object not found"};
711 return {response, errorStatus};
718 auto& stateObject = *response.mutable_ledger_object();
720 stateObject.set_key(request.key());
721 *(response.mutable_ledger()) = request.ledger();
722 return {response, status};