pub struct Event<S, E> { /* private fields */ }Expand description
Represents an EVM event query.
This query builder is designed for fetching specific Solidity events that occurred within the
block associated with the provided EvmEnv.
§Filtering Capabilities
This Event query builder is intentionally designed to mirror the structure and capabilities of
the [alloy_rpc_types::Filter] type used in standard Ethereum RPC calls, adapted for the
constraints of the RISC Zero zkVM environment.
You can filter events based on:
- Contract Addresses: Use the
.address()method to specify the event source:- A single address matches only events from this address.
- Multiple addresses (pass a
Vec<Address>) matches events from any contract address. - Wildcard (default): If
.address()is not called, or if an emptyVecis provided, it matches events from any contract address.
- Indexed Topics: Use the
.topic1(),.topic2()and.topic3()to filter by the indexed arguments of the event:- A single value matches only events where the topic has this exact value.
- Multiple values (pass a
Vec<B256>) matches events where the topic matches any value in the list. - Wildcard (default): If
.topicX()is not called or if an emptyVecis provided, it matches any value for that topic position.
Certain filtering options available in [alloy_rpc_types::Filter] are not applicable or are fixed within the Steel environment:
- Block Specification: The block context for the query is determined by the
EvmEnv(retrieved viaenv.header()) used to create theEventquery. You cannot specify a block range or a different block hash. - Topic 0 (Event Signature): This topic is automatically set based on the
SolEventtype parameter (S) provided to Event::new or Event::preflight (usingS::SIGNATURE_HASH). It cannot be altered or set to a wildcard/list. Anonymous events (whereS::ANONYMOUSis true) are not supported.
§Usage
The usage pattern mirrors other Steel interactions like Contract:
- Preflight calls on the Host: To prepare the event query on the host environment and build the necessary proof, use Event::preflight.
- Calls in the Guest: To initialize the event query in the guest, use Event::new.
§Examples
Basic usage with a single contract address:
let contract_address = address!("dAC17F958D2ee523a2206206994597C13D831ec7");
sol! {
interface IERC20 {
event Transfer(address indexed from, address indexed to, uint256 value);
}
}
// Host:
let url = "https://ethereum-rpc.publicnode.com".parse()?;
let mut env = EthEvmEnv::builder().rpc(url).chain_spec(Ð_MAINNET_CHAIN_SPEC).build().await?;
let event = Event::preflight::<IERC20::Transfer>(&mut env).address(contract_address);
event.query().await?;
let evm_input = env.into_input().await?;
// Guest:
let env = evm_input.into_env(Ð_MAINNET_CHAIN_SPEC);
let event = Event::new::<IERC20::Transfer>(&env).address(contract_address);
let logs = event.query();
Advanced filtering with multiple addresses and topics:
// define multiple contract addresses and potential senders
let usdt_address = address!("dAC17F958D2ee523a2206206994597C13D831ec7");
let usdc_address = address!("A0b86991c6218b36c1d19D4a2e9Eb0cE3606eB48");
sol! {
interface IERC20 {
event Transfer(address indexed from, address indexed to, uint256 value);
}
}
let url = "https://ethereum-rpc.publicnode.com".parse()?;
let mut env = EthEvmEnv::builder().rpc(url).chain_spec(Ð_MAINNET_CHAIN_SPEC).build().await?;
// Create an event query for Transfer events from *either* USDT or USDC contract,
// originating from *either* sender1 or sender2.
let event = Event::preflight::<IERC20::Transfer>(&mut env)
// filter by contract address: Match USDT OR USDC
.address(vec![usdt_address, usdc_address])
// filter by topic 1 (`from`): Match sender1 OR sender2
.topic1(vec![
address!("0000000000000000000000000000000000000001").into_word(),
address!("0000000000000000000000000000000000000002").into_word(),
]);
// topic2 (`to`) and topic3 are left as wildcards
let logs = event.query().await?;Implementations§
Source§impl<D, F: EvmFactory, C> Event<(), &mut EvmEnv<ProofDb<D>, F, HostCommit<C>>>where
D: EvmDatabase + Send + 'static,
<D as RevmDatabase>::Error: StdError + Send + Sync + 'static,
impl<D, F: EvmFactory, C> Event<(), &mut EvmEnv<ProofDb<D>, F, HostCommit<C>>>where
D: EvmDatabase + Send + 'static,
<D as RevmDatabase>::Error: StdError + Send + Sync + 'static,
Sourcepub fn preflight<S: SolEvent>(
env: &mut EvmEnv<ProofDb<D>, F, HostCommit<C>>,
) -> Event<S, &mut EvmEnv<ProofDb<D>, F, HostCommit<C>>>
Available on crate feature host only.
pub fn preflight<S: SolEvent>( env: &mut EvmEnv<ProofDb<D>, F, HostCommit<C>>, ) -> Event<S, &mut EvmEnv<ProofDb<D>, F, HostCommit<C>>>
host only.Constructor for preflighting an event query for a specific EVM event.
Initializes the environment for event queries, fetching necessary data via the Provider, and generating a storage proof for any accessed elements using EvmEnv::into_input.
Source§impl<S: SolEvent, D, F: EvmFactory, C> Event<S, &mut EvmEnv<ProofDb<D>, F, HostCommit<C>>>where
D: EvmDatabase + Send + 'static,
<D as RevmDatabase>::Error: StdError + Send + Sync + 'static,
impl<S: SolEvent, D, F: EvmFactory, C> Event<S, &mut EvmEnv<ProofDb<D>, F, HostCommit<C>>>where
D: EvmDatabase + Send + 'static,
<D as RevmDatabase>::Error: StdError + Send + Sync + 'static,
Source§impl<F: EvmFactory> Event<(), &EvmEnv<StateDb, F, Commitment>>
impl<F: EvmFactory> Event<(), &EvmEnv<StateDb, F, Commitment>>
Sourcepub fn new<S: SolEvent>(
env: &EvmEnv<StateDb, F, Commitment>,
) -> Event<S, &EvmEnv<StateDb, F, Commitment>>
pub fn new<S: SolEvent>( env: &EvmEnv<StateDb, F, Commitment>, ) -> Event<S, &EvmEnv<StateDb, F, Commitment>>
Constructor for executing an event query for a specific Solidity event.
Source§impl<S: SolEvent, F: EvmFactory> Event<S, &EvmEnv<StateDb, F, Commitment>>
impl<S: SolEvent, F: EvmFactory> Event<S, &EvmEnv<StateDb, F, Commitment>>
Sourcepub fn query(self) -> Vec<Log<S>>
pub fn query(self) -> Vec<Log<S>>
Executes the query and returns the matching logs and panics on failure.
A convenience wrapper for Event::try_query, panicking if the call fails. Useful when success is expected.
Auto Trait Implementations§
impl<S, E> !Freeze for Event<S, E>
impl<S, E> RefUnwindSafe for Event<S, E>where
E: RefUnwindSafe,
S: RefUnwindSafe,
impl<S, E> Send for Event<S, E>
impl<S, E> Sync for Event<S, E>
impl<S, E> Unpin for Event<S, E>
impl<S, E> UnwindSafe for Event<S, E>where
E: UnwindSafe,
S: UnwindSafe,
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
§impl<T> Conv for T
impl<T> Conv for T
§impl<T> FmtForward for T
impl<T> FmtForward for T
§fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
fn fmt_binary(self) -> FmtBinary<Self>where
Self: Binary,
self to use its Binary implementation when Debug-formatted.§fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
fn fmt_display(self) -> FmtDisplay<Self>where
Self: Display,
self to use its Display implementation when
Debug-formatted.§fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
fn fmt_lower_exp(self) -> FmtLowerExp<Self>where
Self: LowerExp,
self to use its LowerExp implementation when
Debug-formatted.§fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
fn fmt_lower_hex(self) -> FmtLowerHex<Self>where
Self: LowerHex,
self to use its LowerHex implementation when
Debug-formatted.§fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
fn fmt_octal(self) -> FmtOctal<Self>where
Self: Octal,
self to use its Octal implementation when Debug-formatted.§fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
fn fmt_pointer(self) -> FmtPointer<Self>where
Self: Pointer,
self to use its Pointer implementation when
Debug-formatted.§fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
fn fmt_upper_exp(self) -> FmtUpperExp<Self>where
Self: UpperExp,
self to use its UpperExp implementation when
Debug-formatted.§fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
fn fmt_upper_hex(self) -> FmtUpperHex<Self>where
Self: UpperHex,
self to use its UpperHex implementation when
Debug-formatted.§fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
fn fmt_list(self) -> FmtList<Self>where
&'a Self: for<'a> IntoIterator,
§impl<TxEnv, T> FromRecoveredTx<&T> for TxEnvwhere
TxEnv: FromRecoveredTx<T>,
impl<TxEnv, T> FromRecoveredTx<&T> for TxEnvwhere
TxEnv: FromRecoveredTx<T>,
§fn from_recovered_tx(tx: &&T, sender: Address) -> TxEnv
fn from_recovered_tx(tx: &&T, sender: Address) -> TxEnv
TxEnv] from a transaction and a sender address.§impl<TxEnv, T> FromTxWithEncoded<&T> for TxEnvwhere
TxEnv: FromTxWithEncoded<T>,
impl<TxEnv, T> FromTxWithEncoded<&T> for TxEnvwhere
TxEnv: FromTxWithEncoded<T>,
§fn from_encoded_tx(tx: &&T, sender: Address, encoded: Bytes) -> TxEnv
fn from_encoded_tx(tx: &&T, sender: Address, encoded: Bytes) -> TxEnv
TxEnv] from a transaction, its sender, and encoded transaction bytes.§impl<T> Instrument for T
impl<T> Instrument for T
§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
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 moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
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§impl<T> Pipe for Twhere
T: ?Sized,
impl<T> Pipe for Twhere
T: ?Sized,
§fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
fn pipe<R>(self, func: impl FnOnce(Self) -> R) -> Rwhere
Self: Sized,
§fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref<'a, R>(&'a self, func: impl FnOnce(&'a Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
fn pipe_ref_mut<'a, R>(&'a mut self, func: impl FnOnce(&'a mut Self) -> R) -> Rwhere
R: 'a,
self and passes that borrow into the pipe function. Read more§fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
fn pipe_borrow<'a, B, R>(&'a self, func: impl FnOnce(&'a B) -> R) -> R
§fn pipe_borrow_mut<'a, B, R>(
&'a mut self,
func: impl FnOnce(&'a mut B) -> R,
) -> R
fn pipe_borrow_mut<'a, B, R>( &'a mut self, func: impl FnOnce(&'a mut B) -> R, ) -> R
§fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
fn pipe_as_ref<'a, U, R>(&'a self, func: impl FnOnce(&'a U) -> R) -> R
self, then passes self.as_ref() into the pipe function.§fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
fn pipe_as_mut<'a, U, R>(&'a mut self, func: impl FnOnce(&'a mut U) -> R) -> R
self, then passes self.as_mut() into the pipe
function.§fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
fn pipe_deref<'a, T, R>(&'a self, func: impl FnOnce(&'a T) -> R) -> R
self, then passes self.deref() into the pipe function.§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
§impl<T> Tap for T
impl<T> Tap for T
§fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow<B>(self, func: impl FnOnce(&B)) -> Self
Borrow<B> of a value. Read more§fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut<B>(self, func: impl FnOnce(&mut B)) -> Self
BorrowMut<B> of a value. Read more§fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref<R>(self, func: impl FnOnce(&R)) -> Self
AsRef<R> view of a value. Read more§fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut<R>(self, func: impl FnOnce(&mut R)) -> Self
AsMut<R> view of a value. Read more§fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref<T>(self, func: impl FnOnce(&T)) -> Self
Deref::Target of a value. Read more§fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
fn tap_deref_mut<T>(self, func: impl FnOnce(&mut T)) -> Self
Deref::Target of a value. Read more§fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
fn tap_dbg(self, func: impl FnOnce(&Self)) -> Self
.tap() only in debug builds, and is erased in release builds.§fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
fn tap_mut_dbg(self, func: impl FnOnce(&mut Self)) -> Self
.tap_mut() only in debug builds, and is erased in release
builds.§fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
fn tap_borrow_dbg<B>(self, func: impl FnOnce(&B)) -> Self
.tap_borrow() only in debug builds, and is erased in release
builds.§fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
fn tap_borrow_mut_dbg<B>(self, func: impl FnOnce(&mut B)) -> Self
.tap_borrow_mut() only in debug builds, and is erased in release
builds.§fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
fn tap_ref_dbg<R>(self, func: impl FnOnce(&R)) -> Self
.tap_ref() only in debug builds, and is erased in release
builds.§fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
fn tap_ref_mut_dbg<R>(self, func: impl FnOnce(&mut R)) -> Self
.tap_ref_mut() only in debug builds, and is erased in release
builds.§fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
fn tap_deref_dbg<T>(self, func: impl FnOnce(&T)) -> Self
.tap_deref() only in debug builds, and is erased in release
builds.