mirror of
https://github.com/aljazceru/cdk.git
synced 2026-02-15 01:56:06 +01:00
feat(wallet): claim p2pk token
This commit is contained in:
@@ -676,18 +676,26 @@ impl<C: Client, L: LocalStore> Wallet<C, L> {
|
||||
|
||||
/// Create P2PK locked proofs
|
||||
/// Uses a swap to swap proofs for locked p2pk conditions
|
||||
pub async fn create_p2pk_proofs(
|
||||
pub async fn send_p2pk(
|
||||
&mut self,
|
||||
mint_url: &UncheckedUrl,
|
||||
unit: &CurrencyUnit,
|
||||
input_proofs: Proofs,
|
||||
amount: Amount,
|
||||
conditions: P2PKConditions,
|
||||
) -> Result<Proofs, Error> {
|
||||
let amount = input_proofs.iter().map(|p| p.amount).sum();
|
||||
let input_proofs = self.select_proofs(mint_url.clone(), unit, amount).await?;
|
||||
let active_keyset_id = self.active_mint_keyset(mint_url, unit).await?.unwrap();
|
||||
|
||||
let pre_mint_secrets =
|
||||
let input_amount: Amount = input_proofs.iter().map(|p| p.amount).sum();
|
||||
let change_amount = input_amount - amount;
|
||||
|
||||
let send_premint_secrets =
|
||||
PreMintSecrets::with_p2pk_conditions(active_keyset_id, amount, conditions)?;
|
||||
|
||||
let change_premint_secrets = PreMintSecrets::random(active_keyset_id, change_amount)?;
|
||||
let mut pre_mint_secrets = send_premint_secrets;
|
||||
pre_mint_secrets.combine(change_premint_secrets);
|
||||
|
||||
let swap_request =
|
||||
SwapRequest::new(input_proofs.clone(), pre_mint_secrets.blinded_messages());
|
||||
|
||||
@@ -712,8 +720,8 @@ impl<C: Client, L: LocalStore> Wallet<C, L> {
|
||||
let mut change_proofs = vec![];
|
||||
|
||||
for proof in post_swap_proofs {
|
||||
println!("post swap proof: {:?}", proof);
|
||||
let conditions: Result<cashu::nuts::nut10::Secret, _> = (&proof.secret).try_into();
|
||||
println!("{:?}", conditions);
|
||||
if conditions.is_ok() {
|
||||
send_proofs.push(proof);
|
||||
} else {
|
||||
@@ -738,7 +746,86 @@ impl<C: Client, L: LocalStore> Wallet<C, L> {
|
||||
Ok(send_proofs)
|
||||
}
|
||||
|
||||
pub async fn claim_p2pk_locked_proof(
|
||||
/// Receive p2pk
|
||||
pub async fn receive_p2pk(
|
||||
&mut self,
|
||||
encoded_token: &str,
|
||||
signing_keys: Vec<SigningKey>,
|
||||
) -> Result<(), Error> {
|
||||
let pubkey_secret_key: HashMap<String, SigningKey> = signing_keys
|
||||
.into_iter()
|
||||
.map(|s| (s.public_key().to_string(), s))
|
||||
.collect();
|
||||
|
||||
let token_data = Token::from_str(encoded_token)?;
|
||||
|
||||
let unit = token_data.unit.unwrap_or_default();
|
||||
|
||||
let mut received_proofs: HashMap<UncheckedUrl, Proofs> = HashMap::new();
|
||||
for token in token_data.token {
|
||||
if token.proofs.is_empty() {
|
||||
continue;
|
||||
}
|
||||
|
||||
let active_keyset_id = self.active_mint_keyset(&token.mint, &unit).await?;
|
||||
|
||||
// TODO: if none fetch keyset for mint
|
||||
|
||||
let keys = self.localstore.get_keys(&active_keyset_id.unwrap()).await?;
|
||||
|
||||
// Sum amount of all proofs
|
||||
let amount: Amount = token.proofs.iter().map(|p| p.amount).sum();
|
||||
|
||||
let mut proofs = token.proofs;
|
||||
|
||||
for proof in &mut proofs {
|
||||
if let Ok(secret) =
|
||||
<cashu::secret::Secret as TryInto<cashu::nuts::nut10::Secret>>::try_into(
|
||||
proof.secret.clone(),
|
||||
)
|
||||
{
|
||||
let conditions: Result<P2PKConditions, _> = secret.try_into();
|
||||
if let Ok(conditions) = conditions {
|
||||
let pubkeys = conditions.pubkeys;
|
||||
|
||||
for pubkey in pubkeys {
|
||||
if let Some(signing) = pubkey_secret_key.get(&pubkey.to_string()) {
|
||||
proof.sign_p2pk_proof(signing.clone()).ok();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
let pre_swap = self
|
||||
.create_swap(&token.mint, &unit, Some(amount), proofs)
|
||||
.await?;
|
||||
|
||||
let swap_response = self
|
||||
.client
|
||||
.post_swap(token.mint.clone().try_into()?, pre_swap.swap_request)
|
||||
.await?;
|
||||
|
||||
// Proof to keep
|
||||
let p = construct_proofs(
|
||||
swap_response.signatures,
|
||||
pre_swap.pre_mint_secrets.rs(),
|
||||
pre_swap.pre_mint_secrets.secrets(),
|
||||
&keys.unwrap(),
|
||||
)?;
|
||||
let mint_proofs = received_proofs.entry(token.mint).or_default();
|
||||
|
||||
mint_proofs.extend(p);
|
||||
}
|
||||
|
||||
for (mint, proofs) in received_proofs {
|
||||
self.localstore.add_proofs(mint, proofs).await?;
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub async fn claim_p2pk_locked_proofs(
|
||||
&mut self,
|
||||
mint_url: &UncheckedUrl,
|
||||
unit: &CurrencyUnit,
|
||||
|
||||
Reference in New Issue
Block a user