use std::{env, fs};
use super::*;
#[derive(Clone, Debug, Deserialize, Serialize)]
pub struct ContractMetadata {
pub address: eAddress,
pub artifacts_path: String,
pub mappings: HashMap<String, Vec<String>>,
}
#[derive(Clone, Debug)]
pub struct Fork {
pub db: CacheDB<EmptyDB>,
pub contracts_meta: HashMap<String, ContractMetadata>,
pub eoa: HashMap<String, eAddress>,
}
impl Fork {
pub fn from_disk(path: &str) -> Result<Self, ArbiterCoreError> {
let mut cwd = env::current_dir().unwrap();
cwd.push(path);
print!("Reading db from: {:?}", cwd);
let data = fs::read_to_string(cwd).unwrap();
let disk_data: DiskData = serde_json::from_str(&data).unwrap();
let mut db = CacheDB::new(EmptyDB::default());
for (address, (info, storage_map)) in disk_data.raw {
let address = address.as_fixed_bytes().into();
db.insert_account_info(address, info);
for (key_str, value_str) in storage_map {
let key = U256::from_str_radix(&key_str, 10).unwrap();
let value = U256::from_str_radix(&value_str, 10).unwrap();
db.insert_account_storage(address, key, value).unwrap();
}
}
Ok(Self {
db,
contracts_meta: disk_data.meta,
eoa: disk_data.externally_owned_accounts,
})
}
}
impl From<Fork> for CacheDB<EmptyDB> {
fn from(val: Fork) -> Self {
val.db
}
}
type Storage = HashMap<String, String>;
#[derive(Debug, Serialize, Deserialize)]
pub struct DiskData {
pub meta: HashMap<String, ContractMetadata>,
pub raw: HashMap<eAddress, (AccountInfo, Storage)>,
pub externally_owned_accounts: HashMap<String, eAddress>,
}