Skip to content

Commit aa174a8

Browse files
authored
Merge new sponsored fee commits
2 parents eba750f + 691f695 commit aa174a8

File tree

7 files changed

+212
-125
lines changed

7 files changed

+212
-125
lines changed

include/xrpl/tx/transactors/sponsor/SponsorshipSet.h

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,10 +24,6 @@ class SponsorshipSet : public Transactor
2424

2525
TER
2626
doApply() override;
27-
28-
// Interface used by DeleteAccount
29-
static TER
30-
deleteSponsorship(ApplyView& view, std::shared_ptr<SLE> const& sle, beast::Journal j);
3127
};
3228

3329
} // namespace xrpl

src/libxrpl/ledger/helpers/RippleStateHelpers.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -781,6 +781,9 @@ deleteAMMTrustLine(
781781
if (ammAccountID && (low != *ammAccountID && high != *ammAccountID))
782782
return terNO_AMM;
783783

784+
auto const sponsorSle =
785+
getLedgerEntryReserveSponsor(view, sleState, !ammLow ? sfLowSponsor : sfHighSponsor);
786+
784787
if (auto const ter = trustDelete(view, sleState, low, high, j); !isTesSuccess(ter))
785788
{
786789
JLOG(j.error()) << "deleteAMMTrustLine: failed to delete the trustline.";
@@ -791,10 +794,7 @@ deleteAMMTrustLine(
791794
if ((sleState->getFlags() & uFlags) == 0u)
792795
return tecINTERNAL; // LCOV_EXCL_LINE
793796

794-
auto const sponsorSle =
795-
getLedgerEntryReserveSponsor(view, sleState, !ammLow ? sfLowSponsor : sfHighSponsor);
796797
adjustOwnerCount(view, !ammLow ? sleLow : sleHigh, sponsorSle, -1, j);
797-
removeSponsorFromLedgerEntry(sleState, !ammLow ? sfLowSponsor : sfHighSponsor);
798798

799799
return tesSUCCESS;
800800
}

src/libxrpl/tx/Transactor.cpp

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,11 @@ Transactor::preflight1(PreflightContext const& ctx, std::uint32_t flagMask)
185185
return temINVALID_FLAG;
186186
}
187187
}
188+
else
189+
{
190+
JLOG(ctx.j.debug()) << "preflight1: no sponsor flags";
191+
return temINVALID_FLAG;
192+
}
188193

189194
if (auto const ret = preflight0(ctx, flagMask))
190195
return ret;
@@ -234,13 +239,6 @@ Transactor::preflight1(PreflightContext const& ctx, std::uint32_t flagMask)
234239
return temMALFORMED;
235240
}
236241

237-
// if (hasSponsor && hasSponsorFlags &&
238-
// ctx.tx.getFieldU32(sfSponsorFlags) == 0)
239-
// {
240-
// JLOG(ctx.j.debug()) << "preflight1: sponsor with no sponsorship flags";
241-
// return temINVALID_FLAG;
242-
// }
243-
244242
return tesSUCCESS;
245243
}
246244

@@ -1188,7 +1186,12 @@ Transactor::reset(XRPAmount fee)
11881186
// If for some reason we are unable to consume the ticket or sequence
11891187
// then the ledger is corrupted. Rather than make things worse we
11901188
// reject the transaction.
1191-
payerSle->setFieldAmount(payer.balanceField, balance - fee);
1189+
auto const feeAmountAfter = balance - fee;
1190+
if (feeAmountAfter == beast::zero && payer.balanceField == sfFeeAmount)
1191+
// Because ltSponsorship.sfFeeAmount is soeOptional
1192+
payerSle->makeFieldAbsent(payer.balanceField);
1193+
else
1194+
payerSle->setFieldAmount(payer.balanceField, feeAmountAfter);
11921195

11931196
TER const ter{consumeSeqProxy(txnAcct)};
11941197
XRPL_ASSERT(isTesSuccess(ter), "xrpl::Transactor::reset : result is tesSUCCESS");

src/libxrpl/tx/transactors/Sponsor/SponsorshipSet.cpp

Lines changed: 4 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -219,10 +219,14 @@ SponsorshipSet::doApply()
219219

220220
auto const sponsorPage = view().dirInsert(
221221
keylet::ownerDir(sponsorAccountID), sponsorKeylet, describeOwnerDir(sponsorAccountID));
222+
if (!sponsorPage)
223+
return tecDIR_FULL; // LCOV_EXCL_LINE
222224
(*newSle)[sfOwnerNode] = *sponsorPage;
223225

