xrpld
Loading...
Searching...
No Matches
xrpl::Batch Class Reference

#include <Batch.h>

Inheritance diagram for xrpl::Batch:
Collaboration diagram for xrpl::Batch:

Public Types

enum class  ConsequencesFactoryType { Normal , Blocker , Custom }

Public Member Functions

 Batch (ApplyContext &ctx)
TER doApply () override
 Applies the outer batch transaction.
void visitInvariantEntry (bool isDelete, SLE::const_ref before, SLE::const_ref after) override
 Inspect a single ledger entry modified by this transaction.
bool finalizeInvariants (STTx const &tx, TER result, XRPAmount fee, ReadView const &view, beast::Journal const &j) override
 Check transaction-specific post-conditions after all entries have been visited.
ApplyResult operator() ()
 Process the transaction.
ApplyViewview ()
ApplyView const & view () const
TER checkInvariants (TER result, XRPAmount fee)
 Check all invariants for the current transaction.

Static Public Member Functions

static XRPAmount calculateBaseFee (ReadView const &view, STTx const &tx)
static std::uint32_t getFlagsMask (PreflightContext const &ctx)
static NotTEC preflight (PreflightContext const &ctx)
 Performs preflight validation checks for a Batch transaction.
static NotTEC preflightSigValidated (PreflightContext const &ctx)
static NotTEC checkSign (PreclaimContext const &ctx)
 Checks the validity of signatures for a batch transaction.
static TER preclaim (PreclaimContext const &ctx)
static NotTEC checkSeqProxy (ReadView const &view, STTx const &tx, beast::Journal j)
static NotTEC checkPriorTxAndLastLedger (PreclaimContext const &ctx)
static TER checkFee (PreclaimContext const &ctx, XRPAmount baseFee)
static XRPAmount calculateBaseFee (ReadView const &view, STTx const &tx, std::uint32_t extraBaseFeeMultiplier)
template<class T>
static NotTEC invokePreflight (PreflightContext const &ctx)
template<>
NotTEC invokePreflight (PreflightContext const &ctx)
template<>
NotTEC invokePreflight (PreflightContext const &ctx)
static NotTEC checkGranularSemantics (ReadView const &view, STTx const &tx, std::unordered_set< GranularPermissionType > const &heldGranularPermissions)
 This function can be overridden to introduce additional semantic constraints beyond the granular template validation for granular permissions.
template<class T>
static NotTEC invokeCheckPermission (ReadView const &view, STTx const &tx)
 Checks whether the transaction is authorized to be executed by the delegated account.
static NotTEC checkSponsor (ReadView const &view, STTx const &tx)
static TER ticketDelete (ApplyView &view, AccountID const &account, uint256 const &ticketIndex, beast::Journal j)

Static Public Attributes

static constexpr auto kConsequencesFactory = ConsequencesFactoryType::Normal
static constexpr auto kDisabledTxTypes

Protected Member Functions

TER apply ()
virtual void preCompute ()

Static Protected Member Functions

static NotTEC checkSign (ReadView const &view, ApplyFlags flags, std::optional< uint256 const > const &parentBatchId, AccountID const &idAccount, STObject const &sigObject, beast::Journal const j, bool permitUncreatedAccount=false)
static XRPAmount minimumFee (ServiceRegistry &registry, XRPAmount baseFee, Fees const &fees, ApplyFlags flags)
 Compute the minimum fee required to process a transaction with a given baseFee based on the current server load.
static XRPAmount calculateOwnerReserveFee (ReadView const &view, STTx const &tx)
static bool checkExtraFeatures (PreflightContext const &ctx)
static bool validDataLength (std::optional< Slice > const &slice, std::size_t maxLength)
template<class T>
static bool validNumericRange (std::optional< T > value, T max, T min=T{})
template<class T, class Unit>
static bool validNumericRange (std::optional< T > value, unit::ValueUnit< Unit, T > max, unit::ValueUnit< Unit, T > min=unit::ValueUnit< Unit, T >{})
template<class T>
static bool validNumericMinimum (std::optional< T > value, T min=T{})
 Minimum will usually be zero.
template<class T, class Unit>
static bool validNumericMinimum (std::optional< T > value, unit::ValueUnit< Unit, T > min=unit::ValueUnit< Unit, T >{})
 Minimum will usually be zero.
