1use serde::{Deserialize, Serialize};
2use thiserror::Error;
3
4#[derive(Clone, Copy, Debug, Eq, PartialEq, Serialize, Deserialize)]
5#[macros::derive_from(breez_sdk_common::network::BitcoinNetwork)]
6#[cfg_attr(feature = "uniffi", derive(uniffi::Enum))]
7pub enum BitcoinNetwork {
8 Bitcoin,
10 Testnet3,
11 Testnet4,
12 Signet,
13 Regtest,
14}
15
16#[derive(Clone, Debug, Error)]
17#[macros::derive_from(breez_sdk_common::input::ParseError)]
18pub enum ParseError {
19 #[error("empty input")]
20 EmptyInput,
21 #[error("Bip-21 error: {0}")]
22 Bip21Error(Bip21Error),
23 #[error("invalid input")]
24 InvalidInput,
25 #[error("Lnurl error: {0}")]
26 LnurlError(LnurlError),
27 #[error("Service connectivity error: {0}")]
28 ServiceConnectivity(ServiceConnectivityError),
29 #[error("Invalid external input parser: {0}")]
30 InvalidExternalInputParser(String),
31}
32
33#[derive(Clone, Debug, Error)]
34#[macros::derive_from(breez_sdk_common::input::Bip21Error)]
35pub enum Bip21Error {
36 #[error("bip21 contains invalid address")]
37 InvalidAddress,
38 #[error("bip21 contains invalid amount")]
39 InvalidAmount,
40 #[error("bip21 contains invalid parameter value for '{0}'")]
41 InvalidParameter(String),
42 #[error("bip21 parameter missing equals character")]
43 MissingEquals,
44 #[error("bip21 contains parameter '{0}' multiple times")]
45 MultipleParams(String),
46 #[error("bip21 contains unknown required parameter '{0}'")]
47 UnknownRequiredParameter(String),
48 #[error("bip21 does not contain any payment methods")]
49 NoPaymentMethods,
50}
51
52#[derive(Clone, Debug, Error)]
53#[macros::derive_from(breez_sdk_common::lnurl::error::LnurlError)]
54pub enum LnurlError {
55 #[error("lnurl missing k1 parameter")]
56 MissingK1,
57 #[error("lnurl contains invalid k1 parameter")]
58 InvalidK1,
59 #[error("lnurl contains unsupported action")]
60 UnsupportedAction,
61 #[error("lnurl missing domain")]
62 MissingDomain,
63 #[error("error calling lnurl endpoint: {0}")]
64 ServiceConnectivity(#[from] ServiceConnectivityError),
65 #[error("endpoint error: {0}")]
66 EndpointError(String),
67 #[error("lnurl has http scheme without onion domain")]
68 HttpSchemeWithoutOnionDomain,
69 #[error("lnurl has https scheme with onion domain")]
70 HttpsSchemeWithOnionDomain,
71 #[error("lnurl error: {0}")]
72 General(String),
73 #[error("lnurl has unknown scheme")]
74 UnknownScheme,
75 #[error("lnurl has invalid uri: {0}")]
76 InvalidUri(String),
77 #[error("lnurl has invalid invoice: {0}")]
78 InvalidInvoice(String),
79 #[error("lnurl has invalid response: {0}")]
80 InvalidResponse(String),
81}
82
83#[derive(Clone, Debug, Error)]
84#[macros::derive_from(breez_sdk_common::error::ServiceConnectivityError)]
85#[macros::derive_into(breez_sdk_common::error::ServiceConnectivityError)]
86#[cfg_attr(feature = "uniffi", derive(uniffi::Error))]
87pub enum ServiceConnectivityError {
88 #[error("Builder error: {0}")]
89 Builder(String),
90 #[error("Redirect error: {0}")]
91 Redirect(String),
92 #[error("Status error: {status} - {body}")]
93 Status { status: u16, body: String },
94 #[error("Timeout error: {0}")]
95 Timeout(String),
96 #[error("Request error: {0}")]
97 Request(String),
98 #[error("Connect error: {0}")]
99 Connect(String),
100 #[error("Body error: {0}")]
101 Body(String),
102 #[error("Decode error: {0}")]
103 Decode(String),
104 #[error("Json error: {0}")]
105 Json(String),
106 #[error("Other error: {0}")]
107 Other(String),
108}
109
110#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
111#[macros::derive_from(breez_sdk_common::input::Amount)]
112#[cfg_attr(feature = "uniffi", derive(uniffi::Enum))]
113pub enum Amount {
114 Bitcoin {
115 amount_msat: u64,
116 },
117 Currency {
119 iso4217_code: String,
121 fractional_amount: u64,
123 },
124}
125
126#[derive(Clone, Debug, Default, Deserialize, Serialize)]
127#[macros::derive_from(breez_sdk_common::input::Bip21Details)]
128#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
129pub struct Bip21Details {
130 pub amount_sat: Option<u64>,
131 pub asset_id: Option<String>,
132 pub uri: String,
133 pub extras: Vec<Bip21Extra>,
134 pub label: Option<String>,
135 pub message: Option<String>,
136 pub payment_methods: Vec<InputType>,
137}
138
139#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
140#[macros::derive_from(breez_sdk_common::input::Bip21Extra)]
141#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
142pub struct Bip21Extra {
143 pub key: String,
144 pub value: String,
145}
146
147#[derive(Clone, Debug, Deserialize, Serialize)]
148#[macros::derive_from(breez_sdk_common::input::BitcoinAddressDetails)]
149#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
150pub struct BitcoinAddressDetails {
151 pub address: String,
152 pub network: BitcoinNetwork,
153 pub source: PaymentRequestSource,
154}
155
156#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
157#[macros::derive_from(breez_sdk_common::input::Bolt11Invoice)]
158#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
159pub struct Bolt11Invoice {
160 pub bolt11: String,
161 pub source: PaymentRequestSource,
162}
163
164#[derive(Clone, Default, Debug, PartialEq, Eq, Serialize, Deserialize)]
165#[macros::derive_from(breez_sdk_common::input::Bolt11RouteHint)]
166#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
167pub struct Bolt11RouteHint {
168 pub hops: Vec<Bolt11RouteHintHop>,
169}
170
171#[derive(Clone, Default, Debug, PartialEq, Eq, Serialize, Deserialize)]
172#[macros::derive_from(breez_sdk_common::input::Bolt11RouteHintHop)]
173#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
174pub struct Bolt11RouteHintHop {
175 pub src_node_id: String,
177 pub short_channel_id: String,
179 pub fees_base_msat: u32,
181 pub fees_proportional_millionths: u32,
182
183 pub cltv_expiry_delta: u16,
185 pub htlc_minimum_msat: Option<u64>,
187 pub htlc_maximum_msat: Option<u64>,
189}
190
191#[derive(Clone, Debug, Deserialize, Serialize)]
192#[macros::derive_from(breez_sdk_common::input::Bolt12Invoice)]
193#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
194pub struct Bolt12Invoice {
195 pub invoice: String,
196 pub source: PaymentRequestSource,
197}
198
199#[derive(Clone, Debug, Deserialize, Serialize)]
200#[macros::derive_from(breez_sdk_common::input::Bolt12InvoiceRequestDetails)]
201#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
202pub struct Bolt12InvoiceRequestDetails {
203 }
205
206#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)]
207#[macros::derive_from(breez_sdk_common::input::Bolt12OfferBlindedPath)]
208#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
209pub struct Bolt12OfferBlindedPath {
210 pub blinded_hops: Vec<String>,
211}
212
213#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
214#[macros::derive_from(breez_sdk_common::input::Bolt11InvoiceDetails)]
215#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
216pub struct Bolt11InvoiceDetails {
217 pub amount_msat: Option<u64>,
218 pub description: Option<String>,
219 pub description_hash: Option<String>,
220 pub expiry: u64,
221 pub invoice: Bolt11Invoice,
222 pub min_final_cltv_expiry_delta: u64,
223 pub network: BitcoinNetwork,
224 pub payee_pubkey: String,
225 pub payment_hash: String,
226 pub payment_secret: String,
227 pub routing_hints: Vec<Bolt11RouteHint>,
228 pub timestamp: u64,
229}
230
231#[derive(Clone, Debug, Deserialize, Serialize)]
232#[macros::derive_from(breez_sdk_common::input::Bolt12InvoiceDetails)]
233#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
234pub struct Bolt12InvoiceDetails {
235 pub amount_msat: u64,
236 pub invoice: Bolt12Invoice,
237}
238
239#[derive(Clone, Debug, Deserialize, Serialize)]
240#[macros::derive_from(breez_sdk_common::input::Bolt12Offer)]
241#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
242pub struct Bolt12Offer {
243 pub offer: String,
244 pub source: PaymentRequestSource,
245}
246
247#[derive(Clone, Debug, Deserialize, Serialize)]
248#[macros::derive_from(breez_sdk_common::input::Bolt12OfferDetails)]
249#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
250pub struct Bolt12OfferDetails {
251 pub absolute_expiry: Option<u64>,
252 pub chains: Vec<String>,
253 pub description: Option<String>,
254 pub issuer: Option<String>,
255 pub min_amount: Option<Amount>,
256 pub offer: Bolt12Offer,
257 pub paths: Vec<Bolt12OfferBlindedPath>,
258 pub signing_pubkey: Option<String>,
259}
260
261#[derive(Clone, Debug, Deserialize, Serialize)]
262#[macros::derive_from(breez_sdk_common::input::InputType)]
263#[cfg_attr(feature = "uniffi", derive(uniffi::Enum))]
264pub enum InputType {
265 BitcoinAddress(BitcoinAddressDetails),
266 Bolt11Invoice(Bolt11InvoiceDetails),
267 Bolt12Invoice(Bolt12InvoiceDetails),
268 Bolt12Offer(Bolt12OfferDetails),
269 LightningAddress(LightningAddressDetails),
270 LnurlPay(LnurlPayRequestDetails),
271 SilentPaymentAddress(SilentPaymentAddressDetails),
272 LnurlAuth(LnurlAuthRequestDetails),
273 Url(String),
274 Bip21(Bip21Details),
275 Bolt12InvoiceRequest(Bolt12InvoiceRequestDetails),
276 LnurlWithdraw(LnurlWithdrawRequestDetails),
277 SparkAddress(SparkAddressDetails),
278 SparkInvoice(SparkInvoiceDetails),
279}
280
281#[derive(Clone, Debug, Deserialize, Serialize)]
282#[macros::derive_from(breez_sdk_common::lnurl::pay::LnurlPayRequestDetails)]
283#[macros::derive_into(breez_sdk_common::lnurl::pay::LnurlPayRequestDetails)]
284#[serde(rename_all = "camelCase")]
285#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
286pub struct LnurlPayRequestDetails {
287 pub callback: String,
288 pub min_sendable: u64,
290 pub max_sendable: u64,
292 #[serde(rename(deserialize = "metadata"))]
295 pub metadata_str: String,
296 #[serde(default)]
300 pub comment_allowed: u16,
301
302 #[serde(skip)]
307 pub domain: String,
308
309 #[serde(skip)]
310 pub url: String,
311
312 #[serde(skip)]
314 pub address: Option<String>,
315
316 pub allows_nostr: Option<bool>,
320 pub nostr_pubkey: Option<String>,
326}
327
328#[derive(Clone, Debug, Deserialize, Serialize)]
334#[macros::derive_from(breez_sdk_common::lnurl::auth::LnurlAuthRequestDetails)]
335#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
336pub struct LnurlAuthRequestDetails {
337 pub k1: String,
339
340 pub action: Option<String>,
342
343 #[serde(skip_serializing, skip_deserializing)]
346 pub domain: String,
347
348 #[serde(skip_serializing, skip_deserializing)]
351 pub url: String,
352}
353
354#[derive(Clone, Debug, Deserialize, Serialize)]
355#[macros::derive_from(breez_sdk_common::lnurl::withdraw::LnurlWithdrawRequestDetails)]
356#[macros::derive_into(breez_sdk_common::lnurl::withdraw::LnurlWithdrawRequestDetails)]
357#[serde(rename_all = "camelCase")]
358#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
359pub struct LnurlWithdrawRequestDetails {
360 pub callback: String,
361 pub k1: String,
362 pub default_description: String,
363 pub min_withdrawable: u64,
365 pub max_withdrawable: u64,
367}
368
369#[derive(Clone, Debug, Deserialize, Serialize)]
370#[macros::derive_from(breez_sdk_common::input::SparkAddressDetails)]
371#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
372pub struct SparkAddressDetails {
373 pub address: String,
375 pub identity_public_key: String,
377 pub network: BitcoinNetwork,
378 pub source: PaymentRequestSource,
379}
380
381#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
382#[macros::derive_from(breez_sdk_common::input::SparkInvoiceDetails)]
383#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
384pub struct SparkInvoiceDetails {
385 pub invoice: String,
387 pub identity_public_key: String,
389 pub network: BitcoinNetwork,
390 pub amount: Option<u128>,
392 pub token_identifier: Option<String>,
394 pub expiry_time: Option<u64>,
396 pub description: Option<String>,
398 pub sender_public_key: Option<String>,
400}
401
402#[derive(Clone, Debug, Deserialize, Serialize)]
403#[macros::derive_from(breez_sdk_common::input::LightningAddressDetails)]
404#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
405pub struct LightningAddressDetails {
406 pub address: String,
407 pub pay_request: LnurlPayRequestDetails,
408}
409
410#[derive(Clone, Debug, Default, Deserialize, Serialize, PartialEq)]
411#[macros::derive_from(breez_sdk_common::input::PaymentRequestSource)]
412#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
413pub struct PaymentRequestSource {
414 pub bip_21_uri: Option<String>,
415 pub bip_353_address: Option<String>,
416}
417
418#[derive(Clone, Debug, Deserialize, Serialize)]
419#[macros::derive_from(breez_sdk_common::input::SilentPaymentAddressDetails)]
420#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
421pub struct SilentPaymentAddressDetails {
422 pub address: String,
423 pub network: BitcoinNetwork,
424 pub source: PaymentRequestSource,
425}
426
427#[derive(Debug, Clone, Serialize)]
429#[macros::derive_from(breez_sdk_common::input::ExternalInputParser)]
430#[macros::derive_into(breez_sdk_common::input::ExternalInputParser)]
431#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
432pub struct ExternalInputParser {
433 pub provider_id: String,
435 pub input_regex: String,
437 pub parser_url: String,
440}
441
442#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
447#[macros::derive_from(breez_sdk_common::lnurl::pay::SuccessAction)]
448#[macros::derive_into(breez_sdk_common::lnurl::pay::SuccessAction)]
449#[serde(rename_all = "camelCase")]
450#[serde(tag = "tag")]
451#[cfg_attr(feature = "uniffi", derive(uniffi::Enum))]
452pub enum SuccessAction {
453 Aes {
455 #[serde(flatten)]
456 data: AesSuccessActionData,
457 },
458
459 Message {
461 #[serde(flatten)]
462 data: MessageSuccessActionData,
463 },
464
465 Url {
467 #[serde(flatten)]
468 data: UrlSuccessActionData,
469 },
470}
471
472#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
476#[macros::derive_from(breez_sdk_common::lnurl::pay::SuccessActionProcessed)]
477#[macros::derive_into(breez_sdk_common::lnurl::pay::SuccessActionProcessed)]
478#[cfg_attr(feature = "uniffi", derive(uniffi::Enum))]
479pub enum SuccessActionProcessed {
480 Aes { result: AesSuccessActionDataResult },
484
485 Message { data: MessageSuccessActionData },
487
488 Url { data: UrlSuccessActionData },
490}
491
492#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
496#[macros::derive_from(breez_sdk_common::lnurl::pay::AesSuccessActionData)]
497#[macros::derive_into(breez_sdk_common::lnurl::pay::AesSuccessActionData)]
498#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
499pub struct AesSuccessActionData {
500 pub description: String,
502
503 pub ciphertext: String,
505
506 pub iv: String,
508}
509
510#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
512#[macros::derive_from(breez_sdk_common::lnurl::pay::AesSuccessActionDataResult)]
513#[macros::derive_into(breez_sdk_common::lnurl::pay::AesSuccessActionDataResult)]
514#[cfg_attr(feature = "uniffi", derive(uniffi::Enum))]
515pub enum AesSuccessActionDataResult {
516 Decrypted { data: AesSuccessActionDataDecrypted },
517 ErrorStatus { reason: String },
518}
519
520#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
522#[macros::derive_from(breez_sdk_common::lnurl::pay::AesSuccessActionDataDecrypted)]
523#[macros::derive_into(breez_sdk_common::lnurl::pay::AesSuccessActionDataDecrypted)]
524#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
525pub struct AesSuccessActionDataDecrypted {
526 pub description: String,
528
529 pub plaintext: String,
531}
532
533#[derive(PartialEq, Eq, Debug, Clone, Deserialize, Serialize)]
534#[macros::derive_from(breez_sdk_common::lnurl::pay::MessageSuccessActionData)]
535#[macros::derive_into(breez_sdk_common::lnurl::pay::MessageSuccessActionData)]
536#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
537pub struct MessageSuccessActionData {
538 pub message: String,
539}
540
541#[derive(PartialEq, Eq, Debug, Clone, Deserialize, Serialize)]
542#[macros::derive_from(breez_sdk_common::lnurl::pay::UrlSuccessActionData)]
543#[macros::derive_into(breez_sdk_common::lnurl::pay::UrlSuccessActionData)]
544#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
545pub struct UrlSuccessActionData {
546 pub description: String,
548
549 pub url: String,
551
552 pub matches_callback_domain: bool,
556}