From a8cde6fa17d54bc8be5e0315f72cc8c1993d0890 Mon Sep 17 00:00:00 2001 From: activecoder10 Date: Thu, 12 Jun 2025 09:14:05 +0300 Subject: [PATCH] deploy contracts --- crates/core/src/driver/mod.rs | 61 +++++++++++++++++++++++++++++++++-- crates/core/src/main.rs | 46 +++++++++++++++++--------- 2 files changed, 90 insertions(+), 17 deletions(-) diff --git a/crates/core/src/driver/mod.rs b/crates/core/src/driver/mod.rs index 0ff58759..aed3856f 100644 --- a/crates/core/src/driver/mod.rs +++ b/crates/core/src/driver/mod.rs @@ -1,8 +1,12 @@ //! The test driver handles the compilation and execution of the test cases. use alloy::{ - primitives::{Address, map::HashMap}, - rpc::types::trace::geth::{AccountState, DiffMode, GethTrace}, + network::TransactionBuilder, + primitives::{Address, bytes::Bytes, map::HashMap}, + rpc::types::{ + TransactionRequest, + trace::geth::{AccountState, DiffMode, GethTrace}, + }, }; use revive_dt_compiler::{Compiler, CompilerInput, SolidityCompiler}; use revive_dt_config::Arguments; @@ -109,6 +113,56 @@ where Ok((trace, diff)) } + + pub fn deploy_contracts(&mut self, input: &Input, node: &T::Blockchain) -> anyhow::Result<()> { + for output in self.contracts.values() { + let Some(contract_map) = &output.contracts else { + log::debug!("No contracts in output — skipping deployment for this input."); + continue; + }; + + for contracts in contract_map.values() { + for (contract_name, contract) in contracts { + if contract_name != &input.instance { + continue; + } + + let bytecode = contract + .evm + .as_ref() + .and_then(|evm| evm.bytecode.as_ref()) + .map(|b| b.object.clone()); + + let Some(code) = bytecode else { + anyhow::bail!("no bytecode for contract `{}`", contract_name); + }; + + let tx = TransactionRequest::default() + .with_from(input.caller) + .with_to(Address::ZERO) + .with_input(Bytes::from(code.clone())) + .with_gas_price(20_000_000_000) + .with_gas_limit(20_000_000_000) + .with_chain_id(self.config.network_id) + .with_nonce(0); + + let receipt = node.execute_transaction(tx)?; + let Some(address) = receipt.contract_address else { + anyhow::bail!( + "contract `{}` deployment did not return an address", + contract_name + ); + }; + + self.deployed_contracts + .insert(contract_name.clone(), address); + log::info!("deployed contract `{}` at {:?}", contract_name, address); + } + } + } + + Ok(()) + } } pub struct Driver<'a, Leader: Platform, Follower: Platform> { @@ -173,6 +227,9 @@ where for case in &self.metadata.cases { for input in &case.inputs { + leader_state.deploy_contracts(input, self.leader_node)?; + follower_state.deploy_contracts(input, self.follower_node)?; + let (_, leader_diff) = leader_state.execute_input(input, self.leader_node)?; let (_, follower_diff) = follower_state.execute_input(input, self.follower_node)?; diff --git a/crates/core/src/main.rs b/crates/core/src/main.rs index 523d3ea8..63d37111 100644 --- a/crates/core/src/main.rs +++ b/crates/core/src/main.rs @@ -5,7 +5,7 @@ use rayon::{ThreadPoolBuilder, prelude::*}; use revive_dt_config::*; use revive_dt_core::{ - Geth, Kitchensink, + Geth, Kitchensink, Platform, driver::{Driver, State}, }; use revive_dt_format::{corpus::Corpus, metadata::Metadata}; @@ -74,28 +74,30 @@ fn collect_corpora(args: &Arguments) -> anyhow::Result anyhow::Result<()> { - let leader_nodes = NodePool::new(args)?; - let follower_nodes = NodePool::new(args)?; +fn run_driver(args: &Arguments, tests: &[Metadata], span: Span) -> anyhow::Result<()> +where + L: Platform, + F: Platform, + L::Blockchain: revive_dt_node::Node + Send + Sync + 'static, + F::Blockchain: revive_dt_node::Node + Send + Sync + 'static, +{ + let leader_nodes = NodePool::::new(args)?; + let follower_nodes = NodePool::::new(args)?; tests.par_iter().for_each(|metadata| { - let mut driver = match (&args.leader, &args.follower) { - (TestingPlatform::Geth, TestingPlatform::Kitchensink) => Driver::::new( - metadata, - args, - leader_nodes.round_robbin(), - follower_nodes.round_robbin(), - ), - _ => unimplemented!(), - }; + let mut driver = Driver::::new( + metadata, + args, + leader_nodes.round_robbin(), + follower_nodes.round_robbin(), + ); match driver.execute(span) { - Ok(build) => { + Ok(_) => { log::info!( "metadata {} success", metadata.directory().as_ref().unwrap().display() ); - build } Err(error) => { log::warn!( @@ -109,6 +111,20 @@ fn execute_corpus(args: &Arguments, tests: &[Metadata], span: Span) -> anyhow::R Ok(()) } +fn execute_corpus(args: &Arguments, tests: &[Metadata], span: Span) -> anyhow::Result<()> { + match (&args.leader, &args.follower) { + (TestingPlatform::Geth, TestingPlatform::Kitchensink) => { + run_driver::(args, tests, span)? + } + (TestingPlatform::Geth, TestingPlatform::Geth) => { + run_driver::(args, tests, span)? + } + _ => unimplemented!(), + } + + Ok(()) +} + fn compile_corpus(config: &Arguments, tests: &[Metadata], platform: &TestingPlatform, span: Span) { tests.par_iter().for_each(|metadata| { for mode in &metadata.solc_modes() {