diff --git a/src/test/app/Sponsor_test.cpp b/src/test/app/Sponsor_test.cpp index 05c52ece0c..04478744e0 100644 --- a/src/test/app/Sponsor_test.cpp +++ b/src/test/app/Sponsor_test.cpp @@ -374,6 +374,14 @@ public: env(pay(alice, sponsor1, drops(1))); env.close(); + // Invalid Owner + env(sponsor::transfer(bob, checkId), + sponsor::as(sponsor1, tfSponsorReserve), + sponsor::sig(sponsor1), + ter(tecNO_PERMISSION)); + env.close(); + + // Valid Owner env(sponsor::transfer(alice, checkId), sponsor::as(sponsor1, tfSponsorReserve), sponsor::sig(sponsor1)); @@ -1530,7 +1538,7 @@ public: // transfer sponsor auto const mptTokenKeylet = keylet::mptoken(mptid, bob); - env(sponsor::transfer(alice, mptTokenKeylet.key), + env(sponsor::transfer(bob, mptTokenKeylet.key), sponsor::as(sponsor2, tfSponsorReserve), sponsor::sig(sponsor2)); env.close(); diff --git a/src/xrpld/app/tx/detail/SponsorshipTransfer.cpp b/src/xrpld/app/tx/detail/SponsorshipTransfer.cpp index 03c20668f0..62c2d8d9fc 100644 --- a/src/xrpld/app/tx/detail/SponsorshipTransfer.cpp +++ b/src/xrpld/app/tx/detail/SponsorshipTransfer.cpp @@ -144,9 +144,11 @@ SponsorshipTransfer::preclaim(PreclaimContext const& ctx) if (!sle) return tecNO_ENTRY; + auto const ownerCountDelta = getLedgerEntryOwnerCount(sle); + auto const owner = getLedgerEntryOwner(ctx.view, sle, ctx.tx[sfAccount]); - if (!owner) + if (!owner || owner != ctx.tx[sfAccount]) return tecNO_PERMISSION; if (newSponsor) @@ -166,14 +168,13 @@ SponsorshipTransfer::preclaim(PreclaimContext const& ctx) return tecNO_PERMISSION; } - // check account have sufficient balance + // check new sponsor have sufficient balance if (auto const ter = checkInsufficientReserve( ctx.view, accSle, accSle->getFieldAmount(sfBalance), newSponsor, - // TODO: address variable ownerCount like PriceOracle - 1); + ownerCountDelta); !isTesSuccess(ter)) return ter; }