Support default external input parsers

This commit is contained in:
Daniel Granhão
2024-12-16 18:59:56 +00:00
parent c773e8d7a5
commit 72a9aa66ff
16 changed files with 94 additions and 11 deletions

2
cli/Cargo.lock generated
View File

@@ -3046,7 +3046,7 @@ dependencies = [
[[package]] [[package]]
name = "sdk-common" name = "sdk-common"
version = "0.6.2" version = "0.6.2"
source = "git+https://github.com/breez/breez-sdk?rev=e537feb8ed134bc3c7af5196e10a0a189dd36ac7#e537feb8ed134bc3c7af5196e10a0a189dd36ac7" source = "git+https://github.com/breez/breez-sdk?rev=2208dd5530908d5cf7b607f34f80155669ab299b#2208dd5530908d5cf7b607f34f80155669ab299b"
dependencies = [ dependencies = [
"aes 0.8.4", "aes 0.8.4",
"anyhow", "anyhow",

2
lib/Cargo.lock generated
View File

@@ -3294,7 +3294,7 @@ dependencies = [
[[package]] [[package]]
name = "sdk-common" name = "sdk-common"
version = "0.6.2" version = "0.6.2"
source = "git+https://github.com/breez/breez-sdk?rev=e537feb8ed134bc3c7af5196e10a0a189dd36ac7#e537feb8ed134bc3c7af5196e10a0a189dd36ac7" source = "git+https://github.com/breez/breez-sdk?rev=2208dd5530908d5cf7b607f34f80155669ab299b#2208dd5530908d5cf7b607f34f80155669ab299b"
dependencies = [ dependencies = [
"aes 0.8.4", "aes 0.8.4",
"anyhow", "anyhow",

View File

@@ -512,6 +512,7 @@ typedef struct wire_cst_config {
uint64_t *zero_conf_max_amount_sat; uint64_t *zero_conf_max_amount_sat;
struct wire_cst_list_prim_u_8_strict *breez_api_key; struct wire_cst_list_prim_u_8_strict *breez_api_key;
struct wire_cst_list_external_input_parser *external_input_parsers; struct wire_cst_list_external_input_parser *external_input_parsers;
bool use_default_external_input_parsers;
} wire_cst_config; } wire_cst_config;
typedef struct wire_cst_connect_request { typedef struct wire_cst_connect_request {

View File

@@ -335,6 +335,7 @@ dictionary Config {
string? breez_api_key; string? breez_api_key;
string? cache_dir; string? cache_dir;
u64? zero_conf_max_amount_sat; u64? zero_conf_max_amount_sat;
boolean use_default_external_input_parsers = true;
sequence<ExternalInputParser>? external_input_parsers = null; sequence<ExternalInputParser>? external_input_parsers = null;
}; };

View File

@@ -32,7 +32,7 @@ lwk_wollet = { git = "https://github.com/dangeross/lwk", branch = "savage-full-s
#lwk_wollet = "0.7.0" #lwk_wollet = "0.7.0"
rusqlite = { version = "0.31", features = ["backup", "bundled"] } rusqlite = { version = "0.31", features = ["backup", "bundled"] }
rusqlite_migration = "1.0" rusqlite_migration = "1.0"
sdk-common = { git = "https://github.com/breez/breez-sdk", rev = "e537feb8ed134bc3c7af5196e10a0a189dd36ac7", features = ["liquid"] } sdk-common = { git = "https://github.com/breez/breez-sdk", rev = "2208dd5530908d5cf7b607f34f80155669ab299b", features = ["liquid"] }
serde = { version = "1.0.197", features = ["derive"] } serde = { version = "1.0.197", features = ["derive"] }
serde_json = "1.0.116" serde_json = "1.0.116"
strum = "0.25" strum = "0.25"

View File

@@ -2376,6 +2376,7 @@ impl SseDecode for crate::model::Config {
let mut var_breezApiKey = <Option<String>>::sse_decode(deserializer); let mut var_breezApiKey = <Option<String>>::sse_decode(deserializer);
let mut var_externalInputParsers = let mut var_externalInputParsers =
<Option<Vec<crate::bindings::ExternalInputParser>>>::sse_decode(deserializer); <Option<Vec<crate::bindings::ExternalInputParser>>>::sse_decode(deserializer);
let mut var_useDefaultExternalInputParsers = <bool>::sse_decode(deserializer);
return crate::model::Config { return crate::model::Config {
liquid_electrum_url: var_liquidElectrumUrl, liquid_electrum_url: var_liquidElectrumUrl,
bitcoin_electrum_url: var_bitcoinElectrumUrl, bitcoin_electrum_url: var_bitcoinElectrumUrl,
@@ -2388,6 +2389,7 @@ impl SseDecode for crate::model::Config {
zero_conf_max_amount_sat: var_zeroConfMaxAmountSat, zero_conf_max_amount_sat: var_zeroConfMaxAmountSat,
breez_api_key: var_breezApiKey, breez_api_key: var_breezApiKey,
external_input_parsers: var_externalInputParsers, external_input_parsers: var_externalInputParsers,
use_default_external_input_parsers: var_useDefaultExternalInputParsers,
}; };
} }
} }
@@ -4601,6 +4603,9 @@ impl flutter_rust_bridge::IntoDart for crate::model::Config {
self.zero_conf_max_amount_sat.into_into_dart().into_dart(), self.zero_conf_max_amount_sat.into_into_dart().into_dart(),
self.breez_api_key.into_into_dart().into_dart(), self.breez_api_key.into_into_dart().into_dart(),
self.external_input_parsers.into_into_dart().into_dart(), self.external_input_parsers.into_into_dart().into_dart(),
self.use_default_external_input_parsers
.into_into_dart()
.into_dart(),
] ]
.into_dart() .into_dart()
} }
@@ -6680,6 +6685,7 @@ impl SseEncode for crate::model::Config {
self.external_input_parsers, self.external_input_parsers,
serializer, serializer,
); );
<bool>::sse_encode(self.use_default_external_input_parsers, serializer);
} }
} }
@@ -8774,6 +8780,9 @@ mod io {
zero_conf_max_amount_sat: self.zero_conf_max_amount_sat.cst_decode(), zero_conf_max_amount_sat: self.zero_conf_max_amount_sat.cst_decode(),
breez_api_key: self.breez_api_key.cst_decode(), breez_api_key: self.breez_api_key.cst_decode(),
external_input_parsers: self.external_input_parsers.cst_decode(), external_input_parsers: self.external_input_parsers.cst_decode(),
use_default_external_input_parsers: self
.use_default_external_input_parsers
.cst_decode(),
} }
} }
} }
@@ -10231,6 +10240,7 @@ mod io {
zero_conf_max_amount_sat: core::ptr::null_mut(), zero_conf_max_amount_sat: core::ptr::null_mut(),
breez_api_key: core::ptr::null_mut(), breez_api_key: core::ptr::null_mut(),
external_input_parsers: core::ptr::null_mut(), external_input_parsers: core::ptr::null_mut(),
use_default_external_input_parsers: Default::default(),
} }
} }
} }
@@ -12268,6 +12278,7 @@ mod io {
zero_conf_max_amount_sat: *mut u64, zero_conf_max_amount_sat: *mut u64,
breez_api_key: *mut wire_cst_list_prim_u_8_strict, breez_api_key: *mut wire_cst_list_prim_u_8_strict,
external_input_parsers: *mut wire_cst_list_external_input_parser, external_input_parsers: *mut wire_cst_list_external_input_parser,
use_default_external_input_parsers: bool,
} }
#[repr(C)] #[repr(C)]
#[derive(Clone, Copy)] #[derive(Clone, Copy)]

