Skip to content
This repository was archived by the owner on Jan 16, 2026. It is now read-only.
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: 1 addition & 0 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

78 changes: 42 additions & 36 deletions crates/supervisor/core/src/rpc/server.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,12 +5,12 @@
use alloy_primitives::{B256, ChainId, map::HashMap};
use async_trait::async_trait;
use jsonrpsee::{core::RpcResult, types::ErrorObject};
use kona_interop::{
DependencySet, DerivedIdPair, ExecutingDescriptor, SafetyLevel, SuperRootOutput,
};
use kona_interop::{DependencySet, DerivedIdPair, ExecutingDescriptor, SafetyLevel};
use kona_protocol::BlockInfo;
use kona_supervisor_rpc::{SupervisorApiServer, SupervisorChainSyncStatus, SupervisorSyncStatus};
use kona_supervisor_types::{HexChainId, SuperHead};
use kona_supervisor_rpc::{
SuperRootOutputRpc, SupervisorApiServer, SupervisorChainSyncStatus, SupervisorSyncStatus,
};
use kona_supervisor_types::{HexStringU64, SuperHead};
use std::sync::Arc;
use tracing::{trace, warn};

Expand Down Expand Up @@ -39,7 +39,7 @@
{
async fn cross_derived_to_source(
&self,
chain_id_hex: HexChainId,
chain_id_hex: HexStringU64,
derived: BlockNumHash,
) -> RpcResult<BlockInfo> {
let chain_id = ChainId::from(chain_id_hex);
Expand Down Expand Up @@ -71,7 +71,7 @@
)
}

