1#include <xrpl/ledger/helpers/SponsorHelpers.h>
3#include <xrpl/beast/utility/instrumentation.h>
4#include <xrpl/ledger/ApplyView.h>
5#include <xrpl/ledger/ReadView.h>
6#include <xrpl/ledger/helpers/AccountRootHelpers.h>
7#include <xrpl/ledger/helpers/OracleHelpers.h>
8#include <xrpl/protocol/AccountID.h>
9#include <xrpl/protocol/Feature.h>
10#include <xrpl/protocol/Indexes.h>
11#include <xrpl/protocol/LedgerFormats.h>
12#include <xrpl/protocol/Rules.h>
13#include <xrpl/protocol/SField.h>
14#include <xrpl/protocol/STArray.h>
15#include <xrpl/protocol/STLedgerEntry.h>
16#include <xrpl/protocol/STTx.h>
17#include <xrpl/protocol/TER.h>
18#include <xrpl/protocol/TxFormats.h>
49 ttMPTOKEN_ISSUANCE_CREATE,
50 ttMPTOKEN_ISSUANCE_DESTROY,
51 ttMPTOKEN_ISSUANCE_SET,
58 ttSPONSORSHIP_TRANSFER,
60 return kReserveSponsorAllowed.
contains(txType);
71 "xrpl::getTxReserveSponsorID : sponsor exists + Sponsor enabled");
77std::expected<SLE::pointer, TER>
85 "xrpl::getTxReserveSponsor : sponsor exists + Sponsor enabled");
96std::expected<SLE::const_pointer, TER>
104 "xrpl::getTxReserveSponsor : sponsor exists + Sponsor enabled");
115std::expected<SLE::pointer, TER>
122 accountSle && accountSle->getType() == ltACCOUNT_ROOT,
123 "xrpl::getEffectiveTxReserveSponsor : accountSle exists and is account type");
129 ((accountSle->getType() == ltACCOUNT_ROOT) || (accountSle->getType() == ltESCROW)),
130 "xrpl::getEffectiveTxReserveSponsor : accountSle exists and is account type");
133 if (
isPseudoAccount(accountSle) || accountSle->getAccountID(sfAccount) != ctx.
tx[sfAccount])
143 ((sle->getType() == ltRIPPLE_STATE && (field == sfHighSponsor || field == sfLowSponsor)) ||
144 (sle->getType() != ltRIPPLE_STATE && field == sfSponsor))),
145 "xrpl::getLedgerEntryReserveSponsorID : correct sfield");
147 if (sle->isFieldPresent(field))
148 return sle->getAccountID(field);
160 "xrpl::getLedgerEntryReserveSponsor : sponsor exists + Sponsor enabled");
170 (sle->getType() == ltRIPPLE_STATE && (field == sfHighSponsor || field == sfLowSponsor)) ||
171 (sle->getType() != ltRIPPLE_STATE && field == sfSponsor),
172 "addSponsorToLedgerEntry : Invalid field to the LedgerEntry");
178 "xrpl::addSponsorToLedgerEntry : sponsor exists + Sponsor enabled");
179 sle->setAccountID(field, sponsorSle->getAccountID(sfAccount));
190 if (sponsorSle && *sponsorSle)
194 "xrpl::addSponsorToLedgerEntry : sponsor exists + Sponsor enabled");
203 (sle->getType() == ltRIPPLE_STATE && (field == sfHighSponsor || field == sfLowSponsor)) ||
204 (sle->getType() != ltRIPPLE_STATE && field == sfSponsor),
205 "removeSponsorFromLedgerEntry : Invalid field to the LedgerEntry");
206 if (sle->isFieldPresent(field))
211 "xrpl::removeSponsorFromLedgerEntry : sponsor exists + Sponsor enabled");
212 sle->makeFieldAbsent(field);
226 case ltDEPOSIT_PREAUTH:
228 case ltMPTOKEN_ISSUANCE:
230 case ltSIGNER_LIST: {
234 return signerList->
key() == sle.
key();
237 auto const& ownerField = sle.
isFlag(lsfAccepted) ? sfSubject : sfIssuer;
240 case ltRIPPLE_STATE: {
241 if (sle.
isFlag(lsfHighReserve))
244 if (highAccount == account)
247 if (sle.
isFlag(lsfLowReserve))
250 if (lowAccount == account)
260 UNREACHABLE(
"xrpl::isLedgerEntryOwner : object is not supported by sponsorship.");
276 case ltDEPOSIT_PREAUTH:
277 case ltMPTOKEN_ISSUANCE:
298 case ltSIGNER_LIST: {
303 if (sle.
isFlag(lsfOneOwnerCount))
309 UNREACHABLE(
"AccountRoots are not supported by object sponsorship.");
322 case ltRIPPLE_STATE: {
323 if (sle.
isFlag(lsfHighReserve))
326 if (highAccount == owner)
327 return sfHighSponsor;
329 if (sle.
isFlag(lsfLowReserve))
332 if (lowAccount == owner)
336 UNREACHABLE(
"xrpl::getLedgerEntrySponsorField : unknown owner for RippleState");
Writeable view to a ledger, for applying a transaction.
virtual SLE::pointer peek(Keylet const &k)=0
Prepare to modify the SLE associated with key.
virtual Rules const & rules() const =0
Returns the tx processing rules.
virtual SLE::const_pointer read(Keylet const &k) const =0
Return the state item associated with a key.
bool enabled(uint256 const &feature) const
Returns true if a feature is enabled.
AccountID const & getIssuer() const
std::shared_ptr< STLedgerEntry > const & ref
uint256 const & key() const
Returns the 'key' (or 'index') of this item.
std::shared_ptr< STLedgerEntry > pointer
LedgerEntryType getType() const
std::shared_ptr< STLedgerEntry const > const & const_ref
STArray const & getFieldArray(SField const &field) const
bool isFlag(std::uint32_t) const
bool isFieldPresent(SField const &field) const
AccountID getAccountID(SField const &field) const
STAmount const & getFieldAmount(SField const &field) const
Keylet signerList(AccountID const &account) noexcept
A SignerList.
Keylet account(AccountID const &id) noexcept
AccountID root.
Use hash_* containers for keys that do not need a cryptographically secure hashing algorithm.
TxType
Transaction type identifiers.
std::optional< Rules > const & getCurrentTransactionRules()
bool isReserveSponsored(STTx const &tx)
Whether the transaction's reserve is sponsored (sfSponsor present + spfSponsorReserve set).
std::optional< AccountID > getLedgerEntryReserveSponsorID(SLE::const_ref sle, SF_ACCOUNT const &field=sfSponsor)
Return the AccountID stored in the given sponsor field of a ledger entry, or nullopt if absent.
std::expected< SLE::pointer, TER > getEffectiveTxReserveSponsor(ApplyViewContext ctx, SLE::const_ref accountSle)
The transaction's reserve sponsor for the given account, if applicable.
bool isReserveSponsorAllowed(TxType txType)
Whether the given transaction type may use reserve sponsorship (v1).
std::expected< SLE::pointer, TER > getTxReserveSponsor(ApplyViewContext ctx)
Return a mutable SLE for the transaction's reserve sponsor account.
void addSponsorToLedgerEntry(SLE::ref sle, SLE::const_ref sponsorSle, SF_ACCOUNT const &field=sfSponsor)
Stamp a reserve sponsor onto a ledger entry using an explicit sponsor SLE.
void removeSponsorFromLedgerEntry(SLE::ref sle, SF_ACCOUNT const &field=sfSponsor)
Remove the reserve sponsor field from a ledger entry.
std::uint32_t getLedgerEntryOwnerCount(SLE const &sle)
Return the number of owner-count units the ledger entry consumes.
BaseUInt< 160, detail::AccountIDTag > AccountID
A 160-bit unsigned that uniquely identifies an account.
std::uint32_t calculateOracleReserve(T const &priceDataSeries)
SLE::pointer getLedgerEntryReserveSponsor(ApplyView &view, SLE::const_ref sle, SF_ACCOUNT const &field=sfSponsor)
Return a mutable SLE for the reserve sponsor recorded on a ledger entry.
std::optional< AccountID > getTxReserveSponsorID(STTx const &tx)
Return the AccountID of the transaction's reserve sponsor, or nullopt if unsponsored.
bool isPseudoAccount(SLE::const_pointer sleAcct, std::set< SField const * > const &pseudoFieldFilter={})
Returns true if and only if sleAcct is a pseudo-account or specific pseudo-accounts in pseudoFieldFil...
TypedField< STAccount > SF_ACCOUNT
bool isLedgerEntryOwner(ReadView const &view, SLE const &sle, AccountID const &account)
Whether account is the owner of a ledger entry for sponsorship purposes.
SF_ACCOUNT const & getLedgerEntrySponsorField(SLE const &sle, AccountID const &owner)
Return the SField used to store the reserve sponsor for owner on sle.
bool isLedgerEntrySupportedBySponsorship(SLE const &sle)
Whether this ledger entry type can have a reserve sponsor attached to it.
Bundles the mutable ledger view and the transaction being applied.