From bb8d088f82497dec8590223db9794598a4a8eeec Mon Sep 17 00:00:00 2001 From: thesimplekid Date: Tue, 23 Jul 2024 15:12:03 +0100 Subject: [PATCH] feat: receive adds unknown mint --- CHANGELOG.md | 1 + crates/cdk-cli/src/main.rs | 8 +++++- crates/cdk-cli/src/sub_commands/receive.rs | 33 +++++++++++++++++++--- 3 files changed, 37 insertions(+), 5 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ef558f3..0f2df8de 100644 --- a/CHANGELOG.md +++ b/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` instead of `Option>` ([thesimplekid]). +- cdk-cli: Receive will add wallet when receiving if mint is unknown ([thesimplekid]). ### Added - cdk(NUT-11): Add `Copy` on `SigFlag` ([thesimplekid]). diff --git a/crates/cdk-cli/src/main.rs b/crates/cdk-cli/src/main.rs index 8b62a53a..6ecb7cd3 100644 --- a/crates/cdk-cli/src/main.rs +++ b/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 diff --git a/crates/cdk-cli/src/sub_commands/receive.rs b/crates/cdk-cli/src/sub_commands/receive.rs index 4fac0c17..15a0de38 100644 --- a/crates/cdk-cli/src/sub_commands/receive.rs +++ b/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 + 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 + Send + Sync>, + seed: &[u8], + token_str: &str, signing_keys: &[SecretKey], preimage: &[String], ) -> Result { + 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) }