xmtp_id/scw_verifier/
remote_signature_verifier.rs

1use super::{SmartContractSignatureVerifier, ValidationResponse, VerifierError};
2use crate::associations::AccountId;
3use alloy::primitives::{BlockNumber, Bytes};
4
5use xmtp_proto::{
6    prelude::XmtpIdentityClient,
7    xmtp::identity::api::v1::{
8        VerifySmartContractWalletSignatureRequestSignature,
9        VerifySmartContractWalletSignaturesRequest, VerifySmartContractWalletSignaturesResponse,
10    },
11};
12
13pub struct RemoteSignatureVerifier<C> {
14    api: C,
15}
16
17impl<ApiClient> RemoteSignatureVerifier<ApiClient> {
18    pub fn new(api: ApiClient) -> Self {
19        Self { api }
20    }
21}
22
23#[xmtp_common::async_trait]
24impl<C> SmartContractSignatureVerifier for RemoteSignatureVerifier<C>
25where
26    C: XmtpIdentityClient,
27{
28    async fn is_valid_signature(
29        &self,
30        account_id: AccountId,
31        hash: [u8; 32],
32        signature: Bytes,
33        block_number: Option<BlockNumber>,
34    ) -> Result<ValidationResponse, VerifierError> {
35        let result = self
36            .api
37            .verify_smart_contract_wallet_signatures(VerifySmartContractWalletSignaturesRequest {
38                signatures: vec![VerifySmartContractWalletSignatureRequestSignature {
39                    account_id: account_id.into(),
40                    block_number,
41                    signature: signature.to_vec(),
42                    hash: hash.to_vec(),
43                }],
44            })
45            .await
46            .map_err(|e| VerifierError::Other(Box::new(e) as Box<_>))?;
47
48        let VerifySmartContractWalletSignaturesResponse { responses } = result;
49
50        Ok(responses
51            .into_iter()
52            .next()
53            .expect("Api given one request will return one response")
54            .into())
55    }
56}
57
58impl<T> Clone for RemoteSignatureVerifier<T>
59where
60    T: Clone,
61{
62    fn clone(&self) -> Self {
63        Self {
64            api: self.api.clone(),
65        }
66    }
67}