extern crate litcoinlib;
use std::{env, process};
use std::str::FromStr;
use litcoinlib::secp256k1::Secp256k1;
use litcoinlib::PublicKey;
use litcoinlib::util::bip32::ExtendedPrivKey;
use litcoinlib::util::bip32::ExtendedPubKey;
use litcoinlib::util::bip32::DerivationPath;
use litcoinlib::util::bip32::ChildNumber;
use litcoinlib::util::address::Address;
use litcoinlib::secp256k1::ffi::types::AlignedType;
use litcoinlib::hashes::hex::FromHex;
fn main() {
let args: Vec<String> = env::args().collect();
if args.len() < 2 {
eprintln!("not enough arguments. usage: {} <hex-encoded 32-byte seed>", &args[0]);
process::exit(1);
}
let seed_hex = &args[1];
println!("Seed: {}", seed_hex);
let network = litcoinlib::Network::Bitcoin;
println!("Network: {:?}", network);
let seed = Vec::from_hex(seed_hex).unwrap();
let mut buf: Vec<AlignedType> = Vec::new();
buf.resize(Secp256k1::preallocate_size(), AlignedType::zeroed());
let secp = Secp256k1::preallocated_new(buf.as_mut_slice()).unwrap();
let root = ExtendedPrivKey::new_master(network, &seed).unwrap();
println!("Root key: {}", root);
let path = DerivationPath::from_str("m/84h/0h/0h").unwrap();
let child = root.derive_priv(&secp, &path).unwrap();
println!("Child at {}: {}", path, child);
let xpub = ExtendedPubKey::from_priv(&secp, &child);
println!("Public key at {}: {}", path, xpub);
let zero = ChildNumber::from_normal_idx(0).unwrap();
let public_key = xpub.derive_pub(&secp, &vec![zero, zero])
.unwrap()
.public_key;
let address = Address::p2wpkh(&PublicKey::new(public_key), network).unwrap();
println!("First receiving address: {}", address);
}