use alloy_primitives::{Address, ChainId};
use alloy_signer::{Signature, SignerSync};
use derive_more::From;
use op_alloy_rpc_types_engine::PayloadHash;
use std::fmt::Debug;
mod remote;
pub use remote::{
CertificateError, ClientCert, RemoteSigner, RemoteSignerError, RemoteSignerHandler,
RemoteSignerStartError,
};
#[derive(Debug, Clone, From)]
pub enum BlockSigner {
Local(#[from] alloy_signer_local::PrivateKeySigner),
Remote(#[from] RemoteSigner),
}
#[derive(Debug)]
pub enum BlockSignerHandler {
Local(alloy_signer_local::PrivateKeySigner),
Remote(RemoteSignerHandler),
}
#[derive(Debug, thiserror::Error)]
pub enum BlockSignerStartError {
#[error(transparent)]
Local(#[from] alloy_signer::Error),
#[error(transparent)]
Remote(#[from] RemoteSignerStartError),
}
#[derive(Debug, thiserror::Error)]
pub enum BlockSignerError {
#[error(transparent)]
Local(#[from] alloy_signer::Error),
#[error(transparent)]
Remote(#[from] RemoteSignerError),
}
impl BlockSigner {
pub async fn start(self) -> Result<BlockSignerHandler, BlockSignerStartError> {
match self {
Self::Local(signer) => Ok(BlockSignerHandler::Local(signer)),
Self::Remote(signer) => Ok(BlockSignerHandler::Remote(signer.start().await?)),
}
}
}
impl BlockSignerHandler {
pub async fn sign_block(
&self,
payload_hash: PayloadHash,
chain_id: ChainId,
sender_address: Address,
) -> Result<Signature, BlockSignerError> {
let signature = match self {
Self::Local(signer) => {
signer.sign_hash_sync(&payload_hash.signature_message(chain_id))?
}
Self::Remote(signer) => {
signer.sign_block_v1(payload_hash, chain_id, sender_address).await?
}
};
Ok(signature)
}
}