tempo_precompiles/storage/
mod.rs1pub mod evm;
2pub mod hashmap;
3
4mod types;
5use tempo_chainspec::hardfork::TempoHardfork;
6pub use types::*;
7
8pub mod packing;
9pub use packing::FieldLocation;
10pub use types::mapping as slots;
11
12pub use types::vec::VecSlotExt;
14
15use alloy::primitives::{Address, LogData, U256};
16use revm::state::{AccountInfo, Bytecode};
17
18use crate::error::TempoPrecompileError;
19
20pub trait PrecompileStorageProvider {
22 fn chain_id(&self) -> u64;
23 fn timestamp(&self) -> U256;
24 fn beneficiary(&self) -> Address;
25 fn set_code(&mut self, address: Address, code: Bytecode) -> Result<(), TempoPrecompileError>;
26 fn get_account_info(
27 &mut self,
28 address: Address,
29 ) -> Result<&'_ AccountInfo, TempoPrecompileError>;
30 fn sload(&mut self, address: Address, key: U256) -> Result<U256, TempoPrecompileError>;
31 fn tload(&mut self, address: Address, key: U256) -> Result<U256, TempoPrecompileError>;
32 fn sstore(
33 &mut self,
34 address: Address,
35 key: U256,
36 value: U256,
37 ) -> Result<(), TempoPrecompileError>;
38 fn tstore(
39 &mut self,
40 address: Address,
41 key: U256,
42 value: U256,
43 ) -> Result<(), TempoPrecompileError>;
44 fn emit_event(&mut self, address: Address, event: LogData) -> Result<(), TempoPrecompileError>;
45
46 fn deduct_gas(&mut self, gas: u64) -> Result<(), TempoPrecompileError>;
48
49 fn refund_gas(&mut self, gas: i64);
51
52 fn gas_used(&self) -> u64;
54
55 fn gas_refunded(&self) -> i64;
57
58 fn spec(&self) -> TempoHardfork;
60}
61
62pub trait StorageOps {
64 fn sstore(&mut self, slot: U256, value: U256) -> Result<(), TempoPrecompileError>;
66 fn sload(&mut self, slot: U256) -> Result<U256, TempoPrecompileError>;
68}
69
70pub trait ContractStorage {
75 type Storage: PrecompileStorageProvider;
76
77 fn address(&self) -> Address;
79 fn storage(&mut self) -> &mut Self::Storage;
81}
82
83impl<T> StorageOps for T
86where
87 T: ContractStorage,
88{
89 fn sstore(&mut self, slot: U256, value: U256) -> Result<(), TempoPrecompileError> {
91 let address = self.address();
92 self.storage().sstore(address, slot, value)
93 }
94
95 fn sload(&mut self, slot: U256) -> Result<U256, TempoPrecompileError> {
97 let address = self.address();
98 self.storage().sload(address, slot)
99 }
100}