69 lines
2.1 KiB
Rust
69 lines
2.1 KiB
Rust
use ethers::{
|
|
contract::abigen,
|
|
core::types::Address,
|
|
providers::{Provider, StreamExt, Ws},
|
|
};
|
|
use eyre::Result;
|
|
use std::sync::Arc;
|
|
|
|
abigen!(
|
|
IERC20,
|
|
r#"[
|
|
event Transfer(address indexed from, address indexed to, uint256 value)
|
|
event Approval(address indexed owner, address indexed spender, uint256 value)
|
|
]"#,
|
|
);
|
|
|
|
const WSS_URL: &str = "wss://mainnet.infura.io/ws/v3/c60b0bb42f8a4c6481ecd229eddaca27";
|
|
const WETH_ADDRESS: &str = "0xC02aaA39b223FE8D0A0e5C4F27eAD9083C756Cc2";
|
|
|
|
#[tokio::main]
|
|
async fn main() -> Result<()> {
|
|
let provider = Provider::<Ws>::connect(WSS_URL).await?;
|
|
let client = Arc::new(provider);
|
|
let address: Address = WETH_ADDRESS.parse()?;
|
|
let contract = IERC20::new(address, client);
|
|
|
|
listen_all_events(&contract).await?;
|
|
listen_specific_events(&contract).await?;
|
|
|
|
Ok(())
|
|
}
|
|
|
|
/// Given a contract instance, subscribe to all possible events.
|
|
/// This allows to centralize the event handling logic and dispatch
|
|
/// proper actions.
|
|
///
|
|
/// Note that all event bindings have been generated
|
|
/// by abigen. Feel free to investigate the abigen expanded code to
|
|
/// better understand types and functionalities.
|
|
async fn listen_all_events(contract: &IERC20<Provider<Ws>>) -> Result<()> {
|
|
let events = contract.events().from_block(16232696);
|
|
let mut stream = events.stream().await?.take(1);
|
|
|
|
while let Some(Ok(evt)) = stream.next().await {
|
|
match evt {
|
|
IERC20Events::ApprovalFilter(f) => println!("{f:?}"),
|
|
IERC20Events::TransferFilter(f) => println!("{f:?}"),
|
|
}
|
|
}
|
|
|
|
Ok(())
|
|
}
|
|
|
|
/// Given a contract instance subscribe to a single type of event.
|
|
///
|
|
/// Note that all event bindings have been generated
|
|
/// by abigen. Feel free to investigate the abigen expanded code to
|
|
/// better understand types and functionalities.
|
|
async fn listen_specific_events(contract: &IERC20<Provider<Ws>>) -> Result<()> {
|
|
let events = contract.event::<ApprovalFilter>().from_block(16232696);
|
|
let mut stream = events.stream().await?.take(1);
|
|
|
|
while let Some(Ok(f)) = stream.next().await {
|
|
println!("ApprovalFilter event: {f:?}");
|
|
}
|
|
|
|
Ok(())
|
|
}
|