20 #include <ripple/app/main/Application.h>
21 #include <ripple/basics/StringUtilities.h>
22 #include <ripple/basics/strHex.h>
23 #include <ripple/beast/core/LexicalCast.h>
24 #include <ripple/json/json_errors.h>
25 #include <ripple/ledger/ReadView.h>
26 #include <ripple/net/RPCErr.h>
27 #include <ripple/protocol/ErrorCodes.h>
28 #include <ripple/protocol/Indexes.h>
29 #include <ripple/protocol/STXChainBridge.h>
30 #include <ripple/protocol/jss.h>
31 #include <ripple/rpc/Context.h>
32 #include <ripple/rpc/GRPCHandlers.h>
33 #include <ripple/rpc/impl/RPCHelpers.h>
52 bool bNodeBinary =
false;
61 uNodeIndex = beast::zero;
62 jvResult[jss::error] =
"malformedRequest";
68 auto const account = parseBase58<AccountID>(
70 if (!account || account->
isZero())
71 jvResult[jss::error] =
"malformedAddress";
80 uNodeIndex = beast::zero;
81 jvResult[jss::error] =
"malformedRequest";
94 uNodeIndex = beast::zero;
95 jvResult[jss::error] =
"malformedRequest";
103 !context.
params[jss::deposit_preauth][jss::authorized]
106 jvResult[jss::error] =
"malformedRequest";
110 auto const owner = parseBase58<AccountID>(
111 context.
params[jss::deposit_preauth][jss::owner]
114 auto const authorized = parseBase58<AccountID>(
115 context.
params[jss::deposit_preauth][jss::authorized]
119 jvResult[jss::error] =
"malformedOwner";
121 jvResult[jss::error] =
"malformedAuthorized";
132 jvResult[jss::error] =
"malformedRequest";
139 uNodeIndex = beast::zero;
140 jvResult[jss::error] =
"malformedRequest";
147 jvResult[jss::error] =
"malformedRequest";
153 ? context.
params[jss::directory][jss::sub_index].
asUInt()
163 jvResult[jss::error] =
"malformedRequest";
166 context.
params[jss::directory][jss::dir_root]
169 uNodeIndex = beast::zero;
170 jvResult[jss::error] =
"malformedRequest";
179 auto const ownerID = parseBase58<AccountID>(
184 jvResult[jss::error] =
"malformedAddress";
195 jvResult[jss::error] =
"malformedRequest";
207 uNodeIndex = beast::zero;
208 jvResult[jss::error] =
"malformedRequest";
216 jvResult[jss::error] =
"malformedRequest";
220 auto const id = parseBase58<AccountID>(
223 jvResult[jss::error] =
"malformedOwner";
238 uNodeIndex = beast::zero;
239 jvResult[jss::error] =
"malformedRequest";
247 jvResult[jss::error] =
"malformedRequest";
251 auto const id = parseBase58<AccountID>(
254 jvResult[jss::error] =
"malformedAddress";
269 uNodeIndex = beast::zero;
270 jvResult[jss::error] =
"malformedRequest";
280 !jvRippleState.
isMember(jss::currency) ||
281 !jvRippleState.
isMember(jss::accounts) ||
282 !jvRippleState[jss::accounts].
isArray() ||
283 2 != jvRippleState[jss::accounts].
size() ||
284 !jvRippleState[jss::accounts][0u].
isString() ||
285 !jvRippleState[jss::accounts][1u].
isString() ||
286 (jvRippleState[jss::accounts][0u].
asString() ==
287 jvRippleState[jss::accounts][1u].
asString()))
289 jvResult[jss::error] =
"malformedRequest";
293 auto const id1 = parseBase58<AccountID>(
294 jvRippleState[jss::accounts][0u].asString());
295 auto const id2 = parseBase58<AccountID>(
296 jvRippleState[jss::accounts][1u].asString());
299 jvResult[jss::error] =
"malformedAddress";
303 jvRippleState[jss::currency].asString()))
305 jvResult[jss::error] =
"malformedCurrency";
321 uNodeIndex = beast::zero;
322 jvResult[jss::error] =
"malformedRequest";
330 jvResult[jss::error] =
"malformedRequest";
334 auto const id = parseBase58<AccountID>(
337 jvResult[jss::error] =
"malformedAddress";
353 uNodeIndex = beast::zero;
354 jvResult[jss::error] =
"malformedRequest";
359 jvResult[jss::error] =
"malformedRequest";
364 expectedType =
ltAMM;
369 uNodeIndex = beast::zero;
370 jvResult[jss::error] =
"malformedRequest";
377 jvResult[jss::error] =
"malformedRequest";
391 jvResult[jss::error] =
"malformedRequest";
407 auto const& jsBridgeAccount =
408 context.
params[jss::bridge_account];
409 if (!jsBridgeAccount.isString())
414 parseBase58<AccountID>(jsBridgeAccount.asString());
415 if (!account || account->
isZero())
426 account == bridge.lockingChainDoor());
427 if (account != bridge.door(chainType))
440 uNodeIndex = maybeKeylet->key;
444 uNodeIndex = beast::zero;
445 jvResult[jss::error] =
"malformedRequest";
451 auto& claim_id = context.
params[jss::xchain_owned_claim_id];
452 if (claim_id.isString())
455 if (!uNodeIndex.
parseHex(claim_id.asString()))
457 uNodeIndex = beast::zero;
458 jvResult[jss::error] =
"malformedRequest";
462 !claim_id.isObject() ||
469 !claim_id.isMember(jss::xchain_owned_claim_id))
471 jvResult[jss::error] =
"malformedRequest";
479 auto lockingChainDoor = parseBase58<AccountID>(
481 auto issuingChainDoor = parseBase58<AccountID>(
483 Issue lockingChainIssue, issuingChainIssue;
484 bool valid = lockingChainDoor && issuingChainDoor;
497 jvResult[jss::error] =
"malformedRequest";
501 if (valid && claim_id[jss::xchain_owned_claim_id].isIntegral())
503 auto seq = claim_id[jss::xchain_owned_claim_id].asUInt();
511 uNodeIndex = keylet.
key;
516 jss::xchain_owned_create_account_claim_id))
521 context.
params[jss::xchain_owned_create_account_claim_id];
522 if (claim_id.isString())
526 if (!uNodeIndex.
parseHex(claim_id.asString()))
528 uNodeIndex = beast::zero;
529 jvResult[jss::error] =
"malformedRequest";
533 !claim_id.isObject() ||
540 !claim_id.isMember(jss::xchain_owned_create_account_claim_id))
542 jvResult[jss::error] =
"malformedRequest";
551 auto lockingChainDoor = parseBase58<AccountID>(
553 auto issuingChainDoor = parseBase58<AccountID>(
555 Issue lockingChainIssue, issuingChainIssue;
556 bool valid = lockingChainDoor && issuingChainDoor;
569 jvResult[jss::error] =
"malformedRequest";
574 claim_id[jss::xchain_owned_create_account_claim_id]
578 claim_id[jss::xchain_owned_create_account_claim_id]
588 uNodeIndex = keylet.
key;
594 expectedType =
ltDID;
597 if (!account || account->
isZero())
598 jvResult[jss::error] =
"malformedAddress";
610 uNodeIndex = beast::zero;
611 jvResult[jss::error] =
"malformedRequest";
616 jss::oracle_document_id) ||
619 jvResult[jss::error] =
"malformedRequest";
623 uNodeIndex = beast::zero;
624 auto const& oracle = context.
params[jss::oracle];
626 auto const&
id = oracle[jss::oracle_document_id];
627 if (
id.isConvertibleTo(Json::ValueType::uintValue))
629 else if (
id.isString())
638 parseBase58<AccountID>(oracle[jss::account].asString());
639 if (!account || account->
isZero())
640 jvResult[jss::error] =
"malformedAddress";
641 else if (!documentID)
642 jvResult[jss::error] =
"malformedDocumentID";
657 uNodeIndex = beast::zero;
658 jvResult[jss::error] =
"malformedRequest";
664 jvResult[jss::error] =
"unknownOption";
666 jvResult[jss::error] =
"invalidParams";
677 uNodeIndex = beast::zero;
678 jvResult[jss::error] =
"invalidParams";
693 jvResult[jss::error] =
"entryNotFound";
696 (expectedType !=
ltANY) && (expectedType != sleNode->getType()))
698 jvResult[jss::error] =
"unexpectedLedgerType";
700 else if (bNodeBinary)
707 jvResult[jss::index] =
to_string(uNodeIndex);
712 jvResult[jss::index] =
to_string(uNodeIndex);
723 org::xrpl::rpc::v1::GetLedgerEntryRequest& request = context.
params;
724 org::xrpl::rpc::v1::GetLedgerEntryResponse response;
725 grpc::Status status = grpc::Status::OK;
730 grpc::Status errorStatus;
733 errorStatus = grpc::Status(
734 grpc::StatusCode::INVALID_ARGUMENT, status.message());
739 grpc::Status(grpc::StatusCode::NOT_FOUND, status.message());
741 return {response, errorStatus};
747 grpc::Status errorStatus{
748 grpc::StatusCode::INVALID_ARGUMENT,
"index malformed"};
749 return {response, errorStatus};
755 grpc::Status errorStatus{
756 grpc::StatusCode::NOT_FOUND,
"object not found"};
757 return {response, errorStatus};
764 auto& stateObject = *response.mutable_ledger_object();
766 stateObject.set_key(request.key());
767 *(response.mutable_ledger()) = request.ledger();
768 return {response, status};