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#[macros::derive_into(breez_sdk_common::lnurl::auth::LnurlAuthRequestDetails)]
336#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
337pub struct LnurlAuthRequestDetails {
338 pub k1: String,
340
341 pub action: Option<String>,
343
344 #[serde(skip_serializing, skip_deserializing)]
347 pub domain: String,
348
349 #[serde(skip_serializing, skip_deserializing)]
352 pub url: String,
353}
354
355#[derive(Clone, Debug, Deserialize, Serialize)]
357#[macros::derive_from(breez_sdk_common::lnurl::LnurlErrorDetails)]
358#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
359pub struct LnurlErrorDetails {
360 pub reason: String,
361}
362
363#[derive(Clone, Debug, Deserialize, Serialize)]
365#[macros::derive_from(breez_sdk_common::lnurl::LnurlCallbackStatus)]
366#[serde(rename_all = "UPPERCASE")]
367#[serde(tag = "status")]
368#[cfg_attr(feature = "uniffi", derive(uniffi::Enum))]
369pub enum LnurlCallbackStatus {
370 Ok,
372 #[serde(rename = "ERROR")]
374 ErrorStatus {
375 #[serde(flatten)]
376 error_details: LnurlErrorDetails,
377 },
378}
379
380#[derive(Clone, Debug, Deserialize, Serialize)]
381#[macros::derive_from(breez_sdk_common::lnurl::withdraw::LnurlWithdrawRequestDetails)]
382#[macros::derive_into(breez_sdk_common::lnurl::withdraw::LnurlWithdrawRequestDetails)]
383#[serde(rename_all = "camelCase")]
384#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
385pub struct LnurlWithdrawRequestDetails {
386 pub callback: String,
387 pub k1: String,
388 pub default_description: String,
389 pub min_withdrawable: u64,
391 pub max_withdrawable: u64,
393}
394
395#[derive(Clone, Debug, Deserialize, Serialize)]
396#[macros::derive_from(breez_sdk_common::input::SparkAddressDetails)]
397#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
398pub struct SparkAddressDetails {
399 pub address: String,
401 pub identity_public_key: String,
403 pub network: BitcoinNetwork,
404 pub source: PaymentRequestSource,
405}
406
407#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
408#[macros::derive_from(breez_sdk_common::input::SparkInvoiceDetails)]
409#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
410pub struct SparkInvoiceDetails {
411 pub invoice: String,
413 pub identity_public_key: String,
415 pub network: BitcoinNetwork,
416 pub amount: Option<u128>,
418 pub token_identifier: Option<String>,
420 pub expiry_time: Option<u64>,
422 pub description: Option<String>,
424 pub sender_public_key: Option<String>,
426}
427
428#[derive(Clone, Debug, Deserialize, Serialize)]
429#[macros::derive_from(breez_sdk_common::input::LightningAddressDetails)]
430#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
431pub struct LightningAddressDetails {
432 pub address: String,
433 pub pay_request: LnurlPayRequestDetails,
434}
435
436#[derive(Clone, Debug, Default, Deserialize, Serialize, PartialEq)]
437#[macros::derive_from(breez_sdk_common::input::PaymentRequestSource)]
438#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
439pub struct PaymentRequestSource {
440 pub bip_21_uri: Option<String>,
441 pub bip_353_address: Option<String>,
442}
443
444#[derive(Clone, Debug, Deserialize, Serialize)]
445#[macros::derive_from(breez_sdk_common::input::SilentPaymentAddressDetails)]
446#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
447pub struct SilentPaymentAddressDetails {
448 pub address: String,
449 pub network: BitcoinNetwork,
450 pub source: PaymentRequestSource,
451}
452
453#[derive(Debug, Clone, Serialize)]
455#[macros::derive_from(breez_sdk_common::input::ExternalInputParser)]
456#[macros::derive_into(breez_sdk_common::input::ExternalInputParser)]
457#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
458pub struct ExternalInputParser {
459 pub provider_id: String,
461 pub input_regex: String,
463 pub parser_url: String,
466}
467
468#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
473#[macros::derive_from(breez_sdk_common::lnurl::pay::SuccessAction)]
474#[macros::derive_into(breez_sdk_common::lnurl::pay::SuccessAction)]
475#[serde(rename_all = "camelCase")]
476#[serde(tag = "tag")]
477#[cfg_attr(feature = "uniffi", derive(uniffi::Enum))]
478pub enum SuccessAction {
479 Aes {
481 #[serde(flatten)]
482 data: AesSuccessActionData,
483 },
484
485 Message {
487 #[serde(flatten)]
488 data: MessageSuccessActionData,
489 },
490
491 Url {
493 #[serde(flatten)]
494 data: UrlSuccessActionData,
495 },
496}
497
498#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
502#[macros::derive_from(breez_sdk_common::lnurl::pay::SuccessActionProcessed)]
503#[macros::derive_into(breez_sdk_common::lnurl::pay::SuccessActionProcessed)]
504#[cfg_attr(feature = "uniffi", derive(uniffi::Enum))]
505pub enum SuccessActionProcessed {
506 Aes { result: AesSuccessActionDataResult },
510
511 Message { data: MessageSuccessActionData },
513
514 Url { data: UrlSuccessActionData },
516}
517
518#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
522#[macros::derive_from(breez_sdk_common::lnurl::pay::AesSuccessActionData)]
523#[macros::derive_into(breez_sdk_common::lnurl::pay::AesSuccessActionData)]
524#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
525pub struct AesSuccessActionData {
526 pub description: String,
528
529 pub ciphertext: String,
531
532 pub iv: String,
534}
535
536#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
538#[macros::derive_from(breez_sdk_common::lnurl::pay::AesSuccessActionDataResult)]
539#[macros::derive_into(breez_sdk_common::lnurl::pay::AesSuccessActionDataResult)]
540#[cfg_attr(feature = "uniffi", derive(uniffi::Enum))]
541pub enum AesSuccessActionDataResult {
542 Decrypted { data: AesSuccessActionDataDecrypted },
543 ErrorStatus { reason: String },
544}
545
546#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
548#[macros::derive_from(breez_sdk_common::lnurl::pay::AesSuccessActionDataDecrypted)]
549#[macros::derive_into(breez_sdk_common::lnurl::pay::AesSuccessActionDataDecrypted)]
550#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
551pub struct AesSuccessActionDataDecrypted {
552 pub description: String,
554
555 pub plaintext: String,
557}
558
559#[derive(PartialEq, Eq, Debug, Clone, Deserialize, Serialize)]
560#[macros::derive_from(breez_sdk_common::lnurl::pay::MessageSuccessActionData)]
561#[macros::derive_into(breez_sdk_common::lnurl::pay::MessageSuccessActionData)]
562#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
563pub struct MessageSuccessActionData {
564 pub message: String,
565}
566
567#[derive(PartialEq, Eq, Debug, Clone, Deserialize, Serialize)]
568#[macros::derive_from(breez_sdk_common::lnurl::pay::UrlSuccessActionData)]
569#[macros::derive_into(breez_sdk_common::lnurl::pay::UrlSuccessActionData)]
570#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
571pub struct UrlSuccessActionData {
572 pub description: String,
574
575 pub url: String,
577
578 pub matches_callback_domain: bool,
582}