View File

@@ -57,6 +57,10 @@ pub struct Config {
/// is not recognized. See [ExternalInputParser] for more details on how to configure /// is not recognized. See [ExternalInputParser] for more details on how to configure
/// external parsing. /// external parsing.
pub external_input_parsers: Option<Vec<ExternalInputParser>>, pub external_input_parsers: Option<Vec<ExternalInputParser>>,
/// The SDK includes some default external input parsers
/// ([DEFAULT_EXTERNAL_INPUT_PARSERS](crate::sdk::DEFAULT_EXTERNAL_INPUT_PARSERS)).
/// Set this to false in order to prevent their use.
pub use_default_external_input_parsers: bool,
} }
impl Config { impl Config {
@@ -73,6 +77,7 @@ impl Config {
zero_conf_max_amount_sat: None, zero_conf_max_amount_sat: None,
breez_api_key: Some(breez_api_key), breez_api_key: Some(breez_api_key),
external_input_parsers: None, external_input_parsers: None,
use_default_external_input_parsers: true,
} }
} }
@@ -89,6 +94,7 @@ impl Config {
zero_conf_max_amount_sat: None, zero_conf_max_amount_sat: None,
breez_api_key, breez_api_key,
external_input_parsers: None, external_input_parsers: None,
use_default_external_input_parsers: true,
} }
} }

