diff --git a/src/libxrpl/tx/transactors/oracle/OracleSet.cpp b/src/libxrpl/tx/transactors/oracle/OracleSet.cpp index 779d312e3b..93d8bda025 100644 --- a/src/libxrpl/tx/transactors/oracle/OracleSet.cpp +++ b/src/libxrpl/tx/transactors/oracle/OracleSet.cpp @@ -181,14 +181,17 @@ OracleSet::preclaim(PreclaimContext const& ctx) if (pairs.size() > kMaxOracleDataSeries) return tecARRAY_TOO_LARGE; - auto const& balance = sleSetter->getFieldAmount(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, sleSetter, balance, *sponsorSle, adjustReserve, 0, ctx.j); - !isTesSuccess(ret)) - return ret; + if (!ctx.view.rules().enabled(featureSponsor)) + { + auto const& balance = sleSetter->getFieldAmount(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, sleSetter, balance, *sponsorSle, adjustReserve, 0, ctx.j); + !isTesSuccess(ret)) + return ret; + } return tesSUCCESS; } @@ -276,6 +279,28 @@ OracleSet::doApply() if (!accountSle) return tefINTERNAL; // LCOV_EXCL_LINE + if (ctx_.view().rules().enabled(featureSponsor)) + { + auto const sponsorSle = getTxReserveSponsor(ctx_.view(), ctx_.tx); + if (!sponsorSle) + return sponsorSle.error(); // LCOV_EXCL_LINE + auto const delta = (getLedgerEntryReserveSponsorAccountID(sle) == + getTxReserveSponsorAccountID(ctx_.tx)) + ? adjust + : static_cast(newCount); + if (auto const ret = checkInsufficientReserve( + ctx_.view(), + ctx_.tx, + accountSle, + STAmount{preFeeBalance_}, + *sponsorSle, + delta, + 0, + j_); + !isTesSuccess(ret)) + return ret; + } + if (adjust > 0) { // To continue receiving sponsorship from the same account after the @@ -354,6 +379,21 @@ OracleSet::doApply() if (!accountSle) return tefINTERNAL; // LCOV_EXCL_LINE + if (ctx_.view().rules().enabled(featureSponsor)) + { + if (auto const ret = checkInsufficientReserve( + ctx_.view(), + ctx_.tx, + accountSle, + STAmount{preFeeBalance_}, + *sponsorSle, + count, + 0, + j_); + !isTesSuccess(ret)) + return ret; + } + adjustOwnerCount(ctx_.view(), accountSle, *sponsorSle, count, ctx_.journal); addSponsorToLedgerEntry(sle, *sponsorSle); diff --git a/src/libxrpl/tx/transactors/payment_channel/PaymentChannelCreate.cpp b/src/libxrpl/tx/transactors/payment_channel/PaymentChannelCreate.cpp index 04d8e6280b..e7c87a1af1 100644 --- a/src/libxrpl/tx/transactors/payment_channel/PaymentChannelCreate.cpp +++ b/src/libxrpl/tx/transactors/payment_channel/PaymentChannelCreate.cpp @@ -78,6 +78,7 @@ 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); @@ -137,6 +138,28 @@ PaymentChannelCreate::doApply() return tecEXPIRED; } + if (ctx_.view().rules().enabled(featureSponsor)) + { + 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, 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()}, + *sponsorSle, + 1, + 0, + j_); + !isTesSuccess(ret)) + return tecUNFUNDED; + } + auto const dst = ctx_.tx[sfDestination]; // Create PayChan in ledger.