cdk_common/
mint.rs

1//! Mint types
2
3use bitcoin::bip32::DerivationPath;
4use cashu::{MeltQuoteBolt11Response, MintQuoteBolt11Response};
5use serde::{Deserialize, Serialize};
6use uuid::Uuid;
7
8use crate::nuts::{MeltQuoteState, MintQuoteState};
9use crate::{Amount, CurrencyUnit, Id, KeySetInfo, PublicKey};
10
11/// Mint Quote Info
12#[derive(Debug, Clone, Hash, PartialEq, Eq, Serialize, Deserialize)]
13pub struct MintQuote {
14    /// Quote id
15    pub id: Uuid,
16    /// Amount of quote
17    pub amount: Amount,
18    /// Unit of quote
19    pub unit: CurrencyUnit,
20    /// Quote payment request e.g. bolt11
21    pub request: String,
22    /// Quote state
23    pub state: MintQuoteState,
24    /// Expiration time of quote
25    pub expiry: u64,
26    /// Value used by ln backend to look up state of request
27    pub request_lookup_id: String,
28    /// Pubkey
29    pub pubkey: Option<PublicKey>,
30}
31
32impl MintQuote {
33    /// Create new [`MintQuote`]
34    pub fn new(
35        request: String,
36        unit: CurrencyUnit,
37        amount: Amount,
38        expiry: u64,
39        request_lookup_id: String,
40        pubkey: Option<PublicKey>,
41    ) -> Self {
42        let id = Uuid::new_v4();
43
44        Self {
45            id,
46            amount,
47            unit,
48            request,
49            state: MintQuoteState::Unpaid,
50            expiry,
51            request_lookup_id,
52            pubkey,
53        }
54    }
55}
56
57// Melt Quote Info
58#[derive(Debug, Clone, Hash, PartialEq, Eq, Serialize, Deserialize)]
59pub struct MeltQuote {
60    /// Quote id
61    pub id: Uuid,
62    /// Quote unit
63    pub unit: CurrencyUnit,
64    /// Quote amount
65    pub amount: Amount,
66    /// Quote Payment request e.g. bolt11
67    pub request: String,
68    /// Quote fee reserve
69    pub fee_reserve: Amount,
70    /// Quote state
71    pub state: MeltQuoteState,
72    /// Expiration time of quote
73    pub expiry: u64,
74    /// Payment preimage
75    pub payment_preimage: Option<String>,
76    /// Value used by ln backend to look up state of request
77    pub request_lookup_id: String,
78    /// Msat to pay
79    ///
80    /// Used for an amountless invoice
81    pub msat_to_pay: Option<Amount>,
82}
83
84impl MeltQuote {
85    /// Create new [`MeltQuote`]
86    pub fn new(
87        request: String,
88        unit: CurrencyUnit,
89        amount: Amount,
90        fee_reserve: Amount,
91        expiry: u64,
92        request_lookup_id: String,
93        msat_to_pay: Option<Amount>,
94    ) -> Self {
95        let id = Uuid::new_v4();
96
97        Self {
98            id,
99            amount,
100            unit,
101            request,
102            fee_reserve,
103            state: MeltQuoteState::Unpaid,
104            expiry,
105            payment_preimage: None,
106            request_lookup_id,
107            msat_to_pay,
108        }
109    }
110}
111
112/// Mint Keyset Info
113#[derive(Debug, Clone, Hash, PartialEq, Eq, Serialize, Deserialize)]
114pub struct MintKeySetInfo {
115    /// Keyset [`Id`]
116    pub id: Id,
117    /// Keyset [`CurrencyUnit`]
118    pub unit: CurrencyUnit,
119    /// Keyset active or inactive
120    /// Mint will only issue new [`BlindSignature`] on active keysets
121    pub active: bool,
122    /// Starting unix time Keyset is valid from
123    pub valid_from: u64,
124    /// When the Keyset is valid to
125    /// This is not shown to the wallet and can only be used internally
126    pub valid_to: Option<u64>,
127    /// [`DerivationPath`] keyset
128    pub derivation_path: DerivationPath,
129    /// DerivationPath index of Keyset
130    pub derivation_path_index: Option<u32>,
131    /// Max order of keyset
132    pub max_order: u8,
133    /// Input Fee ppk
134    #[serde(default = "default_fee")]
135    pub input_fee_ppk: u64,
136}
137
138/// Default fee
139pub fn default_fee() -> u64 {
140    0
141}
142
143impl From<MintKeySetInfo> for KeySetInfo {
144    fn from(keyset_info: MintKeySetInfo) -> Self {
145        Self {
146            id: keyset_info.id,
147            unit: keyset_info.unit,
148            active: keyset_info.active,
149            input_fee_ppk: keyset_info.input_fee_ppk,
150        }
151    }
152}
153
154impl From<MintQuote> for MintQuoteBolt11Response<Uuid> {
155    fn from(mint_quote: crate::mint::MintQuote) -> MintQuoteBolt11Response<Uuid> {
156        MintQuoteBolt11Response {
157            quote: mint_quote.id,
158            request: mint_quote.request,
159            state: mint_quote.state,
160            expiry: Some(mint_quote.expiry),
161            pubkey: mint_quote.pubkey,
162            amount: Some(mint_quote.amount),
163            unit: Some(mint_quote.unit.clone()),
164        }
165    }
166}
167
168impl From<&MeltQuote> for MeltQuoteBolt11Response<Uuid> {
169    fn from(melt_quote: &MeltQuote) -> MeltQuoteBolt11Response<Uuid> {
170        MeltQuoteBolt11Response {
171            quote: melt_quote.id,
172            payment_preimage: None,
173            change: None,
174            state: melt_quote.state,
175            paid: Some(melt_quote.state == MeltQuoteState::Paid),
176            expiry: melt_quote.expiry,
177            amount: melt_quote.amount,
178            fee_reserve: melt_quote.fee_reserve,
179            request: None,
180            unit: Some(melt_quote.unit.clone()),
181        }
182    }
183}
184
185impl From<MeltQuote> for MeltQuoteBolt11Response<Uuid> {
186    fn from(melt_quote: MeltQuote) -> MeltQuoteBolt11Response<Uuid> {
187        let paid = melt_quote.state == MeltQuoteState::Paid;
188        MeltQuoteBolt11Response {
189            quote: melt_quote.id,
190            amount: melt_quote.amount,
191            fee_reserve: melt_quote.fee_reserve,
192            paid: Some(paid),
193            state: melt_quote.state,
194            expiry: melt_quote.expiry,
195            payment_preimage: melt_quote.payment_preimage,
196            change: None,
197            request: Some(melt_quote.request.clone()),
198            unit: Some(melt_quote.unit.clone()),
199        }
200    }
201}