@@ -5,6 +5,7 @@ use std::path::Path;
55use std:: path:: PathBuf ;
66
77use alloy:: primitives:: Address ;
8+ use serde_json;
89use tracing:: debug;
910
1011use crate :: dvf:: config:: DVFConfig ;
@@ -15,24 +16,51 @@ use crate::utils::pretty::{AddressType, ResolvedAddress};
1516pub struct Registry {
1617 dvf_storage : PathBuf ,
1718 trusted_signers : Vec < Address > ,
19+ known_addresses : HashMap < u64 , HashMap < Address , ResolvedAddress > > ,
1820}
1921
2022impl Registry {
2123 pub fn from_config ( config : & DVFConfig ) -> Result < Self , ValidationError > {
24+ Self :: from_config_with_known ( config, None )
25+ }
26+
27+ pub fn from_config_with_known (
28+ config : & DVFConfig ,
29+ known_addresses : Option < HashMap < u64 , HashMap < Address , ResolvedAddress > > > ,
30+ ) -> Result < Self , ValidationError > {
2231 let dvf_storage = config. dvf_storage . clone ( ) ;
2332
2433 Ok ( Registry {
2534 dvf_storage,
2635 trusted_signers : config. trusted_signers . clone ( ) ,
36+ known_addresses : known_addresses. unwrap_or_default ( ) ,
2737 } )
2838 }
2939
3040 pub fn is_trusted_signer ( & self , address : & Address ) -> bool {
3141 self . trusted_signers . contains ( address)
3242 }
3343
44+ pub fn load_known_addresses_from_file (
45+ path : & Path ,
46+ ) -> Result < HashMap < u64 , HashMap < Address , ResolvedAddress > > , ValidationError > {
47+ let f = fs:: File :: open ( path) ?;
48+ serde_json:: from_reader :: < _ , HashMap < u64 , HashMap < Address , ResolvedAddress > > > ( f) . map_err (
49+ |e| {
50+ ValidationError :: Error ( format ! (
51+ "Could not parse known addresses file {}: {}" ,
52+ path. display( ) ,
53+ e
54+ ) )
55+ } ,
56+ )
57+ }
58+
3459 pub fn collect_name_resolution ( & self , chain_id : u64 ) -> HashMap < Address , ResolvedAddress > {
3560 let mut res: HashMap < Address , ResolvedAddress > = HashMap :: new ( ) ;
61+ if let Some ( extra) = self . known_addresses . get ( & chain_id) {
62+ res. extend ( extra. clone ( ) ) ;
63+ }
3664 self . collect_names_inner ( & self . dvf_storage , & mut res, chain_id) ;
3765 res
3866 }
@@ -175,3 +203,61 @@ fn search_for_id(dir: &Path, id: &String) -> Result<Vec<PathBuf>, ValidationErro
175203 }
176204 Ok ( results)
177205}
206+
207+ #[ cfg( test) ]
208+ mod tests {
209+ use super :: Registry ;
210+ use crate :: dvf:: config:: DVFConfig ;
211+ use alloy:: primitives:: Address ;
212+ use std:: fs;
213+ use std:: str:: FromStr ;
214+ use tempfile:: tempdir;
215+
216+ #[ test]
217+ fn load_known_addresses_and_collect ( ) {
218+ let dir = tempdir ( ) . unwrap ( ) ;
219+ let known_path = dir. path ( ) . join ( "known.json" ) ;
220+
221+ let address = "0x1111111111111111111111111111111111111111" ;
222+ let address2 = "0x1111111111111111111111111111111111111110" ;
223+ let name = "TestContract" ;
224+ let name2 = "TestContract2" ;
225+
226+ let json = format ! (
227+ r#"
228+ {{
229+ "1": {{
230+ "{address}": {{
231+ "name": "{name}",
232+ "address_type": "Contract"
233+ }}
234+ }},
235+ "2": {{
236+ "{address2}": {{
237+ "name": "{name2}",
238+ "address_type": "Contract"
239+ }}
240+ }}
241+ }}
242+ "#
243+ ) ;
244+ fs:: write ( & known_path, json) . unwrap ( ) ;
245+
246+ let known = Registry :: load_known_addresses_from_file ( & known_path) . unwrap ( ) ;
247+
248+ let mut config = DVFConfig :: default ( ) ;
249+ config. dvf_storage = dir. path ( ) . to_path_buf ( ) ;
250+
251+ let registry = Registry :: from_config_with_known ( & config, Some ( known) ) . unwrap ( ) ;
252+
253+ let resolved = registry. collect_name_resolution ( 1 ) ;
254+ let addr = Address :: from_str ( address) . unwrap ( ) ;
255+ assert_eq ! ( resolved. get( & addr) . unwrap( ) . name, name) ;
256+
257+ let resolved2 = registry. collect_name_resolution ( 2 ) ;
258+ let addr2 = Address :: from_str ( address2) . unwrap ( ) ;
259+ assert_eq ! ( resolved2. get( & addr2) . unwrap( ) . name, name2) ;
260+
261+ assert ! ( registry. collect_name_resolution( 137 ) . is_empty( ) ) ;
262+ }
263+ }
0 commit comments