diff --git a/lib/dvf/registry.rs b/lib/dvf/registry.rs
index 5880a73..240832c 100644
--- a/lib/dvf/registry.rs
+++ b/lib/dvf/registry.rs
@@ -5,6 +5,7 @@ use std::path::Path;
use std::path::PathBuf;
use alloy::primitives::Address;
+use serde_json;
use tracing::debug;
use crate::dvf::config::DVFConfig;
@@ -15,15 +16,24 @@ use crate::utils::pretty::{AddressType, ResolvedAddress};
pub struct Registry {
dvf_storage: PathBuf,
trusted_signers: Vec
,
+ known_addresses: HashMap>,
}
impl Registry {
pub fn from_config(config: &DVFConfig) -> Result {
+ Self::from_config_with_known(config, None)
+ }
+
+ pub fn from_config_with_known(
+ config: &DVFConfig,
+ known_addresses: Option>>,
+ ) -> Result {
let dvf_storage = config.dvf_storage.clone();
Ok(Registry {
dvf_storage,
trusted_signers: config.trusted_signers.clone(),
+ known_addresses: known_addresses.unwrap_or_default(),
})
}
@@ -31,8 +41,26 @@ impl Registry {
self.trusted_signers.contains(address)
}
+ pub fn load_known_addresses_from_file(
+ path: &Path,
+ ) -> Result>, ValidationError> {
+ let f = fs::File::open(path)?;
+ serde_json::from_reader::<_, HashMap>>(f).map_err(
+ |e| {
+ ValidationError::Error(format!(
+ "Could not parse known addresses file {}: {}",
+ path.display(),
+ e
+ ))
+ },
+ )
+ }
+
pub fn collect_name_resolution(&self, chain_id: u64) -> HashMap {
let mut res: HashMap = HashMap::new();
+ if let Some(extra) = self.known_addresses.get(&chain_id) {
+ res.extend(extra.clone());
+ }
self.collect_names_inner(&self.dvf_storage, &mut res, chain_id);
res
}
@@ -175,3 +203,61 @@ fn search_for_id(dir: &Path, id: &String) -> Result, ValidationErro
}
Ok(results)
}
+
+#[cfg(test)]
+mod tests {
+ use super::Registry;
+ use crate::dvf::config::DVFConfig;
+ use alloy::primitives::Address;
+ use std::fs;
+ use std::str::FromStr;
+ use tempfile::tempdir;
+
+ #[test]
+ fn load_known_addresses_and_collect() {
+ let dir = tempdir().unwrap();
+ let known_path = dir.path().join("known.json");
+
+ let address = "0x1111111111111111111111111111111111111111";
+ let address2 = "0x1111111111111111111111111111111111111110";
+ let name = "TestContract";
+ let name2 = "TestContract2";
+
+ let json = format!(
+ r#"
+ {{
+ "1": {{
+ "{address}": {{
+ "name": "{name}",
+ "address_type": "Contract"
+ }}
+ }},
+ "2": {{
+ "{address2}": {{
+ "name": "{name2}",
+ "address_type": "Contract"
+ }}
+ }}
+ }}
+ "#
+ );
+ fs::write(&known_path, json).unwrap();
+
+ let known = Registry::load_known_addresses_from_file(&known_path).unwrap();
+
+ let mut config = DVFConfig::default();
+ config.dvf_storage = dir.path().to_path_buf();
+
+ let registry = Registry::from_config_with_known(&config, Some(known)).unwrap();
+
+ let resolved = registry.collect_name_resolution(1);
+ let addr = Address::from_str(address).unwrap();
+ assert_eq!(resolved.get(&addr).unwrap().name, name);
+
+ let resolved2 = registry.collect_name_resolution(2);
+ let addr2 = Address::from_str(address2).unwrap();
+ assert_eq!(resolved2.get(&addr2).unwrap().name, name2);
+
+ assert!(registry.collect_name_resolution(137).is_empty());
+ }
+}
diff --git a/lib/utils/pretty.rs b/lib/utils/pretty.rs
index ccf5bdc..476a2b2 100644
--- a/lib/utils/pretty.rs
+++ b/lib/utils/pretty.rs
@@ -17,7 +17,7 @@ use crate::dvf::config::DVFConfig;
use crate::dvf::registry::Registry;
use crate::state::contract_state::ContractState;
-#[derive(Deserialize, Debug)]
+#[derive(Deserialize, Debug, Clone)]
pub enum AddressType {
Token,
Contract,
@@ -26,7 +26,7 @@ pub enum AddressType {
Eoa,
}
-#[derive(Debug, Deserialize)]
+#[derive(Debug, Deserialize, Clone)]
pub struct ResolvedAddress {
pub address_type: AddressType,
pub name: String,
diff --git a/src/dvf.rs b/src/dvf.rs
index 9422bd3..c179cfb 100644
--- a/src/dvf.rs
+++ b/src/dvf.rs
@@ -485,6 +485,11 @@ fn main() {
arg!(