example_uniswap_get_reserves/
main.rs1#![cfg_attr(not(test), warn(unused_crate_dependencies))]
3
4use alloy_eips::BlockId;
5use alloy_provider::ProviderBuilder;
6use alloy_sol_types::{sol, SolCall};
7use revm::{
8 context::TxEnv,
9 context_interface::result::{ExecutionResult, Output},
10 database::{AlloyDB, CacheDB},
11 database_interface::{DatabaseRef, EmptyDB, WrapDatabaseAsync},
12 primitives::{address, StorageKey, TxKind, U256},
13 Context, ExecuteEvm, MainBuilder, MainContext,
14};
15
16#[tokio::main]
17async fn main() -> anyhow::Result<()> {
18 let rpc_url = "https://mainnet.infura.io/v3/c60b0bb42f8a4c6481ecd229eddaca27";
20 let provider = ProviderBuilder::new().connect(rpc_url).await?;
21
22 let alloy_db = WrapDatabaseAsync::new(AlloyDB::new(provider, BlockId::latest())).unwrap();
23 let cache_db = CacheDB::new(alloy_db);
24
25 let slot = StorageKey::from(8);
39
40 let pool_address = address!("0d4a11d5EEaaC28EC3F61d100daF4d40471f1852");
42
43 sol! {
45 function getReserves() external view returns (uint112 reserve0, uint112 reserve1, uint32 blockTimestampLast);
46 }
47
48 let encoded = getReservesCall::new(()).abi_encode();
50
51 let acc_info = cache_db.basic_ref(pool_address).unwrap().unwrap();
53
54 let value = cache_db.storage_ref(pool_address, slot).unwrap();
56
57 let mut cache_db = CacheDB::new(EmptyDB::default());
59
60 cache_db.insert_account_info(pool_address, acc_info);
62
63 cache_db
65 .insert_account_storage(pool_address, slot, value)
66 .unwrap();
67
68 let mut evm = Context::mainnet().with_db(cache_db).build_mainnet();
70
71 let result = evm
73 .transact(TxEnv {
74 caller: address!("0000000000000000000000000000000000000000"),
77 kind: TxKind::Call(pool_address),
79 data: encoded.into(),
81 value: U256::from(0),
83 ..Default::default()
84 })
85 .unwrap();
86
87 let value = match result {
89 ExecutionResult::Success {
90 output: Output::Call(value),
91 ..
92 } => value,
93 _ => panic!("Execution failed: {result:?}"),
94 };
95
96 let return_vals = getReservesCall::abi_decode_returns(&value)?;
98
99 println!("Reserve0: {:#?}", return_vals.reserve0);
101 println!("Reserve1: {:#?}", return_vals.reserve1);
102 println!("Timestamp: {:#?}", return_vals.blockTimestampLast);
103
104 Ok(())
105}