static NotTEC checkSingleSign (ReadView const &view, AccountID const &idSigner, AccountID const &idAccount, SLE::const_pointer sleAccount, beast::Journal const j)
static NotTEC checkMultiSign (ReadView const &view, ApplyFlags flags, AccountID const &id, STObject const &sigObject, beast::Journal const j)

Protected Attributes

ApplyContextctx_
beast::WrappedSink sink_
beast::Journal const j_
AccountID const accountID_
XRPAmount preFeeBalance_ {}

Private Member Functions

std::pair< TER, XRPAmountreset (XRPAmount fee)
 Reset the context, discarding any changes made and adjust the fee.
TER consumeSeqProxy (SLE::pointer const &sleAccount)
TER payFee ()
std::tuple< TER, XRPAmount, bool > processPersistentChanges (TER result, XRPAmount fee)
void trapTransaction (uint256) const
TER checkTransactionInvariants (TER result, XRPAmount fee)
 Check transaction-specific invariants only.

Static Private Member Functions

static NotTEC checkBatchSign (PreclaimContext const &ctx)
static std::optional< XRPAmountcalculateBaseFeeImpl (ReadView const &view, STTx const &tx)
 Calculates the total base fee for a batch transaction.
static NotTEC checkPermission (ReadView const &view, STTx const &tx, std::unordered_set< GranularPermissionType > &heldGranularPermissions)
static FeePayer getFeePayer (ReadView const &view, STTx const &tx)
static NotTEC preflight1 (PreflightContext const &ctx, std::uint32_t flagMask)
 Performs early sanity checks on the account and fee fields.
static NotTEC preflight2 (PreflightContext const &ctx)
 Checks whether the signature appears valid.
static NotTEC preflightUniversal (PreflightContext const &ctx)
 Universal validations.

Detailed Description

Definition at line 19 of file tx/transactors/system/Batch.h.

Member Enumeration Documentation

◆ ConsequencesFactoryType

enum class xrpl::Transactor::ConsequencesFactoryType
stronginherited
Enumerator
Normal 
Blocker 
Custom 

Definition at line 166 of file Transactor.h.

Constructor & Destructor Documentation

◆ Batch()

xrpl::Batch::Batch ( ApplyContext & ctx)
explicit

Definition at line 24 of file tx/transactors/system/Batch.h.

Member Function Documentation

◆ calculateBaseFee() [1/2]

XRPAmount xrpl::Batch::calculateBaseFee ( ReadView const & view,
STTx const & tx )
static

Definition at line 151 of file Batch.cpp.

◆ getFlagsMask()

std::uint32_t xrpl::Batch::getFlagsMask ( PreflightContext const & ctx)
static

Definition at line 169 of file Batch.cpp.

◆ preflight()

NotTEC xrpl::Batch::preflight ( PreflightContext const & ctx)
static

Performs preflight validation checks for a Batch transaction.

This function validates the structure and contents of a Batch transaction before it is processed. It ensures that the Batch feature is enabled, checks for valid flags, validates the number and uniqueness of inner transactions, and enforces correct signing and fee requirements.

The following validations are performed:

  • The Batch feature must be enabled in the current rules.
  • Only one of the mutually exclusive batch flags must be set.
  • The batch must contain at least two and no more than the maximum allowed inner transactions.
  • Each inner transaction must:
    • Be unique within the batch.
    • Not itself be a Batch transaction.
    • Have the tfInnerBatchTxn flag set.
    • Not include a TxnSignature or Signers field.
    • Have an empty SigningPubKey.
    • Pass its own preflight checks.
    • Have a fee of zero.
    • Have either Sequence or TicketSequence set, but not both or neither.
    • Not duplicate Sequence or TicketSequence values for the same account (for certain flags).
  • Validates that all required inner transaction accounts are present in the batch signers array, and that all batch signers are unique and not the outer account.
  • Verifies the batch signature if batch signers are present.
Parameters
ctxThe PreflightContext containing the transaction and environment.
Returns
NotTEC Returns tesSUCCESS if all checks pass, or an appropriate error code otherwise.

Definition at line 208 of file Batch.cpp.

