Merge pull request #653 from ok300/ok300-fix-update-mint-url

Wallet: fix `update_mint_url`
This commit is contained in:
ok300
2025-03-11 18:41:52 +00:00
committed by GitHub
parent 158e321e0e
commit 72dff95322
5 changed files with 92 additions and 19 deletions

View File

@@ -36,7 +36,7 @@ serde.workspace = true
serde_json.workspace = true
# ln-regtest-rs = { path = "../../../../ln-regtest-rs" }
ln-regtest-rs = { git = "https://github.com/thesimplekid/ln-regtest-rs", rev = "ed24716" }
lightning-invoice = { version = "0.32.0", features = ["serde", "std"] }
lightning-invoice.workspace = true
tracing.workspace = true
tracing-subscriber.workspace = true
tokio-tungstenite.workspace = true

View File

@@ -3,6 +3,7 @@ use std::fmt::{Debug, Formatter};
use std::str::FromStr;
use std::sync::Arc;
use anyhow::{anyhow, Result};
use async_trait::async_trait;
use bip39::Mnemonic;
use cdk::amount::SplitTarget;
@@ -21,7 +22,7 @@ use cdk::wallet::client::MintConnector;
use cdk::wallet::Wallet;
use cdk::{Amount, Error, Mint};
use cdk_fake_wallet::FakeWallet;
use tokio::sync::Notify;
use tokio::sync::{Mutex, Notify};
use tracing_subscriber::EnvFilter;
use uuid::Uuid;
@@ -142,7 +143,7 @@ impl MintConnector for DirectMintConnection {
}
}
pub async fn create_and_start_test_mint() -> anyhow::Result<Arc<Mint>> {
pub fn setup_tracing() {
let default_filter = "debug";
let sqlx_filter = "sqlx=warn";
@@ -153,8 +154,14 @@ pub async fn create_and_start_test_mint() -> anyhow::Result<Arc<Mint>> {
default_filter, sqlx_filter, hyper_filter
));
tracing_subscriber::fmt().with_env_filter(env_filter).init();
// Ok if successful, Err if already initialized
// Allows us to setup tracing at the start of several parallel tests
let _ = tracing_subscriber::fmt()
.with_env_filter(env_filter)
.try_init();
}
pub async fn create_and_start_test_mint() -> Result<Arc<Mint>> {
let mut mint_builder = MintBuilder::new();
let database = cdk_sqlite::mint::memory::empty().await?;
@@ -188,6 +195,7 @@ pub async fn create_and_start_test_mint() -> anyhow::Result<Arc<Mint>> {
mint_builder = mint_builder
.with_name("pure test mint".to_string())
.with_description("pure test mint".to_string())
.with_urls(vec!["https://aaa".to_string()])
.with_seed(mnemonic.to_seed_normalized("").to_vec());
localstore
@@ -210,23 +218,41 @@ pub async fn create_and_start_test_mint() -> anyhow::Result<Arc<Mint>> {
Ok(mint_arc)
}
pub async fn create_test_wallet_for_mint(mint: Arc<Mint>) -> anyhow::Result<Arc<Wallet>> {
let connector = DirectMintConnection::new(mint);
async fn create_test_wallet_for_mint(mint: Arc<Mint>) -> Result<Wallet> {
let connector = DirectMintConnection::new(mint.clone());
let mint_info = mint.mint_info().await?;
let mint_url = mint_info
.urls
.as_ref()
.ok_or(anyhow!("Test mint URLs list is unset"))?
.first()
.ok_or(anyhow!("Test mint has empty URLs list"))?;
let seed = Mnemonic::generate(12)?.to_seed_normalized("");
let mint_url = "http://aa".to_string();
let unit = CurrencyUnit::Sat;
let localstore = cdk_sqlite::wallet::memory::empty().await?;
let mut wallet = Wallet::new(&mint_url, unit, Arc::new(localstore), &seed, None)?;
let mut wallet = Wallet::new(mint_url, unit, Arc::new(localstore), &seed, None)?;
wallet.set_client(connector);
Ok(Arc::new(wallet))
Ok(wallet)
}
pub async fn create_test_wallet_arc_for_mint(mint: Arc<Mint>) -> Result<Arc<Wallet>> {
create_test_wallet_for_mint(mint).await.map(Arc::new)
}
pub async fn create_test_wallet_arc_mut_for_mint(mint: Arc<Mint>) -> Result<Arc<Mutex<Wallet>>> {
create_test_wallet_for_mint(mint)
.await
.map(Mutex::new)
.map(Arc::new)
}
/// Creates a mint quote for the given amount and checks its state in a loop. Returns when
/// amount is minted.
pub async fn fund_wallet(wallet: Arc<Wallet>, amount: u64) -> anyhow::Result<Amount> {
pub async fn fund_wallet(wallet: Arc<Wallet>, amount: u64) -> Result<Amount> {
let desired_amount = Amount::from(amount);
let quote = wallet.mint_quote(desired_amount, None).await?;

View File

@@ -4,14 +4,13 @@ use cdk::amount::SplitTarget;
use cdk::nuts::nut00::ProofsMethods;
use cdk::wallet::SendKind;
use cdk::Amount;
use cdk_integration_tests::init_pure_tests::{
create_and_start_test_mint, create_test_wallet_for_mint, fund_wallet,
};
use cdk_integration_tests::init_pure_tests::*;
#[tokio::test]
async fn test_swap_to_send() -> anyhow::Result<()> {
setup_tracing();
let mint_bob = create_and_start_test_mint().await?;
let wallet_alice = create_test_wallet_for_mint(mint_bob.clone()).await?;
let wallet_alice = create_test_wallet_arc_for_mint(mint_bob.clone()).await?;
// Alice gets 64 sats
fund_wallet(wallet_alice.clone(), 64).await?;
@@ -33,7 +32,7 @@ async fn test_swap_to_send() -> anyhow::Result<()> {
assert_eq!(Amount::from(24), wallet_alice.total_balance().await?);
// Alice sends cashu, Carol receives
let wallet_carol = create_test_wallet_for_mint(mint_bob.clone()).await?;
let wallet_carol = create_test_wallet_arc_for_mint(mint_bob.clone()).await?;
let received_amount = wallet_carol
.receive_proofs(token.proofs(), SplitTarget::None, &[], &[])
.await?;
@@ -43,3 +42,44 @@ async fn test_swap_to_send() -> anyhow::Result<()> {
Ok(())
}
/// Pure integration tests related to NUT-06 (Mint Information)
mod nut06 {
use std::str::FromStr;
use std::sync::Arc;
use anyhow::Result;
use cashu::mint_url::MintUrl;
use cashu::Amount;
use cdk_integration_tests::init_pure_tests::*;
#[tokio::test]
async fn test_swap_to_send() -> Result<()> {
setup_tracing();
let mint_bob = create_and_start_test_mint().await?;
let wallet_alice_guard = create_test_wallet_arc_mut_for_mint(mint_bob.clone()).await?;
let mut wallet_alice = wallet_alice_guard.lock().await;
// Alice gets 64 sats
fund_wallet(Arc::new(wallet_alice.clone()), 64).await?;
let balance_alice = wallet_alice.total_balance().await?;
assert_eq!(Amount::from(64), balance_alice);
let initial_mint_url = wallet_alice.mint_url.clone();
let mint_info_before = wallet_alice.get_mint_info().await?.unwrap();
assert!(mint_info_before
.urls
.unwrap()
.contains(&initial_mint_url.to_string()));
// Wallet updates mint URL
let new_mint_url = MintUrl::from_str("https://new-mint-url")?;
wallet_alice.update_mint_url(new_mint_url.clone()).await?;
// Check balance after mint URL was updated
let balance_alice_after = wallet_alice.total_balance().await?;
assert_eq!(Amount::from(64), balance_alice_after);
Ok(())
}
}