diff --git a/Cargo.lock b/Cargo.lock index b2684a9..39a8a80 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -3948,6 +3948,17 @@ dependencies = [ "serde_stacker", ] +[[package]] +name = "revive-dt-common" +version = "0.1.0" +dependencies = [ + "anyhow", + "futures", + "once_cell", + "tokio", + "tracing", +] + [[package]] name = "revive-dt-compiler" version = "0.1.0" @@ -3982,6 +3993,7 @@ dependencies = [ "clap", "indexmap 2.10.0", "rayon", + "revive-dt-common", "revive-dt-compiler", "revive-dt-config", "revive-dt-format", @@ -4003,7 +4015,7 @@ dependencies = [ "alloy-primitives", "alloy-sol-types", "anyhow", - "revive-dt-node-interaction", + "revive-dt-common", "semver 1.0.26", "serde", "serde_json", @@ -4016,7 +4028,9 @@ version = "0.1.0" dependencies = [ "alloy", "anyhow", + "revive-dt-common", "revive-dt-config", + "revive-dt-format", "revive-dt-node-interaction", "serde", "serde_json", @@ -4033,10 +4047,6 @@ version = "0.1.0" dependencies = [ "alloy", "anyhow", - "futures", - "once_cell", - "tokio", - "tracing", ] [[package]] diff --git a/Cargo.toml b/Cargo.toml index 1d2d610..d077231 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,6 +11,7 @@ repository = "https://github.com/paritytech/revive-differential-testing.git" rust-version = "1.85.0" [workspace.dependencies] +revive-dt-common = { version = "0.1.0", path = "crates/common" } revive-dt-compiler = { version = "0.1.0", path = "crates/compiler" } revive-dt-config = { version = "0.1.0", path = "crates/config" } revive-dt-core = { version = "0.1.0", path = "crates/core" } diff --git a/crates/common/Cargo.toml b/crates/common/Cargo.toml new file mode 100644 index 0000000..50d3d5e --- /dev/null +++ b/crates/common/Cargo.toml @@ -0,0 +1,16 @@ +[package] +name = "revive-dt-common" +description = "A library containing common concepts that other crates in the workspace can rely on" +version.workspace = true +authors.workspace = true +license.workspace = true +edition.workspace = true +repository.workspace = true +rust-version.workspace = true + +[dependencies] +anyhow = { workspace = true } +futures = { workspace = true } +tracing = { workspace = true } +once_cell = { workspace = true } +tokio = { workspace = true } diff --git a/crates/node-interaction/src/blocking_executor.rs b/crates/common/src/concepts/blocking_executor.rs similarity index 93% rename from crates/node-interaction/src/blocking_executor.rs rename to crates/common/src/concepts/blocking_executor.rs index 5458bb3..b07b7fd 100644 --- a/crates/node-interaction/src/blocking_executor.rs +++ b/crates/common/src/concepts/blocking_executor.rs @@ -23,7 +23,7 @@ use tracing::Instrument; /// executor to drive an async computation: /// /// ```rust -/// use revive_dt_node_interaction::*; +/// use revive_dt_common::concepts::*; /// /// fn blocking_function() { /// let result = BlockingExecutor::execute(async move { @@ -134,22 +134,17 @@ impl BlockingExecutor { } }; - match result.map(|result| { - *result - .downcast::() - .expect("Type mismatch in the downcast") - }) { - Ok(result) => Ok(result), + let result = match result { + Ok(result) => result, Err(error) => { - tracing::error!( - ?error, - "Failed to downcast the returned result into the expected type" - ); - anyhow::bail!( - "Failed to downcast the returned result into the expected type: {error:?}" - ) + tracing::error!(?error, "An error occurred when running the async task"); + anyhow::bail!("An error occurred when running the async task: {error:?}") } - } + }; + + Ok(*result + .downcast::() + .expect("An error occurred when downcasting into R. This is a bug")) } } /// Represents the state of the async runtime. This runtime is designed to be a singleton runtime @@ -208,7 +203,9 @@ mod test { fn panics_in_futures_are_caught() { // Act let result = BlockingExecutor::execute(async move { - panic!("This is a panic!"); + panic!( + "If this panic causes, well, a panic, then this is an issue. If it's caught then all good!" + ); 0xFFu8 }); diff --git a/crates/common/src/concepts/mod.rs b/crates/common/src/concepts/mod.rs new file mode 100644 index 0000000..cf633e9 --- /dev/null +++ b/crates/common/src/concepts/mod.rs @@ -0,0 +1,3 @@ +mod blocking_executor; + +pub use blocking_executor::*; diff --git a/crates/core/src/common.rs b/crates/common/src/iterators/files_with_extension_iterator.rs similarity index 100% rename from crates/core/src/common.rs rename to crates/common/src/iterators/files_with_extension_iterator.rs diff --git a/crates/common/src/iterators/mod.rs b/crates/common/src/iterators/mod.rs new file mode 100644 index 0000000..f94237a --- /dev/null +++ b/crates/common/src/iterators/mod.rs @@ -0,0 +1,3 @@ +mod files_with_extension_iterator; + +pub use files_with_extension_iterator::*; diff --git a/crates/common/src/lib.rs b/crates/common/src/lib.rs new file mode 100644 index 0000000..baee9f1 --- /dev/null +++ b/crates/common/src/lib.rs @@ -0,0 +1,6 @@ +//! This crate provides common concepts, functionality, types, macros, and more that other crates in +//! the workspace can benefit from. + +pub mod concepts; +pub mod iterators; +pub mod macros; diff --git a/crates/format/src/macros.rs b/crates/common/src/macros/define_wrapper_type.rs similarity index 78% rename from crates/format/src/macros.rs rename to crates/common/src/macros/define_wrapper_type.rs index ed67012..28a9e53 100644 --- a/crates/format/src/macros.rs +++ b/crates/common/src/macros/define_wrapper_type.rs @@ -12,11 +12,9 @@ /// pub struct CaseId(usize); /// ``` /// -/// And would also implement a number of methods on this type making it easier -/// to use. +/// And would also implement a number of methods on this type making it easier to use. /// -/// These wrapper types become very useful as they make the code a lot easier -/// to read. +/// These wrapper types become very useful as they make the code a lot easier to read. /// /// Take the following as an example: /// @@ -26,26 +24,28 @@ /// } /// ``` /// -/// In the above code it's hard to understand what the various types refer to or -/// what to expect them to contain. +/// In the above code it's hard to understand what the various types refer to or what to expect them +/// to contain. /// -/// With these wrapper types we're able to create code that's self-documenting -/// in that the types tell us what the code is referring to. The above code is -/// transformed into +/// With these wrapper types we're able to create code that's self-documenting in that the types +/// tell us what the code is referring to. The above code is transformed into /// /// ```rust,ignore /// struct State { /// contracts: HashMap> /// } /// ``` +/// +/// Note that we follow the same syntax for defining wrapper structs but we do not permit the use of +/// generics. #[macro_export] macro_rules! define_wrapper_type { ( $(#[$meta: meta])* - $ident: ident($ty: ty) $(;)? + $vis:vis struct $ident: ident($ty: ty); ) => { $(#[$meta])* - pub struct $ident($ty); + $vis struct $ident($ty); impl $ident { pub fn new(value: $ty) -> Self { @@ -104,3 +104,7 @@ macro_rules! define_wrapper_type { } }; } + +/// Technically not needed but this allows for the macro to be found in the `macros` module of the +/// crate in addition to being found in the root of the crate. +pub use define_wrapper_type; diff --git a/crates/common/src/macros/mod.rs b/crates/common/src/macros/mod.rs new file mode 100644 index 0000000..1c3f233 --- /dev/null +++ b/crates/common/src/macros/mod.rs @@ -0,0 +1,3 @@ +mod define_wrapper_type; + +pub use define_wrapper_type::*; diff --git a/crates/core/Cargo.toml b/crates/core/Cargo.toml index 89fe7b9..7c6c551 100644 --- a/crates/core/Cargo.toml +++ b/crates/core/Cargo.toml @@ -13,6 +13,7 @@ name = "retester" path = "src/main.rs" [dependencies] +revive-dt-common = { workspace = true } revive-dt-compiler = { workspace = true } revive-dt-config = { workspace = true } revive-dt-format = { workspace = true } diff --git a/crates/core/src/driver/mod.rs b/crates/core/src/driver/mod.rs index 745fc25..a78100b 100644 --- a/crates/core/src/driver/mod.rs +++ b/crates/core/src/driver/mod.rs @@ -1,6 +1,7 @@ //! The test driver handles the compilation and execution of the test cases. use std::collections::HashMap; +use std::fmt::Debug; use std::marker::PhantomData; use alloy::json_abi::JsonAbi; @@ -19,6 +20,9 @@ use alloy::{ }; use anyhow::Context; use indexmap::IndexMap; +use serde_json::Value; + +use revive_dt_common::iterators::FilesWithExtensionIterator; use revive_dt_compiler::{Compiler, SolidityCompiler}; use revive_dt_config::Arguments; use revive_dt_format::case::CaseIdx; @@ -29,11 +33,8 @@ use revive_dt_node::Node; use revive_dt_node_interaction::EthereumNode; use revive_dt_report::reporter::{CompilationTask, Report, Span}; use revive_solc_json_interface::SolcStandardJsonOutput; -use serde_json::Value; -use std::fmt::Debug; use crate::Platform; -use crate::common::*; pub struct State<'a, T: Platform> { /// The configuration that the framework was started with. diff --git a/crates/core/src/lib.rs b/crates/core/src/lib.rs index f7df15c..c332803 100644 --- a/crates/core/src/lib.rs +++ b/crates/core/src/lib.rs @@ -5,17 +5,17 @@ use revive_dt_compiler::{SolidityCompiler, revive_resolc, solc}; use revive_dt_config::TestingPlatform; +use revive_dt_format::traits::ResolverApi; use revive_dt_node::{Node, geth, kitchensink::KitchensinkNode}; use revive_dt_node_interaction::EthereumNode; -pub mod common; pub mod driver; /// One platform can be tested differentially against another. /// /// For this we need a blockchain node implementation and a compiler. pub trait Platform { - type Blockchain: EthereumNode + Node; + type Blockchain: EthereumNode + Node + ResolverApi; type Compiler: SolidityCompiler; /// Returns the matching [TestingPlatform] of the [revive_dt_config::Arguments]. diff --git a/crates/format/Cargo.toml b/crates/format/Cargo.toml index c1b7674..f5150ac 100644 --- a/crates/format/Cargo.toml +++ b/crates/format/Cargo.toml @@ -9,7 +9,7 @@ repository.workspace = true rust-version.workspace = true [dependencies] -revive-dt-node-interaction = { workspace = true } +revive-dt-common = { workspace = true } alloy = { workspace = true } alloy-primitives = { workspace = true } diff --git a/crates/format/src/case.rs b/crates/format/src/case.rs index 29e4ef5..4c59ab9 100644 --- a/crates/format/src/case.rs +++ b/crates/format/src/case.rs @@ -1,7 +1,8 @@ use serde::Deserialize; +use revive_dt_common::macros::define_wrapper_type; + use crate::{ - define_wrapper_type, input::{Expected, Input}, mode::Mode, }; @@ -45,5 +46,5 @@ impl Case { define_wrapper_type!( /// A wrapper type for the index of test cases found in metadata file. #[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] - CaseIdx(usize); + pub struct CaseIdx(usize); ); diff --git a/crates/format/src/input.rs b/crates/format/src/input.rs index 2bc0a88..68d491d 100644 --- a/crates/format/src/input.rs +++ b/crates/format/src/input.rs @@ -11,9 +11,10 @@ use alloy_primitives::{FixedBytes, utils::parse_units}; use semver::VersionReq; use serde::{Deserialize, Serialize}; -use revive_dt_node_interaction::EthereumNode; +use revive_dt_common::macros::define_wrapper_type; -use crate::{define_wrapper_type, metadata::ContractInstance}; +use crate::metadata::ContractInstance; +use crate::traits::ResolverApi; #[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq)] pub struct Input { @@ -84,7 +85,7 @@ pub enum Method { define_wrapper_type!( #[derive(Clone, Copy, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash)] - EtherValue(U256); + pub struct EtherValue(U256); ); impl Serialize for EtherValue { @@ -154,7 +155,7 @@ impl Calldata { pub fn calldata( &self, deployed_contracts: &HashMap, - chain_state_provider: &impl EthereumNode, + chain_state_provider: &impl ResolverApi, ) -> anyhow::Result> { let mut buffer = Vec::::with_capacity(self.size_requirement()); self.calldata_into_slice(&mut buffer, deployed_contracts, chain_state_provider)?; @@ -165,7 +166,7 @@ impl Calldata { &self, buffer: &mut Vec, deployed_contracts: &HashMap, - chain_state_provider: &impl EthereumNode, + chain_state_provider: &impl ResolverApi, ) -> anyhow::Result<()> { match self { Calldata::Single(bytes) => { @@ -200,7 +201,7 @@ impl Calldata { &self, other: &[u8], deployed_contracts: &HashMap, - chain_state_provider: &impl EthereumNode, + chain_state_provider: &impl ResolverApi, ) -> anyhow::Result { match self { Calldata::Single(calldata) => Ok(calldata == other), @@ -249,7 +250,7 @@ impl Input { pub fn encoded_input( &self, deployed_contracts: &HashMap, - chain_state_provider: &impl EthereumNode, + chain_state_provider: &impl ResolverApi, ) -> anyhow::Result { match self.method { Method::Deployer | Method::Fallback => { @@ -316,7 +317,7 @@ impl Input { pub fn legacy_transaction( &self, deployed_contracts: &HashMap, - chain_state_provider: &impl EthereumNode, + chain_state_provider: &impl ResolverApi, ) -> anyhow::Result { let input_data = self.encoded_input(deployed_contracts, chain_state_provider)?; let transaction_request = TransactionRequest::default().from(self.caller).value( @@ -363,7 +364,7 @@ pub const fn default_caller() -> Address { fn resolve_argument( value: &str, deployed_contracts: &HashMap, - chain_state_provider: &impl EthereumNode, + chain_state_provider: &impl ResolverApi, ) -> anyhow::Result { if let Some(instance) = value.strip_suffix(".address") { Ok(U256::from_be_slice( @@ -432,31 +433,9 @@ mod tests { use alloy_sol_types::SolValue; use std::collections::HashMap; - struct DummyEthereumNode; - - impl EthereumNode for DummyEthereumNode { - fn execute_transaction( - &self, - _: TransactionRequest, - ) -> anyhow::Result { - unimplemented!() - } - - fn trace_transaction( - &self, - _: &alloy::rpc::types::TransactionReceipt, - _: alloy::rpc::types::trace::geth::GethDebugTracingOptions, - ) -> anyhow::Result { - unimplemented!() - } - - fn state_diff( - &self, - _: &alloy::rpc::types::TransactionReceipt, - ) -> anyhow::Result { - unimplemented!() - } + struct MockResolver; + impl ResolverApi for MockResolver { fn chain_id(&self) -> anyhow::Result { Ok(0x123) } @@ -528,7 +507,7 @@ mod tests { (Address::ZERO, parsed_abi), ); - let encoded = input.encoded_input(&contracts, &DummyEthereumNode).unwrap(); + let encoded = input.encoded_input(&contracts, &MockResolver).unwrap(); assert!(encoded.0.starts_with(&selector)); type T = (u64,); @@ -572,7 +551,7 @@ mod tests { (Address::ZERO, parsed_abi), ); - let encoded = input.encoded_input(&contracts, &DummyEthereumNode).unwrap(); + let encoded = input.encoded_input(&contracts, &MockResolver).unwrap(); assert!(encoded.0.starts_with(&selector)); type T = (alloy_primitives::Address,); @@ -619,7 +598,7 @@ mod tests { (Address::ZERO, parsed_abi), ); - let encoded = input.encoded_input(&contracts, &DummyEthereumNode).unwrap(); + let encoded = input.encoded_input(&contracts, &MockResolver).unwrap(); assert!(encoded.0.starts_with(&selector)); type T = (alloy_primitives::Address,); @@ -636,11 +615,11 @@ mod tests { let input = "$CHAIN_ID"; // Act - let resolved = resolve_argument(input, &Default::default(), &DummyEthereumNode); + let resolved = resolve_argument(input, &Default::default(), &MockResolver); // Assert let resolved = resolved.expect("Failed to resolve argument"); - assert_eq!(resolved, U256::from(DummyEthereumNode.chain_id().unwrap())) + assert_eq!(resolved, U256::from(MockResolver.chain_id().unwrap())) } #[test] @@ -649,17 +628,13 @@ mod tests { let input = "$GAS_LIMIT"; // Act - let resolved = resolve_argument(input, &Default::default(), &DummyEthereumNode); + let resolved = resolve_argument(input, &Default::default(), &MockResolver); // Assert let resolved = resolved.expect("Failed to resolve argument"); assert_eq!( resolved, - U256::from( - DummyEthereumNode - .block_gas_limit(Default::default()) - .unwrap() - ) + U256::from(MockResolver.block_gas_limit(Default::default()).unwrap()) ) } @@ -669,14 +644,14 @@ mod tests { let input = "$COINBASE"; // Act - let resolved = resolve_argument(input, &Default::default(), &DummyEthereumNode); + let resolved = resolve_argument(input, &Default::default(), &MockResolver); // Assert let resolved = resolved.expect("Failed to resolve argument"); assert_eq!( resolved, U256::from_be_slice( - DummyEthereumNode + MockResolver .block_coinbase(Default::default()) .unwrap() .as_ref() @@ -690,15 +665,13 @@ mod tests { let input = "$DIFFICULTY"; // Act - let resolved = resolve_argument(input, &Default::default(), &DummyEthereumNode); + let resolved = resolve_argument(input, &Default::default(), &MockResolver); // Assert let resolved = resolved.expect("Failed to resolve argument"); assert_eq!( resolved, - DummyEthereumNode - .block_difficulty(Default::default()) - .unwrap() + MockResolver.block_difficulty(Default::default()).unwrap() ) } @@ -708,13 +681,13 @@ mod tests { let input = "$BLOCK_HASH"; // Act - let resolved = resolve_argument(input, &Default::default(), &DummyEthereumNode); + let resolved = resolve_argument(input, &Default::default(), &MockResolver); // Assert let resolved = resolved.expect("Failed to resolve argument"); assert_eq!( resolved, - U256::from_be_bytes(DummyEthereumNode.block_hash(Default::default()).unwrap().0) + U256::from_be_bytes(MockResolver.block_hash(Default::default()).unwrap().0) ) } @@ -724,13 +697,13 @@ mod tests { let input = "$BLOCK_NUMBER"; // Act - let resolved = resolve_argument(input, &Default::default(), &DummyEthereumNode); + let resolved = resolve_argument(input, &Default::default(), &MockResolver); // Assert let resolved = resolved.expect("Failed to resolve argument"); assert_eq!( resolved, - U256::from(DummyEthereumNode.last_block_number().unwrap()) + U256::from(MockResolver.last_block_number().unwrap()) ) } @@ -740,17 +713,13 @@ mod tests { let input = "$BLOCK_TIMESTAMP"; // Act - let resolved = resolve_argument(input, &Default::default(), &DummyEthereumNode); + let resolved = resolve_argument(input, &Default::default(), &MockResolver); // Assert let resolved = resolved.expect("Failed to resolve argument"); assert_eq!( resolved, - U256::from( - DummyEthereumNode - .block_timestamp(Default::default()) - .unwrap() - ) + U256::from(MockResolver.block_timestamp(Default::default()).unwrap()) ) } } diff --git a/crates/format/src/lib.rs b/crates/format/src/lib.rs index f66d883..8ef7301 100644 --- a/crates/format/src/lib.rs +++ b/crates/format/src/lib.rs @@ -3,6 +3,6 @@ pub mod case; pub mod corpus; pub mod input; -pub mod macros; pub mod metadata; pub mod mode; +pub mod traits; diff --git a/crates/format/src/metadata.rs b/crates/format/src/metadata.rs index c1cef62..f6de7d7 100644 --- a/crates/format/src/metadata.rs +++ b/crates/format/src/metadata.rs @@ -9,9 +9,10 @@ use std::{ use serde::{Deserialize, Serialize}; +use revive_dt_common::macros::define_wrapper_type; + use crate::{ case::Case, - define_wrapper_type, mode::{Mode, SolcMode}, }; @@ -217,18 +218,22 @@ define_wrapper_type!( /// Represents a contract instance found a metadata file. /// /// Typically, this is used as the key to the "contracts" field of metadata files. - #[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] + #[derive( + Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize, + )] #[serde(transparent)] - ContractInstance(String); + pub struct ContractInstance(String); ); define_wrapper_type!( /// Represents a contract identifier found a metadata file. /// /// A contract identifier is the name of the contract in the source code. - #[derive(Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize)] + #[derive( + Clone, Debug, Default, PartialEq, Eq, PartialOrd, Ord, Hash, Serialize, Deserialize, + )] #[serde(transparent)] - ContractIdent(String); + pub struct ContractIdent(String); ); /// Represents an identifier used for contracts. diff --git a/crates/format/src/traits.rs b/crates/format/src/traits.rs new file mode 100644 index 0000000..c22f24a --- /dev/null +++ b/crates/format/src/traits.rs @@ -0,0 +1,30 @@ +use alloy::eips::BlockNumberOrTag; +use alloy::primitives::{Address, BlockHash, BlockNumber, BlockTimestamp, ChainId, U256}; +use anyhow::Result; + +/// A trait of the interface are required to implement to be used by the resolution logic that this +/// crate implements to go from string calldata and into the bytes calldata. +pub trait ResolverApi { + /// Returns the ID of the chain that the node is on. + fn chain_id(&self) -> Result; + + // TODO: This is currently a u128 due to Kitchensink needing more than 64 bits for its gas limit + // when we implement the changes to the gas we need to adjust this to be a u64. + /// Returns the gas limit of the specified block. + fn block_gas_limit(&self, number: BlockNumberOrTag) -> Result; + + /// Returns the coinbase of the specified block. + fn block_coinbase(&self, number: BlockNumberOrTag) -> Result
; + + /// Returns the difficulty of the specified block. + fn block_difficulty(&self, number: BlockNumberOrTag) -> Result; + + /// Returns the hash of the specified block. + fn block_hash(&self, number: BlockNumberOrTag) -> Result; + + /// Returns the timestamp of the specified block, + fn block_timestamp(&self, number: BlockNumberOrTag) -> Result; + + /// Returns the number of the last block. + fn last_block_number(&self) -> Result; +} diff --git a/crates/node-interaction/Cargo.toml b/crates/node-interaction/Cargo.toml index 84ea315..9953c69 100644 --- a/crates/node-interaction/Cargo.toml +++ b/crates/node-interaction/Cargo.toml @@ -11,7 +11,3 @@ rust-version.workspace = true [dependencies] alloy = { workspace = true } anyhow = { workspace = true } -futures = { workspace = true } -tracing = { workspace = true } -once_cell = { workspace = true } -tokio = { workspace = true } diff --git a/crates/node-interaction/src/lib.rs b/crates/node-interaction/src/lib.rs index 8ac488c..130d804 100644 --- a/crates/node-interaction/src/lib.rs +++ b/crates/node-interaction/src/lib.rs @@ -1,14 +1,9 @@ //! This crate implements all node interactions. -use alloy::eips::BlockNumberOrTag; -use alloy::primitives::{Address, BlockHash, BlockNumber, BlockTimestamp, ChainId, U256}; use alloy::rpc::types::trace::geth::{DiffMode, GethDebugTracingOptions, GethTrace}; use alloy::rpc::types::{TransactionReceipt, TransactionRequest}; use anyhow::Result; -mod blocking_executor; -pub use blocking_executor::*; - /// An interface for all interactions with Ethereum compatible nodes. pub trait EthereumNode { /// Execute the [TransactionRequest] and return a [TransactionReceipt]. @@ -23,27 +18,4 @@ pub trait EthereumNode { /// Returns the state diff of the transaction hash in the [TransactionReceipt]. fn state_diff(&self, receipt: &TransactionReceipt) -> Result; - - /// Returns the ID of the chain that the node is on. - fn chain_id(&self) -> Result; - - // TODO: This is currently a u128 due to Kitchensink needing more than 64 bits for its gas limit - // when we implement the changes to the gas we need to adjust this to be a u64. - /// Returns the gas limit of the specified block. - fn block_gas_limit(&self, number: BlockNumberOrTag) -> Result; - - /// Returns the coinbase of the specified block. - fn block_coinbase(&self, number: BlockNumberOrTag) -> Result
; - - /// Returns the difficulty of the specified block. - fn block_difficulty(&self, number: BlockNumberOrTag) -> Result; - - /// Returns the hash of the specified block. - fn block_hash(&self, number: BlockNumberOrTag) -> Result; - - /// Returns the timestamp of the specified block, - fn block_timestamp(&self, number: BlockNumberOrTag) -> Result; - - /// Returns the number of the last block. - fn last_block_number(&self) -> Result; } diff --git a/crates/node/Cargo.toml b/crates/node/Cargo.toml index 48b5e2d..a930312 100644 --- a/crates/node/Cargo.toml +++ b/crates/node/Cargo.toml @@ -14,8 +14,10 @@ alloy = { workspace = true } tracing = { workspace = true } tokio = { workspace = true } -revive-dt-node-interaction = { workspace = true } +revive-dt-common = { workspace = true } revive-dt-config = { workspace = true } +revive-dt-format = { workspace = true } +revive-dt-node-interaction = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } diff --git a/crates/node/src/geth.rs b/crates/node/src/geth.rs index d91a8aa..7679171 100644 --- a/crates/node/src/geth.rs +++ b/crates/node/src/geth.rs @@ -25,8 +25,10 @@ use alloy::{ }, signers::local::PrivateKeySigner, }; +use revive_dt_common::concepts::BlockingExecutor; use revive_dt_config::Arguments; -use revive_dt_node_interaction::{BlockingExecutor, EthereumNode}; +use revive_dt_format::traits::ResolverApi; +use revive_dt_node_interaction::EthereumNode; use tracing::Level; use crate::{Node, common::FallbackGasFiller, constants::INITIAL_BALANCE}; @@ -343,7 +345,9 @@ impl EthereumNode for Instance { _ => anyhow::bail!("expected a diff mode trace"), } } +} +impl ResolverApi for Instance { #[tracing::instrument(skip_all, fields(geth_node_id = self.id))] fn chain_id(&self) -> anyhow::Result { let provider = self.provider(); diff --git a/crates/node/src/kitchensink.rs b/crates/node/src/kitchensink.rs index 200f6aa..ff9d652 100644 --- a/crates/node/src/kitchensink.rs +++ b/crates/node/src/kitchensink.rs @@ -30,14 +30,16 @@ use alloy::{ }, signers::local::PrivateKeySigner, }; +use revive_dt_format::traits::ResolverApi; use serde::{Deserialize, Serialize}; use serde_json::{Value as JsonValue, json}; use sp_core::crypto::Ss58Codec; use sp_runtime::AccountId32; use tracing::Level; +use revive_dt_common::concepts::BlockingExecutor; use revive_dt_config::Arguments; -use revive_dt_node_interaction::{BlockingExecutor, EthereumNode}; +use revive_dt_node_interaction::EthereumNode; use crate::{Node, common::FallbackGasFiller, constants::INITIAL_BALANCE}; @@ -424,7 +426,9 @@ impl EthereumNode for KitchensinkNode { _ => anyhow::bail!("expected a diff mode trace"), } } +} +impl ResolverApi for KitchensinkNode { #[tracing::instrument(skip_all, fields(geth_node_id = self.id))] fn chain_id(&self) -> anyhow::Result { let provider = self.provider();