◆ preflightSigValidated()

NotTEC xrpl::Batch::preflightSigValidated ( PreflightContext const & ctx)
static

Definition at line 405 of file Batch.cpp.

◆ checkSign() [1/2]

NotTEC xrpl::Batch::checkSign ( PreclaimContext const & ctx)
static

Checks the validity of signatures for a batch transaction.

This method first verifies the standard transaction signature by calling Transactor::checkSign. If the signature is not valid it returns the corresponding error code.

Next, it verifies the batch-specific signature requirements by calling Batch::checkBatchSign. If this check fails, it also returns the corresponding error code.

If both checks succeed, the function returns tesSUCCESS.

Parameters
ctxThe PreclaimContext containing transaction and environment data.
Returns
NotTEC Returns tesSUCCESS if all signature checks pass, or an error code otherwise.

Definition at line 543 of file Batch.cpp.

◆ preclaim()

TER xrpl::Batch::preclaim ( PreclaimContext const & ctx)
static

Definition at line 161 of file Batch.cpp.

◆ doApply()

TER xrpl::Batch::doApply ( )
overridevirtual

Applies the outer batch transaction.

This method is responsible for applying the outer batch transaction. The inner transactions within the batch are applied separately in the applyBatchTransactions method after the outer transaction is processed.

Returns
TER Returns tesSUCCESS to indicate successful application of the outer batch transaction.

Implements xrpl::Transactor.

Definition at line 568 of file Batch.cpp.

◆ visitInvariantEntry()

void xrpl::Batch::visitInvariantEntry ( bool isDelete,
SLE::const_ref before,
SLE::const_ref after )
overridevirtual

Inspect a single ledger entry modified by this transaction.

Called once for every SLE created, modified, or deleted by the transaction, before finalizeInvariants. Implementations should accumulate whatever state they need to verify transaction-specific post-conditions.

Parameters
isDeletetrue if the entry was erased from the ledger.
beforethe entry's state before the transaction (nullptr for newly created entries).
afterthe entry's state as supplied by the apply logic for this transaction. For deletions, this is the SLE being erased and is not guaranteed to be null; callers must use isDelete rather than after == nullptr to detect deletions.

Implements xrpl::Transactor.

Definition at line 574 of file Batch.cpp.

◆ finalizeInvariants()

bool xrpl::Batch::finalizeInvariants ( STTx const & tx,
TER result,
XRPAmount fee,
ReadView const & view,
beast::Journal const & j )
nodiscardoverridevirtual

Check transaction-specific post-conditions after all entries have been visited.

Called once after every modified ledger entry has been passed to visitInvariantEntry. Returns true if all transaction-specific invariants hold, or false to fail the transaction with tecINVARIANT_FAILED.

Parameters
txthe transaction being applied.
resultthe tentative TER result so far.
feethe fee consumed by the transaction.
viewread-only view of the ledger after the transaction.
jjournal for logging invariant failures.
Returns
true if all invariants pass; false otherwise.

Implements xrpl::Transactor.

Definition at line 580 of file Batch.cpp.

◆ checkBatchSign()

NotTEC xrpl::Batch::checkBatchSign ( PreclaimContext const & ctx)
staticprivate

Definition at line 501 of file Batch.cpp.

◆ calculateBaseFeeImpl()

std::optional< XRPAmount > xrpl::Batch::calculateBaseFeeImpl ( ReadView const & view,
STTx const & tx )
staticprivate

Calculates the total base fee for a batch transaction.

This function computes the required base fee for a batch transaction, including the base fee for the batch itself, the sum of base fees for all inner transactions, and additional fees for each batch signer. It performs overflow checks and validates the structure of the batch and its signers.

Parameters
viewThe ledger view providing fee and state information.
txThe batch transaction to calculate the fee for.
Returns
XRPAmount The total base fee required for the batch transaction, or std::nullopt on failure (overflow, oversized arrays).

Definition at line 53 of file Batch.cpp.

◆ operator()()

ApplyResult xrpl::Transactor::operator() ( )
inherited

Process the transaction.

Definition at line 1593 of file Transactor.cpp.

◆ view() [1/2]

ApplyView & xrpl::Transactor::view ( )
inherited

Definition at line 175 of file Transactor.h.