async fn local_unsafe(&self, chain_id_hex: HexChainId) -> RpcResult<BlockNumHash> {
async fn local_unsafe(&self, chain_id_hex: HexStringU64) -> RpcResult<BlockNumHash> {

Check warning on line 74 in crates/supervisor/core/src/rpc/server.rs

View check run for this annotation

Codecov / codecov/patch

crates/supervisor/core/src/rpc/server.rs#L74

Added line #L74 was not covered by tests
let chain_id = ChainId::from(chain_id_hex);
crate::observe_rpc_call!(
"local_unsafe",
Expand Down Expand Up @@ -101,7 +101,7 @@
)
}

async fn cross_safe(&self, chain_id_hex: HexChainId) -> RpcResult<DerivedIdPair> {
async fn cross_safe(&self, chain_id_hex: HexStringU64) -> RpcResult<DerivedIdPair> {

Check warning on line 104 in crates/supervisor/core/src/rpc/server.rs

View check run for this annotation

Codecov / codecov/patch

crates/supervisor/core/src/rpc/server.rs#L104

Added line #L104 was not covered by tests
let chain_id = ChainId::from(chain_id_hex);
crate::observe_rpc_call!(
"cross_safe",
Expand All @@ -120,7 +120,7 @@
)
}

async fn finalized(&self, chain_id_hex: HexChainId) -> RpcResult<BlockNumHash> {
async fn finalized(&self, chain_id_hex: HexStringU64) -> RpcResult<BlockNumHash> {

Check warning on line 123 in crates/supervisor/core/src/rpc/server.rs

View check run for this annotation

Codecov / codecov/patch

crates/supervisor/core/src/rpc/server.rs#L123

Added line #L123 was not covered by tests
let chain_id = ChainId::from(chain_id_hex);
crate::observe_rpc_call!(
"finalized",
Expand All @@ -147,22 +147,27 @@
)
}

async fn super_root_at_timestamp(&self, timestamp: u64) -> RpcResult<SuperRootOutput> {
async fn super_root_at_timestamp(
&self,
timestamp_hex: HexStringU64,
) -> RpcResult<SuperRootOutputRpc> {

Check warning on line 153 in crates/supervisor/core/src/rpc/server.rs

View check run for this annotation

Codecov / codecov/patch

crates/supervisor/core/src/rpc/server.rs#L153

Added line #L153 was not covered by tests
crate::observe_rpc_call!(
"super_root_at_timestamp",
async {
trace!(target: "supervisor_rpc",
%timestamp,
"Received super_root_at_timestamp request"
);

self.supervisor.super_root_at_timestamp(timestamp)
.await
.map_err(|err| {
warn!(target: "supervisor_rpc", %err, "Error from core supervisor super_root_at_timestamp");
ErrorObject::from(err)
})
}.await)
let timestamp = u64::from(timestamp_hex);
trace!(target: "supervisor_rpc",

Check warning on line 158 in crates/supervisor/core/src/rpc/server.rs

View check run for this annotation

Codecov / codecov/patch

crates/supervisor/core/src/rpc/server.rs#L157-L158

Added lines #L157 - L158 were not covered by tests
%timestamp,
"Received super_root_at_timestamp request"

Check warning on line 160 in crates/supervisor/core/src/rpc/server.rs

View check run for this annotation

Codecov / codecov/patch

crates/supervisor/core/src/rpc/server.rs#L160

Added line #L160 was not covered by tests
);

self.supervisor.super_root_at_timestamp(timestamp)
.await
.map_err(|err| {
warn!(target: "supervisor_rpc", %err, "Error from core supervisor super_root_at_timestamp");
ErrorObject::from(err)
})
}.await
)

Check warning on line 170 in crates/supervisor/core/src/rpc/server.rs

View check run for this annotation

Codecov / codecov/patch

crates/supervisor/core/src/rpc/server.rs#L163-L170

Added lines #L163 - L170 were not covered by tests
}

async fn check_access_list(
Expand All @@ -175,19 +180,20 @@
crate::observe_rpc_call!(
"check_access_list",
async {
trace!(target: "supervisor_rpc",
num_inbox_entries = inbox_entries.len(),
?min_safety,
?executing_descriptor,
"Received check_access_list request",
);
self.supervisor
.check_access_list(inbox_entries, min_safety, executing_descriptor)
.map_err(|err| {
warn!(target: "supervisor_rpc", %err, "Error from core supervisor check_access_list");
ErrorObject::from(err)
})
}.await)
trace!(target: "supervisor_rpc",
num_inbox_entries = inbox_entries.len(),
?min_safety,
?executing_descriptor,
"Received check_access_list request",

Check warning on line 187 in crates/supervisor/core/src/rpc/server.rs

View check run for this annotation

Codecov / codecov/patch

crates/supervisor/core/src/rpc/server.rs#L183-L187

Added lines #L183 - L187 were not covered by tests
);
self.supervisor
.check_access_list(inbox_entries, min_safety, executing_descriptor)
.map_err(|err| {
warn!(target: "supervisor_rpc", %err, "Error from core supervisor check_access_list");
ErrorObject::from(err)
})
}.await
)

Check warning on line 196 in crates/supervisor/core/src/rpc/server.rs

View check run for this annotation

Codecov / codecov/patch

crates/supervisor/core/src/rpc/server.rs#L189-L196

Added lines #L189 - L196 were not covered by tests
}

async fn sync_status(&self) -> RpcResult<SupervisorSyncStatus> {
Expand Down Expand Up @@ -361,7 +367,7 @@
async fn super_root_at_timestamp(
&self,
_timestamp: u64,
) -> Result<SuperRootOutput, SupervisorError> {
) -> Result<SuperRootOutputRpc, SupervisorError> {

Check warning on line 370 in crates/supervisor/core/src/rpc/server.rs

View check run for this annotation

Codecov / codecov/patch

crates/supervisor/core/src/rpc/server.rs#L370

Added line #L370 was not covered by tests
unimplemented!()
}
}
Expand Down
22 changes: 10 additions & 12 deletions crates/supervisor/core/src/supervisor.rs
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,11 @@
use async_trait::async_trait;
use core::fmt::Debug;
use kona_interop::{
ChainRootInfo, DependencySet, ExecutingDescriptor, OutputRootWithChain, SUPER_ROOT_VERSION,
SafetyLevel, SuperRoot, SuperRootOutput,
DependencySet, ExecutingDescriptor, OutputRootWithChain, SUPER_ROOT_VERSION, SafetyLevel,
SuperRoot,
};
use kona_protocol::BlockInfo;
use kona_supervisor_rpc::{ChainRootInfoRpc, SuperRootOutputRpc};
use kona_supervisor_storage::{
ChainDb, ChainDbFactory, DerivationStorageReader, DerivationStorageWriter, FinalizedL1Storage,
HeadRefStorageReader, LogStorageReader, LogStorageWriter,
Expand Down Expand Up @@ -86,7 +87,7 @@
async fn super_root_at_timestamp(
&self,
timestamp: u64,
) -> Result<SuperRootOutput, SupervisorError>;
) -> Result<SuperRootOutputRpc, SupervisorError>;

