From 6dba570d342111758df7936c4c08b4631d085f7f Mon Sep 17 00:00:00 2001 From: Emilia Hane Date: Sat, 11 Jan 2025 13:53:16 +0100 Subject: [PATCH 01/19] Migrate DepositTransaction trait from op-alloy --- crates/common/Cargo.toml | 1 + crates/common/src/deposit/mod.rs | 36 +++++++++++++++++++ .../{deposit_source.rs => deposit/source.rs} | 0 crates/common/src/lib.rs | 11 +++--- crates/common/src/transaction.rs | 17 +++++++++ 5 files changed, 61 insertions(+), 4 deletions(-) create mode 100644 crates/common/src/deposit/mod.rs rename crates/common/src/{deposit_source.rs => deposit/source.rs} (100%) create mode 100644 crates/common/src/transaction.rs diff --git a/crates/common/Cargo.toml b/crates/common/Cargo.toml index c8346b6f..4ab19134 100644 --- a/crates/common/Cargo.toml +++ b/crates/common/Cargo.toml @@ -17,6 +17,7 @@ workspace = true [dependencies] # Alloy alloy-primitives.workspace = true +alloy-consensus.workspace = true # serde serde = { workspace = true, optional = true } diff --git a/crates/common/src/deposit/mod.rs b/crates/common/src/deposit/mod.rs new file mode 100644 index 00000000..64fd1fb5 --- /dev/null +++ b/crates/common/src/deposit/mod.rs @@ -0,0 +1,36 @@ +//! Tramsaction types for Optimism. + +mod source; +pub use source::{ + DepositSourceDomain, DepositSourceDomainIdentifier, L1InfoDepositSource, UpgradeDepositSource, + UserDepositSource, +}; + +use alloy_primitives::B256; + +/// A trait representing a deposit transaction with specific attributes. +pub trait DepositTransaction { + /// Returns the hash that uniquely identifies the source of the deposit. + /// + /// # Returns + /// An `Option` containing the source hash if available. + fn source_hash(&self) -> Option; + + /// Returns the optional mint value of the deposit transaction. + /// + /// # Returns + /// An `Option` representing the ETH value to mint on L2, if any. + fn mint(&self) -> Option; + + /// Indicates whether the transaction is exempt from the L2 gas limit. + /// + /// # Returns + /// A `bool` indicating if the transaction is a system transaction. + fn is_system_transaction(&self) -> bool; + + /// Checks if the transaction is a deposit transaction. + /// + /// # Returns + /// A `bool` that is always `true` for deposit transactions. + fn is_deposit(&self) -> bool; +} diff --git a/crates/common/src/deposit_source.rs b/crates/common/src/deposit/source.rs similarity index 100% rename from crates/common/src/deposit_source.rs rename to crates/common/src/deposit/source.rs diff --git a/crates/common/src/lib.rs b/crates/common/src/lib.rs index 0c638cb0..5b9c3064 100644 --- a/crates/common/src/lib.rs +++ b/crates/common/src/lib.rs @@ -9,13 +9,16 @@ extern crate alloc; -mod deposit_source; -pub use deposit_source::{ - DepositSourceDomain, DepositSourceDomainIdentifier, L1InfoDepositSource, UpgradeDepositSource, - UserDepositSource, +mod deposit; +pub use deposit::{ + DepositSourceDomain, DepositSourceDomainIdentifier, DepositTransaction, L1InfoDepositSource, + UpgradeDepositSource, UserDepositSource, }; mod superchain; pub use superchain::{ ProtocolVersion, ProtocolVersionError, ProtocolVersionFormatV0, SuperchainSignal, }; + +mod transaction; +pub use transaction::OpTransaction; diff --git a/crates/common/src/transaction.rs b/crates/common/src/transaction.rs new file mode 100644 index 00000000..baac4a42 --- /dev/null +++ b/crates/common/src/transaction.rs @@ -0,0 +1,17 @@ +//! Extends l1 [`Transaction`] behavior. + +use alloy_consensus::{Sealed, Transaction}; + +use crate::DepositTransaction; + +/// Extends [`Transaction`] for Optimistic operations. +pub trait OpTransaction: Transaction { + /// Returns `true` if the transaction is a deposit transaction. + fn is_deposit(&self) -> bool; + + /// Returns `true` if the transaction is a system transaction. + fn is_system_transaction(&self) -> bool; + + /// Returns the [`TxDeposit`] variant if the transaction is a deposit transaction. + fn as_deposit(&self) -> Option<&Sealed>; +} From 2f86666f5c03f3818bcafda727382f9815a4b8d9 Mon Sep 17 00:00:00 2001 From: Emilia Hane Date: Sat, 11 Jan 2025 14:42:36 +0100 Subject: [PATCH 02/19] Fix docs --- crates/common/src/transaction.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/common/src/transaction.rs b/crates/common/src/transaction.rs index baac4a42..1b095731 100644 --- a/crates/common/src/transaction.rs +++ b/crates/common/src/transaction.rs @@ -12,6 +12,6 @@ pub trait OpTransaction: Transaction { /// Returns `true` if the transaction is a system transaction. fn is_system_transaction(&self) -> bool; - /// Returns the [`TxDeposit`] variant if the transaction is a deposit transaction. + /// Returns [`DepositTransaction`] if transaction is a deposit transaction. fn as_deposit(&self) -> Option<&Sealed>; } From ebffa38bfe0500b3c98fadf770832bdba56e5332 Mon Sep 17 00:00:00 2001 From: Emilia Hane Date: Sat, 11 Jan 2025 15:11:34 +0100 Subject: [PATCH 03/19] Add AT OpTransaction::DepositTx --- crates/common/src/transaction.rs | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/crates/common/src/transaction.rs b/crates/common/src/transaction.rs index 1b095731..4bae4011 100644 --- a/crates/common/src/transaction.rs +++ b/crates/common/src/transaction.rs @@ -6,6 +6,9 @@ use crate::DepositTransaction; /// Extends [`Transaction`] for Optimistic operations. pub trait OpTransaction: Transaction { + /// Deposit transaction. + type DepositTx: DepositTransaction; + /// Returns `true` if the transaction is a deposit transaction. fn is_deposit(&self) -> bool; @@ -13,5 +16,5 @@ pub trait OpTransaction: Transaction { fn is_system_transaction(&self) -> bool; /// Returns [`DepositTransaction`] if transaction is a deposit transaction. - fn as_deposit(&self) -> Option<&Sealed>; + fn as_deposit(&self) -> Option<&Sealed>; } From 8a5e24978e62dfb875d8d45a62cf4d2f5eab9976 Mon Sep 17 00:00:00 2001 From: Emilia Hane Date: Sun, 12 Jan 2025 16:10:15 +0100 Subject: [PATCH 04/19] Remove redundant trait method DepositTransaction::is_deposit --- crates/common/src/deposit/mod.rs | 6 ------ 1 file changed, 6 deletions(-) diff --git a/crates/common/src/deposit/mod.rs b/crates/common/src/deposit/mod.rs index 64fd1fb5..5af57100 100644 --- a/crates/common/src/deposit/mod.rs +++ b/crates/common/src/deposit/mod.rs @@ -27,10 +27,4 @@ pub trait DepositTransaction { /// # Returns /// A `bool` indicating if the transaction is a system transaction. fn is_system_transaction(&self) -> bool; - - /// Checks if the transaction is a deposit transaction. - /// - /// # Returns - /// A `bool` that is always `true` for deposit transactions. - fn is_deposit(&self) -> bool; } From f993cd57f4d759c6c73ac477b3d7673588ff2294 Mon Sep 17 00:00:00 2001 From: Emilia Hane Date: Sun, 12 Jan 2025 16:11:41 +0100 Subject: [PATCH 05/19] Remove super trait Transaction from OpTransaction --- crates/common/src/transaction.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/common/src/transaction.rs b/crates/common/src/transaction.rs index 4bae4011..4c05bee5 100644 --- a/crates/common/src/transaction.rs +++ b/crates/common/src/transaction.rs @@ -1,11 +1,11 @@ //! Extends l1 [`Transaction`] behavior. -use alloy_consensus::{Sealed, Transaction}; +use alloy_consensus::Sealed; use crate::DepositTransaction; /// Extends [`Transaction`] for Optimistic operations. -pub trait OpTransaction: Transaction { +pub trait OpTransaction { /// Deposit transaction. type DepositTx: DepositTransaction; From 7dbc26b36c0befdd250cc72a9b2da6bc58058aa8 Mon Sep 17 00:00:00 2001 From: Emilia Hane Date: Sun, 12 Jan 2025 16:12:48 +0100 Subject: [PATCH 06/19] Remove redundant trait method OpTransaction::is_system_transaction --- crates/common/src/transaction.rs | 3 --- 1 file changed, 3 deletions(-) diff --git a/crates/common/src/transaction.rs b/crates/common/src/transaction.rs index 4c05bee5..cd6a3e0a 100644 --- a/crates/common/src/transaction.rs +++ b/crates/common/src/transaction.rs @@ -12,9 +12,6 @@ pub trait OpTransaction { /// Returns `true` if the transaction is a deposit transaction. fn is_deposit(&self) -> bool; - /// Returns `true` if the transaction is a system transaction. - fn is_system_transaction(&self) -> bool; - /// Returns [`DepositTransaction`] if transaction is a deposit transaction. fn as_deposit(&self) -> Option<&Sealed>; } From 8b2587407981e3822db8f6449b3b673b39d1bd7a Mon Sep 17 00:00:00 2001 From: Emilia Hane Date: Sun, 12 Jan 2025 16:16:42 +0100 Subject: [PATCH 07/19] Rename OpTransaction->DepositTxEnvelope --- crates/common/src/{transaction.rs => deposit/envelope.rs} | 4 ++-- crates/common/src/deposit/mod.rs | 3 +++ crates/common/src/lib.rs | 7 ++----- 3 files changed, 7 insertions(+), 7 deletions(-) rename crates/common/src/{transaction.rs => deposit/envelope.rs} (80%) diff --git a/crates/common/src/transaction.rs b/crates/common/src/deposit/envelope.rs similarity index 80% rename from crates/common/src/transaction.rs rename to crates/common/src/deposit/envelope.rs index cd6a3e0a..0f2e76c3 100644 --- a/crates/common/src/transaction.rs +++ b/crates/common/src/deposit/envelope.rs @@ -4,8 +4,8 @@ use alloy_consensus::Sealed; use crate::DepositTransaction; -/// Extends [`Transaction`] for Optimistic operations. -pub trait OpTransaction { +/// Extends transaction envelope to encompass [`DepositTransaction`]. +pub trait DepositTxEnvelope { /// Deposit transaction. type DepositTx: DepositTransaction; diff --git a/crates/common/src/deposit/mod.rs b/crates/common/src/deposit/mod.rs index 5af57100..67085639 100644 --- a/crates/common/src/deposit/mod.rs +++ b/crates/common/src/deposit/mod.rs @@ -1,5 +1,8 @@ //! Tramsaction types for Optimism. +mod envelope; +pub use envelope::DepositTxEnvelope; + mod source; pub use source::{ DepositSourceDomain, DepositSourceDomainIdentifier, L1InfoDepositSource, UpgradeDepositSource, diff --git a/crates/common/src/lib.rs b/crates/common/src/lib.rs index 5b9c3064..3d787b46 100644 --- a/crates/common/src/lib.rs +++ b/crates/common/src/lib.rs @@ -11,14 +11,11 @@ extern crate alloc; mod deposit; pub use deposit::{ - DepositSourceDomain, DepositSourceDomainIdentifier, DepositTransaction, L1InfoDepositSource, - UpgradeDepositSource, UserDepositSource, + DepositSourceDomain, DepositSourceDomainIdentifier, DepositTransaction, DepositTxEnvelope, + L1InfoDepositSource, UpgradeDepositSource, UserDepositSource, }; mod superchain; pub use superchain::{ ProtocolVersion, ProtocolVersionError, ProtocolVersionFormatV0, SuperchainSignal, }; - -mod transaction; -pub use transaction::OpTransaction; From 0ff60153cd69cddb91568717b9eb7d5db6c91e6b Mon Sep 17 00:00:00 2001 From: Emilia Hane Date: Sat, 11 Jan 2025 13:53:16 +0100 Subject: [PATCH 08/19] Migrate DepositTransaction trait from op-alloy --- crates/common/src/deposit/mod.rs | 3 +++ crates/common/src/lib.rs | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/crates/common/src/deposit/mod.rs b/crates/common/src/deposit/mod.rs index 67085639..190662b2 100644 --- a/crates/common/src/deposit/mod.rs +++ b/crates/common/src/deposit/mod.rs @@ -11,6 +11,9 @@ pub use source::{ use alloy_primitives::B256; +/// Identifier for an Optimism deposit transaction +pub const DEPOSIT_TX_TYPE_ID: u8 = 126; // 0x7E + /// A trait representing a deposit transaction with specific attributes. pub trait DepositTransaction { /// Returns the hash that uniquely identifies the source of the deposit. diff --git a/crates/common/src/lib.rs b/crates/common/src/lib.rs index 3d787b46..f66f76c0 100644 --- a/crates/common/src/lib.rs +++ b/crates/common/src/lib.rs @@ -12,7 +12,7 @@ extern crate alloc; mod deposit; pub use deposit::{ DepositSourceDomain, DepositSourceDomainIdentifier, DepositTransaction, DepositTxEnvelope, - L1InfoDepositSource, UpgradeDepositSource, UserDepositSource, + L1InfoDepositSource, UpgradeDepositSource, UserDepositSource, DEPOSIT_TX_TYPE_ID, }; mod superchain; From 8f5b0126de5ccea00926270ea64b96bec730ba3e Mon Sep 17 00:00:00 2001 From: Emilia Hane Date: Sat, 11 Jan 2025 14:16:03 +0100 Subject: [PATCH 09/19] Replace OpBlock in maili-protocol --- crates/common/src/deposit/mod.rs | 3 +- crates/protocol/Cargo.toml | 3 ++ crates/protocol/src/batch/inclusion.rs | 9 +++- crates/protocol/src/batch/span.rs | 70 ++++++++++++++++---------- crates/protocol/src/batch/traits.rs | 12 +++-- crates/protocol/src/block.rs | 34 +++++++------ crates/protocol/src/errors.rs | 4 +- crates/protocol/src/test_utils.rs | 29 ++++++++--- crates/protocol/src/utils.rs | 23 +++++---- 9 files changed, 117 insertions(+), 70 deletions(-) diff --git a/crates/common/src/deposit/mod.rs b/crates/common/src/deposit/mod.rs index 190662b2..6059ebfe 100644 --- a/crates/common/src/deposit/mod.rs +++ b/crates/common/src/deposit/mod.rs @@ -4,6 +4,7 @@ mod envelope; pub use envelope::DepositTxEnvelope; mod source; +use alloy_consensus::Transaction; pub use source::{ DepositSourceDomain, DepositSourceDomainIdentifier, L1InfoDepositSource, UpgradeDepositSource, UserDepositSource, @@ -15,7 +16,7 @@ use alloy_primitives::B256; pub const DEPOSIT_TX_TYPE_ID: u8 = 126; // 0x7E /// A trait representing a deposit transaction with specific attributes. -pub trait DepositTransaction { +pub trait DepositTransaction: Transaction { /// Returns the hash that uniquely identifies the source of the deposit. /// /// # Returns diff --git a/crates/protocol/Cargo.toml b/crates/protocol/Cargo.toml index f1fef387..9d93eac2 100644 --- a/crates/protocol/Cargo.toml +++ b/crates/protocol/Cargo.toml @@ -15,6 +15,9 @@ exclude.workspace = true workspace = true [dependencies] +# Workspace +maili-common.workspace = true + # OP-Alloy op-alloy-genesis.workspace = true op-alloy-consensus.workspace = true diff --git a/crates/protocol/src/batch/inclusion.rs b/crates/protocol/src/batch/inclusion.rs index 1a630f91..752bc3d0 100644 --- a/crates/protocol/src/batch/inclusion.rs +++ b/crates/protocol/src/batch/inclusion.rs @@ -1,6 +1,8 @@ //! Module containing the [BatchWithInclusionBlock] struct. use crate::{Batch, BatchValidationProvider, BatchValidity, BlockInfo, L2BlockInfo}; +use alloy_eips::eip2718::Encodable2718; +use maili_common::OpTransaction; use op_alloy_genesis::RollupConfig; /// A batch with its inclusion block. @@ -23,13 +25,16 @@ impl BatchWithInclusionBlock { /// One or more consecutive l1_blocks should be provided. /// In case of only a single L1 block, the decision whether a batch is valid may have to stay /// undecided. - pub async fn check_batch( + pub async fn check_batch( &self, cfg: &RollupConfig, l1_blocks: &[BlockInfo], l2_safe_head: L2BlockInfo, fetcher: &mut BF, - ) -> BatchValidity { + ) -> BatchValidity + where + BF: BatchValidationProvider, + { match &self.batch { Batch::Single(single_batch) => { single_batch.check_batch(cfg, l1_blocks, l2_safe_head, &self.inclusion_block) diff --git a/crates/protocol/src/batch/span.rs b/crates/protocol/src/batch/span.rs index 1ec7ebcf..fab55756 100644 --- a/crates/protocol/src/batch/span.rs +++ b/crates/protocol/src/batch/span.rs @@ -3,6 +3,7 @@ use alloc::vec::Vec; use alloy_eips::eip2718::Encodable2718; use alloy_primitives::FixedBytes; +use maili_common::OpTransaction; use op_alloy_consensus::OpTxType; use op_alloy_genesis::RollupConfig; use tracing::{info, warn}; @@ -176,14 +177,17 @@ impl SpanBatch { } /// Checks if the span batch is valid. - pub async fn check_batch( + pub async fn check_batch( &self, cfg: &RollupConfig, l1_blocks: &[BlockInfo], l2_safe_head: L2BlockInfo, inclusion_block: &BlockInfo, fetcher: &mut BV, - ) -> BatchValidity { + ) -> BatchValidity + where + BV: BatchValidationProvider, + { let (prefix_validity, parent_block) = self.check_batch_prefix(cfg, l1_blocks, l2_safe_head, inclusion_block, fetcher).await; if !matches!(prefix_validity, BatchValidity::Accept) { @@ -496,7 +500,7 @@ mod tests { use alloy_consensus::Header; use alloy_eips::BlockNumHash; use alloy_primitives::{b256, Bytes}; - use op_alloy_consensus::{OpBlock, OpTxType}; + use op_alloy_consensus::{OpBlock, OpTxEnvelope, OpTxType}; use op_alloy_genesis::ChainGenesis; use tracing::Level; use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt}; @@ -569,7 +573,7 @@ mod tests { let l1_blocks = vec![]; let l2_safe_head = L2BlockInfo::default(); let inclusion_block = BlockInfo::default(); - let mut fetcher = TestBatchValidator::default(); + let mut fetcher: TestBatchValidator = TestBatchValidator::default(); let batch = SpanBatch::default(); assert_eq!( batch.check_batch(&cfg, &l1_blocks, l2_safe_head, &inclusion_block, &mut fetcher).await, @@ -590,7 +594,7 @@ mod tests { let l1_blocks = vec![BlockInfo::default()]; let l2_safe_head = L2BlockInfo::default(); let inclusion_block = BlockInfo::default(); - let mut fetcher = TestBatchValidator::default(); + let mut fetcher: TestBatchValidator = TestBatchValidator::default(); let batch = SpanBatch::default(); assert_eq!( batch.check_batch(&cfg, &l1_blocks, l2_safe_head, &inclusion_block, &mut fetcher).await, @@ -612,7 +616,7 @@ mod tests { let l1_blocks = vec![block]; let l2_safe_head = L2BlockInfo::default(); let inclusion_block = BlockInfo::default(); - let mut fetcher = TestBatchValidator::default(); + let mut fetcher: TestBatchValidator = TestBatchValidator::default(); let first = SpanBatchElement { epoch_num: 10, ..Default::default() }; let batch = SpanBatch { batches: vec![first], ..Default::default() }; assert_eq!( @@ -639,7 +643,7 @@ mod tests { let l1_blocks = vec![block]; let l2_safe_head = L2BlockInfo::default(); let inclusion_block = BlockInfo::default(); - let mut fetcher = TestBatchValidator::default(); + let mut fetcher: TestBatchValidator = TestBatchValidator::default(); let first = SpanBatchElement { epoch_num: 10, timestamp: 10, ..Default::default() }; let batch = SpanBatch { batches: vec![first], ..Default::default() }; assert_eq!( @@ -670,7 +674,7 @@ mod tests { ..Default::default() }; let inclusion_block = BlockInfo::default(); - let mut fetcher = TestBatchValidator::default(); + let mut fetcher: TestBatchValidator = TestBatchValidator::default(); let first = SpanBatchElement { epoch_num: 10, timestamp: 21, ..Default::default() }; let batch = SpanBatch { batches: vec![first], ..Default::default() }; assert_eq!( @@ -698,7 +702,7 @@ mod tests { ..Default::default() }; let inclusion_block = BlockInfo::default(); - let mut fetcher = TestBatchValidator::default(); + let mut fetcher: TestBatchValidator = TestBatchValidator::default(); let first = SpanBatchElement { epoch_num: 10, timestamp: 10, ..Default::default() }; let batch = SpanBatch { batches: vec![first], ..Default::default() }; assert_eq!( @@ -724,7 +728,7 @@ mod tests { ..Default::default() }; let inclusion_block = BlockInfo::default(); - let mut fetcher = TestBatchValidator::default(); + let mut fetcher: TestBatchValidator = TestBatchValidator::default(); let first = SpanBatchElement { epoch_num: 10, timestamp: 11, ..Default::default() }; let second = SpanBatchElement { epoch_num: 11, timestamp: 21, ..Default::default() }; let batch = SpanBatch { batches: vec![first, second], ..Default::default() }; @@ -751,7 +755,7 @@ mod tests { ..Default::default() }; let inclusion_block = BlockInfo::default(); - let mut fetcher = TestBatchValidator::default(); + let mut fetcher: TestBatchValidator = TestBatchValidator::default(); let first = SpanBatchElement { epoch_num: 10, timestamp: 8, ..Default::default() }; let second = SpanBatchElement { epoch_num: 11, timestamp: 20, ..Default::default() }; let batch = SpanBatch { batches: vec![first, second], ..Default::default() }; @@ -778,7 +782,7 @@ mod tests { ..Default::default() }; let inclusion_block = BlockInfo::default(); - let mut fetcher = TestBatchValidator::default(); + let mut fetcher: TestBatchValidator = TestBatchValidator::default(); let first = SpanBatchElement { epoch_num: 10, timestamp: 10, ..Default::default() }; let second = SpanBatchElement { epoch_num: 11, timestamp: 20, ..Default::default() }; let batch = SpanBatch { batches: vec![first, second], ..Default::default() }; @@ -811,7 +815,8 @@ mod tests { l1_origin: BlockNumHash { number: 9, ..Default::default() }, ..Default::default() }; - let mut fetcher = TestBatchValidator { blocks: vec![l2_block], ..Default::default() }; + let mut fetcher: TestBatchValidator = + TestBatchValidator { blocks: vec![l2_block], ..Default::default() }; fetcher.short_circuit = true; let first = SpanBatchElement { epoch_num: 10, timestamp: 10, ..Default::default() }; let second = SpanBatchElement { epoch_num: 11, timestamp: 20, ..Default::default() }; @@ -856,7 +861,8 @@ mod tests { }, ..Default::default() }; - let mut fetcher = TestBatchValidator { blocks: vec![l2_block], ..Default::default() }; + let mut fetcher: TestBatchValidator = + TestBatchValidator { blocks: vec![l2_block], ..Default::default() }; let first = SpanBatchElement { epoch_num: 10, timestamp: 10, ..Default::default() }; let second = SpanBatchElement { epoch_num: 11, timestamp: 20, ..Default::default() }; let batch = SpanBatch { @@ -905,7 +911,8 @@ mod tests { l1_origin: BlockNumHash { number: 8, ..Default::default() }, ..Default::default() }; - let mut fetcher = TestBatchValidator { blocks: vec![l2_block], ..Default::default() }; + let mut fetcher: TestBatchValidator = + TestBatchValidator { blocks: vec![l2_block], ..Default::default() }; let first = SpanBatchElement { epoch_num: 10, timestamp: 10, ..Default::default() }; let second = SpanBatchElement { epoch_num: 11, timestamp: 20, ..Default::default() }; let batch = SpanBatch { @@ -963,7 +970,8 @@ mod tests { l1_origin: BlockNumHash { number: 9, ..Default::default() }, ..Default::default() }; - let mut fetcher = TestBatchValidator { blocks: vec![l2_block], ..Default::default() }; + let mut fetcher: TestBatchValidator = + TestBatchValidator { blocks: vec![l2_block], ..Default::default() }; let first = SpanBatchElement { epoch_num: 10, timestamp: 10, ..Default::default() }; let second = SpanBatchElement { epoch_num: 11, timestamp: 20, ..Default::default() }; let batch = SpanBatch { @@ -1018,7 +1026,8 @@ mod tests { l1_origin: BlockNumHash { number: 9, ..Default::default() }, ..Default::default() }; - let mut fetcher = TestBatchValidator { blocks: vec![l2_block], ..Default::default() }; + let mut fetcher: TestBatchValidator = + TestBatchValidator { blocks: vec![l2_block], ..Default::default() }; let first = SpanBatchElement { epoch_num: 10, timestamp: 10, ..Default::default() }; let second = SpanBatchElement { epoch_num: 11, timestamp: 20, ..Default::default() }; let batch = SpanBatch { @@ -1070,7 +1079,8 @@ mod tests { l1_origin: BlockNumHash { number: 14, ..Default::default() }, ..Default::default() }; - let mut fetcher = TestBatchValidator { blocks: vec![l2_block], ..Default::default() }; + let mut fetcher: TestBatchValidator = + TestBatchValidator { blocks: vec![l2_block], ..Default::default() }; let first = SpanBatchElement { epoch_num: 10, timestamp: 10, ..Default::default() }; let second = SpanBatchElement { epoch_num: 11, timestamp: 20, ..Default::default() }; let batch = SpanBatch { @@ -1128,7 +1138,8 @@ mod tests { block_info: BlockInfo { number: 40, ..Default::default() }, ..Default::default() }; - let mut fetcher = TestBatchValidator { blocks: vec![l2_block], ..Default::default() }; + let mut fetcher: TestBatchValidator = + TestBatchValidator { blocks: vec![l2_block], ..Default::default() }; let first = SpanBatchElement { epoch_num: 10, timestamp: 20, ..Default::default() }; let second = SpanBatchElement { epoch_num: 10, timestamp: 20, ..Default::default() }; let third = SpanBatchElement { epoch_num: 11, timestamp: 20, ..Default::default() }; @@ -1183,7 +1194,8 @@ mod tests { block_info: BlockInfo { number: 40, ..Default::default() }, ..Default::default() }; - let mut fetcher = TestBatchValidator { blocks: vec![l2_block], ..Default::default() }; + let mut fetcher: TestBatchValidator = + TestBatchValidator { blocks: vec![l2_block], ..Default::default() }; let first = SpanBatchElement { epoch_num: 10, timestamp: 20, transactions: vec![] }; let second = SpanBatchElement { epoch_num: 10, timestamp: 20, transactions: vec![] }; let third = SpanBatchElement { epoch_num: 11, timestamp: 20, transactions: vec![] }; @@ -1241,7 +1253,8 @@ mod tests { block_info: BlockInfo { number: 40, ..Default::default() }, ..Default::default() }; - let mut fetcher = TestBatchValidator { blocks: vec![l2_block], ..Default::default() }; + let mut fetcher: TestBatchValidator = + TestBatchValidator { blocks: vec![l2_block], ..Default::default() }; let first = SpanBatchElement { epoch_num: 10, timestamp: 20, @@ -1309,7 +1322,8 @@ mod tests { block_info: BlockInfo { number: 40, ..Default::default() }, ..Default::default() }; - let mut fetcher = TestBatchValidator { blocks: vec![l2_block], ..Default::default() }; + let mut fetcher: TestBatchValidator = + TestBatchValidator { blocks: vec![l2_block], ..Default::default() }; let first = SpanBatchElement { epoch_num: 10, timestamp: 20, @@ -1373,7 +1387,8 @@ mod tests { block_info: BlockInfo { number: 40, ..Default::default() }, ..Default::default() }; - let mut fetcher = TestBatchValidator { blocks: vec![l2_block], ..Default::default() }; + let mut fetcher: TestBatchValidator = + TestBatchValidator { blocks: vec![l2_block], ..Default::default() }; let filler_bytes = Bytes::copy_from_slice(&[OpTxType::Eip1559 as u8]); let first = SpanBatchElement { epoch_num: 10, @@ -1437,7 +1452,8 @@ mod tests { l1_origin: BlockNumHash { number: 9, ..Default::default() }, ..Default::default() }; - let mut fetcher = TestBatchValidator { blocks: vec![l2_block], ..Default::default() }; + let mut fetcher: TestBatchValidator = + TestBatchValidator { blocks: vec![l2_block], ..Default::default() }; let first = SpanBatchElement { epoch_num: 10, timestamp: 10, ..Default::default() }; let second = SpanBatchElement { epoch_num: 11, timestamp: 20, ..Default::default() }; let batch = SpanBatch { @@ -1497,7 +1513,7 @@ mod tests { withdrawals: None, }, }; - let mut fetcher = TestBatchValidator { + let mut fetcher: TestBatchValidator = TestBatchValidator { blocks: vec![l2_block], op_blocks: vec![block], ..Default::default() @@ -1571,7 +1587,7 @@ mod tests { withdrawals: None, }, }; - let mut fetcher = TestBatchValidator { + let mut fetcher: TestBatchValidator = TestBatchValidator { blocks: vec![l2_block], op_blocks: vec![block], ..Default::default() @@ -1647,7 +1663,7 @@ mod tests { withdrawals: None, }, }; - let mut fetcher = TestBatchValidator { + let mut fetcher: TestBatchValidator = TestBatchValidator { blocks: vec![l2_block], op_blocks: vec![block], ..Default::default() diff --git a/crates/protocol/src/batch/traits.rs b/crates/protocol/src/batch/traits.rs index 6ff03db1..770c16d0 100644 --- a/crates/protocol/src/batch/traits.rs +++ b/crates/protocol/src/batch/traits.rs @@ -1,9 +1,9 @@ //! Traits for working with protocol types. use alloc::{boxed::Box, string::ToString}; +use alloy_consensus::Block; use async_trait::async_trait; use core::fmt::Display; -use op_alloy_consensus::OpBlock; use crate::L2BlockInfo; @@ -13,13 +13,19 @@ pub trait BatchValidationProvider { /// The error type for the [BatchValidationProvider]. type Error: Display + ToString; + /// Signed (except for deposit) transaction. + type Transaction; + /// Returns the [L2BlockInfo] given a block number. /// /// Errors if the block does not exist. async fn l2_block_info_by_number(&mut self, number: u64) -> Result; - /// Returns the [OpBlock] for a given number. + /// Returns the OP [Block] for a given number. /// /// Errors if no block is available for the given block number. - async fn block_by_number(&mut self, number: u64) -> Result; + async fn block_by_number( + &mut self, + number: u64, + ) -> Result, Self::Error>; } diff --git a/crates/protocol/src/block.rs b/crates/protocol/src/block.rs index afb6cf47..714de8cd 100644 --- a/crates/protocol/src/block.rs +++ b/crates/protocol/src/block.rs @@ -1,9 +1,10 @@ //! Block Types for Optimism. use crate::{DecodeError, L1BlockInfoTx}; +use alloy_consensus::{Block, Transaction}; use alloy_eips::{eip2718::Eip2718Error, BlockNumHash}; use alloy_primitives::B256; -use op_alloy_consensus::{OpBlock, OpTxEnvelope, OpTxType}; +use maili_common::{OpTransaction, DEPOSIT_TX_TYPE_ID}; use op_alloy_genesis::ChainGenesis; /// Block Header Info @@ -36,14 +37,14 @@ impl BlockInfo { } } -impl From for BlockInfo { - fn from(block: OpBlock) -> Self { +impl From> for BlockInfo { + fn from(block: Block) -> Self { Self::from(&block) } } -impl From<&OpBlock> for BlockInfo { - fn from(block: &OpBlock) -> Self { +impl From<&Block> for BlockInfo { + fn from(block: &Block) -> Self { Self { hash: block.header.hash_slow(), number: block.header.number, @@ -88,7 +89,7 @@ impl arbitrary::Arbitrary<'_> for L2BlockInfo { } } -/// An error that can occur when converting an [OpBlock] to an [L2BlockInfo]. +/// An error that can occur when converting an OP [Block] to [L2BlockInfo]. #[derive(Debug, thiserror::Error)] pub enum FromBlockError { /// The genesis block hash does not match the expected value. @@ -123,11 +124,14 @@ impl L2BlockInfo { Self { block_info, l1_origin, seq_num } } - /// Constructs an [L2BlockInfo] from a given [OpBlock] and [ChainGenesis]. - pub fn from_block_and_genesis( - block: &OpBlock, + /// Constructs an [L2BlockInfo] from a given OP [Block] and [ChainGenesis]. + pub fn from_block_and_genesis( + block: &Block, genesis: &ChainGenesis, - ) -> Result { + ) -> Result + where + T: OpTransaction, + { let block_info = BlockInfo::from(block); let (l1_origin, sequence_number) = if block_info.number == genesis.l2.number { @@ -141,15 +145,15 @@ impl L2BlockInfo { } let tx = &block.body.transactions[0]; - if tx.tx_type() != OpTxType::Deposit { - return Err(FromBlockError::UnexpectedTxType(tx.tx_type().into())); + if tx.ty() != DEPOSIT_TX_TYPE_ID { + return Err(FromBlockError::UnexpectedTxType(tx.ty())); } - let OpTxEnvelope::Deposit(tx) = tx else { - return Err(FromBlockError::FirstTxNonDeposit(tx.tx_type().into())); + let Some(tx) = tx.as_deposit() else { + return Err(FromBlockError::FirstTxNonDeposit(tx.ty())); }; - let l1_info = L1BlockInfoTx::decode_calldata(tx.input.as_ref()) + let l1_info = L1BlockInfoTx::decode_calldata(tx.input().as_ref()) .map_err(FromBlockError::BlockInfoDecodeError)?; (l1_info.id(), l1_info.sequence_number()) }; diff --git a/crates/protocol/src/errors.rs b/crates/protocol/src/errors.rs index ee5eead9..466e51db 100644 --- a/crates/protocol/src/errors.rs +++ b/crates/protocol/src/errors.rs @@ -3,9 +3,7 @@ use crate::DecodeError; use alloy_primitives::B256; -/// An error encountered during [OpBlock] conversion. -/// -/// [OpBlock]: op_alloy_consensus::OpBlock +/// An error encountered during OP [Block](alloy_consensus::Block) conversion. #[derive(Debug, thiserror::Error)] pub enum OpBlockConversionError { /// Invalid genesis hash. diff --git a/crates/protocol/src/test_utils.rs b/crates/protocol/src/test_utils.rs index 459b06c3..a4843f81 100644 --- a/crates/protocol/src/test_utils.rs +++ b/crates/protocol/src/test_utils.rs @@ -1,8 +1,8 @@ //! Test utilities for the protocol crate. use alloc::{boxed::Box, format, string::String, sync::Arc, vec::Vec}; +use alloy_consensus::Block; use async_trait::async_trait; -use op_alloy_consensus::OpBlock; use spin::Mutex; use tracing::{Event, Level, Subscriber}; use tracing_subscriber::{layer::Context, Layer}; @@ -21,26 +21,30 @@ pub enum TestBatchValidatorError { } /// An [TestBatchValidator] implementation for testing. -#[derive(Debug, Default, Clone)] -pub struct TestBatchValidator { +#[derive(Debug, Clone)] +pub struct TestBatchValidator { /// Blocks pub blocks: Vec, /// Short circuit the block return to be the first block. pub short_circuit: bool, /// Blocks - pub op_blocks: Vec, + pub op_blocks: Vec>, } -impl TestBatchValidator { +impl TestBatchValidator { /// Creates a new []TestBatchValidator with the given origin and batches. - pub const fn new(blocks: Vec, op_blocks: Vec) -> Self { + pub const fn new(blocks: Vec, op_blocks: Vec>) -> Self { Self { blocks, short_circuit: false, op_blocks } } } #[async_trait] -impl BatchValidationProvider for TestBatchValidator { +impl BatchValidationProvider for TestBatchValidator +where + T: Send + Clone, +{ type Error = TestBatchValidatorError; + type Transaction = T; async fn l2_block_info_by_number(&mut self, number: u64) -> Result { if self.short_circuit { @@ -57,7 +61,10 @@ impl BatchValidationProvider for TestBatchValidator { .ok_or_else(|| TestBatchValidatorError::BlockNotFound) } - async fn block_by_number(&mut self, number: u64) -> Result { + async fn block_by_number( + &mut self, + number: u64, + ) -> Result, Self::Error> { self.op_blocks .iter() .find(|p| p.header.number == number) @@ -66,6 +73,12 @@ impl BatchValidationProvider for TestBatchValidator { } } +impl Default for TestBatchValidator { + fn default() -> Self { + Self { blocks: Vec::new(), short_circuit: false, op_blocks: Vec::new() } + } +} + /// The storage for the collected traces. #[derive(Debug, Default, Clone)] pub struct TraceStorage(pub Arc>>); diff --git a/crates/protocol/src/utils.rs b/crates/protocol/src/utils.rs index a36e7bf0..77857ecd 100644 --- a/crates/protocol/src/utils.rs +++ b/crates/protocol/src/utils.rs @@ -1,10 +1,10 @@ //! Utility methods used by protocol types. use alloc::vec::Vec; -use alloy_consensus::TxType; +use alloy_consensus::{Block, Transaction, TxType}; use alloy_primitives::B256; use alloy_rlp::{Buf, Header}; -use op_alloy_consensus::{OpBlock, OpTxEnvelope}; +use maili_common::OpTransaction; use op_alloy_genesis::{RollupConfig, SystemConfig}; use crate::{ @@ -20,11 +20,14 @@ where value.as_ref().first() == Some(&0x7E) } -/// Converts the [OpBlock] to a partial [SystemConfig]. -pub fn to_system_config( - block: &OpBlock, +/// Converts the OP [Block] to a partial [SystemConfig]. +pub fn to_system_config( + block: &Block, rollup_config: &RollupConfig, -) -> Result { +) -> Result +where + T: OpTransaction, +{ if block.header.number == rollup_config.genesis.l2.number { if block.header.hash_slow() != rollup_config.genesis.l2.hash { return Err(OpBlockConversionError::InvalidGenesisHash( @@ -41,13 +44,11 @@ pub fn to_system_config( if block.body.transactions.is_empty() { return Err(OpBlockConversionError::EmptyTransactions(block.header.hash_slow())); } - let OpTxEnvelope::Deposit(ref tx) = block.body.transactions[0] else { - return Err(OpBlockConversionError::InvalidTxType( - block.body.transactions[0].tx_type() as u8 - )); + let Some(tx) = block.body.transactions[0].as_deposit() else { + return Err(OpBlockConversionError::InvalidTxType(block.body.transactions[0].ty())); }; - let l1_info = L1BlockInfoTx::decode_calldata(tx.input.as_ref())?; + let l1_info = L1BlockInfoTx::decode_calldata(tx.input().as_ref())?; let l1_fee_scalar = match l1_info { L1BlockInfoTx::Bedrock(L1BlockInfoBedrock { l1_fee_scalar, .. }) => l1_fee_scalar, L1BlockInfoTx::Ecotone(L1BlockInfoEcotone { From ef69d84630ae7beafa5eb3a5cf1935767bd43d5b Mon Sep 17 00:00:00 2001 From: Emilia Hane Date: Sat, 11 Jan 2025 17:07:17 +0100 Subject: [PATCH 10/19] Add trait bound to BatchValidationProvider::Transaction --- crates/protocol/src/batch/inclusion.rs | 9 ++------- crates/protocol/src/batch/span.rs | 7 ++----- crates/protocol/src/batch/traits.rs | 4 +++- 3 files changed, 7 insertions(+), 13 deletions(-) diff --git a/crates/protocol/src/batch/inclusion.rs b/crates/protocol/src/batch/inclusion.rs index 752bc3d0..1a630f91 100644 --- a/crates/protocol/src/batch/inclusion.rs +++ b/crates/protocol/src/batch/inclusion.rs @@ -1,8 +1,6 @@ //! Module containing the [BatchWithInclusionBlock] struct. use crate::{Batch, BatchValidationProvider, BatchValidity, BlockInfo, L2BlockInfo}; -use alloy_eips::eip2718::Encodable2718; -use maili_common::OpTransaction; use op_alloy_genesis::RollupConfig; /// A batch with its inclusion block. @@ -25,16 +23,13 @@ impl BatchWithInclusionBlock { /// One or more consecutive l1_blocks should be provided. /// In case of only a single L1 block, the decision whether a batch is valid may have to stay /// undecided. - pub async fn check_batch( + pub async fn check_batch( &self, cfg: &RollupConfig, l1_blocks: &[BlockInfo], l2_safe_head: L2BlockInfo, fetcher: &mut BF, - ) -> BatchValidity - where - BF: BatchValidationProvider, - { + ) -> BatchValidity { match &self.batch { Batch::Single(single_batch) => { single_batch.check_batch(cfg, l1_blocks, l2_safe_head, &self.inclusion_block) diff --git a/crates/protocol/src/batch/span.rs b/crates/protocol/src/batch/span.rs index fab55756..a146ec52 100644 --- a/crates/protocol/src/batch/span.rs +++ b/crates/protocol/src/batch/span.rs @@ -177,17 +177,14 @@ impl SpanBatch { } /// Checks if the span batch is valid. - pub async fn check_batch( + pub async fn check_batch( &self, cfg: &RollupConfig, l1_blocks: &[BlockInfo], l2_safe_head: L2BlockInfo, inclusion_block: &BlockInfo, fetcher: &mut BV, - ) -> BatchValidity - where - BV: BatchValidationProvider, - { + ) -> BatchValidity { let (prefix_validity, parent_block) = self.check_batch_prefix(cfg, l1_blocks, l2_safe_head, inclusion_block, fetcher).await; if !matches!(prefix_validity, BatchValidity::Accept) { diff --git a/crates/protocol/src/batch/traits.rs b/crates/protocol/src/batch/traits.rs index 770c16d0..5961ebaf 100644 --- a/crates/protocol/src/batch/traits.rs +++ b/crates/protocol/src/batch/traits.rs @@ -2,8 +2,10 @@ use alloc::{boxed::Box, string::ToString}; use alloy_consensus::Block; +use alloy_eips::eip2718::Encodable2718; use async_trait::async_trait; use core::fmt::Display; +use maili_common::OpTransaction; use crate::L2BlockInfo; @@ -14,7 +16,7 @@ pub trait BatchValidationProvider { type Error: Display + ToString; /// Signed (except for deposit) transaction. - type Transaction; + type Transaction: OpTransaction + Encodable2718; /// Returns the [L2BlockInfo] given a block number. /// From e4e7e9abae7be57fa35d8ed5db61573e1f961b76 Mon Sep 17 00:00:00 2001 From: Emilia Hane Date: Sun, 12 Jan 2025 16:45:26 +0100 Subject: [PATCH 11/19] fixup! Rename OpTransaction->DepositTxEnvelope --- crates/common/src/deposit/envelope.rs | 4 ++++ crates/protocol/src/batch/span.rs | 2 +- crates/protocol/src/batch/traits.rs | 4 ++-- crates/protocol/src/block.rs | 9 +++------ crates/protocol/src/utils.rs | 6 +++--- 5 files changed, 13 insertions(+), 12 deletions(-) diff --git a/crates/common/src/deposit/envelope.rs b/crates/common/src/deposit/envelope.rs index 0f2e76c3..b7d9db33 100644 --- a/crates/common/src/deposit/envelope.rs +++ b/crates/common/src/deposit/envelope.rs @@ -9,6 +9,10 @@ pub trait DepositTxEnvelope { /// Deposit transaction. type DepositTx: DepositTransaction; + /// Returns envelope ID. Equivalent to [`Transaction::ty`](alloy_consensus::Transaction::ty). + // todo: replace in favour of super trait + fn id(&self) -> u8; + /// Returns `true` if the transaction is a deposit transaction. fn is_deposit(&self) -> bool; diff --git a/crates/protocol/src/batch/span.rs b/crates/protocol/src/batch/span.rs index a146ec52..812d2565 100644 --- a/crates/protocol/src/batch/span.rs +++ b/crates/protocol/src/batch/span.rs @@ -3,7 +3,7 @@ use alloc::vec::Vec; use alloy_eips::eip2718::Encodable2718; use alloy_primitives::FixedBytes; -use maili_common::OpTransaction; +use maili_common::DepositTxEnvelope; use op_alloy_consensus::OpTxType; use op_alloy_genesis::RollupConfig; use tracing::{info, warn}; diff --git a/crates/protocol/src/batch/traits.rs b/crates/protocol/src/batch/traits.rs index 5961ebaf..991b02fd 100644 --- a/crates/protocol/src/batch/traits.rs +++ b/crates/protocol/src/batch/traits.rs @@ -5,7 +5,7 @@ use alloy_consensus::Block; use alloy_eips::eip2718::Encodable2718; use async_trait::async_trait; use core::fmt::Display; -use maili_common::OpTransaction; +use maili_common::DepositTxEnvelope; use crate::L2BlockInfo; @@ -16,7 +16,7 @@ pub trait BatchValidationProvider { type Error: Display + ToString; /// Signed (except for deposit) transaction. - type Transaction: OpTransaction + Encodable2718; + type Transaction: DepositTxEnvelope + Encodable2718; /// Returns the [L2BlockInfo] given a block number. /// diff --git a/crates/protocol/src/block.rs b/crates/protocol/src/block.rs index 714de8cd..6ed48d1e 100644 --- a/crates/protocol/src/block.rs +++ b/crates/protocol/src/block.rs @@ -4,7 +4,7 @@ use crate::{DecodeError, L1BlockInfoTx}; use alloy_consensus::{Block, Transaction}; use alloy_eips::{eip2718::Eip2718Error, BlockNumHash}; use alloy_primitives::B256; -use maili_common::{OpTransaction, DEPOSIT_TX_TYPE_ID}; +use maili_common::DepositTxEnvelope; use op_alloy_genesis::ChainGenesis; /// Block Header Info @@ -130,7 +130,7 @@ impl L2BlockInfo { genesis: &ChainGenesis, ) -> Result where - T: OpTransaction, + T: DepositTxEnvelope, { let block_info = BlockInfo::from(block); @@ -145,12 +145,9 @@ impl L2BlockInfo { } let tx = &block.body.transactions[0]; - if tx.ty() != DEPOSIT_TX_TYPE_ID { - return Err(FromBlockError::UnexpectedTxType(tx.ty())); - } let Some(tx) = tx.as_deposit() else { - return Err(FromBlockError::FirstTxNonDeposit(tx.ty())); + return Err(FromBlockError::FirstTxNonDeposit(tx.id())); }; let l1_info = L1BlockInfoTx::decode_calldata(tx.input().as_ref()) diff --git a/crates/protocol/src/utils.rs b/crates/protocol/src/utils.rs index 77857ecd..ecdc585d 100644 --- a/crates/protocol/src/utils.rs +++ b/crates/protocol/src/utils.rs @@ -4,7 +4,7 @@ use alloc::vec::Vec; use alloy_consensus::{Block, Transaction, TxType}; use alloy_primitives::B256; use alloy_rlp::{Buf, Header}; -use maili_common::OpTransaction; +use maili_common::DepositTxEnvelope; use op_alloy_genesis::{RollupConfig, SystemConfig}; use crate::{ @@ -26,7 +26,7 @@ pub fn to_system_config( rollup_config: &RollupConfig, ) -> Result where - T: OpTransaction, + T: DepositTxEnvelope, { if block.header.number == rollup_config.genesis.l2.number { if block.header.hash_slow() != rollup_config.genesis.l2.hash { @@ -45,7 +45,7 @@ where return Err(OpBlockConversionError::EmptyTransactions(block.header.hash_slow())); } let Some(tx) = block.body.transactions[0].as_deposit() else { - return Err(OpBlockConversionError::InvalidTxType(block.body.transactions[0].ty())); + return Err(OpBlockConversionError::InvalidTxType(block.body.transactions[0].id())); }; let l1_info = L1BlockInfoTx::decode_calldata(tx.input().as_ref())?; From 6c1ed6ae0f84d7b4712be636da7d6915d95ebe87 Mon Sep 17 00:00:00 2001 From: Emilia Hane Date: Sun, 12 Jan 2025 17:26:42 +0100 Subject: [PATCH 12/19] Add super trait Typed2718 to DepositTxEnvelope --- crates/common/src/deposit/envelope.rs | 8 ++------ crates/protocol/src/block.rs | 2 +- crates/protocol/src/utils.rs | 2 +- 3 files changed, 4 insertions(+), 8 deletions(-) diff --git a/crates/common/src/deposit/envelope.rs b/crates/common/src/deposit/envelope.rs index b7d9db33..9791d9a8 100644 --- a/crates/common/src/deposit/envelope.rs +++ b/crates/common/src/deposit/envelope.rs @@ -1,18 +1,14 @@ //! Extends l1 [`Transaction`] behavior. -use alloy_consensus::Sealed; +use alloy_consensus::{Sealed, Typed2718}; use crate::DepositTransaction; /// Extends transaction envelope to encompass [`DepositTransaction`]. -pub trait DepositTxEnvelope { +pub trait DepositTxEnvelope: Typed2718 { /// Deposit transaction. type DepositTx: DepositTransaction; - /// Returns envelope ID. Equivalent to [`Transaction::ty`](alloy_consensus::Transaction::ty). - // todo: replace in favour of super trait - fn id(&self) -> u8; - /// Returns `true` if the transaction is a deposit transaction. fn is_deposit(&self) -> bool; diff --git a/crates/protocol/src/block.rs b/crates/protocol/src/block.rs index 6ed48d1e..fe04eb9d 100644 --- a/crates/protocol/src/block.rs +++ b/crates/protocol/src/block.rs @@ -147,7 +147,7 @@ impl L2BlockInfo { let tx = &block.body.transactions[0]; let Some(tx) = tx.as_deposit() else { - return Err(FromBlockError::FirstTxNonDeposit(tx.id())); + return Err(FromBlockError::FirstTxNonDeposit(tx.ty())); }; let l1_info = L1BlockInfoTx::decode_calldata(tx.input().as_ref()) diff --git a/crates/protocol/src/utils.rs b/crates/protocol/src/utils.rs index ecdc585d..5f2bff3e 100644 --- a/crates/protocol/src/utils.rs +++ b/crates/protocol/src/utils.rs @@ -45,7 +45,7 @@ where return Err(OpBlockConversionError::EmptyTransactions(block.header.hash_slow())); } let Some(tx) = block.body.transactions[0].as_deposit() else { - return Err(OpBlockConversionError::InvalidTxType(block.body.transactions[0].id())); + return Err(OpBlockConversionError::InvalidTxType(block.body.transactions[0].ty())); }; let l1_info = L1BlockInfoTx::decode_calldata(tx.input().as_ref())?; From e5080d1703b5022405e2600ed0e30787ac772a78 Mon Sep 17 00:00:00 2001 From: Emilia Hane Date: Sun, 12 Jan 2025 17:31:25 +0100 Subject: [PATCH 13/19] Update docs --- crates/common/src/deposit/envelope.rs | 2 +- crates/common/src/deposit/mod.rs | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/common/src/deposit/envelope.rs b/crates/common/src/deposit/envelope.rs index 9791d9a8..5783fcba 100644 --- a/crates/common/src/deposit/envelope.rs +++ b/crates/common/src/deposit/envelope.rs @@ -4,7 +4,7 @@ use alloy_consensus::{Sealed, Typed2718}; use crate::DepositTransaction; -/// Extends transaction envelope to encompass [`DepositTransaction`]. +/// Transaction envelope that encompasses a [`DepositTransaction`]. pub trait DepositTxEnvelope: Typed2718 { /// Deposit transaction. type DepositTx: DepositTransaction; diff --git a/crates/common/src/deposit/mod.rs b/crates/common/src/deposit/mod.rs index 6059ebfe..91400855 100644 --- a/crates/common/src/deposit/mod.rs +++ b/crates/common/src/deposit/mod.rs @@ -4,12 +4,12 @@ mod envelope; pub use envelope::DepositTxEnvelope; mod source; -use alloy_consensus::Transaction; pub use source::{ DepositSourceDomain, DepositSourceDomainIdentifier, L1InfoDepositSource, UpgradeDepositSource, UserDepositSource, }; +use alloy_consensus::Transaction; use alloy_primitives::B256; /// Identifier for an Optimism deposit transaction From ed2fb52d1758294c9686e59643def613d45b2a07 Mon Sep 17 00:00:00 2001 From: Emilia Hane Date: Sun, 12 Jan 2025 17:44:49 +0100 Subject: [PATCH 14/19] Port changes from emhane/replace-op-block --- .../common/src/{transaction.rs => deposit/envelope.rs} | 9 +++------ crates/common/src/deposit/mod.rs | 9 ++++++++- crates/common/src/lib.rs | 7 ++----- 3 files changed, 13 insertions(+), 12 deletions(-) rename crates/common/src/{transaction.rs => deposit/envelope.rs} (60%) diff --git a/crates/common/src/transaction.rs b/crates/common/src/deposit/envelope.rs similarity index 60% rename from crates/common/src/transaction.rs rename to crates/common/src/deposit/envelope.rs index 4bae4011..5783fcba 100644 --- a/crates/common/src/transaction.rs +++ b/crates/common/src/deposit/envelope.rs @@ -1,20 +1,17 @@ //! Extends l1 [`Transaction`] behavior. -use alloy_consensus::{Sealed, Transaction}; +use alloy_consensus::{Sealed, Typed2718}; use crate::DepositTransaction; -/// Extends [`Transaction`] for Optimistic operations. -pub trait OpTransaction: Transaction { +/// Transaction envelope that encompasses a [`DepositTransaction`]. +pub trait DepositTxEnvelope: Typed2718 { /// Deposit transaction. type DepositTx: DepositTransaction; /// Returns `true` if the transaction is a deposit transaction. fn is_deposit(&self) -> bool; - /// Returns `true` if the transaction is a system transaction. - fn is_system_transaction(&self) -> bool; - /// Returns [`DepositTransaction`] if transaction is a deposit transaction. fn as_deposit(&self) -> Option<&Sealed>; } diff --git a/crates/common/src/deposit/mod.rs b/crates/common/src/deposit/mod.rs index 5af57100..91400855 100644 --- a/crates/common/src/deposit/mod.rs +++ b/crates/common/src/deposit/mod.rs @@ -1,15 +1,22 @@ //! Tramsaction types for Optimism. +mod envelope; +pub use envelope::DepositTxEnvelope; + mod source; pub use source::{ DepositSourceDomain, DepositSourceDomainIdentifier, L1InfoDepositSource, UpgradeDepositSource, UserDepositSource, }; +use alloy_consensus::Transaction; use alloy_primitives::B256; +/// Identifier for an Optimism deposit transaction +pub const DEPOSIT_TX_TYPE_ID: u8 = 126; // 0x7E + /// A trait representing a deposit transaction with specific attributes. -pub trait DepositTransaction { +pub trait DepositTransaction: Transaction { /// Returns the hash that uniquely identifies the source of the deposit. /// /// # Returns diff --git a/crates/common/src/lib.rs b/crates/common/src/lib.rs index 5b9c3064..f66f76c0 100644 --- a/crates/common/src/lib.rs +++ b/crates/common/src/lib.rs @@ -11,14 +11,11 @@ extern crate alloc; mod deposit; pub use deposit::{ - DepositSourceDomain, DepositSourceDomainIdentifier, DepositTransaction, L1InfoDepositSource, - UpgradeDepositSource, UserDepositSource, + DepositSourceDomain, DepositSourceDomainIdentifier, DepositTransaction, DepositTxEnvelope, + L1InfoDepositSource, UpgradeDepositSource, UserDepositSource, DEPOSIT_TX_TYPE_ID, }; mod superchain; pub use superchain::{ ProtocolVersion, ProtocolVersionError, ProtocolVersionFormatV0, SuperchainSignal, }; - -mod transaction; -pub use transaction::OpTransaction; From 604fe4aeb14ddc5447a1600c8094ced83a23d849 Mon Sep 17 00:00:00 2001 From: Emilia Hane Date: Sun, 12 Jan 2025 17:47:28 +0100 Subject: [PATCH 15/19] Fix docs --- crates/common/src/deposit/envelope.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/crates/common/src/deposit/envelope.rs b/crates/common/src/deposit/envelope.rs index 5783fcba..e71536d2 100644 --- a/crates/common/src/deposit/envelope.rs +++ b/crates/common/src/deposit/envelope.rs @@ -1,4 +1,4 @@ -//! Extends l1 [`Transaction`] behavior. +//! Transaction envelope with support for OP [`DepositTransaction`]. use alloy_consensus::{Sealed, Typed2718}; From ba75037648e9ec1a2167c71e4b2b7a04a730ef5f Mon Sep 17 00:00:00 2001 From: Emilia Hane Date: Mon, 13 Jan 2025 13:22:21 +0100 Subject: [PATCH 16/19] Fix test utils --- crates/protocol/src/test_utils.rs | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/crates/protocol/src/test_utils.rs b/crates/protocol/src/test_utils.rs index a4843f81..ec459d2b 100644 --- a/crates/protocol/src/test_utils.rs +++ b/crates/protocol/src/test_utils.rs @@ -2,7 +2,9 @@ use alloc::{boxed::Box, format, string::String, sync::Arc, vec::Vec}; use alloy_consensus::Block; +use alloy_eips::eip2718::Encodable2718; use async_trait::async_trait; +use maili_common::DepositTxEnvelope; use spin::Mutex; use tracing::{Event, Level, Subscriber}; use tracing_subscriber::{layer::Context, Layer}; @@ -41,7 +43,7 @@ impl TestBatchValidator { #[async_trait] impl BatchValidationProvider for TestBatchValidator where - T: Send + Clone, + T: DepositTxEnvelope + Encodable2718 + Clone, { type Error = TestBatchValidatorError; type Transaction = T; From 812c8f029af6af2efd93a00763c9f429bf15043a Mon Sep 17 00:00:00 2001 From: Emilia Hane Date: Mon, 13 Jan 2025 14:08:07 +0100 Subject: [PATCH 17/19] Shrink scope of DepositTxEnvelope, remove super trait Typed2718 --- crates/common/src/deposit/envelope.rs | 4 ++-- crates/protocol/src/block.rs | 4 ++-- crates/protocol/src/utils.rs | 4 ++-- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/crates/common/src/deposit/envelope.rs b/crates/common/src/deposit/envelope.rs index e71536d2..3a0d56a8 100644 --- a/crates/common/src/deposit/envelope.rs +++ b/crates/common/src/deposit/envelope.rs @@ -1,11 +1,11 @@ //! Transaction envelope with support for OP [`DepositTransaction`]. -use alloy_consensus::{Sealed, Typed2718}; +use alloy_consensus::Sealed; use crate::DepositTransaction; /// Transaction envelope that encompasses a [`DepositTransaction`]. -pub trait DepositTxEnvelope: Typed2718 { +pub trait DepositTxEnvelope { /// Deposit transaction. type DepositTx: DepositTransaction; diff --git a/crates/protocol/src/block.rs b/crates/protocol/src/block.rs index fe04eb9d..57e2e0bc 100644 --- a/crates/protocol/src/block.rs +++ b/crates/protocol/src/block.rs @@ -1,7 +1,7 @@ //! Block Types for Optimism. use crate::{DecodeError, L1BlockInfoTx}; -use alloy_consensus::{Block, Transaction}; +use alloy_consensus::{Block, Transaction, Typed2718}; use alloy_eips::{eip2718::Eip2718Error, BlockNumHash}; use alloy_primitives::B256; use maili_common::DepositTxEnvelope; @@ -130,7 +130,7 @@ impl L2BlockInfo { genesis: &ChainGenesis, ) -> Result where - T: DepositTxEnvelope, + T: DepositTxEnvelope + Typed2718, { let block_info = BlockInfo::from(block); diff --git a/crates/protocol/src/utils.rs b/crates/protocol/src/utils.rs index 5f2bff3e..47283ecf 100644 --- a/crates/protocol/src/utils.rs +++ b/crates/protocol/src/utils.rs @@ -1,7 +1,7 @@ //! Utility methods used by protocol types. use alloc::vec::Vec; -use alloy_consensus::{Block, Transaction, TxType}; +use alloy_consensus::{Block, Transaction, TxType, Typed2718}; use alloy_primitives::B256; use alloy_rlp::{Buf, Header}; use maili_common::DepositTxEnvelope; @@ -26,7 +26,7 @@ pub fn to_system_config( rollup_config: &RollupConfig, ) -> Result where - T: DepositTxEnvelope, + T: DepositTxEnvelope + Typed2718, { if block.header.number == rollup_config.genesis.l2.number { if block.header.hash_slow() != rollup_config.genesis.l2.hash { From a015236825892c0e41d8073cdd8b422a0dc34a54 Mon Sep 17 00:00:00 2001 From: Emilia Hane Date: Mon, 13 Jan 2025 22:49:23 +0100 Subject: [PATCH 18/19] Add trait bound Typed2718 to BatchValidationProvider::Transaction --- crates/protocol/src/batch/traits.rs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/crates/protocol/src/batch/traits.rs b/crates/protocol/src/batch/traits.rs index 991b02fd..95c32760 100644 --- a/crates/protocol/src/batch/traits.rs +++ b/crates/protocol/src/batch/traits.rs @@ -1,7 +1,7 @@ //! Traits for working with protocol types. use alloc::{boxed::Box, string::ToString}; -use alloy_consensus::Block; +use alloy_consensus::{Block, Typed2718}; use alloy_eips::eip2718::Encodable2718; use async_trait::async_trait; use core::fmt::Display; @@ -16,7 +16,7 @@ pub trait BatchValidationProvider { type Error: Display + ToString; /// Signed (except for deposit) transaction. - type Transaction: DepositTxEnvelope + Encodable2718; + type Transaction: DepositTxEnvelope + Encodable2718 + Typed2718; /// Returns the [L2BlockInfo] given a block number. /// From ad6b48da81d5d45d3bcb7692d89c7ae8db0c1e25 Mon Sep 17 00:00:00 2001 From: Emilia Hane Date: Tue, 14 Jan 2025 13:01:25 +0100 Subject: [PATCH 19/19] Replace OpTxEnvelope with TxEnvelope --- crates/protocol/src/batch/transactions.rs | 2 +- crates/protocol/src/batch/tx_data/eip1559.rs | 10 +++---- crates/protocol/src/batch/tx_data/eip2930.rs | 11 +++----- crates/protocol/src/batch/tx_data/legacy.rs | 10 +++---- crates/protocol/src/batch/tx_data/wrapper.rs | 28 +++++++++++++------- crates/protocol/src/block.rs | 6 ++--- crates/protocol/src/info/variant.rs | 8 +++--- crates/protocol/src/utils.rs | 2 +- 8 files changed, 39 insertions(+), 38 deletions(-) diff --git a/crates/protocol/src/batch/transactions.rs b/crates/protocol/src/batch/transactions.rs index f5af7208..6041e82c 100644 --- a/crates/protocol/src/batch/transactions.rs +++ b/crates/protocol/src/batch/transactions.rs @@ -270,7 +270,7 @@ impl SpanBatchTransactions { } else { true }; - let tx_envelope = tx.to_enveloped_tx(*nonce, *gas, to, chain_id, sig, is_protected)?; + let tx_envelope = tx.to_signed_tx(*nonce, *gas, to, chain_id, sig, is_protected)?; let mut buf = Vec::new(); tx_envelope.encode_2718(&mut buf); txs.push(buf); diff --git a/crates/protocol/src/batch/tx_data/eip1559.rs b/crates/protocol/src/batch/tx_data/eip1559.rs index b335c099..be3b6823 100644 --- a/crates/protocol/src/batch/tx_data/eip1559.rs +++ b/crates/protocol/src/batch/tx_data/eip1559.rs @@ -5,7 +5,6 @@ use alloy_consensus::{SignableTransaction, Signed, TxEip1559}; use alloy_eips::eip2930::AccessList; use alloy_primitives::{Address, PrimitiveSignature as Signature, TxKind, U256}; use alloy_rlp::{Bytes, RlpDecodable, RlpEncodable}; -use op_alloy_consensus::OpTxEnvelope; /// The transaction data for an EIP-1559 transaction within a span batch. #[derive(Debug, Clone, PartialEq, Eq, RlpEncodable, RlpDecodable)] @@ -23,15 +22,15 @@ pub struct SpanBatchEip1559TransactionData { } impl SpanBatchEip1559TransactionData { - /// Converts [SpanBatchEip1559TransactionData] into an [OpTxEnvelope]. - pub fn to_enveloped_tx( + /// Converts [SpanBatchEip1559TransactionData] into a signed [`TxEip1559`]. + pub fn to_signed_tx( &self, nonce: u64, gas: u64, to: Option
, chain_id: u64, signature: Signature, - ) -> Result { + ) -> Result, SpanBatchError> { let eip1559_tx = TxEip1559 { chain_id, nonce, @@ -52,8 +51,7 @@ impl SpanBatchEip1559TransactionData { access_list: self.access_list.clone(), }; let signature_hash = eip1559_tx.signature_hash(); - let signed_eip1559_tx = Signed::new_unchecked(eip1559_tx, signature, signature_hash); - Ok(OpTxEnvelope::Eip1559(signed_eip1559_tx)) + Ok(Signed::new_unchecked(eip1559_tx, signature, signature_hash)) } } diff --git a/crates/protocol/src/batch/tx_data/eip2930.rs b/crates/protocol/src/batch/tx_data/eip2930.rs index f825bc7c..47e5116e 100644 --- a/crates/protocol/src/batch/tx_data/eip2930.rs +++ b/crates/protocol/src/batch/tx_data/eip2930.rs @@ -5,7 +5,6 @@ use alloy_consensus::{SignableTransaction, Signed, TxEip2930}; use alloy_eips::eip2930::AccessList; use alloy_primitives::{Address, PrimitiveSignature as Signature, TxKind, U256}; use alloy_rlp::{Bytes, RlpDecodable, RlpEncodable}; -use op_alloy_consensus::OpTxEnvelope; /// The transaction data for an EIP-2930 transaction within a span batch. #[derive(Debug, Clone, PartialEq, Eq, RlpEncodable, RlpDecodable)] @@ -21,15 +20,15 @@ pub struct SpanBatchEip2930TransactionData { } impl SpanBatchEip2930TransactionData { - /// Converts [SpanBatchEip2930TransactionData] into a [OpTxEnvelope]. - pub fn to_enveloped_tx( + /// Converts [SpanBatchEip2930TransactionData] into a signed [`TxEip2930`]. + pub fn to_signed_tx( &self, nonce: u64, gas: u64, to: Option
, chain_id: u64, signature: Signature, - ) -> Result { + ) -> Result, SpanBatchError> { let access_list_tx = TxEip2930 { chain_id, nonce, @@ -45,9 +44,7 @@ impl SpanBatchEip2930TransactionData { access_list: self.access_list.clone(), }; let signature_hash = access_list_tx.signature_hash(); - let signed_access_list_tx = - Signed::new_unchecked(access_list_tx, signature, signature_hash); - Ok(OpTxEnvelope::Eip2930(signed_access_list_tx)) + Ok(Signed::new_unchecked(access_list_tx, signature, signature_hash)) } } diff --git a/crates/protocol/src/batch/tx_data/legacy.rs b/crates/protocol/src/batch/tx_data/legacy.rs index 4ff17dc3..daf28650 100644 --- a/crates/protocol/src/batch/tx_data/legacy.rs +++ b/crates/protocol/src/batch/tx_data/legacy.rs @@ -4,7 +4,6 @@ use crate::{SpanBatchError, SpanDecodingError}; use alloy_consensus::{SignableTransaction, Signed, TxLegacy}; use alloy_primitives::{Address, PrimitiveSignature as Signature, TxKind, U256}; use alloy_rlp::{Bytes, RlpDecodable, RlpEncodable}; -use op_alloy_consensus::OpTxEnvelope; /// The transaction data for a legacy transaction within a span batch. #[derive(Debug, Clone, PartialEq, Eq, RlpEncodable, RlpDecodable)] @@ -18,8 +17,8 @@ pub struct SpanBatchLegacyTransactionData { } impl SpanBatchLegacyTransactionData { - /// Converts [SpanBatchLegacyTransactionData] into a [OpTxEnvelope]. - pub fn to_enveloped_tx( + /// Converts [SpanBatchLegacyTransactionData] into a signed [`TxLegacy`]. + pub fn to_signed_tx( &self, nonce: u64, gas: u64, @@ -27,7 +26,7 @@ impl SpanBatchLegacyTransactionData { chain_id: u64, signature: Signature, is_protected: bool, - ) -> Result { + ) -> Result, SpanBatchError> { let legacy_tx = TxLegacy { chain_id: is_protected.then_some(chain_id), nonce, @@ -42,8 +41,7 @@ impl SpanBatchLegacyTransactionData { input: self.data.clone().into(), }; let signature_hash = legacy_tx.signature_hash(); - let signed_legacy_tx = Signed::new_unchecked(legacy_tx, signature, signature_hash); - Ok(OpTxEnvelope::Legacy(signed_legacy_tx)) + Ok(Signed::new_unchecked(legacy_tx, signature, signature_hash)) } } diff --git a/crates/protocol/src/batch/tx_data/wrapper.rs b/crates/protocol/src/batch/tx_data/wrapper.rs index c96267a0..095ee90c 100644 --- a/crates/protocol/src/batch/tx_data/wrapper.rs +++ b/crates/protocol/src/batch/tx_data/wrapper.rs @@ -3,7 +3,6 @@ use alloy_consensus::{Transaction, TxEnvelope, TxType}; use alloy_primitives::{Address, PrimitiveSignature as Signature, U256}; use alloy_rlp::{Bytes, Decodable, Encodable}; -use op_alloy_consensus::OpTxEnvelope; use crate::{ SpanBatchEip1559TransactionData, SpanBatchEip2930TransactionData, SpanBatchError, @@ -114,8 +113,8 @@ impl SpanBatchTransactionData { } } - /// Converts the [SpanBatchTransactionData] into a [OpTxEnvelope]. - pub fn to_enveloped_tx( + /// Converts the [SpanBatchTransactionData] into a singed transaction as [`TxEnvelope`]. + pub fn to_signed_tx( &self, nonce: u64, gas: u64, @@ -123,13 +122,22 @@ impl SpanBatchTransactionData { chain_id: u64, signature: Signature, is_protected: bool, - ) -> Result { - match self { - Self::Legacy(data) => { - data.to_enveloped_tx(nonce, gas, to, chain_id, signature, is_protected) + ) -> Result { + Ok(match self { + Self::Legacy(data) => TxEnvelope::Legacy(data.to_signed_tx( + nonce, + gas, + to, + chain_id, + signature, + is_protected, + )?), + Self::Eip2930(data) => { + TxEnvelope::Eip2930(data.to_signed_tx(nonce, gas, to, chain_id, signature)?) } - Self::Eip2930(data) => data.to_enveloped_tx(nonce, gas, to, chain_id, signature), - Self::Eip1559(data) => data.to_enveloped_tx(nonce, gas, to, chain_id, signature), - } + Self::Eip1559(data) => { + TxEnvelope::Eip1559(data.to_signed_tx(nonce, gas, to, chain_id, signature)?) + } + }) } } diff --git a/crates/protocol/src/block.rs b/crates/protocol/src/block.rs index c9582da2..e975eb75 100644 --- a/crates/protocol/src/block.rs +++ b/crates/protocol/src/block.rs @@ -5,7 +5,7 @@ use alloy_consensus::{Block, Transaction, Typed2718}; use alloy_eips::{eip2718::Eip2718Error, BlockNumHash}; use alloy_primitives::B256; use maili_genesis::ChainGenesis; -use op_alloy_consensus::{DepositTxEnvelope, OpBlock, OpTxEnvelope, OpTxType}; +use op_alloy_consensus::DepositTxEnvelope; /// Block Header Info #[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))] @@ -101,8 +101,8 @@ pub enum FromBlockError { /// The first payload transaction has an unexpected type. #[error("First payload transaction has unexpected type: {0}")] UnexpectedTxType(u8), - /// Failed to decode the first transaction into an [OpTxEnvelope]. - #[error("Failed to decode the first transaction into an OpTxEnvelope: {0}")] + /// Failed to decode the first transaction into an OP transaction. + #[error("Failed to decode the first transaction into an OP transaction: {0}")] TxEnvelopeDecodeError(Eip2718Error), /// The first payload transaction is not a deposit transaction. #[error("First payload transaction is not a deposit transaction, type: {0}")] diff --git a/crates/protocol/src/info/variant.rs b/crates/protocol/src/info/variant.rs index 494580e3..585ca894 100644 --- a/crates/protocol/src/info/variant.rs +++ b/crates/protocol/src/info/variant.rs @@ -4,9 +4,9 @@ use alloc::{format, string::ToString}; use alloy_consensus::Header; use alloy_eips::{eip7840::BlobParams, BlockNumHash}; -use alloy_primitives::{address, Address, Bytes, Sealable, TxKind, B256, U256}; +use alloy_primitives::{address, Address, Bytes, Sealable, Sealed, TxKind, B256, U256}; use maili_genesis::{RollupConfig, SystemConfig}; -use op_alloy_consensus::{OpTxEnvelope, TxDeposit}; +use op_alloy_consensus::TxDeposit; use crate::{ BlockInfoError, DecodeError, DepositSourceDomain, L1BlockInfoBedrock, L1BlockInfoEcotone, @@ -100,7 +100,7 @@ impl L1BlockInfoTx { sequence_number: u64, l1_header: &Header, l2_block_time: u64, - ) -> Result<(Self, OpTxEnvelope), BlockInfoError> { + ) -> Result<(Self, Sealed), BlockInfoError> { let l1_info = Self::try_new(rollup_config, system_config, sequence_number, l1_header, l2_block_time)?; @@ -127,7 +127,7 @@ impl L1BlockInfoTx { deposit_tx.gas_limit = REGOLITH_SYSTEM_TX_GAS; } - Ok((l1_info, OpTxEnvelope::Deposit(deposit_tx.seal_slow()))) + Ok((l1_info, deposit_tx.seal_slow())) } /// Decodes the [L1BlockInfoEcotone] object from ethereum transaction calldata. diff --git a/crates/protocol/src/utils.rs b/crates/protocol/src/utils.rs index be1ed3fb..8ce334da 100644 --- a/crates/protocol/src/utils.rs +++ b/crates/protocol/src/utils.rs @@ -5,7 +5,7 @@ use alloy_consensus::{Block, Transaction, TxType, Typed2718}; use alloy_primitives::B256; use alloy_rlp::{Buf, Header}; use maili_genesis::{RollupConfig, SystemConfig}; -use op_alloy_consensus::{DepositTxEnvelope, OpBlock, OpTxEnvelope}; +use op_alloy_consensus::DepositTxEnvelope; use crate::{ L1BlockInfoBedrock, L1BlockInfoEcotone, L1BlockInfoTx, OpBlockConversionError, SpanBatchError,