Skip to main content

EvmCacheBuilder

Struct EvmCacheBuilder 

Source
pub struct EvmCacheBuilder<P> { /* private fields */ }
Expand description

Fluent builder for EvmCache.

A readable alternative to the positional EvmCache::with_cache constructor. Defaults: latest block, no disk cache, SpecId::CANCUN.

let provider = ProviderBuilder::new()
    .network::<AnyNetwork>()
    .connect_http("https://example-rpc.invalid".parse()?);
let cache = EvmCache::builder(Arc::new(provider))
    .latest_block()
    .spec(SpecId::CANCUN)
    .build()
    .await;

Implementations§

Source§

impl<P> EvmCacheBuilder<P>
where P: Provider<AnyNetwork> + 'static,

Source

pub fn new(provider: Arc<P>) -> Self

Start a builder over the given provider.

Source

pub fn max_concurrent_proofs(self, cap: usize) -> Self

Cap the default account-proof fetcher’s concurrent eth_getProof fan-out (default 8, name-symmetric with BulkCallConfig::max_concurrent_calls).

eth_getProof is single-address at the RPC level, so when the root gate or an account resync probes N tracked accounts in one seam call, concurrency is the only wall-clock lever: N × RTT serial becomes ~ceil(N / cap) × RTT. Values are clamped to at least 1. Custom fetchers installed via set_account_proof_fetcher ignore this knob.

Source

pub fn block(self, block: BlockId) -> Self

Pin simulations and RPC fetches to a specific block.

Use this to fork at a fixed height for reproducible simulation. Without a call to block or latest_block the builder defaults to the latest block at build time.

Source

pub fn latest_block(self) -> Self

Pin to the latest block.

The height is resolved when build fetches the block header, so the cache forks at whatever was latest at construction. Use block instead to pin a fixed, reproducible height.

Source

pub fn spec(self, spec_id: SpecId) -> Self

Set the EVM hardfork spec (must match the chain’s execution layer).

Source

pub fn chain_id(self, chain_id: u64) -> Self

Set the chain ID reported to simulations via the CHAINID opcode.

Recommended. This is the explicit, authoritative way to set the chain ID. If left unset, build infers it from the provider (eth_chainId), falling back to 1 (Ethereum mainnet) only if that query fails. A disk cache_config also carries a chain_id (which additionally namespaces the on-disk cache directory); when both are set, the value passed here wins for the CHAINID opcode, so keep them consistent.

Source

pub fn cache_config(self, cache_config: CacheConfig) -> Self

Enable disk-backed caching with the given configuration.

Supplying a CacheConfig turns on persistence of EVM state, bytecodes, and immutable data under the configured chain directory; the cache is loaded on build and flushed on drop. Omit it for a purely in-memory cache backed solely by RPC.

Source

pub fn shared_memory_capacity(self, capacity: SharedMemoryCapacity) -> Self

Set how much EVM shared memory to pre-allocate per simulation context.

Defaults to SharedMemoryCapacity::Fixed with 64 * 1024 bytes (65,536 bytes). Use Fixed(n) to pin a size, or SharedMemoryCapacity::Auto to size it from the chain state loaded at build time (e.g. a bincode state file supplied via cache_config). See SharedMemoryCapacity for the trade-offs.

Source

pub fn storage_batch_config(self, config: impl Into<StorageBatchConfig>) -> Self

Set the concrete storage batch-fetch configuration for this cache instance.

The config controls the batch size and concurrency used by the provider-backed StorageBatchFetchFn. Defaults to StorageBatchConfig::default (the CacheSpeedMode::Slow preset). Different cache instances can use different values in the same process. Zero values are normalized to one.

Source

pub fn speed_mode(self, mode: CacheSpeedMode) -> Self

Set the storage batch-fetch profile from a preset.

Shorthand for storage_batch_config with mode.into().

Source

pub fn storage_fetch_strategy(self, strategy: StorageFetchStrategy) -> Self

Choose how the cache’s batch storage fetcher loads slots.

Defaults to StorageFetchStrategy::BulkCall with BulkCallConfig::default: bulk eth_call state-override extraction, repaired by (and degrading to) the point-read fetcher that storage_batch_config tunes. Use StorageFetchStrategy::PointRead to restore the classic per-slot behavior.

Source

pub fn bulk_call_config(self, config: BulkCallConfig) -> Self

Tune the bulk eth_call extraction path.

Shorthand for storage_fetch_strategy with StorageFetchStrategy::BulkCall(config) — e.g. raising max_slots_per_call on a provider with a generous gas cap, or selecting CallDispatch::CallMany on Erigon-lineage endpoints.

Source

pub fn block_context_requirements(self, reqs: BlockContextRequirements) -> Self

Set which block-context header fields the cache requires.

See BlockContextRequirements. Defaults to lenient. Only try_build enforces non-lenient requirements at construction; the infallible build always stays lenient.

Source

pub fn strict_block_context(self, strict: bool) -> Self

Convenience toggle: require every block-context field (true) or none (false).

Equivalent to block_context_requirements with strict / lenient. Enforced only by try_build.

Source

pub async fn build(self) -> EvmCache

Build the EvmCache, fetching the pinned block’s header for context.

If a chain ID was not set via chain_id, it is inferred from the provider (eth_chainId); see chain_id for the full resolution order.

This constructor is infallible and always uses lenient enforcement (a missing block-context field is silently defaulted). To enforce BlockContextRequirements at construction, use try_build instead.

Source

pub async fn try_build(self) -> Result<EvmCache, BlockContextError>

Build the EvmCache, enforcing the configured BlockContextRequirements against the fetched block header.

