1use crate::primitives::{Address, Bytecode, Env, Log, B256, U256};
2
3mod dummy;
4pub use dummy::DummyHost;
5
6pub trait Host {
8 fn env(&self) -> &Env;
10
11 fn env_mut(&mut self) -> &mut Env;
13
14 fn load_account(&mut self, address: Address) -> Option<LoadAccountResult>;
18
19 fn block_hash(&mut self, number: U256) -> Option<B256>;
21
22 fn balance(&mut self, address: Address) -> Option<(U256, bool)>;
24
25 fn code(&mut self, address: Address) -> Option<(Bytecode, bool)>;
27
28 fn code_hash(&mut self, address: Address) -> Option<(B256, bool)>;
30
31 fn sload(&mut self, address: Address, index: U256) -> Option<(U256, bool)>;
33
34 fn sstore(&mut self, address: Address, index: U256, value: U256) -> Option<SStoreResult>;
38
39 fn tload(&mut self, address: Address, index: U256) -> U256;
41
42 fn tstore(&mut self, address: Address, index: U256, value: U256);
44
45 fn log(&mut self, log: Log);
47
48 fn selfdestruct(&mut self, address: Address, target: Address) -> Option<SelfDestructResult>;
50}
51
52#[derive(Debug, Clone, PartialEq, Eq)]
54#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
55pub struct SStoreResult {
56 pub original_value: U256,
58 pub present_value: U256,
60 pub new_value: U256,
62 pub is_cold: bool,
64}
65
66#[derive(Debug, Clone, Default, PartialEq, Eq)]
68pub struct LoadAccountResult {
69 pub is_cold: bool,
71 pub is_empty: bool,
73}
74
75#[derive(Default, Clone, Debug, PartialEq, Eq, Hash)]
77#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
78pub struct SelfDestructResult {
79 pub had_value: bool,
80 pub target_exists: bool,
81 pub is_cold: bool,
82 pub previously_destroyed: bool,
83}
84
85#[cfg(test)]
86mod tests {
87 use super::*;
88
89 fn assert_host<H: Host + ?Sized>() {}
90
91 #[test]
92 fn object_safety() {
93 assert_host::<DummyHost>();
94 assert_host::<dyn Host>();
95 }
96}