diff --git a/src/libxrpl/tx/transactors/payment_channel/PaymentChannelCreate.cpp b/src/libxrpl/tx/transactors/payment_channel/PaymentChannelCreate.cpp index 04d8e6280b9..a6c1d176bb6 100644 --- a/src/libxrpl/tx/transactors/payment_channel/PaymentChannelCreate.cpp +++ b/src/libxrpl/tx/transactors/payment_channel/PaymentChannelCreate.cpp @@ -78,19 +78,16 @@ PaymentChannelCreate::preclaim(PreclaimContext const& ctx) return terNO_ACCOUNT; // Check reserve and funds availability + if (!ctx.view.rules().enabled(featureSponsor)) { auto const balance = (*sle)[sfBalance]; - auto const sponsorSle = getTxReserveSponsor(ctx.view, ctx.tx); - if (!sponsorSle) - return sponsorSle.error(); // LCOV_EXCL_LINE - if (auto const ret = - checkInsufficientReserve(ctx.view, ctx.tx, sle, balance, *sponsorSle, 1, 0, ctx.j); - !isTesSuccess(ret)) - return ret; + auto const fees = ctx.view.fees(); + auto const reserve = fees.reserve + fees.increment * ((*sle)[sfOwnerCount] + 1); - if (auto const ret = checkInsufficientReserve( - ctx.view, ctx.tx, sle, balance - ctx.tx[sfAmount], *sponsorSle, 1, 0, ctx.j); - !isTesSuccess(ret)) + if (balance < reserve) + return tecINSUFFICIENT_RESERVE; + + if (balance < reserve + ctx.tx[sfAmount]) return tecUNFUNDED; } @@ -137,6 +134,28 @@ PaymentChannelCreate::doApply() return tecEXPIRED; } + if (ctx_.view().rules().enabled(featureSponsor)) + { + auto const sponsorSle = getTxReserveSponsor(ctx_.view(), ctx_.tx); + if (!sponsorSle) + return sponsorSle.error(); + if (auto const ret = checkInsufficientReserve( + ctx_.view(), ctx_.tx, sle, STAmount{preFeeBalance_}, *sponsorSle, 1, 0, j_); + !isTesSuccess(ret)) + return ret; + if (auto const ret = checkInsufficientReserve( + ctx_.view(), + ctx_.tx, + sle, + STAmount{preFeeBalance_ - ctx_.tx[sfAmount].xrp()}, + {}, + 1, + 0, + j_); + !isTesSuccess(ret)) + return tecUNFUNDED; + } + auto const dst = ctx_.tx[sfDestination]; // Create PayChan in ledger.