Selaa lähdekoodia

fix(mint): mint keyset generation from xpriv

thesimplekid 9 kuukautta sitten
vanhempi
säilyke
935c74449a
2 muutettua tiedostoa jossa 39 lisäystä ja 13 poistoa
  1. 23 11
      crates/cdk/src/mint/mod.rs
  2. 16 2
      crates/cdk/src/nuts/nut02.rs

+ 23 - 11
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);

+ 16 - 2
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<C: secp256k1::Signing>(
@@ -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,
+        )
     }
 }