Skip to content

Commit 8b2c0e0

Browse files
committed
fini
1 parent 432abef commit 8b2c0e0

File tree

39 files changed

+395
-398
lines changed

39 files changed

+395
-398
lines changed

Cargo.lock

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/block/miner/src/lib.rs

Lines changed: 70 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
use std::{cmp::Ordering, fmt::Debug};
1+
use std::{cmp::Ordering, fmt::Debug, marker::PhantomData, sync::Arc};
22

3-
use edr_block_api::Block as _;
3+
use edr_block_api::Block;
44
use edr_block_builder_api::{
55
BlockBuilder, BlockBuilderCreationError, BlockFinalizeError, BlockInputs,
6-
BlockTransactionError, Blockchain, PrecompileFn, WrapDatabaseRef,
6+
BlockTransactionError, Blockchain, ExecutionResult, PrecompileFn, WrapDatabaseRef,
77
};
88
pub use edr_block_builder_api::{BuiltBlockAndState, BuiltBlockAndStateWithMetadata};
99
use edr_block_header::{
@@ -19,7 +19,7 @@ use edr_chain_spec_evm::{
1919
};
2020
use edr_database_components::DatabaseComponents;
2121
use edr_mem_pool::{MemPool, OrderedTransaction};
22-
use edr_primitives::{Address, HashMap, HashSet};
22+
use edr_primitives::{Address, HashMap, HashSet, B256};
2323
use edr_signer::SignatureError;
2424
use edr_state_api::{DynState, StateError};
2525
use serde::{Deserialize, Serialize};
@@ -89,6 +89,71 @@ pub enum MineBlockError<
8989
MissingPrevrandao,
9090
}
9191

