diff --git a/src/ripple/app/tx/impl/Payment.cpp b/src/ripple/app/tx/impl/Payment.cpp index d3c26a37023..3903aa75045 100644 --- a/src/ripple/app/tx/impl/Payment.cpp +++ b/src/ripple/app/tx/impl/Payment.cpp @@ -270,27 +270,17 @@ Payment::preclaim(PreclaimContext const& ctx) return tecDST_TAG_NEEDED; } - if (paths || sendMax || !saDstAmount.native()) + // Payment with at least one intermediate step and uses transitive balances. + if ((paths || sendMax || !saDstAmount.native()) && ctx.view.open()) { - // Ripple payment with at least one intermediate step and uses - // transitive balances. - - // Copy paths into an editable class. - STPathSet const spsPaths = ctx.tx.getFieldPathSet(sfPaths); + STPathSet const& paths = ctx.tx.getFieldPathSet(sfPaths); - auto pathTooBig = spsPaths.size() > MaxPathSize; - - if (!pathTooBig) - for (auto const& path : spsPaths) - if (path.size() > MaxPathLength) - { - pathTooBig = true; - break; - } - - if (ctx.view.open() && pathTooBig) + if (paths.size() > MaxPathSize || + std::any_of(paths.begin(), paths.end(), [](STPath const& path) { + return path.size() > MaxPathLength; + })) { - return telBAD_PATH_COUNT; // Too many paths for proposed ledger. + return telBAD_PATH_COUNT; } } @@ -384,9 +374,6 @@ Payment::doApply() } } - // Copy paths into an editable class. - STPathSet spsPaths = ctx_.tx.getFieldPathSet(sfPaths); - path::RippleCalc::Input rcInput; rcInput.partialPaymentAllowed = partialPaymentAllowed; rcInput.defaultPathsAllowed = defaultPathsAllowed; @@ -404,7 +391,7 @@ Payment::doApply() saDstAmount, uDstAccountID, account_, - spsPaths, + ctx_.tx.getFieldPathSet(sfPaths), ctx_.app.logs(), &rcInput); // VFALCO NOTE We might not need to apply, depending