diff --git a/Cargo.lock b/Cargo.lock index b9ac3d8..d4dd50f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -55,9 +55,9 @@ dependencies = [ [[package]] name = "alloy-consensus" -version = "0.14.0" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2179ba839ac532f50279f5da2a6c5047f791f03f6f808b4dfab11327b97902f" +checksum = "e9835a7b6216cb8118323581e58a18b1a5014fce55ce718635aaea7fa07bd700" dependencies = [ "alloy-eips", "alloy-primitives", @@ -71,6 +71,7 @@ dependencies = [ "k256", "once_cell", "rand 0.8.5", + "secp256k1", "serde", "serde_with", "thiserror 2.0.12", @@ -78,9 +79,9 @@ dependencies = [ [[package]] name = "alloy-consensus-any" -version = "0.14.0" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aec6f67bdc62aa277e0ec13c1b1fb396c8a62b65c8e9bd8c1d3583cc6d1a8dd3" +checksum = "621e9f7d76ed95d21825286b180fcb89895d34244e41c89714da6d70398a16bc" dependencies = [ "alloy-consensus", "alloy-eips", @@ -128,9 +129,9 @@ dependencies = [ [[package]] name = "alloy-eips" -version = "0.14.0" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "609515c1955b33af3d78d26357540f68c5551a90ef58fd53def04f2aa074ec43" +checksum = "90fc566136b705991072f8f79762525e14f0ca39c38d45b034944770cb6c6b67" dependencies = [ "alloy-eip2124", "alloy-eip2930", @@ -162,9 +163,9 @@ dependencies = [ [[package]] name = "alloy-network-primitives" -version = "0.14.0" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "498f2ee2eef38a6db0fc810c7bf7daebdf5f2fa8d04adb8bd53e54e91ddbdea3" +checksum = "583c6fb35478d017304f4e9188daaebe5f206d44c77dbba749158427a50fdafc" dependencies = [ "alloy-consensus", "alloy-eips", @@ -225,9 +226,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-engine" -version = "0.14.0" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4235d79af20fe5583ca26096258fe9307571a345745c433cfd8c91b41aa2611e" +checksum = "53bc248ac9ba1e521096166020ddda953ba9420fc5a6466ad0811264fe88b677" dependencies = [ "alloy-consensus", "alloy-eips", @@ -245,9 +246,9 @@ dependencies = [ [[package]] name = "alloy-rpc-types-eth" -version = "0.14.0" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2a9f64e0f69cfb6029e2a044519a1bdd44ce9fc334d5315a7b9837f7a6748e5" +checksum = "0d2c0dad584b1556528ca651f4ae17bef82734b499ccfcee69f117fea66c3293" dependencies = [ "alloy-consensus", "alloy-consensus-any", @@ -265,9 +266,9 @@ dependencies = [ [[package]] name = "alloy-serde" -version = "0.14.0" +version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4dba6ff08916bc0a9cbba121ce21f67c0b554c39cf174bc7b9df6c651bd3c3b" +checksum = "a8c34ffc38f543bfdceed8c1fa5253fa5131455bb3654976be4cc3a4ae6d61f4" dependencies = [ "alloy-primitives", "serde", @@ -810,6 +811,22 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" +[[package]] +name = "bitcoin-io" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b47c4ab7a93edb0c7198c5535ed9b52b63095f4e9b45279c6736cec4b856baf" + +[[package]] +name = "bitcoin_hashes" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb18c03d0db0247e147a21a6faafd5a7eb851c743db062de72018b6b7e8e4d16" +dependencies = [ + "bitcoin-io", + "hex-conservative", +] + [[package]] name = "bitflags" version = "1.3.2" @@ -1954,6 +1971,15 @@ dependencies = [ "serde", ] +[[package]] +name = "hex-conservative" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5313b072ce3c597065a808dbf612c4c8e8590bdbf8b579508bf7a762c5eae6cd" +dependencies = [ + "arrayvec", +] + [[package]] name = "hmac" version = "0.12.1" @@ -2440,11 +2466,11 @@ version = "0.24.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37b26c20e2178756451cfeb0661fb74c47dd5988cb7e3939de7e9241fd604d42" dependencies = [ - "jsonrpsee-core", - "jsonrpsee-http-client", + "jsonrpsee-core 0.24.9", + "jsonrpsee-http-client 0.24.9", "jsonrpsee-proc-macros", "jsonrpsee-server", - "jsonrpsee-types", + "jsonrpsee-types 0.24.9", "tokio", "tracing", ] @@ -2461,7 +2487,7 @@ dependencies = [ "http", "http-body", "http-body-util", - "jsonrpsee-types", + "jsonrpsee-types 0.24.9", "parking_lot", "rand 0.8.5", "rustc-hash 2.1.1", @@ -2472,6 +2498,28 @@ dependencies = [ "tracing", ] +[[package]] +name = "jsonrpsee-core" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "693c93cbb7db25f4108ed121304b671a36002c2db67dff2ee4391a688c738547" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http", + "http-body", + "http-body-util", + "jsonrpsee-types 0.25.1", + "pin-project", + "serde", + "serde_json", + "thiserror 2.0.12", + "tokio", + "tower 0.5.2", + "tracing", +] + [[package]] name = "jsonrpsee-http-client" version = "0.24.9" @@ -2484,8 +2532,8 @@ dependencies = [ "hyper", "hyper-rustls", "hyper-util", - "jsonrpsee-core", - "jsonrpsee-types", + "jsonrpsee-core 0.24.9", + "jsonrpsee-types 0.24.9", "rustls", "rustls-platform-verifier", "serde", @@ -2497,6 +2545,29 @@ dependencies = [ "url", ] +[[package]] +name = "jsonrpsee-http-client" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6962d2bd295f75e97dd328891e58fce166894b974c1f7ce2e7597f02eeceb791" +dependencies = [ + "base64 0.22.1", + "http-body", + "hyper", + "hyper-rustls", + "hyper-util", + "jsonrpsee-core 0.25.1", + "jsonrpsee-types 0.25.1", + "rustls", + "rustls-platform-verifier", + "serde", + "serde_json", + "thiserror 2.0.12", + "tokio", + "tower 0.5.2", + "url", +] + [[package]] name = "jsonrpsee-proc-macros" version = "0.24.9" @@ -2522,8 +2593,8 @@ dependencies = [ "http-body-util", "hyper", "hyper-util", - "jsonrpsee-core", - "jsonrpsee-types", + "jsonrpsee-core 0.24.9", + "jsonrpsee-types 0.24.9", "pin-project", "route-recognizer", "serde", @@ -2549,6 +2620,18 @@ dependencies = [ "thiserror 1.0.69", ] +[[package]] +name = "jsonrpsee-types" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66df7256371c45621b3b7d2fb23aea923d577616b9c0e9c0b950a6ea5c2be0ca" +dependencies = [ + "http", + "serde", + "serde_json", + "thiserror 2.0.12", +] + [[package]] name = "jsonwebtoken" version = "9.3.1" @@ -2963,9 +3046,9 @@ checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" [[package]] name = "op-alloy-consensus" -version = "0.14.1" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6f400404e37862bb974fbc3ad2d8ca2a2df286b718e762446496d04267ee912" +checksum = "6f318b09e24148f07392c5e011bae047a0043851f9041145df5f3b01e4fedd1e" dependencies = [ "alloy-consensus", "alloy-eips", @@ -2979,9 +3062,9 @@ dependencies = [ [[package]] name = "op-alloy-rpc-types-engine" -version = "0.14.1" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e614936d3f113b8e3dd2724382bd8db6700bd48fcd1f4d62bef537f3be8f710e" +checksum = "f6f6cb2e937e88faa8f3d38d38377398d17e44cecd5b019e6d7e1fbde0f5af2a" dependencies = [ "alloy-consensus", "alloy-eips", @@ -3719,14 +3802,14 @@ dependencies = [ [[package]] name = "reth-rpc-layer" -version = "1.3.11" -source = "git+https://github.com/paradigmxyz/reth.git?rev=v1.3.11#e0e85aa10b98fa92d32c3e820c7ed2cee0b02931" +version = "1.4.1" +source = "git+https://github.com/paradigmxyz/reth.git?rev=v1.4.1#e6ce41ebba0d8752cef9ed885aae057e09226d05" dependencies = [ "alloy-rpc-types-engine", "http", - "jsonrpsee-http-client", + "jsonrpsee-http-client 0.25.1", "pin-project", - "tower 0.4.13", + "tower 0.5.2", "tower-http 0.6.4", "tracing", ] @@ -4085,6 +4168,27 @@ dependencies = [ "zeroize", ] +[[package]] +name = "secp256k1" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b50c5943d326858130af85e049f2661ba3c78b26589b8ab98e65e80ae44a1252" +dependencies = [ + "bitcoin_hashes", + "rand 0.8.5", + "secp256k1-sys", + "serde", +] + +[[package]] +name = "secp256k1-sys" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4387882333d3aa8cb20530a17c69a3752e97837832f34f6dccc760e715001d9" +dependencies = [ + "cc", +] + [[package]] name = "security-framework" version = "2.11.1" diff --git a/Cargo.toml b/Cargo.toml index 430ccaf..22153c4 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -4,11 +4,11 @@ version = "0.1.0" edition = "2024" [dependencies] -op-alloy-rpc-types-engine = "0.14.1" -alloy-rpc-types-engine = "0.14.0" -alloy-rpc-types-eth = "0.14.0" -alloy-serde = "0.14.0" -alloy-eips = { version = "0.14.0", features = ["serde"], optional = true } +op-alloy-rpc-types-engine = "0.16.0" +alloy-rpc-types-engine = "1.0.3" +alloy-rpc-types-eth = "1.0.3" +alloy-serde = "1.0.3" +alloy-eips = { version = "1.0.3", features = ["serde"], optional = true } alloy-primitives = { version = "1.0.0", features = ["rand"] } tokio = { version = "1", features = ["full"] } tracing = "0.1.4" @@ -54,16 +54,16 @@ parking_lot = "0.12.3" [dev-dependencies] rand = "0.9.0" time = { version = "0.3.36", features = ["macros", "formatting", "parsing"] } -op-alloy-consensus = "0.14.0" -alloy-eips = { version = "0.14.0", features = ["serde"] } -alloy-consensus = { version = "0.14.0", features = ["serde"] } +op-alloy-consensus = "0.16.0" +alloy-eips = { version = "1.0.3", features = ["serde"] } +alloy-consensus = { version = "1.0.3", features = ["serde"] } anyhow = "1.0" testcontainers = { version = "0.23.3" } assert_cmd = "2.0.10" predicates = "3.1.2" tokio-util = { version = "0.7.13" } bytes = "1.2" -reth-rpc-layer = { git = "https://github.com/paradigmxyz/reth.git", rev = "v1.3.11" } +reth-rpc-layer = { git = "https://github.com/paradigmxyz/reth.git", rev = "v1.4.1" } ctor = "0.4.1" reqwest = "0.12.15" diff --git a/src/client/rpc.rs b/src/client/rpc.rs index 991c55d..56585c8 100644 --- a/src/client/rpc.rs +++ b/src/client/rpc.rs @@ -385,118 +385,118 @@ macro_rules! define_rpc_args { } define_rpc_args!((BuilderArgs, builder), (L2ClientArgs, l2)); - -#[cfg(test)] -pub mod tests { - use assert_cmd::Command; - use http::Uri; - use jsonrpsee::core::client::ClientT; - use parking_lot::Mutex; - - use crate::server::PayloadSource; - use alloy_rpc_types_engine::JwtSecret; - use jsonrpsee::RpcModule; - use jsonrpsee::http_client::transport::Error as TransportError; - use jsonrpsee::{ - core::ClientError, - rpc_params, - server::{ServerBuilder, ServerHandle}, - }; - use predicates::prelude::*; - use reth_rpc_layer::{AuthLayer, JwtAuthValidator}; - use std::collections::HashSet; - use std::net::SocketAddr; - use std::net::TcpListener; - use std::result::Result; - use std::str::FromStr; - use std::sync::LazyLock; - - use super::*; - - const AUTH_ADDR: &str = "127.0.0.1"; - const SECRET: &str = "f79ae8046bc11c9927afe911db7143c51a806c4a537cc08e0d37140b0192f430"; - - pub fn get_available_port() -> u16 { - static CLAIMED_PORTS: LazyLock>> = - LazyLock::new(|| Mutex::new(HashSet::new())); - loop { - let port: u16 = rand::random_range(1000..20000); - if TcpListener::bind(("127.0.0.1", port)).is_ok() && CLAIMED_PORTS.lock().insert(port) { - return port; - } - } - } - - #[test] - fn test_invalid_args() { - let mut cmd = Command::cargo_bin("rollup-boost").unwrap(); - cmd.arg("--invalid-arg"); - - cmd.assert().failure().stderr(predicate::str::contains( - "error: unexpected argument '--invalid-arg' found", - )); - } - - #[tokio::test] - async fn valid_jwt() { - let port = get_available_port(); - let secret = JwtSecret::from_hex(SECRET).unwrap(); - let auth_rpc = Uri::from_str(&format!("http://{}:{}", AUTH_ADDR, port)).unwrap(); - let client = RpcClient::new(auth_rpc, secret, 1000, PayloadSource::L2).unwrap(); - let response = send_request(client.auth_client, port).await; - assert!(response.is_ok()); - assert_eq!(response.unwrap(), "You are the dark lord"); - } - - #[tokio::test] - async fn invalid_jwt() { - let port = get_available_port(); - let secret = JwtSecret::random(); - let auth_rpc = Uri::from_str(&format!("http://{}:{}", AUTH_ADDR, port)).unwrap(); - let client = RpcClient::new(auth_rpc, secret, 1000, PayloadSource::L2).unwrap(); - let response = send_request(client.auth_client, port).await; - assert!(response.is_err()); - assert!(matches!( - response.unwrap_err(), - ClientError::Transport(e) - if matches!(e.downcast_ref::(), Some(TransportError::Rejected { status_code: 401 })) - )); - } - - async fn send_request(client: RpcClientService, port: u16) -> Result { - let server = spawn_server(port).await; - - let response = client - .request::("greet_melkor", rpc_params![]) - .await; - - server.stop().unwrap(); - server.stopped().await; - - response - } - - /// Spawn a new RPC server equipped with a `JwtLayer` auth middleware. - async fn spawn_server(port: u16) -> ServerHandle { - let secret = JwtSecret::from_hex(SECRET).unwrap(); - let addr = format!("{AUTH_ADDR}:{port}"); - let validator = JwtAuthValidator::new(secret); - let layer = AuthLayer::new(validator); - let middleware = tower::ServiceBuilder::default().layer(layer); - - // Create a layered server - let server = ServerBuilder::default() - .set_http_middleware(middleware) - .build(addr.parse::().unwrap()) - .await - .unwrap(); - - // Create a mock rpc module - let mut module = RpcModule::new(()); - module - .register_method("greet_melkor", |_, _, _| "You are the dark lord") - .unwrap(); - - server.start(module) - } -} +// TODO: we uncomment this once https://github.com/paritytech/jsonrpsee/pull/1574 released and we could easily bump jsonrpsee and tower versions +// #[cfg(test)] +// pub mod tests { +// use assert_cmd::Command; +// use http::Uri; +// use jsonrpsee::core::client::ClientT; +// use parking_lot::Mutex; +// +// use crate::server::PayloadSource; +// use alloy_rpc_types_engine::JwtSecret; +// use jsonrpsee::RpcModule; +// use jsonrpsee::http_client::transport::Error as TransportError; +// use jsonrpsee::{ +// core::ClientError, +// rpc_params, +// server::{ServerBuilder, ServerHandle}, +// }; +// use predicates::prelude::*; +// use reth_rpc_layer::{AuthLayer, JwtAuthValidator}; +// use std::collections::HashSet; +// use std::net::SocketAddr; +// use std::net::TcpListener; +// use std::result::Result; +// use std::str::FromStr; +// use std::sync::LazyLock; +// +// use super::*; +// +// const AUTH_ADDR: &str = "127.0.0.1"; +// const SECRET: &str = "f79ae8046bc11c9927afe911db7143c51a806c4a537cc08e0d37140b0192f430"; +// +// pub fn get_available_port() -> u16 { +// static CLAIMED_PORTS: LazyLock>> = +// LazyLock::new(|| Mutex::new(HashSet::new())); +// loop { +// let port: u16 = rand::random_range(1000..20000); +// if TcpListener::bind(("127.0.0.1", port)).is_ok() && CLAIMED_PORTS.lock().insert(port) { +// return port; +// } +// } +// } +// +// #[test] +// fn test_invalid_args() { +// let mut cmd = Command::cargo_bin("rollup-boost").unwrap(); +// cmd.arg("--invalid-arg"); +// +// cmd.assert().failure().stderr(predicate::str::contains( +// "error: unexpected argument '--invalid-arg' found", +// )); +// } +// +// #[tokio::test] +// async fn valid_jwt() { +// let port = get_available_port(); +// let secret = JwtSecret::from_hex(SECRET).unwrap(); +// let auth_rpc = Uri::from_str(&format!("http://{}:{}", AUTH_ADDR, port)).unwrap(); +// let client = RpcClient::new(auth_rpc, secret, 1000, PayloadSource::L2).unwrap(); +// let response = send_request(client.auth_client, port).await; +// assert!(response.is_ok()); +// assert_eq!(response.unwrap(), "You are the dark lord"); +// } +// +// #[tokio::test] +// async fn invalid_jwt() { +// let port = get_available_port(); +// let secret = JwtSecret::random(); +// let auth_rpc = Uri::from_str(&format!("http://{}:{}", AUTH_ADDR, port)).unwrap(); +// let client = RpcClient::new(auth_rpc, secret, 1000, PayloadSource::L2).unwrap(); +// let response = send_request(client.auth_client, port).await; +// assert!(response.is_err()); +// assert!(matches!( +// response.unwrap_err(), +// ClientError::Transport(e) +// if matches!(e.downcast_ref::(), Some(TransportError::Rejected { status_code: 401 })) +// )); +// } +// +// async fn send_request(client: RpcClientService, port: u16) -> Result { +// let server = spawn_server(port).await; +// +// let response = client +// .request::("greet_melkor", rpc_params![]) +// .await; +// +// server.stop().unwrap(); +// server.stopped().await; +// +// response +// } +// +// /// Spawn a new RPC server equipped with a `JwtLayer` auth middleware. +// async fn spawn_server(port: u16) -> ServerHandle { +// let secret = JwtSecret::from_hex(SECRET).unwrap(); +// let addr = format!("{AUTH_ADDR}:{port}"); +// let validator = JwtAuthValidator::new(secret); +// let layer = AuthLayer::new(validator); +// let middleware = tower::ServiceBuilder::default().layer(layer); +// +// // Create a layered server +// let server = ServerBuilder::default() +// .set_http_middleware(middleware) +// .build(addr.parse::().unwrap()) +// .await +// .unwrap(); +// +// // Create a mock rpc module +// let mut module = RpcModule::new(()); +// module +// .register_method("greet_melkor", |_, _, _| "You are the dark lord") +// .unwrap(); +// +// server.start(module) +// } +// }