anvil/eth/backend/
cheats.rs1use alloy_primitives::{Address, map::AddressHashSet};
4use parking_lot::RwLock;
5use std::sync::Arc;
6
7#[derive(Clone, Debug, Default)]
11pub struct CheatsManager {
12 state: Arc<RwLock<CheatsState>>,
14}
15
16impl CheatsManager {
17 pub fn impersonate(&self, addr: Address) -> bool {
21 trace!(target: "cheats", "Start impersonating {:?}", addr);
22 let mut state = self.state.write();
23 if state.impersonated_accounts.contains(&addr) {
27 return true;
29 }
30 state.impersonated_accounts.insert(addr)
31 }
32
33 pub fn stop_impersonating(&self, addr: &Address) {
35 trace!(target: "cheats", "Stop impersonating {:?}", addr);
36 self.state.write().impersonated_accounts.remove(addr);
37 }
38
39 pub fn is_impersonated(&self, addr: Address) -> bool {
41 if self.auto_impersonate_accounts() {
42 true
43 } else {
44 self.state.read().impersonated_accounts.contains(&addr)
45 }
46 }
47
48 pub fn auto_impersonate_accounts(&self) -> bool {
50 self.state.read().auto_impersonate_accounts
51 }
52
53 pub fn set_auto_impersonate_account(&self, enabled: bool) {
56 trace!(target: "cheats", "Auto impersonation set to {:?}", enabled);
57 self.state.write().auto_impersonate_accounts = enabled
58 }
59
60 pub fn impersonated_accounts(&self) -> AddressHashSet {
62 self.state.read().impersonated_accounts.clone()
63 }
64}
65
66#[derive(Clone, Debug, Default)]
68pub struct CheatsState {
69 pub impersonated_accounts: AddressHashSet,
71 pub auto_impersonate_accounts: bool,
73}