mirror of
https://github.com/aljazceru/cdk.git
synced 2026-02-10 15:45:59 +01:00
feat(wallet): melt_proofs
This commit is contained in:
@@ -30,6 +30,8 @@
|
||||
|
||||
### Added
|
||||
- cdk(NUT-11): Add `Copy` on `SigFlag` ([thesimplekid]).
|
||||
- cdk(wallet): Add `fn send_proofs` that marks proofs as `reserved` and creates token ([thesimplekid]).
|
||||
- cdk(wallet): Add `fn melt_proofs` that uses specific proofs for `melt` instead of selecting ([thesimplekid]).
|
||||
|
||||
### Fixed
|
||||
- cdk(mint): `SIG_ALL` is not allowed in `melt` ([thesimplekid]).
|
||||
|
||||
@@ -1187,11 +1187,10 @@ impl Wallet {
|
||||
Ok(response)
|
||||
}
|
||||
|
||||
/// Melt
|
||||
/// Melt specific proofs
|
||||
#[instrument(skip(self))]
|
||||
pub async fn melt(&self, quote_id: &str) -> Result<Melted, Error> {
|
||||
pub async fn melt_proofs(&self, quote_id: &str, proofs: Proofs) -> Result<Melted, Error> {
|
||||
let quote_info = self.localstore.get_melt_quote(quote_id).await?;
|
||||
|
||||
let quote_info = if let Some(quote) = quote_info {
|
||||
if quote.expiry.le(&unix_time()) {
|
||||
return Err(Error::QuoteExpired);
|
||||
@@ -1202,15 +1201,7 @@ impl Wallet {
|
||||
return Err(Error::QuoteUnknown);
|
||||
};
|
||||
|
||||
let inputs_needed_amount = quote_info.amount + quote_info.fee_reserve;
|
||||
|
||||
let available_proofs = self.get_proofs().await?;
|
||||
|
||||
let input_proofs = self
|
||||
.select_proofs_to_swap(inputs_needed_amount, available_proofs)
|
||||
.await?;
|
||||
|
||||
for proof in input_proofs.iter() {
|
||||
for proof in proofs.iter() {
|
||||
self.localstore
|
||||
.set_proof_state(proof.y()?, State::Pending)
|
||||
.await?;
|
||||
@@ -1237,7 +1228,7 @@ impl Wallet {
|
||||
.post_melt(
|
||||
self.mint_url.clone().try_into()?,
|
||||
quote_id.to_string(),
|
||||
input_proofs.clone(),
|
||||
proofs.clone(),
|
||||
Some(premint_secrets.blinded_messages()),
|
||||
)
|
||||
.await;
|
||||
@@ -1248,7 +1239,7 @@ impl Wallet {
|
||||
tracing::error!("Could not melt: {}", err);
|
||||
tracing::info!("Checking status of input proofs.");
|
||||
|
||||
self.reclaim_unspent(input_proofs).await?;
|
||||
self.reclaim_unspent(proofs).await?;
|
||||
|
||||
return Err(err);
|
||||
}
|
||||
@@ -1309,11 +1300,37 @@ impl Wallet {
|
||||
|
||||
self.localstore.remove_melt_quote("e_info.id).await?;
|
||||
|
||||
self.localstore.remove_proofs(&input_proofs).await?;
|
||||
self.localstore.remove_proofs(&proofs).await?;
|
||||
|
||||
Ok(melted)
|
||||
}
|
||||
|
||||
/// Melt
|
||||
#[instrument(skip(self))]
|
||||
pub async fn melt(&self, quote_id: &str) -> Result<Melted, Error> {
|
||||
let quote_info = self.localstore.get_melt_quote(quote_id).await?;
|
||||
|
||||
let quote_info = if let Some(quote) = quote_info {
|
||||
if quote.expiry.le(&unix_time()) {
|
||||
return Err(Error::QuoteExpired);
|
||||
}
|
||||
|
||||
quote.clone()
|
||||
} else {
|
||||
return Err(Error::QuoteUnknown);
|
||||
};
|
||||
|
||||
let inputs_needed_amount = quote_info.amount + quote_info.fee_reserve;
|
||||
|
||||
let available_proofs = self.get_proofs().await?;
|
||||
|
||||
let input_proofs = self
|
||||
.select_proofs_to_swap(inputs_needed_amount, available_proofs)
|
||||
.await?;
|
||||
|
||||
self.melt_proofs(quote_id, input_proofs).await
|
||||
}
|
||||
|
||||
/// Select proofs to send
|
||||
#[instrument(skip_all)]
|
||||
pub async fn select_proofs_to_send(
|
||||
|
||||
Reference in New Issue
Block a user