Builds the cache the same way build does, then, if the requirements are non-lenient, validates the pinned block’s header:

A lenient build never errors (it does not fetch a header solely to validate). On success the requirements are stored on the returned cache so a later advance_block enforces them too.

Auto Trait Implementations§

§

impl<P> Freeze for EvmCacheBuilder<P>

§

impl<P> RefUnwindSafe for EvmCacheBuilder<P>
where P: RefUnwindSafe,

§

impl<P> Send for EvmCacheBuilder<P>
where P: Sync + Send,

§

impl<P> Sync for EvmCacheBuilder<P>
where P: Sync + Send,

§

impl<P> Unpin for EvmCacheBuilder<P>

§

impl<P> UnsafeUnpin for EvmCacheBuilder<P>

§

impl<P> UnwindSafe for EvmCacheBuilder<P>
where P: RefUnwindSafe,

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> Conv for T

Source§

fn conv<T>(self) -> T
where Self: Into<T>,

Converts self into T using Into<T>. Read more
Source§

impl<T> FmtForward for T

Source§

fn fmt_binary(self) -> FmtBinary<Self>
where Self: Binary,

Causes self to use its Binary implementation when Debug-formatted.
Source§

fn fmt_display(self) -> FmtDisplay<Self>
where Self: Display,

Causes self to use its Display implementation when Debug-formatted.
Source§

fn fmt_lower_exp(self) -> FmtLowerExp<Self>
where Self: LowerExp,

Causes self to use its LowerExp implementation when Debug-formatted.
Source§

fn fmt_lower_hex(self) -> FmtLowerHex<Self>
where Self: LowerHex,

Causes self to use its LowerHex implementation when Debug-formatted.
Source§

fn fmt_octal(self) -> FmtOctal<Self>
where Self: Octal,

Causes self to use its Octal implementation when Debug-formatted.
Source§

fn fmt_pointer(self) -> FmtPointer<Self>
where Self: Pointer,

Causes self to use its Pointer implementation when Debug-formatted.
Source§

fn fmt_upper_exp(self) -> FmtUpperExp<Self>
where Self: UpperExp,

Causes self to use its UpperExp implementation when Debug-formatted.
Source§

fn fmt_upper_hex(self) -> FmtUpperHex<Self>
where Self: UpperHex,

Causes self to use its UpperHex implementation when Debug-formatted.
Source§

fn fmt_list(self) -> FmtList<Self>
where &'a Self: for<'a> IntoIterator,

Formats each item in a sequence. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Pipe for T
where T: ?Sized,

Source§

fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> R
where Self: Sized,

Pipes by value. This is generally the method you want to use. Read more
Source§

fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> R
where R: 'a,

Borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> R
where R: 'a,

Mutably borrows self and passes that borrow into the pipe function. Read more
Source§

fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
where Self: Borrow<B>, B: 'a + ?Sized, R: 'a,

Borrows self, then passes self.borrow() into the pipe function. Read more
Source§

fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
where Self: BorrowMut<B>, B: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.borrow_mut() into the pipe function. Read more
Source§

fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
where Self: AsRef<U>, U: 'a + ?Sized, R: 'a,

Borrows self, then passes self.as_ref() into the pipe function.
Source§

fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
where Self: AsMut<U>, U: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.as_mut() into the pipe function.
Source§

fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
where Self: Deref<Target = T>, T: 'a + ?Sized, R: 'a,

Borrows self, then passes self.deref() into the pipe function.
Source§

fn pipe_deref_mut<'a, T, R>( &'a mut self, func: impl FnOnce(&'a mut T) -> R, ) -> R
where Self: DerefMut<Target = T> + Deref, T: 'a + ?Sized, R: 'a,

Mutably borrows self, then passes self.deref_mut() into the pipe function.
Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> Tap for T

Source§

fn tap(self, func: impl FnOnce(&Self)) -> Self

Immutable access to a value. Read more
Source§

fn tap_mut(self, func: impl FnOnce(&mut Self)) -> Self

Mutable access to a value. Read more
Source§

fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Immutable access to the Borrow<B> of a value. Read more
Source§

fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Mutable access to the BorrowMut<B> of a value. Read more
Source§

fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Immutable access to the AsRef<R> view of a value. Read more
Source§

fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Mutable access to the AsMut<R> view of a value. Read more
Source§

fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Immutable access to the Deref::Target of a value. Read more
Source§

fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Mutable access to the Deref::Target of a value. Read more
Source§

fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self

Calls .tap() only in debug builds, and is erased in release builds.
Source§

fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self

Calls .tap_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
where Self: Borrow<B>, B: ?Sized,

Calls .tap_borrow() only in debug builds, and is erased in release builds.
Source§

fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
where Self: BorrowMut<B>, B: ?Sized,

Calls .tap_borrow_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
where Self: AsRef<R>, R: ?Sized,

Calls .tap_ref() only in debug builds, and is erased in release builds.
Source§

fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
where Self: AsMut<R>, R: ?Sized,

Calls .tap_ref_mut() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
where Self: Deref<Target = T>, T: ?Sized,

Calls .tap_deref() only in debug builds, and is erased in release builds.
Source§

fn tap_deref_mut_dbg<T>(self, func: impl FnOnce(&mut T)) -> Self
where Self: DerefMut<Target = T> + Deref, T: ?Sized,

Calls .tap_deref_mut() only in debug builds, and is erased in release builds.
Source§

impl<T> TryConv for T

Source§

fn try_conv<T>(self) -> Result<T, Self::Error>
where Self: TryInto<T>,

Attempts to convert self into T using TryInto<T>. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more