Skip to content

Commit a409e55

Browse files
authored
feat: Optimism provider (#608)
1 parent dd9c9e7 commit a409e55

File tree

19 files changed

+789
-88
lines changed

19 files changed

+789
-88
lines changed

Cargo.lock

+1
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

crates/edr_napi/src/logger.rs

+12-12
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ use edr_evm::{
1414
transaction::Transaction as _,
1515
SyncBlock,
1616
};
17-
use edr_provider::{ProviderError, TransactionFailure};
17+
use edr_provider::{time::CurrentTime, ProviderError, TransactionFailure};
1818
use itertools::izip;
1919
use napi::{
2020
threadsafe_function::{
@@ -368,7 +368,7 @@ impl LogCollector {
368368
logger.log_console_log_messages(console_log_inputs);
369369

370370
if let Some(transaction_failure) =
371-
TransactionFailure::from_execution_result(execution_result, None, trace)
371+
TransactionFailure::<L1ChainSpec>::from_execution_result::<L1ChainSpec, CurrentTime>(execution_result, None, trace)
372372
{
373373
logger.log_transaction_failure(&transaction_failure);
374374
}
@@ -768,11 +768,11 @@ impl LogCollector {
768768

769769
logger.log_console_log_messages(console_log_inputs);
770770

771-
let transaction_failure = edr_provider::TransactionFailure::from_execution_result(
772-
result,
773-
Some(transaction_hash),
774-
trace,
775-
);
771+
let transaction_failure =
772+
edr_provider::TransactionFailure::<L1ChainSpec>::from_execution_result::<
773+
L1ChainSpec,
774+
CurrentTime,
775+
>(result, Some(transaction_hash), trace);
776776

777777
if let Some(transaction_failure) = transaction_failure {
778778
logger.log_transaction_failure(&transaction_failure);
@@ -1159,11 +1159,11 @@ impl LogCollector {
11591159

11601160
logger.log_console_log_messages(&block_result.console_log_inputs);
11611161

1162-
let transaction_failure = edr_provider::TransactionFailure::from_execution_result(
1163-
transaction_result,
1164-
Some(transaction_hash),
1165-
trace,
1166-
);
1162+
let transaction_failure =
1163+
edr_provider::TransactionFailure::<L1ChainSpec>::from_execution_result::<
1164+
L1ChainSpec,
1165+
CurrentTime,
1166+
>(transaction_result, Some(transaction_hash), trace);
11671167

11681168
if let Some(transaction_failure) = transaction_failure {
11691169
logger.log_transaction_failure(&transaction_failure);

crates/edr_optimism/Cargo.toml

+1
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ alloy-rlp = { version = "0.3", default-features = false, features = ["derive"] }
99
alloy-serde = { version = "0.2.0", default-features = false, features = ["std"] }
1010
edr_eth = { path = "../edr_eth", features = ["serde", "std"] }
1111
edr_evm = { path = "../edr_evm" }
12+
edr_provider = { path = "../edr_provider" }
1213
edr_rpc_eth = { path = "../edr_rpc_eth" }
1314
log = { version = "0.4.17", default-features = false }
1415
revm = { git = "https://github.com/Wodann/revm", rev = "6d479da", version = "12.1", default-features = false, features = ["c-kzg", "dev", "optimism", "serde", "std"] }

crates/edr_optimism/src/spec.rs

+23-1
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,15 @@ use edr_eth::{
44
chain_spec::EthHeaderConstants,
55
eips::eip1559::{BaseFeeParams, ConstantBaseFeeParams, ForkBaseFeeParams},
66
env::{BlobExcessGasAndPrice, BlockEnv},
7-
result::InvalidTransaction,
7+
result::{HaltReason, InvalidTransaction},
88
U256,
99
};
1010
use edr_evm::{
1111
chain_spec::{BlockEnvConstructor, ChainSpec},
1212
transaction::{TransactionError, TransactionValidation},
1313
RemoteBlockConversionError,
1414
};
15+
use edr_provider::{time::TimeSinceEpoch, ProviderSpec, TransactionFailureReason};
1516
use edr_rpc_eth::spec::RpcSpec;
1617
use revm::{
1718
handler::register::HandleRegisters,
@@ -141,3 +142,24 @@ impl EthHeaderConstants for OptimismChainSpec {
141142

142143
const MIN_ETHASH_DIFFICULTY: u64 = 0;
143144
}
145+
146+
impl<TimerT: Clone + TimeSinceEpoch> ProviderSpec<TimerT> for OptimismChainSpec {
147+
type PooledTransaction = transaction::Pooled;
148+
type TransactionRequest = transaction::Request;
149+
150+
fn cast_halt_reason(reason: OptimismHaltReason) -> TransactionFailureReason<Self> {
151+
match reason {
152+
OptimismHaltReason::Base(reason) => match reason {
153+
HaltReason::CreateContractSizeLimit => {
154+
TransactionFailureReason::CreateContractSizeLimit
155+
}
156+
HaltReason::OpcodeNotFound | HaltReason::InvalidFEOpcode => {
157+
TransactionFailureReason::OpcodeNotFound
158+
}
159+
HaltReason::OutOfGas(error) => TransactionFailureReason::OutOfGas(error),
160+
remainder => TransactionFailureReason::Inner(OptimismHaltReason::Base(remainder)),
161+
},
162+
remainder => TransactionFailureReason::Inner(remainder),
163+
}
164+
}
165+
}

crates/edr_optimism/src/transaction.rs

+19-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
mod r#type;
22

3-
/// Pooled transaction types
3+
/// Types for transaction gossip (aka pooled transactions).
44
pub mod pooled;
5-
/// Signed transaction types
5+
/// Types for transaction requests.
6+
pub mod request;
7+
/// Types for signed transactions.
68
pub mod signed;
79

810
/// An Optimism pooled transaction, used to communicate between node pools.
@@ -21,6 +23,21 @@ pub enum Pooled {
2123
Deposit(pooled::Deposit),
2224
}
2325

26+
/// An Optimism transaction request.
27+
#[derive(Debug, Clone, Eq, PartialEq)]
28+
pub enum Request {
29+
/// A legacy transaction request
30+
Legacy(request::Legacy),
31+
/// An EIP-155 transaction request
32+
Eip155(request::Eip155),
33+
/// An EIP-2930 transaction request
34+
Eip2930(request::Eip2930),
35+
/// An EIP-1559 transaction request
36+
Eip1559(request::Eip1559),
37+
/// An EIP-4844 transaction request
38+
Eip4844(request::Eip4844),
39+
}
40+
2441
/// An optimism signed transaction, used in blocks.
2542
#[derive(Clone, Debug, PartialEq, Eq)]
2643
pub enum Signed {

0 commit comments

Comments
 (0)