feat: support muli unit

This commit is contained in:
thesimplekid
2024-07-15 22:36:30 +01:00
parent ef66273554
commit 7bdc9280d2
8 changed files with 51 additions and 25 deletions

View File

@@ -46,7 +46,7 @@ enum Commands {
/// Balance
Balance,
/// Pay bolt11 invoice
Pay,
Pay(sub_commands::melt::MeltSubCommand),
/// Claim pending mint quotes that have been paid
MintPending,
/// Receive token
@@ -148,7 +148,9 @@ async fn main() -> Result<()> {
sub_commands::decode_token::decode_token(sub_command_args)
}
Commands::Balance => sub_commands::balance::balance(&multi_mint_wallet).await,
Commands::Pay => sub_commands::melt::pay(multi_mint_wallet).await,
Commands::Pay(sub_command_args) => {
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
}

View File

@@ -7,15 +7,15 @@ use cdk::wallet::multi_mint_wallet::MultiMintWallet;
use cdk::Amount;
pub async fn balance(multi_mint_wallet: &MultiMintWallet) -> Result<()> {
mint_balances(multi_mint_wallet).await?;
mint_balances(multi_mint_wallet, &CurrencyUnit::Sat).await?;
Ok(())
}
pub async fn mint_balances(
multi_mint_wallet: &MultiMintWallet,
unit: &CurrencyUnit,
) -> Result<Vec<(UncheckedUrl, Amount)>> {
let wallets: HashMap<UncheckedUrl, Amount> =
multi_mint_wallet.get_balances(&CurrencyUnit::Sat).await?;
let wallets: HashMap<UncheckedUrl, Amount> = multi_mint_wallet.get_balances(unit).await?;
let mut wallets_vec = Vec::with_capacity(wallets.capacity());

View File

@@ -1,3 +1,5 @@
use std::str::FromStr;
use anyhow::Result;
use cdk::nuts::CurrencyUnit;
use cdk::wallet::multi_mint_wallet::WalletKey;
@@ -9,6 +11,9 @@ use clap::Args;
pub struct BurnSubCommand {
/// Mint Url
mint_url: Option<UncheckedUrl>,
/// Currency unit e.g. sat
#[arg(default_value = "sat")]
unit: String,
}
pub async fn burn(
@@ -16,10 +21,12 @@ pub async fn burn(
sub_command_args: &BurnSubCommand,
) -> Result<()> {
let mut total_burnt = Amount::ZERO;
let unit = CurrencyUnit::from_str(&sub_command_args.unit)?;
match &sub_command_args.mint_url {
Some(mint_url) => {
let wallet = multi_mint_wallet
.get_wallet(&WalletKey::new(mint_url.clone(), CurrencyUnit::Sat))
.get_wallet(&WalletKey::new(mint_url.clone(), unit))
.await
.unwrap();
total_burnt = wallet.check_all_pending_proofs().await?;

View File

@@ -6,11 +6,23 @@ use anyhow::{bail, Result};
use cdk::nuts::CurrencyUnit;
use cdk::wallet::multi_mint_wallet::{MultiMintWallet, WalletKey};
use cdk::Bolt11Invoice;
use clap::Args;
use crate::sub_commands::balance::mint_balances;
pub async fn pay(multi_mint_wallet: MultiMintWallet) -> Result<()> {
let mints_amounts = mint_balances(&multi_mint_wallet).await?;
#[derive(Args)]
pub struct MeltSubCommand {
/// Currency unit e.g. sat
#[arg(default_value = "sat")]
unit: String,
}
pub async fn pay(
multi_mint_wallet: &MultiMintWallet,
sub_command_args: &MeltSubCommand,
) -> Result<()> {
let unit = CurrencyUnit::from_str(&sub_command_args.unit)?;
let mints_amounts = mint_balances(multi_mint_wallet, &unit).await?;
println!("Enter mint number to melt from");
@@ -26,8 +38,9 @@ pub async fn pay(multi_mint_wallet: MultiMintWallet) -> Result<()> {
}
let wallet = mints_amounts[mint_number].0.clone();
let wallet = multi_mint_wallet
.get_wallet(&WalletKey::new(wallet, CurrencyUnit::Sat))
.get_wallet(&WalletKey::new(wallet, unit))
.await
.expect("Known wallet");

View File

@@ -1,3 +1,4 @@
use std::str::FromStr;
use std::sync::Arc;
use std::time::Duration;
@@ -30,19 +31,15 @@ pub async fn mint(
sub_command_args: &MintSubCommand,
) -> Result<()> {
let mint_url = sub_command_args.mint_url.clone();
let unit = CurrencyUnit::from_str(&sub_command_args.unit)?;
let wallet = match multi_mint_wallet
.get_wallet(&WalletKey::new(mint_url.clone(), CurrencyUnit::Sat))
.await
{
Some(wallet) => wallet.clone(),
None => {
let wallet = Wallet::new(
&mint_url.to_string(),
CurrencyUnit::Sat,
localstore,
seed,
None,
);
let wallet = Wallet::new(&mint_url.to_string(), unit, localstore, seed, None);
multi_mint_wallet.add_wallet(wallet.clone()).await;
wallet

View File

@@ -1,12 +1,12 @@
use anyhow::Result;
use cdk::wallet::MultiMintWallet;
use cdk::Amount;
pub async fn mint_pending(multi_mint_wallet: &MultiMintWallet) -> Result<()> {
let amounts = multi_mint_wallet.check_all_mint_quotes(None).await?;
let amount = amounts.into_values().sum::<Amount>();
for (unit, amount) in amounts {
println!("Unit: {}, Amount: {}", unit, amount);
}
println!("Amount minted: {amount}");
Ok(())
}

View File

@@ -1,3 +1,5 @@
use std::str::FromStr;
use anyhow::{anyhow, Result};
use cdk::nuts::CurrencyUnit;
use cdk::url::UncheckedUrl;
@@ -9,17 +11,18 @@ use clap::Args;
pub struct RestoreSubCommand {
/// Mint Url
mint_url: UncheckedUrl,
/// Currency unit e.g. sat
#[arg(default_value = "sat")]
unit: String,
}
pub async fn restore(
multi_mint_wallet: &MultiMintWallet,
sub_command_args: &RestoreSubCommand,
) -> Result<()> {
let unit = CurrencyUnit::from_str(&sub_command_args.unit)?;
let wallet = multi_mint_wallet
.get_wallet(&WalletKey::new(
sub_command_args.mint_url.clone(),
CurrencyUnit::Sat,
))
.get_wallet(&WalletKey::new(sub_command_args.mint_url.clone(), unit))
.await
.ok_or(anyhow!("Unknown mint url"))?;

View File

@@ -45,13 +45,17 @@ pub struct SendSubCommand {
/// Amount willing to overpay to avoid a swap
#[arg(short, long)]
tolerance: Option<u64>,
/// Currency unit e.g. sat
#[arg(default_value = "sat")]
unit: String,
}
pub async fn send(
multi_mint_wallet: &MultiMintWallet,
sub_command_args: &SendSubCommand,
) -> Result<()> {
let mints_amounts = mint_balances(multi_mint_wallet).await?;
let unit = CurrencyUnit::from_str(&sub_command_args.unit)?;
let mints_amounts = mint_balances(multi_mint_wallet, &unit).await?;
println!("Enter mint number to create token");
@@ -156,7 +160,7 @@ pub async fn send(
let wallet = mints_amounts[mint_number].0.clone();
let wallet = multi_mint_wallet
.get_wallet(&WalletKey::new(wallet, CurrencyUnit::Sat))
.get_wallet(&WalletKey::new(wallet, unit))
.await
.expect("Known wallet");