View File

@@ -52,6 +52,14 @@ pub const DEFAULT_DATA_DIR: &str = ".data";
/// Number of blocks to monitor a swap after its timeout block height /// Number of blocks to monitor a swap after its timeout block height
pub const CHAIN_SWAP_MONITORING_PERIOD_BITCOIN_BLOCKS: u32 = 4320; pub const CHAIN_SWAP_MONITORING_PERIOD_BITCOIN_BLOCKS: u32 = 4320;
/// A list of external input parsers that are used by default.
/// To opt-out, set `use_default_external_input_parsers` in [Config] to false.
pub const DEFAULT_EXTERNAL_INPUT_PARSERS: &[(&str, &str, &str)] = &[(
"picknpay",
"(.*)(za.co.electrum.picknpay)(.*)",
"https://cryptoqr.net/.well-known/lnurlp/<input>",
)];
pub struct LiquidSdk { pub struct LiquidSdk {
pub(crate) config: Config, pub(crate) config: Config,
pub(crate) onchain_wallet: Arc<dyn OnchainWallet>, pub(crate) onchain_wallet: Arc<dyn OnchainWallet>,
@@ -72,6 +80,7 @@ pub struct LiquidSdk {
pub(crate) receive_swap_handler: ReceiveSwapHandler, pub(crate) receive_swap_handler: ReceiveSwapHandler,
pub(crate) chain_swap_handler: Arc<ChainSwapHandler>, pub(crate) chain_swap_handler: Arc<ChainSwapHandler>,
pub(crate) buy_bitcoin_service: Arc<dyn BuyBitcoinApi>, pub(crate) buy_bitcoin_service: Arc<dyn BuyBitcoinApi>,
pub(crate) external_input_parsers: Option<Vec<ExternalInputParser>>,
} }
impl LiquidSdk { impl LiquidSdk {
@@ -216,6 +225,8 @@ impl LiquidSdk {
let buy_bitcoin_service = let buy_bitcoin_service =
Arc::new(BuyBitcoinService::new(config.clone(), breez_server.clone())); Arc::new(BuyBitcoinService::new(config.clone(), breez_server.clone()));
let external_input_parsers = Self::get_all_external_input_parsers(&config);
let sdk = Arc::new(LiquidSdk { let sdk = Arc::new(LiquidSdk {
config: config.clone(), config: config.clone(),
onchain_wallet, onchain_wallet,
@@ -234,10 +245,34 @@ impl LiquidSdk {
receive_swap_handler, receive_swap_handler,
chain_swap_handler, chain_swap_handler,
buy_bitcoin_service, buy_bitcoin_service,
external_input_parsers,
}); });
Ok(sdk) Ok(sdk)
} }
fn get_all_external_input_parsers(config: &Config) -> Option<Vec<ExternalInputParser>> {
let external_input_parsers = if config.use_default_external_input_parsers {
let default_parsers = DEFAULT_EXTERNAL_INPUT_PARSERS
.iter()
.map(|(id, regex, url)| ExternalInputParser {
provider_id: id.to_string(),
input_regex: regex.to_string(),
parser_url: url.to_string(),
})
.collect::<Vec<_>>();
[
default_parsers,
config.external_input_parsers.clone().unwrap_or_default(),
]
.concat()
} else {
config.external_input_parsers.clone().unwrap_or_default()
};
(!external_input_parsers.is_empty()).then_some(external_input_parsers)
}
/// Starts an SDK instance. /// Starts an SDK instance.
/// ///
/// Internal method. Should only be called once per instance. /// Internal method. Should only be called once per instance.
@@ -2553,8 +2588,8 @@ impl LiquidSdk {
SuccessAction::Aes { data } => { SuccessAction::Aes { data } => {
let PaymentDetails::Lightning { preimage, .. } = &payment.details else { let PaymentDetails::Lightning { preimage, .. } = &payment.details else {
return Err(LnUrlPayError::Generic { return Err(LnUrlPayError::Generic {
err: format!("Invalid payment type: expected type `PaymentDetails::Lightning`, got payment details {:?}.", payment.details), err: format!("Invalid payment type: expected type `PaymentDetails::Lightning`, got payment details {:?}.", payment.details),
}); });
}; };
let preimage_str = preimage.clone().ok_or(LnUrlPayError::Generic { let preimage_str = preimage.clone().ok_or(LnUrlPayError::Generic {
@@ -2764,7 +2799,7 @@ impl LiquidSdk {
}); });
} }
let external_parsers = &self.config.external_input_parsers; let external_parsers = &self.external_input_parsers;
parse(input, external_parsers.as_deref()) parse(input, external_parsers.as_deref())
.await .await
.map_err(|e| PaymentError::generic(&e.to_string())) .map_err(|e| PaymentError::generic(&e.to_string()))

View File

@@ -109,5 +109,6 @@ pub(crate) fn new_liquid_sdk_with_chain_services(
receive_swap_handler, receive_swap_handler,
chain_swap_handler, chain_swap_handler,
buy_bitcoin_service, buy_bitcoin_service,
external_input_parsers: None,
}) })
} }

