pub mod auth;
use crate::constants::merkle::AUTH_TOKEN_DEFAULT_DURATION_SECS;
use crate::types::account::auth::revoke::RevokedKeyRoot;
use crate::types::account::Account;
use chrono::Utc;
use ethers::signers::coins_bip39::English;
use ethers::signers::{LocalWallet, MnemonicBuilder};
use std::error::Error;
impl Account {
pub async fn from_mnemonic(
mnemonic_phrase: &str,
token_duration: Option<i64>,
) -> Result<Self, Box<dyn Error>> {
let wallet = MnemonicBuilder::<English>::default()
.phrase(mnemonic_phrase)
.build()
.expect("Wallet creation using mnemonic phrase failed");
let token_duration_secs = token_duration.unwrap_or(AUTH_TOKEN_DEFAULT_DURATION_SECS);
let mut account = Self {
wallet,
bearer_token: None,
session_token: None,
token_duration_secs: Some(token_duration_secs),
};
account.generate_bearer().await?;
account.get_session_token().await?;
Ok(account)
}
pub async fn from_private_key(
key: &str,
token_duration: Option<i64>,
) -> Result<Self, Box<dyn Error>> {
let wallet = key
.parse::<LocalWallet>()
.expect("Wallet creation using private key failed");
let token_duration_secs = token_duration.unwrap_or(AUTH_TOKEN_DEFAULT_DURATION_SECS);
let mut account = Self {
wallet,
bearer_token: None,
session_token: None,
token_duration_secs: Some(token_duration_secs),
};
account.generate_bearer().await?;
account.get_session_token().await?;
Ok(account)
}
pub fn get_auth_token(&self) -> Result<&str, Box<dyn Error>> {
if self.session_token.is_none() {
return Err(Box::from("Auth Token not ready"));
}
let timestamp = Utc::now().timestamp_millis();
if timestamp > self.session_token.as_ref().unwrap().expires_at {
return Err(Box::from("Auth Token expired"));
}
Ok(&self.session_token.as_ref().unwrap().secret)
}
async fn generate_bearer(&mut self) -> Result<(), Box<dyn Error>> {
self.bearer_token =
Some(crate::Farcaster::generate_bearer(&self.wallet, self.token_duration_secs).await?);
Ok(())
}
async fn get_session_token(&mut self) -> Result<(), Box<dyn Error>> {
if self.bearer_token.is_none() {
self.generate_bearer().await?;
}
self.session_token =
Some(crate::Farcaster::get_session_token(&self.bearer_token.as_ref().unwrap()).await?);
Ok(())
}
pub async fn regen_session_token(
&mut self,
token_duration: Option<i64>,
) -> Result<(), Box<dyn Error>> {
let token_duration_secs = token_duration.unwrap_or(
self.token_duration_secs
.unwrap_or(AUTH_TOKEN_DEFAULT_DURATION_SECS),
);
self.bearer_token =
Some(crate::Farcaster::generate_bearer(&self.wallet, Some(token_duration_secs)).await?);
self.session_token =
Some(crate::Farcaster::get_session_token(&self.bearer_token.as_ref().unwrap()).await?);
Ok(())
}
pub async fn revoke_auth_token(&mut self) -> Result<RevokedKeyRoot, Box<dyn Error>> {
if self.session_token.is_none() {
return Err(Box::from("No session token present"));
}
let revoke =
crate::Farcaster::revoke_session_token(&self.session_token.as_ref().unwrap()).await?;
Ok(revoke)
}
}