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 [`LnurlAuth`], this is the result of [`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#[cfg_attr(feature = "uniffi", derive(uniffi::Record))]
336pub struct LnurlAuthRequestDetails {
337    /// Hex encoded 32 bytes of challenge
338    pub k1: String,
339
340    /// When available, one of: register, login, link, auth
341    pub action: Option<String>,
342
343    /// Indicates the domain of the LNURL-auth service, to be shown to the user when asking for
344    /// auth confirmation, as per LUD-04 spec.
345    #[serde(skip_serializing, skip_deserializing)]
346    pub domain: String,
347
348    /// Indicates the URL of the LNURL-auth service, including the query arguments. This will be
349    /// extended with the signed challenge and the linking key, then called in the second step of the workflow.
350    #[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    /// The minimum amount, in millisats, that this LNURL-withdraw endpoint accepts
364    pub min_withdrawable: u64,
365    /// The maximum amount, in millisats, that this LNURL-withdraw endpoint accepts
366    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    /// The raw address string
374    pub address: String,
375    /// The identity public key of the address owner
376    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    /// The raw invoice string
386    pub invoice: String,
387    /// The identity public key of the invoice issuer
388    pub identity_public_key: String,
389    pub network: BitcoinNetwork,
390    /// Optional amount denominated in sats if `token_identifier` is absent, otherwise in the token base units
391    pub amount: Option<u128>,
392    /// The token identifier of the token payment. Absence indicates a Bitcoin payment.
393    pub token_identifier: Option<String>,
394    /// Optional expiry time. If not provided, the invoice will never expire.
395    pub expiry_time: Option<u64>,
396    /// Optional description.
397    pub description: Option<String>,
398    /// If set, the invoice may only be fulfilled by a payer with this public key.
399    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/// Configuration for an external input parser
428#[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    /// An arbitrary parser provider id
434    pub provider_id: String,
435    /// The external parser will be used when an input conforms to this regex
436    pub input_regex: String,
437    /// The URL of the parser containing a placeholder `<input>` that will be replaced with the
438    /// input to be parsed. The input is sanitized using percent encoding.
439    pub parser_url: String,
440}
441
442/// Supported success action types
443///
444/// Receiving any other (unsupported) success action type will result in a failed parsing,
445/// which will abort the LNURL-pay workflow, as per LUD-09.
446#[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 type, described in LUD-10
454    Aes {
455        #[serde(flatten)]
456        data: AesSuccessActionData,
457    },
458
459    /// Message type, described in LUD-09
460    Message {
461        #[serde(flatten)]
462        data: MessageSuccessActionData,
463    },
464
465    /// URL type, described in LUD-09
466    Url {
467        #[serde(flatten)]
468        data: UrlSuccessActionData,
469    },
470}
471
472/// [`SuccessAction`] where contents are ready to be consumed by the caller
473///
474/// Contents are identical to [`SuccessAction`], except for AES where the ciphertext is decrypted.
475#[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    /// See [`SuccessAction::Aes`] for received payload
481    ///
482    /// See [`AesSuccessActionDataDecrypted`] for decrypted payload
483    Aes { result: AesSuccessActionDataResult },
484
485    /// See [`SuccessAction::Message`]
486    Message { data: MessageSuccessActionData },
487
488    /// See [`SuccessAction::Url`]
489    Url { data: UrlSuccessActionData },
490}
491
492/// Payload of the AES success action, as received from the LNURL endpoint
493///
494/// See [`AesSuccessActionDataDecrypted`] for a similar wrapper containing the decrypted payload
495#[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    /// Contents description, up to 144 characters
501    pub description: String,
502
503    /// Base64, AES-encrypted data where encryption key is payment preimage, up to 4kb of characters
504    pub ciphertext: String,
505
506    /// Base64, initialization vector, exactly 24 characters
507    pub iv: String,
508}
509
510/// Result of decryption of [`AesSuccessActionData`] payload
511#[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/// Wrapper for the decrypted [`AesSuccessActionData`] payload
521#[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    /// Contents description, up to 144 characters
527    pub description: String,
528
529    /// Decrypted content
530    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    /// Contents description, up to 144 characters
547    pub description: String,
548
549    /// URL of the success action
550    pub url: String,
551
552    /// Indicates the success URL domain matches the LNURL callback domain.
553    ///
554    /// See <https://github.com/lnurl/luds/blob/luds/09.md>
555    pub matches_callback_domain: bool,
556}