fix: remove mandatory API key checks (#639)

This commit is contained in:
yse
2025-01-21 08:32:05 +01:00
committed by GitHub
parent 4abcebcde8
commit 95998013a9
28 changed files with 119 additions and 111 deletions

View File

@@ -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,

View File

@@ -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;

View File

@@ -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);

View File

@@ -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)

View File

@@ -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);

View File

@@ -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)

View File

@@ -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)

View File

@@ -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);

View File

@@ -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(

View File

@@ -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,

View File

@@ -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)
}
}

View File

@@ -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(())
}

View File

@@ -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(())
}

View File

@@ -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()?;

View File

@@ -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(())
}

View File

@@ -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(())
}
}

View File

@@ -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)

View File

@@ -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)
}

View File

@@ -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),
}
}

View File

@@ -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()?;
};

View File

@@ -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,

View File

@@ -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))

View File

@@ -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);

View File

@@ -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);

View File

@@ -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,

View File

@@ -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 =

View File

@@ -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,

View File

@@ -74,7 +74,7 @@ export interface Config {
network: LiquidNetwork
paymentTimeoutSec: number
zeroConfMinFeeRateMsat: number
syncServiceUrl: string
syncServiceUrl?: string
breezApiKey?: string
cacheDir?: string
zeroConfMaxAmountSat?: number