diff --git a/crates/rpc/src/base/mod.rs b/crates/rpc/src/base/mod.rs index 05aea14f..663ea725 100644 --- a/crates/rpc/src/base/mod.rs +++ b/crates/rpc/src/base/mod.rs @@ -1,7 +1,6 @@ pub(crate) mod block; pub(crate) mod meter; pub(crate) mod meter_rpc; -pub(crate) mod pubsub; pub(crate) mod traits; pub(crate) mod transaction_rpc; pub(crate) mod types; diff --git a/crates/rpc/src/base/types.rs b/crates/rpc/src/base/types.rs index 13b443a6..30cd3ebb 100644 --- a/crates/rpc/src/base/types.rs +++ b/crates/rpc/src/base/types.rs @@ -1,7 +1,6 @@ //! Types for the transaction status rpc use alloy_primitives::B256; -use alloy_rpc_types_eth::pubsub::SubscriptionKind; use serde::{Deserialize, Serialize}; /// The status of a transaction. @@ -20,83 +19,6 @@ pub struct TransactionStatusResponse { pub status: Status, } -/// Extended subscription kind that includes both standard Ethereum subscription types -/// and flashblocks-specific types. -/// -/// This enum encapsulates the standard [`SubscriptionKind`] from alloy and adds flashblocks -/// support, allowing `eth_subscribe` to handle both standard subscriptions (newHeads, logs, etc.) -/// and custom flashblocks subscriptions. -/// -/// By encapsulating [`SubscriptionKind`] rather than redefining its variants, we automatically -/// inherit support for any new variants added upstream, or get a compile error if the signature -/// changes. -#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] -#[serde(untagged)] -pub enum ExtendedSubscriptionKind { - /// Standard Ethereum subscription types (newHeads, logs, newPendingTransactions, syncing). - /// - /// These are proxied to reth's underlying `EthPubSub` implementation. - Standard(SubscriptionKind), - /// Base-specific subscription types for flashblocks. - Base(BaseSubscriptionKind), -} - -/// Base-specific subscription types for flashblocks. -#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] -#[serde(rename_all = "camelCase")] -pub enum BaseSubscriptionKind { - /// New flashblocks subscription. - /// - /// Fires a notification each time a new flashblock is processed, providing the current - /// pending block state. Each flashblock represents an incremental update to the pending - /// block, so multiple notifications may be emitted for the same block height as new - /// flashblocks arrive. - NewFlashblocks, - /// Pending logs subscription. - /// - /// Returns logs from flashblocks pending state that match the given filter criteria. - /// Unlike standard `logs` subscription which only includes logs from confirmed blocks, - /// this includes logs from the current pending flashblock state. - PendingLogs, - /// New flashblock transactions subscription. - /// - /// Returns transactions from flashblocks as they are sequenced, providing higher inclusion - /// confidence than standard `newPendingTransactions` which returns mempool transactions. - /// Flashblock transactions have been included by the sequencer and are effectively preconfirmed. - /// - /// Accepts an optional boolean parameter: - /// - `true`: Returns full transaction objects - /// - `false` (default): Returns only transaction hashes - NewFlashblockTransactions, -} - -impl ExtendedSubscriptionKind { - /// Returns the standard subscription kind if this is a standard subscription type. - pub const fn as_standard(&self) -> Option { - match self { - Self::Standard(kind) => Some(*kind), - Self::Base(_) => None, - } - } - - /// Returns true if this is a flashblocks-specific subscription. - pub const fn is_flashblocks(&self) -> bool { - matches!(self, Self::Base(_)) - } -} - -impl From for ExtendedSubscriptionKind { - fn from(kind: SubscriptionKind) -> Self { - Self::Standard(kind) - } -} - -impl From for ExtendedSubscriptionKind { - fn from(kind: BaseSubscriptionKind) -> Self { - Self::Base(kind) - } -} - // Block metering types /// Response for block metering RPC calls. diff --git a/crates/rpc/src/eth/mod.rs b/crates/rpc/src/eth/mod.rs index b83049fe..2a734687 100644 --- a/crates/rpc/src/eth/mod.rs +++ b/crates/rpc/src/eth/mod.rs @@ -1 +1,3 @@ +pub(crate) mod pubsub; pub(crate) mod rpc; +pub(crate) mod types; diff --git a/crates/rpc/src/base/pubsub.rs b/crates/rpc/src/eth/pubsub.rs similarity index 99% rename from crates/rpc/src/base/pubsub.rs rename to crates/rpc/src/eth/pubsub.rs index e461e35f..624af86d 100644 --- a/crates/rpc/src/base/pubsub.rs +++ b/crates/rpc/src/eth/pubsub.rs @@ -26,7 +26,7 @@ use serde::Serialize; use tokio_stream::{Stream, StreamExt, wrappers::BroadcastStream}; use tracing::error; -use crate::{BaseSubscriptionKind, ExtendedSubscriptionKind}; +use crate::eth::types::{BaseSubscriptionKind, ExtendedSubscriptionKind}; /// Eth pub-sub RPC extension for flashblocks and standard subscriptions. /// diff --git a/crates/rpc/src/eth/types.rs b/crates/rpc/src/eth/types.rs new file mode 100644 index 00000000..5230b0b6 --- /dev/null +++ b/crates/rpc/src/eth/types.rs @@ -0,0 +1,81 @@ +//! Subscription types for the `eth_` PubSub RPC extension + +use alloy_rpc_types_eth::pubsub::SubscriptionKind; +use serde::{Deserialize, Serialize}; + +/// Extended subscription kind that includes both standard Ethereum subscription types +/// and flashblocks-specific types. +/// +/// This enum encapsulates the standard [`SubscriptionKind`] from alloy and adds flashblocks +/// support, allowing `eth_subscribe` to handle both standard subscriptions (newHeads, logs, etc.) +/// and custom flashblocks subscriptions. +/// +/// By encapsulating [`SubscriptionKind`] rather than redefining its variants, we automatically +/// inherit support for any new variants added upstream, or get a compile error if the signature +/// changes. +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] +#[serde(untagged)] +pub enum ExtendedSubscriptionKind { + /// Standard Ethereum subscription types (newHeads, logs, newPendingTransactions, syncing). + /// + /// These are proxied to reth's underlying `EthPubSub` implementation. + Standard(SubscriptionKind), + /// Base-specific subscription types for flashblocks. + Base(BaseSubscriptionKind), +} + +/// Base-specific subscription types for flashblocks. +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] +#[serde(rename_all = "camelCase")] +pub enum BaseSubscriptionKind { + /// New flashblocks subscription. + /// + /// Fires a notification each time a new flashblock is processed, providing the current + /// pending block state. Each flashblock represents an incremental update to the pending + /// block, so multiple notifications may be emitted for the same block height as new + /// flashblocks arrive. + NewFlashblocks, + /// Pending logs subscription. + /// + /// Returns logs from flashblocks pending state that match the given filter criteria. + /// Unlike standard `logs` subscription which only includes logs from confirmed blocks, + /// this includes logs from the current pending flashblock state. + PendingLogs, + /// New flashblock transactions subscription. + /// + /// Returns transactions from flashblocks as they are sequenced, providing higher inclusion + /// confidence than standard `newPendingTransactions` which returns mempool transactions. + /// Flashblock transactions have been included by the sequencer and are effectively preconfirmed. + /// + /// Accepts an optional boolean parameter: + /// - `true`: Returns full transaction objects + /// - `false` (default): Returns only transaction hashes + NewFlashblockTransactions, +} + +impl ExtendedSubscriptionKind { + /// Returns the standard subscription kind if this is a standard subscription type. + pub const fn as_standard(&self) -> Option { + match self { + Self::Standard(kind) => Some(*kind), + Self::Base(_) => None, + } + } + + /// Returns true if this is a flashblocks-specific subscription. + pub const fn is_flashblocks(&self) -> bool { + matches!(self, Self::Base(_)) + } +} + +impl From for ExtendedSubscriptionKind { + fn from(kind: SubscriptionKind) -> Self { + Self::Standard(kind) + } +} + +impl From for ExtendedSubscriptionKind { + fn from(kind: BaseSubscriptionKind) -> Self { + Self::Base(kind) + } +} diff --git a/crates/rpc/src/lib.rs b/crates/rpc/src/lib.rs index 6f839e5d..643edf05 100644 --- a/crates/rpc/src/lib.rs +++ b/crates/rpc/src/lib.rs @@ -11,16 +11,16 @@ pub use base::{ block::meter_block, meter::meter_bundle, meter_rpc::MeteringApiImpl, - pubsub::{EthPubSub, EthPubSubApiServer}, traits::{MeteringApiServer, TransactionStatusApiServer}, transaction_rpc::TransactionStatusApiImpl, - types::{ - BaseSubscriptionKind, ExtendedSubscriptionKind, MeterBlockResponse, MeterBlockTransactions, - Status, TransactionStatusResponse, - }, + types::{MeterBlockResponse, MeterBlockTransactions, Status, TransactionStatusResponse}, }; mod eth; -pub use eth::rpc::{EthApiExt, EthApiOverrideServer}; +pub use eth::{ + pubsub::{EthPubSub, EthPubSubApiServer}, + rpc::{EthApiExt, EthApiOverrideServer}, + types::{BaseSubscriptionKind, ExtendedSubscriptionKind}, +}; mod metrics;