pub mod config;
pub mod derive;
pub mod fund;
pub mod generate;
pub mod info;
pub mod key;
pub mod pay;
pub mod policy;
pub mod send_transaction;
pub mod sign_message;
pub mod sign_transaction;
pub mod uninstall;
pub mod update;
pub mod wallet;
use crate::CliError;
use ows_signer::process_hardening::clear_env_var;
use ows_signer::SecretBytes;
use std::io::{self, BufRead, IsTerminal, Write};
use zeroize::Zeroizing;
pub fn read_mnemonic() -> Result<Zeroizing<String>, CliError> {
if let Some(value) = clear_env_var("OWS_MNEMONIC").or_else(|| clear_env_var("LWS_MNEMONIC")) {
let trimmed = value.trim().to_string();
if !trimmed.is_empty() {
return Ok(Zeroizing::new(trimmed));
}
}
let stdin = io::stdin();
if stdin.is_terminal() {
eprint!("Enter mnemonic: ");
io::stderr().flush().ok();
}
let mut line = String::new();
stdin.lock().read_line(&mut line)?;
let trimmed = line.trim().to_string();
if trimmed.is_empty() {
return Err(CliError::InvalidArgs(
"no mnemonic provided (set OWS_MNEMONIC or pipe via stdin)".into(),
));
}
Ok(Zeroizing::new(trimmed))
}
pub fn read_private_key() -> Result<Zeroizing<String>, CliError> {
if let Some(value) =
clear_env_var("OWS_PRIVATE_KEY").or_else(|| clear_env_var("LWS_PRIVATE_KEY"))
{
let trimmed = value.trim().to_string();
if !trimmed.is_empty() {
return Ok(Zeroizing::new(trimmed));
}
}
let stdin = io::stdin();
if stdin.is_terminal() {
eprint!("Enter private key (hex): ");
io::stderr().flush().ok();
}
let mut line = String::new();
stdin.lock().read_line(&mut line)?;
let trimmed = line.trim().to_string();
if trimmed.is_empty() {
return Err(CliError::InvalidArgs(
"no private key provided (set OWS_PRIVATE_KEY or pipe via stdin)".into(),
));
}
Ok(Zeroizing::new(trimmed))
}
pub fn read_passphrase() -> Zeroizing<String> {
if let Some(value) = clear_env_var("OWS_PASSPHRASE").or_else(|| clear_env_var("LWS_PASSPHRASE"))
{
return Zeroizing::new(value);
}
let stdin = io::stdin();
if stdin.is_terminal() {
eprint!("Passphrase (empty for none): ");
io::stderr().flush().ok();
let mut line = String::new();
stdin.lock().read_line(&mut line).unwrap_or(0);
Zeroizing::new(line.trim().to_string())
} else {
Zeroizing::new(String::new())
}
}
pub fn peek_passphrase() -> Option<String> {
std::env::var("OWS_PASSPHRASE")
.ok()
.or_else(|| std::env::var("LWS_PASSPHRASE").ok())
}
pub fn resolve_signing_key(
wallet_name: &str,
chain_type: ows_core::ChainType,
index: u32,
) -> Result<SecretBytes, CliError> {
match ows_lib::decrypt_signing_key(wallet_name, chain_type, "", Some(index), None) {
Ok(key) => return Ok(key),
Err(ows_lib::OwsLibError::Crypto(_)) => {
}
Err(e) => return Err(e.into()),
}
let passphrase = read_passphrase();
Ok(ows_lib::decrypt_signing_key(
wallet_name,
chain_type,
&passphrase,
Some(index),
None,
)?)
}