diff --git a/Cargo.lock b/Cargo.lock index dcd29b36a..cdc31489b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -5274,9 +5274,9 @@ checksum = "b410bbe7e14ab526a0e86877eb47c6996a2bd7746f027ba551028c925390e4e9" [[package]] name = "op-alloy-consensus" -version = "0.6.0" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae4582945fa96ae0ed78babcac6e41f025460e30ed0c9781aaeedf878fc2b527" +checksum = "dabf6e7d7d63b2c6ed746b24d334e16388c6c3921bc50172440c72aa923c6b4a" dependencies = [ "alloy-consensus", "alloy-eips", @@ -5292,9 +5292,9 @@ dependencies = [ [[package]] name = "op-alloy-genesis" -version = "0.6.0" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d1ece4a037c56536d8b517d045cef9cc07364c578709c184d33817108309c31e" +checksum = "f901aa077832e22820c644d63d2e5e48601eed0f06e40f2a26d1b2a89bd17dec" dependencies = [ "alloy-consensus", "alloy-eips", @@ -5306,9 +5306,9 @@ dependencies = [ [[package]] name = "op-alloy-network" -version = "0.6.0" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "05e9b64d15a7bf27a06c16eb286349aa2d4e3173260a8ab1fe73bd2c13c89769" +checksum = "8b2e7db7997b12c1f364a3bd54b35338357f44c8e2e533a81ebf625104d80110" dependencies = [ "alloy-consensus", "alloy-network", @@ -5321,9 +5321,9 @@ dependencies = [ [[package]] name = "op-alloy-protocol" -version = "0.6.0" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aa989d1ea8deced466b0edd7a447264b1f934fd740ab895d32b8544dcce3b151" +checksum = "b9226c7618f45f1d1e1f1112230818d5cfa719da9f5ca05fa28eaeb44d024181" dependencies = [ "alloy-consensus", "alloy-eips", @@ -5341,9 +5341,9 @@ dependencies = [ [[package]] name = "op-alloy-rpc-types" -version = "0.6.0" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca6e53039829ff0b3482d8dd02cb2de45d5c7b889023c7e4588a43ea7451664a" +checksum = "d60079165fe9a4be99b04865d8746c6c9c7b505be2fdce8982f677ca18c3cc10" dependencies = [ "alloy-consensus", "alloy-eips", @@ -5360,9 +5360,9 @@ dependencies = [ [[package]] name = "op-alloy-rpc-types-engine" -version = "0.6.0" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "283b19e1e7fef1ca9078df39f45a48609cacf856b7b441ed6cf19301ed162cca" +checksum = "59a5b505325e343b299b1c574b2b8542f6ac3101e0d92a1c909b2d7dd74665f1" dependencies = [ "alloy-eips", "alloy-primitives", @@ -5370,6 +5370,7 @@ dependencies = [ "alloy-serde", "derive_more 1.0.0", "ethereum_ssz", + "op-alloy-consensus", "op-alloy-protocol", "serde", "snap", diff --git a/Cargo.toml b/Cargo.toml index b8734afe6..8ff8c1eb7 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -468,10 +468,10 @@ alloy-transport-ipc = { version = "0.6.0", default-features = false } alloy-transport-ws = { version = "0.6.0", default-features = false } # op -op-alloy-rpc-types = "0.6" -op-alloy-rpc-types-engine = "0.6" -op-alloy-network = "0.6" -op-alloy-consensus = "0.6" +op-alloy-rpc-types = "0.6.2" +op-alloy-rpc-types-engine = "0.6.2" +op-alloy-network = "0.6.2" +op-alloy-consensus = "0.6.2" # misc aquamarine = "0.6" diff --git a/crates/optimism/chainspec/src/lib.rs b/crates/optimism/chainspec/src/lib.rs index a60a9a22a..aa59e9ab3 100644 --- a/crates/optimism/chainspec/src/lib.rs +++ b/crates/optimism/chainspec/src/lib.rs @@ -436,14 +436,14 @@ impl From for OpChainSpec { #[derive(Default, Debug)] struct OpGenesisInfo { - optimism_chain_info: op_alloy_rpc_types::genesis::OpChainInfo, + optimism_chain_info: op_alloy_rpc_types::OpChainInfo, base_fee_params: BaseFeeParamsKind, } impl OpGenesisInfo { fn extract_from(genesis: &Genesis) -> Self { let mut info = Self { - optimism_chain_info: op_alloy_rpc_types::genesis::OpChainInfo::extract_from( + optimism_chain_info: op_alloy_rpc_types::OpChainInfo::extract_from( &genesis.config.extra_fields, ) .unwrap_or_default(), @@ -852,7 +852,7 @@ mod tests { #[test] fn parse_genesis_optimism_with_variable_base_fee_params() { - use op_alloy_rpc_types::genesis::OpBaseFeeInfo; + use op_alloy_rpc_types::OpBaseFeeInfo; let geth_genesis = r#" { diff --git a/crates/optimism/node/src/engine.rs b/crates/optimism/node/src/engine.rs index eb356e86e..e337a2355 100644 --- a/crates/optimism/node/src/engine.rs +++ b/crates/optimism/node/src/engine.rs @@ -15,9 +15,7 @@ use reth_node_api::{ }; use reth_optimism_chainspec::OpChainSpec; use reth_optimism_forks::{OptimismHardfork, OptimismHardforks}; -use reth_optimism_payload_builder::{ - builder::decode_eip_1559_params, OpBuiltPayload, OpPayloadBuilderAttributes, -}; +use reth_optimism_payload_builder::{OpBuiltPayload, OpPayloadBuilderAttributes}; /// The types used in the optimism beacon consensus engine. #[derive(Debug, Default, Clone, serde::Deserialize, serde::Serialize)] @@ -151,12 +149,12 @@ where if self.chain_spec.is_holocene_active_at_timestamp(attributes.payload_attributes.timestamp) { - let Some(eip_1559_params) = attributes.eip_1559_params else { - return Err(EngineObjectValidationError::InvalidParams( - "MissingEip1559ParamsInPayloadAttributes".to_string().into(), - )) - }; - let (elasticity, denominator) = decode_eip_1559_params(eip_1559_params); + let (elasticity, denominator) = + attributes.decode_eip_1559_params().ok_or_else(|| { + EngineObjectValidationError::InvalidParams( + "MissingEip1559ParamsInPayloadAttributes".to_string().into(), + ) + })?; if elasticity != 0 && denominator == 0 { return Err(EngineObjectValidationError::InvalidParams( "Eip1559ParamsDenominatorZero".to_string().into(), diff --git a/crates/optimism/payload/src/builder.rs b/crates/optimism/payload/src/builder.rs index f0c6c04ce..76c48c09b 100644 --- a/crates/optimism/payload/src/builder.rs +++ b/crates/optimism/payload/src/builder.rs @@ -4,7 +4,7 @@ use std::{fmt::Display, sync::Arc}; use alloy_consensus::EMPTY_OMMER_ROOT_HASH; use alloy_eips::merge::BEACON_NONCE; -use alloy_primitives::{Address, Bytes, B64, U256}; +use alloy_primitives::{Address, Bytes, U256}; use alloy_rpc_types_engine::PayloadId; use reth_basic_payload_builder::*; use reth_chain_state::ExecutedBlock; @@ -831,12 +831,3 @@ where Ok(None) } } - -/// Extracts the Holocene 1599 parameters from the encoded form: -/// -pub fn decode_eip_1559_params(eip_1559_params: B64) -> (u32, u32) { - let denominator: [u8; 4] = eip_1559_params.0[..4].try_into().expect("sufficient length"); - let elasticity: [u8; 4] = eip_1559_params.0[4..8].try_into().expect("sufficient length"); - - (u32::from_be_bytes(elasticity), u32::from_be_bytes(denominator)) -} diff --git a/crates/optimism/payload/src/error.rs b/crates/optimism/payload/src/error.rs index ce5f584a1..2016fdc6d 100644 --- a/crates/optimism/payload/src/error.rs +++ b/crates/optimism/payload/src/error.rs @@ -21,17 +21,3 @@ pub enum OptimismPayloadBuilderError { #[error("blob transaction included in sequencer block")] BlobTransactionRejected, } - -/// Error type for EIP-1559 parameters -#[derive(Debug, thiserror::Error)] -pub enum EIP1559ParamError { - /// No EIP-1559 parameters provided - #[error("No EIP-1559 parameters provided")] - NoEIP1559Params, - /// Denominator overflow - #[error("Denominator overflow")] - DenominatorOverflow, - /// Elasticity overflow - #[error("Elasticity overflow")] - ElasticityOverflow, -} diff --git a/crates/optimism/payload/src/payload.rs b/crates/optimism/payload/src/payload.rs index 5acac70e9..f35764079 100644 --- a/crates/optimism/payload/src/payload.rs +++ b/crates/optimism/payload/src/payload.rs @@ -1,8 +1,5 @@ //! Payload related types -//! Optimism builder support - -use crate::{builder::decode_eip_1559_params, error::EIP1559ParamError}; use alloy_eips::{ eip1559::BaseFeeParams, eip2718::Decodable2718, eip4844::BlobTransactionSidecar, eip7685::Requests, @@ -10,6 +7,7 @@ use alloy_eips::{ use alloy_primitives::{keccak256, Address, Bytes, B256, B64, U256}; use alloy_rlp::Encodable; use alloy_rpc_types_engine::{ExecutionPayloadEnvelopeV2, ExecutionPayloadV1, PayloadId}; +use op_alloy_consensus::eip1559::{decode_holocene_extra_data, EIP1559ParamError}; /// Re-export for use in downstream arguments. pub use op_alloy_rpc_types_engine::OpPayloadAttributes; use op_alloy_rpc_types_engine::{OpExecutionPayloadEnvelopeV3, OpExecutionPayloadEnvelopeV4}; @@ -46,31 +44,9 @@ impl OpPayloadBuilderAttributes { &self, default_base_fee_params: BaseFeeParams, ) -> Result { - let eip_1559_params = self.eip_1559_params.ok_or(EIP1559ParamError::NoEIP1559Params)?; - - let mut extra_data = [0u8; 9]; - // If eip 1559 params aren't set, use the canyon base fee param constants - // otherwise use them - if eip_1559_params.is_zero() { - // Try casting max_change_denominator to u32 - let max_change_denominator: u32 = (default_base_fee_params.max_change_denominator) - .try_into() - .map_err(|_| EIP1559ParamError::DenominatorOverflow)?; - - // Try casting elasticity_multiplier to u32 - let elasticity_multiplier: u32 = (default_base_fee_params.elasticity_multiplier) - .try_into() - .map_err(|_| EIP1559ParamError::ElasticityOverflow)?; - - // Copy the values safely - extra_data[1..5].copy_from_slice(&max_change_denominator.to_be_bytes()); - extra_data[5..9].copy_from_slice(&elasticity_multiplier.to_be_bytes()); - } else { - let (elasticity, denominator) = decode_eip_1559_params(eip_1559_params); - extra_data[1..5].copy_from_slice(&denominator.to_be_bytes()); - extra_data[5..9].copy_from_slice(&elasticity.to_be_bytes()); - } - Ok(Bytes::copy_from_slice(&extra_data)) + self.eip_1559_params + .map(|params| decode_holocene_extra_data(params, default_base_fee_params)) + .ok_or(EIP1559ParamError::NoEIP1559Params)? } } diff --git a/crates/optimism/rpc/src/eth/receipt.rs b/crates/optimism/rpc/src/eth/receipt.rs index f8e6b7fc2..3563d4ae4 100644 --- a/crates/optimism/rpc/src/eth/receipt.rs +++ b/crates/optimism/rpc/src/eth/receipt.rs @@ -5,7 +5,7 @@ use alloy_rpc_types::{Log, TransactionReceipt}; use op_alloy_consensus::{ DepositTransaction, OpDepositReceipt, OpDepositReceiptWithBloom, OpReceiptEnvelope, }; -use op_alloy_rpc_types::{receipt::L1BlockInfo, OpTransactionReceipt, OpTransactionReceiptFields}; +use op_alloy_rpc_types::{L1BlockInfo, OpTransactionReceipt, OpTransactionReceiptFields}; use reth_node_api::{FullNodeComponents, NodeTypes}; use reth_optimism_chainspec::OpChainSpec; use reth_optimism_evm::RethL1BlockInfo;