use bip39::{Language, Mnemonic, MnemonicType, Seed};
use libsecp256k1::{PublicKey, SecretKey};
use primitive_types::H256;
use sp_runtime::traits::IdentifyAccount;
use clap::Parser;
use tiny_hderive::bip32::ExtendedPrivKey;
#[derive(Debug, Clone, Parser)]
#[clap(name = "generate", about = "Generate a random account")]
pub struct GenerateAccountKey {
#[clap(long, short = 'w')]
w12: bool,
#[clap(long, short = 'm')]
mnemonic: Option<String>,
#[clap(long = "account-index", short = 'a')]
account_index: Option<u32>,
}
impl GenerateAccountKey {
pub fn run(&self) {
let mnemonic = if let Some(phrase) = &self.mnemonic {
Mnemonic::from_phrase(phrase, Language::English).unwrap()
} else {
match self.w12 {
true => Mnemonic::new(MnemonicType::Words12, Language::English),
false => Mnemonic::new(MnemonicType::Words24, Language::English),
}
};
let seed = Seed::new(&mnemonic, "");
let derivation_path = format!("m/44'/60'/0'/0/{}", self.account_index.unwrap_or(0));
let ext = ExtendedPrivKey::derive(seed.as_bytes(), derivation_path.as_str()).unwrap();
let private_key = SecretKey::parse_slice(&ext.secret()).unwrap();
let public_key = PublicKey::from_secret_key(&private_key);
let signer: crate::account::EthereumSigner = public_key.into();
let address = signer.into_account();
println!("Address: {:?}", address);
println!("Mnemonic: {}", mnemonic.phrase());
println!("Private Key: {:?}", H256::from(private_key.serialize()));
println!("Path: {}", derivation_path);
}
}