From 821290e44438d9961b5141e2d2a2c0586e135f17 Mon Sep 17 00:00:00 2001 From: Ki Ageng Satria Pamungkas Date: Wed, 17 Dec 2025 12:04:04 +0700 Subject: [PATCH 01/25] unsealed block --- based/Cargo.lock | 129 +++++++++++++++------- based/crates/common/src/p2p.rs | 24 +++-- based/crates/reth/Cargo.toml | 18 ++++ based/crates/reth/src/driver.rs | 5 + based/crates/reth/src/lib.rs | 17 +++ based/crates/reth/src/unsealed_block.rs | 136 ++++++++++++++++++++++++ 6 files changed, 281 insertions(+), 48 deletions(-) create mode 100644 based/crates/reth/Cargo.toml create mode 100644 based/crates/reth/src/driver.rs create mode 100644 based/crates/reth/src/lib.rs create mode 100644 based/crates/reth/src/unsealed_block.rs diff --git a/based/Cargo.lock b/based/Cargo.lock index af514c813..c34acc53b 100644 --- a/based/Cargo.lock +++ b/based/Cargo.lock @@ -110,9 +110,9 @@ dependencies = [ [[package]] name = "alloy-consensus" -version = "1.0.42" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3abecb92ba478a285fbf5689100dbafe4003ded4a09bf4b5ef62cca87cd4f79e" +checksum = "2e318e25fb719e747a7e8db1654170fc185024f3ed5b10f86c08d448a912f6e2" dependencies = [ "alloy-eips", "alloy-primitives", @@ -122,6 +122,7 @@ dependencies = [ "alloy-tx-macros", "arbitrary", "auto_impl", + "borsh", "c-kzg", "derive_more", "either", @@ -137,9 +138,9 @@ dependencies = [ [[package]] name = "alloy-consensus-any" -version = "1.0.42" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e864d4f11d1fb8d3ac2fd8f3a15f1ee46d55ec6d116b342ed1b2cb737f25894" +checksum = "364380a845193a317bcb7a5398fc86cdb66c47ebe010771dde05f6869bf9e64a" dependencies = [ "alloy-consensus", "alloy-eips", @@ -184,26 +185,28 @@ dependencies = [ [[package]] name = "alloy-eip2930" -version = "0.2.1" +version = "0.2.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b82752a889170df67bbb36d42ca63c531eb16274f0d7299ae2a680facba17bd" +checksum = "9441120fa82df73e8959ae0e4ab8ade03de2aaae61be313fbf5746277847ce25" dependencies = [ "alloy-primitives", "alloy-rlp", "arbitrary", + "borsh", "rand 0.8.5", "serde", ] [[package]] name = "alloy-eip7702" -version = "0.6.1" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9d4769c6ffddca380b0070d71c8b7f30bed375543fe76bb2f74ec0acf4b7cd16" +checksum = "2919c5a56a1007492da313e7a3b6d45ef5edc5d33416fdec63c0d7a2702a0d20" dependencies = [ "alloy-primitives", "alloy-rlp", "arbitrary", + "borsh", "k256", "rand 0.8.5", "serde", @@ -213,9 +216,9 @@ dependencies = [ [[package]] name = "alloy-eips" -version = "1.0.42" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07d9a64522a0db6ebcc4ff9c904e329e77dd737c2c25d30f1bdc32ca6c6ce334" +checksum = "a4c4d7c5839d9f3a467900c625416b24328450c65702eb3d8caff8813e4d1d33" dependencies = [ "alloy-eip2124", "alloy-eip2930", @@ -225,6 +228,7 @@ dependencies = [ "alloy-serde", "arbitrary", "auto_impl", + "borsh", "c-kzg", "derive_more", "either", @@ -301,9 +305,9 @@ dependencies = [ [[package]] name = "alloy-json-rpc" -version = "1.0.42" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f87b774478fcc616993e97659697f3e3c7988fdad598e46ee0ed11209cd0d8ee" +checksum = "f72cf87cda808e593381fb9f005ffa4d2475552b7a6c5ac33d087bf77d82abd0" dependencies = [ "alloy-primitives", "alloy-sol-types", @@ -316,9 +320,9 @@ dependencies = [ [[package]] name = "alloy-network" -version = "1.0.42" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5d6ed73d440bae8f27771b7cd507fa8f10f19ddf0b8f67e7622a52e0dbf798e" +checksum = "12aeb37b6f2e61b93b1c3d34d01ee720207c76fe447e2a2c217e433ac75b17f5" dependencies = [ "alloy-consensus", "alloy-consensus-any", @@ -342,9 +346,9 @@ dependencies = [ [[package]] name = "alloy-network-primitives" -version = "1.0.42" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "219dccd2cf753a43bd9b0fbb7771a16927ffdb56e43e3a15755bef1a74d614aa" +checksum = "abd29ace62872083e30929cd9b282d82723196d196db589f3ceda67edcc05552" dependencies = [ "alloy-consensus", "alloy-eips", @@ -385,9 +389,9 @@ dependencies = [ [[package]] name = "alloy-primitives" -version = "1.4.1" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "355bf68a433e0fd7f7d33d5a9fc2583fde70bf5c530f63b80845f8da5505cf28" +checksum = "5c850e6ccbd34b8a463a1e934ffc8fc00e1efc5e5489f2ad82d7797949f3bd4e" dependencies = [ "alloy-rlp", "arbitrary", @@ -406,6 +410,7 @@ dependencies = [ "proptest", "proptest-derive 0.6.0", "rand 0.9.1", + "rapidhash", "ruint", "rustc-hash 2.1.1", "serde", @@ -527,9 +532,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types" -version = "1.0.42" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe106e50522980bc9e7cc9016f445531edf1a53e0fdba904c833b98c6fdff3f0" +checksum = "39cf1398cb33aacb139a960fa3d8cf8b1202079f320e77e952a0b95967bf7a9f" dependencies = [ "alloy-primitives", "alloy-rpc-types-engine", @@ -564,9 +569,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-any" -version = "1.0.42" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "425e14ee32eb8b7edd6a2247fe0ed640785e6eba75af27db27f1e6220c15ef0d" +checksum = "6a63fb40ed24e4c92505f488f9dd256e2afaed17faa1b7a221086ebba74f4122" dependencies = [ "alloy-consensus-any", "alloy-rpc-types-eth", @@ -607,9 +612,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-engine" -version = "1.0.42" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aabc17f0eac3f747eeddebc768c8e30763d6f6c53188f5335a935dedc57ddfbd" +checksum = "4c60bdce3be295924122732b7ecd0b2495ce4790bedc5370ca7019c08ad3f26e" dependencies = [ "alloy-consensus", "alloy-eips", @@ -627,9 +632,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-eth" -version = "1.0.42" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0185f68a0f8391ab996d335a887087d7ccdbc97952efab3516f6307d456ba2cd" +checksum = "9eae0c7c40da20684548cbc8577b6b7447f7bf4ddbac363df95e3da220e41e72" dependencies = [ "alloy-consensus", "alloy-consensus-any", @@ -690,9 +695,9 @@ dependencies = [ [[package]] name = "alloy-serde" -version = "1.0.42" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "596cfa360922ba9af901cc7370c68640e4f72adb6df0ab064de32f21fec498d7" +checksum = "c0df1987ed0ff2d0159d76b52e7ddfc4e4fbddacc54d2fbee765e0d14d7c01b5" dependencies = [ "alloy-primitives", "arbitrary", @@ -702,9 +707,9 @@ dependencies = [ [[package]] name = "alloy-signer" -version = "1.0.42" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f06333680d04370c8ed3a6b0eccff384e422c3d8e6b19e61fedc3a9f0ab7743" +checksum = "6ff69deedee7232d7ce5330259025b868c5e6a52fa8dffda2c861fb3a5889b24" dependencies = [ "alloy-primitives", "async-trait", @@ -902,9 +907,9 @@ dependencies = [ [[package]] name = "alloy-tx-macros" -version = "1.0.42" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab54221eccefa254ce9f65b079c097b1796e48c21c7ce358230f8988d75392fb" +checksum = "333544408503f42d7d3792bfc0f7218b643d968a03d2c0ed383ae558fb4a76d0" dependencies = [ "darling 0.21.3", "proc-macro2", @@ -2063,6 +2068,29 @@ dependencies = [ "uuid", ] +[[package]] +name = "borsh" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1da5ab77c1437701eeff7c88d968729e7766172279eab0676857b3d63af7a6f" +dependencies = [ + "borsh-derive", + "cfg_aliases", +] + +[[package]] +name = "borsh-derive" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0686c856aa6aac0c4498f936d7d6a02df690f614c03e4d906d1018062b5c5e2c" +dependencies = [ + "once_cell", + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "boyer-moore-magiclen" version = "0.2.20" @@ -6549,6 +6577,16 @@ dependencies = [ "rand_core 0.9.3", ] +[[package]] +name = "rapidhash" +version = "4.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8e65c75143ce5d47c55b510297eeb1182f3c739b6043c537670e9fc18612dae" +dependencies = [ + "rand 0.9.1", + "rustversion", +] + [[package]] name = "ratatui" version = "0.29.0" @@ -6726,6 +6764,21 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95325155c684b1c89f7765e30bc1c42e4a6da51ca513615660cb8a62ef9a88e3" +[[package]] +name = "reth" +version = "0.1.0" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-network", + "alloy-primitives", + "alloy-rpc-types", + "bop-common", + "op-alloy-rpc-types", + "thiserror 2.0.12", + "tracing", +] + [[package]] name = "reth-basic-payload-builder" version = "1.9.2" @@ -11354,9 +11407,9 @@ checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" [[package]] name = "tracing" -version = "0.1.41" +version = "0.1.43" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "784e0ac535deb450455cbfa28a6f0df145ea1bb7ae51b821cf5e7927fdcfbdd0" +checksum = "2d15d90a0b5c19378952d479dc858407149d7bb45a14de0142f6c534b16fc647" dependencies = [ "log", "pin-project-lite", @@ -11378,9 +11431,9 @@ dependencies = [ [[package]] name = "tracing-attributes" -version = "0.1.28" +version = "0.1.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "395ae124c09f9e6918a2310af6038fba074bcf474ac352496d5910dd59a2226d" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", @@ -11389,9 +11442,9 @@ dependencies = [ [[package]] name = "tracing-core" -version = "0.1.33" +version = "0.1.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e672c95779cf947c5311f83787af4fa8fffd12fb27e4993211a84bdfd9610f9c" +checksum = "7a04e24fab5c89c6a36eb8558c9656f30d81de51dfa4d3b45f26b21d61fa0a6c" dependencies = [ "once_cell", "valuable", diff --git a/based/crates/common/src/p2p.rs b/based/crates/common/src/p2p.rs index aed897d32..517e007f5 100644 --- a/based/crates/common/src/p2p.rs +++ b/based/crates/common/src/p2p.rs @@ -17,17 +17,17 @@ pub type ExtraData = VariableList; #[derive(Debug, Clone, PartialEq, Eq, TreeHash, Serialize, Deserialize)] #[serde(rename_all = "camelCase")] pub struct EnvV0 { - number: u64, - parent_hash: B256, - beneficiary: Address, - timestamp: u64, - gas_limit: u64, - basefee: u64, - difficulty: U256, - prevrandao: B256, + pub number: u64, + pub parent_hash: B256, + pub beneficiary: Address, + pub timestamp: u64, + pub gas_limit: u64, + pub basefee: u64, + pub difficulty: U256, + pub prevrandao: B256, #[serde(with = "ssz_types::serde_utils::hex_var_list")] - extra_data: ExtraData, - parent_beacon_block_root: B256, + pub extra_data: ExtraData, + pub parent_beacon_block_root: B256, } impl EnvV0 { @@ -81,6 +81,10 @@ impl FragV0 { let txs = builder_txs.map(|tx| tx.encode().to_vec()).map(Transaction::from).collect::>(); Self { block_number, seq, txs: Transactions::from(txs), is_last, blob_gas_used } } + + pub fn is_first(&self) -> bool { + self.seq == 0 + } } /// A message sealing a sequence of frags, with fields from the block header diff --git a/based/crates/reth/Cargo.toml b/based/crates/reth/Cargo.toml new file mode 100644 index 000000000..5855de143 --- /dev/null +++ b/based/crates/reth/Cargo.toml @@ -0,0 +1,18 @@ +[package] +name = "reth" +edition.workspace = true +repository.workspace = true +rust-version.workspace = true +version.workspace = true + +[dependencies] +alloy-network.workspace = true +alloy-primitives.workspace = true +alloy-rpc-types.workspace = true +tracing.workspace = true +bop-common.workspace = true +op-alloy-rpc-types.workspace = true +alloy-consensus.workspace = true +alloy-eips = "1.1.3" +thiserror = "2.0.12" + diff --git a/based/crates/reth/src/driver.rs b/based/crates/reth/src/driver.rs new file mode 100644 index 000000000..7a8b0d7f6 --- /dev/null +++ b/based/crates/reth/src/driver.rs @@ -0,0 +1,5 @@ +use crate::unsealed_block::UnsealedBlock; + +pub struct Driver { + unsealed_block : Vec +} \ No newline at end of file diff --git a/based/crates/reth/src/lib.rs b/based/crates/reth/src/lib.rs new file mode 100644 index 000000000..917fb7f3a --- /dev/null +++ b/based/crates/reth/src/lib.rs @@ -0,0 +1,17 @@ +pub mod unsealed_block; +pub mod driver; + +pub fn add(left: u64, right: u64) -> u64 { + left + right +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn it_works() { + let result = add(2, 2); + assert_eq!(result, 4); + } +} diff --git a/based/crates/reth/src/unsealed_block.rs b/based/crates/reth/src/unsealed_block.rs new file mode 100644 index 000000000..878e32f12 --- /dev/null +++ b/based/crates/reth/src/unsealed_block.rs @@ -0,0 +1,136 @@ +use alloy_consensus::{Header, TxEnvelope}; +use alloy_eips::eip2718::{Decodable2718, Eip2718Error}; +use alloy_primitives::{B256, Bytes, FixedBytes}; +use alloy_rpc_types::{Log, TransactionReceipt}; +use bop_common::p2p::{EnvV0, FragV0, Transaction as TxBytes}; +use thiserror::Error; + +#[derive(Debug, Error)] +pub enum UnsealedBlockError { + #[error("failed to decode EIP-2718 tx at index {index}")] + TxDecode { + index: usize, + #[source] + source: Eip2718Error, + }, +} + +pub struct UnsealedBlock { + /// Block environment. + pub env: EnvV0, + /// Received fragments that contain the raw transaction bytes. + pub frags: Vec, + /// Sequence number of the last fragment that has been accepted/added. + /// + /// - `None` means no fragment has been accepted yet + /// - `Some(n)` means `frags[n]` is considered the latest known fragment + pub last_sequence_number: Option, + /// Block hash. + pub hash: FixedBytes<32>, + + /// Transaction receipts for executed transactions. + pub receipts: Vec, + /// Flattened logs emitted during execution. + pub logs: Vec, + /// Cumulative execution gas used across all transactions in the block. + pub cumulative_gas_used: u64, + /// Cumulative blob gas used across all blob-carrying transactions in the block. + pub cumulative_blob_gas_used: u64, +} + +impl UnsealedBlock { + pub fn new(env: EnvV0) -> Self { + Self { + env, + frags: Vec::new(), + last_sequence_number: None, + hash: Default::default(), + receipts: Vec::new(), + logs: Vec::new(), + cumulative_gas_used: 0, + cumulative_blob_gas_used: 0, + } + } + + /// Returns `true` if no fragments have been added yet. + pub fn is_empty(&self) -> bool { + self.frags.is_empty() + } + + /// Returns `true` if `f` is the next fragment that should be appended. + pub fn is_next_frag(&self, f: &FragV0) -> bool { + match self.last_sequence_number { + None => f.is_first(), + Some(last_seq) => { + let Some(last_known) = self.frags.get(last_seq as usize) else { + return false; + }; + if last_known.is_last { + false + } else { + last_known.seq + 1 == f.seq + } + } + } + } + + /// Raw tx bytes iterator (flattening frags) + pub fn transactions_iter_bytes(&self) -> impl Iterator + '_ { + self.frags.iter().flat_map(|frag| frag.txs.iter()) + } + + /// Decoded txs iterator (lazy decode) + pub fn transactions_iter_decoded( + &self, + ) -> impl Iterator> + '_ { + self.transactions_iter_bytes() + .enumerate() + .map(|(index, tx)| { + // allocate a Vec to decode from + let raw: Vec = tx.iter().copied().collect(); + TxEnvelope::decode_2718_exact(&raw) + .map_err(|source| UnsealedBlockError::TxDecode { index, source }) + }) + } + + /// Decoded txs (allocates Vec), like Go `Transactions()` but decoded + pub fn transactions(&self) -> Result, UnsealedBlockError> { + self.transactions_iter_decoded().collect() + } + + /// Raw tx bytes (allocates Vec>), like Go `ByteTransactions()` + pub fn byte_transactions(&self) -> Vec> { + self.transactions_iter_bytes() + .map(|tx| tx.iter().copied().collect::>()) + .collect() + } + + /// A temporary header derived from env. + pub fn temp_header(&self) -> Header { + Header { + parent_hash: self.env.parent_hash, + parent_beacon_block_root: Some(self.env.parent_beacon_block_root), + number: self.env.number, + timestamp: self.env.timestamp, + extra_data: Bytes::copy_from_slice(self.env.extra_data.as_ref()), + gas_limit: self.env.gas_limit, + base_fee_per_gas: Some(self.env.basefee), + difficulty: self.env.difficulty, + beneficiary: self.env.beneficiary, + mix_hash: self.env.prevrandao, + + // placeholders until seal-time + ommers_hash: B256::ZERO, + state_root: B256::ZERO, + transactions_root: B256::ZERO, + receipts_root: B256::ZERO, + logs_bloom: Default::default(), + gas_used: 0, + nonce: Default::default(), + withdrawals_root: None, + blob_gas_used: None, + excess_blob_gas: None, + requests_hash: None, + } + } +} From 1e16fb13a9ef67392032dd0dbf9031f120f62555 Mon Sep 17 00:00:00 2001 From: Ki Ageng Satria Pamungkas Date: Wed, 17 Dec 2025 17:40:06 +0700 Subject: [PATCH 02/25] non reth code --- based/Cargo.lock | 9 + based/crates/reth/Cargo.toml | 10 +- based/crates/reth/src/driver.rs | 329 +++++++++++++++++++++++- based/crates/reth/src/exec.rs | 69 +++++ based/crates/reth/src/lib.rs | 17 +- based/crates/reth/src/unsealed_block.rs | 60 +++++ 6 files changed, 475 insertions(+), 19 deletions(-) create mode 100644 based/crates/reth/src/exec.rs diff --git a/based/Cargo.lock b/based/Cargo.lock index c34acc53b..63c37e949 100644 --- a/based/Cargo.lock +++ b/based/Cargo.lock @@ -5602,6 +5602,12 @@ dependencies = [ "portable-atomic", ] +[[package]] +name = "oneshot" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ce411919553d3f9fa53a0880544cda985a112117a0444d5ff1e870a893d6ea" + [[package]] name = "op-alloy-consensus" version = "0.22.1" @@ -6773,9 +6779,12 @@ dependencies = [ "alloy-network", "alloy-primitives", "alloy-rpc-types", + "anyhow", "bop-common", + "oneshot", "op-alloy-rpc-types", "thiserror 2.0.12", + "tokio", "tracing", ] diff --git a/based/crates/reth/Cargo.toml b/based/crates/reth/Cargo.toml index 5855de143..345d8f9aa 100644 --- a/based/crates/reth/Cargo.toml +++ b/based/crates/reth/Cargo.toml @@ -13,6 +13,12 @@ tracing.workspace = true bop-common.workspace = true op-alloy-rpc-types.workspace = true alloy-consensus.workspace = true -alloy-eips = "1.1.3" -thiserror = "2.0.12" +alloy-eips.workspace = true +thiserror.workspace = true +anyhow.workspace = true +tokio.workspace = true +oneshot.workspace = true +reth_optimism_evm.workspace = true +reth_revm.workspace = true +revm.workspace = true diff --git a/based/crates/reth/src/driver.rs b/based/crates/reth/src/driver.rs index 7a8b0d7f6..eab2f6aba 100644 --- a/based/crates/reth/src/driver.rs +++ b/based/crates/reth/src/driver.rs @@ -1,5 +1,330 @@ -use crate::unsealed_block::UnsealedBlock; +use std::time::Instant; +use anyhow::Context; +use tokio::sync::{mpsc, oneshot}; +use tracing::{error, info}; +use thiserror::Error; + +use bop_common::p2p::{EnvV0, FragV0}; + +use crate::exec::{apply_exec_output, ExecError, UnsealedExecutor}; +use crate::unsealed_block::{UnsealedBlock, UnsealedBlockError}; + +#[derive(Debug, Clone, Copy)] +pub enum FragStatus { + Valid, + Invalid, +} + +#[derive(Clone)] pub struct Driver { - unsealed_block : Vec + tx: mpsc::Sender, +} + +#[derive(Debug, Error)] +pub enum DriverError { + #[error("failed to send command to driver task (task not running)")] + DriverGone, + + #[error("failed to receive response from driver task (response dropped)")] + ResponseDropped, + + #[error("driver not initialized, call env_v0 first")] + NotInitialized, + + #[error(transparent)] + Exec(#[from] ExecError), + + #[error(transparent)] + Other(#[from] anyhow::Error), + + #[error(transparent)] + UnsealedBlock(#[from] UnsealedBlockError), +} + +impl From> for DriverError { + fn from(_: mpsc::error::SendError) -> Self { + DriverError::DriverGone + } +} + +impl From for DriverError { + fn from(_: oneshot::error::RecvError) -> Self { + DriverError::ResponseDropped + } +} + +type Resp = oneshot::Sender>; + +#[derive(Debug)] +enum Reply { + Ok(T), + Err(DriverError), +} + +impl Reply { + fn into_result(self) -> Result { + match self { + Reply::Ok(v) => Ok(v), + Reply::Err(e) => Err(e), + } + } +} + +fn respond(resp: Resp, res: Result) { + let _ = resp.send(match res { + Ok(v) => Reply::Ok(v), + Err(e) => Reply::Err(e), + }); +} + +enum Cmd { + // RPC + EnvV0 { env: EnvV0, resp: Resp<()> }, + NewFragV0 { frag: FragV0, resp: Resp }, + SealFragV0 { resp: Resp<()> }, + + // ExEx + ForkchoiceUpdated { new_block_number: u64, resp: Resp<()> }, + GetHeaderView { resp: Resp }, +} + +#[derive(Debug, Clone)] +pub struct HeaderView { + pub enabled: bool, + pub header: Option, +} + +pub struct DriverInner { + pub enabled_unsealed_as_latest: bool, + + pub current_unsealed_block: Option, + pub exec: E, + + pub fcu_count_since_unseal_reset: usize, +} + +impl Driver { + pub fn spawn(inner: DriverInner) -> Self { + let (tx, mut rx) = mpsc::channel::(256); + + tokio::spawn(async move { + let mut inner = inner; + + while let Some(cmd) = rx.recv().await { + match cmd { + Cmd::EnvV0 { env, resp } => { + respond(resp, inner.handle_env_v0(env).await); + } + Cmd::NewFragV0 { frag, resp } => { + respond(resp, inner.handle_new_frag_v0(frag).await); + } + Cmd::SealFragV0 { resp } => { + respond(resp, inner.handle_seal_frag_v0().await); + } + Cmd::ForkchoiceUpdated { + new_block_number, + resp, + } => { + respond(resp, inner.handle_forkchoice_updated(new_block_number).await); + } + Cmd::GetHeaderView { resp } => { + let _ = resp.send(Reply::Ok(inner.get_header_view())); + } + } + } + }); + + Self { tx } + } + + pub async fn env_v0(&self, env: EnvV0) -> Result<(), DriverError> { + let (resp_tx, resp_rx) = oneshot::channel(); + self.tx.send(Cmd::EnvV0 { env, resp: resp_tx }).await?; + resp_rx.await?.into_result() + } + + pub async fn new_frag_v0(&self, frag: FragV0) -> Result { + let (resp_tx, resp_rx) = oneshot::channel(); + self.tx + .send(Cmd::NewFragV0 { frag, resp: resp_tx }) + .await?; + resp_rx.await?.into_result() + } + + pub async fn seal_frag_v0(&self) -> Result<(), DriverError> { + let (resp_tx, resp_rx) = oneshot::channel(); + self.tx.send(Cmd::SealFragV0 { resp: resp_tx }).await?; + resp_rx.await?.into_result() + } + + pub async fn forkchoice_updated(&self, new_block_number: u64) -> Result<(), DriverError> { + let (resp_tx, resp_rx) = oneshot::channel(); + self.tx + .send(Cmd::ForkchoiceUpdated { + new_block_number, + resp: resp_tx, + }) + .await?; + resp_rx.await?.into_result() + } + + pub async fn header_view(&self) -> HeaderView { + let (resp_tx, resp_rx) = oneshot::channel(); + + if self.tx.send(Cmd::GetHeaderView { resp: resp_tx }).await.is_err() { + return HeaderView { + enabled: false, + header: None, + }; + } + + match resp_rx.await { + Ok(reply) => reply.into_result().unwrap_or(HeaderView { + enabled: false, + header: None, + }), + Err(_) => HeaderView { + enabled: false, + header: None, + }, + } + } +} + +impl DriverInner { + fn reset_current_unsealed_block(&mut self) { + self.current_unsealed_block = None; + self.exec.reset(); + self.fcu_count_since_unseal_reset = 0; + } + + async fn handle_env_v0(&mut self, env: EnvV0) -> Result<(), DriverError> { + info!(block = env.number, "envV0 received"); + + match self.current_unsealed_block.as_mut() { + None => { + self.exec + .ensure_env(&env) + .context("exec.ensure_env")?; + self.current_unsealed_block = Some(UnsealedBlock::new(env)); + self.fcu_count_since_unseal_reset = 0; + Ok(()) + } + Some(ub) => { + if ub.env.number != env.number { + info!( + old = ub.env.number, + new = env.number, + "env changed block number, resetting" + ); + self.exec.reset(); + self.exec + .ensure_env(&env) + .context("exec.ensure_env")?; + ub.reset_to_env(env); + self.fcu_count_since_unseal_reset = 0; + return Ok(()); + } + + self.exec + .ensure_env(&env) + .context("exec.ensure_env")?; + ub.env = env; + Ok(()) + } + } + } + + async fn handle_forkchoice_updated(&mut self, new_block_number: u64) -> Result<(), DriverError> { + self.fcu_count_since_unseal_reset += 1; + + let Some(ub) = self.current_unsealed_block.as_ref() else { + return Ok(()); + }; + + if ub.env.number != new_block_number { + info!( + old = ub.env.number, + new = new_block_number, + "forkchoiceUpdated block mismatch: resetting unsealed" + ); + self.reset_current_unsealed_block(); + } + + Ok(()) + } + + async fn handle_new_frag_v0(&mut self, frag: FragV0) -> Result { + let start = Instant::now(); + + let Some(ub) = self.current_unsealed_block.as_mut() else { + return Err(DriverError::NotInitialized); + }; + + info!(for_block = frag.block_number, current = ub.env.number, "new frag received"); + + if frag.block_number < ub.env.number { + info!( + frag_block = frag.block_number, + env_number = ub.env.number, + "stale frag (older block), ignoring" + ); + return Ok(FragStatus::Valid); + } + + if let Err(e) = ub.validate_new_frag(&frag) { + error!(error = %e, "frag invalid, discarding unsealed block"); + self.reset_current_unsealed_block(); + return Err(DriverError::from(e)); + } + + let out = match self.exec.execute_frag(ub, &frag).await { + Ok(out) => out, + Err(e) => { + error!(error = %e, "execution failed, discarding unsealed block"); + self.reset_current_unsealed_block(); + return Err(DriverError::from(e)); + } + }; + + apply_exec_output(ub, out); + ub.accept_frag(frag); + + info!(elapsed_ms = start.elapsed().as_millis(), "frag inserted + executed"); + + if ub.last_frag().is_some_and(|f| f.is_last) { + info!("last frag received, pre-sealing block"); + if let Err(e) = self.exec.seal(ub).await { + error!(error = %e, "seal failed, discarding unsealed block"); + self.reset_current_unsealed_block(); + return Err(DriverError::from(e)); + } + } + + Ok(FragStatus::Valid) + } + + async fn handle_seal_frag_v0(&mut self) -> Result<(), DriverError> { + let Some(ub) = self.current_unsealed_block.as_ref() else { + return Err(DriverError::NotInitialized); + }; + + self.exec.seal(ub).await.context("sealFragV0")?; + Ok(()) + } + + fn get_header_view(&self) -> HeaderView { + if !self.enabled_unsealed_as_latest { + return HeaderView { + enabled: false, + header: None, + }; + } + let header = self + .current_unsealed_block + .as_ref() + .map(|ub| ub.temp_header()); + HeaderView { enabled: true, header } + } } \ No newline at end of file diff --git a/based/crates/reth/src/exec.rs b/based/crates/reth/src/exec.rs new file mode 100644 index 000000000..9369724ad --- /dev/null +++ b/based/crates/reth/src/exec.rs @@ -0,0 +1,69 @@ +use alloy_rpc_types::{Log, TransactionReceipt}; +use bop_common::p2p::{EnvV0, FragV0}; +use thiserror::Error; + +use crate::unsealed_block::UnsealedBlock; + +#[derive(Debug, Error)] +pub enum ExecError { + #[error("executor not initialized")] + NotInitialized, + + #[error("execution failed: {0}")] + Failed(String), + + #[error("seal failed: {0}")] + SealFailed(String), +} + +#[derive(Debug, Clone)] +pub struct ExecOutput { + pub receipts: Vec, + pub logs: Vec, + pub gas_used_delta: u64, +} + +/// This trait is the ONLY place that needs to know about Reth internals. +/// Everything else is just state-machine + bookkeeping. +pub trait UnsealedExecutor: Send { + /// Ensure the executor context is ready for this env (initialize overlay state, block env, etc.) + fn ensure_env(&mut self, env: &EnvV0) -> Result<(), ExecError>; + + /// Execute all txs in `frag` on top of current overlay state. + /// + /// MUST be cumulative: txs execute after all previous frags' txs. + async fn execute_frag(&mut self, ub: &UnsealedBlock, frag: &FragV0) -> Result; + + /// Finalize (post-exec changes, compute roots if needed, etc.) + async fn seal(&mut self, ub: &UnsealedBlock) -> Result<(), ExecError>; + + /// Reset overlay state completely. + fn reset(&mut self); +} + +/// Apply the executor output to the UnsealedBlock (common logic). +pub fn apply_exec_output(ub: &mut UnsealedBlock, out: ExecOutput) { + ub.receipts.extend(out.receipts); + ub.logs.extend(out.logs); + ub.cumulative_gas_used = ub.cumulative_gas_used.saturating_add(out.gas_used_delta); +} + +/// A very small “dummy” executor so you can compile & test state machine early. +/// Replace with Reth executor. +pub struct NoopExecutor; + +impl UnsealedExecutor for NoopExecutor { + fn ensure_env(&mut self, _env: &EnvV0) -> Result<(), ExecError> { + Ok(()) + } + + async fn execute_frag(&mut self, _ub: &UnsealedBlock, _frag: &FragV0) -> Result { + Ok(ExecOutput { receipts: vec![], logs: vec![], gas_used_delta: 0 }) + } + + async fn seal(&mut self, _ub: &UnsealedBlock) -> Result<(), ExecError> { + Ok(()) + } + + fn reset(&mut self) {} +} diff --git a/based/crates/reth/src/lib.rs b/based/crates/reth/src/lib.rs index 917fb7f3a..adc2ab787 100644 --- a/based/crates/reth/src/lib.rs +++ b/based/crates/reth/src/lib.rs @@ -1,17 +1,4 @@ pub mod unsealed_block; pub mod driver; - -pub fn add(left: u64, right: u64) -> u64 { - left + right -} - -#[cfg(test)] -mod tests { - use super::*; - - #[test] - fn it_works() { - let result = add(2, 2); - assert_eq!(result, 4); - } -} +pub mod exec; +mod reth_executor; diff --git a/based/crates/reth/src/unsealed_block.rs b/based/crates/reth/src/unsealed_block.rs index 878e32f12..da5ab422b 100644 --- a/based/crates/reth/src/unsealed_block.rs +++ b/based/crates/reth/src/unsealed_block.rs @@ -13,6 +13,18 @@ pub enum UnsealedBlockError { #[source] source: Eip2718Error, }, + + #[error("stale frag (older block): frag.block={frag_block} < env.number={env_number}")] + StaleFrag { frag_block: u64, env_number: u64 }, + + #[error("frag is not applicable to current unsealed env: frag.block={frag_block} env.number={env_number}")] + WrongBlock { frag_block: u64, env_number: u64 }, + + #[error("frag sequencing violation: expected next seq, got {got}, last={last:?}")] + SeqMismatch { got: u64, last: Option }, + + #[error("received frag after last frag already accepted")] + AlreadyEnded, } pub struct UnsealedBlock { @@ -105,6 +117,49 @@ impl UnsealedBlock { .collect() } + // Return the last frag on the list. + pub fn last_frag(&self) -> Option<&FragV0> { + self.frags.last() + } + + /// Apply the accepted frag into in-memory bookkeeping (NOT executing txs). + /// + /// Execution results (receipts/logs/gas) should be appended separately. + pub fn accept_frag(&mut self, f: FragV0) { + self.last_sequence_number = Some(f.seq); + self.cumulative_blob_gas_used = self.cumulative_blob_gas_used.saturating_add(f.blob_gas_used); + self.frags.push(f); + } + + /// Validate frag against current state (equivalent to your ValidateNewFragV0 + sequencing gate). + pub fn validate_new_frag(&self, f: &FragV0) -> Result<(), UnsealedBlockError> { + if f.block_number < self.env.number { + return Err(UnsealedBlockError::StaleFrag { + frag_block: f.block_number, + env_number: self.env.number, + }); + } + + // must target current block + if f.block_number > self.env.number { + return Err(UnsealedBlockError::WrongBlock { + frag_block: f.block_number, + env_number: self.env.number, + }); + } + + // sequencing + if !self.is_next_frag(f) { + let last = self.last_sequence_number; + if self.frags.last().is_some_and(|x| x.is_last) { + return Err(UnsealedBlockError::AlreadyEnded); + } + return Err(UnsealedBlockError::SeqMismatch { got: f.seq, last }); + } + + Ok(()) + } + /// A temporary header derived from env. pub fn temp_header(&self) -> Header { Header { @@ -133,4 +188,9 @@ impl UnsealedBlock { requests_hash: None, } } + + /// Reset to a fresh env (drop frags/results/counters). + pub fn reset_to_env(&mut self, env: EnvV0) { + *self = Self::new(env); + } } From 2cd06b5069e8419d464dc5f6fc982b6f692f3731 Mon Sep 17 00:00:00 2001 From: Ki Ageng Satria Pamungkas Date: Wed, 17 Dec 2025 20:03:17 +0700 Subject: [PATCH 03/25] match logic for envv0 --- based/Cargo.lock | 7 -- based/crates/reth/Cargo.toml | 6 +- based/crates/reth/src/driver.rs | 97 ++++++++++++++----------- based/crates/reth/src/exec.rs | 58 +++++++++++++-- based/crates/reth/src/unsealed_block.rs | 2 +- 5 files changed, 108 insertions(+), 62 deletions(-) diff --git a/based/Cargo.lock b/based/Cargo.lock index 63c37e949..5c3c6ddf7 100644 --- a/based/Cargo.lock +++ b/based/Cargo.lock @@ -5602,12 +5602,6 @@ dependencies = [ "portable-atomic", ] -[[package]] -name = "oneshot" -version = "0.1.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ce411919553d3f9fa53a0880544cda985a112117a0444d5ff1e870a893d6ea" - [[package]] name = "op-alloy-consensus" version = "0.22.1" @@ -6781,7 +6775,6 @@ dependencies = [ "alloy-rpc-types", "anyhow", "bop-common", - "oneshot", "op-alloy-rpc-types", "thiserror 2.0.12", "tokio", diff --git a/based/crates/reth/Cargo.toml b/based/crates/reth/Cargo.toml index 345d8f9aa..6942fd9b6 100644 --- a/based/crates/reth/Cargo.toml +++ b/based/crates/reth/Cargo.toml @@ -15,10 +15,6 @@ op-alloy-rpc-types.workspace = true alloy-consensus.workspace = true alloy-eips.workspace = true thiserror.workspace = true -anyhow.workspace = true tokio.workspace = true -oneshot.workspace = true -reth_optimism_evm.workspace = true -reth_revm.workspace = true -revm.workspace = true +anyhow = "1.0.98" diff --git a/based/crates/reth/src/driver.rs b/based/crates/reth/src/driver.rs index eab2f6aba..32be3bf8b 100644 --- a/based/crates/reth/src/driver.rs +++ b/based/crates/reth/src/driver.rs @@ -1,11 +1,11 @@ use std::time::Instant; - +use alloy_rpc_types::Block; use anyhow::Context; use tokio::sync::{mpsc, oneshot}; use tracing::{error, info}; use thiserror::Error; -use bop_common::p2p::{EnvV0, FragV0}; +use bop_common::p2p::{EnvV0, FragV0, SealV0}; use crate::exec::{apply_exec_output, ExecError, UnsealedExecutor}; use crate::unsealed_block::{UnsealedBlock, UnsealedBlockError}; @@ -32,6 +32,15 @@ pub enum DriverError { #[error("driver not initialized, call env_v0 first")] NotInitialized, + #[error("cannot open a new unsealed block while there's one already in progress (current={current}, incoming={incoming})")] + UnsealedBlockInProgress { + current: u64, + incoming: u64, + }, + + #[error("seal mismatch: {what}")] + SealMismatch { what: String }, + #[error(transparent)] Exec(#[from] ExecError), @@ -79,12 +88,9 @@ fn respond(resp: Resp, res: Result) { } enum Cmd { - // RPC EnvV0 { env: EnvV0, resp: Resp<()> }, NewFragV0 { frag: FragV0, resp: Resp }, - SealFragV0 { resp: Resp<()> }, - - // ExEx + SealFragV0 { seal: SealV0, resp: Resp<()> }, ForkchoiceUpdated { new_block_number: u64, resp: Resp<()> }, GetHeaderView { resp: Resp }, } @@ -119,8 +125,8 @@ impl Driver { Cmd::NewFragV0 { frag, resp } => { respond(resp, inner.handle_new_frag_v0(frag).await); } - Cmd::SealFragV0 { resp } => { - respond(resp, inner.handle_seal_frag_v0().await); + Cmd::SealFragV0 { seal, resp } => { + respond(resp, inner.handle_seal_frag_v0(seal).await); } Cmd::ForkchoiceUpdated { new_block_number, @@ -152,9 +158,9 @@ impl Driver { resp_rx.await?.into_result() } - pub async fn seal_frag_v0(&self) -> Result<(), DriverError> { + pub async fn seal_frag_v0(&self, seal_v0: SealV0) -> Result<(), DriverError> { let (resp_tx, resp_rx) = oneshot::channel(); - self.tx.send(Cmd::SealFragV0 { resp: resp_tx }).await?; + self.tx.send(Cmd::SealFragV0 { resp: resp_tx, seal: seal_v0 }).await?; resp_rx.await?.into_result() } @@ -202,38 +208,24 @@ impl DriverInner { async fn handle_env_v0(&mut self, env: EnvV0) -> Result<(), DriverError> { info!(block = env.number, "envV0 received"); - match self.current_unsealed_block.as_mut() { - None => { - self.exec - .ensure_env(&env) - .context("exec.ensure_env")?; - self.current_unsealed_block = Some(UnsealedBlock::new(env)); - self.fcu_count_since_unseal_reset = 0; - Ok(()) - } - Some(ub) => { - if ub.env.number != env.number { - info!( - old = ub.env.number, - new = env.number, - "env changed block number, resetting" - ); - self.exec.reset(); - self.exec - .ensure_env(&env) - .context("exec.ensure_env")?; - ub.reset_to_env(env); - self.fcu_count_since_unseal_reset = 0; - return Ok(()); - } + if let Some(current) = self.current_unsealed_block.as_ref() { + let current_num = current.env.number; - self.exec - .ensure_env(&env) - .context("exec.ensure_env")?; - ub.env = env; - Ok(()) + if current_num >= env.number { + return Err(DriverError::UnsealedBlockInProgress { + current: current_num, + incoming: env.number, + }); } + + info!(old = current_num, new = env.number, "env advanced, resetting"); + self.reset_current_unsealed_block() } + + self.exec.ensure_env(&env).context("exec.ensure_env")?; + self.current_unsealed_block = Some(UnsealedBlock::new(env)); + self.fcu_count_since_unseal_reset = 0; + Ok(()) } async fn handle_forkchoice_updated(&mut self, new_block_number: u64) -> Result<(), DriverError> { @@ -305,12 +297,35 @@ impl DriverInner { Ok(FragStatus::Valid) } - async fn handle_seal_frag_v0(&mut self) -> Result<(), DriverError> { + async fn handle_seal_frag_v0(&mut self, seal: SealV0) -> Result<(), DriverError> { + let start = Instant::now(); let Some(ub) = self.current_unsealed_block.as_ref() else { return Err(DriverError::NotInitialized); }; - self.exec.seal(ub).await.context("sealFragV0")?; + if ub.env.number > seal.block_number { + info!(ub = ub.env.number, seal = seal.block_number, "stale seal, dropping"); + return Ok(()); + } + + if ub.env.number != seal.block_number { + return Err(DriverError::SealMismatch { + what: format!("block number mismatch (ub={}, seal={})", ub.env.number, seal.block_number), + }); + } + + let presealed_block = self.exec.get_block(seal.block_hash, seal.block_number).await?; + + + self.exec.set_canonical(&presealed_block).await.context("sealFragV0")?; + + + info!(elapsed_ms = start.elapsed().as_millis(), "frag sealed"); + Ok(()) + } + + async fn validate_seal_frag_v0(&mut self, presealed_bloc: Block, seal: SealV0) -> Result<(), DriverError> { + Ok(()) } diff --git a/based/crates/reth/src/exec.rs b/based/crates/reth/src/exec.rs index 9369724ad..210133785 100644 --- a/based/crates/reth/src/exec.rs +++ b/based/crates/reth/src/exec.rs @@ -1,4 +1,7 @@ -use alloy_rpc_types::{Log, TransactionReceipt}; +use std::future::Future; + +use alloy_primitives::{BlockNumber, B256}; +use alloy_rpc_types::{Block, Log, TransactionReceipt}; use bop_common::p2p::{EnvV0, FragV0}; use thiserror::Error; @@ -32,10 +35,27 @@ pub trait UnsealedExecutor: Send { /// Execute all txs in `frag` on top of current overlay state. /// /// MUST be cumulative: txs execute after all previous frags' txs. - async fn execute_frag(&mut self, ub: &UnsealedBlock, frag: &FragV0) -> Result; + fn execute_frag<'a>( + &'a mut self, + ub: &'a UnsealedBlock, + frag: &'a FragV0, + ) -> impl Future> + Send + 'a; + + fn set_canonical<'a>( + &'a mut self, + b: &'a Block, + ) -> impl Future> + Send + 'a; - /// Finalize (post-exec changes, compute roots if needed, etc.) - async fn seal(&mut self, ub: &UnsealedBlock) -> Result<(), ExecError>; + fn seal<'a>( + &'a mut self, + ub: &'a UnsealedBlock, + ) -> impl Future> + Send + 'a; + + fn get_block<'a>( + &'a self, + hash: B256, + number: BlockNumber, + ) -> impl Future> + Send + 'a; /// Reset overlay state completely. fn reset(&mut self); @@ -57,12 +77,34 @@ impl UnsealedExecutor for NoopExecutor { Ok(()) } - async fn execute_frag(&mut self, _ub: &UnsealedBlock, _frag: &FragV0) -> Result { - Ok(ExecOutput { receipts: vec![], logs: vec![], gas_used_delta: 0 }) + fn execute_frag<'a>( + &'a mut self, + _ub: &'a UnsealedBlock, + _frag: &'a FragV0, + ) -> impl Future> + Send + 'a { + async move { Ok(ExecOutput { receipts: vec![], logs: vec![], gas_used_delta: 0 }) } } - async fn seal(&mut self, _ub: &UnsealedBlock) -> Result<(), ExecError> { - Ok(()) + fn set_canonical<'a>( + &'a mut self, + _b: &'a Block, + ) -> impl Future> + Send + 'a { + async move { Ok(()) } + } + + fn seal<'a>( + &'a mut self, + _ub: &'a UnsealedBlock, + ) -> impl Future> + Send + 'a { + async move { Ok(()) } + } + + fn get_block<'a>( + &'a self, + _hash: B256, + _number: BlockNumber, + ) -> impl Future> + Send + 'a { + async move { Ok(Block::default()) } } fn reset(&mut self) {} diff --git a/based/crates/reth/src/unsealed_block.rs b/based/crates/reth/src/unsealed_block.rs index da5ab422b..c58202d64 100644 --- a/based/crates/reth/src/unsealed_block.rs +++ b/based/crates/reth/src/unsealed_block.rs @@ -38,7 +38,7 @@ pub struct UnsealedBlock { /// - `Some(n)` means `frags[n]` is considered the latest known fragment pub last_sequence_number: Option, /// Block hash. - pub hash: FixedBytes<32>, + pub hash: B256, /// Transaction receipts for executed transactions. pub receipts: Vec, From 915590cd3e8e8a8967b1cdc42925d9f47d43759c Mon Sep 17 00:00:00 2001 From: Ki Ageng Satria Pamungkas Date: Wed, 17 Dec 2025 20:26:49 +0700 Subject: [PATCH 04/25] match logic for seal frag v0 --- based/crates/reth/src/driver.rs | 109 +++++++++++++++++++++++++++++--- 1 file changed, 99 insertions(+), 10 deletions(-) diff --git a/based/crates/reth/src/driver.rs b/based/crates/reth/src/driver.rs index 32be3bf8b..76b26096b 100644 --- a/based/crates/reth/src/driver.rs +++ b/based/crates/reth/src/driver.rs @@ -1,4 +1,5 @@ use std::time::Instant; +use alloy_primitives::B256; use alloy_rpc_types::Block; use anyhow::Context; use tokio::sync::{mpsc, oneshot}; @@ -49,6 +50,9 @@ pub enum DriverError { #[error(transparent)] UnsealedBlock(#[from] UnsealedBlockError), + + #[error(transparent)] + ValidateSeal(#[from] ValidateSealError), } impl From> for DriverError { @@ -111,7 +115,7 @@ pub struct DriverInner { } impl Driver { - pub fn spawn(inner: DriverInner) -> Self { + pub fn spawn(inner: DriverInner) -> Self { let (tx, mut rx) = mpsc::channel::(256); tokio::spawn(async move { @@ -308,24 +312,81 @@ impl DriverInner { return Ok(()); } - if ub.env.number != seal.block_number { - return Err(DriverError::SealMismatch { - what: format!("block number mismatch (ub={}, seal={})", ub.env.number, seal.block_number), - }); - } - let presealed_block = self.exec.get_block(seal.block_hash, seal.block_number).await?; - + self.validate_seal_frag_v0(&presealed_block, &ub, seal).await?; self.exec.set_canonical(&presealed_block).await.context("sealFragV0")?; + self.reset_current_unsealed_block(); - info!(elapsed_ms = start.elapsed().as_millis(), "frag sealed"); + info!(elapsed_ms = start.elapsed().as_millis(), "block sealed"); Ok(()) } - async fn validate_seal_frag_v0(&mut self, presealed_bloc: Block, seal: SealV0) -> Result<(), DriverError> { + async fn validate_seal_frag_v0(&self, presealed_block: &Block, ub: &UnsealedBlock, seal: SealV0) -> Result<(), ValidateSealError> { + let expected_block_hash: B256 = presealed_block.header.hash.into(); + if expected_block_hash != seal.block_hash { + return Err(ValidateSealError::BlockHashMismatch { + expected: expected_block_hash, + got: seal.block_hash, + }); + } + + let expected_parent_hash = presealed_block.header.parent_hash; + if expected_parent_hash != seal.parent_hash { + return Err(ValidateSealError::ParentHashMismatch { + expected: expected_parent_hash, + got: seal.parent_hash, + }); + } + + let expected_state_root = presealed_block.header.state_root; + if expected_state_root != seal.state_root { + return Err(ValidateSealError::StateRootMismatch { + expected: expected_state_root, + got: seal.state_root, + }); + } + + let expected_tx_root = presealed_block.header.transactions_root; + if expected_tx_root != seal.transactions_root { + return Err(ValidateSealError::TransactionsRootMismatch { + expected: expected_tx_root, + got: seal.transactions_root, + }); + } + + let expected_receipts_root = presealed_block.header.receipts_root; + if expected_receipts_root != seal.receipts_root { + return Err(ValidateSealError::ReceiptsRootMismatch { + expected: expected_receipts_root, + got: seal.receipts_root, + }); + } + let expected_gas_used = presealed_block.header.gas_used; + if expected_gas_used != seal.gas_used { + return Err(ValidateSealError::GasUsedMismatch { + expected: expected_gas_used, + got: seal.gas_used, + }); + } + + let expected_gas_limit = presealed_block.header.gas_limit; + if expected_gas_limit != seal.gas_limit { + return Err(ValidateSealError::GasLimitMismatch { + expected: expected_gas_limit, + got: seal.gas_limit, + }); + } + + let expected_total_frags = ub.frags.len() as u64; + if expected_total_frags != seal.total_frags { + return Err(ValidateSealError::TotalFragsMismatch { + expected: expected_total_frags, + got: seal.total_frags, + }); + } Ok(()) } @@ -342,4 +403,32 @@ impl DriverInner { .map(|ub| ub.temp_header()); HeaderView { enabled: true, header } } +} + + +#[derive(Debug, Error)] +pub enum ValidateSealError { + #[error("block hash mismatch, expected {expected:?}, got {got:?}")] + BlockHashMismatch { expected: B256, got: B256 }, + + #[error("parent hash mismatch, expected {expected:?}, got {got:?}")] + ParentHashMismatch { expected: B256, got: B256 }, + + #[error("state root mismatch, expected {expected:?}, got {got:?}")] + StateRootMismatch { expected: B256, got: B256 }, + + #[error("transactions root mismatch, expected {expected:?}, got {got:?}")] + TransactionsRootMismatch { expected: B256, got: B256 }, + + #[error("receipts root mismatch, expected {expected:?}, got {got:?}")] + ReceiptsRootMismatch { expected: B256, got: B256 }, + + #[error("gas used mismatch, expected {expected}, got {got}")] + GasUsedMismatch { expected: u64, got: u64 }, + + #[error("gas limit mismatch, expected {expected}, got {got}")] + GasLimitMismatch { expected: u64, got: u64 }, + + #[error("total frags mismatch, expected {expected}, got {got}")] + TotalFragsMismatch { expected: u64, got: u64 }, } \ No newline at end of file From e86f6519930059332a9cfcaf7a63a27caf230566 Mon Sep 17 00:00:00 2001 From: Ki Ageng Satria Pamungkas Date: Wed, 17 Dec 2025 20:33:37 +0700 Subject: [PATCH 05/25] cleanup --- based/crates/reth/src/driver.rs | 70 ++--------------- based/crates/reth/src/error.rs | 99 +++++++++++++++++++++++++ based/crates/reth/src/exec.rs | 16 +--- based/crates/reth/src/lib.rs | 2 +- based/crates/reth/src/unsealed_block.rs | 28 +------ 5 files changed, 110 insertions(+), 105 deletions(-) create mode 100644 based/crates/reth/src/error.rs diff --git a/based/crates/reth/src/driver.rs b/based/crates/reth/src/driver.rs index 76b26096b..879e8020b 100644 --- a/based/crates/reth/src/driver.rs +++ b/based/crates/reth/src/driver.rs @@ -1,15 +1,15 @@ use std::time::Instant; + use alloy_primitives::B256; use alloy_rpc_types::Block; use anyhow::Context; use tokio::sync::{mpsc, oneshot}; use tracing::{error, info}; -use thiserror::Error; use bop_common::p2p::{EnvV0, FragV0, SealV0}; - -use crate::exec::{apply_exec_output, ExecError, UnsealedExecutor}; -use crate::unsealed_block::{UnsealedBlock, UnsealedBlockError}; +use crate::error::{DriverError, ValidateSealError}; +use crate::exec::{apply_exec_output, UnsealedExecutor}; +use crate::unsealed_block::{UnsealedBlock}; #[derive(Debug, Clone, Copy)] pub enum FragStatus { @@ -22,38 +22,6 @@ pub struct Driver { tx: mpsc::Sender, } -#[derive(Debug, Error)] -pub enum DriverError { - #[error("failed to send command to driver task (task not running)")] - DriverGone, - - #[error("failed to receive response from driver task (response dropped)")] - ResponseDropped, - - #[error("driver not initialized, call env_v0 first")] - NotInitialized, - - #[error("cannot open a new unsealed block while there's one already in progress (current={current}, incoming={incoming})")] - UnsealedBlockInProgress { - current: u64, - incoming: u64, - }, - - #[error("seal mismatch: {what}")] - SealMismatch { what: String }, - - #[error(transparent)] - Exec(#[from] ExecError), - - #[error(transparent)] - Other(#[from] anyhow::Error), - - #[error(transparent)] - UnsealedBlock(#[from] UnsealedBlockError), - - #[error(transparent)] - ValidateSeal(#[from] ValidateSealError), -} impl From> for DriverError { fn from(_: mpsc::error::SendError) -> Self { @@ -115,7 +83,7 @@ pub struct DriverInner { } impl Driver { - pub fn spawn(inner: DriverInner) -> Self { + pub fn spawn(inner: DriverInner) -> Self { let (tx, mut rx) = mpsc::channel::(256); tokio::spawn(async move { @@ -403,32 +371,4 @@ impl DriverInner { .map(|ub| ub.temp_header()); HeaderView { enabled: true, header } } -} - - -#[derive(Debug, Error)] -pub enum ValidateSealError { - #[error("block hash mismatch, expected {expected:?}, got {got:?}")] - BlockHashMismatch { expected: B256, got: B256 }, - - #[error("parent hash mismatch, expected {expected:?}, got {got:?}")] - ParentHashMismatch { expected: B256, got: B256 }, - - #[error("state root mismatch, expected {expected:?}, got {got:?}")] - StateRootMismatch { expected: B256, got: B256 }, - - #[error("transactions root mismatch, expected {expected:?}, got {got:?}")] - TransactionsRootMismatch { expected: B256, got: B256 }, - - #[error("receipts root mismatch, expected {expected:?}, got {got:?}")] - ReceiptsRootMismatch { expected: B256, got: B256 }, - - #[error("gas used mismatch, expected {expected}, got {got}")] - GasUsedMismatch { expected: u64, got: u64 }, - - #[error("gas limit mismatch, expected {expected}, got {got}")] - GasLimitMismatch { expected: u64, got: u64 }, - - #[error("total frags mismatch, expected {expected}, got {got}")] - TotalFragsMismatch { expected: u64, got: u64 }, } \ No newline at end of file diff --git a/based/crates/reth/src/error.rs b/based/crates/reth/src/error.rs new file mode 100644 index 000000000..608ef8ac9 --- /dev/null +++ b/based/crates/reth/src/error.rs @@ -0,0 +1,99 @@ +use alloy_eips::eip2718::Eip2718Error; +use alloy_primitives::B256; +use thiserror::Error; + +#[derive(Debug, Error)] +pub enum DriverError { + #[error("failed to send command to driver task (task not running)")] + DriverGone, + + #[error("failed to receive response from driver task (response dropped)")] + ResponseDropped, + + #[error("driver not initialized, call env_v0 first")] + NotInitialized, + + #[error("cannot open a new unsealed block while there's one already in progress (current={current}, incoming={incoming})")] + UnsealedBlockInProgress { + current: u64, + incoming: u64, + }, + + #[error("seal mismatch: {what}")] + SealMismatch { what: String }, + + #[error(transparent)] + Exec(#[from] ExecError), + + #[error(transparent)] + Other(#[from] anyhow::Error), + + #[error(transparent)] + UnsealedBlock(#[from] UnsealedBlockError), + + #[error(transparent)] + ValidateSeal(#[from] ValidateSealError), +} + +#[derive(Debug, Error)] +pub enum ValidateSealError { + #[error("block hash mismatch, expected {expected:?}, got {got:?}")] + BlockHashMismatch { expected: B256, got: B256 }, + + #[error("parent hash mismatch, expected {expected:?}, got {got:?}")] + ParentHashMismatch { expected: B256, got: B256 }, + + #[error("state root mismatch, expected {expected:?}, got {got:?}")] + StateRootMismatch { expected: B256, got: B256 }, + + #[error("transactions root mismatch, expected {expected:?}, got {got:?}")] + TransactionsRootMismatch { expected: B256, got: B256 }, + + #[error("receipts root mismatch, expected {expected:?}, got {got:?}")] + ReceiptsRootMismatch { expected: B256, got: B256 }, + + #[error("gas used mismatch, expected {expected}, got {got}")] + GasUsedMismatch { expected: u64, got: u64 }, + + #[error("gas limit mismatch, expected {expected}, got {got}")] + GasLimitMismatch { expected: u64, got: u64 }, + + #[error("total frags mismatch, expected {expected}, got {got}")] + TotalFragsMismatch { expected: u64, got: u64 }, +} + + +#[derive(Debug, Error)] +pub enum UnsealedBlockError { + #[error("failed to decode EIP-2718 tx at index {index}")] + TxDecode { + index: usize, + #[source] + source: Eip2718Error, + }, + + #[error("stale frag (older block): frag.block={frag_block} < env.number={env_number}")] + StaleFrag { frag_block: u64, env_number: u64 }, + + #[error("frag is not applicable to current unsealed env: frag.block={frag_block} env.number={env_number}")] + WrongBlock { frag_block: u64, env_number: u64 }, + + #[error("frag sequencing violation: expected next seq, got {got}, last={last:?}")] + SeqMismatch { got: u64, last: Option }, + + #[error("received frag after last frag already accepted")] + AlreadyEnded, +} + + +#[derive(Debug, Error)] +pub enum ExecError { + #[error("executor not initialized")] + NotInitialized, + + #[error("execution failed: {0}")] + Failed(String), + + #[error("seal failed: {0}")] + SealFailed(String), +} \ No newline at end of file diff --git a/based/crates/reth/src/exec.rs b/based/crates/reth/src/exec.rs index 210133785..3e9578f86 100644 --- a/based/crates/reth/src/exec.rs +++ b/based/crates/reth/src/exec.rs @@ -3,22 +3,10 @@ use std::future::Future; use alloy_primitives::{BlockNumber, B256}; use alloy_rpc_types::{Block, Log, TransactionReceipt}; use bop_common::p2p::{EnvV0, FragV0}; -use thiserror::Error; +use crate::error::ExecError; use crate::unsealed_block::UnsealedBlock; -#[derive(Debug, Error)] -pub enum ExecError { - #[error("executor not initialized")] - NotInitialized, - - #[error("execution failed: {0}")] - Failed(String), - - #[error("seal failed: {0}")] - SealFailed(String), -} - #[derive(Debug, Clone)] pub struct ExecOutput { pub receipts: Vec, @@ -34,7 +22,7 @@ pub trait UnsealedExecutor: Send { /// Execute all txs in `frag` on top of current overlay state. /// - /// MUST be cumulative: txs execute after all previous frags' txs. + /// MUST be cumulative: txs execute after all previous frags's txs. fn execute_frag<'a>( &'a mut self, ub: &'a UnsealedBlock, diff --git a/based/crates/reth/src/lib.rs b/based/crates/reth/src/lib.rs index adc2ab787..b3ef9922d 100644 --- a/based/crates/reth/src/lib.rs +++ b/based/crates/reth/src/lib.rs @@ -1,4 +1,4 @@ pub mod unsealed_block; pub mod driver; pub mod exec; -mod reth_executor; +mod error; diff --git a/based/crates/reth/src/unsealed_block.rs b/based/crates/reth/src/unsealed_block.rs index c58202d64..bd4f3bbb1 100644 --- a/based/crates/reth/src/unsealed_block.rs +++ b/based/crates/reth/src/unsealed_block.rs @@ -1,31 +1,9 @@ use alloy_consensus::{Header, TxEnvelope}; -use alloy_eips::eip2718::{Decodable2718, Eip2718Error}; -use alloy_primitives::{B256, Bytes, FixedBytes}; +use alloy_eips::eip2718::{Decodable2718}; +use alloy_primitives::{B256, Bytes}; use alloy_rpc_types::{Log, TransactionReceipt}; use bop_common::p2p::{EnvV0, FragV0, Transaction as TxBytes}; -use thiserror::Error; - -#[derive(Debug, Error)] -pub enum UnsealedBlockError { - #[error("failed to decode EIP-2718 tx at index {index}")] - TxDecode { - index: usize, - #[source] - source: Eip2718Error, - }, - - #[error("stale frag (older block): frag.block={frag_block} < env.number={env_number}")] - StaleFrag { frag_block: u64, env_number: u64 }, - - #[error("frag is not applicable to current unsealed env: frag.block={frag_block} env.number={env_number}")] - WrongBlock { frag_block: u64, env_number: u64 }, - - #[error("frag sequencing violation: expected next seq, got {got}, last={last:?}")] - SeqMismatch { got: u64, last: Option }, - - #[error("received frag after last frag already accepted")] - AlreadyEnded, -} +use crate::error::UnsealedBlockError; pub struct UnsealedBlock { /// Block environment. From a0b89e805be20d5cfdcff4717aa47cdabcacca33 Mon Sep 17 00:00:00 2001 From: Ki Ageng Satria Pamungkas Date: Wed, 17 Dec 2025 21:39:51 +0700 Subject: [PATCH 06/25] remove sync --- based/crates/reth/src/driver.rs | 63 ++++++++++--------------- based/crates/reth/src/exec.rs | 84 ++++++++++++++++++--------------- 2 files changed, 69 insertions(+), 78 deletions(-) diff --git a/based/crates/reth/src/driver.rs b/based/crates/reth/src/driver.rs index 879e8020b..300d18b2d 100644 --- a/based/crates/reth/src/driver.rs +++ b/based/crates/reth/src/driver.rs @@ -2,14 +2,14 @@ use std::time::Instant; use alloy_primitives::B256; use alloy_rpc_types::Block; -use anyhow::Context; use tokio::sync::{mpsc, oneshot}; use tracing::{error, info}; use bop_common::p2p::{EnvV0, FragV0, SealV0}; + use crate::error::{DriverError, ValidateSealError}; use crate::exec::{apply_exec_output, UnsealedExecutor}; -use crate::unsealed_block::{UnsealedBlock}; +use crate::unsealed_block::UnsealedBlock; #[derive(Debug, Clone, Copy)] pub enum FragStatus { @@ -22,7 +22,6 @@ pub struct Driver { tx: mpsc::Sender, } - impl From> for DriverError { fn from(_: mpsc::error::SendError) -> Self { DriverError::DriverGone @@ -75,15 +74,13 @@ pub struct HeaderView { pub struct DriverInner { pub enabled_unsealed_as_latest: bool, - pub current_unsealed_block: Option, pub exec: E, - pub fcu_count_since_unseal_reset: usize, } impl Driver { - pub fn spawn(inner: DriverInner) -> Self { + pub fn spawn(inner: DriverInner) -> Self { let (tx, mut rx) = mpsc::channel::(256); tokio::spawn(async move { @@ -124,9 +121,7 @@ impl Driver { pub async fn new_frag_v0(&self, frag: FragV0) -> Result { let (resp_tx, resp_rx) = oneshot::channel(); - self.tx - .send(Cmd::NewFragV0 { frag, resp: resp_tx }) - .await?; + self.tx.send(Cmd::NewFragV0 { frag, resp: resp_tx }).await?; resp_rx.await?.into_result() } @@ -139,10 +134,7 @@ impl Driver { pub async fn forkchoice_updated(&self, new_block_number: u64) -> Result<(), DriverError> { let (resp_tx, resp_rx) = oneshot::channel(); self.tx - .send(Cmd::ForkchoiceUpdated { - new_block_number, - resp: resp_tx, - }) + .send(Cmd::ForkchoiceUpdated { new_block_number, resp: resp_tx }) .await?; resp_rx.await?.into_result() } @@ -151,21 +143,12 @@ impl Driver { let (resp_tx, resp_rx) = oneshot::channel(); if self.tx.send(Cmd::GetHeaderView { resp: resp_tx }).await.is_err() { - return HeaderView { - enabled: false, - header: None, - }; + return HeaderView { enabled: false, header: None }; } match resp_rx.await { - Ok(reply) => reply.into_result().unwrap_or(HeaderView { - enabled: false, - header: None, - }), - Err(_) => HeaderView { - enabled: false, - header: None, - }, + Ok(reply) => reply.into_result().unwrap_or(HeaderView { enabled: false, header: None }), + Err(_) => HeaderView { enabled: false, header: None }, } } } @@ -191,10 +174,10 @@ impl DriverInner { } info!(old = current_num, new = env.number, "env advanced, resetting"); - self.reset_current_unsealed_block() + self.reset_current_unsealed_block(); } - self.exec.ensure_env(&env).context("exec.ensure_env")?; + self.exec.ensure_env(&env).await?; self.current_unsealed_block = Some(UnsealedBlock::new(env)); self.fcu_count_since_unseal_reset = 0; Ok(()) @@ -281,9 +264,10 @@ impl DriverInner { } let presealed_block = self.exec.get_block(seal.block_hash, seal.block_number).await?; - self.validate_seal_frag_v0(&presealed_block, &ub, seal).await?; - self.exec.set_canonical(&presealed_block).await.context("sealFragV0")?; + self.validate_seal_frag_v0(&presealed_block, ub, &seal)?; + + self.exec.set_canonical(&presealed_block).await?; self.reset_current_unsealed_block(); @@ -291,7 +275,12 @@ impl DriverInner { Ok(()) } - async fn validate_seal_frag_v0(&self, presealed_block: &Block, ub: &UnsealedBlock, seal: SealV0) -> Result<(), ValidateSealError> { + fn validate_seal_frag_v0( + &self, + presealed_block: &Block, + ub: &UnsealedBlock, + seal: &SealV0, + ) -> Result<(), ValidateSealError> { let expected_block_hash: B256 = presealed_block.header.hash.into(); if expected_block_hash != seal.block_hash { return Err(ValidateSealError::BlockHashMismatch { @@ -355,20 +344,16 @@ impl DriverInner { got: seal.total_frags, }); } + Ok(()) } fn get_header_view(&self) -> HeaderView { if !self.enabled_unsealed_as_latest { - return HeaderView { - enabled: false, - header: None, - }; + return HeaderView { enabled: false, header: None }; } - let header = self - .current_unsealed_block - .as_ref() - .map(|ub| ub.temp_header()); + + let header = self.current_unsealed_block.as_ref().map(|ub| ub.temp_header()); HeaderView { enabled: true, header } } -} \ No newline at end of file +} diff --git a/based/crates/reth/src/exec.rs b/based/crates/reth/src/exec.rs index 3e9578f86..84e959309 100644 --- a/based/crates/reth/src/exec.rs +++ b/based/crates/reth/src/exec.rs @@ -18,32 +18,32 @@ pub struct ExecOutput { /// Everything else is just state-machine + bookkeeping. pub trait UnsealedExecutor: Send { /// Ensure the executor context is ready for this env (initialize overlay state, block env, etc.) - fn ensure_env(&mut self, env: &EnvV0) -> Result<(), ExecError>; + fn ensure_env(&mut self, env: &EnvV0) -> impl Future> + Send + '_; /// Execute all txs in `frag` on top of current overlay state. /// /// MUST be cumulative: txs execute after all previous frags's txs. - fn execute_frag<'a>( - &'a mut self, - ub: &'a UnsealedBlock, - frag: &'a FragV0, - ) -> impl Future> + Send + 'a; - - fn set_canonical<'a>( - &'a mut self, - b: &'a Block, - ) -> impl Future> + Send + 'a; - - fn seal<'a>( - &'a mut self, - ub: &'a UnsealedBlock, - ) -> impl Future> + Send + 'a; - - fn get_block<'a>( - &'a self, + fn execute_frag( + &mut self, + ub: &UnsealedBlock, + frag: &FragV0, + ) -> impl Future> + Send + '_; + + fn seal( + &mut self, + ub: &UnsealedBlock, + ) -> impl Future> + Send + '_; + + fn set_canonical( + &mut self, + b: &Block, + ) -> impl Future> + Send + '_; + + fn get_block( + &self, hash: B256, number: BlockNumber, - ) -> impl Future> + Send + 'a; + ) -> impl Future> + Send + '_; /// Reset overlay state completely. fn reset(&mut self); @@ -61,37 +61,43 @@ pub fn apply_exec_output(ub: &mut UnsealedBlock, out: ExecOutput) { pub struct NoopExecutor; impl UnsealedExecutor for NoopExecutor { - fn ensure_env(&mut self, _env: &EnvV0) -> Result<(), ExecError> { - Ok(()) + fn ensure_env(&mut self, _env: &EnvV0) -> impl Future> + Send + '_ { + async move { Ok(()) } } - fn execute_frag<'a>( - &'a mut self, - _ub: &'a UnsealedBlock, - _frag: &'a FragV0, - ) -> impl Future> + Send + 'a { - async move { Ok(ExecOutput { receipts: vec![], logs: vec![], gas_used_delta: 0 }) } + fn execute_frag( + &mut self, + _ub: &UnsealedBlock, + _frag: &FragV0, + ) -> impl Future> + Send + '_ { + async move { + Ok(ExecOutput { + receipts: vec![], + logs: vec![], + gas_used_delta: 0, + }) + } } - fn set_canonical<'a>( - &'a mut self, - _b: &'a Block, - ) -> impl Future> + Send + 'a { + fn seal( + &mut self, + _ub: &UnsealedBlock, + ) -> impl Future> + Send + '_ { async move { Ok(()) } } - fn seal<'a>( - &'a mut self, - _ub: &'a UnsealedBlock, - ) -> impl Future> + Send + 'a { + fn set_canonical( + &mut self, + _b: &Block, + ) -> impl Future> + Send + '_ { async move { Ok(()) } } - fn get_block<'a>( - &'a self, + fn get_block( + &self, _hash: B256, _number: BlockNumber, - ) -> impl Future> + Send + 'a { + ) -> impl Future> + Send + '_ { async move { Ok(Block::default()) } } From 3fb23e9c2b8bb44ece54585d892003170e181ee1 Mon Sep 17 00:00:00 2001 From: Ki Ageng Satria Pamungkas Date: Wed, 17 Dec 2025 21:44:53 +0700 Subject: [PATCH 07/25] add docs --- based/crates/reth/src/driver.rs | 47 ++++++++++++++++++++++++++++----- 1 file changed, 41 insertions(+), 6 deletions(-) diff --git a/based/crates/reth/src/driver.rs b/based/crates/reth/src/driver.rs index 300d18b2d..363998ba3 100644 --- a/based/crates/reth/src/driver.rs +++ b/based/crates/reth/src/driver.rs @@ -11,12 +11,14 @@ use crate::error::{DriverError, ValidateSealError}; use crate::exec::{apply_exec_output, UnsealedExecutor}; use crate::unsealed_block::UnsealedBlock; +/// Result of submitting a frag to the driver. #[derive(Debug, Clone, Copy)] pub enum FragStatus { Valid, Invalid, } +/// Actor handle for sending unsealed-block commands to the driver task. #[derive(Clone)] pub struct Driver { tx: mpsc::Sender, @@ -72,6 +74,8 @@ pub struct HeaderView { pub header: Option, } +/// Single-threaded state owned by the driver task (unsealed block + executor + counters). +/// Essentialy should be implemented using based-op-reth pub struct DriverInner { pub enabled_unsealed_as_latest: bool, pub current_unsealed_block: Option, @@ -80,6 +84,7 @@ pub struct DriverInner { } impl Driver { + /// Spawns the driver actor task and returns a handle used to send commands to it. pub fn spawn(inner: DriverInner) -> Self { let (tx, mut rx) = mpsc::channel::(256); @@ -113,42 +118,64 @@ impl Driver { Self { tx } } + /// Starts a new unsealed block execution context for the given environment. pub async fn env_v0(&self, env: EnvV0) -> Result<(), DriverError> { let (resp_tx, resp_rx) = oneshot::channel(); self.tx.send(Cmd::EnvV0 { env, resp: resp_tx }).await?; resp_rx.await?.into_result() } + /// Executes and records a fragment against the current unsealed block. pub async fn new_frag_v0(&self, frag: FragV0) -> Result { let (resp_tx, resp_rx) = oneshot::channel(); self.tx.send(Cmd::NewFragV0 { frag, resp: resp_tx }).await?; resp_rx.await?.into_result() } + /// Validates and finalizes the current unsealed block using the provided seal. pub async fn seal_frag_v0(&self, seal_v0: SealV0) -> Result<(), DriverError> { let (resp_tx, resp_rx) = oneshot::channel(); - self.tx.send(Cmd::SealFragV0 { resp: resp_tx, seal: seal_v0 }).await?; + self.tx + .send(Cmd::SealFragV0 { + resp: resp_tx, + seal: seal_v0, + }) + .await?; resp_rx.await?.into_result() } + /// Notifies the driver about a forkchoice update and resets state on mismatch. pub async fn forkchoice_updated(&self, new_block_number: u64) -> Result<(), DriverError> { let (resp_tx, resp_rx) = oneshot::channel(); self.tx - .send(Cmd::ForkchoiceUpdated { new_block_number, resp: resp_tx }) + .send(Cmd::ForkchoiceUpdated { + new_block_number, + resp: resp_tx, + }) .await?; resp_rx.await?.into_result() } + /// Returns a best-effort view of the current unsealed header used as "latest" when enabled. pub async fn header_view(&self) -> HeaderView { let (resp_tx, resp_rx) = oneshot::channel(); if self.tx.send(Cmd::GetHeaderView { resp: resp_tx }).await.is_err() { - return HeaderView { enabled: false, header: None }; + return HeaderView { + enabled: false, + header: None, + }; } match resp_rx.await { - Ok(reply) => reply.into_result().unwrap_or(HeaderView { enabled: false, header: None }), - Err(_) => HeaderView { enabled: false, header: None }, + Ok(reply) => reply.into_result().unwrap_or(HeaderView { + enabled: false, + header: None, + }), + Err(_) => HeaderView { + enabled: false, + header: None, + }, } } } @@ -263,7 +290,15 @@ impl DriverInner { return Ok(()); } - let presealed_block = self.exec.get_block(seal.block_hash, seal.block_number).await?; + let presealed_block = self.exec.get_block(seal.block_hash, seal.block_number).await; + + let presealed_block = match presealed_block { + Ok(b) => b, + Err(e) => { + self.reset_current_unsealed_block(); + return Err(DriverError::from(e)); + } + }; self.validate_seal_frag_v0(&presealed_block, ub, &seal)?; From e85de73f50686ae2e545980e37e9c30840db4645 Mon Sep 17 00:00:00 2001 From: Ki Ageng Satria Pamungkas Date: Wed, 17 Dec 2025 21:49:47 +0700 Subject: [PATCH 08/25] fmted --- based/crates/reth/src/driver.rs | 92 ++++++------------------- based/crates/reth/src/error.rs | 13 ++-- based/crates/reth/src/exec.rs | 39 +++-------- based/crates/reth/src/lib.rs | 4 +- based/crates/reth/src/unsealed_block.rs | 40 ++++------- 5 files changed, 48 insertions(+), 140 deletions(-) diff --git a/based/crates/reth/src/driver.rs b/based/crates/reth/src/driver.rs index 363998ba3..41098287f 100644 --- a/based/crates/reth/src/driver.rs +++ b/based/crates/reth/src/driver.rs @@ -2,14 +2,15 @@ use std::time::Instant; use alloy_primitives::B256; use alloy_rpc_types::Block; +use bop_common::p2p::{EnvV0, FragV0, SealV0}; use tokio::sync::{mpsc, oneshot}; use tracing::{error, info}; -use bop_common::p2p::{EnvV0, FragV0, SealV0}; - -use crate::error::{DriverError, ValidateSealError}; -use crate::exec::{apply_exec_output, UnsealedExecutor}; -use crate::unsealed_block::UnsealedBlock; +use crate::{ + error::{DriverError, ValidateSealError}, + exec::{UnsealedExecutor, apply_exec_output}, + unsealed_block::UnsealedBlock, +}; /// Result of submitting a frag to the driver. #[derive(Debug, Clone, Copy)] @@ -102,10 +103,7 @@ impl Driver { Cmd::SealFragV0 { seal, resp } => { respond(resp, inner.handle_seal_frag_v0(seal).await); } - Cmd::ForkchoiceUpdated { - new_block_number, - resp, - } => { + Cmd::ForkchoiceUpdated { new_block_number, resp } => { respond(resp, inner.handle_forkchoice_updated(new_block_number).await); } Cmd::GetHeaderView { resp } => { @@ -135,24 +133,14 @@ impl Driver { /// Validates and finalizes the current unsealed block using the provided seal. pub async fn seal_frag_v0(&self, seal_v0: SealV0) -> Result<(), DriverError> { let (resp_tx, resp_rx) = oneshot::channel(); - self.tx - .send(Cmd::SealFragV0 { - resp: resp_tx, - seal: seal_v0, - }) - .await?; + self.tx.send(Cmd::SealFragV0 { resp: resp_tx, seal: seal_v0 }).await?; resp_rx.await?.into_result() } /// Notifies the driver about a forkchoice update and resets state on mismatch. pub async fn forkchoice_updated(&self, new_block_number: u64) -> Result<(), DriverError> { let (resp_tx, resp_rx) = oneshot::channel(); - self.tx - .send(Cmd::ForkchoiceUpdated { - new_block_number, - resp: resp_tx, - }) - .await?; + self.tx.send(Cmd::ForkchoiceUpdated { new_block_number, resp: resp_tx }).await?; resp_rx.await?.into_result() } @@ -161,21 +149,12 @@ impl Driver { let (resp_tx, resp_rx) = oneshot::channel(); if self.tx.send(Cmd::GetHeaderView { resp: resp_tx }).await.is_err() { - return HeaderView { - enabled: false, - header: None, - }; + return HeaderView { enabled: false, header: None }; } match resp_rx.await { - Ok(reply) => reply.into_result().unwrap_or(HeaderView { - enabled: false, - header: None, - }), - Err(_) => HeaderView { - enabled: false, - header: None, - }, + Ok(reply) => reply.into_result().unwrap_or(HeaderView { enabled: false, header: None }), + Err(_) => HeaderView { enabled: false, header: None }, } } } @@ -194,10 +173,7 @@ impl DriverInner { let current_num = current.env.number; if current_num >= env.number { - return Err(DriverError::UnsealedBlockInProgress { - current: current_num, - incoming: env.number, - }); + return Err(DriverError::UnsealedBlockInProgress { current: current_num, incoming: env.number }); } info!(old = current_num, new = env.number, "env advanced, resetting"); @@ -218,11 +194,7 @@ impl DriverInner { }; if ub.env.number != new_block_number { - info!( - old = ub.env.number, - new = new_block_number, - "forkchoiceUpdated block mismatch: resetting unsealed" - ); + info!(old = ub.env.number, new = new_block_number, "forkchoiceUpdated block mismatch: resetting unsealed"); self.reset_current_unsealed_block(); } @@ -239,11 +211,7 @@ impl DriverInner { info!(for_block = frag.block_number, current = ub.env.number, "new frag received"); if frag.block_number < ub.env.number { - info!( - frag_block = frag.block_number, - env_number = ub.env.number, - "stale frag (older block), ignoring" - ); + info!(frag_block = frag.block_number, env_number = ub.env.number, "stale frag (older block), ignoring"); return Ok(FragStatus::Valid); } @@ -318,26 +286,17 @@ impl DriverInner { ) -> Result<(), ValidateSealError> { let expected_block_hash: B256 = presealed_block.header.hash.into(); if expected_block_hash != seal.block_hash { - return Err(ValidateSealError::BlockHashMismatch { - expected: expected_block_hash, - got: seal.block_hash, - }); + return Err(ValidateSealError::BlockHashMismatch { expected: expected_block_hash, got: seal.block_hash }); } let expected_parent_hash = presealed_block.header.parent_hash; if expected_parent_hash != seal.parent_hash { - return Err(ValidateSealError::ParentHashMismatch { - expected: expected_parent_hash, - got: seal.parent_hash, - }); + return Err(ValidateSealError::ParentHashMismatch { expected: expected_parent_hash, got: seal.parent_hash }); } let expected_state_root = presealed_block.header.state_root; if expected_state_root != seal.state_root { - return Err(ValidateSealError::StateRootMismatch { - expected: expected_state_root, - got: seal.state_root, - }); + return Err(ValidateSealError::StateRootMismatch { expected: expected_state_root, got: seal.state_root }); } let expected_tx_root = presealed_block.header.transactions_root; @@ -358,26 +317,17 @@ impl DriverInner { let expected_gas_used = presealed_block.header.gas_used; if expected_gas_used != seal.gas_used { - return Err(ValidateSealError::GasUsedMismatch { - expected: expected_gas_used, - got: seal.gas_used, - }); + return Err(ValidateSealError::GasUsedMismatch { expected: expected_gas_used, got: seal.gas_used }); } let expected_gas_limit = presealed_block.header.gas_limit; if expected_gas_limit != seal.gas_limit { - return Err(ValidateSealError::GasLimitMismatch { - expected: expected_gas_limit, - got: seal.gas_limit, - }); + return Err(ValidateSealError::GasLimitMismatch { expected: expected_gas_limit, got: seal.gas_limit }); } let expected_total_frags = ub.frags.len() as u64; if expected_total_frags != seal.total_frags { - return Err(ValidateSealError::TotalFragsMismatch { - expected: expected_total_frags, - got: seal.total_frags, - }); + return Err(ValidateSealError::TotalFragsMismatch { expected: expected_total_frags, got: seal.total_frags }); } Ok(()) diff --git a/based/crates/reth/src/error.rs b/based/crates/reth/src/error.rs index 608ef8ac9..96778fa2a 100644 --- a/based/crates/reth/src/error.rs +++ b/based/crates/reth/src/error.rs @@ -13,11 +13,10 @@ pub enum DriverError { #[error("driver not initialized, call env_v0 first")] NotInitialized, - #[error("cannot open a new unsealed block while there's one already in progress (current={current}, incoming={incoming})")] - UnsealedBlockInProgress { - current: u64, - incoming: u64, - }, + #[error( + "cannot open a new unsealed block while there's one already in progress (current={current}, incoming={incoming})" + )] + UnsealedBlockInProgress { current: u64, incoming: u64 }, #[error("seal mismatch: {what}")] SealMismatch { what: String }, @@ -62,7 +61,6 @@ pub enum ValidateSealError { TotalFragsMismatch { expected: u64, got: u64 }, } - #[derive(Debug, Error)] pub enum UnsealedBlockError { #[error("failed to decode EIP-2718 tx at index {index}")] @@ -85,7 +83,6 @@ pub enum UnsealedBlockError { AlreadyEnded, } - #[derive(Debug, Error)] pub enum ExecError { #[error("executor not initialized")] @@ -96,4 +93,4 @@ pub enum ExecError { #[error("seal failed: {0}")] SealFailed(String), -} \ No newline at end of file +} diff --git a/based/crates/reth/src/exec.rs b/based/crates/reth/src/exec.rs index 84e959309..e116d699f 100644 --- a/based/crates/reth/src/exec.rs +++ b/based/crates/reth/src/exec.rs @@ -1,11 +1,10 @@ use std::future::Future; -use alloy_primitives::{BlockNumber, B256}; +use alloy_primitives::{B256, BlockNumber}; use alloy_rpc_types::{Block, Log, TransactionReceipt}; use bop_common::p2p::{EnvV0, FragV0}; -use crate::error::ExecError; -use crate::unsealed_block::UnsealedBlock; +use crate::{error::ExecError, unsealed_block::UnsealedBlock}; #[derive(Debug, Clone)] pub struct ExecOutput { @@ -29,21 +28,11 @@ pub trait UnsealedExecutor: Send { frag: &FragV0, ) -> impl Future> + Send + '_; - fn seal( - &mut self, - ub: &UnsealedBlock, - ) -> impl Future> + Send + '_; + fn seal(&mut self, ub: &UnsealedBlock) -> impl Future> + Send + '_; - fn set_canonical( - &mut self, - b: &Block, - ) -> impl Future> + Send + '_; + fn set_canonical(&mut self, b: &Block) -> impl Future> + Send + '_; - fn get_block( - &self, - hash: B256, - number: BlockNumber, - ) -> impl Future> + Send + '_; + fn get_block(&self, hash: B256, number: BlockNumber) -> impl Future> + Send + '_; /// Reset overlay state completely. fn reset(&mut self); @@ -70,26 +59,14 @@ impl UnsealedExecutor for NoopExecutor { _ub: &UnsealedBlock, _frag: &FragV0, ) -> impl Future> + Send + '_ { - async move { - Ok(ExecOutput { - receipts: vec![], - logs: vec![], - gas_used_delta: 0, - }) - } + async move { Ok(ExecOutput { receipts: vec![], logs: vec![], gas_used_delta: 0 }) } } - fn seal( - &mut self, - _ub: &UnsealedBlock, - ) -> impl Future> + Send + '_ { + fn seal(&mut self, _ub: &UnsealedBlock) -> impl Future> + Send + '_ { async move { Ok(()) } } - fn set_canonical( - &mut self, - _b: &Block, - ) -> impl Future> + Send + '_ { + fn set_canonical(&mut self, _b: &Block) -> impl Future> + Send + '_ { async move { Ok(()) } } diff --git a/based/crates/reth/src/lib.rs b/based/crates/reth/src/lib.rs index b3ef9922d..f5744d6ca 100644 --- a/based/crates/reth/src/lib.rs +++ b/based/crates/reth/src/lib.rs @@ -1,4 +1,4 @@ -pub mod unsealed_block; pub mod driver; -pub mod exec; mod error; +pub mod exec; +pub mod unsealed_block; diff --git a/based/crates/reth/src/unsealed_block.rs b/based/crates/reth/src/unsealed_block.rs index bd4f3bbb1..387c67d31 100644 --- a/based/crates/reth/src/unsealed_block.rs +++ b/based/crates/reth/src/unsealed_block.rs @@ -1,8 +1,9 @@ use alloy_consensus::{Header, TxEnvelope}; -use alloy_eips::eip2718::{Decodable2718}; +use alloy_eips::eip2718::Decodable2718; use alloy_primitives::{B256, Bytes}; use alloy_rpc_types::{Log, TransactionReceipt}; use bop_common::p2p::{EnvV0, FragV0, Transaction as TxBytes}; + use crate::error::UnsealedBlockError; pub struct UnsealedBlock { @@ -55,11 +56,7 @@ impl UnsealedBlock { let Some(last_known) = self.frags.get(last_seq as usize) else { return false; }; - if last_known.is_last { - false - } else { - last_known.seq + 1 == f.seq - } + if last_known.is_last { false } else { last_known.seq + 1 == f.seq } } } } @@ -70,17 +67,12 @@ impl UnsealedBlock { } /// Decoded txs iterator (lazy decode) - pub fn transactions_iter_decoded( - &self, - ) -> impl Iterator> + '_ { - self.transactions_iter_bytes() - .enumerate() - .map(|(index, tx)| { - // allocate a Vec to decode from - let raw: Vec = tx.iter().copied().collect(); - TxEnvelope::decode_2718_exact(&raw) - .map_err(|source| UnsealedBlockError::TxDecode { index, source }) - }) + pub fn transactions_iter_decoded(&self) -> impl Iterator> + '_ { + self.transactions_iter_bytes().enumerate().map(|(index, tx)| { + // allocate a Vec to decode from + let raw: Vec = tx.iter().copied().collect(); + TxEnvelope::decode_2718_exact(&raw).map_err(|source| UnsealedBlockError::TxDecode { index, source }) + }) } /// Decoded txs (allocates Vec), like Go `Transactions()` but decoded @@ -90,9 +82,7 @@ impl UnsealedBlock { /// Raw tx bytes (allocates Vec>), like Go `ByteTransactions()` pub fn byte_transactions(&self) -> Vec> { - self.transactions_iter_bytes() - .map(|tx| tx.iter().copied().collect::>()) - .collect() + self.transactions_iter_bytes().map(|tx| tx.iter().copied().collect::>()).collect() } // Return the last frag on the list. @@ -112,18 +102,12 @@ impl UnsealedBlock { /// Validate frag against current state (equivalent to your ValidateNewFragV0 + sequencing gate). pub fn validate_new_frag(&self, f: &FragV0) -> Result<(), UnsealedBlockError> { if f.block_number < self.env.number { - return Err(UnsealedBlockError::StaleFrag { - frag_block: f.block_number, - env_number: self.env.number, - }); + return Err(UnsealedBlockError::StaleFrag { frag_block: f.block_number, env_number: self.env.number }); } // must target current block if f.block_number > self.env.number { - return Err(UnsealedBlockError::WrongBlock { - frag_block: f.block_number, - env_number: self.env.number, - }); + return Err(UnsealedBlockError::WrongBlock { frag_block: f.block_number, env_number: self.env.number }); } // sequencing From 7f397e294ecb1b5a43b20335348ea11a4e5318e2 Mon Sep 17 00:00:00 2001 From: Ki Ageng Satria Pamungkas Date: Wed, 17 Dec 2025 21:58:26 +0700 Subject: [PATCH 09/25] add derive --- based/crates/reth/src/driver.rs | 1 + based/crates/reth/src/unsealed_block.rs | 1 + 2 files changed, 2 insertions(+) diff --git a/based/crates/reth/src/driver.rs b/based/crates/reth/src/driver.rs index 41098287f..378738bea 100644 --- a/based/crates/reth/src/driver.rs +++ b/based/crates/reth/src/driver.rs @@ -77,6 +77,7 @@ pub struct HeaderView { /// Single-threaded state owned by the driver task (unsealed block + executor + counters). /// Essentialy should be implemented using based-op-reth +#[derive(Debug)] pub struct DriverInner { pub enabled_unsealed_as_latest: bool, pub current_unsealed_block: Option, diff --git a/based/crates/reth/src/unsealed_block.rs b/based/crates/reth/src/unsealed_block.rs index 387c67d31..8f8145ed5 100644 --- a/based/crates/reth/src/unsealed_block.rs +++ b/based/crates/reth/src/unsealed_block.rs @@ -6,6 +6,7 @@ use bop_common::p2p::{EnvV0, FragV0, Transaction as TxBytes}; use crate::error::UnsealedBlockError; +#[derive(Debug, Clone)] pub struct UnsealedBlock { /// Block environment. pub env: EnvV0, From d98d58f55da2b96cc450695a21d04f2949cff4e6 Mon Sep 17 00:00:00 2001 From: Jonas Bostoen Date: Thu, 18 Dec 2025 12:16:43 +0100 Subject: [PATCH 10/25] feat: scaffold reth node --- based/Cargo.lock | 4659 +++++++++++++++++++++++++++------- based/crates/reth/Cargo.toml | 17 +- based/crates/reth/src/cli.rs | 55 + based/crates/reth/src/lib.rs | 1 + 4 files changed, 3777 insertions(+), 955 deletions(-) create mode 100644 based/crates/reth/src/cli.rs diff --git a/based/Cargo.lock b/based/Cargo.lock index 5c3c6ddf7..a5e5531a1 100644 --- a/based/Cargo.lock +++ b/based/Cargo.lock @@ -1586,7 +1586,7 @@ dependencies = [ "op-alloy-rpc-types-engine", "parking_lot", "reqwest", - "reth-rpc-layer", + "reth-rpc-layer 1.9.2", "serde", "serde_json", "tokio", @@ -1612,7 +1612,7 @@ dependencies = [ "op-alloy-rpc-types-engine", "parking_lot", "reqwest", - "reth-rpc-layer", + "reth-rpc-layer 1.9.2", "serde", "serde_json", "thiserror 2.0.12", @@ -1832,28 +1832,28 @@ dependencies = [ "quanta", "rand 0.9.1", "reqwest", - "reth-chainspec", - "reth-cli", - "reth-db", - "reth-db-api", - "reth-evm", - "reth-execution-errors", + "reth-chainspec 1.9.2", + "reth-cli 1.9.2", + "reth-db 1.9.2", + "reth-db-api 1.9.2", + "reth-evm 1.9.2", + "reth-execution-errors 1.9.2", "reth-node-ethereum", - "reth-node-types", - "reth-optimism-chainspec", - "reth-optimism-cli", - "reth-optimism-consensus", - "reth-optimism-forks", - "reth-optimism-node", - "reth-optimism-payload-builder", - "reth-optimism-primitives", + "reth-node-types 1.9.2", + "reth-optimism-chainspec 1.9.2", + "reth-optimism-cli 1.9.2", + "reth-optimism-consensus 1.9.2", + "reth-optimism-forks 1.9.2", + "reth-optimism-node 1.9.2", + "reth-optimism-payload-builder 1.9.2", + "reth-optimism-primitives 1.9.2", "reth-primitives", - "reth-primitives-traits", - "reth-provider", - "reth-storage-api", - "reth-storage-errors", - "reth-trie-common", - "reth-trie-parallel", + "reth-primitives-traits 1.9.2", + "reth-provider 1.9.2", + "reth-storage-api 1.9.2", + "reth-storage-errors 1.9.2", + "reth-trie-common 1.9.2", + "reth-trie-parallel 1.9.2", "revm", "revm-interpreter", "revm-primitives", @@ -1891,24 +1891,24 @@ dependencies = [ "op-revm", "parking_lot", "reqwest", - "reth-chainspec", - "reth-db", - "reth-db-api", - "reth-db-common", - "reth-engine-tree", - "reth-node-types", - "reth-optimism-chainspec", - "reth-optimism-node", - "reth-optimism-primitives", + "reth-chainspec 1.9.2", + "reth-db 1.9.2", + "reth-db-api 1.9.2", + "reth-db-common 1.9.2", + "reth-engine-tree 1.9.2", + "reth-node-types 1.9.2", + "reth-optimism-chainspec 1.9.2", + "reth-optimism-node 1.9.2", + "reth-optimism-primitives 1.9.2", "reth-primitives", - "reth-provider", - "reth-stages-types", - "reth-storage-api", - "reth-storage-errors", - "reth-trie", - "reth-trie-common", - "reth-trie-db", - "reth-trie-parallel", + "reth-provider 1.9.2", + "reth-stages-types 1.9.2", + "reth-storage-api 1.9.2", + "reth-storage-errors 1.9.2", + "reth-trie 1.9.2", + "reth-trie-common 1.9.2", + "reth-trie-db 1.9.2", + "reth-trie-parallel 1.9.2", "revm-primitives", "thiserror 2.0.12", "tokio", @@ -1937,9 +1937,9 @@ dependencies = [ "op-alloy-consensus", "op-alloy-rpc-types", "reqwest", - "reth-optimism-chainspec", + "reth-optimism-chainspec 1.9.2", "reth-primitives", - "reth-rpc-builder", + "reth-rpc-builder 1.9.2", "revm-primitives", "serde", "serde_json", @@ -1979,8 +1979,8 @@ dependencies = [ "alloy-primitives", "bop-common", "op-revm", - "reth-optimism-primitives", - "reth-primitives-traits", + "reth-optimism-primitives 1.9.2", + "reth-primitives-traits 1.9.2", "revm-primitives", "rustc-hash 2.1.1", "tracing", @@ -2004,9 +2004,9 @@ dependencies = [ "op-alloy-rpc-types", "op-alloy-rpc-types-engine", "reqwest", - "reth-optimism-payload-builder", - "reth-optimism-primitives", - "reth-rpc-layer", + "reth-optimism-payload-builder 1.9.2", + "reth-optimism-primitives 1.9.2", + "reth-rpc-layer 1.9.2", "serde", "serde_json", "tokio", @@ -2041,21 +2041,21 @@ dependencies = [ "op-revm", "rand 0.9.1", "reqwest", - "reth-chainspec", - "reth-consensus", - "reth-db", - "reth-evm", - "reth-optimism-chainspec", - "reth-optimism-consensus", - "reth-optimism-evm", - "reth-optimism-forks", - "reth-optimism-payload-builder", - "reth-optimism-primitives", - "reth-optimism-txpool", + "reth-chainspec 1.9.2", + "reth-consensus 1.9.2", + "reth-db 1.9.2", + "reth-evm 1.9.2", + "reth-optimism-chainspec 1.9.2", + "reth-optimism-consensus 1.9.2", + "reth-optimism-evm 1.9.2", + "reth-optimism-forks 1.9.2", + "reth-optimism-payload-builder 1.9.2", + "reth-optimism-primitives 1.9.2", + "reth-optimism-txpool 1.9.2", "reth-primitives", - "reth-primitives-traits", - "reth-provider", - "reth-trie-common", + "reth-primitives-traits 1.9.2", + "reth-provider 1.9.2", + "reth-trie-common 1.9.2", "revm", "revm-handler", "revm-inspector", @@ -6775,7 +6775,14 @@ dependencies = [ "alloy-rpc-types", "anyhow", "bop-common", + "clap", + "eyre", + "futures", "op-alloy-rpc-types", + "reth-exex 1.9.3", + "reth-optimism-chainspec 1.9.3", + "reth-optimism-cli 1.9.3", + "reth-optimism-node 1.9.3", "thiserror 2.0.12", "tokio", "tracing", @@ -6792,15 +6799,39 @@ dependencies = [ "futures-core", "futures-util", "metrics", - "reth-chain-state", - "reth-metrics", - "reth-payload-builder", - "reth-payload-builder-primitives", - "reth-payload-primitives", - "reth-primitives-traits", - "reth-revm", - "reth-storage-api", - "reth-tasks", + "reth-chain-state 1.9.2", + "reth-metrics 1.9.2", + "reth-payload-builder 1.9.2", + "reth-payload-builder-primitives 1.9.2", + "reth-payload-primitives 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-revm 1.9.2", + "reth-storage-api 1.9.2", + "reth-tasks 1.9.2", + "tokio", + "tracing", +] + +[[package]] +name = "reth-basic-payload-builder" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "futures-core", + "futures-util", + "metrics", + "reth-chain-state 1.9.3", + "reth-metrics 1.9.3", + "reth-payload-builder 1.9.3", + "reth-payload-builder-primitives 1.9.3", + "reth-payload-primitives 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-revm 1.9.3", + "reth-storage-api 1.9.3", + "reth-tasks 1.9.3", "tokio", "tracing", ] @@ -6820,14 +6851,43 @@ dependencies = [ "parking_lot", "pin-project", "rand 0.9.1", - "reth-chainspec", - "reth-errors", - "reth-ethereum-primitives", - "reth-execution-types", - "reth-metrics", - "reth-primitives-traits", - "reth-storage-api", - "reth-trie", + "reth-chainspec 1.9.2", + "reth-errors 1.9.2", + "reth-ethereum-primitives 1.9.2", + "reth-execution-types 1.9.2", + "reth-metrics 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-storage-api 1.9.2", + "reth-trie 1.9.2", + "revm-database", + "revm-state", + "serde", + "tokio", + "tokio-stream", + "tracing", +] + +[[package]] +name = "reth-chain-state" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "derive_more", + "metrics", + "parking_lot", + "pin-project", + "rand 0.9.1", + "reth-chainspec 1.9.3", + "reth-errors 1.9.3", + "reth-ethereum-primitives 1.9.3", + "reth-execution-types 1.9.3", + "reth-metrics 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-storage-api 1.9.3", + "reth-trie 1.9.3", "revm-database", "revm-state", "serde", @@ -6850,9 +6910,29 @@ dependencies = [ "alloy-trie", "auto_impl", "derive_more", - "reth-ethereum-forks", - "reth-network-peers", - "reth-primitives-traits", + "reth-ethereum-forks 1.9.2", + "reth-network-peers 1.9.2", + "reth-primitives-traits 1.9.2", + "serde_json", +] + +[[package]] +name = "reth-chainspec" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-chains", + "alloy-consensus", + "alloy-eips", + "alloy-evm", + "alloy-genesis", + "alloy-primitives", + "alloy-trie", + "auto_impl", + "derive_more", + "reth-ethereum-forks 1.9.3", + "reth-network-peers 1.9.3", + "reth-primitives-traits 1.9.3", "serde_json", ] @@ -6864,8 +6944,22 @@ dependencies = [ "alloy-genesis", "clap", "eyre", - "reth-cli-runner", - "reth-db", + "reth-cli-runner 1.9.2", + "reth-db 1.9.2", + "serde_json", + "shellexpand", +] + +[[package]] +name = "reth-cli" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-genesis", + "clap", + "eyre", + "reth-cli-runner 1.9.3", + "reth-db 1.9.3", "serde_json", "shellexpand", ] @@ -6893,47 +6987,122 @@ dependencies = [ "lz4", "ratatui", "reqwest", - "reth-chainspec", - "reth-cli", - "reth-cli-runner", - "reth-cli-util", - "reth-codecs", - "reth-config", - "reth-consensus", - "reth-db", - "reth-db-api", - "reth-db-common", - "reth-discv4", - "reth-discv5", - "reth-downloaders", - "reth-ecies", - "reth-era", - "reth-era-downloader", - "reth-era-utils", - "reth-eth-wire", - "reth-etl", - "reth-evm", - "reth-exex", - "reth-fs-util", - "reth-net-nat", - "reth-network", - "reth-network-p2p", - "reth-network-peers", - "reth-node-api", - "reth-node-builder", - "reth-node-core", - "reth-node-events", - "reth-node-metrics", - "reth-primitives-traits", - "reth-provider", - "reth-prune", - "reth-revm", - "reth-stages", - "reth-static-file", - "reth-static-file-types", - "reth-trie", - "reth-trie-common", - "reth-trie-db", + "reth-chainspec 1.9.2", + "reth-cli 1.9.2", + "reth-cli-runner 1.9.2", + "reth-cli-util 1.9.2", + "reth-codecs 1.9.2", + "reth-config 1.9.2", + "reth-consensus 1.9.2", + "reth-db 1.9.2", + "reth-db-api 1.9.2", + "reth-db-common 1.9.2", + "reth-discv4 1.9.2", + "reth-discv5 1.9.2", + "reth-downloaders 1.9.2", + "reth-ecies 1.9.2", + "reth-era 1.9.2", + "reth-era-downloader 1.9.2", + "reth-era-utils 1.9.2", + "reth-eth-wire 1.9.2", + "reth-etl 1.9.2", + "reth-evm 1.9.2", + "reth-exex 1.9.2", + "reth-fs-util 1.9.2", + "reth-net-nat 1.9.2", + "reth-network 1.9.2", + "reth-network-p2p 1.9.2", + "reth-network-peers 1.9.2", + "reth-node-api 1.9.2", + "reth-node-builder 1.9.2", + "reth-node-core 1.9.2", + "reth-node-events 1.9.2", + "reth-node-metrics 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-provider 1.9.2", + "reth-prune 1.9.2", + "reth-revm 1.9.2", + "reth-stages 1.9.2", + "reth-static-file 1.9.2", + "reth-static-file-types 1.9.2", + "reth-trie 1.9.2", + "reth-trie-common 1.9.2", + "reth-trie-db 1.9.2", + "secp256k1 0.30.0", + "serde", + "serde_json", + "tar", + "tokio", + "tokio-stream", + "toml", + "tracing", + "zstd", +] + +[[package]] +name = "reth-cli-commands" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-chains", + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "backon", + "clap", + "comfy-table", + "crossterm", + "eyre", + "fdlimit", + "futures", + "human_bytes", + "humantime", + "itertools 0.14.0", + "lz4", + "ratatui", + "reqwest", + "reth-chainspec 1.9.3", + "reth-cli 1.9.3", + "reth-cli-runner 1.9.3", + "reth-cli-util 1.9.3", + "reth-codecs 1.9.3", + "reth-config 1.9.3", + "reth-consensus 1.9.3", + "reth-db 1.9.3", + "reth-db-api 1.9.3", + "reth-db-common 1.9.3", + "reth-discv4 1.9.3", + "reth-discv5 1.9.3", + "reth-downloaders 1.9.3", + "reth-ecies 1.9.3", + "reth-era 1.9.3", + "reth-era-downloader 1.9.3", + "reth-era-utils 1.9.3", + "reth-eth-wire 1.9.3", + "reth-etl 1.9.3", + "reth-evm 1.9.3", + "reth-exex 1.9.3", + "reth-fs-util 1.9.3", + "reth-net-nat 1.9.3", + "reth-network 1.9.3", + "reth-network-p2p 1.9.3", + "reth-network-peers 1.9.3", + "reth-node-api 1.9.3", + "reth-node-builder 1.9.3", + "reth-node-core 1.9.3", + "reth-node-events 1.9.3", + "reth-node-metrics 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-provider 1.9.3", + "reth-prune 1.9.3", + "reth-revm 1.9.3", + "reth-stages 1.9.3", + "reth-static-file 1.9.3", + "reth-static-file-types 1.9.3", + "reth-trie 1.9.3", + "reth-trie-common 1.9.3", + "reth-trie-db 1.9.3", "secp256k1 0.30.0", "serde", "serde_json", @@ -6950,7 +7119,17 @@ name = "reth-cli-runner" version = "1.9.2" source = "git+https://github.com/gattaca-com/based-op-reth?rev=b053849462eb48e61b24d965cfee59cead7f8a3b#b053849462eb48e61b24d965cfee59cead7f8a3b" dependencies = [ - "reth-tasks", + "reth-tasks 1.9.2", + "tokio", + "tracing", +] + +[[package]] +name = "reth-cli-runner" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "reth-tasks 1.9.3", "tokio", "tracing", ] @@ -6966,7 +7145,24 @@ dependencies = [ "eyre", "libc", "rand 0.8.5", - "reth-fs-util", + "reth-fs-util 1.9.2", + "secp256k1 0.30.0", + "serde", + "thiserror 2.0.12", +] + +[[package]] +name = "reth-cli-util" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "cfg-if", + "eyre", + "libc", + "rand 0.8.5", + "reth-fs-util 1.9.3", "secp256k1 0.30.0", "serde", "thiserror 2.0.12", @@ -6986,12 +7182,30 @@ dependencies = [ "bytes", "modular-bitfield", "op-alloy-consensus", - "reth-codecs-derive", - "reth-zstd-compressors", + "reth-codecs-derive 1.9.2", + "reth-zstd-compressors 1.9.2", "serde", "visibility", ] +[[package]] +name = "reth-codecs" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-genesis", + "alloy-primitives", + "alloy-trie", + "bytes", + "modular-bitfield", + "op-alloy-consensus", + "reth-codecs-derive 1.9.3", + "reth-zstd-compressors 1.9.3", + "serde", +] + [[package]] name = "reth-codecs-derive" version = "1.9.2" @@ -7002,6 +7216,16 @@ dependencies = [ "syn 2.0.101", ] +[[package]] +name = "reth-codecs-derive" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.101", +] + [[package]] name = "reth-config" version = "1.9.2" @@ -7009,9 +7233,24 @@ source = "git+https://github.com/gattaca-com/based-op-reth?rev=b053849462eb48e61 dependencies = [ "eyre", "humantime-serde", - "reth-network-types", - "reth-prune-types", - "reth-stages-types", + "reth-network-types 1.9.2", + "reth-prune-types 1.9.2", + "reth-stages-types 1.9.2", + "serde", + "toml", + "url", +] + +[[package]] +name = "reth-config" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "eyre", + "humantime-serde", + "reth-network-types 1.9.3", + "reth-prune-types 1.9.3", + "reth-stages-types 1.9.3", "serde", "toml", "url", @@ -7025,8 +7264,21 @@ dependencies = [ "alloy-consensus", "alloy-primitives", "auto_impl", - "reth-execution-types", - "reth-primitives-traits", + "reth-execution-types 1.9.2", + "reth-primitives-traits 1.9.2", + "thiserror 2.0.12", +] + +[[package]] +name = "reth-consensus" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-primitives", + "auto_impl", + "reth-execution-types 1.9.3", + "reth-primitives-traits 1.9.3", "thiserror 2.0.12", ] @@ -7037,9 +7289,21 @@ source = "git+https://github.com/gattaca-com/based-op-reth?rev=b053849462eb48e61 dependencies = [ "alloy-consensus", "alloy-eips", - "reth-chainspec", - "reth-consensus", - "reth-primitives-traits", + "reth-chainspec 1.9.2", + "reth-consensus 1.9.2", + "reth-primitives-traits 1.9.2", +] + +[[package]] +name = "reth-consensus-common" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "reth-chainspec 1.9.3", + "reth-consensus 1.9.3", + "reth-primitives-traits 1.9.3", ] [[package]] @@ -7059,9 +7323,35 @@ dependencies = [ "eyre", "futures", "reqwest", - "reth-node-api", - "reth-primitives-traits", - "reth-tracing", + "reth-node-api 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-tracing 1.9.2", + "ringbuffer", + "serde", + "serde_json", + "tokio", +] + +[[package]] +name = "reth-consensus-debug-client" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-json-rpc", + "alloy-primitives", + "alloy-provider", + "alloy-rpc-types-engine", + "alloy-transport", + "auto_impl", + "derive_more", + "eyre", + "futures", + "reqwest", + "reth-node-api 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-tracing 1.9.3", "ringbuffer", "serde", "serde_json", @@ -7079,14 +7369,14 @@ dependencies = [ "metrics", "page_size", "parking_lot", - "reth-db-api", - "reth-fs-util", - "reth-libmdbx", - "reth-metrics", - "reth-nippy-jar", - "reth-static-file-types", - "reth-storage-errors", - "reth-tracing", + "reth-db-api 1.9.2", + "reth-fs-util 1.9.2", + "reth-libmdbx 1.9.2", + "reth-metrics 1.9.2", + "reth-nippy-jar 1.9.2", + "reth-static-file-types 1.9.2", + "reth-storage-errors 1.9.2", + "reth-tracing 1.9.2", "rustc-hash 2.1.1", "strum 0.27.1", "sysinfo", @@ -7094,6 +7384,30 @@ dependencies = [ "thiserror 2.0.12", ] +[[package]] +name = "reth-db" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-primitives", + "derive_more", + "eyre", + "metrics", + "page_size", + "reth-db-api 1.9.3", + "reth-fs-util 1.9.3", + "reth-libmdbx 1.9.3", + "reth-metrics 1.9.3", + "reth-nippy-jar 1.9.3", + "reth-static-file-types 1.9.3", + "reth-storage-errors 1.9.3", + "reth-tracing 1.9.3", + "rustc-hash 2.1.1", + "strum 0.27.1", + "sysinfo", + "thiserror 2.0.12", +] + [[package]] name = "reth-db-api" version = "1.9.2" @@ -7109,15 +7423,41 @@ dependencies = [ "modular-bitfield", "parity-scale-codec", "proptest", - "reth-codecs", - "reth-db-models", - "reth-ethereum-primitives", - "reth-optimism-primitives", - "reth-primitives-traits", - "reth-prune-types", - "reth-stages-types", - "reth-storage-errors", - "reth-trie-common", + "reth-codecs 1.9.2", + "reth-db-models 1.9.2", + "reth-ethereum-primitives 1.9.2", + "reth-optimism-primitives 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-prune-types 1.9.2", + "reth-stages-types 1.9.2", + "reth-storage-errors 1.9.2", + "reth-trie-common 1.9.2", + "roaring", + "serde", +] + +[[package]] +name = "reth-db-api" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-genesis", + "alloy-primitives", + "bytes", + "derive_more", + "metrics", + "modular-bitfield", + "parity-scale-codec", + "reth-codecs 1.9.3", + "reth-db-models 1.9.3", + "reth-ethereum-primitives 1.9.3", + "reth-optimism-primitives 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-prune-types 1.9.3", + "reth-stages-types 1.9.3", + "reth-storage-errors 1.9.3", + "reth-trie-common 1.9.3", "roaring", "serde", ] @@ -7132,20 +7472,50 @@ dependencies = [ "alloy-primitives", "boyer-moore-magiclen", "eyre", - "reth-chainspec", - "reth-codecs", - "reth-config", - "reth-db-api", - "reth-etl", - "reth-execution-errors", - "reth-fs-util", - "reth-node-types", - "reth-primitives-traits", - "reth-provider", - "reth-stages-types", - "reth-static-file-types", - "reth-trie", - "reth-trie-db", + "reth-chainspec 1.9.2", + "reth-codecs 1.9.2", + "reth-config 1.9.2", + "reth-db-api 1.9.2", + "reth-etl 1.9.2", + "reth-execution-errors 1.9.2", + "reth-fs-util 1.9.2", + "reth-node-types 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-provider 1.9.2", + "reth-stages-types 1.9.2", + "reth-static-file-types 1.9.2", + "reth-trie 1.9.2", + "reth-trie-db 1.9.2", + "serde", + "serde_json", + "thiserror 2.0.12", + "tracing", +] + +[[package]] +name = "reth-db-common" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-genesis", + "alloy-primitives", + "boyer-moore-magiclen", + "eyre", + "reth-chainspec 1.9.3", + "reth-codecs 1.9.3", + "reth-config 1.9.3", + "reth-db-api 1.9.3", + "reth-etl 1.9.3", + "reth-execution-errors 1.9.3", + "reth-fs-util 1.9.3", + "reth-node-types 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-provider 1.9.3", + "reth-stages-types 1.9.3", + "reth-static-file-types 1.9.3", + "reth-trie 1.9.3", + "reth-trie-db 1.9.3", "serde", "serde_json", "thiserror 2.0.12", @@ -7162,8 +7532,22 @@ dependencies = [ "arbitrary", "bytes", "modular-bitfield", - "reth-codecs", - "reth-primitives-traits", + "reth-codecs 1.9.2", + "reth-primitives-traits 1.9.2", + "serde", +] + +[[package]] +name = "reth-db-models" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "bytes", + "modular-bitfield", + "reth-codecs 1.9.3", + "reth-primitives-traits 1.9.3", "serde", ] @@ -7179,10 +7563,10 @@ dependencies = [ "itertools 0.14.0", "parking_lot", "rand 0.8.5", - "reth-ethereum-forks", - "reth-net-banlist", - "reth-net-nat", - "reth-network-peers", + "reth-ethereum-forks 1.9.2", + "reth-net-banlist 1.9.2", + "reth-net-nat 1.9.2", + "reth-network-peers 1.9.2", "schnellru", "secp256k1 0.30.0", "serde", @@ -7193,10 +7577,59 @@ dependencies = [ ] [[package]] -name = "reth-discv5" -version = "1.9.2" -source = "git+https://github.com/gattaca-com/based-op-reth?rev=b053849462eb48e61b24d965cfee59cead7f8a3b#b053849462eb48e61b24d965cfee59cead7f8a3b" -dependencies = [ +name = "reth-discv4" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "discv5", + "enr", + "itertools 0.14.0", + "parking_lot", + "rand 0.8.5", + "reth-ethereum-forks 1.9.3", + "reth-net-banlist 1.9.3", + "reth-net-nat 1.9.3", + "reth-network-peers 1.9.3", + "schnellru", + "secp256k1 0.30.0", + "serde", + "thiserror 2.0.12", + "tokio", + "tokio-stream", + "tracing", +] + +[[package]] +name = "reth-discv5" +version = "1.9.2" +source = "git+https://github.com/gattaca-com/based-op-reth?rev=b053849462eb48e61b24d965cfee59cead7f8a3b#b053849462eb48e61b24d965cfee59cead7f8a3b" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "derive_more", + "discv5", + "enr", + "futures", + "itertools 0.14.0", + "metrics", + "rand 0.9.1", + "reth-chainspec 1.9.2", + "reth-ethereum-forks 1.9.2", + "reth-metrics 1.9.2", + "reth-network-peers 1.9.2", + "secp256k1 0.30.0", + "thiserror 2.0.12", + "tokio", + "tracing", +] + +[[package]] +name = "reth-discv5" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ "alloy-primitives", "alloy-rlp", "derive_more", @@ -7206,10 +7639,10 @@ dependencies = [ "itertools 0.14.0", "metrics", "rand 0.9.1", - "reth-chainspec", - "reth-ethereum-forks", - "reth-metrics", - "reth-network-peers", + "reth-chainspec 1.9.3", + "reth-ethereum-forks 1.9.3", + "reth-metrics 1.9.3", + "reth-network-peers 1.9.3", "secp256k1 0.30.0", "thiserror 2.0.12", "tokio", @@ -7227,9 +7660,33 @@ dependencies = [ "hickory-resolver", "linked_hash_set", "parking_lot", - "reth-ethereum-forks", - "reth-network-peers", - "reth-tokio-util", + "reth-ethereum-forks 1.9.2", + "reth-network-peers 1.9.2", + "reth-tokio-util 1.9.2", + "schnellru", + "secp256k1 0.30.0", + "serde", + "serde_with", + "thiserror 2.0.12", + "tokio", + "tokio-stream", + "tracing", +] + +[[package]] +name = "reth-dns-discovery" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-primitives", + "data-encoding", + "enr", + "hickory-resolver", + "linked_hash_set", + "parking_lot", + "reth-ethereum-forks 1.9.3", + "reth-network-peers 1.9.3", + "reth-tokio-util 1.9.3", "schnellru", "secp256k1 0.30.0", "serde", @@ -7256,16 +7713,16 @@ dependencies = [ "metrics", "pin-project", "rayon", - "reth-config", - "reth-consensus", - "reth-ethereum-primitives", - "reth-metrics", - "reth-network-p2p", - "reth-network-peers", - "reth-primitives-traits", - "reth-provider", - "reth-storage-api", - "reth-tasks", + "reth-config 1.9.2", + "reth-consensus 1.9.2", + "reth-ethereum-primitives 1.9.2", + "reth-metrics 1.9.2", + "reth-network-p2p 1.9.2", + "reth-network-peers 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-provider 1.9.2", + "reth-storage-api 1.9.2", + "reth-tasks 1.9.2", "reth-testing-utils", "tempfile", "thiserror 2.0.12", @@ -7275,6 +7732,37 @@ dependencies = [ "tracing", ] +[[package]] +name = "reth-downloaders" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "async-compression", + "futures", + "futures-util", + "itertools 0.14.0", + "metrics", + "pin-project", + "rayon", + "reth-config 1.9.3", + "reth-consensus 1.9.3", + "reth-metrics 1.9.3", + "reth-network-p2p 1.9.3", + "reth-network-peers 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-storage-api 1.9.3", + "reth-tasks 1.9.3", + "thiserror 2.0.12", + "tokio", + "tokio-stream", + "tokio-util", + "tracing", +] + [[package]] name = "reth-ecies" version = "1.9.2" @@ -7294,7 +7782,38 @@ dependencies = [ "hmac", "pin-project", "rand 0.8.5", - "reth-network-peers", + "reth-network-peers 1.9.2", + "secp256k1 0.30.0", + "sha2", + "sha3", + "thiserror 2.0.12", + "tokio", + "tokio-stream", + "tokio-util", + "tracing", + "typenum", +] + +[[package]] +name = "reth-ecies" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "aes", + "alloy-primitives", + "alloy-rlp", + "block-padding", + "byteorder", + "cipher", + "concat-kdf", + "ctr", + "digest 0.10.7", + "futures", + "generic-array", + "hmac", + "pin-project", + "rand 0.8.5", + "reth-network-peers 1.9.3", "secp256k1 0.30.0", "sha2", "sha3", @@ -7317,14 +7836,38 @@ dependencies = [ "eyre", "futures-util", "op-alloy-rpc-types-engine", - "reth-chainspec", - "reth-engine-primitives", - "reth-ethereum-engine-primitives", - "reth-optimism-chainspec", - "reth-payload-builder", - "reth-payload-primitives", - "reth-storage-api", - "reth-transaction-pool", + "reth-chainspec 1.9.2", + "reth-engine-primitives 1.9.2", + "reth-ethereum-engine-primitives 1.9.2", + "reth-optimism-chainspec 1.9.2", + "reth-payload-builder 1.9.2", + "reth-payload-primitives 1.9.2", + "reth-storage-api 1.9.2", + "reth-transaction-pool 1.9.2", + "tokio", + "tokio-stream", + "tracing", +] + +[[package]] +name = "reth-engine-local" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-primitives", + "alloy-rpc-types-engine", + "eyre", + "futures-util", + "op-alloy-rpc-types-engine", + "reth-chainspec 1.9.3", + "reth-engine-primitives 1.9.3", + "reth-ethereum-engine-primitives 1.9.3", + "reth-optimism-chainspec 1.9.3", + "reth-payload-builder 1.9.3", + "reth-payload-primitives 1.9.3", + "reth-storage-api 1.9.3", + "reth-transaction-pool 1.9.3", "tokio", "tokio-stream", "tracing", @@ -7341,15 +7884,40 @@ dependencies = [ "alloy-rpc-types-engine", "auto_impl", "futures", - "reth-chain-state", - "reth-errors", - "reth-ethereum-primitives", - "reth-evm", - "reth-execution-types", - "reth-payload-builder-primitives", - "reth-payload-primitives", - "reth-primitives-traits", - "reth-trie-common", + "reth-chain-state 1.9.2", + "reth-errors 1.9.2", + "reth-ethereum-primitives 1.9.2", + "reth-evm 1.9.2", + "reth-execution-types 1.9.2", + "reth-payload-builder-primitives 1.9.2", + "reth-payload-primitives 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-trie-common 1.9.2", + "serde", + "thiserror 2.0.12", + "tokio", +] + +[[package]] +name = "reth-engine-primitives" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rpc-types-engine", + "auto_impl", + "futures", + "reth-chain-state 1.9.3", + "reth-errors 1.9.3", + "reth-ethereum-primitives 1.9.3", + "reth-evm 1.9.3", + "reth-execution-types 1.9.3", + "reth-payload-builder-primitives 1.9.3", + "reth-payload-primitives 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-trie-common 1.9.3", "serde", "thiserror 2.0.12", "tokio", @@ -7362,19 +7930,41 @@ source = "git+https://github.com/gattaca-com/based-op-reth?rev=b053849462eb48e61 dependencies = [ "futures", "pin-project", - "reth-chainspec", - "reth-consensus", - "reth-engine-primitives", - "reth-engine-tree", - "reth-ethereum-primitives", - "reth-evm", - "reth-network-p2p", - "reth-node-types", - "reth-payload-builder", - "reth-provider", - "reth-prune", - "reth-stages-api", - "reth-tasks", + "reth-chainspec 1.9.2", + "reth-consensus 1.9.2", + "reth-engine-primitives 1.9.2", + "reth-engine-tree 1.9.2", + "reth-ethereum-primitives 1.9.2", + "reth-evm 1.9.2", + "reth-network-p2p 1.9.2", + "reth-node-types 1.9.2", + "reth-payload-builder 1.9.2", + "reth-provider 1.9.2", + "reth-prune 1.9.2", + "reth-stages-api 1.9.2", + "reth-tasks 1.9.2", +] + +[[package]] +name = "reth-engine-service" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "futures", + "pin-project", + "reth-chainspec 1.9.3", + "reth-consensus 1.9.3", + "reth-engine-primitives 1.9.3", + "reth-engine-tree 1.9.3", + "reth-ethereum-primitives 1.9.3", + "reth-evm 1.9.3", + "reth-network-p2p 1.9.3", + "reth-node-types 1.9.3", + "reth-payload-builder 1.9.3", + "reth-provider 1.9.3", + "reth-prune 1.9.3", + "reth-stages-api 1.9.3", + "reth-tasks 1.9.3", ] [[package]] @@ -7396,33 +7986,83 @@ dependencies = [ "mini-moka", "parking_lot", "rayon", - "reth-chain-state", - "reth-chainspec", - "reth-consensus", - "reth-db", - "reth-engine-primitives", - "reth-errors", - "reth-ethereum-primitives", - "reth-evm", - "reth-execution-types", - "reth-metrics", - "reth-network-p2p", - "reth-payload-builder", - "reth-payload-primitives", - "reth-primitives-traits", - "reth-provider", - "reth-prune", - "reth-prune-types", - "reth-revm", - "reth-stages", - "reth-stages-api", - "reth-static-file", - "reth-tasks", - "reth-tracing", - "reth-trie", - "reth-trie-parallel", - "reth-trie-sparse", - "reth-trie-sparse-parallel", + "reth-chain-state 1.9.2", + "reth-chainspec 1.9.2", + "reth-consensus 1.9.2", + "reth-db 1.9.2", + "reth-engine-primitives 1.9.2", + "reth-errors 1.9.2", + "reth-ethereum-primitives 1.9.2", + "reth-evm 1.9.2", + "reth-execution-types 1.9.2", + "reth-metrics 1.9.2", + "reth-network-p2p 1.9.2", + "reth-payload-builder 1.9.2", + "reth-payload-primitives 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-provider 1.9.2", + "reth-prune 1.9.2", + "reth-prune-types 1.9.2", + "reth-revm 1.9.2", + "reth-stages 1.9.2", + "reth-stages-api 1.9.2", + "reth-static-file 1.9.2", + "reth-tasks 1.9.2", + "reth-tracing 1.9.2", + "reth-trie 1.9.2", + "reth-trie-parallel 1.9.2", + "reth-trie-sparse 1.9.2", + "reth-trie-sparse-parallel 1.9.2", + "revm", + "revm-primitives", + "schnellru", + "smallvec", + "thiserror 2.0.12", + "tokio", + "tracing", +] + +[[package]] +name = "reth-engine-tree" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-evm", + "alloy-primitives", + "alloy-rlp", + "alloy-rpc-types-engine", + "crossbeam-channel", + "dashmap 6.1.0", + "derive_more", + "futures", + "metrics", + "mini-moka", + "parking_lot", + "rayon", + "reth-chain-state 1.9.3", + "reth-consensus 1.9.3", + "reth-db 1.9.3", + "reth-engine-primitives 1.9.3", + "reth-errors 1.9.3", + "reth-ethereum-primitives 1.9.3", + "reth-evm 1.9.3", + "reth-execution-types 1.9.3", + "reth-metrics 1.9.3", + "reth-network-p2p 1.9.3", + "reth-payload-builder 1.9.3", + "reth-payload-primitives 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-provider 1.9.3", + "reth-prune 1.9.3", + "reth-revm 1.9.3", + "reth-stages-api 1.9.3", + "reth-tasks 1.9.3", + "reth-trie 1.9.3", + "reth-trie-parallel 1.9.3", + "reth-trie-sparse 1.9.3", + "reth-trie-sparse-parallel 1.9.3", "revm", "revm-primitives", "schnellru", @@ -7443,16 +8083,44 @@ dependencies = [ "futures", "itertools 0.14.0", "pin-project", - "reth-chainspec", - "reth-engine-primitives", - "reth-engine-tree", - "reth-errors", - "reth-evm", - "reth-fs-util", - "reth-payload-primitives", - "reth-primitives-traits", - "reth-revm", - "reth-storage-api", + "reth-chainspec 1.9.2", + "reth-engine-primitives 1.9.2", + "reth-engine-tree 1.9.2", + "reth-errors 1.9.2", + "reth-evm 1.9.2", + "reth-fs-util 1.9.2", + "reth-payload-primitives 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-revm 1.9.2", + "reth-storage-api 1.9.2", + "serde", + "serde_json", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "reth-engine-util" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-rpc-types-engine", + "eyre", + "futures", + "itertools 0.14.0", + "pin-project", + "reth-chainspec 1.9.3", + "reth-engine-primitives 1.9.3", + "reth-engine-tree 1.9.3", + "reth-errors 1.9.3", + "reth-evm 1.9.3", + "reth-fs-util 1.9.3", + "reth-payload-primitives 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-revm 1.9.3", + "reth-storage-api 1.9.3", "serde", "serde_json", "tokio", @@ -7471,7 +8139,23 @@ dependencies = [ "alloy-rlp", "ethereum_ssz", "ethereum_ssz_derive", - "reth-ethereum-primitives", + "reth-ethereum-primitives 1.9.2", + "snap", + "thiserror 2.0.12", +] + +[[package]] +name = "reth-era" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "ethereum_ssz", + "ethereum_ssz_derive", + "reth-ethereum-primitives 1.9.3", "snap", "thiserror 2.0.12", ] @@ -7486,7 +8170,22 @@ dependencies = [ "eyre", "futures-util", "reqwest", - "reth-fs-util", + "reth-fs-util 1.9.2", + "sha2", + "tokio", +] + +[[package]] +name = "reth-era-downloader" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-primitives", + "bytes", + "eyre", + "futures-util", + "reqwest", + "reth-fs-util 1.9.3", "sha2", "tokio", ] @@ -7500,15 +8199,37 @@ dependencies = [ "alloy-primitives", "eyre", "futures-util", - "reth-db-api", - "reth-era", - "reth-era-downloader", - "reth-etl", - "reth-fs-util", - "reth-primitives-traits", - "reth-provider", - "reth-stages-types", - "reth-storage-api", + "reth-db-api 1.9.2", + "reth-era 1.9.2", + "reth-era-downloader 1.9.2", + "reth-etl 1.9.2", + "reth-fs-util 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-provider 1.9.2", + "reth-stages-types 1.9.2", + "reth-storage-api 1.9.2", + "tokio", + "tracing", +] + +[[package]] +name = "reth-era-utils" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-primitives", + "eyre", + "futures-util", + "reth-db-api 1.9.3", + "reth-era 1.9.3", + "reth-era-downloader 1.9.3", + "reth-etl 1.9.3", + "reth-fs-util 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-provider 1.9.3", + "reth-stages-types 1.9.3", + "reth-storage-api 1.9.3", "tokio", "tracing", ] @@ -7518,9 +8239,20 @@ name = "reth-errors" version = "1.9.2" source = "git+https://github.com/gattaca-com/based-op-reth?rev=b053849462eb48e61b24d965cfee59cead7f8a3b#b053849462eb48e61b24d965cfee59cead7f8a3b" dependencies = [ - "reth-consensus", - "reth-execution-errors", - "reth-storage-errors", + "reth-consensus 1.9.2", + "reth-execution-errors 1.9.2", + "reth-storage-errors 1.9.2", + "thiserror 2.0.12", +] + +[[package]] +name = "reth-errors" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "reth-consensus 1.9.3", + "reth-execution-errors 1.9.3", + "reth-storage-errors 1.9.3", "thiserror 2.0.12", ] @@ -7536,13 +8268,13 @@ dependencies = [ "derive_more", "futures", "pin-project", - "reth-codecs", - "reth-ecies", - "reth-eth-wire-types", - "reth-ethereum-forks", - "reth-metrics", - "reth-network-peers", - "reth-primitives-traits", + "reth-codecs 1.9.2", + "reth-ecies 1.9.2", + "reth-eth-wire-types 1.9.2", + "reth-ethereum-forks 1.9.2", + "reth-metrics 1.9.2", + "reth-network-peers 1.9.2", + "reth-primitives-traits 1.9.2", "serde", "snap", "thiserror 2.0.12", @@ -7553,27 +8285,76 @@ dependencies = [ ] [[package]] -name = "reth-eth-wire-types" -version = "1.9.2" -source = "git+https://github.com/gattaca-com/based-op-reth?rev=b053849462eb48e61b24d965cfee59cead7f8a3b#b053849462eb48e61b24d965cfee59cead7f8a3b" +name = "reth-eth-wire" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" dependencies = [ "alloy-chains", - "alloy-consensus", - "alloy-eips", - "alloy-hardforks", "alloy-primitives", "alloy-rlp", "bytes", "derive_more", - "reth-chainspec", - "reth-codecs-derive", - "reth-ethereum-primitives", - "reth-primitives-traits", + "futures", + "pin-project", + "reth-codecs 1.9.3", + "reth-ecies 1.9.3", + "reth-eth-wire-types 1.9.3", + "reth-ethereum-forks 1.9.3", + "reth-metrics 1.9.3", + "reth-network-peers 1.9.3", + "reth-primitives-traits 1.9.3", "serde", + "snap", "thiserror 2.0.12", -] - -[[package]] + "tokio", + "tokio-stream", + "tokio-util", + "tracing", +] + +[[package]] +name = "reth-eth-wire-types" +version = "1.9.2" +source = "git+https://github.com/gattaca-com/based-op-reth?rev=b053849462eb48e61b24d965cfee59cead7f8a3b#b053849462eb48e61b24d965cfee59cead7f8a3b" +dependencies = [ + "alloy-chains", + "alloy-consensus", + "alloy-eips", + "alloy-hardforks", + "alloy-primitives", + "alloy-rlp", + "bytes", + "derive_more", + "reth-chainspec 1.9.2", + "reth-codecs-derive 1.9.2", + "reth-ethereum-primitives 1.9.2", + "reth-primitives-traits 1.9.2", + "serde", + "thiserror 2.0.12", +] + +[[package]] +name = "reth-eth-wire-types" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-chains", + "alloy-consensus", + "alloy-eips", + "alloy-hardforks", + "alloy-primitives", + "alloy-rlp", + "bytes", + "derive_more", + "reth-chainspec 1.9.3", + "reth-codecs-derive 1.9.3", + "reth-ethereum-primitives 1.9.3", + "reth-primitives-traits 1.9.3", + "serde", + "thiserror 2.0.12", +] + +[[package]] name = "reth-ethereum-consensus" version = "1.9.2" source = "git+https://github.com/gattaca-com/based-op-reth?rev=b053849462eb48e61b24d965cfee59cead7f8a3b#b053849462eb48e61b24d965cfee59cead7f8a3b" @@ -7581,11 +8362,11 @@ dependencies = [ "alloy-consensus", "alloy-eips", "alloy-primitives", - "reth-chainspec", - "reth-consensus", - "reth-consensus-common", - "reth-execution-types", - "reth-primitives-traits", + "reth-chainspec 1.9.2", + "reth-consensus 1.9.2", + "reth-consensus-common 1.9.2", + "reth-execution-types 1.9.2", + "reth-primitives-traits 1.9.2", "tracing", ] @@ -7598,10 +8379,28 @@ dependencies = [ "alloy-primitives", "alloy-rlp", "alloy-rpc-types-engine", - "reth-engine-primitives", - "reth-ethereum-primitives", - "reth-payload-primitives", - "reth-primitives-traits", + "reth-engine-primitives 1.9.2", + "reth-ethereum-primitives 1.9.2", + "reth-payload-primitives 1.9.2", + "reth-primitives-traits 1.9.2", + "serde", + "sha2", + "thiserror 2.0.12", +] + +[[package]] +name = "reth-ethereum-engine-primitives" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-rpc-types-engine", + "reth-engine-primitives 1.9.3", + "reth-ethereum-primitives 1.9.3", + "reth-payload-primitives 1.9.3", + "reth-primitives-traits 1.9.3", "serde", "sha2", "thiserror 2.0.12", @@ -7620,6 +8419,19 @@ dependencies = [ "rustc-hash 2.1.1", ] +[[package]] +name = "reth-ethereum-forks" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-eip2124", + "alloy-hardforks", + "alloy-primitives", + "auto_impl", + "once_cell", + "rustc-hash 2.1.1", +] + [[package]] name = "reth-ethereum-payload-builder" version = "1.9.2" @@ -7630,21 +8442,21 @@ dependencies = [ "alloy-primitives", "alloy-rlp", "alloy-rpc-types-engine", - "reth-basic-payload-builder", - "reth-chainspec", - "reth-consensus-common", - "reth-errors", - "reth-ethereum-primitives", - "reth-evm", - "reth-evm-ethereum", - "reth-payload-builder", - "reth-payload-builder-primitives", - "reth-payload-primitives", - "reth-payload-validator", - "reth-primitives-traits", - "reth-revm", - "reth-storage-api", - "reth-transaction-pool", + "reth-basic-payload-builder 1.9.2", + "reth-chainspec 1.9.2", + "reth-consensus-common 1.9.2", + "reth-errors 1.9.2", + "reth-ethereum-primitives 1.9.2", + "reth-evm 1.9.2", + "reth-evm-ethereum 1.9.2", + "reth-payload-builder 1.9.2", + "reth-payload-builder-primitives 1.9.2", + "reth-payload-primitives 1.9.2", + "reth-payload-validator 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-revm 1.9.2", + "reth-storage-api 1.9.2", + "reth-transaction-pool 1.9.2", "revm", "tracing", ] @@ -7662,9 +8474,28 @@ dependencies = [ "alloy-serde", "arbitrary", "modular-bitfield", - "reth-codecs", - "reth-primitives-traits", - "reth-zstd-compressors", + "reth-codecs 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-zstd-compressors 1.9.2", + "serde", + "serde_with", +] + +[[package]] +name = "reth-ethereum-primitives" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-rpc-types-eth", + "alloy-serde", + "modular-bitfield", + "reth-codecs 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-zstd-compressors 1.9.3", "serde", "serde_with", ] @@ -7675,7 +8506,17 @@ version = "1.9.2" source = "git+https://github.com/gattaca-com/based-op-reth?rev=b053849462eb48e61b24d965cfee59cead7f8a3b#b053849462eb48e61b24d965cfee59cead7f8a3b" dependencies = [ "rayon", - "reth-db-api", + "reth-db-api 1.9.2", + "tempfile", +] + +[[package]] +name = "reth-etl" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "rayon", + "reth-db-api 1.9.3", "tempfile", ] @@ -7692,13 +8533,36 @@ dependencies = [ "derive_more", "futures-util", "metrics", - "reth-execution-errors", - "reth-execution-types", - "reth-metrics", - "reth-primitives-traits", - "reth-storage-api", - "reth-storage-errors", - "reth-trie-common", + "reth-execution-errors 1.9.2", + "reth-execution-types 1.9.2", + "reth-metrics 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-storage-api 1.9.2", + "reth-storage-errors 1.9.2", + "reth-trie-common 1.9.2", + "revm", +] + +[[package]] +name = "reth-evm" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-evm", + "alloy-primitives", + "auto_impl", + "derive_more", + "futures-util", + "metrics", + "reth-execution-errors 1.9.3", + "reth-execution-types 1.9.3", + "reth-metrics 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-storage-api 1.9.3", + "reth-storage-errors 1.9.3", + "reth-trie-common 1.9.3", "revm", ] @@ -7714,13 +8578,33 @@ dependencies = [ "alloy-rpc-types-engine", "derive_more", "parking_lot", - "reth-chainspec", - "reth-ethereum-forks", - "reth-ethereum-primitives", - "reth-evm", - "reth-execution-types", - "reth-primitives-traits", - "reth-storage-errors", + "reth-chainspec 1.9.2", + "reth-ethereum-forks 1.9.2", + "reth-ethereum-primitives 1.9.2", + "reth-evm 1.9.2", + "reth-execution-types 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-storage-errors 1.9.2", + "revm", +] + +[[package]] +name = "reth-evm-ethereum" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-evm", + "alloy-primitives", + "alloy-rpc-types-engine", + "reth-chainspec 1.9.3", + "reth-ethereum-forks 1.9.3", + "reth-ethereum-primitives 1.9.3", + "reth-evm 1.9.3", + "reth-execution-types 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-storage-errors 1.9.3", "revm", ] @@ -7733,7 +8617,20 @@ dependencies = [ "alloy-primitives", "alloy-rlp", "nybbles", - "reth-storage-errors", + "reth-storage-errors 1.9.2", + "thiserror 2.0.12", +] + +[[package]] +name = "reth-execution-errors" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-evm", + "alloy-primitives", + "alloy-rlp", + "nybbles", + "reth-storage-errors 1.9.3", "thiserror 2.0.12", ] @@ -7747,9 +8644,27 @@ dependencies = [ "alloy-evm", "alloy-primitives", "derive_more", - "reth-ethereum-primitives", - "reth-primitives-traits", - "reth-trie-common", + "reth-ethereum-primitives 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-trie-common 1.9.2", + "revm", + "serde", + "serde_with", +] + +[[package]] +name = "reth-execution-types" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-evm", + "alloy-primitives", + "derive_more", + "reth-ethereum-primitives 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-trie-common 1.9.3", "revm", "serde", "serde_with", @@ -7768,24 +8683,62 @@ dependencies = [ "itertools 0.14.0", "metrics", "parking_lot", - "reth-chain-state", - "reth-chainspec", - "reth-config", - "reth-ethereum-primitives", - "reth-evm", - "reth-exex-types", - "reth-fs-util", - "reth-metrics", - "reth-node-api", - "reth-node-core", - "reth-payload-builder", - "reth-primitives-traits", - "reth-provider", - "reth-prune-types", - "reth-revm", - "reth-stages-api", - "reth-tasks", - "reth-tracing", + "reth-chain-state 1.9.2", + "reth-chainspec 1.9.2", + "reth-config 1.9.2", + "reth-ethereum-primitives 1.9.2", + "reth-evm 1.9.2", + "reth-exex-types 1.9.2", + "reth-fs-util 1.9.2", + "reth-metrics 1.9.2", + "reth-node-api 1.9.2", + "reth-node-core 1.9.2", + "reth-payload-builder 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-provider 1.9.2", + "reth-prune-types 1.9.2", + "reth-revm 1.9.2", + "reth-stages-api 1.9.2", + "reth-tasks 1.9.2", + "reth-tracing 1.9.2", + "rmp-serde", + "thiserror 2.0.12", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "reth-exex" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "eyre", + "futures", + "itertools 0.14.0", + "metrics", + "parking_lot", + "reth-chain-state 1.9.3", + "reth-chainspec 1.9.3", + "reth-config 1.9.3", + "reth-ethereum-primitives 1.9.3", + "reth-evm 1.9.3", + "reth-exex-types 1.9.3", + "reth-fs-util 1.9.3", + "reth-metrics 1.9.3", + "reth-node-api 1.9.3", + "reth-node-core 1.9.3", + "reth-payload-builder 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-provider 1.9.3", + "reth-prune-types 1.9.3", + "reth-revm 1.9.3", + "reth-stages-api 1.9.3", + "reth-tasks 1.9.3", + "reth-tracing 1.9.3", "rmp-serde", "thiserror 2.0.12", "tokio", @@ -7800,9 +8753,23 @@ source = "git+https://github.com/gattaca-com/based-op-reth?rev=b053849462eb48e61 dependencies = [ "alloy-eips", "alloy-primitives", - "reth-chain-state", - "reth-execution-types", - "reth-primitives-traits", + "reth-chain-state 1.9.2", + "reth-execution-types 1.9.2", + "reth-primitives-traits 1.9.2", + "serde", + "serde_with", +] + +[[package]] +name = "reth-exex-types" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "reth-chain-state 1.9.3", + "reth-execution-types 1.9.3", + "reth-primitives-traits 1.9.3", "serde", "serde_with", ] @@ -7817,6 +8784,16 @@ dependencies = [ "thiserror 2.0.12", ] +[[package]] +name = "reth-fs-util" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "serde", + "serde_json", + "thiserror 2.0.12", +] + [[package]] name = "reth-invalid-block-hooks" version = "1.9.2" @@ -7830,14 +8807,42 @@ dependencies = [ "futures", "jsonrpsee", "pretty_assertions", - "reth-engine-primitives", - "reth-evm", - "reth-primitives-traits", - "reth-provider", - "reth-revm", - "reth-rpc-api", - "reth-tracing", - "reth-trie", + "reth-engine-primitives 1.9.2", + "reth-evm 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-provider 1.9.2", + "reth-revm 1.9.2", + "reth-rpc-api 1.9.2", + "reth-tracing 1.9.2", + "reth-trie 1.9.2", + "revm", + "revm-bytecode", + "revm-database", + "serde", + "serde_json", +] + +[[package]] +name = "reth-invalid-block-hooks" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-primitives", + "alloy-rlp", + "alloy-rpc-types-debug", + "eyre", + "futures", + "jsonrpsee", + "pretty_assertions", + "reth-engine-primitives 1.9.3", + "reth-evm 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-provider 1.9.3", + "reth-revm 1.9.3", + "reth-rpc-api 1.9.3", + "reth-tracing 1.9.3", + "reth-trie 1.9.3", "revm", "revm-bytecode", "revm-database", @@ -7865,6 +8870,26 @@ dependencies = [ "tracing", ] +[[package]] +name = "reth-ipc" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "bytes", + "futures", + "futures-util", + "interprocess", + "jsonrpsee", + "pin-project", + "serde_json", + "thiserror 2.0.12", + "tokio", + "tokio-stream", + "tokio-util", + "tower", + "tracing", +] + [[package]] name = "reth-libmdbx" version = "1.9.2" @@ -7875,7 +8900,23 @@ dependencies = [ "dashmap 6.1.0", "derive_more", "parking_lot", - "reth-mdbx-sys", + "reth-mdbx-sys 1.9.2", + "smallvec", + "thiserror 2.0.12", + "tracing", +] + +[[package]] +name = "reth-libmdbx" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "bitflags 2.10.0", + "byteorder", + "dashmap 6.1.0", + "derive_more", + "parking_lot", + "reth-mdbx-sys 1.9.3", "smallvec", "thiserror 2.0.12", "tracing", @@ -7890,6 +8931,15 @@ dependencies = [ "cc", ] +[[package]] +name = "reth-mdbx-sys" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "bindgen 0.71.1", + "cc", +] + [[package]] name = "reth-metrics" version = "1.9.2" @@ -7902,6 +8952,18 @@ dependencies = [ "tokio-util", ] +[[package]] +name = "reth-metrics" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "futures", + "metrics", + "metrics-derive", + "tokio", + "tokio-util", +] + [[package]] name = "reth-net-banlist" version = "1.9.2" @@ -7910,6 +8972,14 @@ dependencies = [ "alloy-primitives", ] +[[package]] +name = "reth-net-banlist" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-primitives", +] + [[package]] name = "reth-net-nat" version = "1.9.2" @@ -7924,6 +8994,20 @@ dependencies = [ "tracing", ] +[[package]] +name = "reth-net-nat" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "futures-util", + "if-addrs", + "reqwest", + "serde_with", + "thiserror 2.0.12", + "tokio", + "tracing", +] + [[package]] name = "reth-network" version = "1.9.2" @@ -7945,28 +9029,83 @@ dependencies = [ "pin-project", "rand 0.8.5", "rand 0.9.1", - "reth-chainspec", - "reth-consensus", - "reth-discv4", - "reth-discv5", - "reth-dns-discovery", - "reth-ecies", - "reth-eth-wire", - "reth-eth-wire-types", - "reth-ethereum-forks", - "reth-ethereum-primitives", - "reth-fs-util", - "reth-metrics", - "reth-net-banlist", - "reth-network-api", - "reth-network-p2p", - "reth-network-peers", - "reth-network-types", - "reth-primitives-traits", - "reth-storage-api", - "reth-tasks", - "reth-tokio-util", - "reth-transaction-pool", + "reth-chainspec 1.9.2", + "reth-consensus 1.9.2", + "reth-discv4 1.9.2", + "reth-discv5 1.9.2", + "reth-dns-discovery 1.9.2", + "reth-ecies 1.9.2", + "reth-eth-wire 1.9.2", + "reth-eth-wire-types 1.9.2", + "reth-ethereum-forks 1.9.2", + "reth-ethereum-primitives 1.9.2", + "reth-fs-util 1.9.2", + "reth-metrics 1.9.2", + "reth-net-banlist 1.9.2", + "reth-network-api 1.9.2", + "reth-network-p2p 1.9.2", + "reth-network-peers 1.9.2", + "reth-network-types 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-storage-api 1.9.2", + "reth-tasks 1.9.2", + "reth-tokio-util 1.9.2", + "reth-transaction-pool 1.9.2", + "rustc-hash 2.1.1", + "schnellru", + "secp256k1 0.30.0", + "serde", + "smallvec", + "thiserror 2.0.12", + "tokio", + "tokio-stream", + "tokio-util", + "tracing", +] + +[[package]] +name = "reth-network" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "aquamarine", + "auto_impl", + "derive_more", + "discv5", + "enr", + "futures", + "itertools 0.14.0", + "metrics", + "parking_lot", + "pin-project", + "rand 0.8.5", + "rand 0.9.1", + "reth-chainspec 1.9.3", + "reth-consensus 1.9.3", + "reth-discv4 1.9.3", + "reth-discv5 1.9.3", + "reth-dns-discovery 1.9.3", + "reth-ecies 1.9.3", + "reth-eth-wire 1.9.3", + "reth-eth-wire-types 1.9.3", + "reth-ethereum-forks 1.9.3", + "reth-ethereum-primitives 1.9.3", + "reth-fs-util 1.9.3", + "reth-metrics 1.9.3", + "reth-net-banlist 1.9.3", + "reth-network-api 1.9.3", + "reth-network-p2p 1.9.3", + "reth-network-peers 1.9.3", + "reth-network-types 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-storage-api 1.9.3", + "reth-tasks 1.9.3", + "reth-tokio-util 1.9.3", + "reth-transaction-pool 1.9.3", "rustc-hash 2.1.1", "schnellru", "secp256k1 0.30.0", @@ -7992,12 +9131,37 @@ dependencies = [ "derive_more", "enr", "futures", - "reth-eth-wire-types", - "reth-ethereum-forks", - "reth-network-p2p", - "reth-network-peers", - "reth-network-types", - "reth-tokio-util", + "reth-eth-wire-types 1.9.2", + "reth-ethereum-forks 1.9.2", + "reth-network-p2p 1.9.2", + "reth-network-peers 1.9.2", + "reth-network-types 1.9.2", + "reth-tokio-util 1.9.2", + "serde", + "thiserror 2.0.12", + "tokio", + "tokio-stream", +] + +[[package]] +name = "reth-network-api" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-primitives", + "alloy-rpc-types-admin", + "alloy-rpc-types-eth", + "auto_impl", + "derive_more", + "enr", + "futures", + "reth-eth-wire-types 1.9.3", + "reth-ethereum-forks 1.9.3", + "reth-network-p2p 1.9.3", + "reth-network-peers 1.9.3", + "reth-network-types 1.9.3", + "reth-tokio-util 1.9.3", "serde", "thiserror 2.0.12", "tokio", @@ -8016,13 +9180,35 @@ dependencies = [ "derive_more", "futures", "parking_lot", - "reth-consensus", - "reth-eth-wire-types", - "reth-ethereum-primitives", - "reth-network-peers", - "reth-network-types", - "reth-primitives-traits", - "reth-storage-errors", + "reth-consensus 1.9.2", + "reth-eth-wire-types 1.9.2", + "reth-ethereum-primitives 1.9.2", + "reth-network-peers 1.9.2", + "reth-network-types 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-storage-errors 1.9.2", + "tokio", + "tracing", +] + +[[package]] +name = "reth-network-p2p" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "auto_impl", + "derive_more", + "futures", + "reth-consensus 1.9.3", + "reth-eth-wire-types 1.9.3", + "reth-ethereum-primitives 1.9.3", + "reth-network-peers 1.9.3", + "reth-network-types 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-storage-errors 1.9.3", "tokio", "tracing", ] @@ -8042,6 +9228,21 @@ dependencies = [ "url", ] +[[package]] +name = "reth-network-peers" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "enr", + "secp256k1 0.30.0", + "serde_with", + "thiserror 2.0.12", + "tokio", + "url", +] + [[package]] name = "reth-network-types" version = "1.9.2" @@ -8049,8 +9250,22 @@ source = "git+https://github.com/gattaca-com/based-op-reth?rev=b053849462eb48e61 dependencies = [ "alloy-eip2124", "humantime-serde", - "reth-net-banlist", - "reth-network-peers", + "reth-net-banlist 1.9.2", + "reth-network-peers 1.9.2", + "serde", + "serde_json", + "tracing", +] + +[[package]] +name = "reth-network-types" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-eip2124", + "humantime-serde", + "reth-net-banlist 1.9.3", + "reth-network-peers 1.9.3", "serde", "serde_json", "tracing", @@ -8066,7 +9281,24 @@ dependencies = [ "derive_more", "lz4_flex", "memmap2", - "reth-fs-util", + "reth-fs-util 1.9.2", + "serde", + "thiserror 2.0.12", + "tracing", + "zstd", +] + +[[package]] +name = "reth-nippy-jar" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "anyhow", + "bincode", + "derive_more", + "lz4_flex", + "memmap2", + "reth-fs-util 1.9.3", "serde", "thiserror 2.0.12", "tracing", @@ -8080,21 +9312,45 @@ source = "git+https://github.com/gattaca-com/based-op-reth?rev=b053849462eb48e61 dependencies = [ "alloy-rpc-types-engine", "eyre", - "reth-basic-payload-builder", - "reth-consensus", - "reth-db-api", - "reth-engine-primitives", - "reth-evm", - "reth-network-api", - "reth-node-core", - "reth-node-types", - "reth-payload-builder", - "reth-payload-builder-primitives", - "reth-payload-primitives", - "reth-provider", - "reth-tasks", - "reth-tokio-util", - "reth-transaction-pool", + "reth-basic-payload-builder 1.9.2", + "reth-consensus 1.9.2", + "reth-db-api 1.9.2", + "reth-engine-primitives 1.9.2", + "reth-evm 1.9.2", + "reth-network-api 1.9.2", + "reth-node-core 1.9.2", + "reth-node-types 1.9.2", + "reth-payload-builder 1.9.2", + "reth-payload-builder-primitives 1.9.2", + "reth-payload-primitives 1.9.2", + "reth-provider 1.9.2", + "reth-tasks 1.9.2", + "reth-tokio-util 1.9.2", + "reth-transaction-pool 1.9.2", +] + +[[package]] +name = "reth-node-api" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-rpc-types-engine", + "eyre", + "reth-basic-payload-builder 1.9.3", + "reth-consensus 1.9.3", + "reth-db-api 1.9.3", + "reth-engine-primitives 1.9.3", + "reth-evm 1.9.3", + "reth-network-api 1.9.3", + "reth-node-core 1.9.3", + "reth-node-types 1.9.3", + "reth-payload-builder 1.9.3", + "reth-payload-builder-primitives 1.9.3", + "reth-payload-primitives 1.9.3", + "reth-provider 1.9.3", + "reth-tasks 1.9.3", + "reth-tokio-util 1.9.3", + "reth-transaction-pool 1.9.3", ] [[package]] @@ -8114,50 +9370,118 @@ dependencies = [ "futures", "jsonrpsee", "rayon", - "reth-basic-payload-builder", - "reth-chain-state", - "reth-chainspec", - "reth-cli-util", - "reth-config", - "reth-consensus", - "reth-consensus-debug-client", - "reth-db", - "reth-db-api", - "reth-db-common", - "reth-downloaders", - "reth-engine-local", - "reth-engine-primitives", - "reth-engine-service", - "reth-engine-tree", - "reth-engine-util", - "reth-evm", - "reth-exex", - "reth-fs-util", - "reth-invalid-block-hooks", - "reth-network", - "reth-network-api", - "reth-network-p2p", - "reth-node-api", - "reth-node-core", - "reth-node-ethstats", - "reth-node-events", - "reth-node-metrics", - "reth-payload-builder", - "reth-primitives-traits", - "reth-provider", - "reth-prune", - "reth-rpc", - "reth-rpc-api", - "reth-rpc-builder", - "reth-rpc-engine-api", - "reth-rpc-eth-types", - "reth-rpc-layer", - "reth-stages", - "reth-static-file", - "reth-tasks", - "reth-tokio-util", - "reth-tracing", - "reth-transaction-pool", + "reth-basic-payload-builder 1.9.2", + "reth-chain-state 1.9.2", + "reth-chainspec 1.9.2", + "reth-cli-util 1.9.2", + "reth-config 1.9.2", + "reth-consensus 1.9.2", + "reth-consensus-debug-client 1.9.2", + "reth-db 1.9.2", + "reth-db-api 1.9.2", + "reth-db-common 1.9.2", + "reth-downloaders 1.9.2", + "reth-engine-local 1.9.2", + "reth-engine-primitives 1.9.2", + "reth-engine-service 1.9.2", + "reth-engine-tree 1.9.2", + "reth-engine-util 1.9.2", + "reth-evm 1.9.2", + "reth-exex 1.9.2", + "reth-fs-util 1.9.2", + "reth-invalid-block-hooks 1.9.2", + "reth-network 1.9.2", + "reth-network-api 1.9.2", + "reth-network-p2p 1.9.2", + "reth-node-api 1.9.2", + "reth-node-core 1.9.2", + "reth-node-ethstats 1.9.2", + "reth-node-events 1.9.2", + "reth-node-metrics 1.9.2", + "reth-payload-builder 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-provider 1.9.2", + "reth-prune 1.9.2", + "reth-rpc 1.9.2", + "reth-rpc-api 1.9.2", + "reth-rpc-builder 1.9.2", + "reth-rpc-engine-api 1.9.2", + "reth-rpc-eth-types 1.9.2", + "reth-rpc-layer 1.9.2", + "reth-stages 1.9.2", + "reth-static-file 1.9.2", + "reth-tasks 1.9.2", + "reth-tokio-util 1.9.2", + "reth-tracing 1.9.2", + "reth-transaction-pool 1.9.2", + "secp256k1 0.30.0", + "serde_json", + "tokio", + "tokio-stream", + "tracing", +] + +[[package]] +name = "reth-node-builder" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-provider", + "alloy-rpc-types", + "alloy-rpc-types-engine", + "aquamarine", + "eyre", + "fdlimit", + "futures", + "jsonrpsee", + "rayon", + "reth-basic-payload-builder 1.9.3", + "reth-chain-state 1.9.3", + "reth-chainspec 1.9.3", + "reth-cli-util 1.9.3", + "reth-config 1.9.3", + "reth-consensus 1.9.3", + "reth-consensus-debug-client 1.9.3", + "reth-db 1.9.3", + "reth-db-api 1.9.3", + "reth-db-common 1.9.3", + "reth-downloaders 1.9.3", + "reth-engine-local 1.9.3", + "reth-engine-primitives 1.9.3", + "reth-engine-service 1.9.3", + "reth-engine-tree 1.9.3", + "reth-engine-util 1.9.3", + "reth-evm 1.9.3", + "reth-exex 1.9.3", + "reth-fs-util 1.9.3", + "reth-invalid-block-hooks 1.9.3", + "reth-network 1.9.3", + "reth-network-api 1.9.3", + "reth-network-p2p 1.9.3", + "reth-node-api 1.9.3", + "reth-node-core 1.9.3", + "reth-node-ethstats 1.9.3", + "reth-node-events 1.9.3", + "reth-node-metrics 1.9.3", + "reth-payload-builder 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-provider 1.9.3", + "reth-prune 1.9.3", + "reth-rpc 1.9.3", + "reth-rpc-api 1.9.3", + "reth-rpc-builder 1.9.3", + "reth-rpc-engine-api 1.9.3", + "reth-rpc-eth-types 1.9.3", + "reth-rpc-layer 1.9.3", + "reth-stages 1.9.3", + "reth-static-file 1.9.3", + "reth-tasks 1.9.3", + "reth-tokio-util 1.9.3", + "reth-tracing 1.9.3", + "reth-transaction-pool 1.9.3", "secp256k1 0.30.0", "serde_json", "tokio", @@ -8181,31 +9505,84 @@ dependencies = [ "futures", "humantime", "rand 0.9.1", - "reth-chainspec", - "reth-cli-util", - "reth-config", - "reth-consensus", - "reth-db", - "reth-discv4", - "reth-discv5", - "reth-engine-local", - "reth-engine-primitives", - "reth-ethereum-forks", - "reth-net-nat", - "reth-network", - "reth-network-p2p", - "reth-network-peers", - "reth-primitives-traits", - "reth-prune-types", - "reth-rpc-convert", - "reth-rpc-eth-types", - "reth-rpc-server-types", - "reth-stages-types", - "reth-storage-api", - "reth-storage-errors", - "reth-tracing", - "reth-tracing-otlp", - "reth-transaction-pool", + "reth-chainspec 1.9.2", + "reth-cli-util 1.9.2", + "reth-config 1.9.2", + "reth-consensus 1.9.2", + "reth-db 1.9.2", + "reth-discv4 1.9.2", + "reth-discv5 1.9.2", + "reth-engine-local 1.9.2", + "reth-engine-primitives 1.9.2", + "reth-ethereum-forks 1.9.2", + "reth-net-nat 1.9.2", + "reth-network 1.9.2", + "reth-network-p2p 1.9.2", + "reth-network-peers 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-prune-types 1.9.2", + "reth-rpc-convert 1.9.2", + "reth-rpc-eth-types 1.9.2", + "reth-rpc-server-types 1.9.2", + "reth-stages-types 1.9.2", + "reth-storage-api 1.9.2", + "reth-storage-errors 1.9.2", + "reth-tracing 1.9.2", + "reth-tracing-otlp 1.9.2", + "reth-transaction-pool 1.9.2", + "secp256k1 0.30.0", + "serde", + "shellexpand", + "strum 0.27.1", + "thiserror 2.0.12", + "toml", + "tracing", + "url", + "vergen", + "vergen-git2", +] + +[[package]] +name = "reth-node-core" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rpc-types-engine", + "clap", + "derive_more", + "dirs-next", + "eyre", + "futures", + "humantime", + "rand 0.9.1", + "reth-chainspec 1.9.3", + "reth-cli-util 1.9.3", + "reth-config 1.9.3", + "reth-consensus 1.9.3", + "reth-db 1.9.3", + "reth-discv4 1.9.3", + "reth-discv5 1.9.3", + "reth-engine-local 1.9.3", + "reth-engine-primitives 1.9.3", + "reth-ethereum-forks 1.9.3", + "reth-net-nat 1.9.3", + "reth-network 1.9.3", + "reth-network-p2p 1.9.3", + "reth-network-peers 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-prune-types 1.9.3", + "reth-rpc-convert 1.9.3", + "reth-rpc-eth-types 1.9.3", + "reth-rpc-server-types 1.9.3", + "reth-stages-types 1.9.3", + "reth-storage-api 1.9.3", + "reth-storage-errors 1.9.3", + "reth-tracing 1.9.3", + "reth-tracing-otlp 1.9.3", + "reth-transaction-pool 1.9.3", "secp256k1 0.30.0", "serde", "shellexpand", @@ -8228,30 +9605,30 @@ dependencies = [ "alloy-rpc-types-engine", "alloy-rpc-types-eth", "eyre", - "reth-chainspec", - "reth-engine-local", - "reth-engine-primitives", + "reth-chainspec 1.9.2", + "reth-engine-local 1.9.2", + "reth-engine-primitives 1.9.2", "reth-ethereum-consensus", - "reth-ethereum-engine-primitives", + "reth-ethereum-engine-primitives 1.9.2", "reth-ethereum-payload-builder", - "reth-ethereum-primitives", - "reth-evm", - "reth-evm-ethereum", - "reth-network", - "reth-node-api", - "reth-node-builder", - "reth-payload-primitives", - "reth-primitives-traits", - "reth-provider", - "reth-revm", - "reth-rpc", - "reth-rpc-api", - "reth-rpc-builder", - "reth-rpc-eth-api", - "reth-rpc-eth-types", - "reth-rpc-server-types", - "reth-tracing", - "reth-transaction-pool", + "reth-ethereum-primitives 1.9.2", + "reth-evm 1.9.2", + "reth-evm-ethereum 1.9.2", + "reth-network 1.9.2", + "reth-node-api 1.9.2", + "reth-node-builder 1.9.2", + "reth-payload-primitives 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-provider 1.9.2", + "reth-revm 1.9.2", + "reth-rpc 1.9.2", + "reth-rpc-api 1.9.2", + "reth-rpc-builder 1.9.2", + "reth-rpc-eth-api 1.9.2", + "reth-rpc-eth-types 1.9.2", + "reth-rpc-server-types 1.9.2", + "reth-tracing 1.9.2", + "reth-transaction-pool 1.9.2", "revm", "tokio", ] @@ -8265,11 +9642,35 @@ dependencies = [ "alloy-primitives", "chrono", "futures-util", - "reth-chain-state", - "reth-network-api", - "reth-primitives-traits", - "reth-storage-api", - "reth-transaction-pool", + "reth-chain-state 1.9.2", + "reth-network-api 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-storage-api 1.9.2", + "reth-transaction-pool 1.9.2", + "serde", + "serde_json", + "thiserror 2.0.12", + "tokio", + "tokio-stream", + "tokio-tungstenite", + "tracing", + "url", +] + +[[package]] +name = "reth-node-ethstats" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-primitives", + "chrono", + "futures-util", + "reth-chain-state 1.9.3", + "reth-network-api 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-storage-api 1.9.3", + "reth-transaction-pool 1.9.3", "serde", "serde_json", "thiserror 2.0.12", @@ -8293,13 +9694,37 @@ dependencies = [ "futures", "humantime", "pin-project", - "reth-engine-primitives", - "reth-network-api", - "reth-primitives-traits", - "reth-prune-types", - "reth-stages", - "reth-static-file-types", - "reth-storage-api", + "reth-engine-primitives 1.9.2", + "reth-network-api 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-prune-types 1.9.2", + "reth-stages 1.9.2", + "reth-static-file-types 1.9.2", + "reth-storage-api 1.9.2", + "tokio", + "tracing", +] + +[[package]] +name = "reth-node-events" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rpc-types-engine", + "derive_more", + "futures", + "humantime", + "pin-project", + "reth-engine-primitives 1.9.3", + "reth-network-api 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-prune-types 1.9.3", + "reth-stages 1.9.3", + "reth-static-file-types 1.9.3", + "reth-storage-api 1.9.3", "tokio", "tracing", ] @@ -8318,8 +9743,29 @@ dependencies = [ "metrics-util", "procfs", "reqwest", - "reth-metrics", - "reth-tasks", + "reth-metrics 1.9.2", + "reth-tasks 1.9.2", + "tokio", + "tower", + "tracing", +] + +[[package]] +name = "reth-node-metrics" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "eyre", + "http", + "jsonrpsee-server", + "metrics", + "metrics-exporter-prometheus", + "metrics-process", + "metrics-util", + "procfs", + "reqwest", + "reth-metrics 1.9.3", + "reth-tasks 1.9.3", "tokio", "tower", "tracing", @@ -8330,11 +9776,23 @@ name = "reth-node-types" version = "1.9.2" source = "git+https://github.com/gattaca-com/based-op-reth?rev=b053849462eb48e61b24d965cfee59cead7f8a3b#b053849462eb48e61b24d965cfee59cead7f8a3b" dependencies = [ - "reth-chainspec", - "reth-db-api", - "reth-engine-primitives", - "reth-payload-primitives", - "reth-primitives-traits", + "reth-chainspec 1.9.2", + "reth-db-api 1.9.2", + "reth-engine-primitives 1.9.2", + "reth-payload-primitives 1.9.2", + "reth-primitives-traits 1.9.2", +] + +[[package]] +name = "reth-node-types" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "reth-chainspec 1.9.3", + "reth-db-api 1.9.3", + "reth-engine-primitives 1.9.3", + "reth-payload-primitives 1.9.3", + "reth-primitives-traits 1.9.3", ] [[package]] @@ -8353,12 +9811,40 @@ dependencies = [ "op-alloy-consensus", "op-alloy-rpc-types", "paste 1.0.15", - "reth-chainspec", - "reth-ethereum-forks", - "reth-network-peers", - "reth-optimism-forks", - "reth-optimism-primitives", - "reth-primitives-traits", + "reth-chainspec 1.9.2", + "reth-ethereum-forks 1.9.2", + "reth-network-peers 1.9.2", + "reth-optimism-forks 1.9.2", + "reth-optimism-primitives 1.9.2", + "reth-primitives-traits 1.9.2", + "serde", + "serde_json", + "tar-no-std", + "thiserror 2.0.12", +] + +[[package]] +name = "reth-optimism-chainspec" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-chains", + "alloy-consensus", + "alloy-eips", + "alloy-genesis", + "alloy-hardforks", + "alloy-primitives", + "derive_more", + "miniz_oxide", + "op-alloy-consensus", + "op-alloy-rpc-types", + "paste 1.0.15", + "reth-chainspec 1.9.3", + "reth-ethereum-forks 1.9.3", + "reth-network-peers 1.9.3", + "reth-optimism-forks 1.9.3", + "reth-optimism-primitives 1.9.3", + "reth-primitives-traits 1.9.3", "serde", "serde_json", "tar-no-std", @@ -8379,35 +9865,35 @@ dependencies = [ "eyre", "futures-util", "op-alloy-consensus", - "reth-chainspec", - "reth-cli", - "reth-cli-commands", - "reth-cli-runner", - "reth-consensus", - "reth-db", - "reth-db-api", - "reth-db-common", - "reth-downloaders", - "reth-execution-types", - "reth-fs-util", - "reth-node-builder", - "reth-node-core", - "reth-node-events", - "reth-node-metrics", - "reth-optimism-chainspec", - "reth-optimism-consensus", - "reth-optimism-evm", - "reth-optimism-node", - "reth-optimism-primitives", - "reth-primitives-traits", - "reth-provider", - "reth-prune", - "reth-rpc-server-types", - "reth-stages", - "reth-static-file", - "reth-static-file-types", - "reth-tracing", - "reth-tracing-otlp", + "reth-chainspec 1.9.2", + "reth-cli 1.9.2", + "reth-cli-commands 1.9.2", + "reth-cli-runner 1.9.2", + "reth-consensus 1.9.2", + "reth-db 1.9.2", + "reth-db-api 1.9.2", + "reth-db-common 1.9.2", + "reth-downloaders 1.9.2", + "reth-execution-types 1.9.2", + "reth-fs-util 1.9.2", + "reth-node-builder 1.9.2", + "reth-node-core 1.9.2", + "reth-node-events 1.9.2", + "reth-node-metrics 1.9.2", + "reth-optimism-chainspec 1.9.2", + "reth-optimism-consensus 1.9.2", + "reth-optimism-evm 1.9.2", + "reth-optimism-node 1.9.2", + "reth-optimism-primitives 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-provider 1.9.2", + "reth-prune 1.9.2", + "reth-rpc-server-types 1.9.2", + "reth-stages 1.9.2", + "reth-static-file 1.9.2", + "reth-static-file-types 1.9.2", + "reth-tracing 1.9.2", + "reth-tracing-otlp 1.9.2", "serde", "tokio", "tokio-util", @@ -8416,25 +9902,100 @@ dependencies = [ ] [[package]] -name = "reth-optimism-consensus" -version = "1.9.2" +name = "reth-optimism-cli" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "clap", + "derive_more", + "eyre", + "futures-util", + "op-alloy-consensus", + "reth-chainspec 1.9.3", + "reth-cli 1.9.3", + "reth-cli-commands 1.9.3", + "reth-cli-runner 1.9.3", + "reth-consensus 1.9.3", + "reth-db 1.9.3", + "reth-db-api 1.9.3", + "reth-db-common 1.9.3", + "reth-downloaders 1.9.3", + "reth-execution-types 1.9.3", + "reth-fs-util 1.9.3", + "reth-node-builder 1.9.3", + "reth-node-core 1.9.3", + "reth-node-events 1.9.3", + "reth-node-metrics 1.9.3", + "reth-optimism-chainspec 1.9.3", + "reth-optimism-consensus 1.9.3", + "reth-optimism-evm 1.9.3", + "reth-optimism-node 1.9.3", + "reth-optimism-primitives 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-provider 1.9.3", + "reth-prune 1.9.3", + "reth-rpc-server-types 1.9.3", + "reth-stages 1.9.3", + "reth-static-file 1.9.3", + "reth-static-file-types 1.9.3", + "reth-tracing 1.9.3", + "reth-tracing-otlp 1.9.3", + "serde", + "tokio", + "tokio-util", + "tracing", + "url", +] + +[[package]] +name = "reth-optimism-consensus" +version = "1.9.2" source = "git+https://github.com/gattaca-com/based-op-reth?rev=b053849462eb48e61b24d965cfee59cead7f8a3b#b053849462eb48e61b24d965cfee59cead7f8a3b" dependencies = [ "alloy-consensus", "alloy-eips", "alloy-primitives", "alloy-trie", - "reth-chainspec", - "reth-consensus", - "reth-consensus-common", - "reth-execution-types", - "reth-optimism-chainspec", - "reth-optimism-forks", - "reth-optimism-primitives", - "reth-primitives-traits", - "reth-storage-api", - "reth-storage-errors", - "reth-trie-common", + "reth-chainspec 1.9.2", + "reth-consensus 1.9.2", + "reth-consensus-common 1.9.2", + "reth-execution-types 1.9.2", + "reth-optimism-chainspec 1.9.2", + "reth-optimism-forks 1.9.2", + "reth-optimism-primitives 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-storage-api 1.9.2", + "reth-storage-errors 1.9.2", + "reth-trie-common 1.9.2", + "revm", + "thiserror 2.0.12", + "tracing", +] + +[[package]] +name = "reth-optimism-consensus" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-trie", + "reth-chainspec 1.9.3", + "reth-consensus 1.9.3", + "reth-consensus-common 1.9.3", + "reth-execution-types 1.9.3", + "reth-optimism-chainspec 1.9.3", + "reth-optimism-forks 1.9.3", + "reth-optimism-primitives 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-storage-api 1.9.3", + "reth-storage-errors 1.9.3", + "reth-trie-common 1.9.3", "revm", "thiserror 2.0.12", "tracing", @@ -8453,17 +10014,45 @@ dependencies = [ "op-alloy-consensus", "op-alloy-rpc-types-engine", "op-revm", - "reth-chainspec", - "reth-evm", - "reth-execution-errors", - "reth-execution-types", - "reth-optimism-chainspec", - "reth-optimism-consensus", - "reth-optimism-forks", - "reth-optimism-primitives", - "reth-primitives-traits", - "reth-rpc-eth-api", - "reth-storage-errors", + "reth-chainspec 1.9.2", + "reth-evm 1.9.2", + "reth-execution-errors 1.9.2", + "reth-execution-types 1.9.2", + "reth-optimism-chainspec 1.9.2", + "reth-optimism-consensus 1.9.2", + "reth-optimism-forks 1.9.2", + "reth-optimism-primitives 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-rpc-eth-api 1.9.2", + "reth-storage-errors 1.9.2", + "revm", + "thiserror 2.0.12", +] + +[[package]] +name = "reth-optimism-evm" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-evm", + "alloy-op-evm", + "alloy-primitives", + "op-alloy-consensus", + "op-alloy-rpc-types-engine", + "op-revm", + "reth-chainspec 1.9.3", + "reth-evm 1.9.3", + "reth-execution-errors 1.9.3", + "reth-execution-types 1.9.3", + "reth-optimism-chainspec 1.9.3", + "reth-optimism-consensus 1.9.3", + "reth-optimism-forks 1.9.3", + "reth-optimism-primitives 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-rpc-eth-api 1.9.3", + "reth-storage-errors 1.9.3", "revm", "thiserror 2.0.12", ] @@ -8483,21 +10072,60 @@ dependencies = [ "eyre", "futures-util", "metrics", - "reth-chain-state", - "reth-engine-primitives", - "reth-errors", - "reth-evm", - "reth-execution-types", - "reth-metrics", - "reth-optimism-evm", - "reth-optimism-payload-builder", - "reth-optimism-primitives", - "reth-payload-primitives", - "reth-primitives-traits", - "reth-revm", - "reth-rpc-eth-types", - "reth-storage-api", - "reth-tasks", + "reth-chain-state 1.9.2", + "reth-engine-primitives 1.9.2", + "reth-errors 1.9.2", + "reth-evm 1.9.2", + "reth-execution-types 1.9.2", + "reth-metrics 1.9.2", + "reth-optimism-evm 1.9.2", + "reth-optimism-payload-builder 1.9.2", + "reth-optimism-primitives 1.9.2", + "reth-payload-primitives 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-revm 1.9.2", + "reth-rpc-eth-types 1.9.2", + "reth-storage-api 1.9.2", + "reth-tasks 1.9.2", + "ringbuffer", + "serde", + "serde_json", + "tokio", + "tokio-tungstenite", + "tracing", + "url", +] + +[[package]] +name = "reth-optimism-flashblocks" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rpc-types-engine", + "alloy-serde", + "brotli", + "derive_more", + "eyre", + "futures-util", + "metrics", + "reth-chain-state 1.9.3", + "reth-engine-primitives 1.9.3", + "reth-errors 1.9.3", + "reth-evm 1.9.3", + "reth-execution-types 1.9.3", + "reth-metrics 1.9.3", + "reth-optimism-evm 1.9.3", + "reth-optimism-payload-builder 1.9.3", + "reth-optimism-primitives 1.9.3", + "reth-payload-primitives 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-revm 1.9.3", + "reth-rpc-eth-types 1.9.3", + "reth-storage-api 1.9.3", + "reth-tasks 1.9.3", "ringbuffer", "serde", "serde_json", @@ -8515,7 +10143,18 @@ dependencies = [ "alloy-op-hardforks", "alloy-primitives", "once_cell", - "reth-ethereum-forks", + "reth-ethereum-forks 1.9.2", +] + +[[package]] +name = "reth-optimism-forks" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-op-hardforks", + "alloy-primitives", + "once_cell", + "reth-ethereum-forks 1.9.3", ] [[package]] @@ -8532,32 +10171,78 @@ dependencies = [ "op-alloy-consensus", "op-alloy-rpc-types-engine", "op-revm", - "reth-chainspec", - "reth-consensus", - "reth-engine-local", - "reth-evm", - "reth-network", - "reth-node-api", - "reth-node-builder", - "reth-node-core", - "reth-optimism-chainspec", - "reth-optimism-consensus", - "reth-optimism-evm", - "reth-optimism-forks", - "reth-optimism-payload-builder", - "reth-optimism-primitives", - "reth-optimism-rpc", - "reth-optimism-storage", - "reth-optimism-txpool", - "reth-payload-builder", - "reth-primitives-traits", - "reth-provider", - "reth-rpc-api", - "reth-rpc-engine-api", - "reth-rpc-server-types", - "reth-tracing", - "reth-transaction-pool", - "reth-trie-common", + "reth-chainspec 1.9.2", + "reth-consensus 1.9.2", + "reth-engine-local 1.9.2", + "reth-evm 1.9.2", + "reth-network 1.9.2", + "reth-node-api 1.9.2", + "reth-node-builder 1.9.2", + "reth-node-core 1.9.2", + "reth-optimism-chainspec 1.9.2", + "reth-optimism-consensus 1.9.2", + "reth-optimism-evm 1.9.2", + "reth-optimism-forks 1.9.2", + "reth-optimism-payload-builder 1.9.2", + "reth-optimism-primitives 1.9.2", + "reth-optimism-rpc 1.9.2", + "reth-optimism-storage 1.9.2", + "reth-optimism-txpool 1.9.2", + "reth-payload-builder 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-provider 1.9.2", + "reth-rpc-api 1.9.2", + "reth-rpc-engine-api 1.9.2", + "reth-rpc-server-types 1.9.2", + "reth-tracing 1.9.2", + "reth-transaction-pool 1.9.2", + "reth-trie-common 1.9.2", + "revm", + "serde", + "tokio", + "url", +] + +[[package]] +name = "reth-optimism-node" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-primitives", + "alloy-rpc-types-engine", + "alloy-rpc-types-eth", + "clap", + "eyre", + "op-alloy-consensus", + "op-alloy-rpc-types-engine", + "op-revm", + "reth-chainspec 1.9.3", + "reth-consensus 1.9.3", + "reth-engine-local 1.9.3", + "reth-evm 1.9.3", + "reth-network 1.9.3", + "reth-node-api 1.9.3", + "reth-node-builder 1.9.3", + "reth-node-core 1.9.3", + "reth-optimism-chainspec 1.9.3", + "reth-optimism-consensus 1.9.3", + "reth-optimism-evm 1.9.3", + "reth-optimism-forks 1.9.3", + "reth-optimism-payload-builder 1.9.3", + "reth-optimism-primitives 1.9.3", + "reth-optimism-rpc 1.9.3", + "reth-optimism-storage 1.9.3", + "reth-optimism-txpool 1.9.3", + "reth-payload-builder 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-provider 1.9.3", + "reth-rpc-api 1.9.3", + "reth-rpc-engine-api 1.9.3", + "reth-rpc-server-types 1.9.3", + "reth-tracing 1.9.3", + "reth-transaction-pool 1.9.3", + "reth-trie-common 1.9.3", "revm", "serde", "tokio", @@ -8579,24 +10264,64 @@ dependencies = [ "derive_more", "op-alloy-consensus", "op-alloy-rpc-types-engine", - "reth-basic-payload-builder", - "reth-chain-state", - "reth-chainspec", - "reth-evm", - "reth-execution-types", - "reth-optimism-evm", - "reth-optimism-forks", - "reth-optimism-primitives", - "reth-optimism-txpool", - "reth-payload-builder", - "reth-payload-builder-primitives", - "reth-payload-primitives", - "reth-payload-util", - "reth-payload-validator", - "reth-primitives-traits", - "reth-revm", - "reth-storage-api", - "reth-transaction-pool", + "reth-basic-payload-builder 1.9.2", + "reth-chain-state 1.9.2", + "reth-chainspec 1.9.2", + "reth-evm 1.9.2", + "reth-execution-types 1.9.2", + "reth-optimism-evm 1.9.2", + "reth-optimism-forks 1.9.2", + "reth-optimism-primitives 1.9.2", + "reth-optimism-txpool 1.9.2", + "reth-payload-builder 1.9.2", + "reth-payload-builder-primitives 1.9.2", + "reth-payload-primitives 1.9.2", + "reth-payload-util 1.9.2", + "reth-payload-validator 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-revm 1.9.2", + "reth-storage-api 1.9.2", + "reth-transaction-pool 1.9.2", + "revm", + "serde", + "sha2", + "thiserror 2.0.12", + "tracing", +] + +[[package]] +name = "reth-optimism-payload-builder" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-evm", + "alloy-primitives", + "alloy-rlp", + "alloy-rpc-types-debug", + "alloy-rpc-types-engine", + "derive_more", + "op-alloy-consensus", + "op-alloy-rpc-types-engine", + "reth-basic-payload-builder 1.9.3", + "reth-chain-state 1.9.3", + "reth-chainspec 1.9.3", + "reth-evm 1.9.3", + "reth-execution-types 1.9.3", + "reth-optimism-evm 1.9.3", + "reth-optimism-forks 1.9.3", + "reth-optimism-primitives 1.9.3", + "reth-optimism-txpool 1.9.3", + "reth-payload-builder 1.9.3", + "reth-payload-builder-primitives 1.9.3", + "reth-payload-primitives 1.9.3", + "reth-payload-util 1.9.3", + "reth-payload-validator 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-revm 1.9.3", + "reth-storage-api 1.9.3", + "reth-transaction-pool 1.9.3", "revm", "serde", "sha2", @@ -8617,9 +10342,28 @@ dependencies = [ "bytes", "modular-bitfield", "op-alloy-consensus", - "reth-codecs", - "reth-primitives-traits", - "reth-zstd-compressors", + "reth-codecs 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-zstd-compressors 1.9.2", + "serde", + "serde_with", +] + +[[package]] +name = "reth-optimism-primitives" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "bytes", + "modular-bitfield", + "op-alloy-consensus", + "reth-codecs 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-zstd-compressors 1.9.3", "serde", "serde_with", ] @@ -8654,28 +10398,89 @@ dependencies = [ "op-alloy-rpc-types-engine", "op-revm", "reqwest", - "reth-chain-state", - "reth-chainspec", - "reth-evm", - "reth-metrics", - "reth-node-api", - "reth-node-builder", - "reth-optimism-evm", - "reth-optimism-flashblocks", - "reth-optimism-forks", - "reth-optimism-payload-builder", - "reth-optimism-primitives", - "reth-optimism-txpool", - "reth-primitives-traits", - "reth-rpc", - "reth-rpc-api", - "reth-rpc-engine-api", - "reth-rpc-eth-api", - "reth-rpc-eth-types", - "reth-rpc-server-types", - "reth-storage-api", - "reth-tasks", - "reth-transaction-pool", + "reth-chain-state 1.9.2", + "reth-chainspec 1.9.2", + "reth-evm 1.9.2", + "reth-metrics 1.9.2", + "reth-node-api 1.9.2", + "reth-node-builder 1.9.2", + "reth-optimism-evm 1.9.2", + "reth-optimism-flashblocks 1.9.2", + "reth-optimism-forks 1.9.2", + "reth-optimism-payload-builder 1.9.2", + "reth-optimism-primitives 1.9.2", + "reth-optimism-txpool 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-rpc 1.9.2", + "reth-rpc-api 1.9.2", + "reth-rpc-engine-api 1.9.2", + "reth-rpc-eth-api 1.9.2", + "reth-rpc-eth-types 1.9.2", + "reth-rpc-server-types 1.9.2", + "reth-storage-api 1.9.2", + "reth-tasks 1.9.2", + "reth-transaction-pool 1.9.2", + "revm", + "serde_json", + "thiserror 2.0.12", + "tokio", + "tokio-stream", + "tower", + "tracing", +] + +[[package]] +name = "reth-optimism-rpc" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-json-rpc", + "alloy-primitives", + "alloy-rpc-client", + "alloy-rpc-types-debug", + "alloy-rpc-types-engine", + "alloy-rpc-types-eth", + "alloy-transport", + "alloy-transport-http", + "async-trait", + "derive_more", + "eyre", + "futures", + "jsonrpsee", + "jsonrpsee-core", + "jsonrpsee-types", + "metrics", + "op-alloy-consensus", + "op-alloy-network", + "op-alloy-rpc-jsonrpsee", + "op-alloy-rpc-types", + "op-alloy-rpc-types-engine", + "op-revm", + "reqwest", + "reth-chain-state 1.9.3", + "reth-chainspec 1.9.3", + "reth-evm 1.9.3", + "reth-metrics 1.9.3", + "reth-node-api 1.9.3", + "reth-node-builder 1.9.3", + "reth-optimism-evm 1.9.3", + "reth-optimism-flashblocks 1.9.3", + "reth-optimism-forks 1.9.3", + "reth-optimism-payload-builder 1.9.3", + "reth-optimism-primitives 1.9.3", + "reth-optimism-txpool 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-rpc 1.9.3", + "reth-rpc-api 1.9.3", + "reth-rpc-engine-api 1.9.3", + "reth-rpc-eth-api 1.9.3", + "reth-rpc-eth-types 1.9.3", + "reth-rpc-server-types 1.9.3", + "reth-storage-api 1.9.3", + "reth-tasks 1.9.3", + "reth-transaction-pool 1.9.3", "revm", "serde_json", "thiserror 2.0.12", @@ -8691,8 +10496,18 @@ version = "1.9.2" source = "git+https://github.com/gattaca-com/based-op-reth?rev=b053849462eb48e61b24d965cfee59cead7f8a3b#b053849462eb48e61b24d965cfee59cead7f8a3b" dependencies = [ "alloy-consensus", - "reth-optimism-primitives", - "reth-storage-api", + "reth-optimism-primitives 1.9.2", + "reth-storage-api 1.9.2", +] + +[[package]] +name = "reth-optimism-storage" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "reth-optimism-primitives 1.9.3", + "reth-storage-api 1.9.3", ] [[package]] @@ -8716,15 +10531,51 @@ dependencies = [ "op-alloy-rpc-types", "op-revm", "parking_lot", - "reth-chain-state", - "reth-chainspec", - "reth-metrics", - "reth-optimism-evm", - "reth-optimism-forks", - "reth-optimism-primitives", - "reth-primitives-traits", - "reth-storage-api", - "reth-transaction-pool", + "reth-chain-state 1.9.2", + "reth-chainspec 1.9.2", + "reth-metrics 1.9.2", + "reth-optimism-evm 1.9.2", + "reth-optimism-forks 1.9.2", + "reth-optimism-primitives 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-storage-api 1.9.2", + "reth-transaction-pool 1.9.2", + "serde", + "thiserror 2.0.12", + "tokio", + "tracing", +] + +[[package]] +name = "reth-optimism-txpool" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-json-rpc", + "alloy-primitives", + "alloy-rpc-client", + "alloy-rpc-types-eth", + "alloy-serde", + "c-kzg", + "derive_more", + "futures-util", + "metrics", + "op-alloy-consensus", + "op-alloy-flz", + "op-alloy-rpc-types", + "op-revm", + "parking_lot", + "reth-chain-state 1.9.3", + "reth-chainspec 1.9.3", + "reth-metrics 1.9.3", + "reth-optimism-evm 1.9.3", + "reth-optimism-forks 1.9.3", + "reth-optimism-primitives 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-storage-api 1.9.3", + "reth-transaction-pool 1.9.3", "serde", "thiserror 2.0.12", "tokio", @@ -8741,12 +10592,33 @@ dependencies = [ "alloy-rpc-types", "futures-util", "metrics", - "reth-chain-state", - "reth-ethereum-engine-primitives", - "reth-metrics", - "reth-payload-builder-primitives", - "reth-payload-primitives", - "reth-primitives-traits", + "reth-chain-state 1.9.2", + "reth-ethereum-engine-primitives 1.9.2", + "reth-metrics 1.9.2", + "reth-payload-builder-primitives 1.9.2", + "reth-payload-primitives 1.9.2", + "reth-primitives-traits 1.9.2", + "tokio", + "tokio-stream", + "tracing", +] + +[[package]] +name = "reth-payload-builder" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-primitives", + "alloy-rpc-types", + "futures-util", + "metrics", + "reth-chain-state 1.9.3", + "reth-ethereum-engine-primitives 1.9.3", + "reth-metrics 1.9.3", + "reth-payload-builder-primitives 1.9.3", + "reth-payload-primitives 1.9.3", + "reth-primitives-traits 1.9.3", "tokio", "tokio-stream", "tracing", @@ -8758,7 +10630,19 @@ version = "1.9.2" source = "git+https://github.com/gattaca-com/based-op-reth?rev=b053849462eb48e61b24d965cfee59cead7f8a3b#b053849462eb48e61b24d965cfee59cead7f8a3b" dependencies = [ "pin-project", - "reth-payload-primitives", + "reth-payload-primitives 1.9.2", + "tokio", + "tokio-stream", + "tracing", +] + +[[package]] +name = "reth-payload-builder-primitives" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "pin-project", + "reth-payload-primitives 1.9.3", "tokio", "tokio-stream", "tracing", @@ -8775,10 +10659,30 @@ dependencies = [ "auto_impl", "either", "op-alloy-rpc-types-engine", - "reth-chain-state", - "reth-chainspec", - "reth-errors", - "reth-primitives-traits", + "reth-chain-state 1.9.2", + "reth-chainspec 1.9.2", + "reth-errors 1.9.2", + "reth-primitives-traits 1.9.2", + "serde", + "thiserror 2.0.12", + "tokio", +] + +[[package]] +name = "reth-payload-primitives" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "alloy-rpc-types-engine", + "auto_impl", + "either", + "op-alloy-rpc-types-engine", + "reth-chain-state 1.9.3", + "reth-chainspec 1.9.3", + "reth-errors 1.9.3", + "reth-primitives-traits 1.9.3", "serde", "thiserror 2.0.12", "tokio", @@ -8791,7 +10695,17 @@ source = "git+https://github.com/gattaca-com/based-op-reth?rev=b053849462eb48e61 dependencies = [ "alloy-consensus", "alloy-primitives", - "reth-transaction-pool", + "reth-transaction-pool 1.9.2", +] + +[[package]] +name = "reth-payload-util" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-primitives", + "reth-transaction-pool 1.9.3", ] [[package]] @@ -8801,7 +10715,17 @@ source = "git+https://github.com/gattaca-com/based-op-reth?rev=b053849462eb48e61 dependencies = [ "alloy-consensus", "alloy-rpc-types-engine", - "reth-primitives-traits", + "reth-primitives-traits 1.9.2", +] + +[[package]] +name = "reth-payload-validator" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-rpc-types-engine", + "reth-primitives-traits 1.9.3", ] [[package]] @@ -8812,10 +10736,10 @@ dependencies = [ "alloy-consensus", "c-kzg", "once_cell", - "reth-ethereum-forks", - "reth-ethereum-primitives", - "reth-primitives-traits", - "reth-static-file-types", + "reth-ethereum-forks 1.9.2", + "reth-ethereum-primitives 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-static-file-types 1.9.2", ] [[package]] @@ -8841,7 +10765,37 @@ dependencies = [ "proptest", "proptest-arbitrary-interop", "rayon", - "reth-codecs", + "reth-codecs 1.9.2", + "revm-bytecode", + "revm-primitives", + "revm-state", + "secp256k1 0.30.0", + "serde", + "serde_with", + "thiserror 2.0.12", +] + +[[package]] +name = "reth-primitives-traits" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-genesis", + "alloy-primitives", + "alloy-rlp", + "alloy-rpc-types-eth", + "alloy-trie", + "auto_impl", + "byteorder", + "bytes", + "derive_more", + "modular-bitfield", + "once_cell", + "op-alloy-consensus", + "rayon", + "reth-codecs 1.9.3", "revm-bytecode", "revm-primitives", "revm-state", @@ -8867,27 +10821,27 @@ dependencies = [ "notify", "parking_lot", "rayon", - "reth-chain-state", - "reth-chainspec", - "reth-codecs", - "reth-db", - "reth-db-api", - "reth-errors", - "reth-ethereum-engine-primitives", - "reth-ethereum-primitives", - "reth-execution-types", - "reth-fs-util", - "reth-metrics", - "reth-nippy-jar", - "reth-node-types", - "reth-primitives-traits", - "reth-prune-types", - "reth-stages-types", - "reth-static-file-types", - "reth-storage-api", - "reth-storage-errors", - "reth-trie", - "reth-trie-db", + "reth-chain-state 1.9.2", + "reth-chainspec 1.9.2", + "reth-codecs 1.9.2", + "reth-db 1.9.2", + "reth-db-api 1.9.2", + "reth-errors 1.9.2", + "reth-ethereum-engine-primitives 1.9.2", + "reth-ethereum-primitives 1.9.2", + "reth-execution-types 1.9.2", + "reth-fs-util 1.9.2", + "reth-metrics 1.9.2", + "reth-nippy-jar 1.9.2", + "reth-node-types 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-prune-types 1.9.2", + "reth-stages-types 1.9.2", + "reth-static-file-types 1.9.2", + "reth-storage-api 1.9.2", + "reth-storage-errors 1.9.2", + "reth-trie 1.9.2", + "reth-trie-db 1.9.2", "revm-database", "revm-state", "strum 0.27.1", @@ -8895,6 +10849,47 @@ dependencies = [ "tracing", ] +[[package]] +name = "reth-provider" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rpc-types-engine", + "dashmap 6.1.0", + "eyre", + "itertools 0.14.0", + "metrics", + "notify", + "parking_lot", + "rayon", + "reth-chain-state 1.9.3", + "reth-chainspec 1.9.3", + "reth-codecs 1.9.3", + "reth-db 1.9.3", + "reth-db-api 1.9.3", + "reth-errors 1.9.3", + "reth-ethereum-primitives 1.9.3", + "reth-execution-types 1.9.3", + "reth-fs-util 1.9.3", + "reth-metrics 1.9.3", + "reth-nippy-jar 1.9.3", + "reth-node-types 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-prune-types 1.9.3", + "reth-stages-types 1.9.3", + "reth-static-file-types 1.9.3", + "reth-storage-api 1.9.3", + "reth-storage-errors 1.9.3", + "reth-trie 1.9.3", + "reth-trie-db 1.9.3", + "revm-database", + "strum 0.27.1", + "tracing", +] + [[package]] name = "reth-prune" version = "1.9.2" @@ -8906,16 +10901,43 @@ dependencies = [ "itertools 0.14.0", "metrics", "rayon", - "reth-config", - "reth-db-api", - "reth-errors", - "reth-exex-types", - "reth-metrics", - "reth-primitives-traits", - "reth-provider", - "reth-prune-types", - "reth-static-file-types", - "reth-tokio-util", + "reth-config 1.9.2", + "reth-db-api 1.9.2", + "reth-errors 1.9.2", + "reth-exex-types 1.9.2", + "reth-metrics 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-provider 1.9.2", + "reth-prune-types 1.9.2", + "reth-static-file-types 1.9.2", + "reth-tokio-util 1.9.2", + "rustc-hash 2.1.1", + "thiserror 2.0.12", + "tokio", + "tracing", +] + +[[package]] +name = "reth-prune" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "itertools 0.14.0", + "metrics", + "rayon", + "reth-config 1.9.3", + "reth-db-api 1.9.3", + "reth-errors 1.9.3", + "reth-exex-types 1.9.3", + "reth-metrics 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-provider 1.9.3", + "reth-prune-types 1.9.3", + "reth-static-file-types 1.9.3", + "reth-tokio-util 1.9.3", "rustc-hash 2.1.1", "thiserror 2.0.12", "tokio", @@ -8931,7 +10953,21 @@ dependencies = [ "arbitrary", "derive_more", "modular-bitfield", - "reth-codecs", + "reth-codecs 1.9.2", + "serde", + "strum 0.27.1", + "thiserror 2.0.12", +] + +[[package]] +name = "reth-prune-types" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-primitives", + "derive_more", + "modular-bitfield", + "reth-codecs 1.9.3", "serde", "strum 0.27.1", "thiserror 2.0.12", @@ -8943,10 +10979,23 @@ version = "1.9.2" source = "git+https://github.com/gattaca-com/based-op-reth?rev=b053849462eb48e61b24d965cfee59cead7f8a3b#b053849462eb48e61b24d965cfee59cead7f8a3b" dependencies = [ "alloy-primitives", - "reth-primitives-traits", - "reth-storage-api", - "reth-storage-errors", - "reth-trie", + "reth-primitives-traits 1.9.2", + "reth-storage-api 1.9.2", + "reth-storage-errors 1.9.2", + "reth-trie 1.9.2", + "revm", +] + +[[package]] +name = "reth-revm" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-primitives", + "reth-primitives-traits 1.9.3", + "reth-storage-api 1.9.3", + "reth-storage-errors 1.9.3", + "reth-trie 1.9.3", "revm", ] @@ -8989,32 +11038,111 @@ dependencies = [ "jsonwebtoken", "parking_lot", "pin-project", - "reth-chain-state", - "reth-chainspec", - "reth-consensus", - "reth-consensus-common", - "reth-engine-primitives", - "reth-errors", - "reth-evm", - "reth-evm-ethereum", - "reth-execution-types", - "reth-metrics", - "reth-network-api", - "reth-network-peers", - "reth-network-types", - "reth-node-api", - "reth-primitives-traits", - "reth-revm", - "reth-rpc-api", - "reth-rpc-convert", - "reth-rpc-engine-api", - "reth-rpc-eth-api", - "reth-rpc-eth-types", - "reth-rpc-server-types", - "reth-storage-api", - "reth-tasks", - "reth-transaction-pool", - "reth-trie-common", + "reth-chain-state 1.9.2", + "reth-chainspec 1.9.2", + "reth-consensus 1.9.2", + "reth-consensus-common 1.9.2", + "reth-engine-primitives 1.9.2", + "reth-errors 1.9.2", + "reth-evm 1.9.2", + "reth-evm-ethereum 1.9.2", + "reth-execution-types 1.9.2", + "reth-metrics 1.9.2", + "reth-network-api 1.9.2", + "reth-network-peers 1.9.2", + "reth-network-types 1.9.2", + "reth-node-api 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-revm 1.9.2", + "reth-rpc-api 1.9.2", + "reth-rpc-convert 1.9.2", + "reth-rpc-engine-api 1.9.2", + "reth-rpc-eth-api 1.9.2", + "reth-rpc-eth-types 1.9.2", + "reth-rpc-server-types 1.9.2", + "reth-storage-api 1.9.2", + "reth-tasks 1.9.2", + "reth-transaction-pool 1.9.2", + "reth-trie-common 1.9.2", + "revm", + "revm-inspectors", + "revm-primitives", + "serde", + "serde_json", + "sha2", + "thiserror 2.0.12", + "tokio", + "tokio-stream", + "tower", + "tracing", + "tracing-futures", +] + +[[package]] +name = "reth-rpc" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-dyn-abi", + "alloy-eips", + "alloy-evm", + "alloy-genesis", + "alloy-network", + "alloy-primitives", + "alloy-rlp", + "alloy-rpc-client", + "alloy-rpc-types", + "alloy-rpc-types-admin", + "alloy-rpc-types-beacon", + "alloy-rpc-types-debug", + "alloy-rpc-types-engine", + "alloy-rpc-types-eth", + "alloy-rpc-types-mev", + "alloy-rpc-types-trace", + "alloy-rpc-types-txpool", + "alloy-serde", + "alloy-signer", + "alloy-signer-local", + "async-trait", + "derive_more", + "dyn-clone", + "futures", + "http", + "http-body", + "hyper", + "itertools 0.14.0", + "jsonrpsee", + "jsonrpsee-types", + "jsonwebtoken", + "parking_lot", + "pin-project", + "reth-chain-state 1.9.3", + "reth-chainspec 1.9.3", + "reth-consensus 1.9.3", + "reth-consensus-common 1.9.3", + "reth-engine-primitives 1.9.3", + "reth-errors 1.9.3", + "reth-evm 1.9.3", + "reth-evm-ethereum 1.9.3", + "reth-execution-types 1.9.3", + "reth-metrics 1.9.3", + "reth-network-api 1.9.3", + "reth-network-peers 1.9.3", + "reth-network-types 1.9.3", + "reth-node-api 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-revm 1.9.3", + "reth-rpc-api 1.9.3", + "reth-rpc-convert 1.9.3", + "reth-rpc-engine-api 1.9.3", + "reth-rpc-eth-api 1.9.3", + "reth-rpc-eth-types 1.9.3", + "reth-rpc-server-types 1.9.3", + "reth-storage-api 1.9.3", + "reth-tasks 1.9.3", + "reth-transaction-pool 1.9.3", + "reth-trie-common 1.9.3", "revm", "revm-inspectors", "revm-primitives", @@ -9050,11 +11178,39 @@ dependencies = [ "alloy-rpc-types-txpool", "alloy-serde", "jsonrpsee", - "reth-chain-state", - "reth-engine-primitives", - "reth-network-peers", - "reth-rpc-eth-api", - "reth-trie-common", + "reth-chain-state 1.9.2", + "reth-engine-primitives 1.9.2", + "reth-network-peers 1.9.2", + "reth-rpc-eth-api 1.9.2", + "reth-trie-common 1.9.2", +] + +[[package]] +name = "reth-rpc-api" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-eips", + "alloy-genesis", + "alloy-json-rpc", + "alloy-primitives", + "alloy-rpc-types", + "alloy-rpc-types-admin", + "alloy-rpc-types-anvil", + "alloy-rpc-types-beacon", + "alloy-rpc-types-debug", + "alloy-rpc-types-engine", + "alloy-rpc-types-eth", + "alloy-rpc-types-mev", + "alloy-rpc-types-trace", + "alloy-rpc-types-txpool", + "alloy-serde", + "jsonrpsee", + "reth-chain-state 1.9.3", + "reth-engine-primitives 1.9.3", + "reth-network-peers 1.9.3", + "reth-rpc-eth-api 1.9.3", + "reth-trie-common 1.9.3", ] [[package]] @@ -9069,24 +11225,63 @@ dependencies = [ "jsonrpsee", "metrics", "pin-project", - "reth-chain-state", - "reth-chainspec", - "reth-consensus", - "reth-evm", - "reth-ipc", - "reth-metrics", - "reth-network-api", - "reth-node-core", - "reth-primitives-traits", - "reth-rpc", - "reth-rpc-api", - "reth-rpc-eth-api", - "reth-rpc-eth-types", - "reth-rpc-layer", - "reth-rpc-server-types", - "reth-storage-api", - "reth-tasks", - "reth-transaction-pool", + "reth-chain-state 1.9.2", + "reth-chainspec 1.9.2", + "reth-consensus 1.9.2", + "reth-evm 1.9.2", + "reth-ipc 1.9.2", + "reth-metrics 1.9.2", + "reth-network-api 1.9.2", + "reth-node-core 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-rpc 1.9.2", + "reth-rpc-api 1.9.2", + "reth-rpc-eth-api 1.9.2", + "reth-rpc-eth-types 1.9.2", + "reth-rpc-layer 1.9.2", + "reth-rpc-server-types 1.9.2", + "reth-storage-api 1.9.2", + "reth-tasks 1.9.2", + "reth-transaction-pool 1.9.2", + "serde", + "thiserror 2.0.12", + "tokio", + "tokio-util", + "tower", + "tower-http", + "tracing", +] + +[[package]] +name = "reth-rpc-builder" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-network", + "alloy-provider", + "dyn-clone", + "http", + "jsonrpsee", + "metrics", + "pin-project", + "reth-chain-state 1.9.3", + "reth-chainspec 1.9.3", + "reth-consensus 1.9.3", + "reth-evm 1.9.3", + "reth-ipc 1.9.3", + "reth-metrics 1.9.3", + "reth-network-api 1.9.3", + "reth-node-core 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-rpc 1.9.3", + "reth-rpc-api 1.9.3", + "reth-rpc-eth-api 1.9.3", + "reth-rpc-eth-types 1.9.3", + "reth-rpc-layer 1.9.3", + "reth-rpc-server-types 1.9.3", + "reth-storage-api 1.9.3", + "reth-tasks 1.9.3", + "reth-transaction-pool 1.9.3", "serde", "thiserror 2.0.12", "tokio", @@ -9114,11 +11309,38 @@ dependencies = [ "op-alloy-network", "op-alloy-rpc-types", "op-revm", - "reth-ethereum-primitives", - "reth-evm", - "reth-optimism-primitives", - "reth-primitives-traits", - "reth-storage-api", + "reth-ethereum-primitives 1.9.2", + "reth-evm 1.9.2", + "reth-optimism-primitives 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-storage-api 1.9.2", + "revm-context", + "thiserror 2.0.12", +] + +[[package]] +name = "reth-rpc-convert" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-json-rpc", + "alloy-network", + "alloy-primitives", + "alloy-rpc-types-eth", + "alloy-signer", + "auto_impl", + "dyn-clone", + "jsonrpsee-types", + "op-alloy-consensus", + "op-alloy-network", + "op-alloy-rpc-types", + "op-revm", + "reth-ethereum-primitives 1.9.3", + "reth-evm 1.9.3", + "reth-optimism-primitives 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-storage-api 1.9.3", "revm-context", "thiserror 2.0.12", ] @@ -9136,17 +11358,47 @@ dependencies = [ "jsonrpsee-types", "metrics", "parking_lot", - "reth-chainspec", - "reth-engine-primitives", - "reth-metrics", - "reth-payload-builder", - "reth-payload-builder-primitives", - "reth-payload-primitives", - "reth-primitives-traits", - "reth-rpc-api", - "reth-storage-api", - "reth-tasks", - "reth-transaction-pool", + "reth-chainspec 1.9.2", + "reth-engine-primitives 1.9.2", + "reth-metrics 1.9.2", + "reth-payload-builder 1.9.2", + "reth-payload-builder-primitives 1.9.2", + "reth-payload-primitives 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-rpc-api 1.9.2", + "reth-storage-api 1.9.2", + "reth-tasks 1.9.2", + "reth-transaction-pool 1.9.2", + "serde", + "thiserror 2.0.12", + "tokio", + "tracing", +] + +[[package]] +name = "reth-rpc-engine-api" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "alloy-rpc-types-engine", + "async-trait", + "jsonrpsee-core", + "jsonrpsee-types", + "metrics", + "parking_lot", + "reth-chainspec 1.9.3", + "reth-engine-primitives 1.9.3", + "reth-metrics 1.9.3", + "reth-payload-builder 1.9.3", + "reth-payload-builder-primitives 1.9.3", + "reth-payload-primitives 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-rpc-api 1.9.3", + "reth-storage-api 1.9.3", + "reth-tasks 1.9.3", + "reth-transaction-pool 1.9.3", "serde", "thiserror 2.0.12", "tokio", @@ -9176,21 +11428,65 @@ dependencies = [ "jsonrpsee", "jsonrpsee-types", "parking_lot", - "reth-chain-state", - "reth-chainspec", - "reth-errors", - "reth-evm", - "reth-network-api", - "reth-node-api", - "reth-primitives-traits", - "reth-revm", - "reth-rpc-convert", - "reth-rpc-eth-types", - "reth-rpc-server-types", - "reth-storage-api", - "reth-tasks", - "reth-transaction-pool", - "reth-trie-common", + "reth-chain-state 1.9.2", + "reth-chainspec 1.9.2", + "reth-errors 1.9.2", + "reth-evm 1.9.2", + "reth-network-api 1.9.2", + "reth-node-api 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-revm 1.9.2", + "reth-rpc-convert 1.9.2", + "reth-rpc-eth-types 1.9.2", + "reth-rpc-server-types 1.9.2", + "reth-storage-api 1.9.2", + "reth-tasks 1.9.2", + "reth-transaction-pool 1.9.2", + "reth-trie-common 1.9.2", + "revm", + "revm-inspectors", + "tokio", + "tracing", +] + +[[package]] +name = "reth-rpc-eth-api" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-dyn-abi", + "alloy-eips", + "alloy-evm", + "alloy-json-rpc", + "alloy-network", + "alloy-primitives", + "alloy-rlp", + "alloy-rpc-types-eth", + "alloy-rpc-types-mev", + "alloy-serde", + "async-trait", + "auto_impl", + "dyn-clone", + "futures", + "jsonrpsee", + "jsonrpsee-types", + "parking_lot", + "reth-chain-state 1.9.3", + "reth-chainspec 1.9.3", + "reth-errors 1.9.3", + "reth-evm 1.9.3", + "reth-network-api 1.9.3", + "reth-node-api 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-revm 1.9.3", + "reth-rpc-convert 1.9.3", + "reth-rpc-eth-types 1.9.3", + "reth-rpc-server-types 1.9.3", + "reth-storage-api 1.9.3", + "reth-tasks 1.9.3", + "reth-transaction-pool 1.9.3", + "reth-trie-common 1.9.3", "revm", "revm-inspectors", "tokio", @@ -9219,21 +11515,68 @@ dependencies = [ "metrics", "rand 0.9.1", "reqwest", - "reth-chain-state", - "reth-chainspec", - "reth-errors", - "reth-ethereum-primitives", - "reth-evm", - "reth-execution-types", - "reth-metrics", - "reth-primitives-traits", - "reth-revm", - "reth-rpc-convert", - "reth-rpc-server-types", - "reth-storage-api", - "reth-tasks", - "reth-transaction-pool", - "reth-trie", + "reth-chain-state 1.9.2", + "reth-chainspec 1.9.2", + "reth-errors 1.9.2", + "reth-ethereum-primitives 1.9.2", + "reth-evm 1.9.2", + "reth-execution-types 1.9.2", + "reth-metrics 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-revm 1.9.2", + "reth-rpc-convert 1.9.2", + "reth-rpc-server-types 1.9.2", + "reth-storage-api 1.9.2", + "reth-tasks 1.9.2", + "reth-transaction-pool 1.9.2", + "reth-trie 1.9.2", + "revm", + "revm-inspectors", + "schnellru", + "serde", + "thiserror 2.0.12", + "tokio", + "tokio-stream", + "tracing", +] + +[[package]] +name = "reth-rpc-eth-types" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-evm", + "alloy-network", + "alloy-primitives", + "alloy-rpc-client", + "alloy-rpc-types-eth", + "alloy-sol-types", + "alloy-transport", + "derive_more", + "futures", + "itertools 0.14.0", + "jsonrpsee-core", + "jsonrpsee-types", + "metrics", + "rand 0.9.1", + "reqwest", + "reth-chain-state 1.9.3", + "reth-chainspec 1.9.3", + "reth-errors 1.9.3", + "reth-ethereum-primitives 1.9.3", + "reth-evm 1.9.3", + "reth-execution-types 1.9.3", + "reth-metrics 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-revm 1.9.3", + "reth-rpc-convert 1.9.3", + "reth-rpc-server-types 1.9.3", + "reth-storage-api 1.9.3", + "reth-tasks 1.9.3", + "reth-transaction-pool 1.9.3", + "reth-trie 1.9.3", "revm", "revm-inspectors", "schnellru", @@ -9258,6 +11601,20 @@ dependencies = [ "tracing", ] +[[package]] +name = "reth-rpc-layer" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-rpc-types-engine", + "http", + "jsonrpsee-http-client", + "pin-project", + "tower", + "tower-http", + "tracing", +] + [[package]] name = "reth-rpc-server-types" version = "1.9.2" @@ -9268,16 +11625,80 @@ dependencies = [ "alloy-rpc-types-engine", "jsonrpsee-core", "jsonrpsee-types", - "reth-errors", - "reth-network-api", + "reth-errors 1.9.2", + "reth-network-api 1.9.2", "serde", "strum 0.27.1", ] +[[package]] +name = "reth-rpc-server-types" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "alloy-rpc-types-engine", + "jsonrpsee-core", + "jsonrpsee-types", + "reth-errors 1.9.3", + "reth-network-api 1.9.3", + "serde", + "strum 0.27.1", +] + +[[package]] +name = "reth-stages" +version = "1.9.2" +source = "git+https://github.com/gattaca-com/based-op-reth?rev=b053849462eb48e61b24d965cfee59cead7f8a3b#b053849462eb48e61b24d965cfee59cead7f8a3b" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "bincode", + "eyre", + "futures-util", + "itertools 0.14.0", + "num-traits", + "rayon", + "reqwest", + "reth-chainspec 1.9.2", + "reth-codecs 1.9.2", + "reth-config 1.9.2", + "reth-consensus 1.9.2", + "reth-db 1.9.2", + "reth-db-api 1.9.2", + "reth-era 1.9.2", + "reth-era-downloader 1.9.2", + "reth-era-utils 1.9.2", + "reth-ethereum-primitives 1.9.2", + "reth-etl 1.9.2", + "reth-evm 1.9.2", + "reth-execution-types 1.9.2", + "reth-exex 1.9.2", + "reth-fs-util 1.9.2", + "reth-network-p2p 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-provider 1.9.2", + "reth-prune 1.9.2", + "reth-prune-types 1.9.2", + "reth-revm 1.9.2", + "reth-stages-api 1.9.2", + "reth-static-file-types 1.9.2", + "reth-storage-errors 1.9.2", + "reth-testing-utils", + "reth-trie 1.9.2", + "reth-trie-db 1.9.2", + "tempfile", + "thiserror 2.0.12", + "tokio", + "tracing", +] + [[package]] name = "reth-stages" -version = "1.9.2" -source = "git+https://github.com/gattaca-com/based-op-reth?rev=b053849462eb48e61b24d965cfee59cead7f8a3b#b053849462eb48e61b24d965cfee59cead7f8a3b" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" dependencies = [ "alloy-consensus", "alloy-eips", @@ -9289,34 +11710,30 @@ dependencies = [ "num-traits", "rayon", "reqwest", - "reth-chainspec", - "reth-codecs", - "reth-config", - "reth-consensus", - "reth-db", - "reth-db-api", - "reth-era", - "reth-era-downloader", - "reth-era-utils", - "reth-ethereum-primitives", - "reth-etl", - "reth-evm", - "reth-execution-types", - "reth-exex", - "reth-fs-util", - "reth-network-p2p", - "reth-primitives-traits", - "reth-provider", - "reth-prune", - "reth-prune-types", - "reth-revm", - "reth-stages-api", - "reth-static-file-types", - "reth-storage-errors", - "reth-testing-utils", - "reth-trie", - "reth-trie-db", - "tempfile", + "reth-codecs 1.9.3", + "reth-config 1.9.3", + "reth-consensus 1.9.3", + "reth-db 1.9.3", + "reth-db-api 1.9.3", + "reth-era 1.9.3", + "reth-era-downloader 1.9.3", + "reth-era-utils 1.9.3", + "reth-etl 1.9.3", + "reth-evm 1.9.3", + "reth-execution-types 1.9.3", + "reth-exex 1.9.3", + "reth-fs-util 1.9.3", + "reth-network-p2p 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-provider 1.9.3", + "reth-prune 1.9.3", + "reth-prune-types 1.9.3", + "reth-revm 1.9.3", + "reth-stages-api 1.9.3", + "reth-static-file-types 1.9.3", + "reth-storage-errors 1.9.3", + "reth-trie 1.9.3", + "reth-trie-db 1.9.3", "thiserror 2.0.12", "tokio", "tracing", @@ -9333,17 +11750,44 @@ dependencies = [ "auto_impl", "futures-util", "metrics", - "reth-consensus", - "reth-errors", - "reth-metrics", - "reth-network-p2p", - "reth-primitives-traits", - "reth-provider", - "reth-prune", - "reth-stages-types", - "reth-static-file", - "reth-static-file-types", - "reth-tokio-util", + "reth-consensus 1.9.2", + "reth-errors 1.9.2", + "reth-metrics 1.9.2", + "reth-network-p2p 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-provider 1.9.2", + "reth-prune 1.9.2", + "reth-stages-types 1.9.2", + "reth-static-file 1.9.2", + "reth-static-file-types 1.9.2", + "reth-tokio-util 1.9.2", + "thiserror 2.0.12", + "tokio", + "tracing", +] + +[[package]] +name = "reth-stages-api" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "aquamarine", + "auto_impl", + "futures-util", + "metrics", + "reth-consensus 1.9.3", + "reth-errors 1.9.3", + "reth-metrics 1.9.3", + "reth-network-p2p 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-provider 1.9.3", + "reth-prune 1.9.3", + "reth-stages-types 1.9.3", + "reth-static-file 1.9.3", + "reth-static-file-types 1.9.3", + "reth-tokio-util 1.9.3", "thiserror 2.0.12", "tokio", "tracing", @@ -9358,8 +11802,21 @@ dependencies = [ "arbitrary", "bytes", "modular-bitfield", - "reth-codecs", - "reth-trie-common", + "reth-codecs 1.9.2", + "reth-trie-common 1.9.2", + "serde", +] + +[[package]] +name = "reth-stages-types" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-primitives", + "bytes", + "modular-bitfield", + "reth-codecs 1.9.3", + "reth-trie-common 1.9.3", "serde", ] @@ -9371,15 +11828,35 @@ dependencies = [ "alloy-primitives", "parking_lot", "rayon", - "reth-codecs", - "reth-db-api", - "reth-primitives-traits", - "reth-provider", - "reth-prune-types", - "reth-stages-types", - "reth-static-file-types", - "reth-storage-errors", - "reth-tokio-util", + "reth-codecs 1.9.2", + "reth-db-api 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-provider 1.9.2", + "reth-prune-types 1.9.2", + "reth-stages-types 1.9.2", + "reth-static-file-types 1.9.2", + "reth-storage-errors 1.9.2", + "reth-tokio-util 1.9.2", + "tracing", +] + +[[package]] +name = "reth-static-file" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-primitives", + "parking_lot", + "rayon", + "reth-codecs 1.9.3", + "reth-db-api 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-provider 1.9.3", + "reth-prune-types 1.9.3", + "reth-stages-types 1.9.3", + "reth-static-file-types 1.9.3", + "reth-storage-errors 1.9.3", + "reth-tokio-util 1.9.3", "tracing", ] @@ -9395,6 +11872,18 @@ dependencies = [ "strum 0.27.1", ] +[[package]] +name = "reth-static-file-types" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-primitives", + "clap", + "derive_more", + "serde", + "strum 0.27.1", +] + [[package]] name = "reth-storage-api" version = "1.9.2" @@ -9405,16 +11894,39 @@ dependencies = [ "alloy-primitives", "alloy-rpc-types-engine", "auto_impl", - "reth-chainspec", - "reth-db-api", - "reth-db-models", - "reth-ethereum-primitives", - "reth-execution-types", - "reth-primitives-traits", - "reth-prune-types", - "reth-stages-types", - "reth-storage-errors", - "reth-trie-common", + "reth-chainspec 1.9.2", + "reth-db-api 1.9.2", + "reth-db-models 1.9.2", + "reth-ethereum-primitives 1.9.2", + "reth-execution-types 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-prune-types 1.9.2", + "reth-stages-types 1.9.2", + "reth-storage-errors 1.9.2", + "reth-trie-common 1.9.2", + "revm-database", +] + +[[package]] +name = "reth-storage-api" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rpc-types-engine", + "auto_impl", + "reth-chainspec 1.9.3", + "reth-db-api 1.9.3", + "reth-db-models 1.9.3", + "reth-ethereum-primitives 1.9.3", + "reth-execution-types 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-prune-types 1.9.3", + "reth-stages-types 1.9.3", + "reth-storage-errors 1.9.3", + "reth-trie-common 1.9.3", "revm-database", ] @@ -9427,9 +11939,25 @@ dependencies = [ "alloy-primitives", "alloy-rlp", "derive_more", - "reth-primitives-traits", - "reth-prune-types", - "reth-static-file-types", + "reth-primitives-traits 1.9.2", + "reth-prune-types 1.9.2", + "reth-static-file-types 1.9.2", + "revm-database-interface", + "thiserror 2.0.12", +] + +[[package]] +name = "reth-storage-errors" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "derive_more", + "reth-primitives-traits 1.9.3", + "reth-prune-types 1.9.3", + "reth-static-file-types 1.9.3", "revm-database-interface", "thiserror 2.0.12", ] @@ -9445,7 +11973,25 @@ dependencies = [ "metrics", "pin-project", "rayon", - "reth-metrics", + "reth-metrics 1.9.2", + "thiserror 2.0.12", + "tokio", + "tracing", + "tracing-futures", +] + +[[package]] +name = "reth-tasks" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "auto_impl", + "dyn-clone", + "futures-util", + "metrics", + "pin-project", + "rayon", + "reth-metrics 1.9.3", "thiserror 2.0.12", "tokio", "tracing", @@ -9463,8 +12009,8 @@ dependencies = [ "alloy-primitives", "rand 0.8.5", "rand 0.9.1", - "reth-ethereum-primitives", - "reth-primitives-traits", + "reth-ethereum-primitives 1.9.2", + "reth-primitives-traits 1.9.2", "secp256k1 0.30.0", ] @@ -9478,6 +12024,16 @@ dependencies = [ "tracing", ] +[[package]] +name = "reth-tokio-util" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "tokio", + "tokio-stream", + "tracing", +] + [[package]] name = "reth-tracing" version = "1.9.2" @@ -9493,6 +12049,21 @@ dependencies = [ "tracing-subscriber 0.3.20", ] +[[package]] +name = "reth-tracing" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "clap", + "eyre", + "rolling-file", + "tracing", + "tracing-appender", + "tracing-journald", + "tracing-logfmt", + "tracing-subscriber 0.3.20", +] + [[package]] name = "reth-tracing-otlp" version = "1.9.2" @@ -9510,6 +12081,23 @@ dependencies = [ "url", ] +[[package]] +name = "reth-tracing-otlp" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "clap", + "eyre", + "opentelemetry", + "opentelemetry-otlp", + "opentelemetry-semantic-conventions", + "opentelemetry_sdk", + "tracing", + "tracing-opentelemetry", + "tracing-subscriber 0.3.20", + "url", +] + [[package]] name = "reth-transaction-pool" version = "1.9.2" @@ -9528,16 +12116,56 @@ dependencies = [ "paste 1.0.15", "pin-project", "rand 0.9.1", - "reth-chain-state", - "reth-chainspec", - "reth-eth-wire-types", - "reth-ethereum-primitives", - "reth-execution-types", - "reth-fs-util", - "reth-metrics", - "reth-primitives-traits", - "reth-storage-api", - "reth-tasks", + "reth-chain-state 1.9.2", + "reth-chainspec 1.9.2", + "reth-eth-wire-types 1.9.2", + "reth-ethereum-primitives 1.9.2", + "reth-execution-types 1.9.2", + "reth-fs-util 1.9.2", + "reth-metrics 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-storage-api 1.9.2", + "reth-tasks 1.9.2", + "revm-interpreter", + "revm-primitives", + "rustc-hash 2.1.1", + "schnellru", + "serde", + "serde_json", + "smallvec", + "thiserror 2.0.12", + "tokio", + "tokio-stream", + "tracing", +] + +[[package]] +name = "reth-transaction-pool" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "aquamarine", + "auto_impl", + "bitflags 2.10.0", + "futures-util", + "metrics", + "parking_lot", + "pin-project", + "rand 0.9.1", + "reth-chain-state 1.9.3", + "reth-chainspec 1.9.3", + "reth-eth-wire-types 1.9.3", + "reth-ethereum-primitives 1.9.3", + "reth-execution-types 1.9.3", + "reth-fs-util 1.9.3", + "reth-metrics 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-storage-api 1.9.3", + "reth-tasks 1.9.3", "revm-interpreter", "revm-primitives", "rustc-hash 2.1.1", @@ -9564,18 +12192,42 @@ dependencies = [ "auto_impl", "itertools 0.14.0", "metrics", - "reth-execution-errors", - "reth-metrics", - "reth-primitives-traits", - "reth-stages-types", - "reth-storage-errors", - "reth-trie-common", - "reth-trie-sparse", + "reth-execution-errors 1.9.2", + "reth-metrics 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-stages-types 1.9.2", + "reth-storage-errors 1.9.2", + "reth-trie-common 1.9.2", + "reth-trie-sparse 1.9.2", "revm-database", "tracing", "triehash", ] +[[package]] +name = "reth-trie" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-trie", + "auto_impl", + "itertools 0.14.0", + "metrics", + "reth-execution-errors 1.9.3", + "reth-metrics 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-stages-types 1.9.3", + "reth-storage-errors 1.9.3", + "reth-trie-common 1.9.3", + "reth-trie-sparse 1.9.3", + "revm-database", + "tracing", +] + [[package]] name = "reth-trie-common" version = "1.9.2" @@ -9596,8 +12248,32 @@ dependencies = [ "nybbles", "plain_hasher", "rayon", - "reth-codecs", - "reth-primitives-traits", + "reth-codecs 1.9.2", + "reth-primitives-traits 1.9.2", + "revm-database", + "serde", + "serde_with", +] + +[[package]] +name = "reth-trie-common" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-primitives", + "alloy-rlp", + "alloy-rpc-types-eth", + "alloy-serde", + "alloy-trie", + "arrayvec", + "bytes", + "derive_more", + "itertools 0.14.0", + "nybbles", + "rayon", + "reth-codecs 1.9.3", + "reth-primitives-traits 1.9.3", "revm-database", "serde", "serde_with", @@ -9609,10 +12285,23 @@ version = "1.9.2" source = "git+https://github.com/gattaca-com/based-op-reth?rev=b053849462eb48e61b24d965cfee59cead7f8a3b#b053849462eb48e61b24d965cfee59cead7f8a3b" dependencies = [ "alloy-primitives", - "reth-db-api", - "reth-execution-errors", - "reth-primitives-traits", - "reth-trie", + "reth-db-api 1.9.2", + "reth-execution-errors 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-trie 1.9.2", + "tracing", +] + +[[package]] +name = "reth-trie-db" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-primitives", + "reth-db-api 1.9.3", + "reth-execution-errors 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-trie 1.9.3", "tracing", ] @@ -9629,13 +12318,38 @@ dependencies = [ "itertools 0.14.0", "metrics", "rayon", - "reth-execution-errors", - "reth-metrics", - "reth-provider", - "reth-storage-errors", - "reth-trie", - "reth-trie-common", - "reth-trie-sparse", + "reth-execution-errors 1.9.2", + "reth-metrics 1.9.2", + "reth-provider 1.9.2", + "reth-storage-errors 1.9.2", + "reth-trie 1.9.2", + "reth-trie-common 1.9.2", + "reth-trie-sparse 1.9.2", + "thiserror 2.0.12", + "tokio", + "tracing", +] + +[[package]] +name = "reth-trie-parallel" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "crossbeam-channel", + "dashmap 6.1.0", + "derive_more", + "itertools 0.14.0", + "metrics", + "rayon", + "reth-execution-errors 1.9.3", + "reth-metrics 1.9.3", + "reth-provider 1.9.3", + "reth-storage-errors 1.9.3", + "reth-trie 1.9.3", + "reth-trie-common 1.9.3", + "reth-trie-sparse 1.9.3", "thiserror 2.0.12", "tokio", "tracing", @@ -9652,10 +12366,29 @@ dependencies = [ "auto_impl", "metrics", "rayon", - "reth-execution-errors", - "reth-metrics", - "reth-primitives-traits", - "reth-trie-common", + "reth-execution-errors 1.9.2", + "reth-metrics 1.9.2", + "reth-primitives-traits 1.9.2", + "reth-trie-common 1.9.2", + "smallvec", + "tracing", +] + +[[package]] +name = "reth-trie-sparse" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "alloy-trie", + "auto_impl", + "metrics", + "rayon", + "reth-execution-errors 1.9.3", + "reth-metrics 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-trie-common 1.9.3", "smallvec", "tracing", ] @@ -9670,10 +12403,28 @@ dependencies = [ "alloy-trie", "metrics", "rayon", - "reth-execution-errors", - "reth-metrics", - "reth-trie-common", - "reth-trie-sparse", + "reth-execution-errors 1.9.2", + "reth-metrics 1.9.2", + "reth-trie-common 1.9.2", + "reth-trie-sparse 1.9.2", + "smallvec", + "tracing", +] + +[[package]] +name = "reth-trie-sparse-parallel" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "alloy-trie", + "metrics", + "rayon", + "reth-execution-errors 1.9.3", + "reth-metrics 1.9.3", + "reth-trie-common 1.9.3", + "reth-trie-sparse 1.9.3", "smallvec", "tracing", ] @@ -9686,6 +12437,14 @@ dependencies = [ "zstd", ] +[[package]] +name = "reth-zstd-compressors" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "zstd", +] + [[package]] name = "revm" version = "31.0.2" @@ -11669,7 +14428,7 @@ dependencies = [ "parking_lot", "rand 0.9.1", "reqwest", - "reth-rpc-layer", + "reth-rpc-layer 1.9.2", "serde", "serde_json", "thiserror 2.0.12", diff --git a/based/crates/reth/Cargo.toml b/based/crates/reth/Cargo.toml index 6942fd9b6..ed82562c3 100644 --- a/based/crates/reth/Cargo.toml +++ b/based/crates/reth/Cargo.toml @@ -1,20 +1,27 @@ [package] -name = "reth" edition.workspace = true +name = "reth" repository.workspace = true rust-version.workspace = true version.workspace = true [dependencies] +alloy-consensus.workspace = true +alloy-eips.workspace = true alloy-network.workspace = true alloy-primitives.workspace = true alloy-rpc-types.workspace = true -tracing.workspace = true +anyhow = "1.0.98" bop-common.workspace = true +clap.workspace = true +eyre.workspace = true +futures.workspace = true op-alloy-rpc-types.workspace = true -alloy-consensus.workspace = true -alloy-eips.workspace = true thiserror.workspace = true tokio.workspace = true -anyhow = "1.0.98" +tracing.workspace = true +reth-exex = { git = "https://github.com/paradigmxyz/reth", tag = "v1.9.3" } +reth-optimism-chainspec = { git = "https://github.com/paradigmxyz/reth", tag = "v1.9.3" } +reth-optimism-cli = { git = "https://github.com/paradigmxyz/reth", tag = "v1.9.3" } +reth-optimism-node = { git = "https://github.com/paradigmxyz/reth", tag = "v1.9.3" } diff --git a/based/crates/reth/src/cli.rs b/based/crates/reth/src/cli.rs new file mode 100644 index 000000000..c8b9140f2 --- /dev/null +++ b/based/crates/reth/src/cli.rs @@ -0,0 +1,55 @@ +use clap::Parser; +use futures::TryStreamExt as _; +use reth_exex::ExExEvent; +use reth_optimism_cli::{Cli, chainspec::OpChainSpecParser}; +use reth_optimism_node::{OpNode, args::RollupArgs}; + +#[derive(Parser, Debug, Clone)] +pub struct BasedOpRethArgs { + #[command(flatten)] + pub rollup: RollupArgs, + #[command(flatten)] + pub based_op: BasedOpArgs, +} + +#[derive(Parser, Debug, Clone)] +pub struct BasedOpArgs {} + +pub fn run() -> eyre::Result<()> { + Cli::::parse().run(|builder, mut args| async move { + let op_node = OpNode::new(args.rollup.clone()); + + let add_ons = op_node.add_ons_builder().build(); + + let node_handle = builder + .with_types::() + .with_components(op_node.components()) + .with_add_ons(add_ons) + // Install the execution extension to handle canonical chain updates + .install_exex("based-op", { + move |mut ctx| async move { + Ok(async move { + while let Some(note) = ctx.notifications.try_next().await? { + if let Some(committed) = note.committed_chain() { + for b in committed.blocks_iter() { + // TODO: Handle committed block + } + let _ = ctx.events.send(ExExEvent::FinishedHeight(committed.tip().num_hash())); + } + } + + Ok(()) + }) + } + }) + // .extend_rpc_modules(move |rpx_context| { + // // WTF + // Ok(()) + // }) + .launch() + .await?; + + // TODO + Ok(()) + }) +} diff --git a/based/crates/reth/src/lib.rs b/based/crates/reth/src/lib.rs index f5744d6ca..0933a1642 100644 --- a/based/crates/reth/src/lib.rs +++ b/based/crates/reth/src/lib.rs @@ -1,3 +1,4 @@ +mod cli; pub mod driver; mod error; pub mod exec; From 0c0cd1d303338ab5d8716fba428d2a9da3e68d50 Mon Sep 17 00:00:00 2001 From: Jonas Bostoen Date: Thu, 18 Dec 2025 13:58:07 +0100 Subject: [PATCH 11/25] feat: scaffold reth node --- based/Cargo.lock | 1 + based/crates/reth/Cargo.toml | 1 + based/crates/reth/src/api/engine.rs | 0 based/crates/reth/src/api/mod.rs | 1 + based/crates/reth/src/cli.rs | 30 ++++++++++++++++++----------- based/crates/reth/src/driver.rs | 20 ++++++++++++------- based/crates/reth/src/lib.rs | 1 + 7 files changed, 36 insertions(+), 18 deletions(-) create mode 100644 based/crates/reth/src/api/engine.rs create mode 100644 based/crates/reth/src/api/mod.rs diff --git a/based/Cargo.lock b/based/Cargo.lock index a5e5531a1..f3059b26a 100644 --- a/based/Cargo.lock +++ b/based/Cargo.lock @@ -6780,6 +6780,7 @@ dependencies = [ "futures", "op-alloy-rpc-types", "reth-exex 1.9.3", + "reth-node-builder 1.9.3", "reth-optimism-chainspec 1.9.3", "reth-optimism-cli 1.9.3", "reth-optimism-node 1.9.3", diff --git a/based/crates/reth/Cargo.toml b/based/crates/reth/Cargo.toml index ed82562c3..c1de7b193 100644 --- a/based/crates/reth/Cargo.toml +++ b/based/crates/reth/Cargo.toml @@ -22,6 +22,7 @@ tokio.workspace = true tracing.workspace = true reth-exex = { git = "https://github.com/paradigmxyz/reth", tag = "v1.9.3" } +reth-node-builder = { git = "https://github.com/paradigmxyz/reth", tag = "v1.9.3" } reth-optimism-chainspec = { git = "https://github.com/paradigmxyz/reth", tag = "v1.9.3" } reth-optimism-cli = { git = "https://github.com/paradigmxyz/reth", tag = "v1.9.3" } reth-optimism-node = { git = "https://github.com/paradigmxyz/reth", tag = "v1.9.3" } diff --git a/based/crates/reth/src/api/engine.rs b/based/crates/reth/src/api/engine.rs new file mode 100644 index 000000000..e69de29bb diff --git a/based/crates/reth/src/api/mod.rs b/based/crates/reth/src/api/mod.rs new file mode 100644 index 000000000..702e611f1 --- /dev/null +++ b/based/crates/reth/src/api/mod.rs @@ -0,0 +1 @@ +pub mod engine; diff --git a/based/crates/reth/src/cli.rs b/based/crates/reth/src/cli.rs index c8b9140f2..e28952c1f 100644 --- a/based/crates/reth/src/cli.rs +++ b/based/crates/reth/src/cli.rs @@ -1,9 +1,15 @@ use clap::Parser; use futures::TryStreamExt as _; use reth_exex::ExExEvent; +use reth_node_builder::Node; use reth_optimism_cli::{Cli, chainspec::OpChainSpecParser}; use reth_optimism_node::{OpNode, args::RollupArgs}; +use crate::{ + driver::{Driver, DriverInner}, + exec::NoopExecutor, +}; + #[derive(Parser, Debug, Clone)] pub struct BasedOpRethArgs { #[command(flatten)] @@ -16,23 +22,23 @@ pub struct BasedOpRethArgs { pub struct BasedOpArgs {} pub fn run() -> eyre::Result<()> { - Cli::::parse().run(|builder, mut args| async move { - let op_node = OpNode::new(args.rollup.clone()); + Cli::::parse().run(|builder, args| async move { + let driver = Driver::spawn::(todo!("Initialize driver")); - let add_ons = op_node.add_ons_builder().build(); + let op_node = OpNode::new(args.rollup.clone()); - let node_handle = builder + let _node_handle = builder .with_types::() .with_components(op_node.components()) - .with_add_ons(add_ons) + .with_add_ons(op_node.add_ons()) // Install the execution extension to handle canonical chain updates .install_exex("based-op", { move |mut ctx| async move { Ok(async move { while let Some(note) = ctx.notifications.try_next().await? { if let Some(committed) = note.committed_chain() { - for b in committed.blocks_iter() { - // TODO: Handle committed block + for block in committed.blocks_iter() { + driver.forkchoice_updated(block.clone().into_block()).await?; } let _ = ctx.events.send(ExExEvent::FinishedHeight(committed.tip().num_hash())); } @@ -42,10 +48,12 @@ pub fn run() -> eyre::Result<()> { }) } }) - // .extend_rpc_modules(move |rpx_context| { - // // WTF - // Ok(()) - // }) + .extend_rpc_modules(move |ctx| { + // TODO: + // - Replace / extend the engine API + // - Replace eth API + Ok(()) + }) .launch() .await?; diff --git a/based/crates/reth/src/driver.rs b/based/crates/reth/src/driver.rs index 378738bea..a8020d338 100644 --- a/based/crates/reth/src/driver.rs +++ b/based/crates/reth/src/driver.rs @@ -2,7 +2,10 @@ use std::time::Instant; use alloy_primitives::B256; use alloy_rpc_types::Block; -use bop_common::p2p::{EnvV0, FragV0, SealV0}; +use bop_common::{ + p2p::{EnvV0, FragV0, SealV0}, + typedefs::OpBlock, +}; use tokio::sync::{mpsc, oneshot}; use tracing::{error, info}; @@ -65,7 +68,7 @@ enum Cmd { EnvV0 { env: EnvV0, resp: Resp<()> }, NewFragV0 { frag: FragV0, resp: Resp }, SealFragV0 { seal: SealV0, resp: Resp<()> }, - ForkchoiceUpdated { new_block_number: u64, resp: Resp<()> }, + ForkchoiceUpdated { block: OpBlock, resp: Resp<()> }, GetHeaderView { resp: Resp }, } @@ -104,8 +107,8 @@ impl Driver { Cmd::SealFragV0 { seal, resp } => { respond(resp, inner.handle_seal_frag_v0(seal).await); } - Cmd::ForkchoiceUpdated { new_block_number, resp } => { - respond(resp, inner.handle_forkchoice_updated(new_block_number).await); + Cmd::ForkchoiceUpdated { block, resp } => { + respond(resp, inner.handle_forkchoice_updated(block).await); } Cmd::GetHeaderView { resp } => { let _ = resp.send(Reply::Ok(inner.get_header_view())); @@ -139,9 +142,9 @@ impl Driver { } /// Notifies the driver about a forkchoice update and resets state on mismatch. - pub async fn forkchoice_updated(&self, new_block_number: u64) -> Result<(), DriverError> { + pub async fn forkchoice_updated(&self, block: OpBlock) -> Result<(), DriverError> { let (resp_tx, resp_rx) = oneshot::channel(); - self.tx.send(Cmd::ForkchoiceUpdated { new_block_number, resp: resp_tx }).await?; + self.tx.send(Cmd::ForkchoiceUpdated { block, resp: resp_tx }).await?; resp_rx.await?.into_result() } @@ -187,13 +190,16 @@ impl DriverInner { Ok(()) } - async fn handle_forkchoice_updated(&mut self, new_block_number: u64) -> Result<(), DriverError> { + async fn handle_forkchoice_updated(&mut self, block: OpBlock) -> Result<(), DriverError> { self.fcu_count_since_unseal_reset += 1; let Some(ub) = self.current_unsealed_block.as_ref() else { return Ok(()); }; + let new_block_number = block.header.number; + + // TODO: Check hash etc. Commit state if needed if ub.env.number != new_block_number { info!(old = ub.env.number, new = new_block_number, "forkchoiceUpdated block mismatch: resetting unsealed"); self.reset_current_unsealed_block(); diff --git a/based/crates/reth/src/lib.rs b/based/crates/reth/src/lib.rs index 0933a1642..bc71bbddc 100644 --- a/based/crates/reth/src/lib.rs +++ b/based/crates/reth/src/lib.rs @@ -1,3 +1,4 @@ +mod api; mod cli; pub mod driver; mod error; From 32c66f03e01202a92f902dda40991b339f576cb0 Mon Sep 17 00:00:00 2001 From: Jonas Bostoen Date: Thu, 18 Dec 2025 14:34:32 +0100 Subject: [PATCH 12/25] feat(reth): scaffold engine API --- based/Cargo.lock | 2 + based/crates/common/src/p2p.rs | 6 +++ based/crates/reth/Cargo.toml | 2 + based/crates/reth/src/api/engine.rs | 65 +++++++++++++++++++++++++++++ based/crates/reth/src/cli.rs | 16 +++++-- 5 files changed, 88 insertions(+), 3 deletions(-) diff --git a/based/Cargo.lock b/based/Cargo.lock index f3059b26a..acf75d7b5 100644 --- a/based/Cargo.lock +++ b/based/Cargo.lock @@ -6778,12 +6778,14 @@ dependencies = [ "clap", "eyre", "futures", + "jsonrpsee", "op-alloy-rpc-types", "reth-exex 1.9.3", "reth-node-builder 1.9.3", "reth-optimism-chainspec 1.9.3", "reth-optimism-cli 1.9.3", "reth-optimism-node 1.9.3", + "reth-rpc 1.9.3", "thiserror 2.0.12", "tokio", "tracing", diff --git a/based/crates/common/src/p2p.rs b/based/crates/common/src/p2p.rs index 517e007f5..05f218e2a 100644 --- a/based/crates/common/src/p2p.rs +++ b/based/crates/common/src/p2p.rs @@ -149,6 +149,12 @@ impl From for VersionedMessage { } } +#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] +pub struct Signed { + pub message: T, + pub signature: Bytes, +} + #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] pub struct SignedVersionedMessage { pub message: VersionedMessage, diff --git a/based/crates/reth/Cargo.toml b/based/crates/reth/Cargo.toml index c1de7b193..25f6a0441 100644 --- a/based/crates/reth/Cargo.toml +++ b/based/crates/reth/Cargo.toml @@ -16,6 +16,7 @@ bop-common.workspace = true clap.workspace = true eyre.workspace = true futures.workspace = true +jsonrpsee.workspace = true op-alloy-rpc-types.workspace = true thiserror.workspace = true tokio.workspace = true @@ -26,3 +27,4 @@ reth-node-builder = { git = "https://github.com/paradigmxyz/reth", tag = "v1.9.3 reth-optimism-chainspec = { git = "https://github.com/paradigmxyz/reth", tag = "v1.9.3" } reth-optimism-cli = { git = "https://github.com/paradigmxyz/reth", tag = "v1.9.3" } reth-optimism-node = { git = "https://github.com/paradigmxyz/reth", tag = "v1.9.3" } +reth-rpc = { git = "https://github.com/paradigmxyz/reth", tag = "v1.9.3" } diff --git a/based/crates/reth/src/api/engine.rs b/based/crates/reth/src/api/engine.rs index e69de29bb..e2efca359 100644 --- a/based/crates/reth/src/api/engine.rs +++ b/based/crates/reth/src/api/engine.rs @@ -0,0 +1,65 @@ +use bop_common::p2p::{EnvV0, FragV0, SealV0, Signed}; +use jsonrpsee::{ + core::{RpcResult, async_trait}, + proc_macros::rpc, + types::{ErrorCode, ErrorObject}, +}; + +use crate::{driver::Driver, error::DriverError}; + +#[rpc(server, namespace = "engine")] +pub trait BasedEngineApi { + #[method(name = "envV0")] + async fn env_v0(&self, env: Signed) -> RpcResult<()>; + + #[method(name = "newFragV0")] + async fn new_frag_v0(&self, frag: Signed) -> RpcResult<()>; + + #[method(name = "sealFragV0")] + async fn seal_frag_v0(&self, seal: Signed) -> RpcResult<()>; +} + +pub struct BasedEngineApi { + driver: Driver, +} + +impl BasedEngineApi { + /// Initialize a new based engine API instance. + pub fn new(driver: Driver) -> Self { + Self { driver } + } +} + +#[async_trait] +impl BasedEngineApiServer for BasedEngineApi { + #[tracing::instrument(skip(self))] + async fn env_v0(&self, env: Signed) -> RpcResult<()> { + tracing::debug!("handling engine_envV0"); + + self.driver.env_v0(env.message).await?; + Ok(()) + } + + #[tracing::instrument(skip(self))] + async fn new_frag_v0(&self, frag: Signed) -> RpcResult<()> { + tracing::debug!("handling engine_newFragV0"); + + self.driver.new_frag_v0(frag.message).await?; + Ok(()) + } + + #[tracing::instrument(skip(self))] + async fn seal_frag_v0(&self, seal: Signed) -> RpcResult<()> { + tracing::debug!("handling engine_sealFragV0"); + + self.driver.seal_frag_v0(seal.message).await?; + Ok(()) + } +} + +impl From for ErrorObject<'static> { + // TODO: Better error handling + fn from(e: DriverError) -> Self { + ErrorObject::owned(ErrorCode::InternalError.code(), e.to_string(), Option::<()>::None) + } +} diff --git a/based/crates/reth/src/cli.rs b/based/crates/reth/src/cli.rs index e28952c1f..a3c24486a 100644 --- a/based/crates/reth/src/cli.rs +++ b/based/crates/reth/src/cli.rs @@ -6,7 +6,8 @@ use reth_optimism_cli::{Cli, chainspec::OpChainSpecParser}; use reth_optimism_node::{OpNode, args::RollupArgs}; use crate::{ - driver::{Driver, DriverInner}, + api::engine::{BasedEngineApi, BasedEngineApiServer as _}, + driver::Driver, exec::NoopExecutor, }; @@ -27,16 +28,19 @@ pub fn run() -> eyre::Result<()> { let op_node = OpNode::new(args.rollup.clone()); - let _node_handle = builder + let node_handle = builder .with_types::() .with_components(op_node.components()) .with_add_ons(op_node.add_ons()) // Install the execution extension to handle canonical chain updates .install_exex("based-op", { + // Get a clone of the driver handle. + let driver = driver.clone(); move |mut ctx| async move { Ok(async move { while let Some(note) = ctx.notifications.try_next().await? { if let Some(committed) = note.committed_chain() { + // Handle committed blocks by notifying the driver for block in committed.blocks_iter() { driver.forkchoice_updated(block.clone().into_block()).await?; } @@ -49,6 +53,10 @@ pub fn run() -> eyre::Result<()> { } }) .extend_rpc_modules(move |ctx| { + // Add based engine API modules to the existing auth module. + ctx.auth_module + .merge_auth_methods(BasedEngineApi::new(driver).into_rpc()) + .expect("failed to merge modules"); // TODO: // - Replace / extend the engine API // - Replace eth API @@ -57,7 +65,9 @@ pub fn run() -> eyre::Result<()> { .launch() .await?; - // TODO + // Run to completion + node_handle.wait_for_node_exit().await?; + Ok(()) }) } From ce981ed6046319ad96cecebc752c1a9862ac3dab Mon Sep 17 00:00:00 2001 From: Jonas Bostoen Date: Thu, 18 Dec 2025 14:43:15 +0100 Subject: [PATCH 13/25] feat(reth): progress on engine API --- based/crates/reth/src/cli.rs | 9 ++++++--- based/crates/reth/src/driver.rs | 11 ++++++++++- based/crates/reth/src/lib.rs | 2 ++ 3 files changed, 18 insertions(+), 4 deletions(-) diff --git a/based/crates/reth/src/cli.rs b/based/crates/reth/src/cli.rs index a3c24486a..2afb84ba7 100644 --- a/based/crates/reth/src/cli.rs +++ b/based/crates/reth/src/cli.rs @@ -8,7 +8,6 @@ use reth_optimism_node::{OpNode, args::RollupArgs}; use crate::{ api::engine::{BasedEngineApi, BasedEngineApiServer as _}, driver::Driver, - exec::NoopExecutor, }; #[derive(Parser, Debug, Clone)] @@ -20,11 +19,15 @@ pub struct BasedOpRethArgs { } #[derive(Parser, Debug, Clone)] -pub struct BasedOpArgs {} +pub struct BasedOpArgs { + /// Whether to use the unsealed block as the "latest" state in RPC calls. + #[arg(long)] + unsealed_as_latest: bool, +} pub fn run() -> eyre::Result<()> { Cli::::parse().run(|builder, args| async move { - let driver = Driver::spawn::(todo!("Initialize driver")); + let driver = Driver::new(args.based_op.unsealed_as_latest); let op_node = OpNode::new(args.rollup.clone()); diff --git a/based/crates/reth/src/driver.rs b/based/crates/reth/src/driver.rs index a8020d338..ef98207ba 100644 --- a/based/crates/reth/src/driver.rs +++ b/based/crates/reth/src/driver.rs @@ -11,7 +11,7 @@ use tracing::{error, info}; use crate::{ error::{DriverError, ValidateSealError}, - exec::{UnsealedExecutor, apply_exec_output}, + exec::{NoopExecutor, UnsealedExecutor, apply_exec_output}, unsealed_block::UnsealedBlock, }; @@ -89,6 +89,15 @@ pub struct DriverInner { } impl Driver { + pub fn new(unsealed_as_latest: bool) -> Self { + Self::spawn(DriverInner { + enabled_unsealed_as_latest: unsealed_as_latest, + current_unsealed_block: None, + exec: NoopExecutor, + fcu_count_since_unseal_reset: 0, + }) + } + /// Spawns the driver actor task and returns a handle used to send commands to it. pub fn spawn(inner: DriverInner) -> Self { let (tx, mut rx) = mpsc::channel::(256); diff --git a/based/crates/reth/src/lib.rs b/based/crates/reth/src/lib.rs index bc71bbddc..7d83acac1 100644 --- a/based/crates/reth/src/lib.rs +++ b/based/crates/reth/src/lib.rs @@ -4,3 +4,5 @@ pub mod driver; mod error; pub mod exec; pub mod unsealed_block; + +pub use cli::*; From bc8bb936dbda019d3dbedd85bd4385d965e86dc2 Mon Sep 17 00:00:00 2001 From: Jonas Bostoen Date: Thu, 18 Dec 2025 15:33:34 +0100 Subject: [PATCH 14/25] feat(reth): smol CLI test --- based/crates/reth/src/cli.rs | 29 ++++++++++++-- based/crates/reth/src/lib.rs | 39 +++++++++++++++++++ .../sequencer/src/sorting/frag_sequence.rs | 2 +- 3 files changed, 65 insertions(+), 5 deletions(-) diff --git a/based/crates/reth/src/cli.rs b/based/crates/reth/src/cli.rs index 2afb84ba7..a966e6d64 100644 --- a/based/crates/reth/src/cli.rs +++ b/based/crates/reth/src/cli.rs @@ -22,11 +22,34 @@ pub struct BasedOpRethArgs { pub struct BasedOpArgs { /// Whether to use the unsealed block as the "latest" state in RPC calls. #[arg(long)] - unsealed_as_latest: bool, + pub unsealed_as_latest: bool, } +impl BasedOpRethArgs { + pub fn test() -> Self { + Self { rollup: RollupArgs::default(), based_op: BasedOpArgs { unsealed_as_latest: true } } + } +} + +/// Run the based-op-reth node to completion, parsing args from the command line. pub fn run() -> eyre::Result<()> { - Cli::::parse().run(|builder, args| async move { + run_with_cli(Cli::::parse()) +} + +/// Run the based-op-reth node with args parsed from the provided iterator. +/// +/// This is useful for testing where you want to provide args programmatically. +pub fn run_from_args(args: I) -> eyre::Result<()> +where + I: IntoIterator, + T: Into + Clone, +{ + run_with_cli(Cli::::try_parse_from(args)?) +} + +/// Internal helper that runs the node with a parsed CLI instance. +fn run_with_cli(cli: Cli) -> eyre::Result<()> { + cli.run(|builder, args| async move { let driver = Driver::new(args.based_op.unsealed_as_latest); let op_node = OpNode::new(args.rollup.clone()); @@ -60,8 +83,6 @@ pub fn run() -> eyre::Result<()> { ctx.auth_module .merge_auth_methods(BasedEngineApi::new(driver).into_rpc()) .expect("failed to merge modules"); - // TODO: - // - Replace / extend the engine API // - Replace eth API Ok(()) }) diff --git a/based/crates/reth/src/lib.rs b/based/crates/reth/src/lib.rs index 7d83acac1..d7e3da400 100644 --- a/based/crates/reth/src/lib.rs +++ b/based/crates/reth/src/lib.rs @@ -6,3 +6,42 @@ pub mod exec; pub mod unsealed_block; pub use cli::*; + +#[cfg(test)] +mod tests { + #[test] + fn test_cli() { + crate::run_from_args([ + "op-reth", + "node", + "--chain", + "base-sepolia", + "--datadir", + "/tmp/base-sepolia", + "--http", + "--http.addr", + "0.0.0.0", + "--ws", + "--ws.addr", + "0.0.0.0", + "--http.api", + "admin,debug,eth,net,trace,txpool,web3,rpc,reth,ots", + "--rollup.sequencer-http", + "https://sepolia-sequencer.base.org", + "--rpc-max-tracing-requests", + "1000000", + "--rpc.gascap", + "18446744073709551615", + "--rpc.max-connections", + "429496729", + "--rpc.max-logs-per-response", + "0", + "--rpc.max-subscriptions-per-connection", + "10000", + "--metrics", + "9003", + "--unsealed-as-latest", + ]) + .unwrap(); + } +} diff --git a/based/crates/sequencer/src/sorting/frag_sequence.rs b/based/crates/sequencer/src/sorting/frag_sequence.rs index 5c184c4ae..00483e4a3 100644 --- a/based/crates/sequencer/src/sorting/frag_sequence.rs +++ b/based/crates/sequencer/src/sorting/frag_sequence.rs @@ -296,7 +296,7 @@ mod tests { let (_frag, _, _sorting_db) = ctx.seal_frag(sorting_db, &mut seq); // Seal the block - let (_seal, payload) = ctx.seal_block(seq); + let (_seal, payload) = ctx.seal_block(seq, None); assert_eq!(block.hash_slow(), payload.execution_payload.payload_inner.payload_inner.payload_inner.block_hash); } } From 56a7f622f377c1a90243e053ed16faf68eaeeef4 Mon Sep 17 00:00:00 2001 From: Jonas Bostoen Date: Thu, 18 Dec 2025 16:38:33 +0100 Subject: [PATCH 15/25] feat(reth): eth API overrides --- based/Cargo.lock | 1260 +++++++++++++++++++++++------- based/Cargo.toml | 45 +- based/crates/reth/Cargo.toml | 5 + based/crates/reth/src/api/eth.rs | 477 +++++++++++ based/crates/reth/src/api/mod.rs | 1 + based/crates/reth/src/cli.rs | 45 +- 6 files changed, 1504 insertions(+), 329 deletions(-) create mode 100644 based/crates/reth/src/api/eth.rs diff --git a/based/Cargo.lock b/based/Cargo.lock index acf75d7b5..844801d48 100644 --- a/based/Cargo.lock +++ b/based/Cargo.lock @@ -74,6 +74,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "aligned-vec" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc890384c8602f339876ded803c97ad529f3842aba97f6392b3dba0dd171769b" +dependencies = [ + "equator", +] + [[package]] name = "alloc-no-stdlib" version = "2.0.4" @@ -133,7 +142,7 @@ dependencies = [ "serde", "serde_json", "serde_with", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -180,7 +189,7 @@ dependencies = [ "crc", "rand 0.8.5", "serde", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -211,7 +220,7 @@ dependencies = [ "rand 0.8.5", "serde", "serde_with", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -237,7 +246,7 @@ dependencies = [ "serde", "serde_with", "sha2", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -260,7 +269,7 @@ dependencies = [ "op-alloy-rpc-types-engine", "op-revm", "revm", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -314,7 +323,7 @@ dependencies = [ "http", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.17", "tracing", ] @@ -341,7 +350,7 @@ dependencies = [ "futures-utils-wasm", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -372,7 +381,7 @@ dependencies = [ "op-alloy-consensus", "op-revm", "revm", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -402,14 +411,14 @@ dependencies = [ "foldhash 0.2.0", "getrandom 0.3.3", "hashbrown 0.16.0", - "indexmap 2.10.0", + "indexmap 2.12.0", "itoa", "k256", "keccak-asm", "paste 1.0.15", "proptest", "proptest-derive 0.6.0", - "rand 0.9.1", + "rand 0.9.2", "rapidhash", "ruint", "rustc-hash 2.1.1", @@ -453,7 +462,7 @@ dependencies = [ "reqwest", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tracing", "url", @@ -501,7 +510,7 @@ checksum = "64b728d511962dda67c1bc7ea7c03736ec275ed2cf4c35d9585298ac9ccf3b73" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -593,7 +602,7 @@ dependencies = [ "serde", "serde_json", "serde_with", - "thiserror 2.0.12", + "thiserror 2.0.17", "tree_hash", "tree_hash_derive", ] @@ -649,7 +658,7 @@ dependencies = [ "serde", "serde_json", "serde_with", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -678,7 +687,7 @@ dependencies = [ "alloy-serde", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -717,7 +726,7 @@ dependencies = [ "either", "elliptic-curve", "k256", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -735,7 +744,7 @@ dependencies = [ "coins-bip39", "k256", "rand 0.8.5", - "thiserror 2.0.12", + "thiserror 2.0.17", "zeroize", ] @@ -750,7 +759,7 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -762,11 +771,11 @@ dependencies = [ "alloy-sol-macro-input", "const-hex", "heck 0.5.0", - "indexmap 2.10.0", + "indexmap 2.12.0", "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", "syn-solidity", "tiny-keccak", ] @@ -783,7 +792,7 @@ dependencies = [ "macro-string", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", "syn-solidity", ] @@ -824,7 +833,7 @@ dependencies = [ "parking_lot", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tower", "tracing", @@ -914,7 +923,7 @@ dependencies = [ "darling 0.21.3", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -999,7 +1008,7 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -1141,7 +1150,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" dependencies = [ "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -1179,7 +1188,7 @@ dependencies = [ "num-traits", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -1268,7 +1277,7 @@ checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -1357,7 +1366,7 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -1368,7 +1377,7 @@ checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -1406,7 +1415,7 @@ checksum = "ffdcb70bdbc4d478427380519163274ac86e52916e10f0a8889adf0f96d3fee7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -1504,7 +1513,7 @@ checksum = "604fde5e028fea851ce1d8570bbdc034bec850d157f7569d10f347d06808c05c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -1580,7 +1589,7 @@ dependencies = [ "clap", "eyre", "futures", - "indexmap 2.10.0", + "indexmap 2.12.0", "jsonrpsee", "op-alloy-rpc-types", "op-alloy-rpc-types-engine", @@ -1615,7 +1624,7 @@ dependencies = [ "reth-rpc-layer 1.9.2", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tower", "tower-http", @@ -1662,7 +1671,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.101", + "syn 2.0.111", "which", ] @@ -1681,7 +1690,7 @@ dependencies = [ "regex", "rustc-hash 1.1.0", "shlex", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -1699,7 +1708,7 @@ dependencies = [ "regex", "rustc-hash 2.1.1", "shlex", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -1791,6 +1800,147 @@ dependencies = [ "zeroize", ] +[[package]] +name = "boa_ast" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc119a5ad34c3f459062a96907f53358989b173d104258891bb74f95d93747e8" +dependencies = [ + "bitflags 2.10.0", + "boa_interner", + "boa_macros", + "boa_string", + "indexmap 2.12.0", + "num-bigint", + "rustc-hash 2.1.1", +] + +[[package]] +name = "boa_engine" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e637ec52ea66d76b0ca86180c259d6c7bb6e6a6e14b2f36b85099306d8b00cc3" +dependencies = [ + "aligned-vec", + "arrayvec", + "bitflags 2.10.0", + "boa_ast", + "boa_gc", + "boa_interner", + "boa_macros", + "boa_parser", + "boa_string", + "bytemuck", + "cfg-if", + "cow-utils", + "dashmap 6.1.0", + "dynify", + "fast-float2", + "float16", + "futures-channel", + "futures-concurrency", + "futures-lite", + "hashbrown 0.16.0", + "icu_normalizer", + "indexmap 2.12.0", + "intrusive-collections", + "itertools 0.14.0", + "num-bigint", + "num-integer", + "num-traits", + "num_enum", + "paste 1.0.15", + "portable-atomic", + "rand 0.9.2", + "regress", + "rustc-hash 2.1.1", + "ryu-js", + "serde", + "serde_json", + "small_btree", + "static_assertions", + "tag_ptr", + "tap", + "thin-vec", + "thiserror 2.0.17", + "time", + "xsum", +] + +[[package]] +name = "boa_gc" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1179f690cbfcbe5364cceee5f1cb577265bb6f07b0be6f210aabe270adcf9da" +dependencies = [ + "boa_macros", + "boa_string", + "hashbrown 0.16.0", + "thin-vec", +] + +[[package]] +name = "boa_interner" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9626505d33dc63d349662437297df1d3afd9d5fc4a2b3ad34e5e1ce879a78848" +dependencies = [ + "boa_gc", + "boa_macros", + "hashbrown 0.16.0", + "indexmap 2.12.0", + "once_cell", + "phf", + "rustc-hash 2.1.1", + "static_assertions", +] + +[[package]] +name = "boa_macros" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f36418a46544b152632c141b0a0b7a453cd69ca150caeef83aee9e2f4b48b7d" +dependencies = [ + "cfg-if", + "cow-utils", + "proc-macro2", + "quote", + "syn 2.0.111", + "synstructure 0.13.2", +] + +[[package]] +name = "boa_parser" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02f99bf5b684f0de946378fcfe5f38c3a0fbd51cbf83a0f39ff773a0e218541f" +dependencies = [ + "bitflags 2.10.0", + "boa_ast", + "boa_interner", + "boa_macros", + "fast-float2", + "icu_properties", + "num-bigint", + "num-traits", + "regress", + "rustc-hash 2.1.1", +] + +[[package]] +name = "boa_string" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45ce9d7aa5563a2e14eab111e2ae1a06a69a812f6c0c3d843196c9d03fbef440" +dependencies = [ + "fast-float2", + "itoa", + "paste 1.0.15", + "rustc-hash 2.1.1", + "ryu-js", + "static_assertions", +] + [[package]] name = "bop-common" version = "0.1.0" @@ -1830,7 +1980,7 @@ dependencies = [ "parking_lot", "paste 0.1.18", "quanta", - "rand 0.9.1", + "rand 0.9.2", "reqwest", "reth-chainspec 1.9.2", "reth-cli 1.9.2", @@ -1838,7 +1988,7 @@ dependencies = [ "reth-db-api 1.9.2", "reth-evm 1.9.2", "reth-execution-errors 1.9.2", - "reth-node-ethereum", + "reth-node-ethereum 1.9.2", "reth-node-types 1.9.2", "reth-optimism-chainspec 1.9.2", "reth-optimism-cli 1.9.2", @@ -1847,7 +1997,7 @@ dependencies = [ "reth-optimism-node 1.9.2", "reth-optimism-payload-builder 1.9.2", "reth-optimism-primitives 1.9.2", - "reth-primitives", + "reth-primitives 1.9.2", "reth-primitives-traits 1.9.2", "reth-provider 1.9.2", "reth-storage-api 1.9.2", @@ -1864,7 +2014,7 @@ dependencies = [ "ssz_types", "strum 0.24.1", "strum_macros 0.24.3", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tracing", "tracing-appender", @@ -1900,7 +2050,7 @@ dependencies = [ "reth-optimism-chainspec 1.9.2", "reth-optimism-node 1.9.2", "reth-optimism-primitives 1.9.2", - "reth-primitives", + "reth-primitives 1.9.2", "reth-provider 1.9.2", "reth-stages-types 1.9.2", "reth-storage-api 1.9.2", @@ -1910,7 +2060,7 @@ dependencies = [ "reth-trie-db 1.9.2", "reth-trie-parallel 1.9.2", "revm-primitives", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tracing", ] @@ -1938,7 +2088,7 @@ dependencies = [ "op-alloy-rpc-types", "reqwest", "reth-optimism-chainspec 1.9.2", - "reth-primitives", + "reth-primitives 1.9.2", "reth-rpc-builder 1.9.2", "revm-primitives", "serde", @@ -2039,7 +2189,7 @@ dependencies = [ "op-alloy-rpc-types", "op-alloy-rpc-types-engine", "op-revm", - "rand 0.9.1", + "rand 0.9.2", "reqwest", "reth-chainspec 1.9.2", "reth-consensus 1.9.2", @@ -2052,7 +2202,7 @@ dependencies = [ "reth-optimism-payload-builder 1.9.2", "reth-optimism-primitives 1.9.2", "reth-optimism-txpool 1.9.2", - "reth-primitives", + "reth-primitives 1.9.2", "reth-primitives-traits 1.9.2", "reth-provider 1.9.2", "reth-trie-common 1.9.2", @@ -2062,7 +2212,7 @@ dependencies = [ "revm-primitives", "serde_json", "strum_macros 0.24.3", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tracing", "uuid", @@ -2088,7 +2238,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -2151,9 +2301,23 @@ checksum = "5ce89b21cab1437276d2650d57e971f9d548a2d9037cc231abdc0562b97498ce" [[package]] name = "bytemuck" -version = "1.23.0" +version = "1.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9134a6ef01ce4b366b50689c94f82c14bc72bc5d0386829828a2e2752ef7958c" +checksum = "f9abbd1bc6865053c427f7198e6af43bfdedc55ab791faed4fbd361d789575ff" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] [[package]] name = "byteorder" @@ -2228,7 +2392,7 @@ dependencies = [ "semver 1.0.26", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -2274,9 +2438,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.0" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" [[package]] name = "cfg_aliases" @@ -2351,7 +2515,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -2536,6 +2700,16 @@ dependencies = [ "unicode-segmentation", ] +[[package]] +name = "cordyceps" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "688d7fbb8092b8de775ef2536f36c8c31f2bc4006ece2e8d8ad2d17d00ce0a2a" +dependencies = [ + "loom", + "tracing", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -2571,6 +2745,12 @@ dependencies = [ "memchr", ] +[[package]] +name = "cow-utils" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "417bef24afe1460300965a25ff4a24b8b45ad011948302ec221e8a0a81eb2c79" + [[package]] name = "cpufeatures" version = "0.2.17" @@ -2743,7 +2923,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -2777,7 +2957,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -2792,7 +2972,7 @@ dependencies = [ "quote", "serde", "strsim", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -2803,7 +2983,7 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core 0.20.11", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -2814,7 +2994,7 @@ checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ "darling_core 0.21.3", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -2867,7 +3047,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d162beedaa69905488a8da94f5ac3edb4dd4788b732fadb7bd120b2625c1976" dependencies = [ "data-encoding", - "syn 2.0.101", + "syn 1.0.109", ] [[package]] @@ -2899,12 +3079,12 @@ dependencies = [ [[package]] name = "deranged" -version = "0.4.0" +version = "0.5.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" +checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587" dependencies = [ "powerfmt", - "serde", + "serde_core", ] [[package]] @@ -2926,7 +3106,7 @@ checksum = "ef941ded77d15ca19b40374869ac6000af1c9f2a4c0f3d4c70926287e6364a8f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -2937,7 +3117,7 @@ checksum = "30542c1ad912e0e3d22a1935c290e12e8a29d704a420177a31faad4a601a0800" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -2958,7 +3138,7 @@ dependencies = [ "darling 0.20.11", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -2968,7 +3148,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -2989,10 +3169,16 @@ dependencies = [ "convert_case", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", "unicode-xid", ] +[[package]] +name = "diatomic-waker" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab03c107fafeb3ee9f5925686dbb7a73bc76e3932abb0d2b365cb64b169cf04c" + [[package]] name = "diff" version = "0.1.13" @@ -3124,7 +3310,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -3145,6 +3331,26 @@ version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1c7a8fb8a9fbf66c1f703fe16184d10ca0ee9d23be5b4436400408ba54a95005" +[[package]] +name = "dynify" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81acb15628a3e22358bf73de5e7e62360b8a777dbcb5fc9ac7dfa9ae73723747" +dependencies = [ + "dynify-macros", +] + +[[package]] +name = "dynify-macros" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ec431cd708430d5029356535259c5d645d60edd3d39c54e5eea9782d46caa7d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", +] + [[package]] name = "ecdsa" version = "0.16.9" @@ -3194,7 +3400,7 @@ dependencies = [ "enum-ordinalize", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -3264,7 +3470,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -3284,7 +3490,27 @@ checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", +] + +[[package]] +name = "equator" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4711b213838dfee0117e3be6ac926007d7f433d7bbe33595975d4190cb07e6fc" +dependencies = [ + "equator-macro", +] + +[[package]] +name = "equator-macro" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.111", ] [[package]] @@ -3360,7 +3586,7 @@ dependencies = [ "darling 0.20.11", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -3395,6 +3621,12 @@ dependencies = [ "synstructure 0.12.6", ] +[[package]] +name = "fast-float2" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8eb564c5c7423d25c886fb561d1e4ee69f72354d16918afa32c08811f6b6a55" + [[package]] name = "fastrand" version = "2.3.0" @@ -3473,6 +3705,12 @@ dependencies = [ "static_assertions", ] +[[package]] +name = "fixedbitset" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d674e81391d1e1ab681a28d99df07927c6d4aa5b027d7da16ba32d1d21ecd99" + [[package]] name = "flate2" version = "1.1.1" @@ -3483,6 +3721,16 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "float16" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bffafbd079d520191c7c2779ae9cf757601266cf4167d3f659ff09617ff8483" +dependencies = [ + "cfg-if", + "rustc_version 0.2.3", +] + [[package]] name = "fnv" version = "1.0.7" @@ -3567,6 +3815,19 @@ dependencies = [ "futures-util", ] +[[package]] +name = "futures-buffered" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8e0e1f38ec07ba4abbde21eed377082f17ccb988be9d988a5adbf4bafc118fd" +dependencies = [ + "cordyceps", + "diatomic-waker", + "futures-core", + "pin-project-lite", + "spin", +] + [[package]] name = "futures-channel" version = "0.3.31" @@ -3577,6 +3838,21 @@ dependencies = [ "futures-sink", ] +[[package]] +name = "futures-concurrency" +version = "7.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eb68017df91f2e477ed4bea586c59eaecaa47ed885a770d0444e21e62572cd2" +dependencies = [ + "fixedbitset", + "futures-buffered", + "futures-core", + "futures-lite", + "pin-project", + "slab", + "smallvec", +] + [[package]] name = "futures-core" version = "0.3.31" @@ -3600,6 +3876,19 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" +[[package]] +name = "futures-lite" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + [[package]] name = "futures-macro" version = "0.3.31" @@ -3608,7 +3897,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -3681,7 +3970,7 @@ dependencies = [ "reqwest", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tracing", ] @@ -3852,7 +4141,7 @@ dependencies = [ "futures-core", "futures-sink", "http", - "indexmap 2.10.0", + "indexmap 2.12.0", "slab", "tokio", "tokio-util", @@ -3903,6 +4192,8 @@ version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" dependencies = [ + "allocator-api2", + "equivalent", "foldhash 0.2.0", "serde", ] @@ -3984,10 +4275,10 @@ dependencies = [ "idna", "ipnet", "once_cell", - "rand 0.9.1", + "rand 0.9.2", "ring", "serde", - "thiserror 2.0.12", + "thiserror 2.0.17", "tinyvec", "tokio", "tracing", @@ -4007,11 +4298,11 @@ dependencies = [ "moka", "once_cell", "parking_lot", - "rand 0.9.1", + "rand 0.9.2", "resolv-conf", "serde", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tracing", ] @@ -4274,6 +4565,8 @@ dependencies = [ "icu_properties", "icu_provider", "smallvec", + "utf16_iter", + "write16", "zerovec", ] @@ -4376,7 +4669,7 @@ checksum = "a0eb5a3343abf848c0984fe4604b2b105da9539376e24fc0a3b0007411ae4fd9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -4417,14 +4710,15 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.10.0" +version = "2.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" +checksum = "6717a8d2a5a929a1a2eb43a12812498ed141a0bcfb7e8f7844fbdbe4303bba9f" dependencies = [ "arbitrary", "equivalent", - "hashbrown 0.15.3", + "hashbrown 0.16.0", "serde", + "serde_core", ] [[package]] @@ -4473,7 +4767,7 @@ dependencies = [ "indoc", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -4491,6 +4785,15 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "intrusive-collections" +version = "0.9.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "189d0897e4cbe8c75efedf3502c18c887b05046e59d28404d4d8e46cbc4d1e86" +dependencies = [ + "memoffset 0.9.1", +] + [[package]] name = "ipconfig" version = "0.3.2" @@ -4635,7 +4938,7 @@ dependencies = [ "rustls-pki-types", "rustls-platform-verifier", "soketto", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tokio-rustls", "tokio-util", @@ -4659,11 +4962,11 @@ dependencies = [ "jsonrpsee-types", "parking_lot", "pin-project", - "rand 0.9.1", + "rand 0.9.2", "rustc-hash 2.1.1", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tokio-stream", "tower", @@ -4688,7 +4991,7 @@ dependencies = [ "rustls-platform-verifier", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tower", "url", @@ -4704,7 +5007,7 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -4726,7 +5029,7 @@ dependencies = [ "serde", "serde_json", "soketto", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tokio-stream", "tokio-util", @@ -4743,7 +5046,7 @@ dependencies = [ "http", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -4901,7 +5204,7 @@ dependencies = [ "multihash", "quick-protobuf", "sha2", - "thiserror 2.0.12", + "thiserror 2.0.17", "tracing", "zeroize", ] @@ -5070,7 +5373,7 @@ checksum = "1b27834086c65ec3f9387b096d66e99f221cf081c2b738042aa252bcd41204e3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -5118,6 +5421,15 @@ dependencies = [ "autocfg", ] +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + [[package]] name = "metrics" version = "0.24.2" @@ -5137,7 +5449,7 @@ dependencies = [ "proc-macro2", "quote", "regex", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -5151,7 +5463,7 @@ dependencies = [ "hyper", "hyper-rustls", "hyper-util", - "indexmap 2.10.0", + "indexmap 2.12.0", "ipnet", "metrics", "metrics-util", @@ -5188,7 +5500,7 @@ dependencies = [ "hashbrown 0.15.3", "metrics", "quanta", - "rand 0.9.1", + "rand 0.9.2", "rand_xoshiro", "sketches-ddsketch", ] @@ -5393,7 +5705,7 @@ dependencies = [ "cc", "cfg-if", "libc", - "memoffset", + "memoffset 0.6.5", ] [[package]] @@ -5470,6 +5782,7 @@ checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" dependencies = [ "num-integer", "num-traits", + "serde", ] [[package]] @@ -5540,23 +5853,24 @@ dependencies = [ [[package]] name = "num_enum" -version = "0.7.3" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e613fc340b2220f734a8595782c551f1250e969d87d3be1ae0579e8d4065179" +checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" dependencies = [ "num_enum_derive", + "rustversion", ] [[package]] name = "num_enum_derive" -version = "0.7.3" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" +checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -5619,7 +5933,7 @@ dependencies = [ "derive_more", "serde", "serde_with", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -5670,7 +5984,7 @@ dependencies = [ "op-alloy-consensus", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -5691,7 +6005,7 @@ dependencies = [ "op-alloy-consensus", "serde", "snap", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -5734,7 +6048,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -5765,7 +6079,7 @@ dependencies = [ "futures-sink", "js-sys", "pin-project-lite", - "thiserror 2.0.12", + "thiserror 2.0.17", "tracing", ] @@ -5795,7 +6109,7 @@ dependencies = [ "opentelemetry_sdk", "prost", "reqwest", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tonic", "tracing", @@ -5831,8 +6145,8 @@ dependencies = [ "futures-util", "opentelemetry", "percent-encoding", - "rand 0.9.1", - "thiserror 2.0.12", + "rand 0.9.2", + "thiserror 2.0.17", ] [[package]] @@ -5922,9 +6236,15 @@ dependencies = [ "proc-macro-crate", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + [[package]] name = "parking_lot" version = "0.12.3" @@ -6006,7 +6326,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1db05f56d34358a8b1066f67cbb203ee3e7ed2ba674a6263a1d5ec6db2204323" dependencies = [ "memchr", - "thiserror 2.0.12", + "thiserror 2.0.17", "ucd-trie", ] @@ -6030,7 +6350,7 @@ dependencies = [ "pest_meta", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -6084,7 +6404,7 @@ dependencies = [ "phf_shared", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -6113,7 +6433,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -6212,7 +6532,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6837b9e10d61f45f987d50808f83d1ee3d206c66acf650c3e4ae2e1f6ddedf55" dependencies = [ "proc-macro2", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -6263,7 +6583,7 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -6316,7 +6636,7 @@ dependencies = [ "bit-vec", "bitflags 2.10.0", "num-traits", - "rand 0.9.1", + "rand 0.9.2", "rand_chacha 0.9.0", "rand_xorshift", "regex-syntax", @@ -6343,7 +6663,7 @@ checksum = "4ee1c9ac207483d5e7db4940700de86a9aae46ef90c48b57f99fe7edb8345e49" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -6354,7 +6674,7 @@ checksum = "095a99f75c69734802359b682be8daaf8980296731f6470434ea2c652af1dd30" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -6377,7 +6697,7 @@ dependencies = [ "itertools 0.14.0", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -6435,7 +6755,7 @@ dependencies = [ "rustc-hash 2.1.1", "rustls", "socket2 0.5.9", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tracing", "web-time", @@ -6450,13 +6770,13 @@ dependencies = [ "bytes", "getrandom 0.3.3", "lru-slab", - "rand 0.9.1", + "rand 0.9.2", "ring", "rustc-hash 2.1.1", "rustls", "rustls-pki-types", "slab", - "thiserror 2.0.12", + "thiserror 2.0.17", "tinyvec", "tracing", "web-time", @@ -6478,9 +6798,9 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.40" +version = "1.0.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +checksum = "a338cc41d27e6cc6dce6cefc13a0729dfbb81c262b1f519331575dd80ef3067f" dependencies = [ "proc-macro2", ] @@ -6511,9 +6831,9 @@ dependencies = [ [[package]] name = "rand" -version = "0.9.1" +version = "0.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" +checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1" dependencies = [ "rand_chacha 0.9.0", "rand_core 0.9.3", @@ -6583,7 +6903,7 @@ version = "4.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d8e65c75143ce5d47c55b510297eeb1182f3c739b6043c537670e9fc18612dae" dependencies = [ - "rand 0.9.1", + "rand 0.9.2", "rustversion", ] @@ -6671,7 +6991,7 @@ checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b" dependencies = [ "getrandom 0.2.16", "libredox", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -6703,6 +7023,16 @@ version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +[[package]] +name = "regress" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2057b2325e68a893284d1538021ab90279adac1139957ca2a74426c6f118fb48" +dependencies = [ + "hashbrown 0.16.0", + "memchr", +] + [[package]] name = "relative-path" version = "1.9.3" @@ -6779,14 +7109,65 @@ dependencies = [ "eyre", "futures", "jsonrpsee", + "op-alloy-network", "op-alloy-rpc-types", + "reth 1.9.3", + "reth-db 1.9.3", "reth-exex 1.9.3", "reth-node-builder 1.9.3", "reth-optimism-chainspec 1.9.3", "reth-optimism-cli 1.9.3", "reth-optimism-node 1.9.3", "reth-rpc 1.9.3", - "thiserror 2.0.12", + "reth-rpc-eth-api 1.9.3", + "thiserror 2.0.17", + "tokio", + "tokio-stream", + "tracing", +] + +[[package]] +name = "reth" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-rpc-types", + "aquamarine", + "clap", + "eyre", + "reth-chainspec 1.9.3", + "reth-cli-runner 1.9.3", + "reth-cli-util 1.9.3", + "reth-consensus 1.9.3", + "reth-consensus-common 1.9.3", + "reth-db 1.9.3", + "reth-ethereum-cli", + "reth-ethereum-payload-builder 1.9.3", + "reth-ethereum-primitives 1.9.3", + "reth-evm 1.9.3", + "reth-network 1.9.3", + "reth-network-api 1.9.3", + "reth-node-api 1.9.3", + "reth-node-builder 1.9.3", + "reth-node-core 1.9.3", + "reth-node-ethereum 1.9.3", + "reth-node-metrics 1.9.3", + "reth-payload-builder 1.9.3", + "reth-payload-primitives 1.9.3", + "reth-primitives 1.9.3", + "reth-provider 1.9.3", + "reth-ress-protocol", + "reth-ress-provider", + "reth-revm 1.9.3", + "reth-rpc 1.9.3", + "reth-rpc-api 1.9.3", + "reth-rpc-builder 1.9.3", + "reth-rpc-convert 1.9.3", + "reth-rpc-eth-types 1.9.3", + "reth-rpc-server-types 1.9.3", + "reth-tasks 1.9.3", + "reth-tokio-util 1.9.3", + "reth-transaction-pool 1.9.3", "tokio", "tracing", ] @@ -6853,7 +7234,7 @@ dependencies = [ "metrics", "parking_lot", "pin-project", - "rand 0.9.1", + "rand 0.9.2", "reth-chainspec 1.9.2", "reth-errors 1.9.2", "reth-ethereum-primitives 1.9.2", @@ -6882,7 +7263,7 @@ dependencies = [ "metrics", "parking_lot", "pin-project", - "rand 0.9.1", + "rand 0.9.2", "reth-chainspec 1.9.3", "reth-errors 1.9.3", "reth-ethereum-primitives 1.9.3", @@ -7151,7 +7532,7 @@ dependencies = [ "reth-fs-util 1.9.2", "secp256k1 0.30.0", "serde", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -7168,7 +7549,8 @@ dependencies = [ "reth-fs-util 1.9.3", "secp256k1 0.30.0", "serde", - "thiserror 2.0.12", + "thiserror 2.0.17", + "tikv-jemallocator", ] [[package]] @@ -7216,7 +7598,7 @@ source = "git+https://github.com/gattaca-com/based-op-reth?rev=b053849462eb48e61 dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -7226,7 +7608,7 @@ source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea8 dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -7269,7 +7651,7 @@ dependencies = [ "auto_impl", "reth-execution-types 1.9.2", "reth-primitives-traits 1.9.2", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -7282,7 +7664,7 @@ dependencies = [ "auto_impl", "reth-execution-types 1.9.3", "reth-primitives-traits 1.9.3", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -7384,7 +7766,7 @@ dependencies = [ "strum 0.27.1", "sysinfo", "tempfile", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -7408,7 +7790,7 @@ dependencies = [ "rustc-hash 2.1.1", "strum 0.27.1", "sysinfo", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -7491,7 +7873,7 @@ dependencies = [ "reth-trie-db 1.9.2", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.17", "tracing", ] @@ -7521,7 +7903,7 @@ dependencies = [ "reth-trie-db 1.9.3", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.17", "tracing", ] @@ -7573,7 +7955,7 @@ dependencies = [ "schnellru", "secp256k1 0.30.0", "serde", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tokio-stream", "tracing", @@ -7598,7 +7980,7 @@ dependencies = [ "schnellru", "secp256k1 0.30.0", "serde", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tokio-stream", "tracing", @@ -7617,13 +7999,13 @@ dependencies = [ "futures", "itertools 0.14.0", "metrics", - "rand 0.9.1", + "rand 0.9.2", "reth-chainspec 1.9.2", "reth-ethereum-forks 1.9.2", "reth-metrics 1.9.2", "reth-network-peers 1.9.2", "secp256k1 0.30.0", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tracing", ] @@ -7641,13 +8023,13 @@ dependencies = [ "futures", "itertools 0.14.0", "metrics", - "rand 0.9.1", + "rand 0.9.2", "reth-chainspec 1.9.3", "reth-ethereum-forks 1.9.3", "reth-metrics 1.9.3", "reth-network-peers 1.9.3", "secp256k1 0.30.0", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tracing", ] @@ -7670,7 +8052,7 @@ dependencies = [ "secp256k1 0.30.0", "serde", "serde_with", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tokio-stream", "tracing", @@ -7694,7 +8076,7 @@ dependencies = [ "secp256k1 0.30.0", "serde", "serde_with", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tokio-stream", "tracing", @@ -7728,7 +8110,7 @@ dependencies = [ "reth-tasks 1.9.2", "reth-testing-utils", "tempfile", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tokio-stream", "tokio-util", @@ -7759,7 +8141,7 @@ dependencies = [ "reth-primitives-traits 1.9.3", "reth-storage-api 1.9.3", "reth-tasks 1.9.3", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tokio-stream", "tokio-util", @@ -7789,7 +8171,7 @@ dependencies = [ "secp256k1 0.30.0", "sha2", "sha3", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tokio-stream", "tokio-util", @@ -7820,7 +8202,7 @@ dependencies = [ "secp256k1 0.30.0", "sha2", "sha3", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tokio-stream", "tokio-util", @@ -7897,7 +8279,7 @@ dependencies = [ "reth-primitives-traits 1.9.2", "reth-trie-common 1.9.2", "serde", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", ] @@ -7922,7 +8304,7 @@ dependencies = [ "reth-primitives-traits 1.9.3", "reth-trie-common 1.9.3", "serde", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", ] @@ -8020,7 +8402,7 @@ dependencies = [ "revm-primitives", "schnellru", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tracing", ] @@ -8070,7 +8452,7 @@ dependencies = [ "revm-primitives", "schnellru", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tracing", ] @@ -8144,7 +8526,7 @@ dependencies = [ "ethereum_ssz_derive", "reth-ethereum-primitives 1.9.2", "snap", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -8160,7 +8542,7 @@ dependencies = [ "ethereum_ssz_derive", "reth-ethereum-primitives 1.9.3", "snap", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -8245,7 +8627,7 @@ dependencies = [ "reth-consensus 1.9.2", "reth-execution-errors 1.9.2", "reth-storage-errors 1.9.2", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -8256,7 +8638,7 @@ dependencies = [ "reth-consensus 1.9.3", "reth-execution-errors 1.9.3", "reth-storage-errors 1.9.3", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -8280,7 +8662,7 @@ dependencies = [ "reth-primitives-traits 1.9.2", "serde", "snap", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tokio-stream", "tokio-util", @@ -8308,7 +8690,7 @@ dependencies = [ "reth-primitives-traits 1.9.3", "serde", "snap", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tokio-stream", "tokio-util", @@ -8333,7 +8715,7 @@ dependencies = [ "reth-ethereum-primitives 1.9.2", "reth-primitives-traits 1.9.2", "serde", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -8354,7 +8736,31 @@ dependencies = [ "reth-ethereum-primitives 1.9.3", "reth-primitives-traits 1.9.3", "serde", - "thiserror 2.0.12", + "thiserror 2.0.17", +] + +[[package]] +name = "reth-ethereum-cli" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "clap", + "eyre", + "reth-chainspec 1.9.3", + "reth-cli 1.9.3", + "reth-cli-commands 1.9.3", + "reth-cli-runner 1.9.3", + "reth-db 1.9.3", + "reth-node-api 1.9.3", + "reth-node-builder 1.9.3", + "reth-node-core 1.9.3", + "reth-node-ethereum 1.9.3", + "reth-node-metrics 1.9.3", + "reth-rpc-server-types 1.9.3", + "reth-tracing 1.9.3", + "reth-tracing-otlp 1.9.3", + "tracing", + "url", ] [[package]] @@ -8373,6 +8779,22 @@ dependencies = [ "tracing", ] +[[package]] +name = "reth-ethereum-consensus" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "reth-chainspec 1.9.3", + "reth-consensus 1.9.3", + "reth-consensus-common 1.9.3", + "reth-execution-types 1.9.3", + "reth-primitives-traits 1.9.3", + "tracing", +] + [[package]] name = "reth-ethereum-engine-primitives" version = "1.9.2" @@ -8388,7 +8810,7 @@ dependencies = [ "reth-primitives-traits 1.9.2", "serde", "sha2", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -8406,7 +8828,7 @@ dependencies = [ "reth-primitives-traits 1.9.3", "serde", "sha2", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -8464,6 +8886,35 @@ dependencies = [ "tracing", ] +[[package]] +name = "reth-ethereum-payload-builder" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-rpc-types-engine", + "reth-basic-payload-builder 1.9.3", + "reth-chainspec 1.9.3", + "reth-consensus-common 1.9.3", + "reth-errors 1.9.3", + "reth-ethereum-primitives 1.9.3", + "reth-evm 1.9.3", + "reth-evm-ethereum 1.9.3", + "reth-payload-builder 1.9.3", + "reth-payload-builder-primitives 1.9.3", + "reth-payload-primitives 1.9.3", + "reth-payload-validator 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-revm 1.9.3", + "reth-storage-api 1.9.3", + "reth-transaction-pool 1.9.3", + "revm", + "tracing", +] + [[package]] name = "reth-ethereum-primitives" version = "1.9.2" @@ -8621,7 +9072,7 @@ dependencies = [ "alloy-rlp", "nybbles", "reth-storage-errors 1.9.2", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -8634,7 +9085,7 @@ dependencies = [ "alloy-rlp", "nybbles", "reth-storage-errors 1.9.3", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -8705,7 +9156,7 @@ dependencies = [ "reth-tasks 1.9.2", "reth-tracing 1.9.2", "rmp-serde", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tokio-util", "tracing", @@ -8743,7 +9194,7 @@ dependencies = [ "reth-tasks 1.9.3", "reth-tracing 1.9.3", "rmp-serde", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tokio-util", "tracing", @@ -8784,7 +9235,7 @@ source = "git+https://github.com/gattaca-com/based-op-reth?rev=b053849462eb48e61 dependencies = [ "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -8794,7 +9245,7 @@ source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea8 dependencies = [ "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -8865,7 +9316,7 @@ dependencies = [ "jsonrpsee", "pin-project", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tokio-stream", "tokio-util", @@ -8885,7 +9336,7 @@ dependencies = [ "jsonrpsee", "pin-project", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tokio-stream", "tokio-util", @@ -8905,7 +9356,7 @@ dependencies = [ "parking_lot", "reth-mdbx-sys 1.9.2", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.17", "tracing", ] @@ -8921,7 +9372,7 @@ dependencies = [ "parking_lot", "reth-mdbx-sys 1.9.3", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.17", "tracing", ] @@ -8992,7 +9443,7 @@ dependencies = [ "if-addrs", "reqwest", "serde_with", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tracing", ] @@ -9006,7 +9457,7 @@ dependencies = [ "if-addrs", "reqwest", "serde_with", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tracing", ] @@ -9031,7 +9482,7 @@ dependencies = [ "parking_lot", "pin-project", "rand 0.8.5", - "rand 0.9.1", + "rand 0.9.2", "reth-chainspec 1.9.2", "reth-consensus 1.9.2", "reth-discv4 1.9.2", @@ -9059,7 +9510,7 @@ dependencies = [ "secp256k1 0.30.0", "serde", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tokio-stream", "tokio-util", @@ -9086,7 +9537,7 @@ dependencies = [ "parking_lot", "pin-project", "rand 0.8.5", - "rand 0.9.1", + "rand 0.9.2", "reth-chainspec 1.9.3", "reth-consensus 1.9.3", "reth-discv4 1.9.3", @@ -9114,7 +9565,7 @@ dependencies = [ "secp256k1 0.30.0", "serde", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tokio-stream", "tokio-util", @@ -9141,7 +9592,7 @@ dependencies = [ "reth-network-types 1.9.2", "reth-tokio-util 1.9.2", "serde", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tokio-stream", ] @@ -9166,7 +9617,7 @@ dependencies = [ "reth-network-types 1.9.3", "reth-tokio-util 1.9.3", "serde", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tokio-stream", ] @@ -9226,7 +9677,7 @@ dependencies = [ "enr", "secp256k1 0.30.0", "serde_with", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "url", ] @@ -9241,7 +9692,7 @@ dependencies = [ "enr", "secp256k1 0.30.0", "serde_with", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "url", ] @@ -9286,7 +9737,7 @@ dependencies = [ "memmap2", "reth-fs-util 1.9.2", "serde", - "thiserror 2.0.12", + "thiserror 2.0.17", "tracing", "zstd", ] @@ -9303,7 +9754,7 @@ dependencies = [ "memmap2", "reth-fs-util 1.9.3", "serde", - "thiserror 2.0.12", + "thiserror 2.0.17", "tracing", "zstd", ] @@ -9507,7 +9958,7 @@ dependencies = [ "eyre", "futures", "humantime", - "rand 0.9.1", + "rand 0.9.2", "reth-chainspec 1.9.2", "reth-cli-util 1.9.2", "reth-config 1.9.2", @@ -9537,7 +9988,7 @@ dependencies = [ "serde", "shellexpand", "strum 0.27.1", - "thiserror 2.0.12", + "thiserror 2.0.17", "toml", "tracing", "url", @@ -9560,7 +10011,7 @@ dependencies = [ "eyre", "futures", "humantime", - "rand 0.9.1", + "rand 0.9.2", "reth-chainspec 1.9.3", "reth-cli-util 1.9.3", "reth-config 1.9.3", @@ -9590,7 +10041,7 @@ dependencies = [ "serde", "shellexpand", "strum 0.27.1", - "thiserror 2.0.12", + "thiserror 2.0.17", "toml", "tracing", "url", @@ -9611,9 +10062,9 @@ dependencies = [ "reth-chainspec 1.9.2", "reth-engine-local 1.9.2", "reth-engine-primitives 1.9.2", - "reth-ethereum-consensus", + "reth-ethereum-consensus 1.9.2", "reth-ethereum-engine-primitives 1.9.2", - "reth-ethereum-payload-builder", + "reth-ethereum-payload-builder 1.9.2", "reth-ethereum-primitives 1.9.2", "reth-evm 1.9.2", "reth-evm-ethereum 1.9.2", @@ -9636,6 +10087,44 @@ dependencies = [ "tokio", ] +[[package]] +name = "reth-node-ethereum" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-eips", + "alloy-network", + "alloy-rpc-types-engine", + "alloy-rpc-types-eth", + "eyre", + "reth-chainspec 1.9.3", + "reth-engine-local 1.9.3", + "reth-engine-primitives 1.9.3", + "reth-ethereum-consensus 1.9.3", + "reth-ethereum-engine-primitives 1.9.3", + "reth-ethereum-payload-builder 1.9.3", + "reth-ethereum-primitives 1.9.3", + "reth-evm 1.9.3", + "reth-evm-ethereum 1.9.3", + "reth-network 1.9.3", + "reth-node-api 1.9.3", + "reth-node-builder 1.9.3", + "reth-payload-primitives 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-provider 1.9.3", + "reth-revm 1.9.3", + "reth-rpc 1.9.3", + "reth-rpc-api 1.9.3", + "reth-rpc-builder 1.9.3", + "reth-rpc-eth-api 1.9.3", + "reth-rpc-eth-types 1.9.3", + "reth-rpc-server-types 1.9.3", + "reth-tracing 1.9.3", + "reth-transaction-pool 1.9.3", + "revm", + "tokio", +] + [[package]] name = "reth-node-ethstats" version = "1.9.2" @@ -9652,7 +10141,7 @@ dependencies = [ "reth-transaction-pool 1.9.2", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tokio-stream", "tokio-tungstenite", @@ -9676,7 +10165,7 @@ dependencies = [ "reth-transaction-pool 1.9.3", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tokio-stream", "tokio-tungstenite", @@ -9769,6 +10258,7 @@ dependencies = [ "reqwest", "reth-metrics 1.9.3", "reth-tasks 1.9.3", + "tikv-jemalloc-ctl", "tokio", "tower", "tracing", @@ -9823,7 +10313,7 @@ dependencies = [ "serde", "serde_json", "tar-no-std", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -9851,7 +10341,7 @@ dependencies = [ "serde", "serde_json", "tar-no-std", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -9975,7 +10465,7 @@ dependencies = [ "reth-storage-errors 1.9.2", "reth-trie-common 1.9.2", "revm", - "thiserror 2.0.12", + "thiserror 2.0.17", "tracing", ] @@ -10000,7 +10490,7 @@ dependencies = [ "reth-storage-errors 1.9.3", "reth-trie-common 1.9.3", "revm", - "thiserror 2.0.12", + "thiserror 2.0.17", "tracing", ] @@ -10029,7 +10519,7 @@ dependencies = [ "reth-rpc-eth-api 1.9.2", "reth-storage-errors 1.9.2", "revm", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -10057,7 +10547,7 @@ dependencies = [ "reth-rpc-eth-api 1.9.3", "reth-storage-errors 1.9.3", "revm", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -10288,7 +10778,7 @@ dependencies = [ "revm", "serde", "sha2", - "thiserror 2.0.12", + "thiserror 2.0.17", "tracing", ] @@ -10328,7 +10818,7 @@ dependencies = [ "revm", "serde", "sha2", - "thiserror 2.0.12", + "thiserror 2.0.17", "tracing", ] @@ -10425,7 +10915,7 @@ dependencies = [ "reth-transaction-pool 1.9.2", "revm", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tokio-stream", "tower", @@ -10486,7 +10976,7 @@ dependencies = [ "reth-transaction-pool 1.9.3", "revm", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tokio-stream", "tower", @@ -10544,7 +11034,7 @@ dependencies = [ "reth-storage-api 1.9.2", "reth-transaction-pool 1.9.2", "serde", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tracing", ] @@ -10580,7 +11070,7 @@ dependencies = [ "reth-storage-api 1.9.3", "reth-transaction-pool 1.9.3", "serde", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tracing", ] @@ -10667,7 +11157,7 @@ dependencies = [ "reth-errors 1.9.2", "reth-primitives-traits 1.9.2", "serde", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", ] @@ -10687,7 +11177,7 @@ dependencies = [ "reth-errors 1.9.3", "reth-primitives-traits 1.9.3", "serde", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", ] @@ -10745,6 +11235,19 @@ dependencies = [ "reth-static-file-types 1.9.2", ] +[[package]] +name = "reth-primitives" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "once_cell", + "reth-ethereum-forks 1.9.3", + "reth-ethereum-primitives 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-static-file-types 1.9.3", +] + [[package]] name = "reth-primitives-traits" version = "1.9.2" @@ -10775,7 +11278,7 @@ dependencies = [ "secp256k1 0.30.0", "serde", "serde_with", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -10805,7 +11308,7 @@ dependencies = [ "secp256k1 0.30.0", "serde", "serde_with", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -10915,7 +11418,7 @@ dependencies = [ "reth-static-file-types 1.9.2", "reth-tokio-util 1.9.2", "rustc-hash 2.1.1", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tracing", ] @@ -10942,7 +11445,7 @@ dependencies = [ "reth-static-file-types 1.9.3", "reth-tokio-util 1.9.3", "rustc-hash 2.1.1", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tracing", ] @@ -10959,7 +11462,7 @@ dependencies = [ "reth-codecs 1.9.2", "serde", "strum 0.27.1", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -10973,7 +11476,53 @@ dependencies = [ "reth-codecs 1.9.3", "serde", "strum 0.27.1", - "thiserror 2.0.12", + "thiserror 2.0.17", +] + +[[package]] +name = "reth-ress-protocol" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-primitives", + "alloy-rlp", + "futures", + "reth-eth-wire 1.9.3", + "reth-ethereum-primitives 1.9.3", + "reth-network 1.9.3", + "reth-network-api 1.9.3", + "reth-storage-errors 1.9.3", + "tokio", + "tokio-stream", + "tracing", +] + +[[package]] +name = "reth-ress-provider" +version = "1.9.3" +source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea84c5751776ecabdd069646" +dependencies = [ + "alloy-consensus", + "alloy-primitives", + "eyre", + "futures", + "parking_lot", + "reth-chain-state 1.9.3", + "reth-errors 1.9.3", + "reth-ethereum-primitives 1.9.3", + "reth-evm 1.9.3", + "reth-node-api 1.9.3", + "reth-primitives-traits 1.9.3", + "reth-ress-protocol", + "reth-revm 1.9.3", + "reth-storage-api 1.9.3", + "reth-tasks 1.9.3", + "reth-tokio-util 1.9.3", + "reth-trie 1.9.3", + "schnellru", + "tokio", + "tracing", ] [[package]] @@ -11073,7 +11622,7 @@ dependencies = [ "serde", "serde_json", "sha2", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tokio-stream", "tower", @@ -11152,7 +11701,7 @@ dependencies = [ "serde", "serde_json", "sha2", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tokio-stream", "tower", @@ -11247,7 +11796,7 @@ dependencies = [ "reth-tasks 1.9.2", "reth-transaction-pool 1.9.2", "serde", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tokio-util", "tower", @@ -11286,7 +11835,7 @@ dependencies = [ "reth-tasks 1.9.3", "reth-transaction-pool 1.9.3", "serde", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tokio-util", "tower", @@ -11318,7 +11867,7 @@ dependencies = [ "reth-primitives-traits 1.9.2", "reth-storage-api 1.9.2", "revm-context", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -11345,7 +11894,7 @@ dependencies = [ "reth-primitives-traits 1.9.3", "reth-storage-api 1.9.3", "revm-context", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -11373,7 +11922,7 @@ dependencies = [ "reth-tasks 1.9.2", "reth-transaction-pool 1.9.2", "serde", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tracing", ] @@ -11403,7 +11952,7 @@ dependencies = [ "reth-tasks 1.9.3", "reth-transaction-pool 1.9.3", "serde", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tracing", ] @@ -11516,7 +12065,7 @@ dependencies = [ "jsonrpsee-core", "jsonrpsee-types", "metrics", - "rand 0.9.1", + "rand 0.9.2", "reqwest", "reth-chain-state 1.9.2", "reth-chainspec 1.9.2", @@ -11537,7 +12086,7 @@ dependencies = [ "revm-inspectors", "schnellru", "serde", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tokio-stream", "tracing", @@ -11563,7 +12112,7 @@ dependencies = [ "jsonrpsee-core", "jsonrpsee-types", "metrics", - "rand 0.9.1", + "rand 0.9.2", "reqwest", "reth-chain-state 1.9.3", "reth-chainspec 1.9.3", @@ -11584,7 +12133,7 @@ dependencies = [ "revm-inspectors", "schnellru", "serde", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tokio-stream", "tracing", @@ -11693,7 +12242,7 @@ dependencies = [ "reth-trie 1.9.2", "reth-trie-db 1.9.2", "tempfile", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tracing", ] @@ -11737,7 +12286,7 @@ dependencies = [ "reth-storage-errors 1.9.3", "reth-trie 1.9.3", "reth-trie-db 1.9.3", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tracing", ] @@ -11764,7 +12313,7 @@ dependencies = [ "reth-static-file 1.9.2", "reth-static-file-types 1.9.2", "reth-tokio-util 1.9.2", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tracing", ] @@ -11791,7 +12340,7 @@ dependencies = [ "reth-static-file 1.9.3", "reth-static-file-types 1.9.3", "reth-tokio-util 1.9.3", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tracing", ] @@ -11946,7 +12495,7 @@ dependencies = [ "reth-prune-types 1.9.2", "reth-static-file-types 1.9.2", "revm-database-interface", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -11962,7 +12511,7 @@ dependencies = [ "reth-prune-types 1.9.3", "reth-static-file-types 1.9.3", "revm-database-interface", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -11977,7 +12526,7 @@ dependencies = [ "pin-project", "rayon", "reth-metrics 1.9.2", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tracing", "tracing-futures", @@ -11995,7 +12544,7 @@ dependencies = [ "pin-project", "rayon", "reth-metrics 1.9.3", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tracing", "tracing-futures", @@ -12011,7 +12560,7 @@ dependencies = [ "alloy-genesis", "alloy-primitives", "rand 0.8.5", - "rand 0.9.1", + "rand 0.9.2", "reth-ethereum-primitives 1.9.2", "reth-primitives-traits 1.9.2", "secp256k1 0.30.0", @@ -12059,12 +12608,14 @@ source = "git+https://github.com/paradigmxyz/reth?tag=v1.9.3#27a8c0f5a6dfb27dea8 dependencies = [ "clap", "eyre", + "reth-tracing-otlp 1.9.3", "rolling-file", "tracing", "tracing-appender", "tracing-journald", "tracing-logfmt", "tracing-subscriber 0.3.20", + "url", ] [[package]] @@ -12118,7 +12669,7 @@ dependencies = [ "parking_lot", "paste 1.0.15", "pin-project", - "rand 0.9.1", + "rand 0.9.2", "reth-chain-state 1.9.2", "reth-chainspec 1.9.2", "reth-eth-wire-types 1.9.2", @@ -12136,7 +12687,7 @@ dependencies = [ "serde", "serde_json", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tokio-stream", "tracing", @@ -12158,7 +12709,7 @@ dependencies = [ "metrics", "parking_lot", "pin-project", - "rand 0.9.1", + "rand 0.9.2", "reth-chain-state 1.9.3", "reth-chainspec 1.9.3", "reth-eth-wire-types 1.9.3", @@ -12176,7 +12727,7 @@ dependencies = [ "serde", "serde_json", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tokio-stream", "tracing", @@ -12328,7 +12879,7 @@ dependencies = [ "reth-trie 1.9.2", "reth-trie-common 1.9.2", "reth-trie-sparse 1.9.2", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tracing", ] @@ -12353,7 +12904,7 @@ dependencies = [ "reth-trie 1.9.3", "reth-trie-common 1.9.3", "reth-trie-sparse 1.9.3", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tracing", ] @@ -12587,11 +13138,13 @@ dependencies = [ "alloy-rpc-types-trace", "alloy-sol-types", "anstyle", + "boa_engine", + "boa_gc", "colorchoice", "revm", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -12787,7 +13340,7 @@ dependencies = [ "regex", "relative-path", "rustc_version 0.4.1", - "syn 2.0.101", + "syn 2.0.111", "unicode-ident", ] @@ -12824,7 +13377,7 @@ dependencies = [ "primitive-types", "proptest", "rand 0.8.5", - "rand 0.9.1", + "rand 0.9.2", "rlp", "ruint-macro", "serde_core", @@ -12865,6 +13418,15 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e75f6a532d0fd9f7f13144f392b6ad56a32696bfcd9c78f797f16bbb6f072d6" +[[package]] +name = "rustc_version" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" +dependencies = [ + "semver 0.9.0", +] + [[package]] name = "rustc_version" version = "0.3.3" @@ -13010,6 +13572,12 @@ version = "1.0.20" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28d3b2b1366ec20994f1fd18c3c594f05c5dd4bc44d8bb0c1c632c8d6829481f" +[[package]] +name = "ryu-js" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd29631678d6fb0903b69223673e122c32e9ae559d0960a38d574695ebc0ea15" + [[package]] name = "same-file" version = "1.0.6" @@ -13085,7 +13653,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2c3c81b43dc2d8877c216a3fccf76677ee1ebccd429566d3e67447290d0c42b2" dependencies = [ "bitcoin_hashes", - "rand 0.9.1", + "rand 0.9.2", "secp256k1-sys 0.11.0", ] @@ -13143,13 +13711,22 @@ dependencies = [ "libc", ] +[[package]] +name = "semver" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" +dependencies = [ + "semver-parser 0.7.0", +] + [[package]] name = "semver" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" dependencies = [ - "semver-parser", + "semver-parser 0.10.3", ] [[package]] @@ -13161,6 +13738,12 @@ dependencies = [ "serde", ] +[[package]] +name = "semver-parser" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" + [[package]] name = "semver-parser" version = "0.10.3" @@ -13209,7 +13792,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -13218,7 +13801,7 @@ version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ - "indexmap 2.10.0", + "indexmap 2.12.0", "itoa", "memchr", "ryu", @@ -13267,7 +13850,7 @@ dependencies = [ "chrono", "hex 0.4.3", "indexmap 1.9.3", - "indexmap 2.10.0", + "indexmap 2.12.0", "serde", "serde_derive", "serde_json", @@ -13284,7 +13867,7 @@ dependencies = [ "darling 0.20.11", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -13430,7 +14013,7 @@ checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb" dependencies = [ "num-bigint", "num-traits", - "thiserror 2.0.12", + "thiserror 2.0.17", "time", ] @@ -13470,6 +14053,15 @@ dependencies = [ "autocfg", ] +[[package]] +name = "small_btree" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ba60d2df92ba73864714808ca68c059734853e6ab722b40e1cf543ebb3a057a" +dependencies = [ + "arrayvec", +] + [[package]] name = "smallvec" version = "1.15.0" @@ -13522,6 +14114,12 @@ dependencies = [ "sha1", ] +[[package]] +name = "spin" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5fe4ccb98d9c292d56fec89a5e07da7fc4cf0dc11e156b41793132775d3e591" + [[package]] name = "spki" version = "0.7.3" @@ -13613,7 +14211,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -13626,7 +14224,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -13648,9 +14246,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.101" +version = "2.0.111" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" +checksum = "390cc9a294ab71bdb1aa2e99d13be9c753cd2d7bd6560c77118597410c4d2e87" dependencies = [ "proc-macro2", "quote", @@ -13666,7 +14264,7 @@ dependencies = [ "paste 1.0.15", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -13698,7 +14296,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -13744,6 +14342,12 @@ dependencies = [ "unicode-width 0.2.0", ] +[[package]] +name = "tag_ptr" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0e973b34477b7823833469eb0f5a3a60370fef7a453e02d751b59180d0a5a05" + [[package]] name = "tagptr" version = "0.2.0" @@ -13791,6 +14395,12 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "thin-vec" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "144f754d318415ac792f9d69fc87abbbfc043ce2ef041c60f16ad828f638717d" + [[package]] name = "thiserror" version = "1.0.69" @@ -13802,11 +14412,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.12" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" dependencies = [ - "thiserror-impl 2.0.12", + "thiserror-impl 2.0.17", ] [[package]] @@ -13817,18 +14427,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] name = "thiserror-impl" -version = "2.0.12" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -13850,14 +14460,46 @@ dependencies = [ "num_cpus", ] +[[package]] +name = "tikv-jemalloc-ctl" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "661f1f6a57b3a36dc9174a2c10f19513b4866816e13425d3e418b11cc37bc24c" +dependencies = [ + "libc", + "paste 1.0.15", + "tikv-jemalloc-sys", +] + +[[package]] +name = "tikv-jemalloc-sys" +version = "0.6.1+5.3.0-1-ge13ca993e8ccb9ba9847cc330696e02839f328f7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd8aa5b2ab86a2cefa406d889139c162cbb230092f7d1d7cbc1716405d852a3b" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "tikv-jemallocator" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0359b4327f954e0567e69fb191cf1436617748813819c94b8cd4a431422d053a" +dependencies = [ + "libc", + "tikv-jemalloc-sys", +] + [[package]] name = "time" -version = "0.3.41" +version = "0.3.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" +checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" dependencies = [ "deranged", "itoa", + "js-sys", "libc", "num-conv", "num_threads", @@ -13869,15 +14511,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.4" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" +checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" [[package]] name = "time-macros" -version = "0.2.22" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" +checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" dependencies = [ "num-conv", "time-core", @@ -13942,7 +14584,7 @@ checksum = "af407857209536a95c8e56f8231ef2c2e2aff839b22e07a1ffcbc617e9db9fa5" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -14022,7 +14664,7 @@ dependencies = [ "http", "httparse", "openssl", - "rand 0.9.1", + "rand 0.9.2", "simdutf8", "tokio", "tokio-util", @@ -14055,7 +14697,7 @@ version = "0.22.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "310068873db2c5b3e7659d2cc35d21855dbafa50d1ce336397c666e3cb08137e" dependencies = [ - "indexmap 2.10.0", + "indexmap 2.12.0", "serde", "serde_spanned", "toml_datetime", @@ -14115,7 +14757,7 @@ dependencies = [ "futures-core", "futures-util", "hdrhistogram", - "indexmap 2.10.0", + "indexmap 2.12.0", "pin-project-lite", "slab", "sync_wrapper", @@ -14201,7 +14843,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -14269,7 +14911,7 @@ dependencies = [ "opentelemetry_sdk", "rustversion", "smallvec", - "thiserror 2.0.12", + "thiserror 2.0.17", "tracing", "tracing-core", "tracing-log", @@ -14340,7 +14982,7 @@ dependencies = [ "darling 0.20.11", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -14399,11 +15041,11 @@ dependencies = [ "http", "httparse", "log", - "rand 0.9.1", + "rand 0.9.2", "rustls", "rustls-pki-types", "sha1", - "thiserror 2.0.12", + "thiserror 2.0.17", "utf-8", ] @@ -14429,12 +15071,12 @@ dependencies = [ "op-alloy-rpc-types", "op-alloy-rpc-types-engine", "parking_lot", - "rand 0.9.1", + "rand 0.9.2", "reqwest", "reth-rpc-layer 1.9.2", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tokio-websockets", "tower", @@ -14571,6 +15213,12 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" +[[package]] +name = "utf16_iter" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8232dd3cdaed5356e0f716d285e4b40b932ac434100fe9b7e0e8e935b9e6246" + [[package]] name = "utf8_iter" version = "1.0.4" @@ -14668,7 +15316,7 @@ checksum = "d674d135b4a8c1d7e813e2f8d1c9a58308aee4a680323066025e53132218bd91" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -14736,7 +15384,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", "wasm-bindgen-shared", ] @@ -14771,7 +15419,7 @@ checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -15038,7 +15686,7 @@ checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -15049,7 +15697,7 @@ checksum = "2bbd5b46c938e506ecbce286b6628a02171d56153ba733b6c741fc627ec9579b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -15060,7 +15708,7 @@ checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -15071,7 +15719,7 @@ checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -15082,7 +15730,7 @@ checksum = "053c4c462dc91d3b1504c6fe5a726dd15e216ba718e84a0e46a88fbe5ded3515" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -15093,7 +15741,7 @@ checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -15548,6 +16196,12 @@ dependencies = [ "bitflags 2.10.0", ] +[[package]] +name = "write16" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1890f4022759daae28ed4fe62859b1236caebfc61ede2f63ed4e695f3f6d936" + [[package]] name = "writeable" version = "0.6.1" @@ -15592,6 +16246,12 @@ dependencies = [ "rustix 1.0.7", ] +[[package]] +name = "xsum" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0637d3a5566a82fa5214bae89087bc8c9fb94cd8e8a3c07feb691bb8d9c632db" + [[package]] name = "yansi" version = "1.0.1" @@ -15618,7 +16278,7 @@ checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", "synstructure 0.13.2", ] @@ -15639,7 +16299,7 @@ checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -15659,7 +16319,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", "synstructure 0.13.2", ] @@ -15680,7 +16340,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] @@ -15713,7 +16373,7 @@ checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.111", ] [[package]] diff --git a/based/Cargo.toml b/based/Cargo.toml index e5df44acc..ee2f409c6 100644 --- a/based/Cargo.toml +++ b/based/Cargo.toml @@ -12,9 +12,7 @@ version = "0.1.0" alloy-consensus = "1.0.41" alloy-eips = "1.0.41" alloy-network = "1.0.41" -alloy-primitives = { version = "1.0.41", default-features = false, features = [ - "getrandom", -] } +alloy-primitives = { version = "1.0.41", default-features = false, features = ["getrandom"] } alloy-provider = "1.0.41" alloy-rlp = "0.3.12" alloy-rpc-types = { version = "1.0.41", features = ["engine"] } @@ -41,29 +39,25 @@ either = "1.15.0" ethereum_ssz = "0.9.0" eyre = "0.6.12" futures = "0.3.31" -hickory-resolver = "=0.25.0-alpha.5" # Use the exact version reth expects +hickory-resolver = "=0.25.0-alpha.5" # Use the exact version reth expects http = "1.3.1" hyper = "1.5.2" -jsonrpsee = { version = "0.26", features = ["http-client", "macros", "server", "jsonrpsee-client-transport"] } +jsonrpsee = { version = "0.26", features = ["http-client", "jsonrpsee-client-transport", "macros", "server"] } metrics = "0.24.1" metrics-exporter-prometheus = "0.16.2" mio = { features = ["net", "os-poll"], version = "1.0.4" } mio_httpc = { features = ["native"], version = "0.10.6" } moka = "0.12.10" -op-alloy-consensus = { version = "0.22.0", default-features = false, features = [ - "k256", -] } +op-alloy-consensus = { version = "0.22.0", default-features = false, features = ["k256"] } op-alloy-flz = { version = "0.13.1", default-features = false } op-alloy-network = "0.22.0" op-alloy-rpc-types = "0.22.0" -op-alloy-rpc-types-engine = { version = "0.22.0", default-features = false, features = [ - "serde", -] } +op-alloy-rpc-types-engine = { version = "0.22.0", default-features = false, features = ["serde"] } op-revm = "12.0.1" parking_lot = "0.12.3" paste = "0.1.18" quanta = "0.12.3" -rand = "0.9.0" +rand = "0.9.2" reqwest = { version = "0.12.12", features = ["blocking", "json"] } reth-chain-state = { git = "https://github.com/gattaca-com/based-op-reth", rev = "b053849462eb48e61b24d965cfee59cead7f8a3b", package = "reth-chain-state" } @@ -73,10 +67,12 @@ reth-consensus = { git = "https://github.com/gattaca-com/based-op-reth", rev = " reth-db = { git = "https://github.com/gattaca-com/based-op-reth", rev = "b053849462eb48e61b24d965cfee59cead7f8a3b", package = "reth-db" } reth-db-api = { git = "https://github.com/gattaca-com/based-op-reth", rev = "b053849462eb48e61b24d965cfee59cead7f8a3b", package = "reth-db-api" } reth-db-common = { git = "https://github.com/gattaca-com/based-op-reth", rev = "b053849462eb48e61b24d965cfee59cead7f8a3b", package = "reth-db-common" } +reth-engine-tree = { git = "https://github.com/gattaca-com/based-op-reth", rev = "b053849462eb48e61b24d965cfee59cead7f8a3b", package = "reth-engine-tree" } reth-evm = { git = "https://github.com/gattaca-com/based-op-reth", rev = "b053849462eb48e61b24d965cfee59cead7f8a3b", package = "reth-evm" } reth-execution-errors = { git = "https://github.com/gattaca-com/based-op-reth", rev = "b053849462eb48e61b24d965cfee59cead7f8a3b", package = "reth-execution-errors" } -reth-engine-tree = { git = "https://github.com/gattaca-com/based-op-reth", rev = "b053849462eb48e61b24d965cfee59cead7f8a3b", package = "reth-engine-tree" } -reth-node-ethereum = { git = "https://github.com/gattaca-com/based-op-reth", rev = "b053849462eb48e61b24d965cfee59cead7f8a3b", package = "reth-node-ethereum", features = ["test-utils"] } +reth-node-ethereum = { git = "https://github.com/gattaca-com/based-op-reth", rev = "b053849462eb48e61b24d965cfee59cead7f8a3b", package = "reth-node-ethereum", features = [ + "test-utils", +] } reth-node-types = { git = "https://github.com/gattaca-com/based-op-reth", rev = "b053849462eb48e61b24d965cfee59cead7f8a3b", package = "reth-node-types" } reth-optimism-chainspec = { git = "https://github.com/gattaca-com/based-op-reth", rev = "b053849462eb48e61b24d965cfee59cead7f8a3b", package = "reth-optimism-chainspec" } reth-optimism-cli = { git = "https://github.com/gattaca-com/based-op-reth", rev = "b053849462eb48e61b24d965cfee59cead7f8a3b", package = "reth-optimism-cli" } @@ -85,11 +81,13 @@ reth-optimism-evm = { git = "https://github.com/gattaca-com/based-op-reth", rev reth-optimism-forks = { git = "https://github.com/gattaca-com/based-op-reth", rev = "b053849462eb48e61b24d965cfee59cead7f8a3b", package = "reth-optimism-forks" } reth-optimism-node = { git = "https://github.com/gattaca-com/based-op-reth", rev = "b053849462eb48e61b24d965cfee59cead7f8a3b", package = "reth-optimism-node" } reth-optimism-payload-builder = { git = "https://github.com/gattaca-com/based-op-reth", rev = "b053849462eb48e61b24d965cfee59cead7f8a3b", package = "reth-optimism-payload-builder" } -reth-optimism-txpool = { git = "https://github.com/gattaca-com/based-op-reth", rev = "b053849462eb48e61b24d965cfee59cead7f8a3b", package = "reth-optimism-txpool" } reth-optimism-primitives = { git = "https://github.com/gattaca-com/based-op-reth", rev = "b053849462eb48e61b24d965cfee59cead7f8a3b", package = "reth-optimism-primitives" } +reth-optimism-txpool = { git = "https://github.com/gattaca-com/based-op-reth", rev = "b053849462eb48e61b24d965cfee59cead7f8a3b", package = "reth-optimism-txpool" } reth-primitives = { git = "https://github.com/gattaca-com/based-op-reth", rev = "b053849462eb48e61b24d965cfee59cead7f8a3b", package = "reth-primitives" } reth-primitives-traits = { git = "https://github.com/gattaca-com/based-op-reth", rev = "b053849462eb48e61b24d965cfee59cead7f8a3b", package = "reth-primitives-traits" } -reth-provider = { git = "https://github.com/gattaca-com/based-op-reth", rev = "b053849462eb48e61b24d965cfee59cead7f8a3b", package = "reth-provider", features = ["test-utils"] } +reth-provider = { git = "https://github.com/gattaca-com/based-op-reth", rev = "b053849462eb48e61b24d965cfee59cead7f8a3b", package = "reth-provider", features = [ + "test-utils", +] } reth-revm = { git = "https://github.com/gattaca-com/based-op-reth", rev = "b053849462eb48e61b24d965cfee59cead7f8a3b", package = "reth-revm" } reth-rpc-builder = { git = "https://github.com/gattaca-com/based-op-reth", rev = "b053849462eb48e61b24d965cfee59cead7f8a3b", package = "reth-rpc-builder" } reth-rpc-layer = { git = "https://github.com/gattaca-com/based-op-reth", rev = "b053849462eb48e61b24d965cfee59cead7f8a3b", package = "reth-rpc-layer" } @@ -97,21 +95,17 @@ reth-stages-types = { git = "https://github.com/gattaca-com/based-op-reth", rev reth-storage-api = { git = "https://github.com/gattaca-com/based-op-reth", rev = "b053849462eb48e61b24d965cfee59cead7f8a3b", package = "reth-storage-api" } reth-storage-errors = { git = "https://github.com/gattaca-com/based-op-reth", rev = "b053849462eb48e61b24d965cfee59cead7f8a3b", package = "reth-storage-errors" } reth-trie = { git = "https://github.com/gattaca-com/based-op-reth", rev = "b053849462eb48e61b24d965cfee59cead7f8a3b", package = "reth-trie" } -reth-trie-common = { git = "https://github.com/gattaca-com/based-op-reth", rev = "b053849462eb48e61b24d965cfee59cead7f8a3b", package = "reth-trie-common", features = ["test-utils"] } +reth-trie-common = { git = "https://github.com/gattaca-com/based-op-reth", rev = "b053849462eb48e61b24d965cfee59cead7f8a3b", package = "reth-trie-common", features = [ + "test-utils", +] } reth-trie-db = { git = "https://github.com/gattaca-com/based-op-reth", rev = "b053849462eb48e61b24d965cfee59cead7f8a3b", package = "reth-trie-db" } reth-trie-parallel = { git = "https://github.com/gattaca-com/based-op-reth", rev = "b053849462eb48e61b24d965cfee59cead7f8a3b", package = "reth-trie-parallel" } -revm = { version = "31.0.1", features = [ - "optional_balance_check", - "secp256k1", - "std", -], default-features = false } +revm = { version = "31.0.1", features = ["optional_balance_check", "secp256k1", "std"], default-features = false } revm-handler = "12.0.0" revm-inspector = "12.0.1" revm-interpreter = "29.0.1" -revm-primitives = { version = "21.0.2", features = [ - "std", -], default-features = false } +revm-primitives = { version = "21.0.2", features = ["std"], default-features = false } rustc-hash = "2.0.0" serde = { version = "1.0.217", features = ["derive"] } @@ -124,6 +118,7 @@ strum_macros = "0.24" tabwriter = "1.4.1" thiserror = "2.0.11" tokio = { version = "1.43.0", features = ["full"] } +tokio-stream = "0.1.17" toml = "0.8.19" tower = { version = "0.5", features = ["timeout"] } tower-http = { version = "0.6", features = ["cors"] } diff --git a/based/crates/reth/Cargo.toml b/based/crates/reth/Cargo.toml index 25f6a0441..60f5c4c36 100644 --- a/based/crates/reth/Cargo.toml +++ b/based/crates/reth/Cargo.toml @@ -17,14 +17,19 @@ clap.workspace = true eyre.workspace = true futures.workspace = true jsonrpsee.workspace = true +op-alloy-network.workspace = true op-alloy-rpc-types.workspace = true thiserror.workspace = true tokio.workspace = true +tokio-stream.workspace = true tracing.workspace = true +reth = { git = "https://github.com/paradigmxyz/reth", tag = "v1.9.3" } +reth-db = { git = "https://github.com/paradigmxyz/reth", tag = "v1.9.3" } reth-exex = { git = "https://github.com/paradigmxyz/reth", tag = "v1.9.3" } reth-node-builder = { git = "https://github.com/paradigmxyz/reth", tag = "v1.9.3" } reth-optimism-chainspec = { git = "https://github.com/paradigmxyz/reth", tag = "v1.9.3" } reth-optimism-cli = { git = "https://github.com/paradigmxyz/reth", tag = "v1.9.3" } reth-optimism-node = { git = "https://github.com/paradigmxyz/reth", tag = "v1.9.3" } reth-rpc = { git = "https://github.com/paradigmxyz/reth", tag = "v1.9.3" } +reth-rpc-eth-api = { git = "https://github.com/paradigmxyz/reth", tag = "v1.9.3" } diff --git a/based/crates/reth/src/api/eth.rs b/based/crates/reth/src/api/eth.rs new file mode 100644 index 000000000..1c27f5afe --- /dev/null +++ b/based/crates/reth/src/api/eth.rs @@ -0,0 +1,477 @@ +use std::{collections::HashSet, time::Duration}; + +use alloy_eips::{BlockId, BlockNumberOrTag}; +use alloy_primitives::{Address, TxHash, U256}; +use alloy_rpc_types::{ + BlockOverrides, Filter, FilterBlockOption, Log, + simulate::{SimBlock, SimulatePayload, SimulatedBlock}, + state::{EvmOverrides, StateOverride, StateOverridesBuilder}, +}; +use jsonrpsee::{ + core::{RpcResult, async_trait}, + proc_macros::rpc, + types::{ErrorObject, ErrorObjectOwned, error::INVALID_PARAMS_CODE}, +}; +use op_alloy_network::Optimism; +use op_alloy_rpc_types::OpTransactionRequest; +use reth::{providers::CanonStateSubscriptions as _, rpc::server_types::eth::EthApiError}; +use reth_rpc::EthFilter; +use reth_rpc_eth_api::{ + EthApiTypes, EthFilterApiServer, RpcBlock, RpcReceipt, RpcTransaction, + helpers::{EthBlocks, EthCall, EthState, EthTransactions, FullEthApi}, +}; +use tokio_stream::{StreamExt, wrappers::BroadcastStream}; + +/// Max configured timeout for `eth_sendRawTransactionSync`. +const SEND_RAW_TX_SYNC_TIMEOUT: Duration = Duration::from_millis(6_000); + +/// `eth_` API that is aware of unsealed state (frags). +#[rpc(server, namespace = "eth")] +pub trait EthApi { + /// Returns block by number with support for pending blocks (frags). + #[method(name = "getBlockByNumber")] + async fn block_by_number(&self, number: BlockNumberOrTag, full: bool) -> RpcResult>>; + + /// Returns the transaction receipt for a given transaction hash, with support for frags. + #[method(name = "getTransactionReceipt")] + async fn get_transaction_receipt(&self, tx_hash: TxHash) -> RpcResult>>; + + /// Returns account balance, with support for pending state. + #[method(name = "getBalance")] + async fn get_balance(&self, address: Address, block_number: Option) -> RpcResult; + + /// Returns transaction count for an address, with support for pending state. + #[method(name = "getTransactionCount")] + async fn get_transaction_count(&self, address: Address, block_number: Option) -> RpcResult; + + /// Returns the transaction for a given hash, with support for frags. + #[method(name = "getTransactionByHash")] + async fn transaction_by_hash(&self, tx_hash: TxHash) -> RpcResult>>; + + /// Sends a raw transaction and waits for inclusion in a frag. + #[method(name = "sendRawTransactionSync")] + async fn send_raw_transaction_sync( + &self, + transaction: alloy_primitives::Bytes, + timeout_ms: Option, + ) -> RpcResult>; + + /// Executes a call with flashblock state support. + #[method(name = "call")] + async fn call( + &self, + transaction: OpTransactionRequest, + block_number: Option, + state_overrides: Option, + block_overrides: Option>, + ) -> RpcResult; + + /// Estimates gas with flashblock state support. + #[method(name = "estimateGas")] + async fn estimate_gas( + &self, + transaction: OpTransactionRequest, + block_number: Option, + overrides: Option, + ) -> RpcResult; + + /// Simulates transactions with flashblock state support. + #[method(name = "simulateV1")] + async fn simulate_v1( + &self, + opts: SimulatePayload, + block_number: Option, + ) -> RpcResult>>>; + + /// Returns logs matching the filter, including pending flashblock logs. + #[method(name = "getLogs")] + async fn get_logs(&self, filter: Filter) -> RpcResult>; +} + +/// Extended `eth_` API with unsealed state support (frags). +#[derive(Debug)] +pub struct EthApi { + pub canonical: Eth, + pub eth_filter: EthFilter, + pub unsealed_state: (), +} + +#[async_trait] +impl EthApiServer for EthApi +where + Eth: EthApiTypes + FullEthApi + Send + Sync + 'static, + ErrorObject<'static>: From, +{ + async fn block_by_number(&self, number: BlockNumberOrTag, full: bool) -> RpcResult>> { + tracing::debug!( + message = "rpc::block_by_number", + block_number = ?number + ); + + if number.is_pending() { + // TODO: Implement pending blocks + + EthBlocks::rpc_block(&self.canonical, BlockNumberOrTag::Latest.into(), full).await.map_err(Into::into) + } else { + EthBlocks::rpc_block(&self.canonical, number.into(), full).await.map_err(Into::into) + } + } + + async fn get_transaction_receipt(&self, tx_hash: TxHash) -> RpcResult>> { + tracing::debug!( + message = "rpc::get_transaction_receipt", + tx_hash = %tx_hash + ); + + // First, check canonical chain + if let Some(canonical_receipt) = EthTransactions::transaction_receipt(&self.canonical, tx_hash).await? { + return Ok(Some(canonical_receipt)); + } + + // TODO: Implement pending transaction receipts + + Ok(None) + } + + async fn get_balance(&self, address: Address, block_number: Option) -> RpcResult { + tracing::debug!( + message = "rpc::get_balance", + address = %address + ); + let block_id = block_number.unwrap_or_default(); + if block_id.is_pending() { + // TODO: Pending balance + } + + EthState::balance(&self.canonical, address, block_number).await.map_err(Into::into) + } + + async fn get_transaction_count(&self, address: Address, block_number: Option) -> RpcResult { + tracing::debug!( + message = "rpc::get_transaction_count", + address = %address, + ); + + let block_id = block_number.unwrap_or_default(); + if block_id.is_pending() { + todo!(); + // let pending_blocks = self.flashblocks_state.get_pending_blocks(); + // let canon_block = pending_blocks.get_canonical_block_number(); + // let fb_count = pending_blocks.get_transaction_count(address); + + // let fb_count = 0; + + // let canon_count = EthState::transaction_count(&self.canonical, address, Some(canon_block.into())) + // .await + // .map_err(Into::into)?; + + // return Ok(canon_count + fb_count); + } + + EthState::transaction_count(&self.canonical, address, block_number).await.map_err(Into::into) + } + + async fn transaction_by_hash(&self, tx_hash: TxHash) -> RpcResult>> { + tracing::debug!( + message = "rpc::transaction_by_hash", + tx_hash = %tx_hash + ); + + // Check canonical chain first to avoid race condition where flashblocks + // state hasn't been cleared yet after canonical block commit + if let Some(canonical_tx) = EthTransactions::transaction_by_hash(&self.canonical, tx_hash) + .await? + .map(|tx| tx.into_transaction(self.canonical.tx_resp_builder())) + .transpose()? + { + return Ok(Some(canonical_tx)); + } + + // TODO: + // Fall back to flashblocks for pending transactions + // let pending_blocks = self.flashblocks_state.get_pending_blocks(); + // if let Some(fb_transaction) = pending_blocks.get_transaction_by_hash(tx_hash) { + // self.metrics.get_transaction_by_hash.increment(1); + // return Ok(Some(fb_transaction)); + // } + + Ok(None) + } + + async fn send_raw_transaction_sync( + &self, + transaction: alloy_primitives::Bytes, + timeout_ms: Option, + ) -> RpcResult> { + tracing::debug!(message = "rpc::send_raw_transaction_sync"); + + let timeout = timeout_ms + .map(|ms| { + let timeout = Duration::from_millis(ms); + if timeout > SEND_RAW_TX_SYNC_TIMEOUT { + return Err(ErrorObjectOwned::owned( + INVALID_PARAMS_CODE, + format!("time out too long, timeout: {ms} ms, max: {SEND_RAW_TX_SYNC_TIMEOUT:?}"), + None::<()>, + )); + } + + Ok(timeout) + }) + .transpose()? + .unwrap_or(SEND_RAW_TX_SYNC_TIMEOUT); + + let tx_hash = match EthTransactions::send_raw_transaction(&self.canonical, transaction).await { + Ok(hash) => hash, + Err(e) => return Err(e.into()), + }; + + tracing::debug!( + message = "rpc::send_raw_transaction_sync::sent_transaction", + tx_hash = %tx_hash, + timeout_ms = timeout_ms, + ); + + loop { + tokio::select! { + receipt = self.wait_for_frag_receipt(tx_hash) => { + if let Some(receipt) = receipt { + return Ok(receipt); + } else { + continue + } + } + receipt = self.wait_for_canonical_receipt(tx_hash) => { + if let Some(receipt) = receipt { + return Ok(receipt); + } else { + continue + } + } + _ = tokio::time::sleep(timeout) => { + return Err(EthApiError::TransactionConfirmationTimeout { + hash: tx_hash, + duration: timeout, + }.into()); + } + } + } + } + + async fn call( + &self, + transaction: OpTransactionRequest, + block_number: Option, + state_overrides: Option, + block_overrides: Option>, + ) -> RpcResult { + tracing::debug!( + message = "rpc::call", + transaction = ?transaction, + block_number = ?block_number, + state_overrides = ?state_overrides, + block_overrides = ?block_overrides, + ); + + let mut block_id = block_number.unwrap_or_default(); + let mut pending_overrides = EvmOverrides::default(); + // If the call is to pending block use cached override (if they exist) + if block_id.is_pending() { + // TODO: + // let pending_blocks = self.flashblocks_state.get_pending_blocks(); + // block_id = pending_blocks.get_canonical_block_number().into(); + // pending_overrides.state = pending_blocks.get_state_overrides(); + } + + // Apply user's overrides on top + let mut state_overrides_builder = StateOverridesBuilder::new(pending_overrides.state.unwrap_or_default()); + state_overrides_builder = state_overrides_builder.extend(state_overrides.unwrap_or_default()); + let final_overrides = state_overrides_builder.build(); + + // Delegate to the underlying eth_api + EthCall::call( + &self.canonical, + transaction, + Some(block_id), + EvmOverrides::new(Some(final_overrides), block_overrides), + ) + .await + .map_err(Into::into) + } + + async fn estimate_gas( + &self, + transaction: OpTransactionRequest, + block_number: Option, + overrides: Option, + ) -> RpcResult { + tracing::debug!( + message = "rpc::estimate_gas", + transaction = ?transaction, + block_number = ?block_number, + overrides = ?overrides, + ); + + let mut block_id = block_number.unwrap_or_default(); + let mut pending_overrides = EvmOverrides::default(); + // If the call is to pending block use cached override (if they exist) + if block_id.is_pending() { + // TODO: + // let pending_blocks = self.flashblocks_state.get_pending_blocks(); + // block_id = pending_blocks.get_canonical_block_number().into(); + // pending_overrides.state = pending_blocks.get_state_overrides(); + } + + let mut state_overrides_builder = StateOverridesBuilder::new(pending_overrides.state.unwrap_or_default()); + state_overrides_builder = state_overrides_builder.extend(overrides.unwrap_or_default()); + let final_overrides = state_overrides_builder.build(); + + EthCall::estimate_gas_at(&self.canonical, transaction, block_id, Some(final_overrides)) + .await + .map_err(Into::into) + } + + async fn simulate_v1( + &self, + opts: SimulatePayload, + block_number: Option, + ) -> RpcResult>>> { + tracing::debug!( + message = "rpc::simulate_v1", + block_number = ?block_number, + ); + + let mut block_id = block_number.unwrap_or_default(); + let mut pending_overrides = EvmOverrides::default(); + + // If the call is to pending block use cached override (if they exist) + if block_id.is_pending() { + // TODO: + // let pending_blocks = self.flashblocks_state.get_pending_blocks(); + // block_id = pending_blocks.get_canonical_block_number().into(); + // pending_overrides.state = pending_blocks.get_state_overrides(); + } + + // Prepend flashblocks pending overrides to the block state calls + let mut block_state_calls: Vec> = Vec::new(); + for sim_block in opts.block_state_calls { + let mut state_overrides_builder = + StateOverridesBuilder::new(pending_overrides.state.clone().unwrap_or_default()); + state_overrides_builder = state_overrides_builder.extend(sim_block.state_overrides.unwrap_or_default()); + let final_overrides = state_overrides_builder.build(); + + let block_state_call = SimBlock { state_overrides: Some(final_overrides), ..sim_block }; + block_state_calls.push(block_state_call); + } + + let payload = SimulatePayload { block_state_calls, ..opts }; + + EthCall::simulate_v1(&self.canonical, payload, Some(block_id)).await.map_err(Into::into) + } + + async fn get_logs(&self, filter: Filter) -> RpcResult> { + tracing::debug!( + message = "rpc::get_logs", + address = ?filter.address + ); + + // Check if this is a mixed query (toBlock is pending) + let (from_block, to_block) = match &filter.block_option { + FilterBlockOption::Range { from_block, to_block } => (*from_block, *to_block), + _ => { + // Block hash queries or other formats - delegate to eth API + return self.eth_filter.logs(filter).await; + } + }; + + // If toBlock is not pending, delegate to eth API + if !matches!(to_block, Some(BlockNumberOrTag::Pending)) { + return self.eth_filter.logs(filter).await; + } + + // Mixed query: toBlock is pending, so we need to combine historical + pending logs + let mut all_logs = Vec::new(); + + // TODO: + // let pending_blocks = self.flashblocks_state.get_pending_blocks(); + // let pending_logs = pending_blocks.get_pending_logs(&filter); + + let mut fetched_logs = HashSet::new(); + // Get historical logs if fromBlock is not pending + if !matches!(from_block, Some(BlockNumberOrTag::Pending)) { + // Create a filter for historical data (fromBlock to latest) + let mut historical_filter = filter.clone(); + historical_filter.block_option = + FilterBlockOption::Range { from_block, to_block: Some(BlockNumberOrTag::Latest) }; + + let historical_logs: Vec = self.eth_filter.logs(historical_filter).await?; + for log in &historical_logs { + fetched_logs.insert((log.block_number, log.log_index)); + } + all_logs.extend(historical_logs); + } + + // Always get pending logs when toBlock is pending + + // TODO: + // Dedup any logs from the pending state that may already have been covered in the historical logs + // let deduped_pending_logs: Vec = pending_logs + // .iter() + // .filter(|log| !fetched_logs.contains(&(log.block_number, log.log_index))) + // .cloned() + // .collect(); + // all_logs.extend(deduped_pending_logs); + + Ok(all_logs) + } +} + +impl EthApi +where + Eth: FullEthApi + Send + Sync + 'static, +{ + async fn wait_for_frag_receipt(&self, tx_hash: TxHash) -> Option> { + // TODO: Subscribe to frags + // let mut receiver = self.flashblocks_state.subscribe_to_flashblocks(); + + // loop { + // match receiver.recv().await { + // Ok(pending_state) if pending_state.get_receipt(tx_hash).is_some() => { + // debug!(message = "found receipt in flashblock", tx_hash = %tx_hash); + // return pending_state.get_receipt(tx_hash); + // } + // Ok(_) => { + // trace!(message = "flashblock does not contain receipt", tx_hash = %tx_hash); + // } + // Err(RecvError::Closed) => { + // debug!(message = "flashblocks receipt queue closed"); + // return None; + // } + // Err(RecvError::Lagged(_)) => { + // warn!("Flashblocks receipt queue lagged, maybe missing receipts"); + // } + // } + // } + + None + } + + async fn wait_for_canonical_receipt(&self, tx_hash: TxHash) -> Option> { + let mut stream = BroadcastStream::new(self.canonical.provider().subscribe_to_canonical_state()); + + while let Some(Ok(canon_state)) = stream.next().await { + for (block_receipt, _) in canon_state.block_receipts() { + for (canonical_tx_hash, _) in &block_receipt.tx_receipts { + if *canonical_tx_hash == tx_hash { + tracing::debug!( + message = "found receipt in canonical state", + tx_hash = %tx_hash + ); + return EthTransactions::transaction_receipt(&self.canonical, tx_hash).await.ok().flatten(); + } + } + } + } + None + } +} diff --git a/based/crates/reth/src/api/mod.rs b/based/crates/reth/src/api/mod.rs index 702e611f1..c4997653c 100644 --- a/based/crates/reth/src/api/mod.rs +++ b/based/crates/reth/src/api/mod.rs @@ -1 +1,2 @@ pub mod engine; +pub mod eth; diff --git a/based/crates/reth/src/cli.rs b/based/crates/reth/src/cli.rs index a966e6d64..687d7878b 100644 --- a/based/crates/reth/src/cli.rs +++ b/based/crates/reth/src/cli.rs @@ -1,12 +1,16 @@ use clap::Parser; use futures::TryStreamExt as _; +use reth::providers::CanonStateSubscriptions as _; use reth_exex::ExExEvent; use reth_node_builder::Node; use reth_optimism_cli::{Cli, chainspec::OpChainSpecParser}; use reth_optimism_node::{OpNode, args::RollupArgs}; use crate::{ - api::engine::{BasedEngineApi, BasedEngineApiServer as _}, + api::{ + engine::{BasedEngineApi, BasedEngineApiServer as _}, + eth::{EthApi, EthApiServer as _}, + }, driver::Driver, }; @@ -65,11 +69,13 @@ fn run_with_cli(cli: Cli) -> eyre::Result<() move |mut ctx| async move { Ok(async move { while let Some(note) = ctx.notifications.try_next().await? { + // TODO: Handle reorged and reverted chains? if let Some(committed) = note.committed_chain() { // Handle committed blocks by notifying the driver for block in committed.blocks_iter() { driver.forkchoice_updated(block.clone().into_block()).await?; } + let _ = ctx.events.send(ExExEvent::FinishedHeight(committed.tip().num_hash())); } } @@ -79,10 +85,41 @@ fn run_with_cli(cli: Cli) -> eyre::Result<() } }) .extend_rpc_modules(move |ctx| { + let provider = ctx.provider().clone(); + + let mut canon_stream = provider.subscribe_to_canonical_state(); + + // NOTE: Not entirely sure why this is needed + // Ref: + tokio::spawn(async move { + while let Ok(notif) = canon_stream.recv().await { + provider.canonical_in_memory_state().notify_canon_state(notif); + } + }); + // Add based engine API modules to the existing auth module. - ctx.auth_module - .merge_auth_methods(BasedEngineApi::new(driver).into_rpc()) - .expect("failed to merge modules"); + ctx.auth_module.merge_auth_methods(BasedEngineApi::new(driver).into_rpc())?; + + // Print supported engine_ methods + let methods = ctx + .auth_module + .module_mut() + .method_names() + .filter(|m| m.starts_with("engine_")) + .collect::>(); + + tracing::info!(supported_methods = ?methods, "Configured based engine API"); + + // Configure extended Eth API + let eth = EthApi { + canonical: ctx.registry.eth_api().clone(), + eth_filter: ctx.registry.eth_handlers().filter.clone(), + unsealed_state: (), + }; + + ctx.modules.replace_configured(eth.into_rpc())?; + + // TODO: // - Replace eth API Ok(()) }) From 90a3869a257b36c423d6d9488e367b2d0bf450ae Mon Sep 17 00:00:00 2001 From: Jonas Bostoen Date: Thu, 18 Dec 2025 17:06:00 +0100 Subject: [PATCH 16/25] chore: unsealed as latest --- based/crates/reth/src/api/eth.rs | 47 +++++++++++++++++++++++++++----- based/crates/reth/src/cli.rs | 1 + 2 files changed, 41 insertions(+), 7 deletions(-) diff --git a/based/crates/reth/src/api/eth.rs b/based/crates/reth/src/api/eth.rs index 1c27f5afe..b29896700 100644 --- a/based/crates/reth/src/api/eth.rs +++ b/based/crates/reth/src/api/eth.rs @@ -94,6 +94,13 @@ pub struct EthApi { pub canonical: Eth, pub eth_filter: EthFilter, pub unsealed_state: (), + pub unsealed_as_latest: bool, +} + +impl EthApi { + fn use_unsealed_state(&self, number: &impl Tag) -> bool { + (self.unsealed_as_latest && number.is_latest()) || number.is_pending() + } } #[async_trait] @@ -108,7 +115,7 @@ where block_number = ?number ); - if number.is_pending() { + if self.use_unsealed_state(&number) { // TODO: Implement pending blocks EthBlocks::rpc_block(&self.canonical, BlockNumberOrTag::Latest.into(), full).await.map_err(Into::into) @@ -139,7 +146,7 @@ where address = %address ); let block_id = block_number.unwrap_or_default(); - if block_id.is_pending() { + if self.use_unsealed_state(&block_id) { // TODO: Pending balance } @@ -153,7 +160,7 @@ where ); let block_id = block_number.unwrap_or_default(); - if block_id.is_pending() { + if self.use_unsealed_state(&block_id) { todo!(); // let pending_blocks = self.flashblocks_state.get_pending_blocks(); // let canon_block = pending_blocks.get_canonical_block_number(); @@ -276,7 +283,7 @@ where let mut block_id = block_number.unwrap_or_default(); let mut pending_overrides = EvmOverrides::default(); // If the call is to pending block use cached override (if they exist) - if block_id.is_pending() { + if self.use_unsealed_state(&block_id) { // TODO: // let pending_blocks = self.flashblocks_state.get_pending_blocks(); // block_id = pending_blocks.get_canonical_block_number().into(); @@ -315,7 +322,7 @@ where let mut block_id = block_number.unwrap_or_default(); let mut pending_overrides = EvmOverrides::default(); // If the call is to pending block use cached override (if they exist) - if block_id.is_pending() { + if self.use_unsealed_state(&block_id) { // TODO: // let pending_blocks = self.flashblocks_state.get_pending_blocks(); // block_id = pending_blocks.get_canonical_block_number().into(); @@ -345,7 +352,7 @@ where let mut pending_overrides = EvmOverrides::default(); // If the call is to pending block use cached override (if they exist) - if block_id.is_pending() { + if self.use_unsealed_state(&block_id) { // TODO: // let pending_blocks = self.flashblocks_state.get_pending_blocks(); // block_id = pending_blocks.get_canonical_block_number().into(); @@ -385,7 +392,7 @@ where }; // If toBlock is not pending, delegate to eth API - if !matches!(to_block, Some(BlockNumberOrTag::Pending)) { + if to_block.is_some_and(|block| !self.use_unsealed_state(&block)) { return self.eth_filter.logs(filter).await; } @@ -475,3 +482,29 @@ where None } } + +/// Helper trait for checking if a block number or id is latest or pending. +trait Tag { + fn is_latest(&self) -> bool; + fn is_pending(&self) -> bool; +} + +impl Tag for BlockNumberOrTag { + fn is_latest(&self) -> bool { + self.is_latest() + } + + fn is_pending(&self) -> bool { + self.is_pending() + } +} + +impl Tag for BlockId { + fn is_latest(&self) -> bool { + self.is_latest() + } + + fn is_pending(&self) -> bool { + self.is_pending() + } +} diff --git a/based/crates/reth/src/cli.rs b/based/crates/reth/src/cli.rs index 687d7878b..c1f73fef8 100644 --- a/based/crates/reth/src/cli.rs +++ b/based/crates/reth/src/cli.rs @@ -115,6 +115,7 @@ fn run_with_cli(cli: Cli) -> eyre::Result<() canonical: ctx.registry.eth_api().clone(), eth_filter: ctx.registry.eth_handlers().filter.clone(), unsealed_state: (), + unsealed_as_latest: args.based_op.unsealed_as_latest, }; ctx.modules.replace_configured(eth.into_rpc())?; From f406b2ef755dca25b3b97c992db38ef701376881 Mon Sep 17 00:00:00 2001 From: Ki Ageng Satria Pamungkas Date: Fri, 19 Dec 2025 00:31:57 +0700 Subject: [PATCH 17/25] some API for unsealed block --- based/Cargo.lock | 2 + based/crates/reth/Cargo.toml | 2 + based/crates/reth/src/unsealed_block.rs | 103 +++++++++++++++++++++++- 3 files changed, 105 insertions(+), 2 deletions(-) diff --git a/based/Cargo.lock b/based/Cargo.lock index 844801d48..a65456716 100644 --- a/based/Cargo.lock +++ b/based/Cargo.lock @@ -7103,12 +7103,14 @@ dependencies = [ "alloy-network", "alloy-primitives", "alloy-rpc-types", + "alloy-rpc-types-eth", "anyhow", "bop-common", "clap", "eyre", "futures", "jsonrpsee", + "op-alloy-consensus", "op-alloy-network", "op-alloy-rpc-types", "reth 1.9.3", diff --git a/based/crates/reth/Cargo.toml b/based/crates/reth/Cargo.toml index 60f5c4c36..202af1c76 100644 --- a/based/crates/reth/Cargo.toml +++ b/based/crates/reth/Cargo.toml @@ -33,3 +33,5 @@ reth-optimism-cli = { git = "https://github.com/paradigmxyz/reth", tag = "v1.9.3 reth-optimism-node = { git = "https://github.com/paradigmxyz/reth", tag = "v1.9.3" } reth-rpc = { git = "https://github.com/paradigmxyz/reth", tag = "v1.9.3" } reth-rpc-eth-api = { git = "https://github.com/paradigmxyz/reth", tag = "v1.9.3" } +op-alloy-consensus = "0.22.1" +alloy-rpc-types-eth = "1.1.3" diff --git a/based/crates/reth/src/unsealed_block.rs b/based/crates/reth/src/unsealed_block.rs index 8f8145ed5..04d3b1a22 100644 --- a/based/crates/reth/src/unsealed_block.rs +++ b/based/crates/reth/src/unsealed_block.rs @@ -1,8 +1,14 @@ use alloy_consensus::{Header, TxEnvelope}; use alloy_eips::eip2718::Decodable2718; -use alloy_primitives::{B256, Bytes}; -use alloy_rpc_types::{Log, TransactionReceipt}; +use alloy_primitives::{Address, B256, Bytes, Sealable, TxHash, U256, map::foldhash::HashMap}; +use alloy_rpc_types::{BlockTransactions, Log, TransactionReceipt, state::StateOverride}; +use alloy_rpc_types_eth::Header as RPCHeader; use bop_common::p2p::{EnvV0, FragV0, Transaction as TxBytes}; +use op_alloy_consensus::OpReceiptEnvelope; +use op_alloy_network::{Optimism, TransactionResponse}; +use op_alloy_rpc_types::Transaction; +use reth::revm::db::Cache; +use reth_rpc_eth_api::RpcBlock; use crate::error::UnsealedBlockError; @@ -28,6 +34,13 @@ pub struct UnsealedBlock { pub cumulative_gas_used: u64, /// Cumulative blob gas used across all blob-carrying transactions in the block. pub cumulative_blob_gas_used: u64, + + transaction_count: HashMap, + transaction: Vec, + transaction_receipts: HashMap>>, + state_overrides: Option, + + db_cache: Cache, } impl UnsealedBlock { @@ -41,6 +54,11 @@ impl UnsealedBlock { logs: Vec::new(), cumulative_gas_used: 0, cumulative_blob_gas_used: 0, + transaction_count: Default::default(), + transaction: vec![], + transaction_receipts: Default::default(), + state_overrides: None, + db_cache: Default::default(), } } @@ -156,4 +174,85 @@ impl UnsealedBlock { pub fn reset_to_env(&mut self, env: EnvV0) { *self = Self::new(env); } + + /// Returns a cloned list of unsealed logs collected so far. + pub fn get_unsealed_logs(self) -> Vec { + self.logs.clone() + } + + /// Returns a cloned list of fragments accepted into this unsealed block. + pub fn get_unsealed_frags(self) -> Vec { + self.frags.clone() + } + + /// Looks up and returns a cloned transaction receipt by transaction hash, if present. + pub fn get_transaction_receipt(self, tx_hash: B256) -> Option>> { + self.transaction_receipts.get(&tx_hash).cloned() + } + + /// Returns a cloned copy of the current state overrides, if any are set. + pub fn get_state_overrides(self) -> Option { + self.state_overrides.clone() + } + + /// Returns the locally tracked transaction count (nonce) for `address`, or zero if unknown. + pub fn get_transaction_count(self, address: Address) -> U256 { + self.transaction_count.get(&address).cloned().unwrap_or(U256::from(0)) + } + + /// Returns the cached balance for `address` from the DB cache, if the account is present. + pub fn get_balance(self, address: Address) -> Option { + let Some(account) = self.db_cache.accounts.get(&address) else { + return None; + }; + + Some(account.info.balance) + } + + /// Convert current unsealed block into RpcBlock + pub fn to_block(&self, full: bool) -> RpcBlock { + let last_frag_number = match self.frags.last() { + Some(frag) => (frag.block_number), + None => 0, + }; + let header = Header { + parent_hash: self.env.parent_hash, + ommers_hash: Default::default(), + beneficiary: self.env.beneficiary, + state_root: B256::ZERO, + transactions_root: B256::ZERO, + receipts_root: B256::ZERO, + logs_bloom: Default::default(), + difficulty: self.env.difficulty, + number: last_frag_number, + gas_limit: self.env.gas_limit, + gas_used: self.cumulative_gas_used, + timestamp: self.env.timestamp, + extra_data: Default::default(), + mix_hash: self.env.prevrandao, + nonce: Default::default(), + base_fee_per_gas: Some(self.env.basefee), + withdrawals_root: None, + blob_gas_used: Some(self.cumulative_blob_gas_used), + excess_blob_gas: Some(0), + parent_beacon_block_root: Some(self.env.parent_beacon_block_root), + requests_hash: None, + }; + let header = header.clone().seal_slow(); + let block_transactions = self.transaction.clone(); + + let transactions = if full { + BlockTransactions::Full(block_transactions) + } else { + let tx_hashes: Vec = block_transactions.iter().map(|tx| tx.tx_hash()).collect(); + BlockTransactions::Hashes(tx_hashes) + }; + + RpcBlock:: { + header: RPCHeader::from_consensus(header, None, None), + transactions, + uncles: Vec::new(), + withdrawals: None, + } + } } From 53d75b5ba43e54cbb36cbeda02015a0bcab77341 Mon Sep 17 00:00:00 2001 From: Ki Ageng Satria Pamungkas Date: Fri, 19 Dec 2025 21:37:31 +0700 Subject: [PATCH 18/25] feat(based-op-reth): execute_frag on state machine (#270) Co-authored-by: Ki Ageng Satria Pamungkas Co-authored-by: Jonas Bostoen --- based/Cargo.lock | 89 +++-- based/crates/reth/Cargo.toml | 30 +- based/crates/reth/src/api/eth.rs | 163 +++++---- based/crates/reth/src/api/mod.rs | 19 + based/crates/reth/src/cli.rs | 92 ++--- based/crates/reth/src/driver.rs | 124 +++---- based/crates/reth/src/error.rs | 42 ++- based/crates/reth/src/exec.rs | 450 +++++++++++++++++++++--- based/crates/reth/src/unsealed_block.rs | 241 ++++++++++--- 9 files changed, 922 insertions(+), 328 deletions(-) diff --git a/based/Cargo.lock b/based/Cargo.lock index a65456716..e263ab6e1 100644 --- a/based/Cargo.lock +++ b/based/Cargo.lock @@ -1020,6 +1020,12 @@ dependencies = [ "derive_arbitrary", ] +[[package]] +name = "arc-swap" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69f7f8c3906b62b754cd5326047894316021dcfe5a194c8ea52bdd94934a3457" + [[package]] name = "ark-bls12-381" version = "0.5.0" @@ -1577,6 +1583,53 @@ version = "1.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89e25b6adfb930f02d1981565a6e5d9c547ac15a96606256d3b59040e5cd4ca3" +[[package]] +name = "based-op-reth" +version = "0.1.0" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-network", + "alloy-primitives", + "alloy-rpc-types", + "alloy-rpc-types-eth", + "anyhow", + "arc-swap", + "bop-common", + "clap", + "eyre", + "futures", + "jsonrpsee", + "op-alloy-consensus", + "op-alloy-network", + "op-alloy-rpc-types", + "reth", + "reth-chainspec 1.9.3", + "reth-db 1.9.3", + "reth-engine-tree 1.9.3", + "reth-evm 1.9.3", + "reth-exex 1.9.3", + "reth-node-builder 1.9.3", + "reth-optimism-chainspec 1.9.3", + "reth-optimism-cli 1.9.3", + "reth-optimism-consensus 1.9.3", + "reth-optimism-evm 1.9.3", + "reth-optimism-node 1.9.3", + "reth-optimism-primitives 1.9.3", + "reth-optimism-rpc 1.9.3", + "reth-revm 1.9.3", + "reth-rpc 1.9.3", + "reth-rpc-convert 1.9.3", + "reth-rpc-eth-api 1.9.3", + "reth-storage-api 1.9.3", + "reth-storage-errors 1.9.3", + "revm", + "thiserror 2.0.17", + "tokio", + "tokio-stream", + "tracing", +] + [[package]] name = "based-portal" version = "0.1.0" @@ -3047,7 +3100,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8d162beedaa69905488a8da94f5ac3edb4dd4788b732fadb7bd120b2625c1976" dependencies = [ "data-encoding", - "syn 1.0.109", + "syn 2.0.111", ] [[package]] @@ -7094,40 +7147,6 @@ version = "0.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "95325155c684b1c89f7765e30bc1c42e4a6da51ca513615660cb8a62ef9a88e3" -[[package]] -name = "reth" -version = "0.1.0" -dependencies = [ - "alloy-consensus", - "alloy-eips", - "alloy-network", - "alloy-primitives", - "alloy-rpc-types", - "alloy-rpc-types-eth", - "anyhow", - "bop-common", - "clap", - "eyre", - "futures", - "jsonrpsee", - "op-alloy-consensus", - "op-alloy-network", - "op-alloy-rpc-types", - "reth 1.9.3", - "reth-db 1.9.3", - "reth-exex 1.9.3", - "reth-node-builder 1.9.3", - "reth-optimism-chainspec 1.9.3", - "reth-optimism-cli 1.9.3", - "reth-optimism-node 1.9.3", - "reth-rpc 1.9.3", - "reth-rpc-eth-api 1.9.3", - "thiserror 2.0.17", - "tokio", - "tokio-stream", - "tracing", -] - [[package]] name = "reth" version = "1.9.3" diff --git a/based/crates/reth/Cargo.toml b/based/crates/reth/Cargo.toml index 202af1c76..e594d714b 100644 --- a/based/crates/reth/Cargo.toml +++ b/based/crates/reth/Cargo.toml @@ -1,6 +1,6 @@ [package] edition.workspace = true -name = "reth" +name = "based-op-reth" repository.workspace = true rust-version.workspace = true version.workspace = true @@ -11,27 +11,39 @@ alloy-eips.workspace = true alloy-network.workspace = true alloy-primitives.workspace = true alloy-rpc-types.workspace = true +alloy-rpc-types-eth = "1.1.3" anyhow = "1.0.98" +arc-swap = "1.7.1" bop-common.workspace = true clap.workspace = true eyre.workspace = true futures.workspace = true jsonrpsee.workspace = true +op-alloy-consensus = "0.22.1" op-alloy-network.workspace = true op-alloy-rpc-types.workspace = true -thiserror.workspace = true -tokio.workspace = true -tokio-stream.workspace = true -tracing.workspace = true - reth = { git = "https://github.com/paradigmxyz/reth", tag = "v1.9.3" } +reth-chainspec = { git = "https://github.com/paradigmxyz/reth", tag = "v1.9.3", package = "reth-chainspec" } reth-db = { git = "https://github.com/paradigmxyz/reth", tag = "v1.9.3" } +reth-engine-tree = { git = "https://github.com/paradigmxyz/reth", tag = "v1.9.3", package = "reth-engine-tree" } +reth-evm = { git = "https://github.com/paradigmxyz/reth", tag = "v1.9.3", package = "reth-evm" } reth-exex = { git = "https://github.com/paradigmxyz/reth", tag = "v1.9.3" } reth-node-builder = { git = "https://github.com/paradigmxyz/reth", tag = "v1.9.3" } -reth-optimism-chainspec = { git = "https://github.com/paradigmxyz/reth", tag = "v1.9.3" } +reth-optimism-chainspec = { git = "https://github.com/paradigmxyz/reth", tag = "v1.9.3", package = "reth-optimism-chainspec" } reth-optimism-cli = { git = "https://github.com/paradigmxyz/reth", tag = "v1.9.3" } +reth-optimism-evm = { git = "https://github.com/paradigmxyz/reth", tag = "v1.9.3", package = "reth-optimism-evm" } reth-optimism-node = { git = "https://github.com/paradigmxyz/reth", tag = "v1.9.3" } +reth-optimism-primitives = { git = "https://github.com/paradigmxyz/reth", tag = "v1.9.3", package = "reth-optimism-primitives" } +reth-optimism-rpc = { git = "https://github.com/paradigmxyz/reth", tag = "v1.9.3", package = "reth-optimism-rpc" } +reth-revm = { git = "https://github.com/paradigmxyz/reth", tag = "v1.9.3", package = "reth-revm" } reth-rpc = { git = "https://github.com/paradigmxyz/reth", tag = "v1.9.3" } +reth-rpc-convert = { git = "https://github.com/paradigmxyz/reth", tag = "v1.9.3", package = "reth-rpc-convert" } reth-rpc-eth-api = { git = "https://github.com/paradigmxyz/reth", tag = "v1.9.3" } -op-alloy-consensus = "0.22.1" -alloy-rpc-types-eth = "1.1.3" +reth-storage-api = { git = "https://github.com/paradigmxyz/reth", tag = "v1.9.3", package = "reth-storage-api" } +reth-storage-errors = { git = "https://github.com/paradigmxyz/reth", tag = "v1.9.3", package = "reth-storage-errors" } +revm = { version = "31.0.1", features = ["optional_balance_check", "secp256k1", "std"], default-features = false } +thiserror.workspace = true +tokio.workspace = true +tokio-stream.workspace = true +tracing.workspace = true +reth_optimism_consensus = { git = "https://github.com/paradigmxyz/reth", tag = "v1.9.3", package = "reth-optimism-consensus" } diff --git a/based/crates/reth/src/api/eth.rs b/based/crates/reth/src/api/eth.rs index b29896700..6e8835183 100644 --- a/based/crates/reth/src/api/eth.rs +++ b/based/crates/reth/src/api/eth.rs @@ -1,4 +1,4 @@ -use std::{collections::HashSet, time::Duration}; +use std::{sync::Arc, time::Duration}; use alloy_eips::{BlockId, BlockNumberOrTag}; use alloy_primitives::{Address, TxHash, U256}; @@ -7,6 +7,7 @@ use alloy_rpc_types::{ simulate::{SimBlock, SimulatePayload, SimulatedBlock}, state::{EvmOverrides, StateOverride, StateOverridesBuilder}, }; +use arc_swap::ArcSwapOption; use jsonrpsee::{ core::{RpcResult, async_trait}, proc_macros::rpc, @@ -16,12 +17,16 @@ use op_alloy_network::Optimism; use op_alloy_rpc_types::OpTransactionRequest; use reth::{providers::CanonStateSubscriptions as _, rpc::server_types::eth::EthApiError}; use reth_rpc::EthFilter; +use reth_rpc_convert::RpcReceipt; use reth_rpc_eth_api::{ - EthApiTypes, EthFilterApiServer, RpcBlock, RpcReceipt, RpcTransaction, + EthApiTypes, EthFilterApiServer, RpcBlock, RpcTransaction, helpers::{EthBlocks, EthCall, EthState, EthTransactions, FullEthApi}, }; +use tokio::sync::broadcast::error::RecvError; use tokio_stream::{StreamExt, wrappers::BroadcastStream}; +use crate::{api::ToRpc as _, unsealed_block::UnsealedBlock}; + /// Max configured timeout for `eth_sendRawTransactionSync`. const SEND_RAW_TX_SYNC_TIMEOUT: Duration = Duration::from_millis(6_000); @@ -93,7 +98,7 @@ pub trait EthApi { pub struct EthApi { pub canonical: Eth, pub eth_filter: EthFilter, - pub unsealed_state: (), + pub unsealed_block: Arc>, pub unsealed_as_latest: bool, } @@ -115,10 +120,10 @@ where block_number = ?number ); - if self.use_unsealed_state(&number) { - // TODO: Implement pending blocks - - EthBlocks::rpc_block(&self.canonical, BlockNumberOrTag::Latest.into(), full).await.map_err(Into::into) + if self.use_unsealed_state(&number) && + let Some(unsealed_block) = self.unsealed_block.load_full() + { + Ok(Some(unsealed_block.to_rpc_block(full))) } else { EthBlocks::rpc_block(&self.canonical, number.into(), full).await.map_err(Into::into) } @@ -135,7 +140,11 @@ where return Ok(Some(canonical_receipt)); } - // TODO: Implement pending transaction receipts + if let Some(unsealed_block) = self.unsealed_block.load_full() { + if let Some(receipt) = unsealed_block.get_transaction_receipt(&tx_hash) { + return Ok(Some(receipt.into_rpc())); + } + } Ok(None) } @@ -147,7 +156,11 @@ where ); let block_id = block_number.unwrap_or_default(); if self.use_unsealed_state(&block_id) { - // TODO: Pending balance + if let Some(unsealed_block) = self.unsealed_block.load_full() { + if let Some(balance) = unsealed_block.get_balance(address) { + return Ok(balance); + } + } } EthState::balance(&self.canonical, address, block_number).await.map_err(Into::into) @@ -160,22 +173,18 @@ where ); let block_id = block_number.unwrap_or_default(); - if self.use_unsealed_state(&block_id) { - todo!(); - // let pending_blocks = self.flashblocks_state.get_pending_blocks(); - // let canon_block = pending_blocks.get_canonical_block_number(); - // let fb_count = pending_blocks.get_transaction_count(address); - - // let fb_count = 0; - // let canon_count = EthState::transaction_count(&self.canonical, address, Some(canon_block.into())) - // .await - // .map_err(Into::into)?; + let mut count = + EthState::transaction_count(&self.canonical, address, block_number).await.map_err(Into::into)?; - // return Ok(canon_count + fb_count); + if self.use_unsealed_state(&block_id) { + if let Some(unsealed_block) = self.unsealed_block.load_full() { + let unsealed_count = unsealed_block.get_transaction_count(address); + count += unsealed_count; + } } - EthState::transaction_count(&self.canonical, address, block_number).await.map_err(Into::into) + Ok(count) } async fn transaction_by_hash(&self, tx_hash: TxHash) -> RpcResult>> { @@ -194,13 +203,11 @@ where return Ok(Some(canonical_tx)); } - // TODO: - // Fall back to flashblocks for pending transactions - // let pending_blocks = self.flashblocks_state.get_pending_blocks(); - // if let Some(fb_transaction) = pending_blocks.get_transaction_by_hash(tx_hash) { - // self.metrics.get_transaction_by_hash.increment(1); - // return Ok(Some(fb_transaction)); - // } + if let Some(unsealed_block) = self.unsealed_block.load_full() { + if let Some(tx) = unsealed_block.get_transaction(&tx_hash) { + return Ok(Some(tx)); + } + } Ok(None) } @@ -280,14 +287,13 @@ where block_overrides = ?block_overrides, ); - let mut block_id = block_number.unwrap_or_default(); + let block_id = block_number.unwrap_or_default(); let mut pending_overrides = EvmOverrides::default(); // If the call is to pending block use cached override (if they exist) - if self.use_unsealed_state(&block_id) { - // TODO: - // let pending_blocks = self.flashblocks_state.get_pending_blocks(); - // block_id = pending_blocks.get_canonical_block_number().into(); - // pending_overrides.state = pending_blocks.get_state_overrides(); + if self.use_unsealed_state(&block_id) && + let Some(unsealed_block) = self.unsealed_block.load_full() + { + pending_overrides.state = unsealed_block.get_state_overrides(); } // Apply user's overrides on top @@ -319,14 +325,13 @@ where overrides = ?overrides, ); - let mut block_id = block_number.unwrap_or_default(); + let block_id = block_number.unwrap_or_default(); let mut pending_overrides = EvmOverrides::default(); // If the call is to pending block use cached override (if they exist) - if self.use_unsealed_state(&block_id) { - // TODO: - // let pending_blocks = self.flashblocks_state.get_pending_blocks(); - // block_id = pending_blocks.get_canonical_block_number().into(); - // pending_overrides.state = pending_blocks.get_state_overrides(); + if self.use_unsealed_state(&block_id) && + let Some(unsealed_block) = self.unsealed_block.load_full() + { + pending_overrides.state = unsealed_block.get_state_overrides(); } let mut state_overrides_builder = StateOverridesBuilder::new(pending_overrides.state.unwrap_or_default()); @@ -348,15 +353,14 @@ where block_number = ?block_number, ); - let mut block_id = block_number.unwrap_or_default(); + let block_id = block_number.unwrap_or_default(); let mut pending_overrides = EvmOverrides::default(); // If the call is to pending block use cached override (if they exist) - if self.use_unsealed_state(&block_id) { - // TODO: - // let pending_blocks = self.flashblocks_state.get_pending_blocks(); - // block_id = pending_blocks.get_canonical_block_number().into(); - // pending_overrides.state = pending_blocks.get_state_overrides(); + if self.use_unsealed_state(&block_id) && + let Some(unsealed_block) = self.unsealed_block.load_full() + { + pending_overrides.state = unsealed_block.get_state_overrides(); } // Prepend flashblocks pending overrides to the block state calls @@ -399,11 +403,13 @@ where // Mixed query: toBlock is pending, so we need to combine historical + pending logs let mut all_logs = Vec::new(); - // TODO: - // let pending_blocks = self.flashblocks_state.get_pending_blocks(); - // let pending_logs = pending_blocks.get_pending_logs(&filter); + if self.use_unsealed_state(&to_block.unwrap_or_default()) && + let Some(unsealed_block) = self.unsealed_block.load_full() + { + let pending_logs = unsealed_block.get_unsealed_logs(&filter); + all_logs.extend(pending_logs); + } - let mut fetched_logs = HashSet::new(); // Get historical logs if fromBlock is not pending if !matches!(from_block, Some(BlockNumberOrTag::Pending)) { // Create a filter for historical data (fromBlock to latest) @@ -412,22 +418,11 @@ where FilterBlockOption::Range { from_block, to_block: Some(BlockNumberOrTag::Latest) }; let historical_logs: Vec = self.eth_filter.logs(historical_filter).await?; - for log in &historical_logs { - fetched_logs.insert((log.block_number, log.log_index)); - } all_logs.extend(historical_logs); } - // Always get pending logs when toBlock is pending - - // TODO: // Dedup any logs from the pending state that may already have been covered in the historical logs - // let deduped_pending_logs: Vec = pending_logs - // .iter() - // .filter(|log| !fetched_logs.contains(&(log.block_number, log.log_index))) - // .cloned() - // .collect(); - // all_logs.extend(deduped_pending_logs); + all_logs.dedup(); Ok(all_logs) } @@ -438,27 +433,29 @@ where Eth: FullEthApi + Send + Sync + 'static, { async fn wait_for_frag_receipt(&self, tx_hash: TxHash) -> Option> { - // TODO: Subscribe to frags - // let mut receiver = self.flashblocks_state.subscribe_to_flashblocks(); - - // loop { - // match receiver.recv().await { - // Ok(pending_state) if pending_state.get_receipt(tx_hash).is_some() => { - // debug!(message = "found receipt in flashblock", tx_hash = %tx_hash); - // return pending_state.get_receipt(tx_hash); - // } - // Ok(_) => { - // trace!(message = "flashblock does not contain receipt", tx_hash = %tx_hash); - // } - // Err(RecvError::Closed) => { - // debug!(message = "flashblocks receipt queue closed"); - // return None; - // } - // Err(RecvError::Lagged(_)) => { - // warn!("Flashblocks receipt queue lagged, maybe missing receipts"); - // } - // } - // } + if let Some(unsealed_block) = self.unsealed_block.load_full() { + let mut receiver = unsealed_block.subscribe_new_blocks(); + + loop { + match receiver.recv().await { + Ok(block) => { + if let Some(receipt) = unsealed_block.get_transaction_receipt(&tx_hash) { + tracing::debug!(%tx_hash, block_number = block.number(), block_hash = %block.hash(), "Receipt found"); + return Some(receipt.into_rpc()); + } + + continue; + } + Err(RecvError::Closed) => { + tracing::debug!("Unsealed block receipt queue closed"); + return None; + } + Err(RecvError::Lagged(_)) => { + tracing::warn!("Unsealed block receipt queue lagged, maybe missing receipts"); + } + } + } + } None } diff --git a/based/crates/reth/src/api/mod.rs b/based/crates/reth/src/api/mod.rs index c4997653c..696463efb 100644 --- a/based/crates/reth/src/api/mod.rs +++ b/based/crates/reth/src/api/mod.rs @@ -1,2 +1,21 @@ +use op_alloy_network::Optimism; +use op_alloy_rpc_types::OpTransactionReceipt; +use reth_rpc_eth_api::RpcReceipt; + pub mod engine; pub mod eth; + +pub(crate) trait ToRpc { + type RpcVariant; + + /// Convert the type into its RPC variant. + fn into_rpc(self) -> Self::RpcVariant; +} + +impl ToRpc for OpTransactionReceipt { + type RpcVariant = RpcReceipt; + + fn into_rpc(self) -> Self::RpcVariant { + RpcReceipt::::from(self) + } +} diff --git a/based/crates/reth/src/cli.rs b/based/crates/reth/src/cli.rs index c1f73fef8..9fe556889 100644 --- a/based/crates/reth/src/cli.rs +++ b/based/crates/reth/src/cli.rs @@ -1,6 +1,8 @@ +use std::sync::{Arc, OnceLock}; + use clap::Parser; use futures::TryStreamExt as _; -use reth::providers::CanonStateSubscriptions as _; +use reth::providers::{CanonStateSubscriptions as _, providers::BlockchainProvider}; use reth_exex::ExExEvent; use reth_node_builder::Node; use reth_optimism_cli::{Cli, chainspec::OpChainSpecParser}; @@ -54,20 +56,21 @@ where /// Internal helper that runs the node with a parsed CLI instance. fn run_with_cli(cli: Cli) -> eyre::Result<()> { cli.run(|builder, args| async move { - let driver = Driver::new(args.based_op.unsealed_as_latest); + let driver = Arc::new(OnceLock::::new()); let op_node = OpNode::new(args.rollup.clone()); let node_handle = builder - .with_types::() + .with_types_and_provider::>() .with_components(op_node.components()) .with_add_ons(op_node.add_ons()) // Install the execution extension to handle canonical chain updates .install_exex("based-op", { // Get a clone of the driver handle. - let driver = driver.clone(); + let driver = Arc::clone(&driver); move |mut ctx| async move { Ok(async move { + let driver = driver.get_or_init(|| Driver::new(ctx.provider().clone())); while let Some(note) = ctx.notifications.try_next().await? { // TODO: Handle reorged and reverted chains? if let Some(committed) = note.committed_chain() { @@ -84,45 +87,48 @@ fn run_with_cli(cli: Cli) -> eyre::Result<() }) } }) - .extend_rpc_modules(move |ctx| { - let provider = ctx.provider().clone(); - - let mut canon_stream = provider.subscribe_to_canonical_state(); - - // NOTE: Not entirely sure why this is needed - // Ref: - tokio::spawn(async move { - while let Ok(notif) = canon_stream.recv().await { - provider.canonical_in_memory_state().notify_canon_state(notif); - } - }); - - // Add based engine API modules to the existing auth module. - ctx.auth_module.merge_auth_methods(BasedEngineApi::new(driver).into_rpc())?; - - // Print supported engine_ methods - let methods = ctx - .auth_module - .module_mut() - .method_names() - .filter(|m| m.starts_with("engine_")) - .collect::>(); - - tracing::info!(supported_methods = ?methods, "Configured based engine API"); - - // Configure extended Eth API - let eth = EthApi { - canonical: ctx.registry.eth_api().clone(), - eth_filter: ctx.registry.eth_handlers().filter.clone(), - unsealed_state: (), - unsealed_as_latest: args.based_op.unsealed_as_latest, - }; - - ctx.modules.replace_configured(eth.into_rpc())?; - - // TODO: - // - Replace eth API - Ok(()) + .extend_rpc_modules({ + let driver = driver.clone(); + move |ctx| { + let provider = ctx.provider().clone(); + + let mut canon_stream = provider.subscribe_to_canonical_state(); + + // NOTE: Not entirely sure why this is needed + // Ref: + tokio::spawn(async move { + while let Ok(notif) = canon_stream.recv().await { + provider.canonical_in_memory_state().notify_canon_state(notif); + } + }); + + let driver = driver.get_or_init(|| Driver::new(ctx.provider().clone())); + + // Add based engine API modules to the existing auth module. + ctx.auth_module.merge_auth_methods(BasedEngineApi::new(driver.clone()).into_rpc())?; + + // Print supported engine_ methods + let methods = ctx + .auth_module + .module_mut() + .method_names() + .filter(|m| m.starts_with("engine_")) + .collect::>(); + + tracing::info!(supported_methods = ?methods, "Configured based engine API"); + + // Configure extended Eth API + let eth = EthApi { + canonical: ctx.registry.eth_api().clone(), + eth_filter: ctx.registry.eth_handlers().filter.clone(), + unsealed_block: driver.unsealed_block(), + unsealed_as_latest: args.based_op.unsealed_as_latest, + }; + + ctx.modules.replace_configured(eth.into_rpc())?; + + Ok(()) + } }) .launch() .await?; diff --git a/based/crates/reth/src/driver.rs b/based/crates/reth/src/driver.rs index ef98207ba..fcf4768a4 100644 --- a/based/crates/reth/src/driver.rs +++ b/based/crates/reth/src/driver.rs @@ -1,31 +1,39 @@ -use std::time::Instant; +use std::{sync::Arc, time::Instant}; +use alloy_consensus::Header; use alloy_primitives::B256; -use alloy_rpc_types::Block; +use arc_swap::ArcSwapOption; use bop_common::{ p2p::{EnvV0, FragV0, SealV0}, typedefs::OpBlock, }; +use reth_chainspec::{ChainSpecProvider, EthChainSpec}; +use reth_optimism_chainspec::OpHardforks; +use reth_storage_api::{ + BlockReaderIdExt, BlockWriter, CanonChainTracker, DatabaseProviderFactory, StateProviderFactory, +}; use tokio::sync::{mpsc, oneshot}; use tracing::{error, info}; use crate::{ error::{DriverError, ValidateSealError}, - exec::{NoopExecutor, UnsealedExecutor, apply_exec_output}, + exec::{StateExecutor, UnsealedExecutor}, unsealed_block::UnsealedBlock, }; /// Result of submitting a frag to the driver. #[derive(Debug, Clone, Copy)] pub enum FragStatus { + Ignored, Valid, Invalid, } /// Actor handle for sending unsealed-block commands to the driver task. -#[derive(Clone)] +#[derive(Clone, Debug)] pub struct Driver { tx: mpsc::Sender, + unsealed_block: Arc>, } impl From> for DriverError { @@ -64,43 +72,53 @@ fn respond(resp: Resp, res: Result) { }); } +#[derive(Debug)] enum Cmd { EnvV0 { env: EnvV0, resp: Resp<()> }, NewFragV0 { frag: FragV0, resp: Resp }, SealFragV0 { seal: SealV0, resp: Resp<()> }, - ForkchoiceUpdated { block: OpBlock, resp: Resp<()> }, + ForkchoiceUpdated { block: Box, resp: Resp<()> }, GetHeaderView { resp: Resp }, } #[derive(Debug, Clone)] pub struct HeaderView { pub enabled: bool, - pub header: Option, + pub header: Option
, } /// Single-threaded state owned by the driver task (unsealed block + executor + counters). -/// Essentialy should be implemented using based-op-reth +/// Essentially should be implemented using based-op-reth #[derive(Debug)] pub struct DriverInner { - pub enabled_unsealed_as_latest: bool, - pub current_unsealed_block: Option, + pub current_unsealed_block: Arc>, pub exec: E, pub fcu_count_since_unseal_reset: usize, } impl Driver { - pub fn new(unsealed_as_latest: bool) -> Self { - Self::spawn(DriverInner { - enabled_unsealed_as_latest: unsealed_as_latest, - current_unsealed_block: None, - exec: NoopExecutor, - fcu_count_since_unseal_reset: 0, - }) + pub fn new(client: Client) -> Self + where + Client: StateProviderFactory + + ChainSpecProvider + OpHardforks> + + BlockReaderIdExt
+ + CanonChainTracker
+ + DatabaseProviderFactory + + Clone + + 'static, + ::ProviderRW: BlockWriter, + { + let executor = StateExecutor::new(client); + let current_unsealed_block = executor.shared_unsealed_block(); + + Self::spawn(DriverInner { current_unsealed_block, exec: executor, fcu_count_since_unseal_reset: 0 }) } /// Spawns the driver actor task and returns a handle used to send commands to it. pub fn spawn(inner: DriverInner) -> Self { + info!(target: "based-op", "Spawning frag driver"); let (tx, mut rx) = mpsc::channel::(256); + let unsealed_block = inner.current_unsealed_block.clone(); tokio::spawn(async move { let mut inner = inner; @@ -117,7 +135,7 @@ impl Driver { respond(resp, inner.handle_seal_frag_v0(seal).await); } Cmd::ForkchoiceUpdated { block, resp } => { - respond(resp, inner.handle_forkchoice_updated(block).await); + respond(resp, inner.handle_forkchoice_updated(*block).await); } Cmd::GetHeaderView { resp } => { let _ = resp.send(Reply::Ok(inner.get_header_view())); @@ -126,7 +144,12 @@ impl Driver { } }); - Self { tx } + Self { tx, unsealed_block } + } + + /// Returns a clone of the current unsealed block. + pub fn unsealed_block(&self) -> Arc> { + Arc::clone(&self.unsealed_block) } /// Starts a new unsealed block execution context for the given environment. @@ -153,7 +176,7 @@ impl Driver { /// Notifies the driver about a forkchoice update and resets state on mismatch. pub async fn forkchoice_updated(&self, block: OpBlock) -> Result<(), DriverError> { let (resp_tx, resp_rx) = oneshot::channel(); - self.tx.send(Cmd::ForkchoiceUpdated { block, resp: resp_tx }).await?; + self.tx.send(Cmd::ForkchoiceUpdated { block: Box::new(block), resp: resp_tx }).await?; resp_rx.await?.into_result() } @@ -174,7 +197,6 @@ impl Driver { impl DriverInner { fn reset_current_unsealed_block(&mut self) { - self.current_unsealed_block = None; self.exec.reset(); self.fcu_count_since_unseal_reset = 0; } @@ -182,7 +204,7 @@ impl DriverInner { async fn handle_env_v0(&mut self, env: EnvV0) -> Result<(), DriverError> { info!(block = env.number, "envV0 received"); - if let Some(current) = self.current_unsealed_block.as_ref() { + if let Some(current) = self.current_unsealed_block.load_full().as_ref() { let current_num = current.env.number; if current_num >= env.number { @@ -193,8 +215,7 @@ impl DriverInner { self.reset_current_unsealed_block(); } - self.exec.ensure_env(&env).await?; - self.current_unsealed_block = Some(UnsealedBlock::new(env)); + self.exec.ensure_env(&env)?; // this should update current_unsealed_block too because shared arc self.fcu_count_since_unseal_reset = 0; Ok(()) } @@ -202,7 +223,7 @@ impl DriverInner { async fn handle_forkchoice_updated(&mut self, block: OpBlock) -> Result<(), DriverError> { self.fcu_count_since_unseal_reset += 1; - let Some(ub) = self.current_unsealed_block.as_ref() else { + let Some(ub) = self.current_unsealed_block.load_full() else { return Ok(()); }; @@ -220,7 +241,7 @@ impl DriverInner { async fn handle_new_frag_v0(&mut self, frag: FragV0) -> Result { let start = Instant::now(); - let Some(ub) = self.current_unsealed_block.as_mut() else { + let Some(ub) = self.current_unsealed_block.load_full() else { return Err(DriverError::NotInitialized); }; @@ -228,7 +249,7 @@ impl DriverInner { if frag.block_number < ub.env.number { info!(frag_block = frag.block_number, env_number = ub.env.number, "stale frag (older block), ignoring"); - return Ok(FragStatus::Valid); + return Ok(FragStatus::Ignored); } if let Err(e) = ub.validate_new_frag(&frag) { @@ -237,8 +258,8 @@ impl DriverInner { return Err(DriverError::from(e)); } - let out = match self.exec.execute_frag(ub, &frag).await { - Ok(out) => out, + match self.exec.execute_frag(&frag) { + Ok(()) => (), Err(e) => { error!(error = %e, "execution failed, discarding unsealed block"); self.reset_current_unsealed_block(); @@ -246,14 +267,11 @@ impl DriverInner { } }; - apply_exec_output(ub, out); - ub.accept_frag(frag); - info!(elapsed_ms = start.elapsed().as_millis(), "frag inserted + executed"); if ub.last_frag().is_some_and(|f| f.is_last) { info!("last frag received, pre-sealing block"); - if let Err(e) = self.exec.seal(ub).await { + if let Err(e) = self.exec.seal() { error!(error = %e, "seal failed, discarding unsealed block"); self.reset_current_unsealed_block(); return Err(DriverError::from(e)); @@ -265,7 +283,7 @@ impl DriverInner { async fn handle_seal_frag_v0(&mut self, seal: SealV0) -> Result<(), DriverError> { let start = Instant::now(); - let Some(ub) = self.current_unsealed_block.as_ref() else { + let Some(ub) = self.current_unsealed_block.load_full() else { return Err(DriverError::NotInitialized); }; @@ -274,9 +292,7 @@ impl DriverInner { return Ok(()); } - let presealed_block = self.exec.get_block(seal.block_hash, seal.block_number).await; - - let presealed_block = match presealed_block { + let presealed_block = match self.exec.get_block(seal.block_hash) { Ok(b) => b, Err(e) => { self.reset_current_unsealed_block(); @@ -284,9 +300,9 @@ impl DriverInner { } }; - self.validate_seal_frag_v0(&presealed_block, ub, &seal)?; + self.validate_seal_frag_v0(&presealed_block, ub.as_ref(), &seal)?; - self.exec.set_canonical(&presealed_block).await?; + self.exec.set_canonical(&presealed_block)?; self.reset_current_unsealed_block(); @@ -296,65 +312,55 @@ impl DriverInner { fn validate_seal_frag_v0( &self, - presealed_block: &Block, + presealed_block: &OpBlock, ub: &UnsealedBlock, seal: &SealV0, ) -> Result<(), ValidateSealError> { - let expected_block_hash: B256 = presealed_block.header.hash.into(); + let expected_block_hash: B256 = presealed_block.header.hash_slow(); if expected_block_hash != seal.block_hash { - return Err(ValidateSealError::BlockHashMismatch { expected: expected_block_hash, got: seal.block_hash }); + return Err(ValidateSealError::BlockHash { expected: expected_block_hash, got: seal.block_hash }); } let expected_parent_hash = presealed_block.header.parent_hash; if expected_parent_hash != seal.parent_hash { - return Err(ValidateSealError::ParentHashMismatch { expected: expected_parent_hash, got: seal.parent_hash }); + return Err(ValidateSealError::ParentHash { expected: expected_parent_hash, got: seal.parent_hash }); } let expected_state_root = presealed_block.header.state_root; if expected_state_root != seal.state_root { - return Err(ValidateSealError::StateRootMismatch { expected: expected_state_root, got: seal.state_root }); + return Err(ValidateSealError::StateRoot { expected: expected_state_root, got: seal.state_root }); } let expected_tx_root = presealed_block.header.transactions_root; if expected_tx_root != seal.transactions_root { - return Err(ValidateSealError::TransactionsRootMismatch { - expected: expected_tx_root, - got: seal.transactions_root, - }); + return Err(ValidateSealError::TransactionsRoot { expected: expected_tx_root, got: seal.transactions_root }); } let expected_receipts_root = presealed_block.header.receipts_root; if expected_receipts_root != seal.receipts_root { - return Err(ValidateSealError::ReceiptsRootMismatch { - expected: expected_receipts_root, - got: seal.receipts_root, - }); + return Err(ValidateSealError::ReceiptsRoot { expected: expected_receipts_root, got: seal.receipts_root }); } let expected_gas_used = presealed_block.header.gas_used; if expected_gas_used != seal.gas_used { - return Err(ValidateSealError::GasUsedMismatch { expected: expected_gas_used, got: seal.gas_used }); + return Err(ValidateSealError::GasUsed { expected: expected_gas_used, got: seal.gas_used }); } let expected_gas_limit = presealed_block.header.gas_limit; if expected_gas_limit != seal.gas_limit { - return Err(ValidateSealError::GasLimitMismatch { expected: expected_gas_limit, got: seal.gas_limit }); + return Err(ValidateSealError::GasLimit { expected: expected_gas_limit, got: seal.gas_limit }); } let expected_total_frags = ub.frags.len() as u64; if expected_total_frags != seal.total_frags { - return Err(ValidateSealError::TotalFragsMismatch { expected: expected_total_frags, got: seal.total_frags }); + return Err(ValidateSealError::TotalFrags { expected: expected_total_frags, got: seal.total_frags }); } Ok(()) } fn get_header_view(&self) -> HeaderView { - if !self.enabled_unsealed_as_latest { - return HeaderView { enabled: false, header: None }; - } - - let header = self.current_unsealed_block.as_ref().map(|ub| ub.temp_header()); + let header = self.current_unsealed_block.load_full().map(|ub| ub.get_header()); HeaderView { enabled: true, header } } } diff --git a/based/crates/reth/src/error.rs b/based/crates/reth/src/error.rs index 96778fa2a..f96808ff9 100644 --- a/based/crates/reth/src/error.rs +++ b/based/crates/reth/src/error.rs @@ -1,5 +1,10 @@ +use alloy_consensus::crypto::RecoveryError; use alloy_eips::eip2718::Eip2718Error; use alloy_primitives::B256; +use op_alloy_consensus::EIP1559ParamError; +use reth_optimism_evm::OpBlockExecutionError; +use reth_optimism_rpc::OpEthApiError; +use reth_storage_errors::ProviderError; use thiserror::Error; #[derive(Debug, Error)] @@ -37,28 +42,28 @@ pub enum DriverError { #[derive(Debug, Error)] pub enum ValidateSealError { #[error("block hash mismatch, expected {expected:?}, got {got:?}")] - BlockHashMismatch { expected: B256, got: B256 }, + BlockHash { expected: B256, got: B256 }, #[error("parent hash mismatch, expected {expected:?}, got {got:?}")] - ParentHashMismatch { expected: B256, got: B256 }, + ParentHash { expected: B256, got: B256 }, #[error("state root mismatch, expected {expected:?}, got {got:?}")] - StateRootMismatch { expected: B256, got: B256 }, + StateRoot { expected: B256, got: B256 }, #[error("transactions root mismatch, expected {expected:?}, got {got:?}")] - TransactionsRootMismatch { expected: B256, got: B256 }, + TransactionsRoot { expected: B256, got: B256 }, #[error("receipts root mismatch, expected {expected:?}, got {got:?}")] - ReceiptsRootMismatch { expected: B256, got: B256 }, + ReceiptsRoot { expected: B256, got: B256 }, #[error("gas used mismatch, expected {expected}, got {got}")] - GasUsedMismatch { expected: u64, got: u64 }, + GasUsed { expected: u64, got: u64 }, #[error("gas limit mismatch, expected {expected}, got {got}")] - GasLimitMismatch { expected: u64, got: u64 }, + GasLimit { expected: u64, got: u64 }, #[error("total frags mismatch, expected {expected}, got {got}")] - TotalFragsMismatch { expected: u64, got: u64 }, + TotalFrags { expected: u64, got: u64 }, } #[derive(Debug, Error)] @@ -81,6 +86,9 @@ pub enum UnsealedBlockError { #[error("received frag after last frag already accepted")] AlreadyEnded, + + #[error("operation failed: {0}")] + Failed(String), } #[derive(Debug, Error)] @@ -93,4 +101,22 @@ pub enum ExecError { #[error("seal failed: {0}")] SealFailed(String), + + #[error(transparent)] + StorageProvider(#[from] ProviderError), + + #[error(transparent)] + OpBlockExecution(#[from] OpBlockExecutionError), + + #[error(transparent)] + Recovery(#[from] RecoveryError), + + #[error(transparent)] + Eip1559Param(#[from] EIP1559ParamError), + + #[error(transparent)] + OpEthApi(#[from] OpEthApiError), + + #[error(transparent)] + UnsealedBlock(#[from] UnsealedBlockError), } diff --git a/based/crates/reth/src/exec.rs b/based/crates/reth/src/exec.rs index e116d699f..ff71cfc2c 100644 --- a/based/crates/reth/src/exec.rs +++ b/based/crates/reth/src/exec.rs @@ -1,82 +1,438 @@ -use std::future::Future; +use std::sync::{Arc, Mutex}; -use alloy_primitives::{B256, BlockNumber}; -use alloy_rpc_types::{Block, Log, TransactionReceipt}; -use bop_common::p2p::{EnvV0, FragV0}; +use alloy_consensus::{ + BlockBody, Header, Receipt, Transaction, + transaction::{Recovered, SignerRecoverable, TransactionMeta}, +}; +use alloy_eips::{BlockNumberOrTag, Typed2718, eip2718::Decodable2718}; +use alloy_primitives::{B256, Bytes, Sealable}; +use alloy_rpc_types::Log; +use arc_swap::ArcSwapOption; +use bop_common::{ + p2p::{EnvV0, FragV0}, + typedefs::Database, +}; +use op_alloy_consensus::OpTxEnvelope; +use op_alloy_rpc_types::{OpTransactionReceipt, Transaction as RPCTransaction}; +use reth::{ + api::Block as RethBlock, + network::cache::LruMap, + primitives::{SealedBlock, SealedHeader}, +}; +use reth_chainspec::{ChainSpecProvider, EthChainSpec, EthereumHardforks as _}; +use reth_evm::{ConfigureEvm, Evm, op_revm::OpHaltReason}; +use reth_optimism_chainspec::OpHardforks; +use reth_optimism_consensus::isthmus; +use reth_optimism_evm::{OpEvmConfig, OpNextBlockEnvAttributes}; +use reth_optimism_primitives::{OpBlock, OpPrimitives, OpReceipt, OpTransactionSigned}; +use reth_optimism_rpc::OpReceiptBuilder; +use reth_revm::{ + DatabaseCommit, State, + context::result::{ExecutionResult, ResultAndState}, + database::StateProviderDatabase, +}; +use reth_rpc_convert::transaction::ConvertReceiptInput; +use reth_storage_api::{ + BlockReaderIdExt, BlockWriter, CanonChainTracker, DBProvider, DatabaseProviderFactory, StateProviderFactory, +}; +use revm::database::CacheDB; use crate::{error::ExecError, unsealed_block::UnsealedBlock}; -#[derive(Debug, Clone)] -pub struct ExecOutput { - pub receipts: Vec, - pub logs: Vec, - pub gas_used_delta: u64, -} +const BLOCK_CACHE_LIMIT: u32 = 256; /// This trait is the ONLY place that needs to know about Reth internals. /// Everything else is just state-machine + bookkeeping. pub trait UnsealedExecutor: Send { /// Ensure the executor context is ready for this env (initialize overlay state, block env, etc.) - fn ensure_env(&mut self, env: &EnvV0) -> impl Future> + Send + '_; + fn ensure_env(&mut self, env: &EnvV0) -> Result<(), ExecError>; /// Execute all txs in `frag` on top of current overlay state. /// /// MUST be cumulative: txs execute after all previous frags's txs. - fn execute_frag( - &mut self, - ub: &UnsealedBlock, - frag: &FragV0, - ) -> impl Future> + Send + '_; + fn execute_frag(&mut self, frag: &FragV0) -> Result<(), ExecError>; - fn seal(&mut self, ub: &UnsealedBlock) -> impl Future> + Send + '_; + fn seal(&mut self) -> Result<(), ExecError>; - fn set_canonical(&mut self, b: &Block) -> impl Future> + Send + '_; + fn set_canonical(&mut self, b: &OpBlock) -> Result<(), ExecError>; - fn get_block(&self, hash: B256, number: BlockNumber) -> impl Future> + Send + '_; + fn get_block(&self, hash: B256) -> Result; /// Reset overlay state completely. fn reset(&mut self); } -/// Apply the executor output to the UnsealedBlock (common logic). -pub fn apply_exec_output(ub: &mut UnsealedBlock, out: ExecOutput) { - ub.receipts.extend(out.receipts); - ub.logs.extend(out.logs); - ub.cumulative_gas_used = ub.cumulative_gas_used.saturating_add(out.gas_used_delta); +pub struct StateExecutor { + client: Client, + current_unsealed_block: Arc>, + block_cache: Mutex>, } -/// A very small “dummy” executor so you can compile & test state machine early. -/// Replace with Reth executor. -pub struct NoopExecutor; +impl StateExecutor { + pub fn new(client: Client) -> Self { + Self { + client, + current_unsealed_block: Arc::new(ArcSwapOption::new(None)), + block_cache: Mutex::new(LruMap::new(BLOCK_CACHE_LIMIT)), + } + } + + pub fn shared_unsealed_block(&self) -> Arc> { + Arc::clone(&self.current_unsealed_block) + } +} + +impl UnsealedExecutor for StateExecutor +where + Client: StateProviderFactory + + ChainSpecProvider + OpHardforks> + + BlockReaderIdExt
+ + CanonChainTracker
+ + DatabaseProviderFactory + + Clone + + 'static, + ::ProviderRW: BlockWriter, +{ + fn ensure_env(&mut self, env: &EnvV0) -> Result<(), ExecError> { + let Some(parent) = self.client.block_by_hash(env.parent_hash)? else { + return Err(ExecError::Failed(format!("parent block {} not found", env.parent_hash))) + }; + + let parent_header = parent.header(); + let None = self.current_unsealed_block.load_full() else { return Err(ExecError::NotInitialized) }; + + let expected_block_number = parent_header.number.saturating_sub(1); + if env.number != expected_block_number { + return Err(ExecError::Failed(format!( + "env block number doesn't match expected block number, expected {}, received {}", + expected_block_number, env.number + ))) + } + + if env.timestamp < parent_header.timestamp { + return Err(ExecError::Failed(format!( + "env timestamp is lower than parent block timestamp, parent timestamp {}, env timestamp {}", + parent_header.timestamp, env.timestamp + ))) + } + + let state_provider = + self.client.state_by_block_number_or_tag(BlockNumberOrTag::Number(parent_header.number))?; + let state_provider_db = StateProviderDatabase::new(state_provider); + let state = State::builder().with_database(state_provider_db).with_bundle_update().build(); + + // Check if the current block is a prague block + let is_prague = self.client.chain_spec().is_prague_active_at_timestamp(env.timestamp); + + let ub = UnsealedBlock::new(env.clone(), is_prague).with_db_cache(CacheDB::new(state).cache); + self.current_unsealed_block.store(Some(Arc::new(ub))); + + Ok(()) + } + + fn execute_frag(&mut self, frag: &FragV0) -> Result<(), ExecError> { + let chain_spec = self.client.chain_spec().clone(); + + let ub_arc_opt = self.current_unsealed_block.load_full(); + let frag = frag.clone(); + + let ub_arc = ub_arc_opt.ok_or(ExecError::NotInitialized)?; + + // Make an owned, mutable working copy from the start + let mut ub = ub_arc.as_ref().clone_for_update(); + + let ub_cache = ub.get_db_cache(); + let canonical_block = ub.env.number.saturating_sub(1); + + let last_block_header = self + .client + .header_by_number(canonical_block) + .map_err(|e| ExecError::Failed(format!("header_by_number({canonical_block}) failed: {e}")))? + .ok_or_else(|| ExecError::Failed(format!("missing parent header at {canonical_block}")))?; + + let evm_config = OpEvmConfig::optimism(self.client.chain_spec()); + + let state_provider = self + .client + .state_by_block_number_or_tag(BlockNumberOrTag::Number(canonical_block)) + .map_err(|e| ExecError::Failed(format!("state_by_block_number_or_tag({canonical_block}) failed: {e}")))?; + + let state_provider_db = StateProviderDatabase::new(state_provider); + let state = State::builder().with_database(state_provider_db).with_bundle_update().build(); + + let mut db = CacheDB { cache: ub_cache, db: state }; + + let mut state_overrides = ub.get_state_overrides().unwrap_or_default(); + + let block: OpBlock = build_op_block_from_ub_and_frag(&ub, &frag)?; + let mut l1_block_info = reth_optimism_evm::extract_l1_info(&block.body)?; + let header = block.header.clone().seal_slow(); + + let block_env_attributes = OpNextBlockEnvAttributes { + timestamp: ub.env.timestamp, + suggested_fee_recipient: ub.env.beneficiary, + prev_randao: ub.env.prevrandao, + gas_limit: ub.env.gas_limit, + parent_beacon_block_root: Some(ub.env.parent_beacon_block_root), + extra_data: block.extra_data.clone(), + }; + + let evm_env = evm_config.next_evm_env(&last_block_header, &block_env_attributes)?; + let mut evm = evm_config.evm_with_env(db, evm_env); + + let mut gas_used: u64 = ub.cumulative_blob_gas_used; + let mut logs: Vec = Vec::new(); + let mut next_log_index = 0usize; + let mut receipts: Vec = Vec::new(); + + for (idx, transaction) in block.body.transactions.iter().enumerate() { + let tx_hash = transaction.tx_hash(); + let sender = transaction.recover_signer()?; + ub.increment_nonce(sender); + + let recovered_transaction = Recovered::new_unchecked(transaction.clone(), sender); + let envelope = recovered_transaction.clone().convert::(); + let is_deposit = transaction.is_deposit(); + + let effective_gas_price = if is_deposit { + 0 + } else { + block + .base_fee_per_gas + .map(|base_fee| transaction.effective_tip_per_gas(base_fee).unwrap_or_default() + base_fee as u128) + .unwrap_or_else(|| transaction.max_fee_per_gas()) + }; + + let deposit_nonce = if is_deposit && chain_spec.is_regolith_active_at_timestamp(ub.env.timestamp) { + // depositor nonce (use signer account) + let acc = evm + .db_mut() + .basic(sender) + .map_err(|e| ExecError::Failed(format!("get acc nonce basic() failed: {e}")))? + .unwrap_or_default(); + Some(acc.nonce) // pre-tx nonce + } else { + None + }; -impl UnsealedExecutor for NoopExecutor { - fn ensure_env(&mut self, _env: &EnvV0) -> impl Future> + Send + '_ { - async move { Ok(()) } + let deposit_receipt_version = + if is_deposit && chain_spec.is_canyon_active_at_timestamp(ub.env.timestamp) { Some(1) } else { None }; + + let rpc_txn = RPCTransaction { + inner: alloy_rpc_types_eth::Transaction { + inner: envelope, + block_hash: Some(header.hash()), + block_number: Some(block.number), + transaction_index: Some(idx as u64), + effective_gas_price: Some(effective_gas_price), + }, + deposit_nonce, + deposit_receipt_version, + }; + + ub.with_transaction(rpc_txn); + + match evm.transact(recovered_transaction) { + Ok(ResultAndState { state, result }) => { + for (addr, acc) in &state { + let existing_override = state_overrides.entry(*addr).or_default(); + existing_override.balance = Some(acc.info.balance); + existing_override.nonce = Some(acc.info.nonce); + existing_override.code = acc.info.code.clone().map(|code| code.bytes()); + + let existing = existing_override.state_diff.get_or_insert(Default::default()); + let changed_slots = + acc.storage.iter().map(|(&key, slot)| (B256::from(key), B256::from(slot.present_value))); + + existing.extend(changed_slots); + } + + evm.db_mut().commit(state); + + let (success, tx_gas_used, tx_logs) = split_execution_result(&result); + gas_used = gas_used.saturating_add(tx_gas_used); + + logs.extend(tx_logs.iter().map(|inner| Log { inner: inner.clone(), ..Default::default() })); + + let base_receipt = Receipt { status: success.into(), cumulative_gas_used: gas_used, logs: tx_logs }; + + let ty = transaction.ty(); + let op_receipt = wrap_op_receipt(ty, base_receipt, deposit_nonce, deposit_receipt_version)?; + + let meta = TransactionMeta { + tx_hash, + index: idx as u64, + block_hash: header.hash(), + block_number: block.number, + base_fee: block.base_fee_per_gas, + excess_blob_gas: block.excess_blob_gas, + timestamp: block.timestamp, + }; + + let input: ConvertReceiptInput<'_, OpPrimitives> = ConvertReceiptInput { + receipt: op_receipt, + tx: Recovered::new_unchecked(transaction, sender), + gas_used: tx_gas_used, + next_log_index, + meta, + }; + + let receipt = OpReceiptBuilder::new(chain_spec.as_ref(), input, &mut l1_block_info)?.build(); + + // TODO: Is this correct?q + next_log_index += receipt.inner.logs().len(); + ub.with_transaction_receipt(tx_hash, receipt.clone()); + receipts.push(receipt); + } + Err(e) => { + return Err(ExecError::Failed(format!( + "failed to execute transaction: {:?} tx_hash: {:?} sender: {:?}", + e, tx_hash, sender + ))); + } + } + } + + db = evm.into_db(); + ub = ub + .with_db_cache(db.cache) + .with_state_overrides(Some(state_overrides)) + .with_bundle_state(db.db.bundle_state); + + ub.accept_frag_execution(frag, logs, receipts, gas_used); + + self.current_unsealed_block.store(Some(Arc::new(ub))); + + Ok(()) + } + + fn seal(&mut self) -> Result<(), ExecError> { + let ub = self.current_unsealed_block.load_full().ok_or(ExecError::NotInitialized)?; + let withdrawals_hash = if ub.is_prague { + let canonical_block = ub.env.number.saturating_sub(1); + + let state_provider = + self.client.state_by_block_number_or_tag(BlockNumberOrTag::Number(canonical_block)).map_err(|e| { + ExecError::Failed(format!("state_by_block_number_or_tag({canonical_block}) failed: {e}")) + })?; + let bundle_state = ub.get_bundle_state(); + Some(isthmus::withdrawals_root(bundle_state, state_provider)?) + } else { + None + }; + + let block = ub.to_op_block(withdrawals_hash)?; + let sealed = SealedBlock::seal_slow(block); + let recovered = sealed.try_recover().map_err(|e| ExecError::Failed(format!("recover senders: {e}")))?; + + let provider_rw = self.client.database_provider_rw()?; + provider_rw.insert_block(recovered)?; + provider_rw.commit()?; + Ok(()) } - fn execute_frag( - &mut self, - _ub: &UnsealedBlock, - _frag: &FragV0, - ) -> impl Future> + Send + '_ { - async move { Ok(ExecOutput { receipts: vec![], logs: vec![], gas_used_delta: 0 }) } + fn set_canonical(&mut self, b: &OpBlock) -> Result<(), ExecError> { + let sealed = SealedHeader::seal_slow(b.header.clone()); + self.client.set_canonical_head(sealed); + Ok(()) } - fn seal(&mut self, _ub: &UnsealedBlock) -> impl Future> + Send + '_ { - async move { Ok(()) } + fn get_block(&self, hash: B256) -> Result { + if let Some(block) = self + .block_cache + .lock() + .map_err(|_| ExecError::Failed("block_cache mutex poisoned".into()))? + .get(&hash) + .cloned() + { + return Ok(block); + } + + // fetch + let block = self + .client + .block_by_hash(hash) + .map_err(|e| ExecError::Failed(format!("block_by_hash failed: {e}")))? + .ok_or_else(|| ExecError::Failed("pre-sealed block not found".into()))?; + + self.block_cache + .lock() + .map_err(|_| ExecError::Failed("block_cache mutex poisoned".into()))? + .insert(hash, block.clone()); + + Ok(block) } - fn set_canonical(&mut self, _b: &Block) -> impl Future> + Send + '_ { - async move { Ok(()) } + fn reset(&mut self) { + self.current_unsealed_block.store(None); } +} + +fn build_op_block_from_ub_and_frag(ub: &UnsealedBlock, frag: &FragV0) -> Result { + // Decode EIP-2718 tx bytes -> OpTransactionSigned + let tx_list: Vec = frag + .txs + .iter() + .map(|tx_bytes| { + OpTxEnvelope::decode_2718(&mut tx_bytes.as_ref()) + .map_err(|e| ExecError::Failed(format!("decode tx failed: {e}"))) + }) + .collect::, ExecError>>()?; + + let extra_data: Bytes = Bytes::copy_from_slice(ub.env.extra_data.as_ref()); + let header = Header { + parent_hash: ub.env.parent_hash, + ommers_hash: Default::default(), + beneficiary: ub.env.beneficiary, + state_root: B256::ZERO, + transactions_root: B256::ZERO, + receipts_root: B256::ZERO, + logs_bloom: Default::default(), + difficulty: ub.env.difficulty, + number: frag.block_number, + gas_limit: ub.env.gas_limit, + gas_used: ub.cumulative_gas_used, + timestamp: ub.env.timestamp, + extra_data, + mix_hash: ub.env.prevrandao, + nonce: Default::default(), + base_fee_per_gas: Some(ub.env.basefee), + withdrawals_root: None, + blob_gas_used: Some(ub.cumulative_blob_gas_used), + excess_blob_gas: Some(0), + parent_beacon_block_root: Some(ub.env.parent_beacon_block_root), + requests_hash: None, + }; - fn get_block( - &self, - _hash: B256, - _number: BlockNumber, - ) -> impl Future> + Send + '_ { - async move { Ok(Block::default()) } + let body = BlockBody { transactions: tx_list, ommers: vec![], withdrawals: None }; + + Ok(OpBlock::new(header, body)) +} + +fn split_execution_result(result: &ExecutionResult) -> (bool, u64, Vec) { + match result { + ExecutionResult::Success { gas_used, logs, .. } => (true, *gas_used, logs.clone()), + ExecutionResult::Revert { gas_used, .. } => (false, *gas_used, vec![]), + ExecutionResult::Halt { gas_used, .. } => (false, *gas_used, vec![]), } +} - fn reset(&mut self) {} +fn wrap_op_receipt( + tx_type: u8, + receipt: Receipt, + deposit_nonce: Option, + deposit_receipt_version: Option, +) -> Result { + Ok(match tx_type { + 0x00 => OpReceipt::Legacy(receipt), + 0x01 => OpReceipt::Eip2930(receipt), + 0x02 => OpReceipt::Eip1559(receipt), + 0x04 => OpReceipt::Eip7702(receipt), + t if t == op_alloy_consensus::DEPOSIT_TX_TYPE_ID => OpReceipt::Deposit(op_alloy_consensus::OpDepositReceipt { + inner: receipt, + deposit_nonce, + deposit_receipt_version, + }), + other => return Err(ExecError::Failed(format!("unsupported tx type for receipt: 0x{other:02x}"))), + }) } diff --git a/based/crates/reth/src/unsealed_block.rs b/based/crates/reth/src/unsealed_block.rs index 04d3b1a22..8e71f2287 100644 --- a/based/crates/reth/src/unsealed_block.rs +++ b/based/crates/reth/src/unsealed_block.rs @@ -1,14 +1,16 @@ -use alloy_consensus::{Header, TxEnvelope}; -use alloy_eips::eip2718::Decodable2718; +use alloy_consensus::{BlockBody, Header, TxEnvelope}; +use alloy_eips::{eip2718::Decodable2718, eip7685::EMPTY_REQUESTS_HASH}; use alloy_primitives::{Address, B256, Bytes, Sealable, TxHash, U256, map::foldhash::HashMap}; -use alloy_rpc_types::{BlockTransactions, Log, TransactionReceipt, state::StateOverride}; +use alloy_rpc_types::{BlockTransactions, Filter, Log, state::StateOverride}; use alloy_rpc_types_eth::Header as RPCHeader; use bop_common::p2p::{EnvV0, FragV0, Transaction as TxBytes}; -use op_alloy_consensus::OpReceiptEnvelope; +use op_alloy_consensus::{OpBlock, OpTxEnvelope}; use op_alloy_network::{Optimism, TransactionResponse}; -use op_alloy_rpc_types::Transaction; -use reth::revm::db::Cache; +use op_alloy_rpc_types::{OpTransactionReceipt, Transaction}; +use reth::revm::db::{BundleState, Cache}; +use reth_optimism_primitives::OpTransactionSigned; use reth_rpc_eth_api::RpcBlock; +use tokio::sync::broadcast; use crate::error::UnsealedBlockError; @@ -27,24 +29,31 @@ pub struct UnsealedBlock { pub hash: B256, /// Transaction receipts for executed transactions. - pub receipts: Vec, + pub receipts: Vec, /// Flattened logs emitted during execution. pub logs: Vec, /// Cumulative execution gas used across all transactions in the block. pub cumulative_gas_used: u64, /// Cumulative blob gas used across all blob-carrying transactions in the block. pub cumulative_blob_gas_used: u64, + pub is_prague: bool, transaction_count: HashMap, - transaction: Vec, - transaction_receipts: HashMap>>, + transactions: Vec, + transaction_receipts: HashMap, state_overrides: Option, + new_block_sender: broadcast::Sender>, + db_cache: Cache, + bundle_state: BundleState, } impl UnsealedBlock { - pub fn new(env: EnvV0) -> Self { + /// Create a fresh unsealed block state for `env` with empty frags/results/caches. + pub fn new(env: EnvV0, is_prague: bool) -> Self { + let (new_block_sender, _) = broadcast::channel(16); + Self { env, frags: Vec::new(), @@ -54,14 +63,27 @@ impl UnsealedBlock { logs: Vec::new(), cumulative_gas_used: 0, cumulative_blob_gas_used: 0, + is_prague, transaction_count: Default::default(), - transaction: vec![], + transactions: vec![], transaction_receipts: Default::default(), state_overrides: None, + new_block_sender, db_cache: Default::default(), + bundle_state: Default::default(), } } + /// Returns the canonical block number. + pub fn canonical_block_number(&self) -> u64 { + // TODO: Is this correct? + self.env.number.saturating_sub(1) + } + + pub fn subscribe_new_blocks(&self) -> broadcast::Receiver> { + self.new_block_sender.subscribe() + } + /// Returns `true` if no fragments have been added yet. pub fn is_empty(&self) -> bool { self.frags.is_empty() @@ -80,12 +102,12 @@ impl UnsealedBlock { } } - /// Raw tx bytes iterator (flattening frags) + /// Raw tx bytes iterator (flattening frags). pub fn transactions_iter_bytes(&self) -> impl Iterator + '_ { self.frags.iter().flat_map(|frag| frag.txs.iter()) } - /// Decoded txs iterator (lazy decode) + /// Decoded txs iterator (lazy decode). pub fn transactions_iter_decoded(&self) -> impl Iterator> + '_ { self.transactions_iter_bytes().enumerate().map(|(index, tx)| { // allocate a Vec to decode from @@ -94,17 +116,17 @@ impl UnsealedBlock { }) } - /// Decoded txs (allocates Vec), like Go `Transactions()` but decoded - pub fn transactions(&self) -> Result, UnsealedBlockError> { - self.transactions_iter_decoded().collect() + /// Return list of transaction + pub fn transactions(&self) -> Vec { + self.transactions.clone() } - /// Raw tx bytes (allocates Vec>), like Go `ByteTransactions()` + /// Raw tx bytes (allocates Vec>), like Go `ByteTransactions()`. pub fn byte_transactions(&self) -> Vec> { self.transactions_iter_bytes().map(|tx| tx.iter().copied().collect::>()).collect() } - // Return the last frag on the list. + /// Return the last fragment in the list (if any). pub fn last_frag(&self) -> Option<&FragV0> { self.frags.last() } @@ -112,10 +134,21 @@ impl UnsealedBlock { /// Apply the accepted frag into in-memory bookkeeping (NOT executing txs). /// /// Execution results (receipts/logs/gas) should be appended separately. - pub fn accept_frag(&mut self, f: FragV0) { + pub fn accept_frag_execution( + &mut self, + f: FragV0, + logs: Vec, + receipts: Vec, + cummulative_gas_used: u64, + ) { self.last_sequence_number = Some(f.seq); self.cumulative_blob_gas_used = self.cumulative_blob_gas_used.saturating_add(f.blob_gas_used); - self.frags.push(f); + self.frags.push(f.clone()); + self.logs.extend_from_slice(logs.as_slice()); + self.receipts.extend_from_slice(receipts.as_slice()); + self.cumulative_gas_used = cummulative_gas_used; + + let _ = self.new_block_sender.send(self.to_rpc_block(false)); } /// Validate frag against current state (equivalent to your ValidateNewFragV0 + sequencing gate). @@ -172,50 +205,97 @@ impl UnsealedBlock { /// Reset to a fresh env (drop frags/results/counters). pub fn reset_to_env(&mut self, env: EnvV0) { - *self = Self::new(env); + *self = Self::new(env, self.is_prague); + } + + /// Attach/replace the DB cache to carry execution overlay state forward. + pub fn with_db_cache(mut self, cache: Cache) -> Self { + self.db_cache = cache; + self + } + + /// Attach/replace the bundle state to carry execution overlay state forward. + pub fn with_bundle_state(mut self, bundle_state: BundleState) -> Self { + self.bundle_state = bundle_state; + self + } + + /// Attach/replace the state overrides that represent the current overlay diff. + pub fn with_state_overrides(mut self, state_overrides: Option) -> Self { + self.state_overrides = state_overrides; + self + } + + /// Returns the database cache. + pub fn get_db_cache(&self) -> Cache { + self.db_cache.clone() + } + + /// Returns the bundle state. + pub fn get_bundle_state(&self) -> &BundleState { + &self.bundle_state + } + + /// Clone this unsealed block into a mutable working copy for in-place updates. + pub fn clone_for_update(&self) -> Self { + Self { + env: self.env.clone(), + frags: self.frags.clone(), + last_sequence_number: self.last_sequence_number, + hash: self.hash, + receipts: self.receipts.clone(), + logs: self.logs.clone(), + cumulative_gas_used: self.cumulative_gas_used, + cumulative_blob_gas_used: self.cumulative_blob_gas_used, + is_prague: self.is_prague, + transaction_count: self.transaction_count.clone(), + transactions: self.transactions.clone(), + db_cache: self.db_cache.clone(), + state_overrides: self.state_overrides.clone(), + new_block_sender: self.new_block_sender.clone(), + transaction_receipts: self.transaction_receipts.clone(), + bundle_state: self.bundle_state.clone(), + } } /// Returns a cloned list of unsealed logs collected so far. - pub fn get_unsealed_logs(self) -> Vec { - self.logs.clone() + pub fn get_unsealed_logs(&self, filter: &Filter) -> Vec { + self.logs.clone().into_iter().filter(|log| filter.matches(&alloy_primitives::Log::from(log.clone()))).collect() } /// Returns a cloned list of fragments accepted into this unsealed block. - pub fn get_unsealed_frags(self) -> Vec { + pub fn get_unsealed_frags(&self) -> Vec { self.frags.clone() } /// Looks up and returns a cloned transaction receipt by transaction hash, if present. - pub fn get_transaction_receipt(self, tx_hash: B256) -> Option>> { - self.transaction_receipts.get(&tx_hash).cloned() + pub fn get_transaction_receipt(&self, tx_hash: &TxHash) -> Option { + self.transaction_receipts.get(tx_hash).cloned() + } + + /// Looks up and returns a cloned transaction by transaction hash, if present. + pub fn get_transaction(&self, tx_hash: &TxHash) -> Option { + self.transactions.iter().find(|tx| tx.tx_hash() == *tx_hash).cloned() } /// Returns a cloned copy of the current state overrides, if any are set. - pub fn get_state_overrides(self) -> Option { + pub fn get_state_overrides(&self) -> Option { self.state_overrides.clone() } /// Returns the locally tracked transaction count (nonce) for `address`, or zero if unknown. - pub fn get_transaction_count(self, address: Address) -> U256 { + pub fn get_transaction_count(&self, address: Address) -> U256 { self.transaction_count.get(&address).cloned().unwrap_or(U256::from(0)) } /// Returns the cached balance for `address` from the DB cache, if the account is present. - pub fn get_balance(self, address: Address) -> Option { - let Some(account) = self.db_cache.accounts.get(&address) else { - return None; - }; - - Some(account.info.balance) + pub fn get_balance(&self, address: Address) -> Option { + self.db_cache.accounts.get(&address).map(|account| account.info.balance) } - /// Convert current unsealed block into RpcBlock - pub fn to_block(&self, full: bool) -> RpcBlock { - let last_frag_number = match self.frags.last() { - Some(frag) => (frag.block_number), - None => 0, - }; - let header = Header { + /// Return a decoded header snapshot derived from the current env + local counters. + pub fn get_header(&self) -> Header { + Header { parent_hash: self.env.parent_hash, ommers_hash: Default::default(), beneficiary: self.env.beneficiary, @@ -224,7 +304,7 @@ impl UnsealedBlock { receipts_root: B256::ZERO, logs_bloom: Default::default(), difficulty: self.env.difficulty, - number: last_frag_number, + number: self.env.number, gas_limit: self.env.gas_limit, gas_used: self.cumulative_gas_used, timestamp: self.env.timestamp, @@ -237,9 +317,35 @@ impl UnsealedBlock { excess_blob_gas: Some(0), parent_beacon_block_root: Some(self.env.parent_beacon_block_root), requests_hash: None, - }; + } + } + + /// Append a fully materialized transaction to the RPC `transactions` list. + pub(crate) fn with_transaction(&mut self, transaction: Transaction) -> &Self { + self.transactions.push(transaction); + self + } + + /// Insert/replace the receipt for `tx_hash` in the per-tx receipt map. + pub(crate) fn with_transaction_receipt(&mut self, tx_hash: B256, receipt: OpTransactionReceipt) -> &Self { + self.transaction_receipts.insert(tx_hash, receipt); + self + } + + /// Increment the locally tracked nonce for `sender` after accepting a tx. + pub(crate) fn increment_nonce(&mut self, sender: Address) -> &Self { + let zero = U256::from(0); + let current_count = self.transaction_count.get(&sender).unwrap_or(&zero); + + _ = self.transaction_count.insert(sender, *current_count + U256::from(1)); + self + } + + /// Convert current unsealed block into RpcBlock. + pub fn to_rpc_block(&self, full: bool) -> RpcBlock { + let header = self.get_header(); let header = header.clone().seal_slow(); - let block_transactions = self.transaction.clone(); + let block_transactions = self.transactions.clone(); let transactions = if full { BlockTransactions::Full(block_transactions) @@ -255,4 +361,51 @@ impl UnsealedBlock { withdrawals: None, } } + + pub fn to_op_block(&self, withdrawals_hash: Option) -> Result { + // Decode EIP-2718 tx bytes -> OpTransactionSigned + let tx_list: Vec = self + .frags + .iter() + .enumerate() + .flat_map(|(frag_idx, frag)| { + frag.txs.iter().enumerate().map(move |(tx_idx, tx_bytes)| { + OpTxEnvelope::decode_2718(&mut tx_bytes.as_ref()).map_err(|e| { + UnsealedBlockError::Failed(format!("decode tx failed (frag={frag_idx} tx={tx_idx}): {e}")) + }) + }) + }) + .collect::, UnsealedBlockError>>()?; + + let requests_hash = self.is_prague.then_some(EMPTY_REQUESTS_HASH); + + let extra_data: Bytes = Bytes::copy_from_slice(self.env.extra_data.as_ref()); + let header = Header { + parent_hash: self.env.parent_hash, + ommers_hash: Default::default(), + beneficiary: self.env.beneficiary, + state_root: B256::ZERO, + transactions_root: B256::ZERO, + receipts_root: B256::ZERO, + logs_bloom: Default::default(), + difficulty: self.env.difficulty, + number: self.env.number, + gas_limit: self.env.gas_limit, + gas_used: self.cumulative_gas_used, + timestamp: self.env.timestamp, + extra_data, + mix_hash: self.env.prevrandao, + nonce: Default::default(), + base_fee_per_gas: Some(self.env.basefee), + withdrawals_root: withdrawals_hash, + blob_gas_used: Some(self.cumulative_blob_gas_used), + excess_blob_gas: Some(0), + parent_beacon_block_root: Some(self.env.parent_beacon_block_root), + requests_hash, + }; + + let body = BlockBody { transactions: tx_list, ommers: vec![], withdrawals: None }; + + Ok(reth_optimism_primitives::OpBlock::new(header, body)) + } } From bfde721e09a2197a6787aee866b9d074b359a683 Mon Sep 17 00:00:00 2001 From: Jonas Bostoen Date: Fri, 19 Dec 2025 17:27:25 +0100 Subject: [PATCH 19/25] docs(reth): comments Co-authored-by: Karrq --- based/crates/reth/src/exec.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/based/crates/reth/src/exec.rs b/based/crates/reth/src/exec.rs index ff71cfc2c..db58c796a 100644 --- a/based/crates/reth/src/exec.rs +++ b/based/crates/reth/src/exec.rs @@ -185,6 +185,7 @@ where let mut next_log_index = 0usize; let mut receipts: Vec = Vec::new(); + // Simulate the transactions added by the frag for (idx, transaction) in block.body.transactions.iter().enumerate() { let tx_hash = transaction.tx_hash(); let sender = transaction.recover_signer()?; From dff25c3b41d681644ef9aaa8596474b142c1a8e0 Mon Sep 17 00:00:00 2001 From: Ki Ageng Satria Pamungkas Date: Wed, 24 Dec 2025 17:45:55 +0700 Subject: [PATCH 20/25] fix: get block number use canonical instead of unsealed block state --- based/crates/reth/src/api/eth.rs | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/based/crates/reth/src/api/eth.rs b/based/crates/reth/src/api/eth.rs index 6e8835183..69265a8ae 100644 --- a/based/crates/reth/src/api/eth.rs +++ b/based/crates/reth/src/api/eth.rs @@ -120,13 +120,7 @@ where block_number = ?number ); - if self.use_unsealed_state(&number) && - let Some(unsealed_block) = self.unsealed_block.load_full() - { - Ok(Some(unsealed_block.to_rpc_block(full))) - } else { - EthBlocks::rpc_block(&self.canonical, number.into(), full).await.map_err(Into::into) - } + EthBlocks::rpc_block(&self.canonical, number.into(), full).await.map_err(Into::into) } async fn get_transaction_receipt(&self, tx_hash: TxHash) -> RpcResult>> { From a15e79ba08a711edb431b183f13d14f15c958690 Mon Sep 17 00:00:00 2001 From: Francesco Dainese Date: Fri, 2 Jan 2026 21:41:08 +0100 Subject: [PATCH 21/25] docs: remove flashblocks --- based/crates/reth/src/api/eth.rs | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/based/crates/reth/src/api/eth.rs b/based/crates/reth/src/api/eth.rs index 69265a8ae..789611498 100644 --- a/based/crates/reth/src/api/eth.rs +++ b/based/crates/reth/src/api/eth.rs @@ -61,7 +61,7 @@ pub trait EthApi { timeout_ms: Option, ) -> RpcResult>; - /// Executes a call with flashblock state support. + /// Executes a call with unsealed state support. #[method(name = "call")] async fn call( &self, @@ -71,7 +71,7 @@ pub trait EthApi { block_overrides: Option>, ) -> RpcResult; - /// Estimates gas with flashblock state support. + /// Estimates gas with unsealed state support. #[method(name = "estimateGas")] async fn estimate_gas( &self, @@ -80,7 +80,7 @@ pub trait EthApi { overrides: Option, ) -> RpcResult; - /// Simulates transactions with flashblock state support. + /// Simulates transactions with unsealed state support. #[method(name = "simulateV1")] async fn simulate_v1( &self, @@ -88,7 +88,7 @@ pub trait EthApi { block_number: Option, ) -> RpcResult>>>; - /// Returns logs matching the filter, including pending flashblock logs. + /// Returns logs matching the filter, including unsealed logs. #[method(name = "getLogs")] async fn get_logs(&self, filter: Filter) -> RpcResult>; } @@ -187,7 +187,7 @@ where tx_hash = %tx_hash ); - // Check canonical chain first to avoid race condition where flashblocks + // Check canonical chain first to avoid race condition where unsealed // state hasn't been cleared yet after canonical block commit if let Some(canonical_tx) = EthTransactions::transaction_by_hash(&self.canonical, tx_hash) .await? @@ -357,7 +357,7 @@ where pending_overrides.state = unsealed_block.get_state_overrides(); } - // Prepend flashblocks pending overrides to the block state calls + // Prepend unsealed overrides to the block state calls let mut block_state_calls: Vec> = Vec::new(); for sim_block in opts.block_state_calls { let mut state_overrides_builder = From c29894112c207d84eb8770eaf987ebb462fd5013 Mon Sep 17 00:00:00 2001 From: Francesco Dainese Date: Fri, 2 Jan 2026 21:46:42 +0100 Subject: [PATCH 22/25] feat(docker): reth-node --- based/crates/reth/Cargo.toml | 4 ++++ based/crates/reth/src/bin/reth-node.rs | 4 ++++ based/reth-node.Dockerfile | 27 ++++++++++++++++++++++++++ 3 files changed, 35 insertions(+) create mode 100644 based/crates/reth/src/bin/reth-node.rs create mode 100644 based/reth-node.Dockerfile diff --git a/based/crates/reth/Cargo.toml b/based/crates/reth/Cargo.toml index e594d714b..2075d3f1d 100644 --- a/based/crates/reth/Cargo.toml +++ b/based/crates/reth/Cargo.toml @@ -5,6 +5,10 @@ repository.workspace = true rust-version.workspace = true version.workspace = true +[[bin]] +name = "reth-node" +path = "src/bin/reth-node.rs" + [dependencies] alloy-consensus.workspace = true alloy-eips.workspace = true diff --git a/based/crates/reth/src/bin/reth-node.rs b/based/crates/reth/src/bin/reth-node.rs new file mode 100644 index 000000000..71bbd1530 --- /dev/null +++ b/based/crates/reth/src/bin/reth-node.rs @@ -0,0 +1,4 @@ +fn main() -> eyre::Result<()> { + based_op_reth::run() +} + diff --git a/based/reth-node.Dockerfile b/based/reth-node.Dockerfile new file mode 100644 index 000000000..a11e7e573 --- /dev/null +++ b/based/reth-node.Dockerfile @@ -0,0 +1,27 @@ +FROM lukemathwalker/cargo-chef:latest-rust-1 AS chef +ARG TARGETPLATFORM +ARG BUILDPLATFORM +WORKDIR /app + +RUN apt-get update && apt-get install -y clang cmake pkg-config + +FROM chef AS planner +COPY . . +RUN cargo chef prepare --recipe-path recipe.json + +FROM chef AS builder +COPY --from=planner /app/recipe.json recipe.json +RUN cargo chef cook --release --recipe-path recipe.json + +COPY . . +RUN cargo build --release -p based-op-reth --bin reth-node + +FROM debian:stable-slim AS runtime +WORKDIR /app + +RUN apt-get update +RUN apt-get install -y openssl ca-certificates libssl3 libssl-dev + +COPY --from=builder /app/target/release/reth-node /usr/local/bin +ENTRYPOINT ["/usr/local/bin/reth-node"] + From 3702a95f878c977ec60bf6d7e8c3b475126183d1 Mon Sep 17 00:00:00 2001 From: Francesco Dainese Date: Mon, 5 Jan 2026 15:35:43 +0100 Subject: [PATCH 23/25] feat(compose): added compose with reth node --- follower_node/compose.reth.yml | 110 +++++++++++++++++++++++++++++++++ 1 file changed, 110 insertions(+) create mode 100644 follower_node/compose.reth.yml diff --git a/follower_node/compose.reth.yml b/follower_node/compose.reth.yml new file mode 100644 index 000000000..5535ed391 --- /dev/null +++ b/follower_node/compose.reth.yml @@ -0,0 +1,110 @@ +services: + based-op-geth: + image: local_based_reth:latest + container_name: based-op-geth + entrypoint: ["/bin/sh", "-c"] + command: + - | + # 1) if this directory lacks the reth database, initialize it + if [ ! -d /data/reth/db ]; then + echo ">>> initializing reth datadir…" + reth-node init \ + --datadir=/data/reth \ + --chain=/config/genesis.json + fi + + # 2) then exec the real reth + exec reth-node node \ + --datadir=/data/reth \ + --chain=/config/genesis.json \ + --http \ + --http.addr=0.0.0.0 \ + --http.port=$OP_GETH_RPC_PORT \ + --http.corsdomain="*" \ + --http.api="admin,engine,net,eth,web3,debug,miner,txpool" \ + --ws \ + --ws.addr=0.0.0.0 \ + --ws.port=$OP_GETH_WS_PORT \ + --ws.api="admin,engine,net,eth,web3,debug,miner,txpool" \ + --ws.origins="*" \ + --authrpc.port=$OP_GETH_ENGINE_RPC_PORT \ + --authrpc.addr=0.0.0.0 \ + --authrpc.jwtsecret=/config/jwt \ + --discovery.port=$OP_GETH_GOSSIP_PORT \ + --port=$OP_GETH_GOSSIP_PORT \ + --bootnodes=$MAIN_OP_GETH_ENODE \ + --rollup.sequencer-http=$TXPROXY \ + --metrics=0.0.0.0:8010 + labels: + - logs=enabled + - service=based-op-geth + volumes: + - ./data/reth:/data/reth + - ./config:/config + restart: unless-stopped + network_mode: "host" + + based-op-node: + image: ghcr.io/gattaca-com/based-optimism/based-op-node:latest + pull_policy: always + container_name: based-op-node + network_mode: "host" + command: + - op-node + - --l2=http://0.0.0.0:$OP_GETH_ENGINE_RPC_PORT + - --l2.jwt-secret=/config/jwt + - --verifier.l1-confs=1 + - --rollup.config=/config/rollup.json + - --rpc.addr=0.0.0.0 + - --rpc.port=8547 + - --rpc.enable-admin + - --l1=$L1_RPC_URL + - --l1.rpckind=standard + - --l1.beacon=$L1_BEACON_RPC_URL + - --p2p.advertise.ip=$OP_NODE_GOSSIP_IP + - --p2p.advertise.tcp=$OP_NODE_GOSSIP_PORT + - --p2p.advertise.udp=$OP_NODE_GOSSIP_PORT + - --p2p.listen.ip=0.0.0.0 + - --p2p.listen.tcp=$OP_NODE_GOSSIP_PORT + - --p2p.listen.udp=$OP_NODE_GOSSIP_PORT + - --safedb.path=/data/op-node/op-node-beacon-data + - --p2p.static=$MAIN_OP_NODE_GOSSIP_STATIC + - --rpc.enable-based + - --registry=$PORTAL + - --p2p.bootnodes=$MAIN_OP_NODE_ENR + - --syncmode=execution-layer + - --metrics.enabled=true + - --metrics.addr=0.0.0.0 + - --metrics.port=8011 + volumes: + - ./data/node:/data/op-node + - ./config:/config + depends_on: + - based-op-geth + restart: unless-stopped + labels: + - logs=enabled + - service=based-op-node + + based-gateway: + image: ghcr.io/gattaca-com/based-op/based-gateway:latest + pull_policy: always + container_name: based-gateway + command: + - --rpc.port=$GATEWAY_PORT + - --rpc.host=0.0.0.0 + - --chain=/config/genesis.json + - --db.datadir=/data/gateway + - --eth_client.url=$PORTAL + - --rpc.jwt=/config/jwt + - --gossip.signer_private_key=$GATEWAY_SEQUENCING_KEY + - --gossip.root_peer_url=http://0.0.0.0:8547 + - --log.dir=/var/log/app + volumes: + - ./config:/config + - ./data/gateway:/data/gateway + - /tmp:/tmp + - /dev/shm:/dev/shm + - /var/log/containers/based-op/based-gateway:/var/log/app + network_mode: "host" + restart: unless-stopped From 459e949e5a43a426d197b770bfdcd443a3754c36 Mon Sep 17 00:00:00 2001 From: Francesco Dainese Date: Mon, 5 Jan 2026 15:38:24 +0100 Subject: [PATCH 24/25] chore: fmt --- based/crates/reth/src/bin/reth-node.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/based/crates/reth/src/bin/reth-node.rs b/based/crates/reth/src/bin/reth-node.rs index 71bbd1530..d618a48cf 100644 --- a/based/crates/reth/src/bin/reth-node.rs +++ b/based/crates/reth/src/bin/reth-node.rs @@ -1,4 +1,3 @@ fn main() -> eyre::Result<()> { based_op_reth::run() } - From e5557dd50a8f17e03414c30a23637402d1405925 Mon Sep 17 00:00:00 2001 From: Francesco Dainese Date: Tue, 6 Jan 2026 09:42:28 +0100 Subject: [PATCH 25/25] fix: relax RPC api --- follower_node/compose.reth.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/follower_node/compose.reth.yml b/follower_node/compose.reth.yml index 5535ed391..6e4bfd999 100644 --- a/follower_node/compose.reth.yml +++ b/follower_node/compose.reth.yml @@ -21,11 +21,11 @@ services: --http.addr=0.0.0.0 \ --http.port=$OP_GETH_RPC_PORT \ --http.corsdomain="*" \ - --http.api="admin,engine,net,eth,web3,debug,miner,txpool" \ + --http.api="all" \ --ws \ --ws.addr=0.0.0.0 \ --ws.port=$OP_GETH_WS_PORT \ - --ws.api="admin,engine,net,eth,web3,debug,miner,txpool" \ + --ws.api="all" \ --ws.origins="*" \ --authrpc.port=$OP_GETH_ENGINE_RPC_PORT \ --authrpc.addr=0.0.0.0 \