From 166b4a76d497c6c3c32d1e69e82086721c3e75eb Mon Sep 17 00:00:00 2001 From: Richard Holland Date: Mon, 4 Apr 2022 12:37:15 +0000 Subject: [PATCH] bug fixes, testing --- src/ripple/app/tx/impl/PayChan.cpp | 45 +++++++++++++++++++++++++--- src/ripple/protocol/impl/Indexes.cpp | 4 +-- 2 files changed, 43 insertions(+), 6 deletions(-) diff --git a/src/ripple/app/tx/impl/PayChan.cpp b/src/ripple/app/tx/impl/PayChan.cpp index 830bfcf54..f130725bc 100644 --- a/src/ripple/app/tx/impl/PayChan.cpp +++ b/src/ripple/app/tx/impl/PayChan.cpp @@ -150,8 +150,43 @@ closeChannel( return tefINTERNAL; assert((*slep)[sfAmount] >= (*slep)[sfBalance]); - (*sle)[sfBalance] = - (*sle)[sfBalance] + (*slep)[sfAmount] - (*slep)[sfBalance]; + auto const amount = (*slep)[sfAmount] - (*slep)[sfBalance]; + + if (isXRP(amount)) + { + (*sle)[sfBalance] = (*sle)[sfBalance] + amount; + } + else if (view.rules().enabled(featurePaychanAndEscrowForTokens)) + { + // unlock the TL balance that was locked by this channel + auto& account = src; + auto issuerAccID = amount.getIssuer(); + auto currency = amount.getCurrency(); + auto sleSrcLine = view.peek(keylet::line(account, issuerAccID, currency)); + bool isLow = account < issuerAccID; + + STAmount priorLockedBalance = + isLow ? (*sleSrcLine)[sfLockedBalance] : -(*sleSrcLine)[sfLockedBalance]; + + STAmount finalLockedBalance = priorLockedBalance - amount; + if (finalLockedBalance < beast::zero) + { + JLOG(j.warn()) + << "Paychanel close would force locked balance below zero"; + return tecINTERNAL; + } + + if (finalLockedBalance == beast::zero) + sleSrcLine->makeFieldAbsent(sfLockedBalance); + else + sleSrcLine->setFieldAmount(sfLockedBalance, isLow ? finalLockedBalance : -finalLockedBalance); + + view.update(sleSrcLine); + + } + else + return tefINTERNAL; + adjustOwnerCount(view, sle, -1, j); view.update(sle); @@ -165,7 +200,8 @@ closeChannel( TxConsequences PayChanCreate::makeTxConsequences(PreflightContext const& ctx) { - return TxConsequences{ctx.tx, ctx.tx[sfAmount].xrp()}; + return TxConsequences{ctx.tx, + isXRP(ctx.tx[sfAmount]) ? ctx.tx[sfAmount].xrp() : beast::zero}; } NotTEC @@ -518,6 +554,7 @@ PayChanFund::doApply() } else if (ctx_.view().rules().enabled(featurePaychanAndEscrowForTokens)) { + // RH UPTO: add freeze checks for all featurePaychanAndEscrowForTokens applies on escrow and paychan // find the user's trustline auto const& account = src; auto const currency = amount.getCurrency(); @@ -552,7 +589,7 @@ PayChanFund::doApply() lockedBalance += high ? -amount : amount; sleLine->setFieldAmount(sfLockedBalance, lockedBalance); - ctx_.view().update(sleLine); + view.update(sleLine); } else return tecINTERNAL; diff --git a/src/ripple/protocol/impl/Indexes.cpp b/src/ripple/protocol/impl/Indexes.cpp index 6d7b7cc22..2dcc4dd7f 100644 --- a/src/ripple/protocol/impl/Indexes.cpp +++ b/src/ripple/protocol/impl/Indexes.cpp @@ -56,7 +56,7 @@ enum class LedgerNameSpace : std::uint16_t { FEE_SETTINGS = 'e', TICKET = 'T', SIGNER_LIST = 'S', - XRP_PAYMENT_CHANNEL = 'x', + PAYMENT_CHANNEL = 'x', CHECK = 'C', DEPOSIT_PREAUTH = 'p', NEGATIVE_UNL = 'N', @@ -322,7 +322,7 @@ payChan(AccountID const& src, AccountID const& dst, std::uint32_t seq) noexcept { return { ltPAYCHAN, - indexHash(LedgerNameSpace::XRP_PAYMENT_CHANNEL, src, dst, seq)}; + indexHash(LedgerNameSpace::PAYMENT_CHANNEL, src, dst, seq)}; } } // namespace keylet