224226
auto const sponseePage = view().dirInsert(
225227
keylet::ownerDir(sponseeAccountID), sponsorKeylet, describeOwnerDir(sponseeAccountID));
228+
if (!sponseePage)
229+
return tecDIR_FULL; // LCOV_EXCL_LINE
226230
(*newSle)[sfSponseeNode] = *sponseePage;
227231

228232
adjustOwnerCount(view(), sponsorAccSle, reserveSponsorAccSle, 1, ctx_.journal);
@@ -291,39 +295,4 @@ SponsorshipSet::doApply()
291295
return tesSUCCESS;
292296
}
293297

294-
TER
295-
SponsorshipSet::deleteSponsorship(
296-
ApplyView& view,
297-
std::shared_ptr<SLE> const& sle,
298-
beast::Journal j)
299-
{
300-
auto const sponsorAccountID = sle->getAccountID(sfOwner);
301-
auto const sponseeAccountID = sle->getAccountID(sfSponsee);
302-
303-
// adjust balance
304-
auto const sponsorAccSle = view.peek(keylet::account(sponsorAccountID));
305-
if (!sponsorAccSle)
306-
return tecINTERNAL; // LCOV_EXCL_LINE
307-
308-
if (sle->isFieldPresent(sfFeeAmount))
309-
{
310-
auto const feeAmount = sle->getFieldAmount(sfFeeAmount);
311-
(*sponsorAccSle)[sfBalance] += feeAmount;
312-
}
313-
314-
auto const reserveSponsor = getLedgerEntryReserveSponsor(view, sle);
315-
adjustOwnerCount(view, sponsorAccSle, reserveSponsor, -1, j);
316-
317-
view.update(sponsorAccSle);
318-
319-
// delete sponsor node
320-
view.dirRemove(keylet::ownerDir(sponsorAccountID), (*sle)[sfOwnerNode], sle->key(), false);
321-
// delete sponsee node
322-
view.dirRemove(keylet::ownerDir(sponseeAccountID), (*sle)[sfSponseeNode], sle->key(), false);
323-
324-
view.erase(sle);
325-
326-
return tesSUCCESS;
327-
}
328-
329298
} // namespace xrpl

src/libxrpl/tx/transactors/Sponsor/SponsorshipTransfer.cpp

Lines changed: 22 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -204,10 +204,7 @@ getLedgerEntrySponsorField(T const& sle, AccountID const& owner)
204204
return sfLowSponsor;
205205
}
206206
// LCOV_EXCL_START
207-
XRPL_ASSERT(
208-
false,
209-
"Should not happen. Owner should be checked before calling "
210-
"this function.");
207+
UNREACHABLE("Should not happen. Owner should be checked before calling this function.");
211208
// LCOV_EXCL_STOP
212209
}
213210
default:
@@ -271,6 +268,11 @@ SponsorshipTransfer::preclaim(PreclaimContext const& ctx)
271268
// check object is sponsored
272269
if (!sle->isFieldPresent(sponsorField))
273270
return tecNO_PERMISSION;
271+
272+
// only the sponsor or sponsee can end sponsorship
273+
auto const sponsor = sle->getAccountID(sponsorField);
274+
if (account != sponsor && account != sponseeAccountID)
275+
return tecNO_PERMISSION;
274276
}
275277

276278
// check new sponsor have sufficient balance
@@ -312,6 +314,11 @@ SponsorshipTransfer::preclaim(PreclaimContext const& ctx)
312314
// check account is sponsored
313315
if (!sponseeSle->isFieldPresent(sfSponsor))
314316
return tecNO_PERMISSION;
317+
318+
// only the sponsor or sponsee can end sponsorship
319+
auto const sponsor = sponseeSle->getAccountID(sfSponsor);
320+
if (account != sponsor && account != sponseeAccountID)
321+
return tecNO_PERMISSION;
315322
}
316323

317324
// check account have sufficient balance
@@ -403,7 +410,7 @@ SponsorshipTransfer::doApply()
403410
if (!objSle)
404411
return tefINTERNAL; // LCOV_EXCL_LINE
405412

406-
auto const ownerAccountID = getLedgerEntryOwner(view(), objSle, account_);
413+
auto const ownerAccountID = getLedgerEntryOwner(view(), objSle, sponseeAccountID);
407414
if (!ownerAccountID)
408415
return tefINTERNAL; // LCOV_EXCL_LINE
409416

