diff --git a/crates/optimism/node/src/engine.rs b/crates/optimism/node/src/engine.rs
index 7513fc57d4..821e86ced6 100644
--- a/crates/optimism/node/src/engine.rs
+++ b/crates/optimism/node/src/engine.rs
@@ -5,7 +5,7 @@ use op_alloy_rpc_types_engine::{
OpExecutionData, OpExecutionPayloadEnvelopeV3, OpExecutionPayloadEnvelopeV4,
OpPayloadAttributes,
};
-use reth_chainspec::ChainSpec;
+use reth_chainspec::{EthChainSpec, Hardforks};
use reth_consensus::ConsensusError;
use reth_node_api::{
payload::{
@@ -16,7 +16,6 @@ use reth_node_api::{
validate_version_specific_fields, BuiltPayload, EngineTypes, EngineValidator, NodePrimitives,
PayloadValidator,
};
-use reth_optimism_chainspec::OpChainSpec;
use reth_optimism_consensus::isthmus;
use reth_optimism_forks::{OpHardfork, OpHardforks};
use reth_optimism_payload_builder::{OpExecutionPayloadValidator, OpPayloadTypes};
@@ -71,16 +70,16 @@ where
/// Validator for Optimism engine API.
#[derive(Debug, Clone)]
-pub struct OpEngineValidator
{
- inner: OpExecutionPayloadValidator,
+pub struct OpEngineValidator {
+ inner: OpExecutionPayloadValidator,
provider: P,
hashed_addr_l2tol1_msg_passer: B256,
phantom: PhantomData,
}
-impl OpEngineValidator
{
+impl
OpEngineValidator
{
/// Instantiates a new validator.
- pub fn new(chain_spec: Arc, provider: P) -> Self {
+ pub fn new(chain_spec: Arc, provider: P) -> Self {
let hashed_addr_l2tol1_msg_passer = KH::hash_key(ADDRESS_L2_TO_L1_MESSAGE_PASSER);
Self {
inner: OpExecutionPayloadValidator::new(chain_spec),
@@ -89,18 +88,24 @@ impl OpEngineValidator
{
phantom: PhantomData,
}
}
+}
+impl
OpEngineValidator
+where
+ Chain: OpHardforks,
+{
/// Returns the chain spec used by the validator.
#[inline]
- fn chain_spec(&self) -> &OpChainSpec {
+ fn chain_spec(&self) -> &Chain {
self.inner.chain_spec()
}
}
-impl
PayloadValidator for OpEngineValidator
+impl
PayloadValidator for OpEngineValidator
where
P: StateProviderFactory + Unpin + 'static,
Tx: SignedTransaction + Unpin + 'static,
+ Chain: EthChainSpec + OpHardforks + Hardforks + 'static,
{
type Block = alloy_consensus::Block;
type ExecutionData = OpExecutionData;
@@ -145,7 +150,7 @@ where
}
}
-impl EngineValidator for OpEngineValidator
+impl EngineValidator for OpEngineValidator
where
Types: PayloadTypes<
PayloadAttributes = OpPayloadAttributes,
@@ -154,6 +159,7 @@ where
>,
P: StateProviderFactory + Unpin + 'static,
Tx: SignedTransaction + Unpin + 'static + Send + Sync,
+ Chain: EthChainSpec + OpHardforks + Hardforks + 'static,
{
fn validate_version_specific_fields(
&self,
@@ -196,7 +202,7 @@ where
if attributes.gas_limit.is_none() {
return Err(EngineObjectValidationError::InvalidParams(
"MissingGasLimitInPayloadAttributes".to_string().into(),
- ))
+ ));
}
if self
@@ -212,7 +218,7 @@ where
if elasticity != 0 && denominator == 0 {
return Err(EngineObjectValidationError::InvalidParams(
"Eip1559ParamsDenominatorZero".to_string().into(),
- ))
+ ));
}
}
@@ -228,7 +234,7 @@ where
/// Canyon activates the Shanghai EIPs, see the Canyon specs for more details:
///
pub fn validate_withdrawals_presence(
- chain_spec: &ChainSpec,
+ chain_spec: &(impl EthChainSpec + OpHardforks + Hardforks),
version: EngineApiMessageVersion,
message_validation_kind: MessageValidationKind,
timestamp: u64,
@@ -240,11 +246,11 @@ pub fn validate_withdrawals_presence(
EngineApiMessageVersion::V1 => {
if has_withdrawals {
return Err(message_validation_kind
- .to_error(VersionSpecificValidationError::WithdrawalsNotSupportedInV1))
+ .to_error(VersionSpecificValidationError::WithdrawalsNotSupportedInV1));
}
if is_shanghai {
return Err(message_validation_kind
- .to_error(VersionSpecificValidationError::NoWithdrawalsPostShanghai))
+ .to_error(VersionSpecificValidationError::NoWithdrawalsPostShanghai));
}
}
EngineApiMessageVersion::V2 |
@@ -253,11 +259,11 @@ pub fn validate_withdrawals_presence(
EngineApiMessageVersion::V5 => {
if is_shanghai && !has_withdrawals {
return Err(message_validation_kind
- .to_error(VersionSpecificValidationError::NoWithdrawalsPostShanghai))
+ .to_error(VersionSpecificValidationError::NoWithdrawalsPostShanghai));
}
if !is_shanghai && has_withdrawals {
return Err(message_validation_kind
- .to_error(VersionSpecificValidationError::HasWithdrawalsPreShanghai))
+ .to_error(VersionSpecificValidationError::HasWithdrawalsPreShanghai));
}
}
};
@@ -272,8 +278,9 @@ mod test {
use crate::engine;
use alloy_primitives::{b64, Address, B256, B64};
use alloy_rpc_types_engine::PayloadAttributes;
+ use reth_chainspec::ChainSpec;
use reth_node_builder::EngineValidator;
- use reth_optimism_chainspec::BASE_SEPOLIA;
+ use reth_optimism_chainspec::{OpChainSpec, BASE_SEPOLIA};
use reth_provider::noop::NoopProvider;
use reth_trie_common::KeccakKeyHasher;
@@ -316,10 +323,10 @@ mod test {
OpEngineValidator::new::(get_chainspec(), NoopProvider::default());
let attributes = get_attributes(None, 1732633199);
- let result = as EngineValidator<
+ let result = as EngineValidator<
OpEngineTypes,
>>::ensure_well_formed_attributes(
- &validator, EngineApiMessageVersion::V3, &attributes
+ &validator, EngineApiMessageVersion::V3, &attributes,
);
assert!(result.is_ok());
}
@@ -330,10 +337,10 @@ mod test {
OpEngineValidator::new::(get_chainspec(), NoopProvider::default());
let attributes = get_attributes(None, 1732633200);
- let result = as EngineValidator<
+ let result = as EngineValidator<
OpEngineTypes,
>>::ensure_well_formed_attributes(
- &validator, EngineApiMessageVersion::V3, &attributes
+ &validator, EngineApiMessageVersion::V3, &attributes,
);
assert!(matches!(result, Err(EngineObjectValidationError::InvalidParams(_))));
}
@@ -344,10 +351,10 @@ mod test {
OpEngineValidator::new::(get_chainspec(), NoopProvider::default());
let attributes = get_attributes(Some(b64!("0000000000000008")), 1732633200);
- let result = as EngineValidator<
+ let result = as EngineValidator<
OpEngineTypes,
>>::ensure_well_formed_attributes(
- &validator, EngineApiMessageVersion::V3, &attributes
+ &validator, EngineApiMessageVersion::V3, &attributes,
);
assert!(matches!(result, Err(EngineObjectValidationError::InvalidParams(_))));
}
@@ -358,10 +365,10 @@ mod test {
OpEngineValidator::new::(get_chainspec(), NoopProvider::default());
let attributes = get_attributes(Some(b64!("0000000800000008")), 1732633200);
- let result = as EngineValidator<
+ let result = as EngineValidator<
OpEngineTypes,
>>::ensure_well_formed_attributes(
- &validator, EngineApiMessageVersion::V3, &attributes
+ &validator, EngineApiMessageVersion::V3, &attributes,
);
assert!(result.is_ok());
}
@@ -372,10 +379,10 @@ mod test {
OpEngineValidator::new::(get_chainspec(), NoopProvider::default());
let attributes = get_attributes(Some(b64!("0000000000000000")), 1732633200);
- let result = as EngineValidator<
+ let result = as EngineValidator<
OpEngineTypes,
>>::ensure_well_formed_attributes(
- &validator, EngineApiMessageVersion::V3, &attributes
+ &validator, EngineApiMessageVersion::V3, &attributes,
);
assert!(result.is_ok());
}
diff --git a/crates/optimism/node/src/node.rs b/crates/optimism/node/src/node.rs
index 50d1500066..41c66ebf47 100644
--- a/crates/optimism/node/src/node.rs
+++ b/crates/optimism/node/src/node.rs
@@ -409,6 +409,7 @@ where
type Validator = OpEngineValidator<
N::Provider,
<::Primitives as NodePrimitives>::SignedTx,
+ ::ChainSpec,
>;
async fn engine_validator(&self, ctx: &AddOnsContext<'_, N>) -> eyre::Result {
@@ -957,6 +958,7 @@ where
type Validator = OpEngineValidator<
Node::Provider,
<::Primitives as NodePrimitives>::SignedTx,
+ ::ChainSpec,
>;
async fn build(self, ctx: &AddOnsContext<'_, Node>) -> eyre::Result {