1use crate::{
10 derive_child::{derive_child_key, generate_public_key},
11 prelude::*,
12};
13
14#[derive(Deserialize, Debug)]
20pub struct Config {
21 #[serde(deserialize_with = "deserialize_from_hex")]
24 root_key_bytes: [u8; 32],
25
26 #[serde(deserialize_with = "deserialize_from_hex")]
30 root_chain_code: [u8; 32],
31}
32
33pub static CONFIG: Lazy<Config> = Lazy::new(|| envy::from_env().expect("some env vars missing"));
35
36fn deserialize_from_hex<'de, D>(deserializer: D) -> Result<[u8; 32], D::Error>
37where
38 D: serde::Deserializer<'de>,
39{
40 use serde::de::Error;
41 let hex_string: String = serde::Deserialize::deserialize(deserializer)?;
42
43 hex_to_slice(hex_string).map_err(D::Error::custom)
44}
45
46pub fn hex_to_slice(hex_string: String) -> Result<[u8; 32], &'static str> {
47 Vec::from_hex(hex_string)
48 .map_err(|_e| "Invalid byte array size")?
49 .try_into()
50 .map_err(|_e| "Invalid byte array size")
51}
52
53impl Config {
54 pub fn derive_child_key(&self, index: u32) -> (SecretKey, [u8; 32], PublicKey) {
55 let Config {
56 root_key_bytes,
57 root_chain_code,
58 } = *self;
59 let (child_key, child_chain_code) =
60 derive_child_key(&root_key_bytes, &root_chain_code, index);
61 let child_public_key = generate_public_key(&child_key);
62 (child_key, child_chain_code, child_public_key)
63 }
64}
65
66#[cfg(test)]
67mod tests {
68 use crate::prelude::*;
69
70 use crate::CONFIG;
71 #[test]
72 fn show_config_with_root_public() {
73 dotenv().ok();
74 assert_debug_snapshot!(CONFIG.derive_child_key(0).2);
75 }
76 #[test]
77 fn ascii_to_hex() {
78 let hex_string = hex::encode("s1");
79 dbg!(hex_string);
80 let hex_string = hex::encode("s2");
81 dbg!(hex_string);
82 }
83}