1use 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#[derive(Debug, Clone, Hash, PartialEq, Eq, Serialize, Deserialize)]
13pub struct MintQuote {
14 pub id: Uuid,
16 pub amount: Amount,
18 pub unit: CurrencyUnit,
20 pub request: String,
22 pub state: MintQuoteState,
24 pub expiry: u64,
26 pub request_lookup_id: String,
28 pub pubkey: Option<PublicKey>,
30}
31
32impl MintQuote {
33 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#[derive(Debug, Clone, Hash, PartialEq, Eq, Serialize, Deserialize)]
59pub struct MeltQuote {
60 pub id: Uuid,
62 pub unit: CurrencyUnit,
64 pub amount: Amount,
66 pub request: String,
68 pub fee_reserve: Amount,
70 pub state: MeltQuoteState,
72 pub expiry: u64,
74 pub payment_preimage: Option<String>,
76 pub request_lookup_id: String,
78 pub msat_to_pay: Option<Amount>,
82}
83
84impl MeltQuote {
85 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#[derive(Debug, Clone, Hash, PartialEq, Eq, Serialize, Deserialize)]
114pub struct MintKeySetInfo {
115 pub id: Id,
117 pub unit: CurrencyUnit,
119 pub active: bool,
122 pub valid_from: u64,
124 pub valid_to: Option<u64>,
127 pub derivation_path: DerivationPath,
129 pub derivation_path_index: Option<u32>,
131 pub max_order: u8,
133 #[serde(default = "default_fee")]
135 pub input_fee_ppk: u64,
136}
137
138pub 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}