use crate::{
derive_child::{derive_child_key, generate_public_key},
prelude::*,
};
#[derive(Deserialize, Debug)]
pub struct Config {
#[serde(deserialize_with = "deserialize_from_hex")]
root_key_bytes: [u8; 32],
#[serde(deserialize_with = "deserialize_from_hex")]
root_chain_code: [u8; 32],
}
pub static CONFIG: Lazy<Config> = Lazy::new(|| envy::from_env().expect("some env vars missing"));
fn deserialize_from_hex<'de, D>(deserializer: D) -> Result<[u8; 32], D::Error>
where
D: serde::Deserializer<'de>,
{
use serde::de::Error;
let s: String = serde::Deserialize::deserialize(deserializer)?;
s.into_bytes()
.try_into()
.map_err(|_| Error::custom("Invalid byte array size. Expected 32 bytes."))
}
impl Config {
pub fn derive_child_key(&self, index: u32) -> (SecretKey, [u8; 32], PublicKey) {
let Config {
root_key_bytes,
root_chain_code,
} = *self;
let (child_key, child_chain_code) =
derive_child_key(&root_key_bytes, &root_chain_code, index);
let child_public_key = generate_public_key(&child_key);
(child_key, child_chain_code, child_public_key)
}
}
#[cfg(test)]
mod tests {
use crate::prelude::*;
use crate::CONFIG;
#[test]
fn show_config_with_root_public() {
dotenv().ok();
assert_debug_snapshot!(CONFIG.derive_child_key(0).2);
}
}