feat: receive adds unknown mint

This commit is contained in:
thesimplekid
2024-07-23 15:12:03 +01:00
parent fa3f6c4b38
commit bb8d088f82
3 changed files with 37 additions and 5 deletions

View File

@@ -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

View File

@@ -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)
}