breez_sdk_spark/common/
models.rs

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    /// Mainnet
9    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    /// An amount of currency specified using ISO 4712.
118    Currency {
119        /// The currency that the amount is denominated in.
120        iso4217_code: String,
121        /// The amount in the currency unit adjusted by the ISO 4712 exponent (e.g., USD cents).
122        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    /// The `node_id` of the non-target end of the route
176    pub src_node_id: String,
177    /// The `short_channel_id` of this channel
178    pub short_channel_id: String,
179    /// The fees which must be paid to use this channel
180    pub fees_base_msat: u32,
181    pub fees_proportional_millionths: u32,
182
183    /// The difference in CLTV values between this node and the next node.
184    pub cltv_expiry_delta: u16,
185    /// The minimum value, in msat, which must be relayed to the next hop.
186    pub htlc_minimum_msat: Option<u64>,
187    /// The maximum value in msat available for routing with a single HTLC.
188    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    // TODO: Fill fields
204}
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    /// The minimum amount, in millisats, that this LNURL-pay endpoint accepts
289    pub min_sendable: u64,
290    /// The maximum amount, in millisats, that this LNURL-pay endpoint accepts
291    pub max_sendable: u64,
292    /// As per LUD-06, `metadata` is a raw string (e.g. a json representation of the inner map).
293    /// Use `metadata_vec()` to get the parsed items.
294    #[serde(rename(deserialize = "metadata"))]
295    pub metadata_str: String,
296    /// The comment length accepted by this endpoint
297    ///
298    /// See <https://github.com/lnurl/luds/blob/luds/12.md>
299    #[serde(default)]
300    pub comment_allowed: u16,
301
302    /// Indicates the domain of the LNURL-pay service, to be shown to the user when asking for
303    /// payment input, as per LUD-06 spec.
304    ///
305    /// Note: this is not the domain of the callback, but the domain of the LNURL-pay endpoint.
306    #[serde(skip)]
307    pub domain: String,
308
309    #[serde(skip)]
310    pub url: String,
311
312    /// Optional lightning address if that was used to resolve the lnurl.
313    #[serde(skip)]
314    pub address: Option<String>,
315
316    /// Value indicating whether the recipient supports Nostr Zaps through NIP-57.
317    ///
318    /// See <https://github.com/nostr-protocol/nips/blob/master/57.md>
319    pub allows_nostr: Option<bool>,
320    /// Optional recipient's lnurl provider's Nostr pubkey for NIP-57. If it exists it should be a
321    /// valid BIP 340 public key in hex.
322    ///
323    /// See <https://github.com/nostr-protocol/nips/blob/master/57.md>
324    /// See <https://github.com/bitcoin/bips/blob/master/bip-0340.mediawiki>
325    pub nostr_pubkey: Option<String>,
326}
327
328/// Wrapped in a [`InputType::LnurlAuth`], this is the result of [`parse`](breez_sdk_common::input::parse) when given a LNURL-auth endpoint.
329///
330/// It represents the endpoint's parameters for the LNURL workflow.
331///
332/// See <https://github.com/lnurl/luds/blob/luds/04.md>
333#[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    /// Hex encoded 32 bytes of challenge
339    pub k1: String,
340
341    /// When available, one of: register, login, link, auth
342    pub action: Option<String>,
343
344    /// Indicates the domain of the LNURL-auth service, to be shown to the user when asking for
345    /// auth confirmation, as per LUD-04 spec.
346    #[serde(skip_serializing, skip_deserializing)]
347    pub domain: String,
348
349    /// Indicates the URL of the LNURL-auth service, including the query arguments. This will be
350    /// extended with the signed challenge and the linking key, then called in the second step of the workflow.
351    #[serde(skip_serializing, skip_deserializing)]
352    pub url: String,
353}
354
355/// LNURL error details
356#[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/// The response from a LNURL-auth callback, indicating success or failure.
364#[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    /// On-wire format is: `{"status": "OK"}`
371    Ok,
372    /// On-wire format is: `{"status": "ERROR", "reason": "error details..."}`
373    #[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    /// The minimum amount, in millisats, that this LNURL-withdraw endpoint accepts
390    pub min_withdrawable: u64,
391    /// The maximum amount, in millisats, that this LNURL-withdraw endpoint accepts
392    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    /// The raw address string
400    pub address: String,
401    /// The identity public key of the address owner
402    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    /// The raw invoice string
412    pub invoice: String,
413    /// The identity public key of the invoice issuer
414    pub identity_public_key: String,
415    pub network: BitcoinNetwork,
416    /// Optional amount denominated in sats if `token_identifier` is absent, otherwise in the token base units
417    pub amount: Option<u128>,
418    /// The token identifier of the token payment. Absence indicates a Bitcoin payment.
419    pub token_identifier: Option<String>,
420    /// Optional expiry time as a unix timestamp in seconds. If not provided, the invoice will never expire.
421    pub expiry_time: Option<u64>,
422    /// Optional description.
423    pub description: Option<String>,
424    /// If set, the invoice may only be fulfilled by a payer with this public key.
425    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/// Configuration for an external input parser
454#[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    /// An arbitrary parser provider id
460    pub provider_id: String,
461    /// The external parser will be used when an input conforms to this regex
462    pub input_regex: String,
463    /// The URL of the parser containing a placeholder `<input>` that will be replaced with the
464    /// input to be parsed. The input is sanitized using percent encoding.
465    pub parser_url: String,
466}
467
468/// Supported success action types
469///
470/// Receiving any other (unsupported) success action type will result in a failed parsing,
471/// which will abort the LNURL-pay workflow, as per LUD-09.
472#[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 type, described in LUD-10
480    Aes {
481        #[serde(flatten)]
482        data: AesSuccessActionData,
483    },
484
485    /// Message type, described in LUD-09
486    Message {
487        #[serde(flatten)]
488        data: MessageSuccessActionData,
489    },
490
491    /// URL type, described in LUD-09
492    Url {
493        #[serde(flatten)]
494        data: UrlSuccessActionData,
495    },
496}
497
498/// [`SuccessAction`] where contents are ready to be consumed by the caller
499///
500/// Contents are identical to [`SuccessAction`], except for AES where the ciphertext is decrypted.
501#[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    /// See [`SuccessAction::Aes`] for received payload
507    ///
508    /// See [`AesSuccessActionDataDecrypted`] for decrypted payload
509    Aes { result: AesSuccessActionDataResult },
510
511    /// See [`SuccessAction::Message`]
512    Message { data: MessageSuccessActionData },
513
514    /// See [`SuccessAction::Url`]
515    Url { data: UrlSuccessActionData },
516}
517
518/// Payload of the AES success action, as received from the LNURL endpoint
519///
520/// See [`AesSuccessActionDataDecrypted`] for a similar wrapper containing the decrypted payload
521#[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    /// Contents description, up to 144 characters
527    pub description: String,
528
529    /// Base64, AES-encrypted data where encryption key is payment preimage, up to 4kb of characters
530    pub ciphertext: String,
531
532    /// Base64, initialization vector, exactly 24 characters
533    pub iv: String,
534}
535
536/// Result of decryption of [`AesSuccessActionData`] payload
537#[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/// Wrapper for the decrypted [`AesSuccessActionData`] payload
547#[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    /// Contents description, up to 144 characters
553    pub description: String,
554
555    /// Decrypted content
556    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    /// Contents description, up to 144 characters
573    pub description: String,
574
575    /// URL of the success action
576    pub url: String,
577
578    /// Indicates the success URL domain matches the LNURL callback domain.
579    ///
580    /// See <https://github.com/lnurl/luds/blob/luds/09.md>
581    pub matches_callback_domain: bool,
582}