View File

@@ -1693,7 +1693,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
Config dco_decode_config(dynamic raw) { Config dco_decode_config(dynamic raw) {
// Codec=Dco (DartCObject based), see doc to use other codecs // Codec=Dco (DartCObject based), see doc to use other codecs
final arr = raw as List<dynamic>; final arr = raw as List<dynamic>;
if (arr.length != 11) throw Exception('unexpected arr length: expect 11 but see ${arr.length}'); if (arr.length != 12) throw Exception('unexpected arr length: expect 12 but see ${arr.length}');
return Config( return Config(
liquidElectrumUrl: dco_decode_String(arr[0]), liquidElectrumUrl: dco_decode_String(arr[0]),
bitcoinElectrumUrl: dco_decode_String(arr[1]), bitcoinElectrumUrl: dco_decode_String(arr[1]),
@@ -1706,6 +1706,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
zeroConfMaxAmountSat: dco_decode_opt_box_autoadd_u_64(arr[8]), zeroConfMaxAmountSat: dco_decode_opt_box_autoadd_u_64(arr[8]),
breezApiKey: dco_decode_opt_String(arr[9]), breezApiKey: dco_decode_opt_String(arr[9]),
externalInputParsers: dco_decode_opt_list_external_input_parser(arr[10]), externalInputParsers: dco_decode_opt_list_external_input_parser(arr[10]),
useDefaultExternalInputParsers: dco_decode_bool(arr[11]),
); );
} }
@@ -3615,6 +3616,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
var var_zeroConfMaxAmountSat = sse_decode_opt_box_autoadd_u_64(deserializer); var var_zeroConfMaxAmountSat = sse_decode_opt_box_autoadd_u_64(deserializer);
var var_breezApiKey = sse_decode_opt_String(deserializer); var var_breezApiKey = sse_decode_opt_String(deserializer);
var var_externalInputParsers = sse_decode_opt_list_external_input_parser(deserializer); var var_externalInputParsers = sse_decode_opt_list_external_input_parser(deserializer);
var var_useDefaultExternalInputParsers = sse_decode_bool(deserializer);
return Config( return Config(
liquidElectrumUrl: var_liquidElectrumUrl, liquidElectrumUrl: var_liquidElectrumUrl,
bitcoinElectrumUrl: var_bitcoinElectrumUrl, bitcoinElectrumUrl: var_bitcoinElectrumUrl,
@@ -3626,7 +3628,8 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
zeroConfMinFeeRateMsat: var_zeroConfMinFeeRateMsat, zeroConfMinFeeRateMsat: var_zeroConfMinFeeRateMsat,
zeroConfMaxAmountSat: var_zeroConfMaxAmountSat, zeroConfMaxAmountSat: var_zeroConfMaxAmountSat,
breezApiKey: var_breezApiKey, breezApiKey: var_breezApiKey,
externalInputParsers: var_externalInputParsers); externalInputParsers: var_externalInputParsers,
useDefaultExternalInputParsers: var_useDefaultExternalInputParsers);
} }
@protected @protected
@@ -5695,6 +5698,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi {
sse_encode_opt_box_autoadd_u_64(self.zeroConfMaxAmountSat, serializer); sse_encode_opt_box_autoadd_u_64(self.zeroConfMaxAmountSat, serializer);
sse_encode_opt_String(self.breezApiKey, serializer); sse_encode_opt_String(self.breezApiKey, serializer);
sse_encode_opt_list_external_input_parser(self.externalInputParsers, serializer); sse_encode_opt_list_external_input_parser(self.externalInputParsers, serializer);
sse_encode_bool(self.useDefaultExternalInputParsers, serializer);
} }
@protected @protected