◆ view() [2/2]

ApplyView const & xrpl::Transactor::view ( ) const
nodiscardinherited

Definition at line 181 of file Transactor.h.

◆ checkInvariants()

TER xrpl::Transactor::checkInvariants ( TER result,
XRPAmount fee )
nodiscardinherited

Check all invariants for the current transaction.

Runs transaction-specific invariants first (visitInvariantEntry + finalizeInvariants), then protocol-level invariants. Both layers always run; the worst failure code is returned.

Parameters
resultthe tentative TER from transaction processing.
feethe fee consumed by the transaction.
Returns
the final TER after all invariant checks.

Definition at line 1576 of file Transactor.cpp.

◆ checkSeqProxy()

NotTEC xrpl::Transactor::checkSeqProxy ( ReadView const & view,
STTx const & tx,
beast::Journal j )
staticinherited

Definition at line 698 of file Transactor.cpp.

◆ checkPriorTxAndLastLedger()

NotTEC xrpl::Transactor::checkPriorTxAndLastLedger ( PreclaimContext const & ctx)
staticinherited

Definition at line 763 of file Transactor.cpp.

◆ checkFee()

TER xrpl::Transactor::checkFee ( PreclaimContext const & ctx,
XRPAmount baseFee )
staticinherited

Definition at line 516 of file Transactor.cpp.

◆ checkSign() [2/2]

NotTEC xrpl::Transactor::checkSign ( ReadView const & view,
ApplyFlags flags,
std::optional< uint256 const > const & parentBatchId,
AccountID const & idAccount,
STObject const & sigObject,
beast::Journal const j,
bool permitUncreatedAccount = false )
staticprotectedinherited

Definition at line 917 of file Transactor.cpp.

◆ calculateBaseFee() [2/2]

XRPAmount xrpl::Transactor::calculateBaseFee ( ReadView const & view,
STTx const & tx,
std::uint32_t extraBaseFeeMultiplier )
staticinherited

Definition at line 476 of file Transactor.cpp.

◆ invokePreflight() [1/3]

template<class T>
NotTEC xrpl::Transactor::invokePreflight ( PreflightContext const & ctx)
staticinherited

Definition at line 595 of file Transactor.h.

◆ invokePreflight() [2/3]

template<>
NotTEC xrpl::Transactor::invokePreflight ( PreflightContext const & ctx)
staticinherited

◆ invokePreflight() [3/3]

template<>
NotTEC xrpl::Transactor::invokePreflight ( PreflightContext const & ctx)
staticinherited

Definition at line 33 of file Change.cpp.

◆ checkGranularSemantics()

NotTEC xrpl::Transactor::checkGranularSemantics ( ReadView const & view,
STTx const & tx,
std::unordered_set< GranularPermissionType > const & heldGranularPermissions )
staticinherited

This function can be overridden to introduce additional semantic constraints beyond the granular template validation for granular permissions.

It is called by the base invokeCheckPermission method only after the transaction has successfully passed checkGranularSandbox.

Definition at line 275 of file Transactor.h.

◆ invokeCheckPermission()

template<class T>
NotTEC xrpl::Transactor::invokeCheckPermission ( ReadView const & view,
STTx const & tx )
staticinherited

Checks whether the transaction is authorized to be executed by the delegated account.

This function enforces the strict permission check hierarchy. It is explicitly designed NOT to be overridden. Derived transactors must instead implement checkGranularSemantics to add custom validation logic for granular permissions.

The evaluation proceeds as follows:

  • If transaction-level permission is granted, the function immediately returns tesSUCCESS.
  • If transaction-level permission is not granted, the function checks whether the transaction matches the granular permission template defined in permissions.macro. If it does, it then calls checkGranularSemantics to perform any additional, fine-grained validation.

Definition at line 298 of file Transactor.h.

◆ checkSponsor()

NotTEC xrpl::Transactor::checkSponsor ( ReadView const & view,
STTx const & tx )
staticinherited

Definition at line 411 of file Transactor.cpp.

◆ ticketDelete()

TER xrpl::Transactor::ticketDelete ( ApplyView & view,
AccountID const & account,
uint256 const & ticketIndex,
beast::Journal j )
staticinherited

