use std::ops::Deref; use std::str::FromStr; use std::sync::{Arc, RwLock}; use cashu_ffi::{ Amount, CheckSpendableRequest, CheckSpendableResponse, Id, KeySet, KeySetResponse, KeysResponse, MeltBolt11Request, MeltBolt11Response, MintBolt11Request, MintBolt11Response, Secret, SwapRequest, SwapResponse, }; use cashu_sdk::mint::Mint as MintSdk; use cashu_sdk::Mnemonic; use crate::error::Result; use crate::types::MintKeySetInfo; use crate::CashuSdkError; pub struct Mint { inner: RwLock, } impl Mint { pub fn new( secret: String, keysets_info: Vec>, spent_secrets: Vec>, min_fee_reserve: Arc, percent_fee_reserve: f32, ) -> Result { let spent_secrets = spent_secrets .into_iter() .map(|s| s.as_ref().deref().clone()) .collect(); let keysets = keysets_info .into_iter() .map(|ik| ik.as_ref().deref().clone()) .collect(); let menemonic = Mnemonic::from_str(&secret).map_err(|_| CashuSdkError::Generic { err: "Invalid Mnemonic".to_string(), })?; Ok(Self { inner: MintSdk::new( menemonic, keysets, spent_secrets, // TODO: quotes vec![], *min_fee_reserve.as_ref().deref(), percent_fee_reserve, ) .into(), }) } pub fn keyset_pubkeys(&self, keyset_id: Arc) -> Option> { self.inner .read() .unwrap() .keyset_pubkeys(&keyset_id) .map(|keyset| Arc::new(keyset.into())) } pub fn keysets(&self) -> Arc { Arc::new(self.inner.read().unwrap().keysets().into()) } pub fn keyset(&self, id: Arc) -> Option> { self.inner .read() .unwrap() .keyset(&id) .map(|k| Arc::new(k.into())) } pub fn process_mint_request( &self, mint_request: Arc, ) -> Result> { Ok(Arc::new( self.inner .write() .unwrap() .process_mint_request(mint_request.as_ref().deref().clone())? .into(), )) } pub fn process_swap_request( &self, split_request: Arc, ) -> Result> { Ok(Arc::new( self.inner .write() .unwrap() .process_swap_request(split_request.as_ref().deref().clone())? .into(), )) } pub fn check_spendable( &self, check_spendable: Arc, ) -> Result> { Ok(Arc::new( self.inner .read() .unwrap() .check_spendable(check_spendable.as_ref().deref())? .into(), )) } pub fn verify_melt_request(&self, melt_request: Arc) -> Result<()> { Ok(self .inner .write() .unwrap() .verify_melt_request(melt_request.as_ref().deref())?) } pub fn process_melt_request( &self, melt_request: Arc, preimage: String, total_spent: Arc, ) -> Result> { Ok(Arc::new( self.inner .write() .unwrap() .process_melt_request( melt_request.as_ref().deref(), &preimage, *total_spent.as_ref().deref(), )? .into(), )) } }