xmtp_id/scw_verifier/
remote_signature_verifier.rs1use 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}