reth_rpc_eth_api/helpers/
signer.rs

1//! An abstraction over ethereum signers.
2
3use alloy_dyn_abi::TypedData;
4use alloy_primitives::{Address, PrimitiveSignature as Signature};
5use alloy_rpc_types_eth::TransactionRequest;
6use dyn_clone::DynClone;
7use reth_rpc_eth_types::SignError;
8use std::result;
9
10/// Result returned by [`EthSigner`] methods.
11pub type Result<T> = result::Result<T, SignError>;
12
13/// An Ethereum Signer used via RPC.
14#[async_trait::async_trait]
15pub trait EthSigner<T>: Send + Sync + DynClone {
16    /// Returns the available accounts for this signer.
17    fn accounts(&self) -> Vec<Address>;
18
19    /// Returns `true` whether this signer can sign for this address
20    fn is_signer_for(&self, addr: &Address) -> bool {
21        self.accounts().contains(addr)
22    }
23
24    /// Returns the signature
25    async fn sign(&self, address: Address, message: &[u8]) -> Result<Signature>;
26
27    /// signs a transaction request using the given account in request
28    async fn sign_transaction(&self, request: TransactionRequest, address: &Address) -> Result<T>;
29
30    /// Encodes and signs the typed data according EIP-712. Payload must implement Eip712 trait.
31    fn sign_typed_data(&self, address: Address, payload: &TypedData) -> Result<Signature>;
32}
33
34dyn_clone::clone_trait_object!(<T> EthSigner<T>);
35
36/// Adds 20 random dev signers for access via the API. Used in dev mode.
37#[auto_impl::auto_impl(&)]
38pub trait AddDevSigners {
39    /// Generates 20 random developer accounts.
40    /// Used in DEV mode.
41    fn with_dev_accounts(&self);
42}