use crate::encoding::{bytes_to_hex_str, hex_to_bytes, parse_address};
use crate::app::dom;
pub(super) async fn gemini_key_slot_id(name: &str) -> Result<u64, String> {
let owner = crate::app::registry::owner_of_name(name)
.await
.map_err(|e| format!("owner: {e}"))?
.ok_or_else(|| "name not registered on-chain".to_string())?;
let main_id = crate::app::registry::main_of(&owner)
.await
.map_err(|e| format!("main_of: {e}"))?;
if main_id != 0 {
return Ok(main_id);
}
match crate::app::registry::id_of_name(name).await {
Ok(id) if id != 0 => Ok(id),
Ok(_) => Err("no token id for name".into()),
Err(e) => Err(format!("id_of_name: {e}")),
}
}
pub(super) async fn auto_sync_gemini_key(name: String, key: String) {
let owner = match crate::app::registry::owner_of_name(&name).await {
Ok(Some(o)) => o,
_ => return,
};
let slot_id = match gemini_key_slot_id(&name).await {
Ok(id) => id,
Err(_) => return,
};
let ct_hex = match crate::app::verify::seal_key_via_iframe(&key).await {
Ok(h) => h,
Err(_) => return,
};
let Ok(ct) = hex_to_bytes(&ct_hex) else { return };
let Ok(registry_addr) = parse_address(crate::app::registry::REGISTRY_ADDRESS) else { return };
let call = crate::tempo_tx::TempoCall {
to: registry_addr,
value_wei: 0,
input: crate::app::registry::encode_set_gemini_key(slot_id, &ct),
};
let gas = crate::app::gas::set_metadata_gas(ct.len());
let _ = super::run_sponsored_tempo_call(&owner, vec![call], gas, "auto-sync key").await;
}
pub(crate) async fn sync_local_key_to_main(name: &str) {
if let Some(key) = crate::app::key_store::load().await {
auto_sync_gemini_key(name.to_string(), key).await;
}
}
pub(crate) async fn try_auto_restore_gemini_key(name: &str) -> bool {
if crate::app::key_store::load().await.is_some() {
return true;
}
let slot_id = match gemini_key_slot_id(name).await {
Ok(id) => id,
Err(_) => return false,
};
let ct = match crate::app::registry::gemini_key_of(slot_id).await {
Ok(Some(b)) => b,
_ => return false,
};
let ct_hex = bytes_to_hex_str(&ct);
let plaintext = match crate::app::verify::open_key_via_iframe(&ct_hex).await {
Ok(p) => p,
Err(_) => return false,
};
crate::app::key_store::save(&plaintext).await;
if let Ok(Some(storage)) = dom::session_storage() {
let _ = storage.set_item("gemini_api_key", &plaintext);
}
true
}