Browse Source

feat: receive adds unknown mint

thesimplekid 7 months ago
parent
commit
bb8d088f82
3 changed files with 37 additions and 5 deletions
  1. 1 0
      CHANGELOG.md
  2. 7 1
      crates/cdk-cli/src/main.rs
  3. 29 4
      crates/cdk-cli/src/sub_commands/receive.rs

+ 1 - 0
CHANGELOG.md

@@ -33,6 +33,7 @@
 - cdk(cdk-database/mint): Change `add_blind_signature` to `add_blind_signatures` ([thesimplekid]).
 - cdk(cdk-database/mint): Rename `add_active_keyset` to `set_active_keyset` ([thesimplekid]).
 - cdk(cdk-database/wallet): Change `get_proofs` to return `Vec<ProofInfo>` instead of `Option<Vec<ProofInfo>>` ([thesimplekid]).
+- cdk-cli: Receive will add wallet when receiving if mint is unknown ([thesimplekid]).
 
 ### Added
 - cdk(NUT-11): Add `Copy` on `SigFlag` ([thesimplekid]).

+ 7 - 1
crates/cdk-cli/src/main.rs

@@ -152,7 +152,13 @@ async fn main() -> Result<()> {
             sub_commands::melt::pay(&multi_mint_wallet, sub_command_args).await
         }
         Commands::Receive(sub_command_args) => {
-            sub_commands::receive::receive(&multi_mint_wallet, localstore, sub_command_args).await
+            sub_commands::receive::receive(
+                &multi_mint_wallet,
+                localstore,
+                &mnemonic.to_seed_normalized(""),
+                sub_command_args,
+            )
+            .await
         }
         Commands::Send(sub_command_args) => {
             sub_commands::send::send(&multi_mint_wallet, sub_command_args).await

+ 29 - 4
crates/cdk-cli/src/sub_commands/receive.rs

@@ -4,9 +4,10 @@ use std::sync::Arc;
 
 use anyhow::{anyhow, Result};
 use cdk::cdk_database::{self, WalletDatabase};
-use cdk::nuts::SecretKey;
+use cdk::nuts::{SecretKey, Token};
 use cdk::util::unix_time;
-use cdk::wallet::multi_mint_wallet::MultiMintWallet;
+use cdk::wallet::multi_mint_wallet::{MultiMintWallet, WalletKey};
+use cdk::wallet::Wallet;
 use cdk::Amount;
 use clap::Args;
 use nostr_sdk::nips::nip04;
@@ -36,6 +37,7 @@ pub struct ReceiveSubCommand {
 pub async fn receive(
     multi_mint_wallet: &MultiMintWallet,
     localstore: Arc<dyn WalletDatabase<Err = cdk_database::Error> + Send + Sync>,
+    seed: &[u8],
     sub_command_args: &ReceiveSubCommand,
 ) -> Result<()> {
     let mut signing_keys = Vec::new();
@@ -61,6 +63,8 @@ pub async fn receive(
         Some(token_str) => {
             receive_token(
                 multi_mint_wallet,
+                localstore,
+                seed,
                 token_str,
                 &signing_keys,
                 &sub_command_args.preimage,
@@ -94,6 +98,8 @@ pub async fn receive(
             for token_str in &tokens {
                 match receive_token(
                     multi_mint_wallet,
+                    localstore.clone(),
+                    seed,
                     token_str,
                     &signing_keys,
                     &sub_command_args.preimage,
@@ -123,12 +129,31 @@ pub async fn receive(
 
 async fn receive_token(
     multi_mint_wallet: &MultiMintWallet,
-    token: &str,
+    localstore: Arc<dyn WalletDatabase<Err = cdk_database::Error> + Send + Sync>,
+    seed: &[u8],
+    token_str: &str,
     signing_keys: &[SecretKey],
     preimage: &[String],
 ) -> Result<Amount> {
+    let token: Token = Token::from_str(token_str)?;
+
+    let mint_url = token.proofs().into_keys().next().expect("Mint in token");
+
+    let wallet_key = WalletKey::new(mint_url.clone(), token.unit().unwrap_or_default());
+
+    if multi_mint_wallet.get_wallet(&wallet_key).await.is_none() {
+        let wallet = Wallet::new(
+            &mint_url.to_string(),
+            token.unit().unwrap_or_default(),
+            localstore,
+            seed,
+            None,
+        );
+        multi_mint_wallet.add_wallet(wallet).await;
+    }
+
     let amount = multi_mint_wallet
-        .receive(token, signing_keys, preimage)
+        .receive(token_str, signing_keys, preimage)
         .await?;
     Ok(amount)
 }