use async_trait::async_trait;
use thegraph_core::alloy::{dyn_abi::Eip712Domain, primitives::Address, sol_types::SolStruct};
use crate::{signed_message::Eip712SignedMessage, Error};
#[async_trait]
pub trait SignatureChecker: Send + Sync {
type AdapterError: std::error::Error + std::fmt::Debug + Send + Sync + 'static;
async fn verify_signer(&self, signer_address: Address) -> Result<bool, Self::AdapterError>;
async fn check_signature<T: SolStruct + Sync>(
&self,
signed_message: &Eip712SignedMessage<T>,
domain_separator: &Eip712Domain,
) -> Result<(), Error> {
let recovered_address = signed_message.recover_signer(domain_separator)?;
if self
.verify_signer(recovered_address)
.await
.map_err(|e| Error::FailedToVerifySigner(e.to_string()))?
{
Ok(())
} else {
Err(Error::InvalidRecoveredSigner {
address: recovered_address,
})
}
}
}