diff --git a/crates/cashu-sdk/src/client/gloo_client.rs b/crates/cashu-sdk/src/client/gloo_client.rs index 50574b91..6d99207f 100644 --- a/crates/cashu-sdk/src/client/gloo_client.rs +++ b/crates/cashu-sdk/src/client/gloo_client.rs @@ -5,7 +5,7 @@ use async_trait::async_trait; use cashu::nuts::MintInfo; use cashu::nuts::{ BlindedMessage, Keys, MeltBolt11Request, MeltBolt11Response, MintBolt11Request, - MintBolt11Response, PreMintSecrets, Proof, SplitRequest, SplitResponse, *, + MintBolt11Response, PreMintSecrets, Proof, SwapRequest, SwapResponse, *, }; #[cfg(feature = "nut07")] use cashu::nuts::{CheckSpendableRequest, CheckSpendableResponse}; @@ -129,8 +129,8 @@ impl Client for HttpClient { async fn post_split( &self, mint_url: Url, - split_request: SplitRequest, - ) -> Result { + split_request: SwapRequest, + ) -> Result { let url = join_url(mint_url, "split")?; let res = Request::post(url.as_str()) @@ -143,8 +143,7 @@ impl Client for HttpClient { .await .map_err(|err| Error::Gloo(err.to_string()))?; - let response: Result = - serde_json::from_value(res.clone()); + let response: Result = serde_json::from_value(res.clone()); match response { Ok(res) => Ok(res), diff --git a/crates/cashu-sdk/src/client/minreq_client.rs b/crates/cashu-sdk/src/client/minreq_client.rs index 3f7a9381..e0f05dbc 100644 --- a/crates/cashu-sdk/src/client/minreq_client.rs +++ b/crates/cashu-sdk/src/client/minreq_client.rs @@ -7,7 +7,7 @@ use async_trait::async_trait; use cashu::nuts::MintInfo; use cashu::nuts::{ BlindedMessage, Keys, MeltBolt11Request, MeltBolt11Response, MintBolt11Request, - MintBolt11Response, PreMintSecrets, Proof, SplitRequest, SplitResponse, *, + MintBolt11Response, PreMintSecrets, Proof, SwapRequest, SwapResponse, *, }; #[cfg(feature = "nut07")] use cashu::nuts::{CheckSpendableRequest, CheckSpendableResponse}; @@ -108,21 +108,19 @@ impl Client for HttpClient { async fn post_split( &self, mint_url: Url, - split_request: SplitRequest, - ) -> Result { - let url = join_url(mint_url, "split")?; + split_request: SwapRequest, + ) -> Result { + // TODO: Add to endpoint + let url = join_url(mint_url, "swap")?; let res = minreq::post(url).with_json(&split_request)?.send()?; println!("{:?}", res); - let response: Result = + let response: Result = serde_json::from_value(res.json::()?.clone()); - match response { - Ok(res) if res.promises.is_some() => Ok(res), - _ => Err(Error::from_json(&res.json::()?.to_string())?), - } + Ok(response?) } /// Spendable check [NUT-07] diff --git a/crates/cashu-sdk/src/client/mod.rs b/crates/cashu-sdk/src/client/mod.rs index fd94489b..fc37cfd7 100644 --- a/crates/cashu-sdk/src/client/mod.rs +++ b/crates/cashu-sdk/src/client/mod.rs @@ -9,7 +9,7 @@ use cashu::nuts::CheckSpendableResponse; use cashu::nuts::MintInfo; use cashu::nuts::{ BlindedMessage, Keys, KeysetResponse, MeltBolt11Response, MintBolt11Response, PreMintSecrets, - Proof, SplitRequest, SplitResponse, + Proof, SwapRequest, SwapResponse, }; use cashu::utils; use serde::{Deserialize, Serialize}; @@ -111,8 +111,8 @@ pub trait Client { async fn post_split( &self, mint_url: Url, - split_request: SplitRequest, - ) -> Result; + split_request: SwapRequest, + ) -> Result; #[cfg(feature = "nut07")] async fn post_check_spendable( diff --git a/crates/cashu-sdk/src/mint.rs b/crates/cashu-sdk/src/mint.rs index 2ffd9147..d1037ec8 100644 --- a/crates/cashu-sdk/src/mint.rs +++ b/crates/cashu-sdk/src/mint.rs @@ -3,8 +3,8 @@ use std::collections::{HashMap, HashSet}; use cashu::dhke::{sign_message, verify_message}; pub use cashu::error::mint::Error; use cashu::nuts::{ - BlindedMessage, BlindedSignature, MeltBolt11Request, MeltBolt11Response, Proof, SplitRequest, - SplitResponse, *, + BlindedMessage, BlindedSignature, MeltBolt11Request, MeltBolt11Response, Proof, SwapRequest, + SwapResponse, *, }; #[cfg(feature = "nut07")] use cashu::nuts::{CheckSpendableRequest, CheckSpendableResponse}; @@ -153,8 +153,8 @@ impl Mint { pub fn process_split_request( &mut self, - split_request: SplitRequest, - ) -> Result { + split_request: SwapRequest, + ) -> Result { let proofs_total = split_request.input_amount(); let output_total = split_request.output_amount(); @@ -190,7 +190,7 @@ impl Mint { .map(|b| self.blind_sign(b).unwrap()) .collect(); - Ok(SplitResponse::new(promises)) + Ok(SwapResponse::new(promises)) } fn verify_proof(&self, proof: &Proof) -> Result<(), Error> { diff --git a/crates/cashu-sdk/src/wallet.rs b/crates/cashu-sdk/src/wallet.rs index eef5e453..0673c8f5 100644 --- a/crates/cashu-sdk/src/wallet.rs +++ b/crates/cashu-sdk/src/wallet.rs @@ -5,7 +5,7 @@ use cashu::dhke::{construct_proofs, unblind_message}; #[cfg(feature = "nut07")] use cashu::nuts::nut00::mint; use cashu::nuts::{ - BlindedSignature, CurrencyUnit, Keys, PreMintSecrets, PreSplit, Proof, Proofs, SplitRequest, + BlindedSignature, CurrencyUnit, Keys, PreMintSecrets, PreSwap, Proof, Proofs, SwapRequest, Token, }; #[cfg(feature = "nut07")] @@ -138,32 +138,27 @@ impl Wallet { // Sum amount of all proofs let _amount: Amount = token.proofs.iter().map(|p| p.amount).sum(); - let pre_split = self.create_split(None, token.proofs)?; + let pre_swap = self.create_split(None, token.proofs)?; - let split_response = self + let swap_response = self .client - .post_split(self.mint_url.clone().try_into()?, pre_split.split_request) + .post_split(self.mint_url.clone().try_into()?, pre_swap.split_request) .await?; - if let Some(promises) = &split_response.promises { - // Proof to keep - let p = construct_proofs( - promises.to_owned(), - pre_split.pre_mint_secrets.rs(), - pre_split.pre_mint_secrets.secrets(), - &keys, - )?; - proofs.push(p); - } else { - warn!("Response missing promises"); - return Err(Error::Custom("Split response missing promises".to_string())); - } + // Proof to keep + let p = construct_proofs( + swap_response.signatures, + pre_swap.pre_mint_secrets.rs(), + pre_swap.pre_mint_secrets.secrets(), + &keys, + )?; + proofs.push(p); } Ok(proofs.iter().flatten().cloned().collect()) } /// Create Split Payload - fn create_split(&self, amount: Option, proofs: Proofs) -> Result { + fn create_split(&self, amount: Option, proofs: Proofs) -> Result { // Since split is used to get the needed combination of tokens for a specific // amount first blinded messages are created for the amount @@ -184,9 +179,9 @@ impl Wallet { PreMintSecrets::random((&self.mint_keys).into(), value)? }; - let split_request = SplitRequest::new(proofs, pre_mint_secrets.blinded_messages()); + let split_request = SwapRequest::new(proofs, pre_mint_secrets.blinded_messages()); - Ok(PreSplit { + Ok(PreSwap { pre_mint_secrets, split_request, }) @@ -231,35 +226,31 @@ impl Wallet { return Err(Error::InsufficientFunds); } - let pre_split = self.create_split(Some(amount), proofs)?; + let pre_swap = self.create_split(Some(amount), proofs)?; - let split_response = self + let swap_response = self .client - .post_split(self.mint_url.clone().try_into()?, pre_split.split_request) + .post_split(self.mint_url.clone().try_into()?, pre_swap.split_request) .await?; let mut keep_proofs = Proofs::new(); let mut send_proofs = Proofs::new(); - if let Some(promises) = split_response.promises { - let mut proofs = construct_proofs( - promises, - pre_split.pre_mint_secrets.rs(), - pre_split.pre_mint_secrets.secrets(), - &self.mint_keys, - )?; + let mut proofs = construct_proofs( + swap_response.signatures, + pre_swap.pre_mint_secrets.rs(), + pre_swap.pre_mint_secrets.secrets(), + &self.mint_keys, + )?; - proofs.reverse(); + proofs.reverse(); - for proof in proofs { - if (proof.amount + send_proofs.iter().map(|p| p.amount).sum()).gt(&amount) { - keep_proofs.push(proof); - } else { - send_proofs.push(proof); - } + for proof in proofs { + if (proof.amount + send_proofs.iter().map(|p| p.amount).sum()).gt(&amount) { + keep_proofs.push(proof); + } else { + send_proofs.push(proof); } - } else { - return Err(Error::Custom("Invalid split response".to_string())); } // println!("Send Proofs: {:#?}", send_proofs); diff --git a/crates/cashu/src/nuts/mod.rs b/crates/cashu/src/nuts/mod.rs index 6f8a066f..93ac6c87 100644 --- a/crates/cashu/src/nuts/mod.rs +++ b/crates/cashu/src/nuts/mod.rs @@ -18,8 +18,8 @@ pub use nut01::{Keys, KeysResponse, PublicKey, SecretKey}; pub use nut02::mint::KeySet as MintKeySet; pub use nut02::{Id, KeySet, KeySetInfo, KeysetResponse}; #[cfg(feature = "wallet")] -pub use nut03::PreSplit; -pub use nut03::{SplitRequest, SplitResponse}; +pub use nut03::PreSwap; +pub use nut03::{SwapRequest, SwapResponse}; pub use nut04::{ MintBolt11Request, MintBolt11Response, MintQuoteBolt11Request, MintQuoteBolt11Response, }; diff --git a/crates/cashu/src/nuts/nut03.rs b/crates/cashu/src/nuts/nut03.rs index fd6e82ce..f739bd56 100644 --- a/crates/cashu/src/nuts/nut03.rs +++ b/crates/cashu/src/nuts/nut03.rs @@ -12,21 +12,21 @@ pub use crate::Bolt11Invoice; #[cfg(feature = "wallet")] #[derive(Debug, Clone, PartialEq, Eq, Serialize)] -pub struct PreSplit { +pub struct PreSwap { pub pre_mint_secrets: PreMintSecrets, - pub split_request: SplitRequest, + pub split_request: SwapRequest, } /// Split Request [NUT-06] #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] -pub struct SplitRequest { +pub struct SwapRequest { /// Proofs that are to be spent in `Split` pub inputs: Proofs, /// Blinded Messages for Mint to sign pub outputs: Vec, } -impl SplitRequest { +impl SwapRequest { pub fn new(inputs: Proofs, outputs: Vec) -> Self { Self { inputs, outputs } } @@ -44,24 +44,22 @@ impl SplitRequest { /// Split Response [NUT-06] #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)] -pub struct SplitResponse { +pub struct SwapResponse { /// Promises - pub promises: Option>, + pub signatures: Vec, } -impl SplitResponse { - pub fn new(promises: Vec) -> SplitResponse { - SplitResponse { - promises: Some(promises), +impl SwapResponse { + pub fn new(promises: Vec) -> SwapResponse { + SwapResponse { + signatures: promises, } } - pub fn promises_amount(&self) -> Option { - self.promises.as_ref().map(|promises| { - promises - .iter() - .map(|BlindedSignature { amount, .. }| *amount) - .sum() - }) + pub fn promises_amount(&self) -> Amount { + self.signatures + .iter() + .map(|BlindedSignature { amount, .. }| *amount) + .sum() } }