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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
use crate::{ middleware::{ ethereum::{prelude::*, *}, *, }, WrappedResult, }; use tide::Server; use web3::transports::WebSocket; pub struct Config { pub address_header: HeaderName, pub backend: Url, pub balance_header: HeaderName, pub balance_requirement: Option<BalanceRequirement>, pub balance_scale: Option<BalanceScale>, pub challenge: Vec<u8>, pub provides_account_verification: bool, pub provides_balances: bool, pub provides_signatures: bool, pub web3_rpc_url: Url, pub secret_key: Option<SecretKey>, pub signature_header: HeaderName, } pub async fn server(config: Config) -> WrappedResult<Server<()>> { let mut server = tide::new(); server.with(ProvidesForwardedHeader); if config.provides_signatures { server.with(ProvidesSignature { signature_header: config.signature_header.clone(), secret_key: config.secret_key.unwrap(), web3: Web3::new(WebSocket::new(config.web3_rpc_url.as_str()).await?), challenge: config.challenge.clone(), }); } if config.provides_account_verification { server.with(ProvidesAccountVerification { signature_header: config.signature_header.clone(), address_header: config.address_header.clone(), status_code: StatusCode::PaymentRequired, web3: Web3::new(WebSocket::new(config.web3_rpc_url.as_str()).await?), challenge: config.challenge.clone(), }); } if config.provides_balances { server.with(ProvidesBalance { address_header: config.address_header.clone(), balance_header: config.balance_header.clone(), web3: Web3::new(WebSocket::new(config.web3_rpc_url.as_str()).await?), }); } if let Some(requirement) = config.balance_requirement { server.with( RequiresBalance { header: config.balance_header.clone(), requirement, } .scale(config.balance_scale.unwrap_or(BalanceScale::Gwei)), ); } server.with(Proxy::new(config.backend)); Ok(server) }