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 000000000..eb96db1c8 Binary files /dev/null and b/crates/derive/testdata/payload.hex differ