92+
/// Helper type for a chain-specific [`MineBlockResultWithMetadata`].
93+
pub type MineBlockResultWithMetadataForChainSpec<ChainSpecT, InspectorDataT = ()> =
94+
MineBlockResultWithMetadata<
95+
Arc<<ChainSpecT as BlockChainSpec>::Block>,
96+
<ChainSpecT as ChainSpec>::HaltReason,
97+
<ChainSpecT as ChainSpec>::SignedTransaction,
98+
InspectorDataT,
99+
>;
100+
101+
#[derive(Debug)]
102+
pub struct MineBlockResultWithMetadata<
103+
BlockT,
104+
HaltReasonT: HaltReasonTrait,
105+
SignedTransactionT,
106+
InspectorDataT = (),
107+
> {
108+
/// Mined block
109+
pub block: BlockT,
110+
/// The set of precompile addresses that were available during execution.
111+
pub precompile_addresses: HashSet<Address>,
112+
/// Data collected from inspectors during mining, indexed by transaction
113+
/// number in the block.
114+
pub transaction_inspector_data: Vec<InspectorDataT>,
115+
/// Transaction results
116+
pub transaction_results: Vec<ExecutionResult<HaltReasonT>>,
117+
phantom: PhantomData<SignedTransactionT>,
118+
}
119+
120+
impl<BlockT, HaltReasonT: HaltReasonTrait, SignedTransactionT, InspectorDataT>
121+
MineBlockResultWithMetadata<BlockT, HaltReasonT, SignedTransactionT, InspectorDataT>
122+
{
123+
/// Constructs a new instance.
124+
pub fn new(
125+
block: BlockT,
126+
precompile_addresses: HashSet<Address>,
127+
transaction_inspector_data: Vec<InspectorDataT>,
128+
transaction_results: Vec<ExecutionResult<HaltReasonT>>,
129+
) -> Self {
130+
Self {
131+
block,
132+
precompile_addresses,
133+
transaction_inspector_data,
134+
transaction_results,
135+
phantom: PhantomData,
136+
}
137+
}
138+
}
139+
140+
impl<
141+
BlockT: Block<SignedTransactionT>,
142+
HaltReasonT: HaltReasonTrait,
143+
InspectorDataT,
144+
SignedTransactionT: ExecutableTransaction,
145+
> MineBlockResultWithMetadata<BlockT, HaltReasonT, SignedTransactionT, InspectorDataT>
146+
{
147+
/// Whether the block contains a transaction with the given hash.
148+
pub fn has_transaction(&self, transaction_hash: &B256) -> bool {
149+
self.block
150+
.transactions()
151+
.iter()
152+
.any(|tx| *tx.transaction_hash() == *transaction_hash)
153+
}
154+
}
155+
156+
#[derive(Debug)]
92157
pub struct MineBlockResultAndStateWithMetadata<
93158
BlockT,
94159
HaltReasonT: HaltReasonTrait,
@@ -141,7 +206,7 @@ pub fn mine_block<ChainSpecT, BlockchainErrorT, InspectorT>(
141206
min_gas_price: u128,
142207
mine_ordering: MineOrdering,
143208
reward: u128,
144-
mut inspector: Option<InspectorT>,
209+
mut inspector: Option<&mut InspectorT>,
145210
custom_precompiles: &HashMap<Address, PrecompileFn>,
146211
) -> Result<
147212
MineBlockResultAndStateWithMetadata<
@@ -406,7 +471,6 @@ pub fn mine_block_with_single_transaction<
406471
ChainSpecT: BlockChainSpec,
407472
BlockchainErrorT: std::error::Error,
408473
InspectorT,
409-
InspectorResultT,
410474
>(
411475
blockchain: &dyn Blockchain<
412476
ChainSpecT::Receipt,

crates/edr_napi/Cargo.toml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ alloy-json-abi.workspace = true
1212
alloy-sol-types.workspace = true
1313
derive_more.workspace = true
1414
derive-where.workspace = true
15+
edr_artifact.workspace = true
1516
edr_block_header.workspace = true
1617
edr_block_miner.workspace = true
1718
edr_blockchain_fork.workspace = true
@@ -23,6 +24,7 @@ edr_chain_spec_evm.workspace = true
2324
edr_chain_spec_rpc.workspace = true
2425
edr_common.workspace = true
2526
edr_coverage.workspace = true
27+
edr_decoder_revert.workspace = true
2628
edr_defaults.workspace = true
2729
edr_eip1559.workspace = true
2830
edr_gas_report.workspace = true
@@ -57,6 +59,7 @@ napi = { version = "2.16.17", default-features = false, features = [
5759
"serde-json",
5860
] }
5961
napi-derive = "2.16.13"
62+
parking_lot.workspace = true
6063
rand = { version = "0.8.4", optional = true }
6164
semver.workspace = true
6265
serde.workspace = true

crates/edr_napi/src/chains/generic.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ use edr_provider::time::CurrentTime;
1010
use edr_solidity::contract_decoder::ContractDecoder;
1111
use napi::tokio::runtime;
1212
use napi_derive::napi;
13+
use parking_lot::RwLock;
1314

1415
use crate::provider::ProviderFactory;
1516

@@ -22,7 +23,7 @@ impl SyncProviderFactory for GenericChainProviderFactory {
2223
provider_config: edr_napi_core::provider::Config,
2324
logger_config: edr_napi_core::logger::Config,
2425
subscription_callback: edr_napi_core::subscription::Callback,
25-
contract_decoder: Arc<ContractDecoder>,
26+
contract_decoder: Arc<RwLock<ContractDecoder>>,
2627
) -> napi::Result<Arc<dyn SyncProvider>> {
2728
let logger = Logger::<GenericChainSpec, CurrentTime>::new(
2829
logger_config,

crates/edr_napi/src/chains/l1.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ use napi::{
1717
tokio::runtime,
1818
};
1919
use napi_derive::napi;
20+
use parking_lot::RwLock;
2021

2122
use crate::{account::AccountOverride, provider::ProviderFactory};
2223

@@ -29,7 +30,7 @@ impl SyncProviderFactory for L1ProviderFactory {
2930
provider_config: edr_napi_core::provider::Config,
3031
logger_config: edr_napi_core::logger::Config,
3132
subscription_callback: edr_napi_core::subscription::Callback,
32-
contract_decoder: Arc<ContractDecoder>,
33+
contract_decoder: Arc<RwLock<ContractDecoder>>,
3334
) -> napi::Result<Arc<dyn SyncProvider>> {
3435
let logger =
3536
Logger::<L1ChainSpec, CurrentTime>::new(logger_config, Arc::clone(&contract_decoder))?;

crates/edr_napi/src/chains/op.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ use napi::{
2121
tokio::runtime,
2222
};
2323
use napi_derive::napi;
24+
use parking_lot::RwLock;
2425

2526
use crate::{
2627
account::{AccountOverride, StorageSlot},
@@ -36,7 +37,7 @@ impl SyncProviderFactory for OpProviderFactory {
3637
provider_config: edr_napi_core::provider::Config,
3738
logger_config: edr_napi_core::logger::Config,
3839
subscription_callback: edr_napi_core::subscription::Callback,
39-
contract_decoder: Arc<ContractDecoder>,
40+
contract_decoder: Arc<RwLock<ContractDecoder>>,
4041
) -> napi::Result<Arc<dyn SyncProvider>> {
4142
let logger =
4243
Logger::<OpChainSpec, CurrentTime>::new(logger_config, Arc::clone(&contract_decoder))?;

crates/edr_napi/src/context.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
11
use std::sync::Arc;
22

3+
use edr_decoder_revert::RevertDecoder;
34
use edr_napi_core::{provider::SyncProviderFactory, solidity};
45
use edr_primitives::HashMap;
56
use edr_solidity_tests::{
6-
decode::RevertDecoder,
77
multi_runner::{SuiteResultAndArtifactId, TestContract, TestContracts},
88
TestFilterConfig,
99
};
@@ -251,7 +251,7 @@ impl EdrContext {
251251

252252
let test_suites = try_or_reject_deferred!(test_suites
253253
.into_iter()
254-
.map(edr_solidity::artifacts::ArtifactId::try_from)
254+
.map(edr_artifact::ArtifactId::try_from)
255255
.collect::<Result<Vec<_>, _>>());
256256

257257
let contracts = try_or_reject_deferred!(test_suites

crates/edr_napi/src/contract_decoder.rs

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
use std::sync::Arc;
22

33
use napi_derive::napi;
4+
use parking_lot::RwLock;
45

56
use crate::config::TracingConfigWithBuffers;
67

78
#[napi]
89
pub struct ContractDecoder {
9-
inner: Arc<edr_solidity::contract_decoder::ContractDecoder>,
10+
inner: Arc<RwLock<edr_solidity::contract_decoder::ContractDecoder>>,
1011
}
1112

1213
#[napi]
@@ -17,7 +18,7 @@ impl ContractDecoder {
1718
#[allow(clippy::new_without_default)]
1819
pub fn new() -> Self {
1920
Self {
20-
inner: Arc::new(edr_solidity::contract_decoder::ContractDecoder::default()),
21+
inner: Arc::default(),
2122
}
2223
}
2324

@@ -32,7 +33,7 @@ impl ContractDecoder {
3233
let contract_decoder =
3334
edr_solidity::contract_decoder::ContractDecoder::new(&build_info_config).map_or_else(
3435
|error| Err(napi::Error::from_reason(error.to_string())),
35-
|contract_decoder| Ok(Arc::new(contract_decoder)),
36+
|contract_decoder| Ok(Arc::new(RwLock::new(contract_decoder))),
3637
)?;
3738

3839
Ok(Self {
@@ -43,13 +44,15 @@ impl ContractDecoder {
4344

4445
impl ContractDecoder {
4546
/// Returns a reference to the inner contract decoder.
46-
pub fn as_inner(&self) -> &Arc<edr_solidity::contract_decoder::ContractDecoder> {
47+
pub fn as_inner(&self) -> &Arc<RwLock<edr_solidity::contract_decoder::ContractDecoder>> {
4748
&self.inner
4849
}
4950
}
5051

51-
impl From<Arc<edr_solidity::contract_decoder::ContractDecoder>> for ContractDecoder {
52-
fn from(contract_decoder: Arc<edr_solidity::contract_decoder::ContractDecoder>) -> Self {
52+
impl From<Arc<RwLock<edr_solidity::contract_decoder::ContractDecoder>>> for ContractDecoder {
53+
fn from(
54+
contract_decoder: Arc<RwLock<edr_solidity::contract_decoder::ContractDecoder>>,
55+
) -> Self {
5356
Self {
5457
inner: contract_decoder,
5558
}

crates/edr_napi/src/mock.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ use std::sync::Arc;
44

55
use edr_napi_core::provider::SyncProvider;
66
use edr_rpc_client::jsonrpc;
7-
use edr_solidity::contract_decoder::ContractDecoder;
87
use napi::tokio::runtime;
98
use napi_derive::napi;
109

@@ -56,7 +55,7 @@ impl EdrContext {
5655
let provider = Provider::new(
5756
Arc::new(MockProvider::new(mocked_response)),
5857
runtime::Handle::current(),
59-
Arc::new(ContractDecoder::default()),
58+
Arc::default(),
6059
#[cfg(feature = "scenarios")]
6160
None,
6261
);

crates/edr_napi/src/provider.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ use edr_napi_core::provider::SyncProvider;
88
use edr_solidity::compiler::create_models_and_decode_bytecodes;
99
use napi::{tokio::runtime, Env, JsFunction, JsObject, Status};
1010
use napi_derive::napi;
11+
use parking_lot::RwLock;
1112

1213
pub use self::factory::ProviderFactory;
1314
use self::response::Response;
@@ -16,7 +17,7 @@ use crate::{call_override::CallOverrideCallback, contract_decoder::ContractDecod
1617
/// A JSON-RPC provider for Ethereum.
1718
#[napi]
1819
pub struct Provider {
19-
contract_decoder: Arc<edr_solidity::contract_decoder::ContractDecoder>,
20+
contract_decoder: Arc<RwLock<edr_solidity::contract_decoder::ContractDecoder>>,
2021
provider: Arc<dyn SyncProvider>,
2122
runtime: runtime::Handle,
2223
#[cfg(feature = "scenarios")]
@@ -28,7 +29,7 @@ impl Provider {
2829
pub fn new(
2930
provider: Arc<dyn SyncProvider>,
3031
runtime: runtime::Handle,
31-
contract_decoder: Arc<edr_solidity::contract_decoder::ContractDecoder>,
32+
contract_decoder: Arc<RwLock<edr_solidity::contract_decoder::ContractDecoder>>,
3233
#[cfg(feature = "scenarios")] scenario_file: Option<
3334
napi::tokio::sync::Mutex<napi::tokio::fs::File>,
3435
>,
@@ -76,6 +77,7 @@ impl Provider {
7677
}
7778
};
7879

80+
let mut contract_decoder = contract_decoder.write();
7981
for contract in contracts {
8082
contract_decoder.add_contract_metadata(contract);
8183
}

0 commit comments

Comments
 (0)