View File

@@ -2212,6 +2212,7 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
wireObj.zero_conf_max_amount_sat = cst_encode_opt_box_autoadd_u_64(apiObj.zeroConfMaxAmountSat); 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.breez_api_key = cst_encode_opt_String(apiObj.breezApiKey);
wireObj.external_input_parsers = cst_encode_opt_list_external_input_parser(apiObj.externalInputParsers); wireObj.external_input_parsers = cst_encode_opt_list_external_input_parser(apiObj.externalInputParsers);
wireObj.use_default_external_input_parsers = cst_encode_bool(apiObj.useDefaultExternalInputParsers);
} }
@protected @protected
@@ -6070,6 +6071,9 @@ final class wire_cst_config extends ffi.Struct {
external ffi.Pointer<wire_cst_list_prim_u_8_strict> breez_api_key; external ffi.Pointer<wire_cst_list_prim_u_8_strict> breez_api_key;
external ffi.Pointer<wire_cst_list_external_input_parser> external_input_parsers; external ffi.Pointer<wire_cst_list_external_input_parser> external_input_parsers;
@ffi.Bool()
external bool use_default_external_input_parsers;
} }
final class wire_cst_connect_request extends ffi.Struct { final class wire_cst_connect_request extends ffi.Struct {

View File

@@ -146,6 +146,11 @@ class Config {
/// external parsing. /// external parsing.
final List<ExternalInputParser>? externalInputParsers; final List<ExternalInputParser>? externalInputParsers;
/// The SDK includes some default external input parsers
/// ([DEFAULT_EXTERNAL_INPUT_PARSERS](crate::sdk::DEFAULT_EXTERNAL_INPUT_PARSERS)).
/// Set this to false in order to prevent their use.
final bool useDefaultExternalInputParsers;
const Config({ const Config({
required this.liquidElectrumUrl, required this.liquidElectrumUrl,
required this.bitcoinElectrumUrl, required this.bitcoinElectrumUrl,
@@ -158,6 +163,7 @@ class Config {
this.zeroConfMaxAmountSat, this.zeroConfMaxAmountSat,
this.breezApiKey, this.breezApiKey,
this.externalInputParsers, this.externalInputParsers,
required this.useDefaultExternalInputParsers,
}); });
@override @override
@@ -172,7 +178,8 @@ class Config {
zeroConfMinFeeRateMsat.hashCode ^ zeroConfMinFeeRateMsat.hashCode ^
zeroConfMaxAmountSat.hashCode ^ zeroConfMaxAmountSat.hashCode ^
breezApiKey.hashCode ^ breezApiKey.hashCode ^
externalInputParsers.hashCode; externalInputParsers.hashCode ^
useDefaultExternalInputParsers.hashCode;
@override @override
bool operator ==(Object other) => bool operator ==(Object other) =>
@@ -189,7 +196,8 @@ class Config {
zeroConfMinFeeRateMsat == other.zeroConfMinFeeRateMsat && zeroConfMinFeeRateMsat == other.zeroConfMinFeeRateMsat &&
zeroConfMaxAmountSat == other.zeroConfMaxAmountSat && zeroConfMaxAmountSat == other.zeroConfMaxAmountSat &&
breezApiKey == other.breezApiKey && breezApiKey == other.breezApiKey &&
externalInputParsers == other.externalInputParsers; externalInputParsers == other.externalInputParsers &&
useDefaultExternalInputParsers == other.useDefaultExternalInputParsers;
} }
/// An argument when calling [crate::sdk::LiquidSdk::connect]. /// An argument when calling [crate::sdk::LiquidSdk::connect].

View File

@@ -4570,6 +4570,9 @@ final class wire_cst_config extends ffi.Struct {
external ffi.Pointer<wire_cst_list_prim_u_8_strict> breez_api_key; external ffi.Pointer<wire_cst_list_prim_u_8_strict> breez_api_key;
external ffi.Pointer<wire_cst_list_external_input_parser> external_input_parsers; external ffi.Pointer<wire_cst_list_external_input_parser> external_input_parsers;
@ffi.Bool()
external bool use_default_external_input_parsers;
} }
final class wire_cst_connect_request extends ffi.Struct { final class wire_cst_connect_request extends ffi.Struct {

View File

@@ -248,6 +248,7 @@ fun asConfig(config: ReadableMap): Config? {
"network", "network",
"paymentTimeoutSec", "paymentTimeoutSec",
"zeroConfMinFeeRateMsat", "zeroConfMinFeeRateMsat",
"useDefaultExternalInputParsers",
), ),
) )
) { ) {
@@ -272,6 +273,7 @@ fun asConfig(config: ReadableMap): Config? {
} else { } else {
null null
} }
val useDefaultExternalInputParsers = config.getBoolean("useDefaultExternalInputParsers")
val externalInputParsers = val externalInputParsers =
if (hasNonNullKey(config, "externalInputParsers")) { if (hasNonNullKey(config, "externalInputParsers")) {
config.getArray("externalInputParsers")?.let { config.getArray("externalInputParsers")?.let {
@@ -291,6 +293,7 @@ fun asConfig(config: ReadableMap): Config? {
breezApiKey, breezApiKey,
cacheDir, cacheDir,
zeroConfMaxAmountSat, zeroConfMaxAmountSat,
useDefaultExternalInputParsers,
externalInputParsers, externalInputParsers,
) )
} }
@@ -307,6 +310,7 @@ fun readableMapOf(config: Config): ReadableMap =
"breezApiKey" to config.breezApiKey, "breezApiKey" to config.breezApiKey,
"cacheDir" to config.cacheDir, "cacheDir" to config.cacheDir,
"zeroConfMaxAmountSat" to config.zeroConfMaxAmountSat, "zeroConfMaxAmountSat" to config.zeroConfMaxAmountSat,
"useDefaultExternalInputParsers" to config.useDefaultExternalInputParsers,
"externalInputParsers" to config.externalInputParsers?.let { readableArrayOf(it) }, "externalInputParsers" to config.externalInputParsers?.let { readableArrayOf(it) },
) )

