From 243e266241a5ef29ee22551875a6f160e7fd2c72 Mon Sep 17 00:00:00 2001 From: Stefan Effenberger Date: Fri, 16 May 2025 12:22:31 +0200 Subject: [PATCH 01/11] changed vector to map --- lib/bytecode_verification/parse_json.rs | 60 +++++++++++++------------ 1 file changed, 32 insertions(+), 28 deletions(-) diff --git a/lib/bytecode_verification/parse_json.rs b/lib/bytecode_verification/parse_json.rs index 0da4060..344b519 100644 --- a/lib/bytecode_verification/parse_json.rs +++ b/lib/bytecode_verification/parse_json.rs @@ -326,15 +326,17 @@ impl ProjectInfo { .unwrap() .to_string(); if identifier.starts_with("t_struct") { - let struct_slots: Vec<(u64, U256, Option)> = vec![( - type_name - .get("referencedDeclaration") - .unwrap() - .as_u64() - .unwrap(), + let struct_slots: HashMap)> = HashMap::from([( U256::from_str("0x0").unwrap(), // this won't be used as we only have to add the types - None, - )]; + ( + type_name + .get("referencedDeclaration") + .unwrap() + .as_u64() + .unwrap(), + None, + ), + )]); let mut storage: Vec = vec![]; // this won't be used as we only have to add the types for source in sources.values() { if let Some(ast) = source.ast.clone() { @@ -440,14 +442,14 @@ impl ProjectInfo { sources: &BTreeMap, node: &EAstNode, type_defs: &Types, - struct_slots: &Vec<(u64, U256, Option)>, + struct_slots: &HashMap)>, types: &mut HashMap, storage: &mut Vec, ) { if node.node_type == NodeType::StructDefinition && node.id.is_some() { let mut storage_var_id: Option = None; // parse all struct definitions for each struct -> slot pair. - for (struct_id, slot, name) in struct_slots { + for (slot, (struct_id,name)) in struct_slots { let struct_id = *struct_id; let node_id = node.id.unwrap() as u64; if node_id == struct_id { @@ -593,7 +595,7 @@ impl ProjectInfo { types: &mut HashMap, ) { // Tuple: (struct AST ID, slot, name of variable containing the slot) - let mut struct_slots: Vec<(u64, U256, Option)> = vec![]; + let mut struct_slots: HashMap)> = HashMap::new(); // find pairs (storage slot => struct AST ID) for source in sources.values() { if let Some(ast) = source.ast.clone() { @@ -626,7 +628,7 @@ impl ProjectInfo { sources: &BTreeMap, node: &EAstNode, exported_ids: &Vec, - struct_slots: &mut Vec<(u64, U256, Option)>, + struct_slots: &mut HashMap)>, ) { if node.node_type == NodeType::ContractDefinition && node.id.is_some() @@ -700,7 +702,7 @@ impl ProjectInfo { top_node, stmt_ref["declaration"].as_u64().unwrap() ) { - struct_slots.push((struct_id, var_slot, Some(var_name))); + struct_slots.insert(var_slot, (struct_id, Some(var_name))); // if no variable declaration can be found, try to find // functions with the variable as parameter. } else if let Some((_, _, function_id, param_id)) @@ -754,8 +756,8 @@ impl ProjectInfo { top_node, var_ref_id.as_u64().unwrap() ) { - if !struct_slots.iter().any(|(_, slot, _)| slot.eq(&var_slot)) { - struct_slots.push((struct_id, var_slot, Some(var_name))); + if !struct_slots.contains_key(&var_slot) { + struct_slots.insert(var_slot, (struct_id, Some(var_name))); } } } @@ -764,11 +766,11 @@ impl ProjectInfo { // as we have no associated variable for the slot, // we use the name of the outer function. let var_slot = U256::from_str(slot_value.as_str().unwrap()).unwrap(); - if !struct_slots.iter().any(|(_, slot, _)| slot.eq(&var_slot)) { - struct_slots.push( + if !struct_slots.contains_key(&var_slot) { + struct_slots.insert( + var_slot, ( struct_id, - var_slot, Some(format!("[{}]", outer_function)) ) ); @@ -810,16 +812,18 @@ impl ProjectInfo { } else { function_name = None; } - struct_slots.push(( - struct_id, - U256::from_str( - slot_value - .as_str() - .unwrap(), - ) - .unwrap(), - function_name, - )); + let var_slot = U256::from_str( + slot_value + .as_str() + .unwrap(), + ) + .unwrap(); + if !struct_slots.contains_key(&var_slot) { + struct_slots.insert( + var_slot, + (struct_id, function_name) + ); + } } } } From 1937be92231a17d70cb2d40cc915440386b53e26 Mon Sep 17 00:00:00 2001 From: Stefan Effenberger Date: Fri, 16 May 2025 13:56:37 +0200 Subject: [PATCH 02/11] added another uniqueness check --- src/dvf.rs | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/dvf.rs b/src/dvf.rs index 28ec65e..9d3eb8a 100644 --- a/src/dvf.rs +++ b/src/dvf.rs @@ -1004,7 +1004,12 @@ fn process(matches: ArgMatches) -> Result<(), ValidationError> { ); contract_state.add_forge_inspect(&implementation_layout); - storage.extend(tmp_project_info.storage.clone()); + // Extend storage with implementation storage variables, ensuring unique slots + for storage_var in &tmp_project_info.storage { + if !storage.iter().any(|existing| existing.slot == storage_var.slot) { + storage.push(storage_var.clone()); + } + } types.extend(tmp_project_info.types.clone()); imp_project_info = Some(tmp_project_info); } From ce00cdbc902f7fac92f0896bb1d19b98dc0032a6 Mon Sep 17 00:00:00 2001 From: Stefan Effenberger Date: Fri, 16 May 2025 15:06:53 +0200 Subject: [PATCH 03/11] fmt + clippy --- lib/bytecode_verification/parse_json.rs | 28 ++++++++----------------- src/dvf.rs | 5 ++++- 2 files changed, 13 insertions(+), 20 deletions(-) diff --git a/lib/bytecode_verification/parse_json.rs b/lib/bytecode_verification/parse_json.rs index 344b519..c5054ff 100644 --- a/lib/bytecode_verification/parse_json.rs +++ b/lib/bytecode_verification/parse_json.rs @@ -449,7 +449,7 @@ impl ProjectInfo { if node.node_type == NodeType::StructDefinition && node.id.is_some() { let mut storage_var_id: Option = None; // parse all struct definitions for each struct -> slot pair. - for (slot, (struct_id,name)) in struct_slots { + for (slot, (struct_id, name)) in struct_slots { let struct_id = *struct_id; let node_id = node.id.unwrap() as u64; if node_id == struct_id { @@ -756,9 +756,7 @@ impl ProjectInfo { top_node, var_ref_id.as_u64().unwrap() ) { - if !struct_slots.contains_key(&var_slot) { - struct_slots.insert(var_slot, (struct_id, Some(var_name))); - } + struct_slots.entry(var_slot).or_insert((struct_id, Some(var_name))); } } } else if let Some(slot_value) = arg[param_id].get("value") { @@ -766,15 +764,7 @@ impl ProjectInfo { // as we have no associated variable for the slot, // we use the name of the outer function. let var_slot = U256::from_str(slot_value.as_str().unwrap()).unwrap(); - if !struct_slots.contains_key(&var_slot) { - struct_slots.insert( - var_slot, - ( - struct_id, - Some(format!("[{}]", outer_function)) - ) - ); - } + struct_slots.entry(var_slot).or_insert((struct_id, Some(outer_function))); } } } @@ -818,12 +808,12 @@ impl ProjectInfo { .unwrap(), ) .unwrap(); - if !struct_slots.contains_key(&var_slot) { - struct_slots.insert( - var_slot, - (struct_id, function_name) - ); - } + struct_slots + .entry(var_slot) + .or_insert(( + struct_id, + function_name, + )); } } } diff --git a/src/dvf.rs b/src/dvf.rs index 9d3eb8a..e3cff68 100644 --- a/src/dvf.rs +++ b/src/dvf.rs @@ -1006,7 +1006,10 @@ fn process(matches: ArgMatches) -> Result<(), ValidationError> { // Extend storage with implementation storage variables, ensuring unique slots for storage_var in &tmp_project_info.storage { - if !storage.iter().any(|existing| existing.slot == storage_var.slot) { + if !storage + .iter() + .any(|existing| existing.slot == storage_var.slot) + { storage.push(storage_var.clone()); } } From c684037570ded809f48425f4f53f3dddc69cc6e1 Mon Sep 17 00:00:00 2001 From: Stefan Effenberger Date: Fri, 4 Jul 2025 10:36:46 +0200 Subject: [PATCH 04/11] fixed ordering --- lib/bytecode_verification/parse_json.rs | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/lib/bytecode_verification/parse_json.rs b/lib/bytecode_verification/parse_json.rs index c5054ff..1258602 100644 --- a/lib/bytecode_verification/parse_json.rs +++ b/lib/bytecode_verification/parse_json.rs @@ -326,7 +326,7 @@ impl ProjectInfo { .unwrap() .to_string(); if identifier.starts_with("t_struct") { - let struct_slots: HashMap)> = HashMap::from([( + let struct_slots_vec: Vec<(U256, (u64, Option))> = Vec::from([( U256::from_str("0x0").unwrap(), // this won't be used as we only have to add the types ( type_name @@ -345,7 +345,7 @@ impl ProjectInfo { sources, top_node, type_defs, - &struct_slots, + &struct_slots_vec, types, &mut storage, ); @@ -442,7 +442,7 @@ impl ProjectInfo { sources: &BTreeMap, node: &EAstNode, type_defs: &Types, - struct_slots: &HashMap)>, + struct_slots: &Vec<(U256, (u64, Option))>, types: &mut HashMap, storage: &mut Vec, ) { @@ -604,6 +604,11 @@ impl ProjectInfo { } } } + + // Order struct_slots by key for deterministic results + let mut struct_slots_vec: Vec<(U256, (u64, Option))> = struct_slots.iter().map(|(k, v)| (*k, v.clone())).collect(); + struct_slots_vec.sort_by(|a, b| a.0.cmp(&b.0)); + // parse the struct members + types for source in sources.values() { if let Some(ast) = source.ast.clone() { @@ -612,7 +617,7 @@ impl ProjectInfo { sources, node, type_defs, - &struct_slots, + &struct_slots_vec, types, storage, ); From d03d90963703bf4d02410967e9cac9b89085d9e1 Mon Sep 17 00:00:00 2001 From: Stefan Effenberger Date: Fri, 4 Jul 2025 11:25:32 +0200 Subject: [PATCH 05/11] fixed test case file --- lib/bytecode_verification/compare_bytecodes.rs | 2 +- lib/bytecode_verification/parse_json.rs | 3 ++- lib/bytecode_verification/verify_bytecode.rs | 16 ++++------------ src/dvf.rs | 4 ++-- tests/expected_dvfs/CrazyHiddenStruct.dvf.json | 4 ++-- 5 files changed, 11 insertions(+), 18 deletions(-) diff --git a/lib/bytecode_verification/compare_bytecodes.rs b/lib/bytecode_verification/compare_bytecodes.rs index 6553dec..876d700 100644 --- a/lib/bytecode_verification/compare_bytecodes.rs +++ b/lib/bytecode_verification/compare_bytecodes.rs @@ -297,7 +297,7 @@ impl CompareInitCode { for (arg, value) in project_info.constructor_args.iter_mut().zip(&decoded_args) { let encoded_value = value.abi_encode_packed(); - if encoded_value.len() == 0 { + if encoded_value.is_empty() { // Here we keep the arg.type_string we previous extracted from the ABI // This happens with empty arrays arg.value = "0x".to_string(); diff --git a/lib/bytecode_verification/parse_json.rs b/lib/bytecode_verification/parse_json.rs index 1258602..db28c4f 100644 --- a/lib/bytecode_verification/parse_json.rs +++ b/lib/bytecode_verification/parse_json.rs @@ -606,7 +606,8 @@ impl ProjectInfo { } // Order struct_slots by key for deterministic results - let mut struct_slots_vec: Vec<(U256, (u64, Option))> = struct_slots.iter().map(|(k, v)| (*k, v.clone())).collect(); + let mut struct_slots_vec: Vec<(U256, (u64, Option))> = + struct_slots.iter().map(|(k, v)| (*k, v.clone())).collect(); struct_slots_vec.sort_by(|a, b| a.0.cmp(&b.0)); // parse the struct members + types diff --git a/lib/bytecode_verification/verify_bytecode.rs b/lib/bytecode_verification/verify_bytecode.rs index 5f0b05d..782af68 100644 --- a/lib/bytecode_verification/verify_bytecode.rs +++ b/lib/bytecode_verification/verify_bytecode.rs @@ -24,7 +24,7 @@ pub fn print_verification_summary( contract_address: &Address, status: CompareBytecode, project_info: &ProjectInfo, - on_chain_bytecode: &String, + on_chain_bytecode: &str, ) { let mut table = Table::new(); @@ -70,11 +70,7 @@ pub fn print_verification_summary( table.printstd(); } -pub fn write_out_bytecodes( - project_info: &ProjectInfo, - on_chain_bytecode: &String, - table: &mut Table, -) { +pub fn write_out_bytecodes(project_info: &ProjectInfo, on_chain_bytecode: &str, table: &mut Table) { let mut compiled_file = File::create("compiled_bytecode.txt").expect("Could not create file"); let mut on_chain_file = File::create("on_chain_bytecode.txt").expect("Could not create file"); @@ -96,11 +92,7 @@ pub fn write_out_bytecodes( ]); } -pub fn write_out_initcodes( - project_info: &ProjectInfo, - on_chain_initcode: &String, - table: &mut Table, -) { +pub fn write_out_initcodes(project_info: &ProjectInfo, on_chain_initcode: &str, table: &mut Table) { let mut compiled_file = File::create("compiled_initcode.txt").expect("Could not create file"); let mut on_chain_file = File::create("on_chain_initcode.txt").expect("Could not create file"); @@ -123,7 +115,7 @@ pub fn print_generation_summary( contract_address: &Address, status: CompareBytecode, project_info: &ProjectInfo, - on_chain_bytecode: &String, + on_chain_bytecode: &str, pretty_printer: &PrettyPrinter, ) { let mut table = Table::new(); diff --git a/src/dvf.rs b/src/dvf.rs index e3cff68..bf79746 100644 --- a/src/dvf.rs +++ b/src/dvf.rs @@ -164,7 +164,7 @@ fn validate_dvf( return Err(ValidationError::from("Different codehash.")); } - let pretty_printer = PrettyPrinter::new(&config, Some(®istry)); + let pretty_printer = PrettyPrinter::new(config, Some(registry)); // Validate Storage slots print_progress("Validating Storage Variables.", &mut pc, &progress_mode); @@ -181,7 +181,7 @@ fn validate_dvf( if !storage_variable.compare(¤t_val[start_index..end_index]) { let message = get_mismatch_msg( &pretty_printer, - &storage_variable, + storage_variable, ¤t_val[start_index..end_index], ); if continue_on_mismatch { diff --git a/tests/expected_dvfs/CrazyHiddenStruct.dvf.json b/tests/expected_dvfs/CrazyHiddenStruct.dvf.json index 9fcc21a..cf2bd21 100644 --- a/tests/expected_dvfs/CrazyHiddenStruct.dvf.json +++ b/tests/expected_dvfs/CrazyHiddenStruct.dvf.json @@ -1,6 +1,6 @@ { "version": "0.9.1", - "id": "0x71f27bd042cf53e6783d03336d86171f7d728e61f867e60071ae32818de10da2", + "id": "0x294a145622ea4fa416a4fe6395b3a307e7d692e6956c2fd0e2192831c7e776fa", "contract_name": "CrazyHiddenStruct", "address": "0x5fbdb2315678afecb367f032d93f642f64180aa3", "chain_id": 1337, @@ -484,7 +484,7 @@ { "slot": "0xa83659c989cfe332581a2ed207e0e6d23d9199b0de773442a1e23a9b8c5138f0", "offset": 0, - "var_name": "CrazyHiddenStruct.[_setOwner].AddressSlot.value", + "var_name": "CrazyHiddenStruct._setOwner.AddressSlot.value", "var_type": "t_address", "value": "0x5fbdb2315678afecb367f032d93f642f64180aa3", "comparison_operator": "Equal" From 61b908b45d0355f75d61a9b74a61604fa89878ac Mon Sep 17 00:00:00 2001 From: Stefan Effenberger Date: Wed, 25 Feb 2026 15:21:56 +0100 Subject: [PATCH 06/11] fmt --- lib/dvf/discovery.rs | 2 +- tests/with_metadata/src/PullPayment.sol | 2 +- tests/with_metadata/src/PureFactory.sol | 1 - 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/dvf/discovery.rs b/lib/dvf/discovery.rs index 8c7f49a..7559904 100644 --- a/lib/dvf/discovery.rs +++ b/lib/dvf/discovery.rs @@ -166,7 +166,7 @@ pub fn discover_storage_and_events( ); contract_state.add_forge_inspect(&fi_impl_layout, &fi_impl_ir); - // Extend storage with implementation storage variables, ensuring unique slots + // Extend storage with implementation storage variables, ensuring unique slots for storage_var in &tmp_project_info.storage { if !storage_layout .iter() diff --git a/tests/with_metadata/src/PullPayment.sol b/tests/with_metadata/src/PullPayment.sol index 8aa6261..32c329c 100644 --- a/tests/with_metadata/src/PullPayment.sol +++ b/tests/with_metadata/src/PullPayment.sol @@ -105,6 +105,7 @@ abstract contract Ownable is Context { emit OwnershipTransferred(oldOwner, newOwner); } } + // OpenZeppelin Contracts (last updated v4.9.0) (utils/Address.sol) /** @@ -474,4 +475,3 @@ contract PullPayment { function dummy() external {} } - \ No newline at end of file diff --git a/tests/with_metadata/src/PureFactory.sol b/tests/with_metadata/src/PureFactory.sol index 4223daf..7e4c0d9 100644 --- a/tests/with_metadata/src/PureFactory.sol +++ b/tests/with_metadata/src/PureFactory.sol @@ -23,4 +23,3 @@ contract PureDeployer { function dummy() external {} } - \ No newline at end of file From bc00496080cdcfae15bb68c6c97f5778a76edb01 Mon Sep 17 00:00:00 2001 From: Stefan Effenberger Date: Wed, 25 Feb 2026 17:01:50 +0100 Subject: [PATCH 07/11] added clean to ci tests --- tests/ci_tests.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/tests/ci_tests.sh b/tests/ci_tests.sh index bddd580..64ff676 100755 --- a/tests/ci_tests.sh +++ b/tests/ci_tests.sh @@ -24,6 +24,7 @@ pkill geth || true pkill anvil || true pkill cached_proxy || true rm -rf /tmp/uni-factory /tmp/usdc_implementation2 +cargo clean cargo build cargo clippy mkdir -p /tmp/dvfs From 67b0ff1fe342a8c59e6581238b97417a04714bff Mon Sep 17 00:00:00 2001 From: Stefan Effenberger Date: Thu, 26 Feb 2026 11:19:17 +0100 Subject: [PATCH 08/11] fixed ci cache keys --- .github/workflows/ci.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 97b092b..c414ee7 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -35,9 +35,10 @@ jobs: ~/.cargo/registry/cache/ ~/.cargo/git/db/ target/ - - key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} + + key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}-${{ hashFiles('**/*.rs', '**/Cargo.toml') }} restore-keys: | + ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}- ${{ runner.os }}-cargo- - name: Install dependencies From 9a23565f4c1d06217280fd2864d2673a5e347c2f Mon Sep 17 00:00:00 2001 From: Stefan Effenberger Date: Thu, 26 Feb 2026 11:38:07 +0100 Subject: [PATCH 09/11] merge main --- lib/bytecode_verification/parse_json.rs | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/lib/bytecode_verification/parse_json.rs b/lib/bytecode_verification/parse_json.rs index d9a5c49..186b6f3 100644 --- a/lib/bytecode_verification/parse_json.rs +++ b/lib/bytecode_verification/parse_json.rs @@ -324,12 +324,14 @@ impl ProjectInfo { ); // add base type if base_identifier.starts_with("t_struct") { - let struct_slots: Vec<(u64, U256, Option)> = vec![( - type_name["baseType"]["referencedDeclaration"] - .as_u64() - .unwrap(), + let struct_slots_vec: Vec<(U256, (u64, Option))> = vec![( U256::from(0), - None, + ( + type_name["baseType"]["referencedDeclaration"] + .as_u64() + .unwrap(), + None, + ), )]; // we only need the types, so we use a dummy storage vector let mut storage: Vec = vec![]; @@ -340,7 +342,7 @@ impl ProjectInfo { sources, node, type_defs, - &struct_slots, + &struct_slots_vec, types, &mut storage, ); From fdccd0a10e64920c097c658b06354507e0f8f517 Mon Sep 17 00:00:00 2001 From: Stefan Effenberger Date: Thu, 26 Feb 2026 14:29:45 +0100 Subject: [PATCH 10/11] updated test dvfs and changed test name --- tests/expected_dvfs/PullPayment.dvf.json | 2 +- tests/expected_dvfs/PureDeployer.dvf.json | 2 +- tests/test_end_to_end.rs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/expected_dvfs/PullPayment.dvf.json b/tests/expected_dvfs/PullPayment.dvf.json index 803c02e..b978e06 100644 --- a/tests/expected_dvfs/PullPayment.dvf.json +++ b/tests/expected_dvfs/PullPayment.dvf.json @@ -7,7 +7,7 @@ "deployment_block_num": 2, "init_block_num": 3, "deployment_tx": "0x42d75b67073ebd107239df89b1f512be1972205d5bc728bcafeb3dc5675d0d15", - "codehash": "0x0d737bb1623f9f2c92d870330a5e6e657949fc96c0cd7b09d93be7565d352580", + "codehash": "0x2f5330b21d5be1ae2b7e5e526f3a309b0bb64480c1cf0d9f6be0794a5a7f6ce4", "insecure": false, "immutables": [ { diff --git a/tests/expected_dvfs/PureDeployer.dvf.json b/tests/expected_dvfs/PureDeployer.dvf.json index 83b64af..0b110bb 100644 --- a/tests/expected_dvfs/PureDeployer.dvf.json +++ b/tests/expected_dvfs/PureDeployer.dvf.json @@ -7,7 +7,7 @@ "deployment_block_num": 2, "init_block_num": 3, "deployment_tx": "0xc3f03c210e501eaca1459141ce84bb36675ca2a1cc28d6d716c9794d2b9d4e88", - "codehash": "0xaf3123d8bc1c73c93f3c9b0176b44bd11c0db94032b5a1326f28b7ce6967a06b", + "codehash": "0x6347979e9c068d544e8acaff418347562606d8f9ee014ac90cf06c0c7cb0ea93", "insecure": false, "immutables": [], "constructor_args": [], diff --git a/tests/test_end_to_end.rs b/tests/test_end_to_end.rs index e53d806..bfe6295 100644 --- a/tests/test_end_to_end.rs +++ b/tests/test_end_to_end.rs @@ -1507,7 +1507,7 @@ mod tests { } #[test] - fn test_pure_factory() { + fn test_e2e_pure_factory() { let port = 8553u16; let config_file = match DVFConfig::test_config_file(Some(port)) { Ok(config) => config, From a59b8db309bbfc669ac5586f0f0550dd93224fed Mon Sep 17 00:00:00 2001 From: Stefan Effenberger Date: Thu, 26 Feb 2026 15:26:16 +0100 Subject: [PATCH 11/11] updated another test dvf --- test1.json | 53 +++++++++++++++++++ .../script/Deploy_ConstructorFactory.s.sol | 21 ++++++++ tests/Contracts/src/ConstructorFactory.sol | 37 +++++++++++++ tests/expected_dvfs/PureChild.dvf.json | 2 +- 4 files changed, 112 insertions(+), 1 deletion(-) create mode 100644 test1.json create mode 100644 tests/Contracts/script/Deploy_ConstructorFactory.s.sol create mode 100644 tests/Contracts/src/ConstructorFactory.sol diff --git a/test1.json b/test1.json new file mode 100644 index 0000000..e73753a --- /dev/null +++ b/test1.json @@ -0,0 +1,53 @@ +{ + "version": "0.9.1", + "id": "0x9c82796f5193c4db0965d63046ed83572b2e8140f2be2f9587125b37e8d8710c", + "contract_name": "ConstructorFactory", + "address": "0x5fbdb2315678afecb367f032d93f642f64180aa3", + "chain_id": 31337, + "deployment_block_num": 1, + "init_block_num": 2, + "deployment_tx": "0x9f852dc8e8b0ad7dee5533ba7854bb676f3f270a3720c7501bbd0a65b1194663", + "codehash": "0x035d6d745ec488636551786986451c4f4d368d1fd9facc2c4f11b8b3733f5aa9", + "insecure": false, + "immutables": [], + "constructor_args": [], + "critical_storage_variables": [ + { + "slot": "0x0", + "offset": 0, + "var_name": "children.length", + "var_type": "t_uint256", + "value": "0x0000000000000000000000000000000000000000000000000000000000000002", + "value_hint": "2", + "comparison_operator": "Equal" + }, + { + "slot": "0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e563", + "offset": 0, + "var_name": "children[0]", + "var_type": "t_address", + "value": "0xa16e02e87b7454126e5e10d957a927a7f5b5d2be", + "comparison_operator": "Equal" + }, + { + "slot": "0x290decd9548b62a8d60345a988386fc84ba6bc95484008f6362f93160ef3e564", + "offset": 0, + "var_name": "children[1]", + "var_type": "t_address", + "value": "0xb7a5bd0345ef1cc5e66bf61bdec17d2461fbd968", + "comparison_operator": "Equal" + } + ], + "critical_events": [], + "unvalidated_metadata": { + "author_name": "Author", + "description": "System Description", + "hardfork": [ + "paris", + "shanghai" + ], + "audit_report": "https://example.org/report.pdf", + "source_url": "https://github.com/source/code", + "security_contact": "security@example.org" + } +} \ No newline at end of file diff --git a/tests/Contracts/script/Deploy_ConstructorFactory.s.sol b/tests/Contracts/script/Deploy_ConstructorFactory.s.sol new file mode 100644 index 0000000..0c0284f --- /dev/null +++ b/tests/Contracts/script/Deploy_ConstructorFactory.s.sol @@ -0,0 +1,21 @@ +pragma solidity ^0.8.12; + +import "forge-std/Script.sol"; +import "../src/ConstructorFactory.sol"; + +contract Deploy is Script { + function run() external { + uint256 anvilDefaultKey = 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80; + vm.startBroadcast(anvilDefaultKey); + + ConstructorFactory factory = new ConstructorFactory(); + factory.createChild(100); + factory.createChild(200); + + for (uint256 i = 0; i < 5; i++) { + factory.dummy(); + } + + vm.stopBroadcast(); + } +} diff --git a/tests/Contracts/src/ConstructorFactory.sol b/tests/Contracts/src/ConstructorFactory.sol new file mode 100644 index 0000000..6571ed3 --- /dev/null +++ b/tests/Contracts/src/ConstructorFactory.sol @@ -0,0 +1,37 @@ +// SPDX-License-Identifier: UNLICENSED +pragma solidity ^0.8.13; + +contract Child { + address public owner; + uint256 public value; + + constructor(address _owner, uint256 _value) { + owner = _owner; + value = _value; + } + + function setValue(uint256 _value) external { + value = _value; + } +} + +contract ConstructorFactory { + address[] public children; + + constructor() { + Child child = new Child(msg.sender, 42); + children.push(address(child)); + } + + function createChild(uint256 _value) external returns (address) { + Child child = new Child(msg.sender, _value); + children.push(address(child)); + return address(child); + } + + function getChildrenCount() external view returns (uint256) { + return children.length; + } + + function dummy() external {} +} diff --git a/tests/expected_dvfs/PureChild.dvf.json b/tests/expected_dvfs/PureChild.dvf.json index 88d5a01..6f3f0ee 100644 --- a/tests/expected_dvfs/PureChild.dvf.json +++ b/tests/expected_dvfs/PureChild.dvf.json @@ -7,7 +7,7 @@ "deployment_block_num": 2, "init_block_num": 3, "deployment_tx": "0xc3f03c210e501eaca1459141ce84bb36675ca2a1cc28d6d716c9794d2b9d4e88", - "codehash": "0x58f7c91b706c7b2e5694cdb86ba16504d4d8851df9522b29299fe8bb95403d57", + "codehash": "0x96e74684860511bd54dc85352acf15d678b3e88a6ab3bc7414aebbaec5571159", "insecure": false, "immutables": [], "constructor_args": [],