|
@@ -15,7 +15,7 @@ use crate::nuts::{
|
|
|
use crate::types::{Melted, ProofInfo};
|
|
use crate::types::{Melted, ProofInfo};
|
|
|
use crate::util::unix_time;
|
|
use crate::util::unix_time;
|
|
|
use crate::wallet::MeltQuote;
|
|
use crate::wallet::MeltQuote;
|
|
|
-use crate::{ensure_cdk, Error, Wallet};
|
|
|
|
|
|
|
+use crate::{ensure_cdk, Amount, Error, Wallet};
|
|
|
|
|
|
|
|
impl Wallet {
|
|
impl Wallet {
|
|
|
/// Melt Quote
|
|
/// Melt Quote
|
|
@@ -148,17 +148,32 @@ impl Wallet {
|
|
|
|
|
|
|
|
let active_keyset_id = self.fetch_active_keyset().await?.id;
|
|
let active_keyset_id = self.fetch_active_keyset().await?.id;
|
|
|
|
|
|
|
|
- let count = self
|
|
|
|
|
- .localstore
|
|
|
|
|
- .get_keyset_counter(&active_keyset_id)
|
|
|
|
|
- .await?;
|
|
|
|
|
|
|
+ let change_amount = proofs_total - quote_info.amount;
|
|
|
|
|
|
|
|
- let premint_secrets = PreMintSecrets::from_seed_blank(
|
|
|
|
|
- active_keyset_id,
|
|
|
|
|
- count,
|
|
|
|
|
- &self.seed,
|
|
|
|
|
- proofs_total - quote_info.amount,
|
|
|
|
|
- )?;
|
|
|
|
|
|
|
+ let premint_secrets = if change_amount <= Amount::ZERO {
|
|
|
|
|
+ PreMintSecrets::new(active_keyset_id)
|
|
|
|
|
+ } else {
|
|
|
|
|
+ // TODO: consolidate this calculation with from_seed_blank into a shared function
|
|
|
|
|
+ // Calculate how many secrets will be needed using the same logic as from_seed_blank
|
|
|
|
|
+ let num_secrets =
|
|
|
|
|
+ ((u64::from(change_amount) as f64).log2().ceil() as u64).max(1) as u32;
|
|
|
|
|
+
|
|
|
|
|
+ tracing::debug!(
|
|
|
|
|
+ "Incrementing keyset {} counter by {}",
|
|
|
|
|
+ active_keyset_id,
|
|
|
|
|
+ num_secrets
|
|
|
|
|
+ );
|
|
|
|
|
+
|
|
|
|
|
+ // Atomically get the counter range we need
|
|
|
|
|
+ let new_counter = self
|
|
|
|
|
+ .localstore
|
|
|
|
|
+ .increment_keyset_counter(&active_keyset_id, num_secrets)
|
|
|
|
|
+ .await?;
|
|
|
|
|
+
|
|
|
|
|
+ let count = new_counter - num_secrets;
|
|
|
|
|
+
|
|
|
|
|
+ PreMintSecrets::from_seed_blank(active_keyset_id, count, &self.seed, change_amount)?
|
|
|
|
|
+ };
|
|
|
|
|
|
|
|
let request = MeltRequest::new(
|
|
let request = MeltRequest::new(
|
|
|
quote_id.to_string(),
|
|
quote_id.to_string(),
|
|
@@ -226,11 +241,6 @@ impl Wallet {
|
|
|
change_proofs.total_amount()?
|
|
change_proofs.total_amount()?
|
|
|
);
|
|
);
|
|
|
|
|
|
|
|
- // Update counter for keyset
|
|
|
|
|
- self.localstore
|
|
|
|
|
- .increment_keyset_counter(&active_keyset_id, change_proofs.len() as u32)
|
|
|
|
|
- .await?;
|
|
|
|
|
-
|
|
|
|
|
change_proofs
|
|
change_proofs
|
|
|
.into_iter()
|
|
.into_iter()
|
|
|
.map(|proof| {
|
|
.map(|proof| {
|