View File

@@ -328,12 +328,15 @@ enum BreezSDKLiquidMapper {
} }
zeroConfMaxAmountSat = zeroConfMaxAmountSatTmp zeroConfMaxAmountSat = zeroConfMaxAmountSatTmp
} }
guard let useDefaultExternalInputParsers = config["useDefaultExternalInputParsers"] as? Bool else {
throw SdkError.Generic(message: errMissingMandatoryField(fieldName: "useDefaultExternalInputParsers", typeName: "Config"))
}
var externalInputParsers: [ExternalInputParser]? var externalInputParsers: [ExternalInputParser]?
if let externalInputParsersTmp = config["externalInputParsers"] as? [[String: Any?]] { if let externalInputParsersTmp = config["externalInputParsers"] as? [[String: Any?]] {
externalInputParsers = try asExternalInputParserList(arr: externalInputParsersTmp) externalInputParsers = try asExternalInputParserList(arr: externalInputParsersTmp)
} }
return Config(liquidElectrumUrl: liquidElectrumUrl, bitcoinElectrumUrl: bitcoinElectrumUrl, mempoolspaceUrl: mempoolspaceUrl, workingDir: workingDir, network: network, paymentTimeoutSec: paymentTimeoutSec, zeroConfMinFeeRateMsat: zeroConfMinFeeRateMsat, breezApiKey: breezApiKey, cacheDir: cacheDir, zeroConfMaxAmountSat: zeroConfMaxAmountSat, externalInputParsers: externalInputParsers) return Config(liquidElectrumUrl: liquidElectrumUrl, bitcoinElectrumUrl: bitcoinElectrumUrl, mempoolspaceUrl: mempoolspaceUrl, workingDir: workingDir, network: network, paymentTimeoutSec: paymentTimeoutSec, zeroConfMinFeeRateMsat: zeroConfMinFeeRateMsat, breezApiKey: breezApiKey, cacheDir: cacheDir, zeroConfMaxAmountSat: zeroConfMaxAmountSat, useDefaultExternalInputParsers: useDefaultExternalInputParsers, externalInputParsers: externalInputParsers)
} }
static func dictionaryOf(config: Config) -> [String: Any?] { static func dictionaryOf(config: Config) -> [String: Any?] {
@@ -348,6 +351,7 @@ enum BreezSDKLiquidMapper {
"breezApiKey": config.breezApiKey == nil ? nil : config.breezApiKey, "breezApiKey": config.breezApiKey == nil ? nil : config.breezApiKey,
"cacheDir": config.cacheDir == nil ? nil : config.cacheDir, "cacheDir": config.cacheDir == nil ? nil : config.cacheDir,
"zeroConfMaxAmountSat": config.zeroConfMaxAmountSat == nil ? nil : config.zeroConfMaxAmountSat, "zeroConfMaxAmountSat": config.zeroConfMaxAmountSat == nil ? nil : config.zeroConfMaxAmountSat,
"useDefaultExternalInputParsers": config.useDefaultExternalInputParsers,
"externalInputParsers": config.externalInputParsers == nil ? nil : arrayOf(externalInputParserList: config.externalInputParsers!), "externalInputParsers": config.externalInputParsers == nil ? nil : arrayOf(externalInputParserList: config.externalInputParsers!),
] ]
} }

View File

@@ -68,6 +68,7 @@ export interface Config {
breezApiKey?: string breezApiKey?: string
cacheDir?: string cacheDir?: string
zeroConfMaxAmountSat?: number zeroConfMaxAmountSat?: number
useDefaultExternalInputParsers: boolean
externalInputParsers?: ExternalInputParser[] externalInputParsers?: ExternalInputParser[]
} }