1use crate::secret_key::SecretKey;
2
3pub trait DerivableKey {
4 #[must_use]
5 fn derive_unhardened(&self, idx: u32) -> Self;
6}
7
8fn derive_path_unhardened<Key: DerivableKey>(key: &Key, path: &[u32]) -> Key {
9 let mut derived = key.derive_unhardened(path[0]);
10 for idx in &path[1..] {
11 derived = derived.derive_unhardened(*idx);
12 }
13 derived
14}
15
16fn derive_path_hardened(key: &SecretKey, path: &[u32]) -> SecretKey {
17 let mut derived = key.derive_hardened(path[0]);
18 for idx in &path[1..] {
19 derived = derived.derive_hardened(*idx);
20 }
21 derived
22}
23
24pub fn master_to_wallet_unhardened_intermediate<Key: DerivableKey>(key: &Key) -> Key {
25 derive_path_unhardened(key, &[12381_u32, 8444, 2])
26}
27
28pub fn master_to_wallet_unhardened<Key: DerivableKey>(key: &Key, idx: u32) -> Key {
29 derive_path_unhardened(key, &[12381_u32, 8444, 2, idx])
30}
31
32pub fn master_to_wallet_hardened_intermediate(key: &SecretKey) -> SecretKey {
33 derive_path_hardened(key, &[12381_u32, 8444, 2])
34}
35
36pub fn master_to_wallet_hardened(key: &SecretKey, idx: u32) -> SecretKey {
37 derive_path_hardened(key, &[12381_u32, 8444, 2, idx])
38}
39
40pub fn master_to_pool_singleton(key: &SecretKey, pool_wallet_idx: u32) -> SecretKey {
41 derive_path_hardened(key, &[12381_u32, 8444, 5, pool_wallet_idx])
42}
43
44pub fn master_to_pool_authentication(key: &SecretKey, pool_wallet_idx: u32, idx: u32) -> SecretKey {
48 assert!(pool_wallet_idx < 10000);
49 assert!(idx < 10000);
50 derive_path_hardened(key, &[12381_u32, 8444, 6, pool_wallet_idx * 10000 + idx])
51}