mirror of
https://github.com/aljazceru/breez-sdk-liquid.git
synced 2026-02-23 06:54:20 +01:00
fix: remove mandatory API key checks (#639)
This commit is contained in:
@@ -80,11 +80,8 @@ async fn main() -> Result<()> {
|
||||
let mut config = LiquidSdk::default_config(network, breez_api_key)?;
|
||||
config.working_dir = data_dir_str;
|
||||
config.cache_dir = args.cache_dir;
|
||||
if let Some(sync_service_url) = std::env::var_os("SYNC_SERVICE_URL") {
|
||||
config.sync_service_url = sync_service_url
|
||||
.into_string()
|
||||
.expect("Expected valid sync service url");
|
||||
}
|
||||
config.sync_service_url = std::env::var_os("SYNC_SERVICE_URL")
|
||||
.map(|var| var.into_string().expect("Expected valid sync service url"));
|
||||
let sdk = LiquidSdk::connect(ConnectRequest {
|
||||
mnemonic: mnemonic.to_string(),
|
||||
config,
|
||||
|
||||
@@ -332,7 +332,7 @@ dictionary Config {
|
||||
LiquidNetwork network;
|
||||
u64 payment_timeout_sec;
|
||||
u32 zero_conf_min_fee_rate_msat;
|
||||
string sync_service_url;
|
||||
string? sync_service_url;
|
||||
string? breez_api_key;
|
||||
string? cache_dir;
|
||||
u64? zero_conf_max_amount_sat;
|
||||
|
||||
@@ -4,7 +4,7 @@ using Breez.Sdk.Liquid;
|
||||
try
|
||||
{
|
||||
var mnemonic = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about";
|
||||
var config = BreezSdkLiquidMethods.DefaultConfig(LiquidNetwork.Testnet, null);
|
||||
var config = BreezSdkLiquidMethods.DefaultConfig(LiquidNetwork.Testnet, null) with { syncServiceUrl = null };
|
||||
|
||||
var connectReq = new ConnectRequest(config, mnemonic);
|
||||
BindingLiquidSdk sdk = BreezSdkLiquidMethods.Connect(connectReq);
|
||||
|
||||
@@ -9,6 +9,7 @@ import (
|
||||
func main() {
|
||||
mnemonic := "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about"
|
||||
config, err := breez_sdk_liquid.DefaultConfig(breez_sdk_liquid.LiquidNetworkTestnet, nil)
|
||||
config.SyncServiceUrl = nil
|
||||
|
||||
if err != nil {
|
||||
log.Fatalf("Config creation failed: %#v", err)
|
||||
|
||||
@@ -4,7 +4,7 @@ using breez_sdk_liquid.breez_sdk_liquid;
|
||||
try
|
||||
{
|
||||
var mnemonic = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about";
|
||||
var config = BreezSdkLiquidMethods.DefaultConfig(LiquidNetwork.Testnet, null);
|
||||
var config = BreezSdkLiquidMethods.DefaultConfig(LiquidNetwork.Testnet, null) with { syncServiceUrl = null };
|
||||
|
||||
var connectReq = new ConnectRequest(config, mnemonic);
|
||||
BindingLiquidSdk sdk = BreezSdkLiquidMethods.Connect(connectReq);
|
||||
|
||||
@@ -8,6 +8,7 @@ class SDKListener: breez_sdk_liquid.EventListener {
|
||||
try {
|
||||
var mnemonic = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about"
|
||||
var config = breez_sdk_liquid.defaultConfig(breez_sdk_liquid.LiquidNetwork.TESTNET, null)
|
||||
config.syncServiceUrl = null
|
||||
var connectRequest = breez_sdk_liquid.ConnectRequest(config, mnemonic)
|
||||
var sdk = breez_sdk_liquid.connect(connectRequest)
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@ class SDKListener(breez_sdk_liquid.EventListener):
|
||||
def test():
|
||||
mnemonic = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about"
|
||||
config = breez_sdk_liquid.default_config(breez_sdk_liquid.LiquidNetwork.TESTNET, None)
|
||||
config.sync_service_url = None
|
||||
connect_request = breez_sdk_liquid.ConnectRequest(config=config, mnemonic=mnemonic)
|
||||
sdk = breez_sdk_liquid.connect(connect_request)
|
||||
|
||||
|
||||
@@ -7,7 +7,8 @@ class SDKListener: EventListener {
|
||||
}
|
||||
|
||||
let mnemonic = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about";
|
||||
let config = try breez_sdk_liquid.defaultConfig(network: .testnet, breezApiKey: nil);
|
||||
var config = try breez_sdk_liquid.defaultConfig(network: .testnet, breezApiKey: nil);
|
||||
config.syncServiceUrl = nil
|
||||
let connectRequest = breez_sdk_liquid.ConnectRequest(config: config, mnemonic: mnemonic);
|
||||
let sdk = try breez_sdk_liquid.connect(req: connectRequest);
|
||||
|
||||
|
||||
@@ -2496,7 +2496,7 @@ impl SseDecode for crate::model::Config {
|
||||
let mut var_network = <crate::model::LiquidNetwork>::sse_decode(deserializer);
|
||||
let mut var_paymentTimeoutSec = <u64>::sse_decode(deserializer);
|
||||
let mut var_zeroConfMinFeeRateMsat = <u32>::sse_decode(deserializer);
|
||||
let mut var_syncServiceUrl = <String>::sse_decode(deserializer);
|
||||
let mut var_syncServiceUrl = <Option<String>>::sse_decode(deserializer);
|
||||
let mut var_zeroConfMaxAmountSat = <Option<u64>>::sse_decode(deserializer);
|
||||
let mut var_breezApiKey = <Option<String>>::sse_decode(deserializer);
|
||||
let mut var_externalInputParsers =
|
||||
@@ -7082,7 +7082,7 @@ impl SseEncode for crate::model::Config {
|
||||
<crate::model::LiquidNetwork>::sse_encode(self.network, serializer);
|
||||
<u64>::sse_encode(self.payment_timeout_sec, serializer);
|
||||
<u32>::sse_encode(self.zero_conf_min_fee_rate_msat, serializer);
|
||||
<String>::sse_encode(self.sync_service_url, serializer);
|
||||
<Option<String>>::sse_encode(self.sync_service_url, serializer);
|
||||
<Option<u64>>::sse_encode(self.zero_conf_max_amount_sat, serializer);
|
||||
<Option<String>>::sse_encode(self.breez_api_key, serializer);
|
||||
<Option<Vec<crate::bindings::ExternalInputParser>>>::sse_encode(
|
||||
|
||||
@@ -29,7 +29,7 @@ use crate::utils;
|
||||
// Uses f64 for the maximum precision when converting between units
|
||||
pub const LIQUID_FEE_RATE_SAT_PER_VBYTE: f64 = 0.1;
|
||||
pub const LIQUID_FEE_RATE_MSAT_PER_VBYTE: f32 = (LIQUID_FEE_RATE_SAT_PER_VBYTE * 1000.0) as f32;
|
||||
const BREEZ_SYNC_SERVICE_URL: &str = "https://datasync.breez.technology";
|
||||
pub const BREEZ_SYNC_SERVICE_URL: &str = "https://datasync.breez.technology";
|
||||
|
||||
/// Configuration for the Liquid SDK
|
||||
#[derive(Clone, Debug, Serialize)]
|
||||
@@ -49,8 +49,9 @@ pub struct Config {
|
||||
pub payment_timeout_sec: u64,
|
||||
/// Zero-conf minimum accepted fee-rate in millisatoshis per vbyte
|
||||
pub zero_conf_min_fee_rate_msat: u32,
|
||||
/// The url of the real-time sync service
|
||||
pub sync_service_url: String,
|
||||
/// The url of the real-time sync service. Defaults to [BREEZ_SYNC_SERVICE_URL]
|
||||
/// Setting this field to `None` will disable the service
|
||||
pub sync_service_url: Option<String>,
|
||||
/// Maximum amount in satoshi to accept zero-conf payments with
|
||||
/// Defaults to [DEFAULT_ZERO_CONF_MAX_SAT]
|
||||
pub zero_conf_max_amount_sat: Option<u64>,
|
||||
@@ -74,7 +75,7 @@ pub struct Config {
|
||||
}
|
||||
|
||||
impl Config {
|
||||
pub fn mainnet(breez_api_key: String) -> Self {
|
||||
pub fn mainnet(breez_api_key: Option<String>) -> Self {
|
||||
Config {
|
||||
liquid_electrum_url: "elements-mainnet.breez.technology:50002".to_string(),
|
||||
bitcoin_electrum_url: "bitcoin-mainnet.blockstream.info:50002".to_string(),
|
||||
@@ -84,9 +85,9 @@ impl Config {
|
||||
network: LiquidNetwork::Mainnet,
|
||||
payment_timeout_sec: 15,
|
||||
zero_conf_min_fee_rate_msat: DEFAULT_ZERO_CONF_MIN_FEE_RATE,
|
||||
sync_service_url: BREEZ_SYNC_SERVICE_URL.to_string(),
|
||||
sync_service_url: Some(BREEZ_SYNC_SERVICE_URL.to_string()),
|
||||
zero_conf_max_amount_sat: None,
|
||||
breez_api_key: Some(breez_api_key),
|
||||
breez_api_key,
|
||||
external_input_parsers: None,
|
||||
use_default_external_input_parsers: true,
|
||||
onchain_fee_rate_leeway_sat_per_vbyte: None,
|
||||
@@ -103,7 +104,7 @@ impl Config {
|
||||
network: LiquidNetwork::Testnet,
|
||||
payment_timeout_sec: 15,
|
||||
zero_conf_min_fee_rate_msat: DEFAULT_ZERO_CONF_MIN_FEE_RATE,
|
||||
sync_service_url: BREEZ_SYNC_SERVICE_URL.to_string(),
|
||||
sync_service_url: Some(BREEZ_SYNC_SERVICE_URL.to_string()),
|
||||
zero_conf_max_amount_sat: None,
|
||||
breez_api_key,
|
||||
external_input_parsers: None,
|
||||
|
||||
@@ -159,7 +159,7 @@ impl Persister {
|
||||
let tx = con.transaction_with_behavior(TransactionBehavior::Immediate)?;
|
||||
self.set_last_derivation_index_inner(&tx, index)?;
|
||||
tx.commit()?;
|
||||
self.sync_trigger.try_send(())?;
|
||||
self.trigger_sync()?;
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -183,8 +183,7 @@ impl Persister {
|
||||
None => None,
|
||||
};
|
||||
tx.commit()?;
|
||||
self.sync_trigger.try_send(())?;
|
||||
|
||||
self.trigger_sync()?;
|
||||
Ok(res)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -117,7 +117,7 @@ impl Persister {
|
||||
true => {
|
||||
self.commit_outgoing(&tx, &chain_swap.id, RecordType::Chain, updated_fields)?;
|
||||
tx.commit()?;
|
||||
self.sync_trigger.try_send(())?;
|
||||
self.trigger_sync()?;
|
||||
}
|
||||
false => {
|
||||
tx.commit()?;
|
||||
@@ -305,11 +305,9 @@ impl Persister {
|
||||
Some(vec!["accept_zero_conf".to_string()]),
|
||||
)?;
|
||||
tx.commit()?;
|
||||
self.sync_trigger
|
||||
.try_send(())
|
||||
.map_err(|err| PaymentError::Generic {
|
||||
err: format!("Could not trigger manual sync: {err:?}"),
|
||||
})?;
|
||||
self.trigger_sync().map_err(|err| PaymentError::Generic {
|
||||
err: format!("Could not trigger manual sync: {err:?}"),
|
||||
})?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
@@ -367,11 +365,9 @@ impl Persister {
|
||||
Some(vec!["accepted_receiver_amount_sat".to_string()]),
|
||||
)?;
|
||||
tx.commit()?;
|
||||
self.sync_trigger
|
||||
.try_send(())
|
||||
.map_err(|err| PaymentError::Generic {
|
||||
err: format!("Could not trigger manual sync: {err:?}"),
|
||||
})?;
|
||||
self.trigger_sync().map_err(|err| PaymentError::Generic {
|
||||
err: format!("Could not trigger manual sync: {err:?}"),
|
||||
})?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@ pub(crate) mod sync;
|
||||
|
||||
use std::collections::{HashMap, HashSet};
|
||||
use std::ops::Not;
|
||||
use std::sync::RwLock;
|
||||
use std::{fs::create_dir_all, path::PathBuf, str::FromStr};
|
||||
|
||||
use crate::lightning_invoice::{Bolt11Invoice, Bolt11InvoiceDescription};
|
||||
@@ -33,7 +34,7 @@ const DEFAULT_DB_FILENAME: &str = "storage.sql";
|
||||
pub(crate) struct Persister {
|
||||
main_db_dir: PathBuf,
|
||||
network: LiquidNetwork,
|
||||
sync_trigger: Sender<()>,
|
||||
pub(crate) sync_trigger: RwLock<Option<Sender<()>>>,
|
||||
}
|
||||
|
||||
/// Builds a WHERE clause that checks if `state` is any of the given arguments
|
||||
@@ -52,7 +53,7 @@ impl Persister {
|
||||
pub fn new(
|
||||
working_dir: &str,
|
||||
network: LiquidNetwork,
|
||||
sync_trigger: Sender<()>,
|
||||
sync_trigger: Option<Sender<()>>,
|
||||
) -> Result<Self> {
|
||||
let main_db_dir = PathBuf::from_str(working_dir)?;
|
||||
if !main_db_dir.exists() {
|
||||
@@ -61,7 +62,7 @@ impl Persister {
|
||||
Ok(Persister {
|
||||
main_db_dir,
|
||||
network,
|
||||
sync_trigger,
|
||||
sync_trigger: RwLock::new(sync_trigger),
|
||||
})
|
||||
}
|
||||
|
||||
@@ -238,9 +239,8 @@ impl Persister {
|
||||
}
|
||||
|
||||
tx.commit()?;
|
||||
|
||||
if trigger_sync {
|
||||
self.sync_trigger.try_send(())?;
|
||||
self.trigger_sync()?;
|
||||
}
|
||||
|
||||
Ok(())
|
||||
@@ -299,8 +299,7 @@ impl Persister {
|
||||
None,
|
||||
)?;
|
||||
tx.commit()?;
|
||||
|
||||
self.sync_trigger.try_send(())?;
|
||||
self.trigger_sync()?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -117,7 +117,7 @@ impl Persister {
|
||||
true => {
|
||||
self.commit_outgoing(&tx, &receive_swap.id, RecordType::Receive, updated_fields)?;
|
||||
tx.commit()?;
|
||||
self.sync_trigger.try_send(())?;
|
||||
self.trigger_sync()?;
|
||||
}
|
||||
false => {
|
||||
tx.commit()?;
|
||||
|
||||
@@ -102,7 +102,7 @@ impl Persister {
|
||||
true => {
|
||||
self.commit_outgoing(&tx, &send_swap.id, RecordType::Send, updated_fields)?;
|
||||
tx.commit()?;
|
||||
self.sync_trigger.try_send(())?;
|
||||
self.trigger_sync()?;
|
||||
}
|
||||
false => {
|
||||
tx.commit()?;
|
||||
@@ -298,11 +298,10 @@ impl Persister {
|
||||
let updated_fields = get_updated_fields!(preimage);
|
||||
self.commit_outgoing(&tx, swap_id, RecordType::Send, updated_fields)?;
|
||||
tx.commit()?;
|
||||
self.sync_trigger
|
||||
.try_send(())
|
||||
.map_err(|err| PaymentError::Generic {
|
||||
err: format!("Could not trigger manual sync: {err:?}"),
|
||||
})?;
|
||||
|
||||
self.trigger_sync().map_err(|err| PaymentError::Generic {
|
||||
err: format!("Could not trigger manual sync: {err:?}"),
|
||||
})?;
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
@@ -249,6 +249,10 @@ impl Persister {
|
||||
record_type: RecordType,
|
||||
updated_fields: Option<Vec<String>>,
|
||||
) -> Result<()> {
|
||||
if self.sync_trigger.try_read().is_ok_and(|t| t.is_none()) {
|
||||
return Ok(());
|
||||
}
|
||||
|
||||
let record_id = Record::get_id_from_record_type(record_type, data_id);
|
||||
let updated_fields = updated_fields
|
||||
.map(|fields| {
|
||||
@@ -493,4 +497,13 @@ impl Persister {
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub(crate) fn trigger_sync(&self) -> Result<()> {
|
||||
if let Ok(lock) = self.sync_trigger.try_read() {
|
||||
if let Some(trigger) = lock.clone() {
|
||||
trigger.try_send(())?;
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
@@ -81,7 +81,7 @@ pub struct LiquidSdk {
|
||||
pub(crate) shutdown_sender: watch::Sender<()>,
|
||||
pub(crate) shutdown_receiver: watch::Receiver<()>,
|
||||
pub(crate) send_swap_handler: SendSwapHandler,
|
||||
pub(crate) sync_service: Arc<SyncService>,
|
||||
pub(crate) sync_service: Option<Arc<SyncService>>,
|
||||
pub(crate) receive_swap_handler: ReceiveSwapHandler,
|
||||
pub(crate) chain_swap_handler: Arc<ChainSwapHandler>,
|
||||
pub(crate) buy_bitcoin_service: Arc<dyn BuyBitcoinApi>,
|
||||
@@ -128,7 +128,7 @@ impl LiquidSdk {
|
||||
Ok(sdk)
|
||||
}
|
||||
|
||||
fn validate_api_key(api_key: &str) -> Result<()> {
|
||||
fn validate_breez_api_key(api_key: &str) -> Result<()> {
|
||||
let api_key_decoded = lwk_wollet::bitcoin::base64::engine::general_purpose::STANDARD
|
||||
.decode(api_key.as_bytes())
|
||||
.map_err(|err| anyhow!("Could not base64 decode the Breez API key: {err:?}"))?;
|
||||
@@ -158,13 +158,9 @@ impl LiquidSdk {
|
||||
swapper_proxy_url: Option<String>,
|
||||
signer: Arc<Box<dyn Signer>>,
|
||||
) -> Result<Arc<Self>> {
|
||||
match (config.network, &config.breez_api_key) {
|
||||
(_, Some(api_key)) => Self::validate_api_key(api_key)?,
|
||||
(LiquidNetwork::Mainnet, None) => {
|
||||
return Err(anyhow!("Breez API key must be provided on mainnet."));
|
||||
}
|
||||
(LiquidNetwork::Testnet, None) => {}
|
||||
};
|
||||
if let Some(breez_api_key) = &config.breez_api_key {
|
||||
Self::validate_breez_api_key(breez_api_key)?
|
||||
}
|
||||
|
||||
fs::create_dir_all(&config.working_dir)?;
|
||||
let fingerprint_hex: String =
|
||||
@@ -175,12 +171,7 @@ impl LiquidSdk {
|
||||
&fingerprint_hex,
|
||||
)?;
|
||||
|
||||
let (sync_trigger_tx, sync_trigger_rx) = tokio::sync::mpsc::channel::<()>(30);
|
||||
let persister = Arc::new(Persister::new(
|
||||
&working_dir,
|
||||
config.network,
|
||||
sync_trigger_tx,
|
||||
)?);
|
||||
let persister = Arc::new(Persister::new(&working_dir, config.network, None)?);
|
||||
persister.init()?;
|
||||
|
||||
let liquid_chain_service =
|
||||
@@ -213,15 +204,23 @@ impl LiquidSdk {
|
||||
bitcoin_chain_service.clone(),
|
||||
)?);
|
||||
|
||||
let syncer_client = Box::new(BreezSyncerClient::new(config.breez_api_key.clone()));
|
||||
let sync_service = Arc::new(SyncService::new(
|
||||
config.sync_service_url.clone(),
|
||||
persister.clone(),
|
||||
recoverer.clone(),
|
||||
signer.clone(),
|
||||
syncer_client,
|
||||
sync_trigger_rx,
|
||||
));
|
||||
let mut sync_service = None;
|
||||
if let Some(sync_service_url) = config.sync_service_url.clone() {
|
||||
if BREEZ_SYNC_SERVICE_URL == sync_service_url && config.breez_api_key.is_none() {
|
||||
anyhow::bail!(
|
||||
"Cannot start the Breez real-time sync service without providing a valid API key. See https://sdk-doc-liquid.breez.technology/guide/getting_started.html#api-key",
|
||||
);
|
||||
}
|
||||
|
||||
let syncer_client = Box::new(BreezSyncerClient::new(config.breez_api_key.clone()));
|
||||
sync_service = Some(Arc::new(SyncService::new(
|
||||
sync_service_url,
|
||||
persister.clone(),
|
||||
recoverer.clone(),
|
||||
signer.clone(),
|
||||
syncer_client,
|
||||
)));
|
||||
}
|
||||
|
||||
let send_swap_handler = SendSwapHandler::new(
|
||||
config.clone(),
|
||||
@@ -314,10 +313,9 @@ impl LiquidSdk {
|
||||
.clone()
|
||||
.start(reconnect_handler, self.shutdown_receiver.clone())
|
||||
.await;
|
||||
self.sync_service
|
||||
.clone()
|
||||
.start(self.shutdown_receiver.clone())
|
||||
.await?;
|
||||
if let Some(sync_service) = self.sync_service.clone() {
|
||||
sync_service.start(self.shutdown_receiver.clone()).await?;
|
||||
}
|
||||
self.track_new_blocks().await;
|
||||
self.track_swap_updates().await;
|
||||
|
||||
@@ -958,12 +956,14 @@ impl LiquidSdk {
|
||||
};
|
||||
}
|
||||
Ok(InputType::Bolt11 { invoice }) => {
|
||||
self.sync_service
|
||||
.pull()
|
||||
.await
|
||||
.map_err(|err| PaymentError::Generic {
|
||||
err: format!("Could not pull real-time sync changes: {err:?}"),
|
||||
})?;
|
||||
if let Some(sync_service) = &self.sync_service {
|
||||
sync_service
|
||||
.pull()
|
||||
.await
|
||||
.map_err(|err| PaymentError::Generic {
|
||||
err: format!("Could not pull real-time sync changes: {err:?}"),
|
||||
})?;
|
||||
}
|
||||
self.ensure_send_is_not_self_transfer(&invoice.bolt11)?;
|
||||
self.validate_bolt11_invoice(&invoice.bolt11)?;
|
||||
|
||||
@@ -3055,14 +3055,7 @@ impl LiquidSdk {
|
||||
breez_api_key: Option<String>,
|
||||
) -> Result<Config, SdkError> {
|
||||
let config = match network {
|
||||
LiquidNetwork::Mainnet => {
|
||||
let Some(breez_api_key) = breez_api_key else {
|
||||
return Err(SdkError::Generic {
|
||||
err: "Breez API key must be provided on mainnet.".to_string(),
|
||||
});
|
||||
};
|
||||
Config::mainnet(breez_api_key)
|
||||
}
|
||||
LiquidNetwork::Mainnet => Config::mainnet(breez_api_key),
|
||||
LiquidNetwork::Testnet => Config::testnet(breez_api_key),
|
||||
};
|
||||
Ok(config)
|
||||
|
||||
@@ -113,9 +113,9 @@ pub struct ApiKeyInterceptor {
|
||||
|
||||
impl Interceptor for ApiKeyInterceptor {
|
||||
fn call(&mut self, mut req: Request<()>) -> Result<Request<()>, Status> {
|
||||
if self.api_key_metadata.clone().is_some() {
|
||||
if let Some(api_key_metadata) = &self.api_key_metadata {
|
||||
req.metadata_mut()
|
||||
.insert("authorization", self.api_key_metadata.clone().unwrap());
|
||||
.insert("authorization", api_key_metadata.clone());
|
||||
}
|
||||
Ok(req)
|
||||
}
|
||||
|
||||
@@ -36,22 +36,28 @@ pub(crate) struct SyncService {
|
||||
}
|
||||
|
||||
impl SyncService {
|
||||
fn set_sync_trigger(persister: Arc<Persister>) -> Receiver<()> {
|
||||
let (sync_trigger_tx, sync_trigger_rx) = tokio::sync::mpsc::channel::<()>(30);
|
||||
let mut persister_trigger = persister.sync_trigger.write().unwrap();
|
||||
*persister_trigger = Some(sync_trigger_tx);
|
||||
sync_trigger_rx
|
||||
}
|
||||
|
||||
pub(crate) fn new(
|
||||
remote_url: String,
|
||||
persister: Arc<Persister>,
|
||||
recoverer: Arc<Recoverer>,
|
||||
signer: Arc<Box<dyn Signer>>,
|
||||
client: Box<dyn SyncerClient>,
|
||||
sync_trigger: Receiver<()>,
|
||||
) -> Self {
|
||||
let sync_trigger = Mutex::new(sync_trigger);
|
||||
let sync_trigger_rx = Self::set_sync_trigger(persister.clone());
|
||||
Self {
|
||||
remote_url,
|
||||
persister,
|
||||
recoverer,
|
||||
signer,
|
||||
client,
|
||||
sync_trigger,
|
||||
sync_trigger: Mutex::new(sync_trigger_rx),
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -147,7 +147,6 @@ pub(crate) fn new_receive_swap(payment_state: Option<PaymentState>) -> ReceiveSw
|
||||
|
||||
macro_rules! create_persister {
|
||||
($name:ident) => {
|
||||
let (sync_trigger_tx, _sync_trigger_rx) = tokio::sync::mpsc::channel::<()>(100);
|
||||
let temp_dir = tempdir::TempDir::new("liquid-sdk")?;
|
||||
let $name = std::sync::Arc::new(crate::persist::Persister::new(
|
||||
temp_dir
|
||||
@@ -155,7 +154,7 @@ macro_rules! create_persister {
|
||||
.to_str()
|
||||
.ok_or(anyhow::anyhow!("Could not create temporary directory"))?,
|
||||
crate::model::LiquidNetwork::Testnet,
|
||||
sync_trigger_tx,
|
||||
None,
|
||||
)?);
|
||||
$name.init()?;
|
||||
};
|
||||
|
||||
@@ -106,7 +106,7 @@ pub(crate) fn new_liquid_sdk_with_chain_services(
|
||||
|
||||
let (_incoming_tx, _outgoing_records, sync_service) =
|
||||
new_sync_service(persister.clone(), recoverer.clone(), signer.clone())?;
|
||||
let sync_service = Arc::new(sync_service);
|
||||
let sync_service = Some(Arc::new(sync_service));
|
||||
|
||||
Ok(LiquidSdk {
|
||||
config,
|
||||
|
||||
@@ -94,7 +94,6 @@ pub(crate) fn new_sync_service(
|
||||
Arc<Mutex<HashMap<String, Record>>>,
|
||||
SyncService,
|
||||
)> {
|
||||
let (_, sync_trigger_rx) = mpsc::channel::<()>(30);
|
||||
let (incoming_tx, incoming_rx) = mpsc::channel::<Record>(10);
|
||||
let outgoing_records = Arc::new(Mutex::new(HashMap::new()));
|
||||
let client = Box::new(MockSyncerClient::new(incoming_rx, outgoing_records.clone()));
|
||||
@@ -104,7 +103,6 @@ pub(crate) fn new_sync_service(
|
||||
recoverer,
|
||||
signer.clone(),
|
||||
client,
|
||||
sync_trigger_rx,
|
||||
);
|
||||
|
||||
Ok((incoming_tx, outgoing_records, sync_service))
|
||||
|
||||
@@ -1800,7 +1800,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
|
||||
network: dco_decode_liquid_network(arr[5]),
|
||||
paymentTimeoutSec: dco_decode_u_64(arr[6]),
|
||||
zeroConfMinFeeRateMsat: dco_decode_u_32(arr[7]),
|
||||
syncServiceUrl: dco_decode_String(arr[8]),
|
||||
syncServiceUrl: dco_decode_opt_String(arr[8]),
|
||||
zeroConfMaxAmountSat: dco_decode_opt_box_autoadd_u_64(arr[9]),
|
||||
breezApiKey: dco_decode_opt_String(arr[10]),
|
||||
externalInputParsers: dco_decode_opt_list_external_input_parser(arr[11]),
|
||||
@@ -3830,7 +3830,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
|
||||
var var_network = sse_decode_liquid_network(deserializer);
|
||||
var var_paymentTimeoutSec = sse_decode_u_64(deserializer);
|
||||
var var_zeroConfMinFeeRateMsat = sse_decode_u_32(deserializer);
|
||||
var var_syncServiceUrl = sse_decode_String(deserializer);
|
||||
var var_syncServiceUrl = sse_decode_opt_String(deserializer);
|
||||
var var_zeroConfMaxAmountSat = sse_decode_opt_box_autoadd_u_64(deserializer);
|
||||
var var_breezApiKey = sse_decode_opt_String(deserializer);
|
||||
var var_externalInputParsers = sse_decode_opt_list_external_input_parser(deserializer);
|
||||
@@ -6056,7 +6056,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
|
||||
sse_encode_liquid_network(self.network, serializer);
|
||||
sse_encode_u_64(self.paymentTimeoutSec, serializer);
|
||||
sse_encode_u_32(self.zeroConfMinFeeRateMsat, serializer);
|
||||
sse_encode_String(self.syncServiceUrl, serializer);
|
||||
sse_encode_opt_String(self.syncServiceUrl, serializer);
|
||||
sse_encode_opt_box_autoadd_u_64(self.zeroConfMaxAmountSat, serializer);
|
||||
sse_encode_opt_String(self.breezApiKey, serializer);
|
||||
sse_encode_opt_list_external_input_parser(self.externalInputParsers, serializer);
|
||||
|
||||
@@ -2366,7 +2366,7 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
|
||||
wireObj.network = cst_encode_liquid_network(apiObj.network);
|
||||
wireObj.payment_timeout_sec = cst_encode_u_64(apiObj.paymentTimeoutSec);
|
||||
wireObj.zero_conf_min_fee_rate_msat = cst_encode_u_32(apiObj.zeroConfMinFeeRateMsat);
|
||||
wireObj.sync_service_url = cst_encode_String(apiObj.syncServiceUrl);
|
||||
wireObj.sync_service_url = cst_encode_opt_String(apiObj.syncServiceUrl);
|
||||
wireObj.zero_conf_max_amount_sat = cst_encode_opt_box_autoadd_u_64(apiObj.zeroConfMaxAmountSat);
|
||||
wireObj.breez_api_key = cst_encode_opt_String(apiObj.breezApiKey);
|
||||
wireObj.external_input_parsers = cst_encode_opt_list_external_input_parser(apiObj.externalInputParsers);
|
||||
|
||||
@@ -174,8 +174,9 @@ class Config {
|
||||
/// Zero-conf minimum accepted fee-rate in millisatoshis per vbyte
|
||||
final int zeroConfMinFeeRateMsat;
|
||||
|
||||
/// The url of the real-time sync service
|
||||
final String syncServiceUrl;
|
||||
/// The url of the real-time sync service. Defaults to [BREEZ_SYNC_SERVICE_URL]
|
||||
/// Setting this field to `None` will disable the service
|
||||
final String? syncServiceUrl;
|
||||
|
||||
/// Maximum amount in satoshi to accept zero-conf payments with
|
||||
/// Defaults to [DEFAULT_ZERO_CONF_MAX_SAT]
|
||||
@@ -211,7 +212,7 @@ class Config {
|
||||
required this.network,
|
||||
required this.paymentTimeoutSec,
|
||||
required this.zeroConfMinFeeRateMsat,
|
||||
required this.syncServiceUrl,
|
||||
this.syncServiceUrl,
|
||||
this.zeroConfMaxAmountSat,
|
||||
this.breezApiKey,
|
||||
this.externalInputParsers,
|
||||
|
||||
@@ -311,7 +311,6 @@ fun asConfig(config: ReadableMap): Config? {
|
||||
"network",
|
||||
"paymentTimeoutSec",
|
||||
"zeroConfMinFeeRateMsat",
|
||||
"syncServiceUrl",
|
||||
"useDefaultExternalInputParsers",
|
||||
),
|
||||
)
|
||||
@@ -325,7 +324,7 @@ fun asConfig(config: ReadableMap): Config? {
|
||||
val network = config.getString("network")?.let { asLiquidNetwork(it) }!!
|
||||
val paymentTimeoutSec = config.getDouble("paymentTimeoutSec").toULong()
|
||||
val zeroConfMinFeeRateMsat = config.getInt("zeroConfMinFeeRateMsat").toUInt()
|
||||
val syncServiceUrl = config.getString("syncServiceUrl")!!
|
||||
val syncServiceUrl = if (hasNonNullKey(config, "syncServiceUrl")) config.getString("syncServiceUrl") else null
|
||||
val breezApiKey = if (hasNonNullKey(config, "breezApiKey")) config.getString("breezApiKey") else null
|
||||
val cacheDir = if (hasNonNullKey(config, "cacheDir")) config.getString("cacheDir") else null
|
||||
val zeroConfMaxAmountSat =
|
||||
|
||||
@@ -374,8 +374,12 @@ enum BreezSDKLiquidMapper {
|
||||
guard let zeroConfMinFeeRateMsat = config["zeroConfMinFeeRateMsat"] as? UInt32 else {
|
||||
throw SdkError.Generic(message: errMissingMandatoryField(fieldName: "zeroConfMinFeeRateMsat", typeName: "Config"))
|
||||
}
|
||||
guard let syncServiceUrl = config["syncServiceUrl"] as? String else {
|
||||
throw SdkError.Generic(message: errMissingMandatoryField(fieldName: "syncServiceUrl", typeName: "Config"))
|
||||
var syncServiceUrl: String?
|
||||
if hasNonNilKey(data: config, key: "syncServiceUrl") {
|
||||
guard let syncServiceUrlTmp = config["syncServiceUrl"] as? String else {
|
||||
throw SdkError.Generic(message: errUnexpectedValue(fieldName: "syncServiceUrl"))
|
||||
}
|
||||
syncServiceUrl = syncServiceUrlTmp
|
||||
}
|
||||
var breezApiKey: String?
|
||||
if hasNonNilKey(data: config, key: "breezApiKey") {
|
||||
@@ -426,7 +430,7 @@ enum BreezSDKLiquidMapper {
|
||||
"network": valueOf(liquidNetwork: config.network),
|
||||
"paymentTimeoutSec": config.paymentTimeoutSec,
|
||||
"zeroConfMinFeeRateMsat": config.zeroConfMinFeeRateMsat,
|
||||
"syncServiceUrl": config.syncServiceUrl,
|
||||
"syncServiceUrl": config.syncServiceUrl == nil ? nil : config.syncServiceUrl,
|
||||
"breezApiKey": config.breezApiKey == nil ? nil : config.breezApiKey,
|
||||
"cacheDir": config.cacheDir == nil ? nil : config.cacheDir,
|
||||
"zeroConfMaxAmountSat": config.zeroConfMaxAmountSat == nil ? nil : config.zeroConfMaxAmountSat,
|
||||
|
||||
@@ -74,7 +74,7 @@ export interface Config {
|
||||
network: LiquidNetwork
|
||||
paymentTimeoutSec: number
|
||||
zeroConfMinFeeRateMsat: number
|
||||
syncServiceUrl: string
|
||||
syncServiceUrl?: string
|
||||
breezApiKey?: string
|
||||
cacheDir?: string
|
||||
zeroConfMaxAmountSat?: number
|
||||
|
||||
Reference in New Issue
Block a user