Skip to main content

phos_data_network_precompiles/storage/
evm.rs

1use 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}