From 726c9bb0ae16c99406dc6420a61169ee78b0e2bb Mon Sep 17 00:00:00 2001 From: clabby Date: Wed, 3 Apr 2024 00:19:53 -0400 Subject: [PATCH] chore(derive): rebase + move `alloy` module --- Cargo.lock | 1 + .../types/{ => alloy}/eips/eip1559/basefee.rs | 0 .../{ => alloy}/eips/eip1559/constants.rs | 0 .../types/{ => alloy}/eips/eip1559/helpers.rs | 2 +- .../src/types/{ => alloy}/eips/eip1559/mod.rs | 0 .../src/types/{ => alloy}/eips/eip2718.rs | 0 .../src/types/{ => alloy}/eips/eip2930.rs | 0 .../src/types/{ => alloy}/eips/eip4788.rs | 0 .../src/types/{ => alloy}/eips/eip4844.rs | 0 .../src/types/{ => alloy}/eips/merge.rs | 0 .../derive/src/types/{ => alloy}/eips/mod.rs | 0 crates/derive/src/types/{ => alloy}/header.rs | 8 +-- crates/derive/src/types/alloy/mod.rs | 19 +++++++ .../src/types/{ => alloy}/network/mod.rs | 2 +- .../src/types/{ => alloy}/network/receipt.rs | 0 .../src/types/{ => alloy}/network/sealed.rs | 0 .../{ => alloy}/network/transaction/common.rs | 0 .../{ => alloy}/network/transaction/mod.rs | 0 .../{ => alloy}/network/transaction/signed.rs | 2 +- .../derive/src/types/{ => alloy}/receipt.rs | 5 +- .../types/{ => alloy}/transaction/deposit.rs | 5 +- .../types/{ => alloy}/transaction/eip1559.rs | 6 +- .../types/{ => alloy}/transaction/eip2930.rs | 6 +- .../types/{ => alloy}/transaction/eip4844.rs | 4 +- .../types/{ => alloy}/transaction/envelope.rs | 5 +- .../types/{ => alloy}/transaction/legacy.rs | 2 +- .../src/types/{ => alloy}/transaction/mod.rs | 0 crates/derive/src/types/batch.rs | 40 -------------- .../src/types/{ => batch}/batch_type.rs | 2 +- crates/derive/src/types/batch/mod.rs | 52 ++++++++++++++++++ .../types/batch/span_batch/tx_data/eip1559.rs | 2 +- .../types/batch/span_batch/tx_data/eip2930.rs | 2 +- .../types/batch/span_batch/tx_data/legacy.rs | 2 +- crates/derive/src/types/block.rs | 27 --------- crates/derive/src/types/mod.rs | 32 +++-------- crates/derive/testdata/payload.hex | Bin 0 -> 13924 bytes 36 files changed, 99 insertions(+), 127 deletions(-) rename crates/derive/src/types/{ => alloy}/eips/eip1559/basefee.rs (100%) rename crates/derive/src/types/{ => alloy}/eips/eip1559/constants.rs (100%) rename crates/derive/src/types/{ => alloy}/eips/eip1559/helpers.rs (98%) rename crates/derive/src/types/{ => alloy}/eips/eip1559/mod.rs (100%) rename crates/derive/src/types/{ => alloy}/eips/eip2718.rs (100%) rename crates/derive/src/types/{ => alloy}/eips/eip2930.rs (100%) rename crates/derive/src/types/{ => alloy}/eips/eip4788.rs (100%) rename crates/derive/src/types/{ => alloy}/eips/eip4844.rs (100%) rename crates/derive/src/types/{ => alloy}/eips/merge.rs (100%) rename crates/derive/src/types/{ => alloy}/eips/mod.rs (100%) rename crates/derive/src/types/{ => alloy}/header.rs (99%) create mode 100644 crates/derive/src/types/alloy/mod.rs rename crates/derive/src/types/{ => alloy}/network/mod.rs (86%) rename crates/derive/src/types/{ => alloy}/network/receipt.rs (100%) rename crates/derive/src/types/{ => alloy}/network/sealed.rs (100%) rename crates/derive/src/types/{ => alloy}/network/transaction/common.rs (100%) rename crates/derive/src/types/{ => alloy}/network/transaction/mod.rs (100%) rename crates/derive/src/types/{ => alloy}/network/transaction/signed.rs (98%) rename crates/derive/src/types/{ => alloy}/receipt.rs (99%) rename crates/derive/src/types/{ => alloy}/transaction/deposit.rs (98%) rename crates/derive/src/types/{ => alloy}/transaction/eip1559.rs (99%) rename crates/derive/src/types/{ => alloy}/transaction/eip2930.rs (98%) rename crates/derive/src/types/{ => alloy}/transaction/eip4844.rs (98%) rename crates/derive/src/types/{ => alloy}/transaction/envelope.rs (97%) rename crates/derive/src/types/{ => alloy}/transaction/legacy.rs (99%) rename crates/derive/src/types/{ => alloy}/transaction/mod.rs (100%) delete mode 100644 crates/derive/src/types/batch.rs rename crates/derive/src/types/{ => batch}/batch_type.rs (97%) create mode 100644 crates/derive/testdata/payload.hex diff --git a/Cargo.lock b/Cargo.lock index 64cfe5b90..22304b806 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -360,6 +360,7 @@ dependencies = [ "async-trait", "hashbrown", "miniz_oxide", + "proptest", "serde", "tokio", "unsigned-varint", diff --git a/crates/derive/src/types/eips/eip1559/basefee.rs b/crates/derive/src/types/alloy/eips/eip1559/basefee.rs similarity index 100% rename from crates/derive/src/types/eips/eip1559/basefee.rs rename to crates/derive/src/types/alloy/eips/eip1559/basefee.rs diff --git a/crates/derive/src/types/eips/eip1559/constants.rs b/crates/derive/src/types/alloy/eips/eip1559/constants.rs similarity index 100% rename from crates/derive/src/types/eips/eip1559/constants.rs rename to crates/derive/src/types/alloy/eips/eip1559/constants.rs diff --git a/crates/derive/src/types/eips/eip1559/helpers.rs b/crates/derive/src/types/alloy/eips/eip1559/helpers.rs similarity index 98% rename from crates/derive/src/types/eips/eip1559/helpers.rs rename to crates/derive/src/types/alloy/eips/eip1559/helpers.rs index ff87d790c..6987c4de7 100644 --- a/crates/derive/src/types/eips/eip1559/helpers.rs +++ b/crates/derive/src/types/alloy/eips/eip1559/helpers.rs @@ -63,7 +63,7 @@ pub fn calc_next_block_base_fee( #[cfg(test)] mod tests { - use crate::types::eips::eip1559::{MIN_PROTOCOL_BASE_FEE, MIN_PROTOCOL_BASE_FEE_U256}; + use crate::types::eip1559::{MIN_PROTOCOL_BASE_FEE, MIN_PROTOCOL_BASE_FEE_U256}; use super::*; diff --git a/crates/derive/src/types/eips/eip1559/mod.rs b/crates/derive/src/types/alloy/eips/eip1559/mod.rs similarity index 100% rename from crates/derive/src/types/eips/eip1559/mod.rs rename to crates/derive/src/types/alloy/eips/eip1559/mod.rs diff --git a/crates/derive/src/types/eips/eip2718.rs b/crates/derive/src/types/alloy/eips/eip2718.rs similarity index 100% rename from crates/derive/src/types/eips/eip2718.rs rename to crates/derive/src/types/alloy/eips/eip2718.rs diff --git a/crates/derive/src/types/eips/eip2930.rs b/crates/derive/src/types/alloy/eips/eip2930.rs similarity index 100% rename from crates/derive/src/types/eips/eip2930.rs rename to crates/derive/src/types/alloy/eips/eip2930.rs diff --git a/crates/derive/src/types/eips/eip4788.rs b/crates/derive/src/types/alloy/eips/eip4788.rs similarity index 100% rename from crates/derive/src/types/eips/eip4788.rs rename to crates/derive/src/types/alloy/eips/eip4788.rs diff --git a/crates/derive/src/types/eips/eip4844.rs b/crates/derive/src/types/alloy/eips/eip4844.rs similarity index 100% rename from crates/derive/src/types/eips/eip4844.rs rename to crates/derive/src/types/alloy/eips/eip4844.rs diff --git a/crates/derive/src/types/eips/merge.rs b/crates/derive/src/types/alloy/eips/merge.rs similarity index 100% rename from crates/derive/src/types/eips/merge.rs rename to crates/derive/src/types/alloy/eips/merge.rs diff --git a/crates/derive/src/types/eips/mod.rs b/crates/derive/src/types/alloy/eips/mod.rs similarity index 100% rename from crates/derive/src/types/eips/mod.rs rename to crates/derive/src/types/alloy/eips/mod.rs diff --git a/crates/derive/src/types/header.rs b/crates/derive/src/types/alloy/header.rs similarity index 99% rename from crates/derive/src/types/header.rs rename to crates/derive/src/types/alloy/header.rs index 42a844377..e78955035 100644 --- a/crates/derive/src/types/header.rs +++ b/crates/derive/src/types/alloy/header.rs @@ -1,9 +1,7 @@ use crate::types::{ - eips::{ - eip1559::{calc_next_block_base_fee, BaseFeeParams}, - eip4844::{calc_blob_gasprice, calc_excess_blob_gas}, - }, - network::Sealable, + eip1559::{calc_next_block_base_fee, BaseFeeParams}, + eip4844::{calc_blob_gasprice, calc_excess_blob_gas}, + Sealable, }; use alloc::vec::Vec; use alloy_primitives::{b256, keccak256, Address, BlockNumber, Bloom, Bytes, B256, B64, U256}; diff --git a/crates/derive/src/types/alloy/mod.rs b/crates/derive/src/types/alloy/mod.rs new file mode 100644 index 000000000..379d49645 --- /dev/null +++ b/crates/derive/src/types/alloy/mod.rs @@ -0,0 +1,19 @@ +//! This module contains `alloy` types that have been ported from various alloy crates to support `no_std`. + +mod transaction; +pub use transaction::{TxDeposit, TxEip1559, TxEip2930, TxEip4844, TxEnvelope, TxLegacy, TxType}; + +mod network; +pub use network::{Receipt as NetworkReceipt, Sealable, Sealed, Signed, Transaction, TxKind}; + +mod header; +pub use header::{Header, EMPTY_OMMER_ROOT_HASH, EMPTY_ROOT_HASH}; + +mod receipt; +pub use receipt::{Receipt, ReceiptWithBloom}; + +mod eips; +pub use eips::{ + calc_blob_gasprice, calc_excess_blob_gas, calc_next_block_base_fee, eip1559, eip2718, eip2930, + eip4788, eip4844, +}; diff --git a/crates/derive/src/types/network/mod.rs b/crates/derive/src/types/alloy/network/mod.rs similarity index 86% rename from crates/derive/src/types/network/mod.rs rename to crates/derive/src/types/alloy/network/mod.rs index b9762275d..da5af84d1 100644 --- a/crates/derive/src/types/network/mod.rs +++ b/crates/derive/src/types/alloy/network/mod.rs @@ -2,7 +2,7 @@ #![allow(unused, unreachable_pub)] -use crate::types::eips::eip2718::Eip2718Envelope; +use crate::types::eip2718::Eip2718Envelope; use alloc::vec::Vec; use alloy_primitives::B256; diff --git a/crates/derive/src/types/network/receipt.rs b/crates/derive/src/types/alloy/network/receipt.rs similarity index 100% rename from crates/derive/src/types/network/receipt.rs rename to crates/derive/src/types/alloy/network/receipt.rs diff --git a/crates/derive/src/types/network/sealed.rs b/crates/derive/src/types/alloy/network/sealed.rs similarity index 100% rename from crates/derive/src/types/network/sealed.rs rename to crates/derive/src/types/alloy/network/sealed.rs diff --git a/crates/derive/src/types/network/transaction/common.rs b/crates/derive/src/types/alloy/network/transaction/common.rs similarity index 100% rename from crates/derive/src/types/network/transaction/common.rs rename to crates/derive/src/types/alloy/network/transaction/common.rs diff --git a/crates/derive/src/types/network/transaction/mod.rs b/crates/derive/src/types/alloy/network/transaction/mod.rs similarity index 100% rename from crates/derive/src/types/network/transaction/mod.rs rename to crates/derive/src/types/alloy/network/transaction/mod.rs diff --git a/crates/derive/src/types/network/transaction/signed.rs b/crates/derive/src/types/alloy/network/transaction/signed.rs similarity index 98% rename from crates/derive/src/types/network/transaction/signed.rs rename to crates/derive/src/types/alloy/network/transaction/signed.rs index 1c272e7f9..761cfc830 100644 --- a/crates/derive/src/types/network/transaction/signed.rs +++ b/crates/derive/src/types/alloy/network/transaction/signed.rs @@ -1,4 +1,4 @@ -use crate::types::network::Transaction; +use crate::types::Transaction; use alloc::{vec, vec::Vec}; use alloy_primitives::{Signature, B256}; use alloy_rlp::BufMut; diff --git a/crates/derive/src/types/receipt.rs b/crates/derive/src/types/alloy/receipt.rs similarity index 99% rename from crates/derive/src/types/receipt.rs rename to crates/derive/src/types/alloy/receipt.rs index 18df6641b..81f48b7dc 100644 --- a/crates/derive/src/types/receipt.rs +++ b/crates/derive/src/types/alloy/receipt.rs @@ -1,11 +1,10 @@ //! This module contains the receipt types used within the derivation pipeline. -use core::cmp::Ordering; - -use crate::types::transaction::TxType; +use crate::types::TxType; use alloc::vec::Vec; use alloy_primitives::{Bloom, Log}; use alloy_rlp::{length_of_length, Buf, BufMut, BytesMut, Decodable, Encodable}; +use core::cmp::Ordering; /// Receipt containing result of transaction execution. #[derive(Clone, Debug, PartialEq, Eq, Default)] diff --git a/crates/derive/src/types/transaction/deposit.rs b/crates/derive/src/types/alloy/transaction/deposit.rs similarity index 98% rename from crates/derive/src/types/transaction/deposit.rs rename to crates/derive/src/types/alloy/transaction/deposit.rs index 0003df168..763c388a0 100644 --- a/crates/derive/src/types/transaction/deposit.rs +++ b/crates/derive/src/types/alloy/transaction/deposit.rs @@ -1,7 +1,4 @@ -use crate::types::{ - network::{Signed, Transaction, TxKind}, - transaction::TxType, -}; +use crate::types::{Signed, Transaction, TxKind, TxType}; use alloc::vec::Vec; use alloy_primitives::{keccak256, Address, Bytes, ChainId, Signature, B256, U256}; use alloy_rlp::{ diff --git a/crates/derive/src/types/transaction/eip1559.rs b/crates/derive/src/types/alloy/transaction/eip1559.rs similarity index 99% rename from crates/derive/src/types/transaction/eip1559.rs rename to crates/derive/src/types/alloy/transaction/eip1559.rs index 9acb8a887..b80dc55ec 100644 --- a/crates/derive/src/types/transaction/eip1559.rs +++ b/crates/derive/src/types/alloy/transaction/eip1559.rs @@ -1,8 +1,4 @@ -use crate::types::{ - eips::eip2930::AccessList, - network::{Signed, Transaction, TxKind}, - transaction::TxType, -}; +use crate::types::{eip2930::AccessList, Signed, Transaction, TxKind, TxType}; use alloc::vec::Vec; use alloy_primitives::{keccak256, Bytes, ChainId, Signature, U256}; use alloy_rlp::{length_of_length, BufMut, Decodable, Encodable, Header}; diff --git a/crates/derive/src/types/transaction/eip2930.rs b/crates/derive/src/types/alloy/transaction/eip2930.rs similarity index 98% rename from crates/derive/src/types/transaction/eip2930.rs rename to crates/derive/src/types/alloy/transaction/eip2930.rs index 0cb861bd8..2c894029a 100644 --- a/crates/derive/src/types/transaction/eip2930.rs +++ b/crates/derive/src/types/alloy/transaction/eip2930.rs @@ -1,8 +1,4 @@ -use crate::types::{ - eips::eip2930::AccessList, - network::{Signed, Transaction, TxKind}, - transaction::TxType, -}; +use crate::types::{eip2930::AccessList, Signed, Transaction, TxKind, TxType}; use alloc::vec::Vec; use alloy_primitives::{keccak256, Bytes, ChainId, Signature, U256}; use alloy_rlp::{length_of_length, BufMut, Decodable, Encodable, Header}; diff --git a/crates/derive/src/types/transaction/eip4844.rs b/crates/derive/src/types/alloy/transaction/eip4844.rs similarity index 98% rename from crates/derive/src/types/transaction/eip4844.rs rename to crates/derive/src/types/alloy/transaction/eip4844.rs index cdb7229dc..06f457513 100644 --- a/crates/derive/src/types/transaction/eip4844.rs +++ b/crates/derive/src/types/alloy/transaction/eip4844.rs @@ -1,7 +1,5 @@ use crate::types::{ - eips::{eip2930::AccessList, eip4844::DATA_GAS_PER_BLOB}, - network::{Signed, Transaction, TxKind}, - transaction::TxType, + eip2930::AccessList, eip4844::DATA_GAS_PER_BLOB, Signed, Transaction, TxKind, TxType, }; use alloc::vec::Vec; use alloy_primitives::{keccak256, Bytes, ChainId, Signature, B256, U256}; diff --git a/crates/derive/src/types/transaction/envelope.rs b/crates/derive/src/types/alloy/transaction/envelope.rs similarity index 97% rename from crates/derive/src/types/transaction/envelope.rs rename to crates/derive/src/types/alloy/transaction/envelope.rs index c74bef8ee..ba18f225a 100644 --- a/crates/derive/src/types/transaction/envelope.rs +++ b/crates/derive/src/types/alloy/transaction/envelope.rs @@ -1,7 +1,6 @@ use crate::types::{ - eips::eip2718::{Decodable2718, Eip2718Error, Encodable2718}, - network::Signed, - transaction::{TxDeposit, TxEip1559, TxEip2930, TxEip4844, TxLegacy}, + eip2718::{Decodable2718, Eip2718Error, Encodable2718}, + Signed, TxDeposit, TxEip1559, TxEip2930, TxEip4844, TxLegacy, }; use alloy_rlp::{length_of_length, Decodable, Encodable}; diff --git a/crates/derive/src/types/transaction/legacy.rs b/crates/derive/src/types/alloy/transaction/legacy.rs similarity index 99% rename from crates/derive/src/types/transaction/legacy.rs rename to crates/derive/src/types/alloy/transaction/legacy.rs index 8cea88bdc..671578900 100644 --- a/crates/derive/src/types/transaction/legacy.rs +++ b/crates/derive/src/types/alloy/transaction/legacy.rs @@ -1,4 +1,4 @@ -use crate::types::network::{Signed, Transaction, TxKind}; +use crate::types::{Signed, Transaction, TxKind}; use alloc::vec::Vec; use alloy_primitives::{keccak256, Bytes, ChainId, Signature, U256}; use alloy_rlp::{length_of_length, BufMut, Decodable, Encodable, Header, Result}; diff --git a/crates/derive/src/types/transaction/mod.rs b/crates/derive/src/types/alloy/transaction/mod.rs similarity index 100% rename from crates/derive/src/types/transaction/mod.rs rename to crates/derive/src/types/alloy/transaction/mod.rs diff --git a/crates/derive/src/types/batch.rs b/crates/derive/src/types/batch.rs deleted file mode 100644 index 5b52bd8e3..000000000 --- a/crates/derive/src/types/batch.rs +++ /dev/null @@ -1,40 +0,0 @@ -//! This module contains the enumerable [Batch]. - -use super::batch_type::BatchType; -use super::single_batch::SingleBatch; -use crate::types::errors::DecodeError; - -use alloy_rlp::Decodable; - -// TODO: replace this with a span batch -/// Span Batch. -#[derive(Debug, Clone, PartialEq, Eq)] -pub struct SpanBatch {} - -/// A Batch. -#[derive(Debug, Clone, PartialEq, Eq)] -pub enum Batch { - /// A single batch - Single(SingleBatch), - /// Span Batches - Span(SpanBatch), -} - -impl Batch { - /// Attempts to decode a batch from a byte slice. - pub fn decode(r: &mut &[u8]) -> Result { - if r.is_empty() { - return Err(DecodeError::EmptyBuffer); - } - match BatchType::from(r[0]) { - BatchType::Single => { - let single_batch = SingleBatch::decode(r)?; - Ok(Batch::Single(single_batch)) - } - BatchType::Span => { - // TODO: implement span batch decoding - unimplemented!() - } - } - } -} diff --git a/crates/derive/src/types/batch_type.rs b/crates/derive/src/types/batch/batch_type.rs similarity index 97% rename from crates/derive/src/types/batch_type.rs rename to crates/derive/src/types/batch/batch_type.rs index 068452816..5de2c8aad 100644 --- a/crates/derive/src/types/batch_type.rs +++ b/crates/derive/src/types/batch/batch_type.rs @@ -57,7 +57,7 @@ mod test { use alloc::vec::Vec; #[test] - fn test_batch_type() { + fn test_batch_type_rlp_roundtrip() { let batch_type = BatchType::Single; let mut buf = Vec::new(); batch_type.encode(&mut buf); diff --git a/crates/derive/src/types/batch/mod.rs b/crates/derive/src/types/batch/mod.rs index bfea608be..6b95523d6 100644 --- a/crates/derive/src/types/batch/mod.rs +++ b/crates/derive/src/types/batch/mod.rs @@ -1,5 +1,12 @@ //! This module contains the batch types for the OP Stack derivation pipeline: [SpanBatch] & [SingleBatch]. +use super::DecodeError; +use alloc::vec::Vec; +use alloy_rlp::{Buf, Decodable, Encodable}; + +mod batch_type; +pub use batch_type::BatchType; + mod span_batch; pub use span_batch::{ RawSpanBatch, SpanBatch, SpanBatchBits, SpanBatchBuilder, SpanBatchEip1559TransactionData, @@ -10,3 +17,48 @@ pub use span_batch::{ mod single_batch; pub use single_batch::SingleBatch; + +/// A Batch. +#[derive(Debug, Clone, PartialEq, Eq)] +pub enum Batch { + /// A single batch + Single(SingleBatch), + /// Span Batches + Span(SpanBatch), +} + +impl Batch { + /// Attempts to encode a batch into a writer. + pub fn encode(&self, w: &mut Vec) -> Result<(), DecodeError> { + match self { + Self::Single(single_batch) => { + single_batch.encode(w); + Ok(()) + } + Self::Span(_span_batch) => { + unimplemented!() + } + } + } + + /// Attempts to decode a batch from a reader. + pub fn decode(r: &mut &[u8]) -> Result { + if r.is_empty() { + return Err(DecodeError::EmptyBuffer); + } + + // Read the batch type + let batch_type = BatchType::from(r[0]); + r.advance(1); + + match batch_type { + BatchType::Single => { + let single_batch = SingleBatch::decode(r)?; + Ok(Batch::Single(single_batch)) + } + BatchType::Span => { + unimplemented!() + } + } + } +} diff --git a/crates/derive/src/types/batch/span_batch/tx_data/eip1559.rs b/crates/derive/src/types/batch/span_batch/tx_data/eip1559.rs index 5e514d2f8..4a0518486 100644 --- a/crates/derive/src/types/batch/span_batch/tx_data/eip1559.rs +++ b/crates/derive/src/types/batch/span_batch/tx_data/eip1559.rs @@ -2,7 +2,7 @@ use crate::types::eip2930::AccessList; use crate::types::{ - network::Signed, SpanBatchError, SpanDecodingError, Transaction, TxEip1559, TxEnvelope, TxKind, + Signed, SpanBatchError, SpanDecodingError, Transaction, TxEip1559, TxEnvelope, TxKind, }; use alloy_primitives::{Address, Signature, U256}; use alloy_rlp::{Bytes, RlpDecodable, RlpEncodable}; diff --git a/crates/derive/src/types/batch/span_batch/tx_data/eip2930.rs b/crates/derive/src/types/batch/span_batch/tx_data/eip2930.rs index 1d29e75da..d12e9240d 100644 --- a/crates/derive/src/types/batch/span_batch/tx_data/eip2930.rs +++ b/crates/derive/src/types/batch/span_batch/tx_data/eip2930.rs @@ -2,7 +2,7 @@ use crate::types::eip2930::AccessList; use crate::types::{ - network::Signed, SpanBatchError, SpanDecodingError, Transaction, TxEip2930, TxEnvelope, TxKind, + Signed, SpanBatchError, SpanDecodingError, Transaction, TxEip2930, TxEnvelope, TxKind, }; use alloy_primitives::{Address, Signature, U256}; use alloy_rlp::{Bytes, RlpDecodable, RlpEncodable}; diff --git a/crates/derive/src/types/batch/span_batch/tx_data/legacy.rs b/crates/derive/src/types/batch/span_batch/tx_data/legacy.rs index bc64924db..3e3a79be2 100644 --- a/crates/derive/src/types/batch/span_batch/tx_data/legacy.rs +++ b/crates/derive/src/types/batch/span_batch/tx_data/legacy.rs @@ -1,7 +1,7 @@ //! This module contains the legacy transaction data type for a span batch. use crate::types::{ - network::Signed, SpanBatchError, SpanDecodingError, Transaction, TxEnvelope, TxKind, TxLegacy, + Signed, SpanBatchError, SpanDecodingError, Transaction, TxEnvelope, TxKind, TxLegacy, }; use alloy_primitives::{Address, Signature, U256}; use alloy_rlp::{Bytes, RlpDecodable, RlpEncodable}; diff --git a/crates/derive/src/types/block.rs b/crates/derive/src/types/block.rs index d07ca4903..7b3e0281c 100644 --- a/crates/derive/src/types/block.rs +++ b/crates/derive/src/types/block.rs @@ -65,30 +65,3 @@ pub enum BlockKind { /// The latest finalized block. Finalized, } - -// /// A Block with Transactions -// #[cfg_attr(feature = "serde", derive(Serialize, Deserialize))] -// #[cfg_attr(feature = "serde", serde(rename_all = "camelCase"))] -// #[derive(Debug, Clone, Eq, PartialEq, Serialize, Deserialize)] -// pub struct Block { -// /// Header of the block. -// #[serde(flatten)] -// pub header: Header, -// /// Uncles' hashes. -// pub uncles: Vec, -// /// Block Transactions. In the case of an uncle block, this field is not included in RPC -// /// responses, and when deserialized, it will be set to [BlockTransactions::Uncle]. -// #[serde( -// skip_serializing_if = "BlockTransactions::is_uncle", -// default = "BlockTransactions::uncle" -// )] -// pub transactions: BlockTransactions, -// /// Integer the size of this block in bytes. -// pub size: Option, -// /// Withdrawals in the block. -// #[serde(default, skip_serializing_if = "Option::is_none")] -// pub withdrawals: Option>, -// /// Support for arbitrary additional fields. -// #[serde(flatten)] -// pub other: OtherFields, -// } diff --git a/crates/derive/src/types/mod.rs b/crates/derive/src/types/mod.rs index ad8f5b8f9..c1c096470 100644 --- a/crates/derive/src/types/mod.rs +++ b/crates/derive/src/types/mod.rs @@ -4,12 +4,6 @@ use alloc::vec::Vec; use alloy_primitives::Bytes; use alloy_rlp::{Decodable, Encodable}; -mod batch; -pub use batch::Batch; - -mod batch_type; -pub use batch_type::BatchType; - mod system_config; pub use system_config::{ SystemAccounts, SystemConfig, SystemConfigUpdateType, CONFIG_UPDATE_EVENT_VERSION_0, @@ -21,34 +15,24 @@ pub use rollup_config::RollupConfig; pub mod batch; pub use batch::{ - RawSpanBatch, SingleBatch, SpanBatch, SpanBatchBits, SpanBatchBuilder, + Batch, BatchType, RawSpanBatch, SingleBatch, SpanBatch, SpanBatchBits, SpanBatchBuilder, SpanBatchEip1559TransactionData, SpanBatchEip2930TransactionData, SpanBatchElement, SpanBatchError, SpanBatchLegacyTransactionData, SpanBatchPayload, SpanBatchPrefix, SpanBatchTransactionData, SpanBatchTransactions, SpanDecodingError, MAX_SPAN_BATCH_SIZE, SPAN_BATCH_TYPE, }; -mod transaction; -pub use transaction::{TxDeposit, TxEip1559, TxEip2930, TxEip4844, TxEnvelope, TxLegacy, TxType}; - -mod network; -pub use network::{Receipt as NetworkReceipt, Sealable, Sealed, Transaction, TxKind}; - -mod header; -pub use header::{Header, EMPTY_OMMER_ROOT_HASH, EMPTY_ROOT_HASH}; +mod alloy; +pub use alloy::{ + calc_blob_gasprice, calc_excess_blob_gas, calc_next_block_base_fee, eip1559, eip2718, eip2930, + eip4788, eip4844, Header, NetworkReceipt, Receipt, ReceiptWithBloom, Sealable, Sealed, Signed, + Transaction, TxDeposit, TxEip1559, TxEip2930, TxEip4844, TxEnvelope, TxKind, TxLegacy, TxType, + EMPTY_OMMER_ROOT_HASH, EMPTY_ROOT_HASH, +}; mod block; pub use block::{BlockId, BlockInfo, BlockKind}; -mod receipt; -pub use receipt::{Receipt, ReceiptWithBloom}; - -mod eips; -pub use eips::{ - calc_blob_gasprice, calc_excess_blob_gas, calc_next_block_base_fee, eip1559, eip2718, eip2930, - eip4788, eip4844, -}; - mod genesis; pub use genesis::Genesis; diff --git a/crates/derive/testdata/payload.hex b/crates/derive/testdata/payload.hex new file mode 100644 index 0000000000000000000000000000000000000000..eb96db1c89dab43fe764660764dd935b612103ec GIT binary patch literal 13924 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