From 9d3dbce73b1aa8ba2323024431753937f0c06af5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?emrear=C4=B1y=C3=BCrek?= Date: Fri, 6 Feb 2026 16:33:18 +0100 Subject: [PATCH] fix: Remove RpcEntryNotFound from ClioError (#2661) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Since rippled has its own error codes, all occurrences have been replaced except for [PR2549](https://github.com/XRPLF/clio/pull/2549), and the entry has also been removed entirely from Clio’s error enum. This modification follows the feedback provided in this comment: https://github.com/XRPLF/clio/pull/2549#discussion_r2394840688 Pending compatible libxrpl — temporarily on hold --------- Co-authored-by: Ayaz Salikhov Co-authored-by: Alex Kremer --- src/rpc/Errors.cpp | 1 - src/rpc/Errors.hpp | 3 ++- src/rpc/handlers/VaultInfo.cpp | 8 ++++---- src/web/impl/ErrorHandling.hpp | 1 - src/web/ng/impl/ErrorHandling.cpp | 1 - tests/unit/rpc/handlers/VaultInfoTests.cpp | 20 ++++++++++++++++++++ 6 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/rpc/Errors.cpp b/src/rpc/Errors.cpp index aa0be8fdb..e0aa79027 100644 --- a/src/rpc/Errors.cpp +++ b/src/rpc/Errors.cpp @@ -126,7 +126,6 @@ getErrorInfo(ClioError code) {.code = ClioError::RpcMalformedAuthorizedCredentials, .error = "malformedAuthorizedCredentials", .message = "Malformed authorized credentials."}, - {.code = ClioError::RpcEntryNotFound, .error = "entryNotFound", .message = "Entry Not Found."}, // special system errors {.code = ClioError::RpcInvalidApiVersion, .error = JS(invalid_API_version), .message = "Invalid API version."}, {.code = ClioError::RpcCommandIsMissing, diff --git a/src/rpc/Errors.hpp b/src/rpc/Errors.hpp index 0aaa78308..5dfa21ce2 100644 --- a/src/rpc/Errors.hpp +++ b/src/rpc/Errors.hpp @@ -43,7 +43,8 @@ enum class ClioError { RpcFieldNotFoundTransaction = 5006, RpcMalformedOracleDocumentId = 5007, RpcMalformedAuthorizedCredentials = 5008, - RpcEntryNotFound = 5009, + // NOTE: RpcEntryNotFound is replaced with RippledError::rpcENTRY_NOT_FOUND + // RpcEntryNotFound = 5009, // special system errors start with 6000 RpcInvalidApiVersion = 6000, diff --git a/src/rpc/handlers/VaultInfo.cpp b/src/rpc/handlers/VaultInfo.cpp index ad4074594..64e9a2d72 100644 --- a/src/rpc/handlers/VaultInfo.cpp +++ b/src/rpc/handlers/VaultInfo.cpp @@ -107,7 +107,7 @@ VaultInfoHandler::process(VaultInfoHandler::Input const& input, Context const& c sharedPtrBackend_->fetchLedgerObject(accountKeylet.key, lgrInfo.seq, ctx.yield); if (!accountLedgerObject) - return std::unexpected{Status{ClioError::RpcEntryNotFound}}; + return std::unexpected{Status{RippledError::rpcENTRY_NOT_FOUND}}; } return ripple::keylet::vault(*accountID, *input.tnxSequence); @@ -116,7 +116,7 @@ VaultInfoHandler::process(VaultInfoHandler::Input const& input, Context const& c if (nodeIndex.parseHex(*input.vaultID)) return ripple::keylet::vault(nodeIndex); - return std::unexpected{Status{ClioError::RpcEntryNotFound}}; + return std::unexpected{Status{RippledError::rpcENTRY_NOT_FOUND}}; }(); if (not vaultKeylet.has_value()) @@ -127,7 +127,7 @@ VaultInfoHandler::process(VaultInfoHandler::Input const& input, Context const& c sharedPtrBackend_->fetchLedgerObject(vaultKeylet.value().key, lgrInfo.seq, ctx.yield); if (not vaultLedgerObject) - return Error{Status{ClioError::RpcEntryNotFound, "vault object not found."}}; + return Error{Status{RippledError::rpcENTRY_NOT_FOUND, "vault object not found."}}; ripple::STLedgerEntry const vaultSle{ ripple::SerialIter{vaultLedgerObject->data(), vaultLedgerObject->size()}, vaultKeylet.value().key @@ -137,7 +137,7 @@ VaultInfoHandler::process(VaultInfoHandler::Input const& input, Context const& c auto const issuanceObject = sharedPtrBackend_->fetchLedgerObject(issuanceKeylet, lgrInfo.seq, ctx.yield); if (not issuanceObject) - return Error{Status{ClioError::RpcEntryNotFound, "issuance object not found."}}; + return Error{Status{RippledError::rpcENTRY_NOT_FOUND, "issuance object not found."}}; ripple::STLedgerEntry const issuanceSle{ ripple::SerialIter{issuanceObject->data(), issuanceObject->size()}, issuanceKeylet diff --git a/src/web/impl/ErrorHandling.hpp b/src/web/impl/ErrorHandling.hpp index fff6589d6..30290773b 100644 --- a/src/web/impl/ErrorHandling.hpp +++ b/src/web/impl/ErrorHandling.hpp @@ -91,7 +91,6 @@ public: case rpc::ClioError::RpcFieldNotFoundTransaction: case rpc::ClioError::RpcMalformedOracleDocumentId: case rpc::ClioError::RpcMalformedAuthorizedCredentials: - case rpc::ClioError::RpcEntryNotFound: case rpc::ClioError::EtlConnectionError: case rpc::ClioError::EtlRequestError: case rpc::ClioError::EtlRequestTimeout: diff --git a/src/web/ng/impl/ErrorHandling.cpp b/src/web/ng/impl/ErrorHandling.cpp index 215cef225..30d3729d1 100644 --- a/src/web/ng/impl/ErrorHandling.cpp +++ b/src/web/ng/impl/ErrorHandling.cpp @@ -105,7 +105,6 @@ ErrorHelper::makeError(rpc::Status const& err) const case rpc::ClioError::RpcFieldNotFoundTransaction: case rpc::ClioError::RpcMalformedOracleDocumentId: case rpc::ClioError::RpcMalformedAuthorizedCredentials: - case rpc::ClioError::RpcEntryNotFound: case rpc::ClioError::EtlConnectionError: case rpc::ClioError::EtlRequestError: case rpc::ClioError::EtlRequestTimeout: diff --git a/tests/unit/rpc/handlers/VaultInfoTests.cpp b/tests/unit/rpc/handlers/VaultInfoTests.cpp index a7aa80f33..cd5160776 100644 --- a/tests/unit/rpc/handlers/VaultInfoTests.cpp +++ b/tests/unit/rpc/handlers/VaultInfoTests.cpp @@ -71,6 +71,7 @@ struct VaultInfoParamTestCaseBundle { std::string testName; std::string testJson; std::string expectedError; + CombinedError expectedErrorCode; std::string expectedErrorMessage; }; @@ -86,6 +87,7 @@ generateTestValuesForParametersTest() "idk": "idk" })JSON", .expectedError = "malformedRequest", + .expectedErrorCode = ClioError::RpcMalformedRequest, .expectedErrorMessage = "Malformed request." }, VaultInfoParamTestCaseBundle{ @@ -94,6 +96,7 @@ generateTestValuesForParametersTest() "seq": 4 })JSON", .expectedError = "malformedRequest", + .expectedErrorCode = ClioError::RpcMalformedRequest, .expectedErrorMessage = "Malformed request." }, VaultInfoParamTestCaseBundle{ @@ -102,6 +105,7 @@ generateTestValuesForParametersTest() "owner": "rHb9CJAWyB4rj91VRWn96DkukG4bwdtyTh" })JSON", .expectedError = "malformedRequest", + .expectedErrorCode = ClioError::RpcMalformedRequest, .expectedErrorMessage = "Malformed request." }, VaultInfoParamTestCaseBundle{ @@ -111,6 +115,7 @@ generateTestValuesForParametersTest() "seq": "asdf" })JSON", .expectedError = "malformedRequest", + .expectedErrorCode = ClioError::RpcMalformedRequest, .expectedErrorMessage = "Malformed request." }, VaultInfoParamTestCaseBundle{ @@ -120,6 +125,7 @@ generateTestValuesForParametersTest() "seq": 3 })JSON", .expectedError = "malformedRequest", + .expectedErrorCode = ClioError::RpcMalformedRequest, .expectedErrorMessage = "OwnerNotHexString" }, VaultInfoParamTestCaseBundle{ @@ -129,6 +135,7 @@ generateTestValuesForParametersTest() "seq": 3 })JSON", .expectedError = "malformedRequest", + .expectedErrorCode = ClioError::RpcMalformedRequest, .expectedErrorMessage = "OwnerNotHexString" }, VaultInfoParamTestCaseBundle{ @@ -137,6 +144,7 @@ generateTestValuesForParametersTest() "vault_id": 3 })JSON", .expectedError = "malformedRequest", + .expectedErrorCode = ClioError::RpcMalformedRequest, .expectedErrorMessage = "Malformed request." }, VaultInfoParamTestCaseBundle{ @@ -145,6 +153,7 @@ generateTestValuesForParametersTest() "vault_id": "idk" })JSON", .expectedError = "malformedRequest", + .expectedErrorCode = ClioError::RpcMalformedRequest, .expectedErrorMessage = "Malformed request." }, VaultInfoParamTestCaseBundle{ @@ -158,6 +167,7 @@ generateTestValuesForParametersTest() kACCOUNT ), .expectedError = "malformedRequest", + .expectedErrorCode = ClioError::RpcMalformedRequest, .expectedErrorMessage = "Malformed request." } }; @@ -181,6 +191,10 @@ TEST_P(VaultInfoParameterTest, InvalidParams) auto const err = rpc::makeError(output.result.error()); EXPECT_EQ(err.at("error").as_string(), testBundle.expectedError); + EXPECT_EQ( + err.at("error_code").as_uint64(), + std::visit([](auto code) { return static_cast(code); }, testBundle.expectedErrorCode) + ); EXPECT_EQ(err.at("error_message").as_string(), testBundle.expectedErrorMessage); }); } @@ -208,6 +222,8 @@ TEST_F(RPCVaultInfoHandlerTest, InputHasOwnerButNotFoundResultsInError) ASSERT_FALSE(output); auto const err = rpc::makeError(output.result.error()); EXPECT_EQ(err.at("error").as_string(), "entryNotFound"); + EXPECT_EQ(err.at("error_code").as_uint64(), rpc::RippledError::rpcENTRY_NOT_FOUND); + EXPECT_EQ(err.at("error_message").as_string(), "Entry not found."); }); } @@ -237,6 +253,8 @@ TEST_F(RPCVaultInfoHandlerTest, VaultIDFailsVaultDeserializationReturnsEntryNotF ASSERT_FALSE(output); auto const err = rpc::makeError(output.result.error()); EXPECT_EQ(err.at("error").as_string(), "entryNotFound"); + EXPECT_EQ(err.at("error_code").as_uint64(), rpc::RippledError::rpcENTRY_NOT_FOUND); + EXPECT_EQ(err.at("error_message").as_string(), "vault object not found."); }); } @@ -277,6 +295,8 @@ TEST_F(RPCVaultInfoHandlerTest, MissingIssuanceObject) ASSERT_FALSE(output); auto const err = rpc::makeError(output.result.error()); EXPECT_EQ(err.at("error").as_string(), "entryNotFound"); + EXPECT_EQ(err.at("error_code").as_uint64(), rpc::RippledError::rpcENTRY_NOT_FOUND); + EXPECT_EQ(err.at("error_message").as_string(), "issuance object not found."); }); }