From a43f5abede5efd62480562fe04c6dce93a2d10bd Mon Sep 17 00:00:00 2001 From: Vito <5780819+Tapanito@users.noreply.github.com> Date: Tue, 10 Feb 2026 11:44:10 +0100 Subject: [PATCH] fixes returned error code --- src/xrpld/app/misc/LendingHelpers.h | 3 ++ src/xrpld/app/misc/detail/LendingHelpers.cpp | 6 ++++ src/xrpld/app/tx/detail/DID.cpp | 11 ++------ .../app/tx/detail/LoanBrokerCoverClawback.cpp | 8 +++--- .../app/tx/detail/LoanBrokerCoverDeposit.cpp | 2 +- .../app/tx/detail/LoanBrokerCoverWithdraw.cpp | 2 +- src/xrpld/app/tx/detail/LoanBrokerDelete.cpp | 2 +- src/xrpld/app/tx/detail/LoanBrokerSet.cpp | 20 ++++++------- src/xrpld/app/tx/detail/LoanDelete.cpp | 2 +- src/xrpld/app/tx/detail/LoanManage.cpp | 2 +- src/xrpld/app/tx/detail/LoanPay.cpp | 2 +- src/xrpld/app/tx/detail/LoanSet.cpp | 28 +++++++++---------- 12 files changed, 46 insertions(+), 42 deletions(-) diff --git a/src/xrpld/app/misc/LendingHelpers.h b/src/xrpld/app/misc/LendingHelpers.h index f8297dfdf7..23b66b5a70 100644 --- a/src/xrpld/app/misc/LendingHelpers.h +++ b/src/xrpld/app/misc/LendingHelpers.h @@ -11,6 +11,9 @@ struct PreflightContext; bool checkLendingProtocolDependencies(PreflightContext const& ctx); +NotTEC +temInvalidToMalformed(PreflightContext const& ctx); + static constexpr std::uint32_t secondsInYear = 365 * 24 * 60 * 60; Number diff --git a/src/xrpld/app/misc/detail/LendingHelpers.cpp b/src/xrpld/app/misc/detail/LendingHelpers.cpp index 106eeb9301..41b85f2e94 100644 --- a/src/xrpld/app/misc/detail/LendingHelpers.cpp +++ b/src/xrpld/app/misc/detail/LendingHelpers.cpp @@ -10,6 +10,12 @@ checkLendingProtocolDependencies(PreflightContext const& ctx) return ctx.rules.enabled(featureSingleAssetVault) && VaultCreate::checkExtraFeatures(ctx); } +NotTEC +temInvalidToMalformed(PreflightContext const& ctx) +{ + return ctx.rules.enabled(fixLendingProtocolV1_1) ? temMALFORMED : temINVALID; +} + LoanPaymentParts& LoanPaymentParts::operator+=(LoanPaymentParts const& other) { diff --git a/src/xrpld/app/tx/detail/DID.cpp b/src/xrpld/app/tx/detail/DID.cpp index 7219dcf60e..92c406b08e 100644 --- a/src/xrpld/app/tx/detail/DID.cpp +++ b/src/xrpld/app/tx/detail/DID.cpp @@ -33,14 +33,9 @@ DIDSet::preflight(PreflightContext const& ctx) ctx.tx[sfDIDDocument].empty() && ctx.tx.isFieldPresent(sfData) && ctx.tx[sfData].empty()) return temEMPTY_DID; - auto isTooLong = [&](auto const& sField, std::size_t length) -> bool { - if (auto field = ctx.tx[~sField]) - return field->length() > length; - return false; - }; - - if (isTooLong(sfURI, maxDIDURILength) || isTooLong(sfDIDDocument, maxDIDDocumentLength) || - isTooLong(sfData, maxDIDAttestationLength)) + if (!validDataLength(ctx.tx[~sfURI], maxDIDURILength) || + !validDataLength(ctx.tx[~sfDIDDocument], maxDIDDocumentLength) || + !validDataLength(ctx.tx[~sfData], maxDIDAttestationLength)) return temMALFORMED; return tesSUCCESS; diff --git a/src/xrpld/app/tx/detail/LoanBrokerCoverClawback.cpp b/src/xrpld/app/tx/detail/LoanBrokerCoverClawback.cpp index 7038752f8b..707cf24dc4 100644 --- a/src/xrpld/app/tx/detail/LoanBrokerCoverClawback.cpp +++ b/src/xrpld/app/tx/detail/LoanBrokerCoverClawback.cpp @@ -19,10 +19,10 @@ LoanBrokerCoverClawback::preflight(PreflightContext const& ctx) auto const amount = ctx.tx[~sfAmount]; if (!brokerID && !amount) - return temINVALID; + return temInvalidToMalformed(ctx); if (brokerID && *brokerID == beast::zero) - return temINVALID; + return temInvalidToMalformed(ctx); if (amount) { @@ -41,7 +41,7 @@ LoanBrokerCoverClawback::preflight(PreflightContext const& ctx) if (!brokerID) { if (amount->holds()) - return temINVALID; + return temInvalidToMalformed(ctx); auto const account = ctx.tx[sfAccount]; // Since we don't have a LoanBrokerID, holder _should_ be the loan @@ -49,7 +49,7 @@ LoanBrokerCoverClawback::preflight(PreflightContext const& ctx) // use a generic placeholder name. auto const holder = amount->getIssuer(); if (holder == account || holder == beast::zero) - return temINVALID; + return temInvalidToMalformed(ctx); } } diff --git a/src/xrpld/app/tx/detail/LoanBrokerCoverDeposit.cpp b/src/xrpld/app/tx/detail/LoanBrokerCoverDeposit.cpp index 3dd513414e..4f81f59a3a 100644 --- a/src/xrpld/app/tx/detail/LoanBrokerCoverDeposit.cpp +++ b/src/xrpld/app/tx/detail/LoanBrokerCoverDeposit.cpp @@ -16,7 +16,7 @@ NotTEC LoanBrokerCoverDeposit::preflight(PreflightContext const& ctx) { if (ctx.tx[sfLoanBrokerID] == beast::zero) - return temINVALID; + return temInvalidToMalformed(ctx); auto const dstAmount = ctx.tx[sfAmount]; if (dstAmount <= beast::zero) diff --git a/src/xrpld/app/tx/detail/LoanBrokerCoverWithdraw.cpp b/src/xrpld/app/tx/detail/LoanBrokerCoverWithdraw.cpp index f2c8f28a84..3d76c46a04 100644 --- a/src/xrpld/app/tx/detail/LoanBrokerCoverWithdraw.cpp +++ b/src/xrpld/app/tx/detail/LoanBrokerCoverWithdraw.cpp @@ -18,7 +18,7 @@ NotTEC LoanBrokerCoverWithdraw::preflight(PreflightContext const& ctx) { if (ctx.tx[sfLoanBrokerID] == beast::zero) - return temINVALID; + return temInvalidToMalformed(ctx); auto const dstAmount = ctx.tx[sfAmount]; if (dstAmount <= beast::zero) diff --git a/src/xrpld/app/tx/detail/LoanBrokerDelete.cpp b/src/xrpld/app/tx/detail/LoanBrokerDelete.cpp index 7c8b6c1f64..3e1e72dcab 100644 --- a/src/xrpld/app/tx/detail/LoanBrokerDelete.cpp +++ b/src/xrpld/app/tx/detail/LoanBrokerDelete.cpp @@ -16,7 +16,7 @@ NotTEC LoanBrokerDelete::preflight(PreflightContext const& ctx) { if (ctx.tx[sfLoanBrokerID] == beast::zero) - return temINVALID; + return temInvalidToMalformed(ctx); return tesSUCCESS; } diff --git a/src/xrpld/app/tx/detail/LoanBrokerSet.cpp b/src/xrpld/app/tx/detail/LoanBrokerSet.cpp index 9553402f15..afd2d68bb9 100644 --- a/src/xrpld/app/tx/detail/LoanBrokerSet.cpp +++ b/src/xrpld/app/tx/detail/LoanBrokerSet.cpp @@ -18,16 +18,16 @@ LoanBrokerSet::preflight(PreflightContext const& ctx) using namespace Lending; auto const& tx = ctx.tx; - if (auto const data = tx[~sfData]; data && !data->empty() && !validDataLength(tx[~sfData], maxDataPayloadLength)) - return temINVALID; + if (auto const data = tx[~sfData]; data && !validDataLength(tx[~sfData], maxDataPayloadLength)) + return temInvalidToMalformed(ctx); if (!validNumericRange(tx[~sfManagementFeeRate], maxManagementFeeRate)) - return temINVALID; + return temInvalidToMalformed(ctx); if (!validNumericRange(tx[~sfCoverRateMinimum], maxCoverRate)) - return temINVALID; + return temInvalidToMalformed(ctx); if (!validNumericRange(tx[~sfCoverRateLiquidation], maxCoverRate)) - return temINVALID; + return temInvalidToMalformed(ctx); if (!validNumericRange(tx[~sfDebtMaximum], Number(maxMPTokenAmount), Number(0))) - return temINVALID; + return temInvalidToMalformed(ctx); if (tx.isFieldPresent(sfLoanBrokerID)) { @@ -35,16 +35,16 @@ LoanBrokerSet::preflight(PreflightContext const& ctx) // LoanBroker Object if (tx.isFieldPresent(sfManagementFeeRate) || tx.isFieldPresent(sfCoverRateMinimum) || tx.isFieldPresent(sfCoverRateLiquidation)) - return temINVALID; + return temInvalidToMalformed(ctx); if (tx[sfLoanBrokerID] == beast::zero) - return temINVALID; + return temInvalidToMalformed(ctx); } if (auto const vaultID = tx.at(~sfVaultID)) { if (*vaultID == beast::zero) - return temINVALID; + return temInvalidToMalformed(ctx); } { @@ -53,7 +53,7 @@ LoanBrokerSet::preflight(PreflightContext const& ctx) // Both must be zero or non-zero. if (minimumZero != liquidationZero) { - return temINVALID; + return temInvalidToMalformed(ctx); } } diff --git a/src/xrpld/app/tx/detail/LoanDelete.cpp b/src/xrpld/app/tx/detail/LoanDelete.cpp index d975834d29..2b6419e881 100644 --- a/src/xrpld/app/tx/detail/LoanDelete.cpp +++ b/src/xrpld/app/tx/detail/LoanDelete.cpp @@ -16,7 +16,7 @@ NotTEC LoanDelete::preflight(PreflightContext const& ctx) { if (ctx.tx[sfLoanID] == beast::zero) - return temINVALID; + return temInvalidToMalformed(ctx); return tesSUCCESS; } diff --git a/src/xrpld/app/tx/detail/LoanManage.cpp b/src/xrpld/app/tx/detail/LoanManage.cpp index 8d0a79686c..cf9f3da230 100644 --- a/src/xrpld/app/tx/detail/LoanManage.cpp +++ b/src/xrpld/app/tx/detail/LoanManage.cpp @@ -23,7 +23,7 @@ NotTEC LoanManage::preflight(PreflightContext const& ctx) { if (ctx.tx[sfLoanID] == beast::zero) - return temINVALID; + return temInvalidToMalformed(ctx); // Flags are mutually exclusive if (auto const flagField = ctx.tx[~sfFlags]; flagField && *flagField) diff --git a/src/xrpld/app/tx/detail/LoanPay.cpp b/src/xrpld/app/tx/detail/LoanPay.cpp index 744e81d67d..0d74957e68 100644 --- a/src/xrpld/app/tx/detail/LoanPay.cpp +++ b/src/xrpld/app/tx/detail/LoanPay.cpp @@ -28,7 +28,7 @@ NotTEC LoanPay::preflight(PreflightContext const& ctx) { if (ctx.tx[sfLoanID] == beast::zero) - return temINVALID; + return temInvalidToMalformed(ctx); if (ctx.tx[sfAmount] <= beast::zero) return temBAD_AMOUNT; diff --git a/src/xrpld/app/tx/detail/LoanSet.cpp b/src/xrpld/app/tx/detail/LoanSet.cpp index b7105f5df8..1ad4a81e73 100644 --- a/src/xrpld/app/tx/detail/LoanSet.cpp +++ b/src/xrpld/app/tx/detail/LoanSet.cpp @@ -53,40 +53,40 @@ LoanSet::preflight(PreflightContext const& ctx) return ret; } - if (auto const data = tx[~sfData]; data && !data->empty() && !validDataLength(tx[~sfData], maxDataPayloadLength)) - return temINVALID; + if (auto const data = tx[~sfData]; data && !validDataLength(tx[~sfData], maxDataPayloadLength)) + return temInvalidToMalformed(ctx); for (auto const& field : {&sfLoanServiceFee, &sfLatePaymentFee, &sfClosePaymentFee}) { if (!validNumericMinimum(tx[~*field])) - return temINVALID; + return temInvalidToMalformed(ctx); } // Principal Requested is required if (auto const p = tx[sfPrincipalRequested]; p <= 0) - return temINVALID; + return temInvalidToMalformed(ctx); else if (!validNumericRange(tx[~sfLoanOriginationFee], p)) - return temINVALID; + return temInvalidToMalformed(ctx); if (!validNumericRange(tx[~sfInterestRate], maxInterestRate)) - return temINVALID; + return temInvalidToMalformed(ctx); if (!validNumericRange(tx[~sfOverpaymentFee], maxOverpaymentFee)) - return temINVALID; + return temInvalidToMalformed(ctx); if (!validNumericRange(tx[~sfLateInterestRate], maxLateInterestRate)) - return temINVALID; + return temInvalidToMalformed(ctx); if (!validNumericRange(tx[~sfCloseInterestRate], maxCloseInterestRate)) - return temINVALID; + return temInvalidToMalformed(ctx); if (!validNumericRange(tx[~sfOverpaymentInterestRate], maxOverpaymentInterestRate)) - return temINVALID; + return temInvalidToMalformed(ctx); if (auto const paymentTotal = tx[~sfPaymentTotal]; paymentTotal && *paymentTotal <= 0) - return temINVALID; + return temInvalidToMalformed(ctx); if (auto const paymentInterval = tx[~sfPaymentInterval]; !validNumericMinimum(paymentInterval, LoanSet::minPaymentInterval)) - return temINVALID; + return temInvalidToMalformed(ctx); // Grace period is between min default value and payment interval else if (auto const gracePeriod = tx[~sfGracePeriod]; // !validNumericRange( gracePeriod, paymentInterval.value_or(LoanSet::defaultPaymentInterval), defaultGracePeriod)) - return temINVALID; + return temInvalidToMalformed(ctx); // Copied from preflight2 if (counterPartySig) @@ -96,7 +96,7 @@ LoanSet::preflight(PreflightContext const& ctx) } if (auto const brokerID = ctx.tx[~sfLoanBrokerID]; brokerID && *brokerID == beast::zero) - return temINVALID; + return temInvalidToMalformed(ctx); return tesSUCCESS; }