From b5838b2bd692b17cbab78bb124637fed48b79b47 Mon Sep 17 00:00:00 2001 From: Matthias Seitz Date: Tue, 25 Jul 2023 22:29:53 +0200 Subject: [PATCH 1/2] mev-api ext --- Cargo.lock | 1 + crates/mev-share-rpc-api/Cargo.toml | 1 + crates/mev-share-rpc-api/src/mev.rs | 57 ++++++++++++++++++++++++++++- 3 files changed, 57 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 0f9f693..f67e045 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1492,6 +1492,7 @@ dependencies = [ name = "mev-share-rpc-api" version = "0.1.0" dependencies = [ + "async-trait", "ethers-core", "ethers-signers", "futures-util", diff --git a/crates/mev-share-rpc-api/Cargo.toml b/crates/mev-share-rpc-api/Cargo.toml index cf4b9ae..66d0357 100644 --- a/crates/mev-share-rpc-api/Cargo.toml +++ b/crates/mev-share-rpc-api/Cargo.toml @@ -23,6 +23,7 @@ http.workspace = true hyper = { workspace = true, features = ["stream"] } tower.workspace = true futures-util.workspace = true +async-trait = "0.1" [dev-dependencies] diff --git a/crates/mev-share-rpc-api/src/mev.rs b/crates/mev-share-rpc-api/src/mev.rs index 598d3df..f2f5369 100644 --- a/crates/mev-share-rpc-api/src/mev.rs +++ b/crates/mev-share-rpc-api/src/mev.rs @@ -1,6 +1,5 @@ -use jsonrpsee::{core::RpcResult, proc_macros::rpc}; - use crate::{SendBundleRequest, SendBundleResponse, SimBundleOverrides, SimBundleResponse}; +use jsonrpsee::{core::RpcResult, proc_macros::rpc}; /// Mev rpc interface. #[cfg_attr(not(feature = "client"), rpc(server, namespace = "mev"))] @@ -22,3 +21,57 @@ pub trait MevApi { sim_overrides: SimBundleOverrides, ) -> RpcResult; } + +#[async_trait::async_trait] +pub trait MevApiExt { + async fn send_bundle_request( + &self, + request: SendBundleRequest, + ) -> Result; +} + +#[async_trait::async_trait] +impl MevApiExt for T +where + T: MevApiClient + Sync + Send, +{ + async fn send_bundle_request( + &self, + request: SendBundleRequest, + ) -> Result { + self.send_bundle(request).await + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::FlashbotsSignerLayer; + use ethers_core::rand::thread_rng; + use ethers_signers::LocalWallet; + use jsonrpsee::http_client::{transport, HttpClient, HttpClientBuilder}; + + #[tokio::test] + async fn test_box() { + let fb_signer = LocalWallet::new(&mut thread_rng()); + + let http = HttpClientBuilder::default() + .set_middleware( + tower::ServiceBuilder::new() + .map_err(transport::Error::Http) + .layer(FlashbotsSignerLayer::new(fb_signer.clone())), + ) + .build("http://localhost:3030") + .unwrap(); + let b = Box::new(http) as Box; + b.send_bundle_request(SendBundleRequest { + protocol_version: Default::default(), + inclusion: Default::default(), + bundle_body: vec![], + validity: None, + privacy: None, + }) + .await + .unwrap(); + } +} From 0f475ab6d0c2983bd4238c2c130f1e6834d1e93b Mon Sep 17 00:00:00 2001 From: Matthias Seitz Date: Wed, 26 Jul 2023 00:51:22 +0200 Subject: [PATCH 2/2] feat: complete trait --- Cargo.toml | 1 + crates/mev-share-rpc-api/Cargo.toml | 2 +- crates/mev-share-rpc-api/src/mev.rs | 62 +++++++++++++++++++-------- crates/mev-share-rpc-api/src/types.rs | 2 +- 4 files changed, 46 insertions(+), 21 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 1736c9d..7093bb2 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -37,6 +37,7 @@ hyper = "0.14" ## async futures-util = "0.3" +async-trait = "0.1" ## misc serde_json = "1.0" diff --git a/crates/mev-share-rpc-api/Cargo.toml b/crates/mev-share-rpc-api/Cargo.toml index 66d0357..6de7124 100644 --- a/crates/mev-share-rpc-api/Cargo.toml +++ b/crates/mev-share-rpc-api/Cargo.toml @@ -23,7 +23,7 @@ http.workspace = true hyper = { workspace = true, features = ["stream"] } tower.workspace = true futures-util.workspace = true -async-trait = "0.1" +async-trait.workspace = true [dev-dependencies] diff --git a/crates/mev-share-rpc-api/src/mev.rs b/crates/mev-share-rpc-api/src/mev.rs index f2f5369..f9467ab 100644 --- a/crates/mev-share-rpc-api/src/mev.rs +++ b/crates/mev-share-rpc-api/src/mev.rs @@ -22,24 +22,43 @@ pub trait MevApi { ) -> RpcResult; } +/// An object safe version of the `MevApiClient` trait. #[async_trait::async_trait] -pub trait MevApiExt { - async fn send_bundle_request( +pub(crate) trait MevApiExt { + /// Submitting bundles to the relay. It takes in a bundle and provides a bundle hash as a return + /// value. + async fn send_bundle( &self, request: SendBundleRequest, ) -> Result; + + /// Similar to `mev_sendBundle` but instead of submitting a bundle to the relay, it returns a + /// simulation result. Only fully matched bundles can be simulated. + async fn sim_bundle( + &self, + bundle: SendBundleRequest, + sim_overrides: SimBundleOverrides, + ) -> Result; } #[async_trait::async_trait] impl MevApiExt for T where - T: MevApiClient + Sync + Send, + T: MevApiClient + Sync, { - async fn send_bundle_request( + async fn send_bundle( &self, request: SendBundleRequest, ) -> Result { - self.send_bundle(request).await + MevApiClient::send_bundle(self, request).await + } + + async fn sim_bundle( + &self, + bundle: SendBundleRequest, + sim_overrides: SimBundleOverrides, + ) -> Result { + MevApiClient::sim_bundle(self, bundle, sim_overrides).await } } @@ -49,12 +68,15 @@ mod tests { use crate::FlashbotsSignerLayer; use ethers_core::rand::thread_rng; use ethers_signers::LocalWallet; - use jsonrpsee::http_client::{transport, HttpClient, HttpClientBuilder}; + use jsonrpsee::http_client::{transport, HttpClientBuilder}; - #[tokio::test] - async fn test_box() { - let fb_signer = LocalWallet::new(&mut thread_rng()); + struct Client { + inner: Box, + } + #[allow(dead_code)] + async fn assert_mev_api_box() { + let fb_signer = LocalWallet::new(&mut thread_rng()); let http = HttpClientBuilder::default() .set_middleware( tower::ServiceBuilder::new() @@ -63,15 +85,17 @@ mod tests { ) .build("http://localhost:3030") .unwrap(); - let b = Box::new(http) as Box; - b.send_bundle_request(SendBundleRequest { - protocol_version: Default::default(), - inclusion: Default::default(), - bundle_body: vec![], - validity: None, - privacy: None, - }) - .await - .unwrap(); + let client = Client { inner: Box::new(http) }; + client + .inner + .send_bundle(SendBundleRequest { + protocol_version: Default::default(), + inclusion: Default::default(), + bundle_body: vec![], + validity: None, + privacy: None, + }) + .await + .unwrap(); } } diff --git a/crates/mev-share-rpc-api/src/types.rs b/crates/mev-share-rpc-api/src/types.rs index 22d716e..a32cc5b 100644 --- a/crates/mev-share-rpc-api/src/types.rs +++ b/crates/mev-share-rpc-api/src/types.rs @@ -511,6 +511,6 @@ mod tests { } "#; let actual: SimBundleResponse = serde_json::from_str(expected).unwrap(); - assert_eq!(actual.success, true); + assert!(actual.success); } }