1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
pub mod prelude {
  pub use secp256k1::SecretKey;
  pub use tide::http::{headers::HeaderName, Url};
  pub use web3::{transports::WebSocket, Web3};
}

use prelude::*;

use tide::{utils::async_trait, Middleware, Next, Request, Result};
use web3::signing::SecretKeyRef;

#[derive(Clone)]
pub struct ProvidesSignature {
  pub challenge: Vec<u8>,
  pub secret_key: SecretKey,
  pub signature_header: HeaderName,
  pub web3: Web3<WebSocket>,
}

#[async_trait]
impl<State: Clone + Send + Sync + 'static> Middleware<State> for ProvidesSignature {
  async fn handle(&self, mut request: Request<State>, next: Next<'_, State>) -> Result {
    let key = SecretKeyRef::new(&self.secret_key);
    let signed_data = self.web3.accounts().sign(&self.challenge, key);
    let signature = signed_data.signature.0;

    request.append_header(&self.signature_header, base64::encode(signature));

    Ok(next.run(request).await)
  }
}