Skip to main content

evm_lens_core/storage/
layout.rs

1use serde::{Deserialize, Serialize};
2
3#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq)]
4pub enum Provenance {
5    CompilerMetadata,
6    HeuristicTrace,
7}
8
9#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
10pub enum StorageType {
11    /// Unknown or not confidently inferred
12    Unknown,
13    /// Basic solidity-like types (conservative)
14    Uint {
15        bits: u16,
16    },
17    Int {
18        bits: u16,
19    },
20    Bool,
21    Address,
22    BytesFixed {
23        size: u8,
24    },
25    BytesDynamic,
26    String,
27}
28
29#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
30pub struct StorageEntry {
31    pub slot: u128,
32    /// Optional byte offset for packed fields (0..31). If None, occupies full slot.
33    pub offset: Option<u8>,
34    /// Size in bytes if known when packed; None for full slot/unknown.
35    pub size: Option<u8>,
36    pub r#type: StorageType,
37    pub label: Option<String>,
38    pub provenance: Provenance,
39}
40
41#[derive(Debug, Clone, Default, Serialize, Deserialize, PartialEq, Eq)]
42pub struct StorageLayout {
43    /// Map by slot to entries (supports packed fields).
44    pub entries: Vec<StorageEntry>,
45}
46
47impl StorageLayout {
48    pub fn new() -> Self {
49        Self {
50            entries: Vec::new(),
51        }
52    }
53
54    pub fn add_entry(&mut self, entry: StorageEntry) {
55        self.entries.push(entry);
56    }
57}