Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
302 commits
Select commit Hold shift + click to select a range
dbbfc13
test for Vault
tequdev Sep 26, 2025
b096662
add InvariantChecks for pseudo-account
tequdev Sep 26, 2025
75aaeb5
Merge remote-tracking branch 'upstream/develop' into sponsor
tequdev Sep 26, 2025
1ee2508
Merge remote-tracking branch 'upstream/develop' into sponsor
tequdev Sep 30, 2025
5b64ff0
address 5594, 5592 changes
tequdev Sep 30, 2025
bc1ef1e
add tests for XChainBridge
tequdev Oct 2, 2025
59c3d5b
add insufficient reserve check for xchain, vault
tequdev Oct 2, 2025
4126d53
Merge remote-tracking branch 'origin/develop' into sponsor
tequdev Oct 3, 2025
ee385e9
fix bad merge
tequdev Oct 3, 2025
101b70f
add assert when adding/removing sponsor field to LedgerEntry
tequdev Oct 3, 2025
bc71d9c
Add support for extra transaction signature validation
ximinez Oct 3, 2025
d597726
refactor: signature autofilling for Simulate RPC
tequdev Oct 4, 2025
8d32b0f
Add jtx, STObject, and RPC support for sig object fields
ximinez Oct 6, 2025
1441abc
use `sfSponsorSignature`
tequdev Oct 3, 2025
9df0ad6
Merge branch 'sponsor-new-signing' into sponsor
tequdev Oct 7, 2025
28c5cad
fix transactions.macro format
tequdev Oct 7, 2025
a6b0eff
typo
tequdev Oct 7, 2025
32cc782
Merge branch 'refactor-simulate-autofill' into sponsor
tequdev Oct 7, 2025
754f597
Support sfSponsorSignature autofilling in Simulate RPC
tequdev Oct 7, 2025
7f922c4
reserve co-signing
tequdev Oct 7, 2025
a65cf6e
add tests for sponsor flags
tequdev Oct 8, 2025
d8dc000
add prefunded sponsor tests
tequdev Oct 8, 2025
5d597e3
Merge remote-tracking branch 'upstream/develop' into sponsor
tequdev Oct 16, 2025
2337d34
Allow delegation for Sponsorship transactions
tequdev Oct 17, 2025
4fe7e87
Merge remote-tracking branch 'upstream/develop' into sponsor
tequdev Oct 17, 2025
d0bcca6
Fix the behavior of co-sign + pre-fund
tequdev Oct 28, 2025
965ecd3
Add sponsored outer batch
tequdev Oct 28, 2025
774917d
Merge remote-tracking branch 'upstream/develop' into sponsor
tequdev Oct 31, 2025
b4188a8
address reviews
tequdev Nov 6, 2025
3e6d6c6
Merge remote-tracking branch 'upstream/develop' into sponsor
tequdev Nov 6, 2025
13145f6
fix header name
tequdev Nov 6, 2025
297083e
fix: specify type for adjust variable in SetOracle transaction proces…
tequdev Nov 6, 2025
cd62f7f
remove copyright
tequdev Nov 6, 2025
e03c7a9
add sponsor transfer test
tequdev Nov 9, 2025
fbf403a
add tests for sponsor field
tequdev Nov 9, 2025
a49cb91
add tests
tequdev Nov 10, 2025
3f96735
fix comment for LCOV
tequdev Nov 10, 2025
af9d91b
add tests fro SponsorshipTransfer
tequdev Nov 10, 2025
9d1b5eb
Merge remote-tracking branch 'upstream/develop' into sponsor
tequdev Nov 17, 2025
b5db596
update Sponsored VaultCreate test
tequdev Nov 17, 2025
c38cb90
Merge remote-tracking branch 'upstream/develop' into sponsor
tequdev Nov 21, 2025
7f0a940
Merge remote-tracking branch 'upstream/develop' into sponsor
tequdev Nov 21, 2025
a9629ae
address reviews
tequdev Nov 21, 2025
d96998c
Merge remote-tracking branch 'upstream/develop' into sponsor
tequdev Nov 26, 2025
e49d338
address SponsorshipSet reviews
tequdev Nov 26, 2025
f5e2195
address reviews
tequdev Dec 11, 2025
ea29fe5
Merge remote-tracking branch 'upstream/develop' into sponsor
tequdev Dec 11, 2025
0f36de8
Merge remote-tracking branch 'upstream/develop' into sponsor
tequdev Jan 7, 2026
198f3f8
remove unused insSponsorCoSigning args
tequdev Jan 7, 2026
163a2ac
add `sfPreviousTxnID` and `sfPreviousTxnLgrSeq` to ltSponsorship
tequdev Jan 7, 2026
2813fea
address review
tequdev Jan 7, 2026
cf03c4c
change Sponsor related fields to `soeDEFAULT`
tequdev Jan 7, 2026
edddf3f
address review
tequdev Jan 7, 2026
dc325a9
Merge branch 'develop' into sponsor
tequdev Jan 7, 2026
0791ca1
fix template exception
tequdev Jan 7, 2026
82b146b
fix ripple -> xrpl
tequdev Jan 7, 2026
1e8f6ce
address reviews
tequdev Jan 9, 2026
ffb5382
Merge remote-tracking branch 'upstream/develop' into sponsor
tequdev Jan 9, 2026
f88e964
allow `sponsee` on cspell
tequdev Jan 9, 2026
ec05613
fix typo
tequdev Jan 9, 2026
1bc5a1b
address spec changes (payment flags/ iou amount)
tequdev Jan 14, 2026
f885f02
address spec changes (sfReserveCount, sfFeeAmount)
tequdev Jan 14, 2026
5b91d81
address revew (std::optional + std::shared_ptr<SLE>)
tequdev Jan 15, 2026
9e65dba
fix redundant co-signed sponsor check
tequdev Jan 15, 2026
c321e10
address reviews
tequdev Jan 15, 2026
3568df4
add `calculateReserve` helper
tequdev Jan 15, 2026
c3e5bcf
address review (DeleteAccount)
tequdev Jan 15, 2026
52ae31b
Merge commit 'c9458b72cab68d3cbbf533cc87d14309c2eb93b7' into sponsor
tequdev Jan 15, 2026
204138f
Revert the use of calculateReserve in xrpLiquid
tequdev Jan 15, 2026
f333dd1
add signature existence check, consume ReserveCount if pre-funded spo…
tequdev Jan 27, 2026
1823d70
refactor Oracle Reserve calculation
tequdev Jan 27, 2026
990627f
Merge remote-tracking branch 'upstream/develop' into sponsor
tequdev Jan 27, 2026
ce8049a
fix parseSponsorship
tequdev Jan 27, 2026
88e870b
change sfSponsor to STAccount, Sponsor flags as global flags
tequdev Jan 27, 2026
87718bd
remove unused HashPrefix
tequdev Jan 29, 2026
8be44c7
Merge remote-tracking branch 'upstream/develop' into sponsor
tequdev Jan 29, 2026
ab1de45
add comment
tequdev Jan 29, 2026
5f385e0
update to use sfSponsorFlags
tequdev Jan 30, 2026
6576823
Payback ReserveCount
tequdev Jan 30, 2026
d7ab1b4
Separate test suite
tequdev Jan 30, 2026
c0de722
`sfHigh/LowSponsorAccount` -> `High/LowSponsor`
tequdev Jan 30, 2026
5155a94
Add sponsor tests for Batch innerTxn
tequdev Jan 30, 2026
4cd8d0d
fix simulate test
tequdev Jan 30, 2026
175a2df
chang `sfFeeAmount` to `soeOPTIONAL`
tequdev Jan 30, 2026
7cdaa24
Fixed the minimum amount for creating a Sponsored Account.
tequdev Jan 30, 2026
40cf599
Add sanity check for sponsoringAccountCount = 0
tequdev Jan 30, 2026
8f8fc03
Add InvariantChecks for if OwnerCount < SponsoredOwnerCount
tequdev Jan 30, 2026
0a41002
refactor SponsorshipSet flag checks
tequdev Jan 30, 2026
4a205eb
add checks to accountReserve and fix sponsored owner count for xrpLiquid
tequdev Jan 30, 2026
527d7bb
fix to return error if FeeAmount > Balance on SponsorshipSet
tequdev Jan 30, 2026
8d24afe
Merge remote-tracking branch 'upstream/develop' into sponsor
tequdev Jan 30, 2026
4e87de7
add test for Sponsored trustline
tequdev Jan 30, 2026
d390bc7
clang-format
tequdev Jan 30, 2026
f820908
Add tests for LoanBroker transactions
tequdev Feb 1, 2026
37f4ea9
Add tests for Loan
tequdev Feb 2, 2026
49c5269
`sfSponsorAccount` -> `sfSponsor`/`sfCounterpartySponsor`
tequdev Feb 2, 2026
fe07547
address review
tequdev Feb 2, 2026
e1aee43
address review
tequdev Feb 3, 2026
446681d
Merge remote-tracking branch 'upstream/develop' into sponsor
tequdev Feb 18, 2026
392a913
audit 3
tequdev Feb 18, 2026
d1d613d
audit 4
tequdev Feb 18, 2026
c1e1be5
audit 5
tequdev Feb 18, 2026
686f945
audit 6
tequdev Feb 18, 2026
bf4fa37
audit 7
tequdev Feb 18, 2026
f6d79f7
audit 8
tequdev Feb 18, 2026
9859ba8
audit 9
tequdev Feb 18, 2026
9cde57d
audit 10
tequdev Feb 18, 2026
fe5fab0
audit 11
tequdev Feb 18, 2026
2fd8e1b
audit 12
tequdev Feb 18, 2026
dcfcb1f
audit 13
tequdev Feb 18, 2026
293394f
audit 14
tequdev Feb 18, 2026
178bb8f
Allow zero value for ReserveCount, FeeAmount, MaxFee
tequdev Feb 21, 2026
f86b255
Add `SponsorshipEnd/Create/Reassign` flags for SponsorshipTransfer
tequdev Feb 21, 2026
4a91351
Add `sfSponsee` to `ttSponsorshipTransfer`
tequdev Feb 22, 2026
1ad6dd1
Add tests for deleting Sponsor Account with ltSponsorship
tequdev Feb 23, 2026
062ece3
Merge remote-tracking branch 'upstream/develop' into sponsor
tequdev Feb 23, 2026
9961887
clang-format
tequdev Feb 23, 2026
53f407e
Merge remote-tracking branch 'upstream/develop' into sponsor
tequdev Mar 17, 2026
fb86735
use pragma once
tequdev Mar 17, 2026
d1eb22b
fix transactions.macro format
tequdev Mar 17, 2026
b9f1c97
format SetTrust.cpp
tequdev Mar 17, 2026
8c8ecff
remove tx parameter from adjustOwnerCount()
tequdev Mar 17, 2026
8a05e3d
remove unnecessary #endif in Sponsor.h and sponsor.h
tequdev Mar 17, 2026
85e1f2b
Rename [sponsor|sponsee]Acc,[sponsor|sponsee]Account to [sponsor|spon…
tequdev Mar 17, 2026
839ba17
Refactor: sponsorship-related helpers
tequdev Mar 17, 2026
c9666d7
refactor `adjustOwnerCount()` to use `adjustSponsorOwnerCountHlp()`
tequdev Mar 17, 2026
15be714
remove unnecessary reserveCount check
tequdev Mar 17, 2026
c79814a
remove unused Sponsor.h
tequdev Mar 17, 2026
eb7e01d
Remove unused tx parameter from removeEmptyHolding()
tequdev Mar 17, 2026
8d75f3b
remove `asfDisallowIncomingSponsor`
tequdev Mar 17, 2026
d95b6e4
Refactor variable declarations in xrpLiquid
tequdev Mar 17, 2026
024ab07
minor fixes
tequdev Mar 17, 2026
234d2e5
Refactor ownerCount and calculateReserve to use SLE::const_ref
tequdev Mar 17, 2026
37c95ea
Merge remote-tracking branch 'upstream/develop' into sponsor
tequdev Mar 17, 2026
8baec56
pre-commit run --all-files
tequdev Mar 17, 2026
b32ff18
refactor getFeePayer()
tequdev Mar 17, 2026
f13945e
Merge remote-tracking branch 'upstream/develop' into sponsor
tequdev Mar 19, 2026
6555001
make sponsor helpers inline
tequdev Mar 19, 2026
e40e15a
fix C2, C4
tequdev Mar 19, 2026
f8a8c23
fix M2
tequdev Mar 19, 2026
9a6432d
fix M3
tequdev Mar 19, 2026
d680386
fix M5
tequdev Mar 19, 2026
d1346fa
fix M6
tequdev Mar 19, 2026
6d7ffcb
fix M7
tequdev Mar 19, 2026
b695b4b
Add comments for PreFunded sponsor reserve checks on TrustSet
tequdev Mar 23, 2026
53bdfb2
Add comment to clarify that the door account should not have a sponso…
tequdev Mar 23, 2026
2f0adfa
fix M11
tequdev Mar 23, 2026
22bfc5e
fix M15
tequdev Mar 23, 2026
968493f
fix M16
tequdev Mar 23, 2026
64f699a
fix M17
tequdev Mar 23, 2026
5280a18
fix L4
tequdev Mar 23, 2026
7ddda1b
fix L5
tequdev Mar 23, 2026
1adaeac
fix L14
tequdev Mar 23, 2026
de64bc7
fix L18
tequdev Mar 23, 2026
fd39368
fix L20
tequdev Mar 23, 2026
afcc3c6
Merge remote-tracking branch 'upstream/develop' into sponsor
tequdev Mar 23, 2026
98257d3
Fix SponsorshipSet targeting Pseudo Accounts to return an error
tequdev Mar 23, 2026
aacb8e4
return tem error when SponsorReserve flag is set in Batch OuterTxn
tequdev Mar 23, 2026
41429dc
Merge remote-tracking branch 'upstream/develop' into sponsor
tequdev Mar 25, 2026
d0d4f1d
Merge remote-tracking branch 'upstream/develop' into sponsor
tequdev Mar 30, 2026
2505fa8
fix
tequdev Mar 30, 2026
7c3ca98
Merge remote-tracking branch 'upstream/develop' into sponsor
tequdev Mar 31, 2026
3f4e88c
Merge remote-tracking branch 'xrplf/develop' into sponsor
tequdev Apr 8, 2026
5a195d2
fix path
tequdev Apr 8, 2026
3ea0067
clang-format
tequdev Apr 8, 2026
07d0887
fix path
tequdev Apr 8, 2026
700a528
Merge remote-tracking branch 'upstream/develop' into sponsor
tequdev Apr 9, 2026
4d29453
fix AccountObjects_test.cpp error
tequdev Apr 9, 2026
831f998
clang-tidy
tequdev Apr 9, 2026
7100369
Add test for no SponsorFlag with valid sponsor
tequdev Apr 10, 2026
a115d73
return `tecHAS_OBLIGATIONS` for any conditions when deleting account …
tequdev Apr 10, 2026
4026af1
format
tequdev Apr 10, 2026
25de0ce
fix comment
tequdev Apr 10, 2026
d524670
fix SponsorshipEnd Bypass
tequdev Apr 10, 2026
828b475
fix Wrong Account Passed to getLedgerEntryOwner in doApply
tequdev Apr 10, 2026
6bd2e91
fix Wrong Account in Sponsorship Keylet Lookup Causes Reserve Count
tequdev Apr 10, 2026
9264136
fix deleteAMMTrustLine Reads Sponsor Fields After They Are Erased
tequdev Apr 10, 2026
3df1e66
fix Unchecked std::optional Dereference in SponsorshipSet Create Path
tequdev Apr 10, 2026
16e4f24
fix XRPL_ASSERT(false) to UNREACHABLE
tequdev Apr 10, 2026
525adf1
fix reset() Does Not makeFieldAbsent for Zero FeeAmount
tequdev Apr 10, 2026
b6b3175
add test for insufficient balance to sponsor fee
tequdev Apr 10, 2026
84e84fb
fix Sponsor able to provide sponsorship with just base reserve
tequdev Apr 13, 2026
021eaa8
fix Co-Signed Sponsoring Bypasses Sponsor Balance Check
tequdev Apr 13, 2026
31bc259
fix SponsorshipSet Update FeeAmount Lacks Reserve Floor Check
tequdev Apr 13, 2026
dd82977
Merge remote-tracking branch 'upstream/develop' into sponsor
tequdev Apr 13, 2026
52e7cdc
fix: Sponsored account creation double-counts base reserve #6894
tequdev Apr 21, 2026
207a33d
fix: SponsorshipSet Update FeeAmount Lacks Reserve Floor Check
tequdev Apr 21, 2026
7639bd9
fix: MPTokenIssuanceDestroy reads sponsor from erased SLE #6895
tequdev Apr 21, 2026
773acf0
fix: SponsoringAccountCount has no overflow protection #6898
tequdev Apr 21, 2026
278e25d
fix: Preclaim XRP reserve overestimate for sponsored checks #6899
tequdev Apr 21, 2026
bb27479
fix: TrustSet free trust line check uses sponsor's ownerCount, skippi…
tequdev Apr 21, 2026
b2b2bab
fix: PermissionedDomain invariant skips credential validation for Spo…
tequdev Apr 21, 2026
c072b12
fix: No invariant verifying sfSponsor field on objects matches sponso…
tequdev Apr 21, 2026
3810944
Merge remote-tracking branch 'upstream/develop' into sponsor
tequdev Apr 28, 2026
6ee071c
fix: An incorrect available XRP balance check in AMM deposit allows r…
tequdev Apr 28, 2026
e8deaa1
pre-commit run
tequdev Apr 28, 2026
fbff1c0
levelization
tequdev Apr 28, 2026
c12eff6
apply tidy diff
tequdev Apr 28, 2026
b153213
run pre-commit
tequdev Apr 28, 2026
84bffad
merge_fix
oleks-rip Apr 28, 2026
9b4ab67
Fix delegable test
oleks-rip Apr 24, 2026
462a0b2
Read/const_ref
oleks-rip Mar 18, 2026
ee8d9ca
More universal adjustSponsorOwnerCountHlp
oleks-rip Apr 24, 2026
c5941d6
Unify accountReserve, ownerCount, ownerReserve
oleks-rip Apr 28, 2026
3ad93af
fix: Sponsor's MaxFee cap is bypassed in reset() path, allowing spons…
tequdev Apr 28, 2026
688e568
fix: getLedgerEntryOwner missing ltLOAN_BROKER and ltLOAN prevents ob…
tequdev Apr 30, 2026
d057f07
fix: setSponsorFieldU32 silently clamps to 0 on underflow instead of …
tequdev Apr 30, 2026
aa70d60
Merge remote-tracking branch 'upstream/develop' into sponsor
tequdev Apr 30, 2026
33be9ab
clang-format
tequdev Apr 30, 2026
0c683bf
levelization
tequdev Apr 30, 2026
86c90c8
clang-tidy
tequdev Apr 30, 2026
bca6d8e
fix not to payback ReserveCount
tequdev Apr 30, 2026
50d5e2d
Merge remote-tracking branch 'upstream/develop' into sponsor
tequdev Apr 30, 2026
eb88c0e
Fix clang-format, some refactoring
oleks-rip Apr 29, 2026
2b4ce0f
Merge fixes
oleks-rip Apr 29, 2026
d792e03
adjustOwnerCountObj, more checks, some fixes
oleks-rip Apr 30, 2026
6f43655
Merge branch 'develop' into sponsor
tequdev May 1, 2026
c72fd59
clang-tidy
tequdev May 1, 2026
77ebc29
clang-format
tequdev May 1, 2026
405b314
fix clang-tidy error
tequdev May 1, 2026
b76652b
XRPL_ASSERT -> Throw
oleks-rip May 1, 2026
9d4c496
fix tidy error
tequdev May 1, 2026
f042cd8
Merge remote-tracking branch 'ripple/develop' into dev_rename_merge
oleks-rip May 5, 2026
960aaec
merge fixes
oleks-rip May 5, 2026
ab7bbac
Merge remote-tracking branch 'oleks-rip/dev_rename_merge' into sponsor
tequdev May 6, 2026
7624c18
fix: XChainAddAccountCreateAttestation redirects relayer sponsorship …
tequdev May 6, 2026
a669099
fix
tequdev May 6, 2026
bb4c443
fix ReserveCount Inflation via Co-Signed + Pre-Funded Interaction
tequdev May 18, 2026
08357b1
sponsor AccountID -> sponsorSle
oleks-rip May 14, 2026
39e8199
Merge remote-tracking branch 'ripple/develop' into spns5
oleks-rip May 14, 2026
0bfdfa7
Merge fixes
oleks-rip May 14, 2026
9e5b728
Merge remote-tracking branch 'ripple/develop' into spns5
oleks-rip May 19, 2026
0997b92
Merge fixes
oleks-rip May 19, 2026
8d905ac
Merge remote-tracking branch 'ripp/develop' into spns5
oleks-rip May 20, 2026
3859fca
clang-tidy fixes
oleks-rip May 20, 2026
d561f0d
Merge remote-tracking branch 'tequ/sponsor' into spns5
oleks-rip May 21, 2026
595b612
Merge fixes
oleks-rip May 26, 2026
9ef1949
Merge remote-tracking branch 'ripple/develop' into xrplf/sponsor
oleks-rip May 28, 2026
03fb6d1
Codegen update
oleks-rip Jun 3, 2026
7e5ac6f
Merge remote-tracking branch 'ripple/develop' into xrplf/sponsor
oleks-rip Jun 3, 2026
d70eca3
Merge remote-tracking branch 'ripple/develop' into xrplf/sponsor
oleks-rip Jun 3, 2026
942a950
Codegen update
oleks-rip Jun 3, 2026
64159eb
Revert clang-tidy
oleks-rip Jun 4, 2026
f650d52
Merge remote-tracking branch 'ripple/develop' into xrplf/sponsor
oleks-rip Jun 15, 2026
e521139
clang-tidy
oleks-rip Jun 15, 2026
4fc781e
Merge remote-tracking branch 'ripp/develop' into xrplf/sponsor
oleks-rip Jun 15, 2026
14986cc
Sponsorship should be non-obligated for sponsee (#7552)
yinyiqian1 Jun 17, 2026
aac6be2
fix new CI rule switch fallthrough (#7568)
yinyiqian1 Jun 17, 2026
c2ab83c
fix: Fix UBSan issue (#7554)
mvadari Jun 17, 2026
d1a77b4
Merge branch 'develop' of https://github.com/XRPLF/rippled into xrplf…
mvadari Jun 17, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions cspell.config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -271,6 +271,8 @@ words:
- sles
- soci
- socidb
- sponsee
- sponsees
- SRPMS
- sslws
- statsd
Expand Down
91 changes: 89 additions & 2 deletions include/xrpl/ledger/helpers/AccountRootHelpers.h
Original file line number Diff line number Diff line change
Expand Up @@ -33,9 +33,96 @@ isGlobalFrozen(ReadView const& view, AccountID const& issuer);
[[nodiscard]] XRPAmount
xrpLiquid(ReadView const& view, AccountID const& id, std::int32_t ownerCountAdj, beast::Journal j);

/** Returns the account reserve, in drops.
Actual owner count can be adjusted by delta in ownerCountAdj
The reserve is calculated as
(ownerCount + "sponsoring object count" - "sponsored object count" + additionalOwnerCount) *
increment + (1 if not sponsored account + sponsoringAccountCount) * "reserve base"
*/
[[nodiscard]] XRPAmount
accountReserve(
ReadView const& view,
SLE::const_ref sle,
beast::Journal j,
std::int32_t ownerCountAdj = 0,
std::int32_t reserveCountAdj = 0);

[[nodiscard]] inline XRPAmount
accountReserve(

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This helper only seems to be used in tests, so I think we should remove it

ReadView const& view,
AccountID const& id,
beast::Journal j,
std::int32_t ownerCountAdj = 0,
std::int32_t reserveCountAdj = 0)
{
return accountReserve(view, view.read(keylet::account(id)), j, ownerCountAdj, reserveCountAdj);
}

XRPAmount
baseAccountReserve(ReadView const& view, std::int32_t ownerCount);

[[nodiscard]] TER
checkInsufficientReserve(
ReadView const& view,
STTx const& tx,
SLE::const_ref accSle,
STAmount const& accBalance,
SLE::const_ref sponsorSle,
std::int32_t ownerCountDelta,
std::int32_t reserveCountDelta = 0,
beast::Journal j = beast::Journal{beast::Journal::getNullSink()});

std::uint32_t
ownerCount(
ReadView const& view,
SLE::const_ref sle,
beast::Journal j,
std::int32_t ownerCountAdj = 0);

/** Adjust the owner count up or down. */
void
adjustOwnerCount(ApplyView& view, SLE::ref sle, std::int32_t amount, beast::Journal j);
adjustOwnerCount(
ApplyView& view,
SLE::ref accountSle,
SLE::ref sponsorSle,
std::int32_t amount,
beast::Journal j = beast::Journal{beast::Journal::getNullSink()});

inline void
adjustOwnerCount(
ApplyView& view,
AccountID const& account,
std::optional<AccountID> const& sponsor,
std::int32_t amount,
beast::Journal j = beast::Journal{beast::Journal::getNullSink()})
{
adjustOwnerCount(
view,
view.peek(keylet::account(account)),
sponsor ? view.peek(keylet::account(*sponsor)) : SLE::pointer(),
amount,
j);
}

void
adjustOwnerCountObj(
ApplyView& view,
SLE::ref accountSle,
SLE::ref objectSle,
std::int32_t amount,
beast::Journal j = beast::Journal{beast::Journal::getNullSink()});

inline void
adjustOwnerCountObj(
ApplyView& view,
AccountID const& account,
SLE::ref objectSle,
std::int32_t amount,
beast::Journal j = beast::Journal{beast::Journal::getNullSink()})
{
SLE::ref accountSle = view.peek(keylet::account(account));
adjustOwnerCountObj(view, accountSle, objectSle, amount, j);
}

/** Returns IOU issuer transfer fee as Rate. Rate specifies
* the fee as fractions of 1 billion. For example, 1% transfer rate
Expand Down Expand Up @@ -71,7 +158,7 @@ getPseudoAccountFields();
- null pointer
*/
[[nodiscard]] bool
isPseudoAccount(SLE::const_pointer sleAcct, std::set<SField const*> const& pseudoFieldFilter = {});
isPseudoAccount(SLE::const_ref sleAcct, std::set<SField const*> const& pseudoFieldFilter = {});

/** Convenience overload that reads the account from the view. */
[[nodiscard]] inline bool
Expand Down
39 changes: 28 additions & 11 deletions include/xrpl/ledger/helpers/EscrowHelpers.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
#include <xrpl/ledger/helpers/AccountRootHelpers.h>
#include <xrpl/ledger/helpers/MPTokenHelpers.h>
#include <xrpl/ledger/helpers/RippleStateHelpers.h>
#include <xrpl/ledger/helpers/SponsorHelpers.h>
#include <xrpl/protocol/Feature.h>
#include <xrpl/protocol/Indexes.h>
#include <xrpl/protocol/MPTAmount.h>
Expand All @@ -17,6 +18,7 @@ template <ValidIssueType T>
TER
escrowUnlockApplyHelper(
ApplyView& view,
STTx const& tx,
Rate lockedRate,
SLE::ref sleDest,
STAmount const& xrpBalance,
Expand All @@ -31,6 +33,7 @@ template <>
inline TER
escrowUnlockApplyHelper<Issue>(
ApplyView& view,
STTx const& tx,
Rate lockedRate,
SLE::ref sleDest,
STAmount const& xrpBalance,
Expand All @@ -56,8 +59,13 @@ escrowUnlockApplyHelper<Issue>(
if (!view.exists(trustLineKey) && createAsset)
{
// Can the account cover the trust line's reserve?
if (std::uint32_t const ownerCount = {sleDest->at(sfOwnerCount)};
xrpBalance < view.fees().accountReserve(ownerCount + 1))
auto const sponsorSle = getTxReserveSponsor(view, tx);
if (!sponsorSle)
return sponsorSle.error(); // LCOV_EXCL_LINE

if (auto const ret =
checkInsufficientReserve(view, tx, sleDest, xrpBalance, *sponsorSle, 1, 0, journal);
!isTesSuccess(ret))
{
JLOG(journal.trace()) << "Trust line does not exist. "
"Insufficient reserve to create line.";
Expand All @@ -84,6 +92,7 @@ escrowUnlockApplyHelper<Issue>(
Issue(currency, receiver), // limit of zero
0, // quality in
0, // quality out
*sponsorSle, // sponsor
journal); // journal
!isTesSuccess(ter))
{
Expand Down Expand Up @@ -161,6 +170,7 @@ template <>
inline TER
escrowUnlockApplyHelper<MPTIssue>(
ApplyView& view,
STTx const& tx,
Rate lockedRate,
SLE::ref sleDest,
STAmount const& xrpBalance,
Expand All @@ -176,24 +186,31 @@ escrowUnlockApplyHelper<MPTIssue>(

auto const mptID = amount.get<MPTIssue>().getMptID();
auto const issuanceKey = keylet::mptIssuance(mptID);
if (!view.exists(keylet::mptoken(issuanceKey.key, receiver)) && createAsset && !receiverIssuer)
auto const mptKeylet = keylet::mptoken(issuanceKey.key, receiver);
if (!view.exists(mptKeylet) && createAsset && !receiverIssuer)
{
if (std::uint32_t const ownerCount = {sleDest->at(sfOwnerCount)};
xrpBalance < view.fees().accountReserve(ownerCount + 1))
{
return tecINSUFFICIENT_RESERVE;
}
auto const sponsorSle = getTxReserveSponsor(view, tx);
if (!sponsorSle)
return sponsorSle.error(); // LCOV_EXCL_LINE

if (auto const ter = createMPToken(view, mptID, receiver, 0); !isTesSuccess(ter))
if (auto const ret =
checkInsufficientReserve(view, tx, sleDest, xrpBalance, *sponsorSle, 1, 0, journal);
!isTesSuccess(ret))
return ret;

if (auto const ter = createMPToken(view, mptID, receiver, *sponsorSle, 0);
!isTesSuccess(ter))
{
return ter; // LCOV_EXCL_LINE
}

// update owner count.
adjustOwnerCount(view, sleDest, 1, journal);
adjustOwnerCount(view, sleDest, *sponsorSle, 1, journal);
auto mptSle = view.peek(mptKeylet);
addSponsorToLedgerEntry(mptSle, *sponsorSle);
}

if (!view.exists(keylet::mptoken(issuanceKey.key, receiver)) && !receiverIssuer)
if (!view.exists(mptKeylet) && !receiverIssuer)
return tecNO_PERMISSION;

auto const xferRate = transferRate(view, amount);
Expand Down
6 changes: 6 additions & 0 deletions include/xrpl/ledger/helpers/MPTokenHelpers.h
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,7 @@ canAddHolding(ReadView const& view, MPTIssue const& mptIssue);
[[nodiscard]] TER
authorizeMPToken(
ApplyView& view,
STTx const& tx,
XRPAmount const& priorBalance,
MPTID const& mptIssuanceID,
AccountID const& account,
Expand Down Expand Up @@ -103,6 +104,7 @@ requireAuth(
[[nodiscard]] TER
enforceMPTokenAuthorization(
ApplyView& view,
STTx const& tx,
MPTID const& mptIssuanceID,
AccountID const& account,
XRPAmount const& priorBalance,
Expand Down Expand Up @@ -189,6 +191,7 @@ canMPTTradeAndTransfer(
[[nodiscard]] TER
addEmptyHolding(
ApplyView& view,
STTx const& tx,
AccountID const& accountID,
XRPAmount priorBalance,
MPTIssue const& mptIssue,
Expand All @@ -197,6 +200,7 @@ addEmptyHolding(
[[nodiscard]] TER
removeEmptyHolding(
ApplyView& view,
STTx const& tx,
AccountID const& accountID,
MPTIssue const& mptIssue,
beast::Journal journal);
Expand Down Expand Up @@ -228,13 +232,15 @@ createMPToken(
ApplyView& view,
MPTID const& mptIssuanceID,
AccountID const& account,
SLE::ref sponsorSle,
std::uint32_t const flags);

TER
checkCreateMPT(
xrpl::ApplyView& view,
xrpl::MPTIssue const& mptIssue,
xrpl::AccountID const& holder,
SLE::ref sponsorSle,
beast::Journal j);

//------------------------------------------------------------------------------
Expand Down
3 changes: 2 additions & 1 deletion include/xrpl/ledger/helpers/NFTokenHelpers.h
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ findTokenAndPage(ApplyView& view, AccountID const& owner, uint256 const& nftoken

/** Insert the token in the owner's token directory. */
TER
insertToken(ApplyView& view, AccountID owner, STObject&& nft);
insertToken(ApplyView& view, STTx const& tx, AccountID owner, SLE::ref sponsorSle, STObject&& nft);

/** Remove the token from the owner's token directory. */
TER
Expand Down Expand Up @@ -107,6 +107,7 @@ tokenOfferCreatePreclaim(
TER
tokenOfferCreateApply(
ApplyView& view,
STTx const& tx,
AccountID const& acctID,
STAmount const& amount,
std::optional<AccountID> const& dest,
Expand Down
2 changes: 2 additions & 0 deletions include/xrpl/ledger/helpers/RippleStateHelpers.h
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,7 @@ trustCreate(
// Issuer should be the account being set.
std::uint32_t uQualityIn,
std::uint32_t uQualityOut,
SLE::ref sponsorSle,
beast::Journal j);

[[nodiscard]] TER
Expand Down Expand Up @@ -229,6 +230,7 @@ canTransfer(ReadView const& view, Issue const& issue, AccountID const& from, Acc
[[nodiscard]] TER
addEmptyHolding(
ApplyView& view,
STTx const& tx,
AccountID const& accountID,
XRPAmount priorBalance,
Issue const& issue,
Expand Down
Loading
Loading