//! Bolt12 use serde::{Deserialize, Serialize}; use thiserror::Error; use super::{CurrencyUnit, MeltOptions, PublicKey}; #[cfg(feature = "mint")] use crate::quote_id::QuoteId; use crate::Amount; /// NUT18 Error #[derive(Debug, Error)] pub enum Error { /// Unknown Quote State #[error("Unknown quote state")] UnknownState, /// Amount overflow #[error("Amount Overflow")] AmountOverflow, /// Publickey not defined #[error("Publickey not defined")] PublickeyUndefined, } /// Mint quote request [NUT-24] #[derive(Debug, Clone, Hash, PartialEq, Eq, Serialize, Deserialize)] #[cfg_attr(feature = "swagger", derive(utoipa::ToSchema))] pub struct MintQuoteBolt12Request { /// Amount pub amount: Option, /// Unit wallet would like to pay with pub unit: CurrencyUnit, /// Memo to create the invoice with pub description: Option, /// Pubkey pub pubkey: PublicKey, } /// Mint quote response [NUT-24] #[derive(Debug, Clone, Hash, PartialEq, Eq, Serialize, Deserialize)] #[cfg_attr(feature = "swagger", derive(utoipa::ToSchema))] #[serde(bound = "Q: Serialize + for<'a> Deserialize<'a>")] pub struct MintQuoteBolt12Response { /// Quote Id pub quote: Q, /// Payment request to fulfil pub request: String, /// Amount pub amount: Option, /// Unit wallet would like to pay with pub unit: CurrencyUnit, /// Unix timestamp until the quote is valid pub expiry: Option, /// Pubkey pub pubkey: PublicKey, /// Amount that has been paid pub amount_paid: Amount, /// Amount that has been issued pub amount_issued: Amount, } #[cfg(feature = "mint")] impl MintQuoteBolt12Response { /// Convert the MintQuote with a quote type Q to a String pub fn to_string_id(&self) -> MintQuoteBolt12Response { MintQuoteBolt12Response { quote: self.quote.to_string(), request: self.request.clone(), amount: self.amount, unit: self.unit.clone(), expiry: self.expiry, pubkey: self.pubkey, amount_paid: self.amount_paid, amount_issued: self.amount_issued, } } } #[cfg(feature = "mint")] impl From> for MintQuoteBolt12Response { fn from(value: MintQuoteBolt12Response) -> Self { Self { quote: value.quote.to_string(), request: value.request, expiry: value.expiry, amount_paid: value.amount_paid, amount_issued: value.amount_issued, pubkey: value.pubkey, amount: value.amount, unit: value.unit, } } } /// Melt quote request [NUT-18] #[derive(Debug, Clone, Hash, PartialEq, Eq, Serialize, Deserialize)] #[cfg_attr(feature = "swagger", derive(utoipa::ToSchema))] pub struct MeltQuoteBolt12Request { /// Bolt12 invoice to be paid pub request: String, /// Unit wallet would like to pay with pub unit: CurrencyUnit, /// Payment Options pub options: Option, }