diff --git a/src/xrpld/app/tx/detail/LoanBrokerCoverWithdraw.cpp b/src/xrpld/app/tx/detail/LoanBrokerCoverWithdraw.cpp index ef4cd68420..2b54e28295 100644 --- a/src/xrpld/app/tx/detail/LoanBrokerCoverWithdraw.cpp +++ b/src/xrpld/app/tx/detail/LoanBrokerCoverWithdraw.cpp @@ -3,6 +3,8 @@ #include #include +#include + namespace ripple { bool @@ -59,7 +61,12 @@ LoanBrokerCoverWithdraw::preclaim(PreclaimContext const& ctx) } auto const vault = ctx.view.read(keylet::vault(sleBroker->at(sfVaultID))); if (!vault) - return tefBAD_LEDGER; // LCOV_EXCL_LINE + { + // LCOV_EXCL_START + JLOG(ctx.j.fatal()) << "Vault is missing for Broker " << brokerID; + return tefBAD_LEDGER; + // LCOV_EXCL_STOP + } auto const vaultAsset = vault->at(sfAsset); if (amount.asset() != vaultAsset) @@ -158,6 +165,13 @@ LoanBrokerCoverWithdraw::doApply() !isTesSuccess(ter) && ter != tecDUPLICATE) return ter; } + else + { + auto dstSle = view().peek(keylet::account(dstAcct)); + if (auto err = + verifyDepositPreauth(tx, view(), account_, dstAcct, dstSle, j_)) + return err; + } // Sanity check if (accountHolds( diff --git a/src/xrpld/app/tx/detail/LoanSet.cpp b/src/xrpld/app/tx/detail/LoanSet.cpp index 7425515d61..e73f685bf8 100644 --- a/src/xrpld/app/tx/detail/LoanSet.cpp +++ b/src/xrpld/app/tx/detail/LoanSet.cpp @@ -609,6 +609,10 @@ LoanSet::doApply() // and is distinct from the broker's pseudo-account's owner count adjustOwnerCount(view, brokerSle, 1, j_); loanSequenceProxy += 1; + // The sequence should be extremely unlikely to roll over, but fail if it + // does + if (loanSequenceProxy == 0) + return tecMAX_SEQUENCE_REACHED; view.update(brokerSle); // Put the loan into the pseudo-account's directory diff --git a/src/xrpld/app/tx/detail/VaultWithdraw.cpp b/src/xrpld/app/tx/detail/VaultWithdraw.cpp index de84a372e7..adab7eb3a6 100644 --- a/src/xrpld/app/tx/detail/VaultWithdraw.cpp +++ b/src/xrpld/app/tx/detail/VaultWithdraw.cpp @@ -245,6 +245,13 @@ VaultWithdraw::doApply() !isTesSuccess(ter) && ter != tecDUPLICATE) return ter; } + else + { + auto dstSle = view().peek(keylet::account(dstAcct)); + if (auto err = verifyDepositPreauth( + ctx_.tx, view(), account_, dstAcct, dstSle, j_)) + return err; + } // Transfer assets from vault to depositor or destination account. if (auto const ter = accountSend(