use alloy_primitives::{Address, U256};
use evm_fork_cache::StorageAccessList;
use evm_fork_cache::prefetch_registry::PrefetchRegistry;
fn main() -> anyhow::Result<()> {
let settlement = Address::repeat_byte(0xAA);
let vault_a = Address::repeat_byte(0x01);
let vault_b = Address::repeat_byte(0x02);
let mut registry = PrefetchRegistry::default();
let mut settlement_refresh = StorageAccessList::default();
settlement_refresh.accounts.insert(settlement);
settlement_refresh.slots.insert((settlement, U256::from(0)));
settlement_refresh.slots.insert((settlement, U256::from(4)));
registry.record("settlement_refresh", settlement_refresh);
let mut al_a = StorageAccessList::default();
al_a.slots.insert((vault_a, U256::from(10)));
registry.record_keyed("per_vault", vault_a, al_a);
let mut al_b = StorageAccessList::default();
al_b.slots.insert((vault_b, U256::from(20)));
registry.record_keyed("per_vault", vault_b, al_b);
let path = std::env::temp_dir().join("evm_fork_cache_example_prefetch.bin");
registry.save(&path)?;
let loaded = PrefetchRegistry::load(&path);
let aggregated = loaded.phase_slots("settlement_refresh");
println!("settlement_refresh phase has {} slots", aggregated.len());
for (addr, slot) in &aggregated {
println!(" {addr} slot {slot}");
}
println!(
"unknown phase has {} slots",
loaded.phase_slots("does_not_exist").len()
);
let _ = std::fs::remove_file(&path);
Ok(())
}