@@ -438,8 +445,8 @@ SponsorshipTransfer::doApply()
438445
if (!hasSignature)
439446
{
440447
// use ReserveCount for pre-funded sponsoring
441-
if (auto const ter =
442-
adjustReserveCount(view(), account_, newSponsorAccountID, -ownerCountDelta);
448+
if (auto const ter = adjustReserveCount(
449+
view(), sponseeAccountID, newSponsorAccountID, -ownerCountDelta);
443450
!isTesSuccess(ter))
444451
return ter;
445452
}
@@ -475,19 +482,19 @@ SponsorshipTransfer::doApply()
475482
if (!hasSignature)
476483
{
477484
// use ReserveCount for pre-funded sponsoring
478-
if (auto const ter =
479-
adjustReserveCount(view(), account_, newSponsorAccountID, -ownerCountDelta);
485+
if (auto const ter = adjustReserveCount(
486+
view(), sponseeAccountID, newSponsorAccountID, -ownerCountDelta);
480487
!isTesSuccess(ter))
481488
return ter;
482489
}
483490

484491
// payback the reserve count if ltSponsorship exists
485492
if (auto const sponsorSle =
486-
view().exists(keylet::sponsor(oldSponsorAccountID, account_));
493+
view().exists(keylet::sponsor(oldSponsorAccountID, sponseeAccountID));
487494
sponsorSle)
488495
{
489-
if (auto const ter =
490-
adjustReserveCount(view(), account_, oldSponsorAccountID, ownerCountDelta);
496+
if (auto const ter = adjustReserveCount(
497+
view(), sponseeAccountID, oldSponsorAccountID, ownerCountDelta);
491498
!isTesSuccess(ter))
492499
return ter;
493500
}
@@ -511,11 +518,11 @@ SponsorshipTransfer::doApply()
511518

512519
// payback the reserve count if ltSponsorship exists
513520
if (auto const sponsorSle =
514-
view().exists(keylet::sponsor(oldSponsorAccountID, account_));
521+
view().exists(keylet::sponsor(oldSponsorAccountID, sponseeAccountID));
515522
sponsorSle)
516523
{
517-
if (auto const ter =
518-
adjustReserveCount(view(), account_, oldSponsorAccountID, ownerCountDelta);
524+
if (auto const ter = adjustReserveCount(
525+
view(), sponseeAccountID, oldSponsorAccountID, ownerCountDelta);
519526
!isTesSuccess(ter))
520527
return ter;
521528
}

src/libxrpl/tx/transactors/account/AccountDelete.cpp

Lines changed: 0 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -169,18 +169,6 @@ removeDelegateFromLedger(
169169
return DelegateSet::deleteDelegate(view, sleDel, j);
170170
}
171171

172-
TER
173-
removeSponsorshipFromLedger(
174-
ServiceRegistry& registry,
175-
ApplyView& view,
176-
AccountID const&,
177-
uint256 const& delIndex,
178-
std::shared_ptr<SLE> const& sleDel,
179-
beast::Journal j)
180-
{
181-
return SponsorshipSet::deleteSponsorship(view, sleDel, j);
182-
}
183-
184172
// Return nullptr if the LedgerEntryType represents an obligation that can't
185173
// be deleted. Otherwise return the pointer to the function that can delete
186174
// the non-obligation
@@ -207,8 +195,6 @@ nonObligationDeleter(LedgerEntryType t)
207195
return removeCredentialFromLedger;
208196
case ltDELEGATE:
209197
return removeDelegateFromLedger;
210-
case ltSPONSORSHIP:
211-
return removeSponsorshipFromLedger;
212198
default:
213199
return nullptr;
214200
}
@@ -398,9 +384,6 @@ AccountDelete::doApply()
398384
return tefINTERNAL; // LCOV_EXCL_LINE
399385

400386
// Transfer any XRP remaining after the fee is paid to the destination:
401-
// Use the current balance from the SLE, not mSourceBalance, because
402-
// the cleanup loop may have returned pre-funded sfFeeAmount from
403-
// ltSponsorship objects back to the account's sfBalance.
404387
auto const remainingBalance = src->getFieldAmount(sfBalance).xrp();
405388
(*dst)[sfBalance] = (*dst)[sfBalance] + remainingBalance;
406389
(*src)[sfBalance] = (*src)[sfBalance] - remainingBalance;

0 commit comments

Comments
 (0)