diff --git a/src/libxrpl/tx/transactors/lending/LoanBrokerSet.cpp b/src/libxrpl/tx/transactors/lending/LoanBrokerSet.cpp index e291d3c166..7355e2c20f 100644 --- a/src/libxrpl/tx/transactors/lending/LoanBrokerSet.cpp +++ b/src/libxrpl/tx/transactors/lending/LoanBrokerSet.cpp @@ -7,6 +7,7 @@ #include namespace xrpl { + bool LoanBrokerSet::checkExtraFeatures(PreflightContext const& ctx) { @@ -97,7 +98,7 @@ LoanBrokerSet::getValueFields() * @param id The vault ID to look up. * @return The vault SLE on success, or a TER error. */ -static Expected, TER> +[[nodiscard]] static Expected, TER> readVault(PreclaimContext const& ctx, AccountID const& account, uint256 const& id) { auto const sle = ctx.view.read(keylet::vault(id)); @@ -121,7 +122,7 @@ readVault(PreclaimContext const& ctx, AccountID const& account, uint256 const& i * @param brokerID The LoanBroker ID to update. * @return The vault SLE on success, or a TER error. */ -static Expected, TER> +[[nodiscard]] static Expected, TER> preclaimUpdate(PreclaimContext const& ctx, AccountID const& account, uint256 const& brokerID) { auto const& tx = ctx.tx; @@ -197,9 +198,12 @@ preclaimUpdate(PreclaimContext const& ctx, AccountID const& account, uint256 con * @param account The transaction submitter (vault owner). * @return The vault SLE on success, or a TER error. */ -static Expected, TER> +[[nodiscard]] static Expected, TER> preclaimCreate(PreclaimContext const& ctx, AccountID const& account) { + XRPL_ASSERT( + ctx.tx.isFieldPresent(sfVaultID), + "xrpl::LoanBrokerSet::preclaimCreate : VaultID is present in the transaction"); auto const vault = readVault(ctx, account, ctx.tx[sfVaultID]); if (!vault) return vault; diff --git a/src/test/app/LoanBroker_test.cpp b/src/test/app/LoanBroker_test.cpp index f05ab1af09..75ff7fb03b 100644 --- a/src/test/app/LoanBroker_test.cpp +++ b/src/test/app/LoanBroker_test.cpp @@ -1907,6 +1907,17 @@ class LoanBroker_test : public beast::unit_test::suite env(set(alice, vaultKL2.key), loanBrokerID(brokerKL.key), ter(tecNO_PERMISSION)); } + // Pre-amendment: non-existent vault on update → tecNO_ENTRY + { + testcase("LoanBrokerSet pre-amendment: non-existent vault on update"); + Env env(*this); + env.disableFeature(featureLendingProtocolV1_1); + auto const [vaultID, brokerKL] = setup(env); + + // Update with a VaultID that doesn't exist + env(set(alice, uint256{1}), loanBrokerID(brokerKL.key), ter(tecNO_ENTRY)); + } + // Pre-amendment: Create without VaultID → temINVALID { testcase("LoanBrokerSet pre-amendment: create requires VaultID");