use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum EvmVisibility {
External,
Public,
Internal,
Private,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum EvmMutability {
Pure,
View,
Payable,
NonPayable,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum EvmContractType {
Contract,
Interface,
Abstract,
Library,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum AccessControlType {
OnlyOwner,
RoleBased { role: String },
RequireMsgSender { compared_to: String },
CustomModifier { name: String },
None,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct EvmParam {
pub name: String,
pub type_name: String,
pub storage_location: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct StorageVariable {
pub name: String,
pub type_name: String,
pub visibility: EvmVisibility,
pub is_constant: bool,
pub is_immutable: bool,
pub line: usize,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct EvmEvent {
pub name: String,
pub params: Vec<EvmParam>,
pub is_anonymous: bool,
pub line: usize,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct EvmModifierDef {
pub name: String,
pub params: Vec<EvmParam>,
pub body_source: String,
pub line: usize,
#[serde(default)]
pub end_line: usize,
pub contract_name: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct EvmFunction {
pub name: String,
pub contract_name: String,
pub visibility: EvmVisibility,
pub mutability: EvmMutability,
pub modifiers: Vec<String>,
pub params: Vec<EvmParam>,
pub returns: Vec<EvmParam>,
pub body_source: String,
pub line: usize,
pub end_line: usize,
pub is_constructor: bool,
pub is_fallback: bool,
pub is_receive: bool,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct EvmContract {
pub name: String,
pub contract_type: EvmContractType,
pub base_contracts: Vec<String>,
pub functions: Vec<EvmFunction>,
pub modifiers: Vec<EvmModifierDef>,
pub storage_variables: Vec<StorageVariable>,
pub events: Vec<EvmEvent>,
pub file_path: String,
pub line: usize,
pub external: bool,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct EvmFile {
pub path: String,
pub imports: Vec<EvmImport>,
pub contracts: Vec<EvmContract>,
pub pragma: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct EvmImport {
pub path: String,
pub symbols: Vec<ImportSymbol>,
pub line: usize,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct ImportSymbol {
pub name: String,
pub alias: Option<String>,
}