1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
#![allow(rustdoc::private_intra_doc_links)]
//! # Breez SDK - Liquid
//!
//! This SDK provides developers with an end-to-end solution for integrating self-custodial Lightning
//! payments into their apps and services. It eliminates the need for third-parties, simplifies the
//! complexities of Bitcoin and Lightning, and enables seamless onboarding for billions of users to
//! the future of peer-to-peer payments.
//!
//! The Liquid implementation is a nodeless Lightning integration. It offers a self-custodial,
//! end-to-end solution for integrating Lightning payments, utilizing the Liquid Network with
//! on-chain interoperability and third-party fiat on-ramps.
//!
//! * Sending payments (via protocols such as: bolt11, lnurl-pay, lightning address, btc address)
//! * Receiving payments (via protocols such as: bolt11, lnurl-withdraw, btc address)
//! * Interacting with a wallet (e.g. balance, max allow to pay, max allow to receive, on-chain balance)
//!
//! ## Getting Started
//!
//! The following code initialize the SDK and make it ready to be used:
//!
//! ```ignore
//! let mnemonic = Mnemonic::generate_in(Language::English, 12)?;
//!
//! // Create the default config
//! let mut config = sdk::LiquidSdk::default_config(LiquidNetwork::Mainnet);
//!
//! // Customize the config object according to your needs
//! config.working_dir = "path to an existing directory".into();
//!
//! let connect_request = ConnectRequest {
//!     mnemonic: mnemonic.to_string(),
//!     config,
//! };
//! let sdk = sdk::LiquidSdk::connect(connect_request).await?;
//!
//! ```
//!
//! We can now receive payments
//!
//! ```ignore
//! // Fetch the Receive limits
//! let current_limits = sdk.fetch_lightning_limits().await?;
//! info!("Minimum amount: {} sats", current_limits.receive.min_sat);
//! info!("Maximum amount: {} sats", current_limits.receive.max_sat);
//!
//! // Set the amount you wish the payer to send, which should be within the above limits
//! let prepare_receive_response = sdk
//!     .prepare_receive_payment(&PrepareReceiveRequest {
//!         payment_method: PaymentMethod::Lightning,
//!         payer_amount_sat: Some(5_000),
//!     })
//!     .await?;
//!
//! // If the fees are acceptable, continue to create the Receive Payment
//! let receive_fees_sat = prepare_receive_response.fees_sat;
//!
//! let receive_payment_response = sdk.receive_payment(&ReceivePaymentRequest {
//!     description: Some("my description".to_string()),
//!     prepare_response: receive_payment_response,
//! }).await?;
//!
//! let destination = receive_payment_response.destination;
//! ```
//!
//! or make payments
//! ```ignore
//! // Set the BOLT11 invoice or Liquid BIP21/address you wish to pay
//! let prepare_send_response = sdk
//!     .prepare_send_payment(&PrepareSendRequest {
//!         destination: "invoice or Liquid BIP21/address".to_string(),
//!         amount_sat: Some(3_000),
//!     })
//!     .await?;
//!
//! // If the fees are acceptable, continue to create the Send Payment
//! let send_fees_sat = prepare_send_response.fees_sat;
//!
//! let send_response = sdk.send_payment(&SendPayentRequest {
//!     prepare_response: prepare_send_response,
//! }).await?;
//! let payment = send_response.payment;
//! ```
//!
//! At any point we can fetch the wallet state
//! ```ignore
//! let wallet_info = sdk.get_info().await?;
//! let balance_sat = wallet_info.balance_sat;
//! let pending_send_sat = wallet_info.pending_send_sat;
//! let pending_receive_sat = wallet_info.pending_receive_sat;
//! ```
//!
//! or fetch other useful infos, like the current mempool [model::RecommendedFees]
//! ```ignore
//! let fees = sdk.recommended_fees().await?;
//! ```
//!
//! These different types of operations are described below in more detail.
//!
//! ### Initializing the SDK
//!
//! There are two simple steps necessary to initialize the SDK:
//!
//! 1. [sdk::LiquidSdk::default_config] to construct the SDK [model::Config]
//! 2. [sdk::LiquidSdk::connect] to initialize the [sdk::LiquidSdk] instance
//!
//! Although you can create your own config from scratch it is recommended to use the
//! [sdk::LiquidSdk::default_config] method and customize it according to your needs.
//! Once the [model::Config] is created it is passed to the [sdk::LiquidSdk::connect] method
//! along with the mnemonic.
//!
//! Now your SDK is ready to be used.
//!
//! ### Sending a Lightning payment
//!
//! * [sdk::LiquidSdk::prepare_send_payment] to check fees
//! * [sdk::LiquidSdk::send_payment] to pay an invoice
//!
//! ### Receiving a Lightning/onchain payment
//!
//! * [sdk::LiquidSdk::prepare_receive_payment] to check fees
//! * [sdk::LiquidSdk::receive_payment] to generate an invoice/Liquid BIP21/Liquid address
//!
//! ### Sending an onchain payment
//!
//! * [sdk::LiquidSdk::prepare_pay_onchain] to check fees
//! * [sdk::LiquidSdk::pay_onchain] to pay to a Bitcoin address
//!
//! ### Refunding a payment
//!
//! * [sdk::LiquidSdk::list_refundables] to get a list of refundable swaps
//! * [sdk::LiquidSdk::prepare_refund] to check the refund fees
//! * [sdk::LiquidSdk::refund] to broadcast a refund transaction
//!
//! ### Using LNURL
//!
//! * [parse] the LNURL endpoint URL to get the workflow parameters
//! * [sdk::LiquidSdk::lnurl_pay] to pay to the parsed LNURL
//! * [sdk::LiquidSdk::lnurl_withdraw] to withdraw from the parsed LNURL
//!
//! ### Supporting fiat currencies
//!
//! * [sdk::LiquidSdk::list_fiat_currencies] to get the supported fiat currencies
//! * [sdk::LiquidSdk::fetch_fiat_rates] to get the current exchange rates

//! ### Utilities
//!
//! * [sdk::LiquidSdk::recommended_fees] for the recommended mempool fees
//! * [parse] to parse a string into an [InputType]
//! * [parse_invoice] to parse a string into an [LNInvoice]
//!
//!
//! ## Bindings
//!
//! * Dart
//! * Flutter
//! * Kotlin
//! * Python
//! * React-Native
//! * Swift
//!
//! ## Support
//!
//! Join this [telegram group](https://t.me/breezsdk).

#[cfg(feature = "frb")]
pub(crate) mod bindings;
pub(crate) mod buy;
pub(crate) mod chain;
pub(crate) mod chain_swap;
pub mod error;
pub(crate) mod event;
#[cfg(feature = "frb")]
pub(crate) mod frb_generated;
pub mod logger;
pub mod model;
pub mod persist;
pub(crate) mod receive_swap;
#[allow(dead_code)]
mod restore;
pub mod sdk;
pub(crate) mod send_swap;
pub(crate) mod swapper;
pub(crate) mod test_utils;
pub(crate) mod utils;
pub(crate) mod wallet;

pub use sdk_common::prelude::*;

#[allow(ambiguous_glob_reexports)]
#[rustfmt::skip]
pub mod prelude {
    pub use crate::*;
    pub use crate::model::*;
    pub use crate::sdk::*;
}