use cdk_signatory::signatory::RotateKeyArguments;
use tracing::instrument;
use super::{
CurrencyUnit, Id, KeySet, KeySetInfo, KeysResponse, KeysetResponse, Mint, MintKeySetInfo,
};
use crate::Error;
mod auth;
impl Mint {
#[instrument(skip(self))]
pub fn keyset_pubkeys(&self, keyset_id: &Id) -> Result<KeysResponse, Error> {
self.keysets
.load()
.iter()
.find(|keyset| &keyset.id == keyset_id)
.ok_or(Error::UnknownKeySet)
.map(|key| KeysResponse {
keysets: vec![key.into()],
})
}
#[instrument(skip_all)]
pub fn pubkeys(&self) -> KeysResponse {
KeysResponse {
keysets: self
.keysets
.load()
.iter()
.filter(|keyset| keyset.active && keyset.unit != CurrencyUnit::Auth)
.map(|key| key.into())
.collect::<Vec<_>>(),
}
}
#[instrument(skip_all)]
pub fn keysets(&self) -> KeysetResponse {
KeysetResponse {
keysets: self
.keysets
.load()
.iter()
.filter(|k| k.unit != CurrencyUnit::Auth)
.map(|k| KeySetInfo {
id: k.id,
unit: k.unit.clone(),
active: k.active,
input_fee_ppk: k.input_fee_ppk,
final_expiry: k.final_expiry,
})
.collect(),
}
}
#[instrument(skip(self))]
pub fn keyset(&self, id: &Id) -> Option<KeySet> {
self.keysets
.load()
.iter()
.find(|key| &key.id == id)
.map(|x| x.into())
}
#[instrument(skip(self))]
pub async fn rotate_keyset(
&self,
unit: CurrencyUnit,
amounts: Vec<u64>,
input_fee_ppk: u64,
use_keyset_v2: bool,
final_expiry: Option<u64>,
) -> Result<MintKeySetInfo, Error> {
let result = self
.signatory
.rotate_keyset(RotateKeyArguments {
unit,
amounts,
input_fee_ppk,
keyset_id_type: if use_keyset_v2 {
cdk_common::nut02::KeySetVersion::Version01
} else {
cdk_common::nut02::KeySetVersion::Version00
},
final_expiry,
})
.await?;
let new_keyset = self.signatory.keysets().await?;
self.keysets.store(new_keyset.keysets.into());
Ok(result.into())
}
}