Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 0 additions & 1 deletion crates/rpc/src/base/mod.rs
Original file line number Diff line number Diff line change
@@ -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;
78 changes: 0 additions & 78 deletions crates/rpc/src/base/types.rs
Original file line number Diff line number Diff line change
@@ -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.
Expand All @@ -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<SubscriptionKind> {
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<SubscriptionKind> for ExtendedSubscriptionKind {
fn from(kind: SubscriptionKind) -> Self {
Self::Standard(kind)
}
}

impl From<BaseSubscriptionKind> for ExtendedSubscriptionKind {
fn from(kind: BaseSubscriptionKind) -> Self {
Self::Base(kind)
}
}

// Block metering types

/// Response for block metering RPC calls.
Expand Down
2 changes: 2 additions & 0 deletions crates/rpc/src/eth/mod.rs
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
pub(crate) mod pubsub;
pub(crate) mod rpc;
pub(crate) mod types;
Original file line number Diff line number Diff line change
Expand Up @@ -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.
///
Expand Down
81 changes: 81 additions & 0 deletions crates/rpc/src/eth/types.rs
Original file line number Diff line number Diff line change
@@ -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<SubscriptionKind> {
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<SubscriptionKind> for ExtendedSubscriptionKind {
fn from(kind: SubscriptionKind) -> Self {
Self::Standard(kind)
}
}

impl From<BaseSubscriptionKind> for ExtendedSubscriptionKind {
fn from(kind: BaseSubscriptionKind) -> Self {
Self::Base(kind)
}
}
12 changes: 6 additions & 6 deletions crates/rpc/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -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;