#pragma once #include #include #include #include #include #include namespace xrpl { /** State information when applying a tx. */ class ApplyContext { public: explicit ApplyContext( ServiceRegistry& registry, OpenView& base, std::optional const& parentBatchId, STTx const& tx, TER preclaimResult, XRPAmount baseFee, ApplyFlags flags, beast::Journal journal = beast::Journal{beast::Journal::getNullSink()}); explicit ApplyContext( ServiceRegistry& registry, OpenView& base, STTx const& tx, TER preclaimResult, XRPAmount baseFee, ApplyFlags flags, beast::Journal journal = beast::Journal{beast::Journal::getNullSink()}) : ApplyContext(registry, base, std::nullopt, tx, preclaimResult, baseFee, flags, journal) { XRPL_ASSERT((flags & tapBATCH) == 0, "Batch apply flag should not be set"); } ServiceRegistry& registry; STTx const& tx; TER const preclaimResult; XRPAmount const baseFee; beast::Journal const journal; ApplyView& view() { return *view_; } ApplyView const& view() const { return *view_; } // VFALCO Unfortunately this is necessary RawView& rawView() { return *view_; } ApplyFlags const& flags() const { return flags_; } /** Sets the DeliveredAmount field in the metadata */ void deliver(STAmount const& amount) { view_->deliver(amount); } /** Discard changes and start fresh. */ void discard(); /** Apply the transaction result to the base. */ std::optional apply(TER); /** Get the number of unapplied changes. */ std::size_t size(); /** Visit unapplied changes. */ void visit( std::function const& before, std::shared_ptr const& after)> const& func); void destroyXRP(XRPAmount const& fee) { view_->rawDestroyXRP(fee); } /** Applies all invariant checkers one by one. @param result the result generated by processing this transaction. @param fee the fee charged for this transaction @return the result code that should be returned for this transaction. */ TER checkInvariants(TER const result, XRPAmount const fee); private: TER failInvariantCheck(TER const result); template TER checkInvariantsHelper(TER const result, XRPAmount const fee, std::index_sequence); OpenView& base_; ApplyFlags flags_; std::optional view_; // The ID of the batch transaction we are executing under, if seated. std::optional parentBatchId_; }; } // namespace xrpl