From 935c74449a68f78f0c026dc4e3e927652245bb8c Mon Sep 17 00:00:00 2001 From: thesimplekid Date: Mon, 24 Jun 2024 16:55:58 +0100 Subject: [PATCH] fix(mint): mint keyset generation from xpriv --- crates/cdk/src/mint/mod.rs | 34 +++++++++++++++++++++++----------- crates/cdk/src/nuts/nut02.rs | 18 ++++++++++++++++-- 2 files changed, 39 insertions(+), 13 deletions(-) diff --git a/crates/cdk/src/mint/mod.rs b/crates/cdk/src/mint/mod.rs index 7e412566..c46c5be8 100644 --- a/crates/cdk/src/mint/mod.rs +++ b/crates/cdk/src/mint/mod.rs @@ -45,17 +45,29 @@ impl Mint { ExtendedPrivKey::new_master(bitcoin::Network::Bitcoin, seed).expect("RNG busted"); let mut keysets = HashMap::new(); - let keysets_info = localstore.get_keyset_infos().await?; - if keysets_info.is_empty() { - let derivation_path = DerivationPath::from(vec![ - ChildNumber::from_hardened_idx(0).expect("0 is a valid index") - ]); - let (keyset, keyset_info) = - create_new_keyset(&secp_ctx, xpriv, derivation_path, CurrencyUnit::Sat, 64); - let id = keyset_info.id; - localstore.add_keyset_info(keyset_info).await?; - localstore.add_active_keyset(CurrencyUnit::Sat, id).await?; - keysets.insert(id, keyset); + let keysets_infos = localstore.get_keyset_infos().await?; + + match keysets_infos.is_empty() { + false => { + for keyset_info in keysets_infos { + if keyset_info.active { + let id = keyset_info.id; + let keyset = MintKeySet::generate_from_xpriv(&secp_ctx, xpriv, keyset_info); + keysets.insert(id, keyset); + } + } + } + true => { + let derivation_path = DerivationPath::from(vec![ + ChildNumber::from_hardened_idx(0).expect("0 is a valid index") + ]); + let (keyset, keyset_info) = + create_new_keyset(&secp_ctx, xpriv, derivation_path, CurrencyUnit::Sat, 64); + let id = keyset_info.id; + localstore.add_keyset_info(keyset_info).await?; + localstore.add_active_keyset(CurrencyUnit::Sat, id).await?; + keysets.insert(id, keyset); + } } let mint_url = UncheckedUrl::from(mint_url); diff --git a/crates/cdk/src/nuts/nut02.rs b/crates/cdk/src/nuts/nut02.rs index 6377209f..95ce2866 100644 --- a/crates/cdk/src/nuts/nut02.rs +++ b/crates/cdk/src/nuts/nut02.rs @@ -315,7 +315,14 @@ impl MintKeySet { ExtendedPrivKey::new_master(bitcoin::Network::Bitcoin, seed).expect("RNG busted"); let max_order = info.max_order; let unit = info.unit; - Self::generate(secp, xpriv, unit, max_order) + Self::generate( + secp, + xpriv + .derive_priv(secp, &info.derivation_path) + .expect("RNG busted"), + unit, + max_order, + ) } pub fn generate_from_xpriv( @@ -325,7 +332,14 @@ impl MintKeySet { ) -> Self { let max_order = info.max_order; let unit = info.unit; - Self::generate(secp, xpriv, unit, max_order) + Self::generate( + secp, + xpriv + .derive_priv(secp, &info.derivation_path) + .expect("RNG busted"), + unit, + max_order, + ) } }