From d6803868a1cfc0d854440185cd822419d49b34be Mon Sep 17 00:00:00 2001 From: tequ Date: Thu, 19 Mar 2026 15:00:09 +0900 Subject: [PATCH] fix M5 --- .../Sponsor/SponsorshipTransfer.cpp | 20 ++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/libxrpl/tx/transactors/Sponsor/SponsorshipTransfer.cpp b/src/libxrpl/tx/transactors/Sponsor/SponsorshipTransfer.cpp index 2b2ec6647a..41665c75b1 100644 --- a/src/libxrpl/tx/transactors/Sponsor/SponsorshipTransfer.cpp +++ b/src/libxrpl/tx/transactors/Sponsor/SponsorshipTransfer.cpp @@ -351,13 +351,19 @@ adjustReserveCount( int32_t const afterReserveCount = reserveCount + delta; if (afterReserveCount < 0) + { // already checked in preclaim() return tefINTERNAL; // LCOV_EXCL_LINE + } if (afterReserveCount == 0) + { sponsorSle->makeFieldAbsent(sfReserveCount); + } else + { sponsorSle->setFieldU32(sfReserveCount, afterReserveCount); + } view.update(sponsorSle); return tesSUCCESS; } @@ -377,11 +383,15 @@ SponsorshipTransfer::doApply() return tefINTERNAL; // LCOV_EXCL_LINE auto const setSponsorFieldU32 = [](auto const& sle, auto const& field, auto const& delta) { - auto const newValue = sle->getFieldU32(field) + delta; - if (newValue == 0) + int32_t const newValue = static_cast(sle->getFieldU32(field)) + delta; + if (newValue <= 0) + { sle->makeFieldAbsent(field); + } else - sle->setFieldU32(field, newValue); + { + sle->setFieldU32(field, static_cast(newValue)); + } }; if (isObjectSponsor) @@ -475,10 +485,12 @@ SponsorshipTransfer::doApply() if (auto const sponsorSle = view().exists(keylet::sponsor(oldSponsorAccountID, account_)); sponsorSle) + { if (auto const ter = adjustReserveCount(view(), account_, oldSponsorAccountID, ownerCountDelta); !isTesSuccess(ter)) return ter; + } } else if (flags & tfSponsorshipEnd) { @@ -501,10 +513,12 @@ SponsorshipTransfer::doApply() if (auto const sponsorSle = view().exists(keylet::sponsor(oldSponsorAccountID, account_)); sponsorSle) + { if (auto const ter = adjustReserveCount(view(), account_, oldSponsorAccountID, ownerCountDelta); !isTesSuccess(ter)) return ter; + } // remove sponsor from object objSle->makeFieldAbsent(sponsorField);