reth_enclave/
lib.rs

1//! This crate provides functionalities related to the Enclave service.
2//! It includes modules and API for interacting with wallet operations and HTTP clients.
3
4use std::net::{IpAddr, TcpListener};
5
6use derive_more::Display;
7pub use seismic_enclave::{
8    client::{
9        rpc::{BuildableServer, SyncEnclaveApiClient},
10        EnclaveClient, MockEnclaveServer, ENCLAVE_DEFAULT_ENDPOINT_ADDR,
11        ENCLAVE_DEFAULT_ENDPOINT_PORT,
12    },
13    SchnorrkelKeypair,
14};
15use tracing::error;
16
17/// Custom error type for reth error handling.
18#[derive(Clone, Debug, Eq, PartialEq, Display)]
19pub enum EnclaveError {
20    /// enclave encryption fails
21    EncryptionError,
22    /// enclave decryption fails
23    DecryptionError,
24    /// Ephemereal keypair generation fails
25    EphRngKeypairGenerationError(String),
26    /// Custom error.
27    Custom(&'static str),
28}
29
30/// Get the test enclave endpoint
31fn get_random_port() -> u16 {
32    TcpListener::bind("127.0.0.1:0") // 0 means OS assigns a free port
33        .expect("Failed to bind to a port")
34        .local_addr()
35        .unwrap()
36        .port()
37}
38
39/// Start the mock enclave server
40pub async fn start_mock_enclave_server_random_port() -> EnclaveClient {
41    let port = get_random_port();
42    tokio::spawn(async move {
43        start_blocking_mock_enclave_server(ENCLAVE_DEFAULT_ENDPOINT_ADDR, port).await;
44    });
45    EnclaveClient::builder().addr(ENCLAVE_DEFAULT_ENDPOINT_ADDR.to_string()).port(port).build()
46}
47
48/// Start the mock enclave server
49pub async fn start_default_mock_enclave_server() -> EnclaveClient {
50    let client = EnclaveClient::builder()
51        .addr(ENCLAVE_DEFAULT_ENDPOINT_ADDR.to_string())
52        .port(ENCLAVE_DEFAULT_ENDPOINT_PORT)
53        .build();
54    tokio::spawn(async move {
55        start_blocking_mock_enclave_server(
56            ENCLAVE_DEFAULT_ENDPOINT_ADDR,
57            ENCLAVE_DEFAULT_ENDPOINT_PORT,
58        )
59        .await;
60    });
61    client
62}
63
64/// Start the mock enclave server
65pub async fn start_blocking_mock_enclave_server(addr: IpAddr, port: u16) {
66    let enclave_server = MockEnclaveServer::new((addr, port));
67
68    let addr = enclave_server.addr();
69
70    match enclave_server.start().await {
71        Ok(handle) => {
72            handle.stopped().await;
73        }
74        Err(err) => {
75            let err = eyre::eyre!("Failed to start mock enclave server at {}: {}", addr, err);
76            error!("{:?}", err);
77        }
78    }
79}