phos_data_network_precompiles/storage/
evm.rs1use std::fmt::Display;
2
3use alloy_primitives::{Address, U256};
4use revm::{
5 context::{ContextTr, JournalTr},
6 handler::ContextTrDbError,
7};
8
9use crate::{
10 error::{DataNetworkPrecompileError, Result},
11 storage::PrecompileStorageProvider,
12};
13
14pub struct EvmPrecompileStorageProvider<'a, CTX> {
15 context: &'a mut CTX,
16 is_static: bool,
17}
18
19impl<'a, CTX> EvmPrecompileStorageProvider<'a, CTX> {
20 pub fn new(context: &'a mut CTX, is_static: bool) -> Self {
21 Self { context, is_static }
22 }
23}
24
25impl<CTX> PrecompileStorageProvider for EvmPrecompileStorageProvider<'_, CTX>
26where
27 CTX: ContextTr,
28 ContextTrDbError<CTX>: Display,
29{
30 fn sload(&mut self, address: Address, key: U256) -> Result<U256> {
31 let journal = self.context.journal_mut();
32 journal
33 .load_account(address)
34 .map_err(|error| DataNetworkPrecompileError::Fatal(error.to_string()))?;
35 journal
36 .sload(address, key)
37 .map(|loaded| loaded.data)
38 .map_err(|error| DataNetworkPrecompileError::Fatal(error.to_string()))
39 }
40
41 fn sstore(&mut self, address: Address, key: U256, value: U256) -> Result<()> {
42 if self.is_static {
43 return Err(DataNetworkPrecompileError::Revert(
44 "state modification during static call",
45 ));
46 }
47
48 let journal = self.context.journal_mut();
49 journal
50 .load_account(address)
51 .map_err(|error| DataNetworkPrecompileError::Fatal(error.to_string()))?;
52 journal
53 .sstore(address, key, value)
54 .map(|_| ())
55 .map_err(|error| DataNetworkPrecompileError::Fatal(error.to_string()))
56 }
57
58 fn is_static(&self) -> bool {
59 self.is_static
60 }
61}