Definition at line 809 of file Transactor.cpp.

◆ apply()

TER xrpl::Transactor::apply ( )
protectedinherited

Definition at line 881 of file Transactor.cpp.

◆ preCompute()

void xrpl::Transactor::preCompute ( )
protectedvirtualinherited

Reimplemented in xrpl::Change, and xrpl::SignerListSet.

Definition at line 875 of file Transactor.cpp.

◆ minimumFee()

XRPAmount xrpl::Transactor::minimumFee ( ServiceRegistry & registry,
XRPAmount baseFee,
Fees const & fees,
ApplyFlags flags )
staticprotectedinherited

Compute the minimum fee required to process a transaction with a given baseFee based on the current server load.

Parameters
registryThe service registry.
baseFeeThe base fee of a candidate transaction
See also
xrpl::calculateBaseFee
Parameters
feesFee settings from the current ledger
flagsTransaction processing fees

Definition at line 506 of file Transactor.cpp.

◆ calculateOwnerReserveFee()

XRPAmount xrpl::Transactor::calculateOwnerReserveFee ( ReadView const & view,
STTx const & tx )
staticprotectedinherited

Definition at line 486 of file Transactor.cpp.

◆ checkExtraFeatures()

bool xrpl::Transactor::checkExtraFeatures ( PreflightContext const & ctx)
staticprotectedinherited

Definition at line 558 of file Transactor.h.

◆ validDataLength()

bool xrpl::Transactor::validDataLength ( std::optional< Slice > const & slice,
std::size_t maxLength )
staticprotectedinherited

Definition at line 361 of file Transactor.cpp.

◆ validNumericRange() [1/2]

template<class T>
bool xrpl::Transactor::validNumericRange ( std::optional< T > value,
T max,
T min = T{} )
staticprotectedinherited

Definition at line 624 of file Transactor.h.

◆ validNumericRange() [2/2]

template<class T, class Unit>
bool xrpl::Transactor::validNumericRange ( std::optional< T > value,
unit::ValueUnit< Unit, T > max,
unit::ValueUnit< Unit, T > min = unit::ValueUnit<Unit, T>{} )
staticprotectedinherited

Definition at line 633 of file Transactor.h.

◆ validNumericMinimum() [1/2]

template<class T>
bool xrpl::Transactor::validNumericMinimum ( std::optional< T > value,
T min = T{} )
staticprotectedinherited

Minimum will usually be zero.

Definition at line 643 of file Transactor.h.

◆ validNumericMinimum() [2/2]

template<class T, class Unit>
bool xrpl::Transactor::validNumericMinimum ( std::optional< T > value,
unit::ValueUnit< Unit, T > min = unit::ValueUnit<Unit, T>{} )
staticprotectedinherited

Minimum will usually be zero.

Definition at line 652 of file Transactor.h.

◆ checkSingleSign()

NotTEC xrpl::Transactor::checkSingleSign ( ReadView const & view,
AccountID const & idSigner,
AccountID const & idAccount,
SLE::const_pointer sleAccount,
beast::Journal const j )
staticprotectedinherited

Definition at line 1018 of file Transactor.cpp.

◆ checkMultiSign()

NotTEC xrpl::Transactor::checkMultiSign ( ReadView const & view,
ApplyFlags flags,
AccountID const & id,
STObject const & sigObject,
beast::Journal const j )
staticprotectedinherited

Definition at line 1050 of file Transactor.cpp.

◆ checkPermission()

NotTEC xrpl::Transactor::checkPermission ( ReadView const & view,
STTx const & tx,
std::unordered_set< GranularPermissionType > & heldGranularPermissions )
staticprivateinherited

Definition at line 381 of file Transactor.cpp.

◆ reset()

std::pair< TER, XRPAmount > xrpl::Transactor::reset ( XRPAmount fee)
privateinherited

Reset the context, discarding any changes made and adjust the fee.

Parameters
feeThe transaction fee to be charged.
Returns
A pair containing the transaction result and the actual fee charged.

Definition at line 1294 of file Transactor.cpp.

◆ getFeePayer()

FeePayer xrpl::Transactor::getFeePayer ( ReadView const & view,
STTx const & tx )
staticprivateinherited

Definition at line 1380 of file Transactor.cpp.