/// Verifies if an access-list references only valid messages
fn check_access_list(
Expand Down Expand Up @@ -393,12 +394,12 @@
async fn super_root_at_timestamp(
&self,
timestamp: u64,
) -> Result<SuperRootOutput, SupervisorError> {
) -> Result<SuperRootOutputRpc, SupervisorError> {

Check warning on line 397 in crates/supervisor/core/src/supervisor.rs

View check run for this annotation

Codecov / codecov/patch

crates/supervisor/core/src/supervisor.rs#L397

Added line #L397 was not covered by tests
let mut chain_ids = self.config.dependency_set.dependencies.keys().collect::<Vec<_>>();
// Sorting chain ids for deterministic super root hash
chain_ids.sort();

let mut chain_infos = Vec::<ChainRootInfo>::with_capacity(chain_ids.len());
let mut chain_infos = Vec::<ChainRootInfoRpc>::with_capacity(chain_ids.len());

Check warning on line 402 in crates/supervisor/core/src/supervisor.rs

View check run for this annotation

Codecov / codecov/patch

crates/supervisor/core/src/supervisor.rs#L402

Added line #L402 was not covered by tests
let mut super_root_chains = Vec::<OutputRootWithChain>::with_capacity(chain_ids.len());
let mut cross_safe_source = BlockNumHash::default();

Expand All @@ -413,7 +414,7 @@
serde_json::to_string(&pending_output_v0).unwrap().as_bytes(),
);

chain_infos.push(ChainRootInfo {
chain_infos.push(ChainRootInfoRpc {

Check warning on line 417 in crates/supervisor/core/src/supervisor.rs

View check run for this annotation

Codecov / codecov/patch

crates/supervisor/core/src/supervisor.rs#L417

Added line #L417 was not covered by tests
chain_id: *id,
canonical: canonical_root,
pending: pending_output_v0_bytes,
Expand All @@ -424,11 +425,9 @@

let l2_block = managed_node.l2_block_ref_by_timestamp(timestamp).await?;
let source = self
.get_db(*id)?
.derived_to_source(l2_block.id())
.map_err(|err| {
.derived_to_source_block(*id, l2_block.id())
.inspect_err(|err| {

Check warning on line 429 in crates/supervisor/core/src/supervisor.rs

View check run for this annotation

Codecov / codecov/patch

crates/supervisor/core/src/supervisor.rs#L428-L429

Added lines #L428 - L429 were not covered by tests
error!(target: "supervisor_service", %id, %err, "Failed to get derived to source block for chain");
SpecError::from(err)
})?;

if cross_safe_source.number == 0 || cross_safe_source.number < source.number {
Expand All @@ -437,10 +436,9 @@
}

let super_root = SuperRoot { timestamp, output_roots: super_root_chains };

let super_root_hash = super_root.hash();

Ok(SuperRootOutput {
Ok(SuperRootOutputRpc {

Check warning on line 441 in crates/supervisor/core/src/supervisor.rs

View check run for this annotation

Codecov / codecov/patch

crates/supervisor/core/src/supervisor.rs#L441

Added line #L441 was not covered by tests
cross_safe_derived_from: cross_safe_source,
timestamp,
super_root: super_root_hash,
Expand Down
5 changes: 2 additions & 3 deletions crates/supervisor/rpc/Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -23,16 +23,15 @@ kona-supervisor-types.workspace = true

# jsonrpsee
serde.workspace = true
serde_json.workspace = true
jsonrpsee = { workspace = true, optional = true, features = ["macros", "server"] }

# Alloy
alloy-eips.workspace = true
alloy-serde.workspace = true
alloy-primitives = { workspace = true, features = ["map", "rlp", "serde"] }
op-alloy-consensus.workspace = true

#[dev-dependencies]
serde_json.workspace = true

[features]
serde = [
"alloy-eips/serde",
Expand Down
18 changes: 10 additions & 8 deletions crates/supervisor/rpc/src/jsonrpsee.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,16 +5,15 @@ pub use jsonrpsee::{
types::{ErrorCode, ErrorObjectOwned},
};

use crate::SupervisorSyncStatus;
use crate::{SuperRootOutputRpc, SupervisorSyncStatus};
use alloy_eips::BlockNumHash;
use alloy_primitives::{B256, BlockHash, ChainId, map::HashMap};
use jsonrpsee::proc_macros::rpc;
use kona_interop::{
DependencySet, DerivedIdPair, DerivedRefPair, ExecutingDescriptor, ManagedEvent, SafetyLevel,
SuperRootOutput,
};
use kona_protocol::BlockInfo;
use kona_supervisor_types::{BlockSeal, HexChainId, OutputV0, Receipts, SubscriptionEvent};
use kona_supervisor_types::{BlockSeal, HexStringU64, OutputV0, Receipts, SubscriptionEvent};
use serde::{Deserialize, Serialize};

/// Supervisor API for interop.
Expand All @@ -28,7 +27,7 @@ pub trait SupervisorApi {
#[method(name = "crossDerivedToSource")]
async fn cross_derived_to_source(
&self,
chain_id: HexChainId,
chain_id: HexStringU64,
block_id: BlockNumHash,
) -> RpcResult<BlockInfo>;

Expand All @@ -38,23 +37,23 @@ pub trait SupervisorApi {
///
/// [`LocalUnsafe`]: SafetyLevel::LocalUnsafe
#[method(name = "localUnsafe")]
async fn local_unsafe(&self, chain_id: HexChainId) -> RpcResult<BlockNumHash>;
async fn local_unsafe(&self, chain_id: HexStringU64) -> RpcResult<BlockNumHash>;

/// Returns the [`CrossSafe`] block for given chain.
///
/// Spec: <https://github.com/ethereum-optimism/specs/blob/main/specs/interop/supervisor.md#supervisor_crosssafe>
///
/// [`CrossSafe`]: SafetyLevel::CrossSafe
#[method(name = "crossSafe")]
async fn cross_safe(&self, chain_id: HexChainId) -> RpcResult<DerivedIdPair>;
async fn cross_safe(&self, chain_id: HexStringU64) -> RpcResult<DerivedIdPair>;

/// Returns the [`Finalized`] block for the given chain.
///
/// Spec: <https://github.com/ethereum-optimism/specs/blob/main/specs/interop/supervisor.md#supervisor_finalized>
///
/// [`Finalized`]: SafetyLevel::Finalized
#[method(name = "finalized")]
async fn finalized(&self, chain_id: HexChainId) -> RpcResult<BlockNumHash>;
async fn finalized(&self, chain_id: HexStringU64) -> RpcResult<BlockNumHash>;

/// Returns the finalized L1 block that the supervisor is synced to.
///
Expand All @@ -75,7 +74,10 @@ pub trait SupervisorApi {
/// [`SuperRoot`]: kona_interop::SuperRoot
/// [`ChainRootInfo`]: kona_interop::ChainRootInfo
#[method(name = "superRootAtTimestamp")]
async fn super_root_at_timestamp(&self, timestamp: u64) -> RpcResult<SuperRootOutput>;
async fn super_root_at_timestamp(
&self,
timestamp: HexStringU64,
) -> RpcResult<SuperRootOutputRpc>;

/// Verifies if an access-list references only valid messages w.r.t. locally configured minimum
/// [`SafetyLevel`].
Expand Down
4 changes: 3 additions & 1 deletion crates/supervisor/rpc/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ pub use jsonrpsee::SupervisorApiServer;
pub use jsonrpsee::ManagedModeApiClient;

pub mod response;
pub use response::{SupervisorChainSyncStatus, SupervisorSyncStatus};
pub use response::{
ChainRootInfoRpc, SuperRootOutputRpc, SupervisorChainSyncStatus, SupervisorSyncStatus,
};

pub use kona_protocol::BlockInfo;
Loading