fix: getLedgerEntryOwner missing ltLOAN_BROKER and ltLOAN prevents object sponsorship

This commit is contained in:
tequ
2026-04-30 09:58:36 +09:00
committed by Oleksandr
parent 3ad93af34d
commit 688e568e39
2 changed files with 65 additions and 4 deletions

View File

@@ -118,6 +118,7 @@ getLedgerEntryOwner(ReadView const& view, T const& sle, AccountID const& account
case ltORACLE:
case ltPERMISSIONED_DOMAIN:
case ltVAULT:
case ltLOAN_BROKER:
return sle->getAccountID(sfOwner);
case ltCHECK:
case ltDID:
@@ -134,6 +135,8 @@ getLedgerEntryOwner(ReadView const& view, T const& sle, AccountID const& account
return sle->getAccountID(sfAccount);
case ltMPTOKEN_ISSUANCE:
return sle->getAccountID(sfIssuer);
case ltLOAN:
return sle->getAccountID(sfBorrower);
case ltSIGNER_LIST: {
auto const signerList = view.read(keylet::signers(account));
if (!signerList)

View File

@@ -5129,11 +5129,12 @@ public:
Account const bob("bob");
Account const issuer("issuer");
Account const sponsor("sponsor");
Account const sponsor2("sponsor2");
// LoanBrokerSet / LoanBrokerDelete
{
Env env{*this, testable_amendments()};
env.fund(XRP(1000000), alice, bob, sponsor);
env.fund(XRP(1000000), alice, bob, sponsor, sponsor2);
env.close();
PrettyAsset const asset{xrpIssue(), 1'000'000};
@@ -5167,14 +5168,41 @@ public:
BEAST_EXPECT(sponsoredOwnerCount(env, alice) == 1);
BEAST_EXPECT(sponsoringOwnerCount(env, sponsor) == 1);
// LoanBrokerDelete
auto const brokerKeylet = keylet::loanbroker(alice.id(), env.seq(alice) - 1);
if (cosigning)
{
// transfer sponsor
env(sponsor::transfer(alice, tfSponsorshipReassign, brokerKeylet.key),
sponsor::as(sponsor2, spfSponsorReserve),
sig(sfSponsorSignature, sponsor2));
env.close();
}
else
{
env(sponsor::set_reserve(sponsor2, 0, 1), sponsor::sponseeAcc(alice));
env.close();
// transfer sponsor
env(sponsor::transfer(alice, tfSponsorshipReassign, brokerKeylet.key),
sponsor::as(sponsor2, spfSponsorReserve));
env.close();
}
BEAST_EXPECT(
ownerCount(env, alice) ==
5); // LoanBroker, PseudoAccount(LB), (Vault, PseudoAccount(Vault), MPToken(Vault))
BEAST_EXPECT(sponsoredOwnerCount(env, alice) == 1);
BEAST_EXPECT(sponsoringOwnerCount(env, sponsor) == 0);
BEAST_EXPECT(sponsoringOwnerCount(env, sponsor2) == 1);
// LoanBrokerDelete
env(loanBroker::del(alice, brokerKeylet.key, 0));
env.close();
BEAST_EXPECT(ownerCount(env, alice) == 3);
BEAST_EXPECT(sponsoredOwnerCount(env, alice) == 0);
BEAST_EXPECT(sponsoringOwnerCount(env, sponsor) == 0);
BEAST_EXPECT(sponsoringOwnerCount(env, sponsor2) == 0);
}
// LoanBrokerConverDeposit/Withdraw/Clawback
@@ -5258,7 +5286,7 @@ public:
// LoanSet
{
Env env{*this, testable_amendments()};
env.fund(XRP(1000000), alice, bob, issuer, sponsor);
env.fund(XRP(1000000), alice, bob, issuer, sponsor, sponsor2);
env.close();
MPTTester mptt{env, issuer, mptInitNoFund};
@@ -5346,6 +5374,36 @@ public:
BEAST_EXPECT(ownerCount(env, alice) == 2);
BEAST_EXPECT(sponsoredOwnerCount(env, alice) == 1);
// before transfer
BEAST_EXPECT(ownerCount(env, alice) == 2);
BEAST_EXPECT(sponsoredOwnerCount(env, alice) == 1);
BEAST_EXPECT(sponsoringOwnerCount(env, sponsor) == 1);
if (cosigning)
{
// transfer sponsor
env(sponsor::transfer(alice, tfSponsorshipReassign, loanKeylet.key),
sponsor::as(sponsor2, spfSponsorReserve),
sig(sfSponsorSignature, sponsor2));
env.close();
}
else
{
env(sponsor::set_reserve(sponsor2, 0, 1), sponsor::sponseeAcc(alice));
env.close();
// transfer sponsor
env(sponsor::transfer(alice, tfSponsorshipReassign, loanKeylet.key),
sponsor::as(sponsor2, spfSponsorReserve));
env.close();
}
// after transfer
BEAST_EXPECT(ownerCount(env, alice) == 2);
BEAST_EXPECT(sponsoredOwnerCount(env, alice) == 1);
BEAST_EXPECT(sponsoringOwnerCount(env, sponsor) == 0);
BEAST_EXPECT(sponsoringOwnerCount(env, sponsor2) == 1);
// LoanDelete
env(loan::del(alice, loanKeylet.key),
sponsor::as(sponsor, spfSponsorReserve),