◆ consumeSeqProxy()

TER xrpl::Transactor::consumeSeqProxy ( SLE::pointer const & sleAccount)
privateinherited

Definition at line 791 of file Transactor.cpp.

◆ payFee()

TER xrpl::Transactor::payFee ( )
privateinherited

Definition at line 622 of file Transactor.cpp.

◆ processPersistentChanges()

std::tuple< TER, XRPAmount, bool > xrpl::Transactor::processPersistentChanges ( TER result,
XRPAmount fee )
privateinherited

Definition at line 1430 of file Transactor.cpp.

◆ trapTransaction()

void xrpl::Transactor::trapTransaction ( uint256 txHash) const
privateinherited

Definition at line 1424 of file Transactor.cpp.

◆ preflight1()

NotTEC xrpl::Transactor::preflight1 ( PreflightContext const & ctx,
std::uint32_t flagMask )
staticprivateinherited

Performs early sanity checks on the account and fee fields.

(And passes flagMask to preflight0)

Do not try to call preflight1 from preflight() in derived classes. See the description of invokePreflight for details.

Definition at line 231 of file Transactor.cpp.

◆ preflight2()

NotTEC xrpl::Transactor::preflight2 ( PreflightContext const & ctx)
staticprivateinherited

Checks whether the signature appears valid.

Do not try to call preflight2 from preflight() in derived classes. See the description of invokePreflight for details.

Definition at line 302 of file Transactor.cpp.

◆ preflightUniversal()

NotTEC xrpl::Transactor::preflightUniversal ( PreflightContext const & ctx)
staticprivateinherited

Universal validations.

  • Valid MPTAmount and XRPAmount

    Do not try to call preflightUniversal from preflight() in derived classes. See the description of invokePreflight for details.

Definition at line 342 of file Transactor.cpp.

◆ checkTransactionInvariants()

TER xrpl::Transactor::checkTransactionInvariants ( TER result,
XRPAmount fee )
nodiscardprivateinherited

Check transaction-specific invariants only.

Walks every modified ledger entry via visitInvariantEntry, then calls finalizeInvariants on the derived transactor. Returns tecINVARIANT_FAILED if any transaction invariant is violated.

Parameters
resultthe tentative TER from transaction processing.
feethe fee consumed by the transaction.
Returns
the original result if all invariants pass, or tecINVARIANT_FAILED otherwise.

Definition at line 1542 of file Transactor.cpp.

Member Data Documentation

◆ kConsequencesFactory

auto xrpl::Batch::kConsequencesFactory = ConsequencesFactoryType::Normal
staticconstexpr

Definition at line 22 of file tx/transactors/system/Batch.h.

◆ kDisabledTxTypes

auto xrpl::Batch::kDisabledTxTypes
staticconstexpr
Initial value:
= std::to_array<TxType>({
ttVAULT_CREATE,
ttVAULT_SET,
ttVAULT_DELETE,
ttVAULT_DEPOSIT,
ttVAULT_WITHDRAW,
ttVAULT_CLAWBACK,
ttLOAN_BROKER_SET,
ttLOAN_BROKER_DELETE,
ttLOAN_BROKER_COVER_DEPOSIT,
ttLOAN_BROKER_COVER_WITHDRAW,
ttLOAN_BROKER_COVER_CLAWBACK,
ttLOAN_SET,
ttLOAN_DELETE,
ttLOAN_MANAGE,
ttLOAN_PAY,
})

Definition at line 60 of file tx/transactors/system/Batch.h.

◆ ctx_

ApplyContext& xrpl::Transactor::ctx_
protectedinherited

Definition at line 153 of file Transactor.h.

◆ sink_

beast::WrappedSink xrpl::Transactor::sink_
protectedinherited

Definition at line 154 of file Transactor.h.

◆ j_

beast::Journal const xrpl::Transactor::j_
protectedinherited

Definition at line 155 of file Transactor.h.

◆ accountID_

AccountID const xrpl::Transactor::accountID_
protectedinherited

Definition at line 157 of file Transactor.h.

◆ preFeeBalance_

XRPAmount xrpl::Transactor::preFeeBalance_ {}
protectedinherited

Definition at line 158 of file Transactor.h.