use chrono::{DateTime, Utc};
use ethers::{
prelude::k256::ecdsa::SigningKey,
signers::{Signer, Wallet},
types::Signature,
};
use crate::{
types::account::auth::bearer::{Bearer, Params, Payload},
Farcaster,
};
use serde_json::{json, Value};
impl Farcaster {
pub async fn generate_bearer(
wallet: &Wallet<SigningKey>,
duration_secs: Option<i64>,
) -> Result<Bearer, Box<dyn std::error::Error>> {
let dt: DateTime<Utc> = Utc::now();
let timestamp = dt.timestamp_millis();
let params = Params {
timestamp,
expires_at: match duration_secs {
Some(secs) => Some(timestamp + (secs * 1000)),
None => None,
},
};
let payload: Value = json!({
"method": "generateToken",
"params": params,
});
let signature: Signature = wallet.sign_message(payload.to_string()).await?;
let arrayify: Vec<u8> = hex::decode(signature.to_string())?;
let base64_signature: String = base64::encode(arrayify);
let bearer = format!("Bearer eip191:{}", base64_signature);
let payload = Payload {
method: "generateToken".to_string(),
params,
};
let bearer = Bearer { bearer, payload };
Ok(bearer)
}
}