From 58b79f87c6f9bc987af6f695ff80d996d25f0cef Mon Sep 17 00:00:00 2001 From: Ross Savage Date: Fri, 29 Nov 2024 12:00:36 +0100 Subject: [PATCH] Store unblinding data for the tx --- .../include/breez_sdk_liquid.h | 1 + lib/bindings/src/breez_sdk_liquid.udl | 1 + lib/core/src/chain_swap.rs | 2 + lib/core/src/frb_generated.rs | 7 ++ lib/core/src/model.rs | 10 +++ lib/core/src/persist/migrations.rs | 1 + lib/core/src/persist/mod.rs | 86 ++++++++++--------- lib/core/src/receive_swap.rs | 1 + lib/core/src/sdk.rs | 1 + lib/core/src/send_swap.rs | 1 + lib/core/src/test_utils/persist.rs | 1 + packages/dart/lib/src/frb_generated.dart | 18 ++-- packages/dart/lib/src/frb_generated.io.dart | 3 + packages/dart/lib/src/model.dart | 7 ++ ...utter_breez_liquid_bindings_generated.dart | 2 + .../breezsdkliquid/BreezSDKLiquidMapper.kt | 4 +- .../ios/BreezSDKLiquidMapper.swift | 10 ++- packages/react-native/src/index.ts | 1 + 18 files changed, 109 insertions(+), 48 deletions(-) diff --git a/lib/bindings/langs/flutter/breez_sdk_liquid/include/breez_sdk_liquid.h b/lib/bindings/langs/flutter/breez_sdk_liquid/include/breez_sdk_liquid.h index 5da740029..aaeb005c8 100644 --- a/lib/bindings/langs/flutter/breez_sdk_liquid/include/breez_sdk_liquid.h +++ b/lib/bindings/langs/flutter/breez_sdk_liquid/include/breez_sdk_liquid.h @@ -439,6 +439,7 @@ typedef struct wire_cst_payment_details { typedef struct wire_cst_payment { struct wire_cst_list_prim_u_8_strict *destination; struct wire_cst_list_prim_u_8_strict *tx_id; + struct wire_cst_list_prim_u_8_strict *unblinding_data; uint32_t timestamp; uint64_t amount_sat; uint64_t fees_sat; diff --git a/lib/bindings/src/breez_sdk_liquid.udl b/lib/bindings/src/breez_sdk_liquid.udl index ada8a2ca8..74e430d0f 100644 --- a/lib/bindings/src/breez_sdk_liquid.udl +++ b/lib/bindings/src/breez_sdk_liquid.udl @@ -549,6 +549,7 @@ dictionary Payment { PaymentDetails details; string? destination = null; string? tx_id = null; + string? unblinding_data = null; }; enum PaymentType { diff --git a/lib/core/src/chain_swap.rs b/lib/core/src/chain_swap.rs index e2aed6c1b..df230e3e8 100644 --- a/lib/core/src/chain_swap.rs +++ b/lib/core/src/chain_swap.rs @@ -504,6 +504,7 @@ impl ChainSwapHandler { fees_sat: lockup_tx_fees_sat + swap.claim_fees_sat, payment_type: PaymentType::Send, is_confirmed: false, + unblinding_data: None, }, None, None)?; self.update_swap_info(&ChainSwapUpdate { @@ -837,6 +838,7 @@ impl ChainSwapHandler { fees_sat: 0, payment_type: PaymentType::Receive, is_confirmed: false, + unblinding_data: None, }, None, None, diff --git a/lib/core/src/frb_generated.rs b/lib/core/src/frb_generated.rs index e4fdda9bf..5a926d7fc 100644 --- a/lib/core/src/frb_generated.rs +++ b/lib/core/src/frb_generated.rs @@ -3445,6 +3445,7 @@ impl SseDecode for crate::model::Payment { fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { let mut var_destination = >::sse_decode(deserializer); let mut var_txId = >::sse_decode(deserializer); + let mut var_unblindingData = >::sse_decode(deserializer); let mut var_timestamp = ::sse_decode(deserializer); let mut var_amountSat = ::sse_decode(deserializer); let mut var_feesSat = ::sse_decode(deserializer); @@ -3454,6 +3455,7 @@ impl SseDecode for crate::model::Payment { return crate::model::Payment { destination: var_destination, tx_id: var_txId, + unblinding_data: var_unblindingData, timestamp: var_timestamp, amount_sat: var_amountSat, fees_sat: var_feesSat, @@ -5455,6 +5457,7 @@ impl flutter_rust_bridge::IntoDart for crate::model::Payment { [ self.destination.into_into_dart().into_dart(), self.tx_id.into_into_dart().into_dart(), + self.unblinding_data.into_into_dart().into_dart(), self.timestamp.into_into_dart().into_dart(), self.amount_sat.into_into_dart().into_dart(), self.fees_sat.into_into_dart().into_dart(), @@ -7417,6 +7420,7 @@ impl SseEncode for crate::model::Payment { fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { >::sse_encode(self.destination, serializer); >::sse_encode(self.tx_id, serializer); + >::sse_encode(self.unblinding_data, serializer); ::sse_encode(self.timestamp, serializer); ::sse_encode(self.amount_sat, serializer); ::sse_encode(self.fees_sat, serializer); @@ -9357,6 +9361,7 @@ mod io { crate::model::Payment { destination: self.destination.cst_decode(), tx_id: self.tx_id.cst_decode(), + unblinding_data: self.unblinding_data.cst_decode(), timestamp: self.timestamp.cst_decode(), amount_sat: self.amount_sat.cst_decode(), fees_sat: self.fees_sat.cst_decode(), @@ -10564,6 +10569,7 @@ mod io { Self { destination: core::ptr::null_mut(), tx_id: core::ptr::null_mut(), + unblinding_data: core::ptr::null_mut(), timestamp: Default::default(), amount_sat: Default::default(), fees_sat: Default::default(), @@ -12672,6 +12678,7 @@ mod io { pub struct wire_cst_payment { destination: *mut wire_cst_list_prim_u_8_strict, tx_id: *mut wire_cst_list_prim_u_8_strict, + unblinding_data: *mut wire_cst_list_prim_u_8_strict, timestamp: u32, amount_sat: u64, fees_sat: u64, diff --git a/lib/core/src/model.rs b/lib/core/src/model.rs index 3db5ab625..93c99d8ee 100644 --- a/lib/core/src/model.rs +++ b/lib/core/src/model.rs @@ -1139,6 +1139,10 @@ pub struct PaymentTxData { /// Onchain tx status pub is_confirmed: bool, + + /// Data to use in the `blinded` param when unblinding the transaction in an explorer. + /// See: https://docs.liquid.net/docs/unblinding-transactions + pub unblinding_data: Option, } #[derive(Debug, Clone, Serialize)] @@ -1269,6 +1273,10 @@ pub struct Payment { pub tx_id: Option, + /// Data to use in the `blinded` param when unblinding the transaction in an explorer. + /// See: https://docs.liquid.net/docs/unblinding-transactions + pub unblinding_data: Option, + /// Composite timestamp that can be used for sorting or displaying the payment. /// /// If this payment has an associated swap, it is the swap creation time. Otherwise, the point @@ -1320,6 +1328,7 @@ impl Payment { Payment { destination: swap.bolt11.clone(), tx_id: None, + unblinding_data: None, timestamp: swap.created_at, amount_sat, fees_sat: swap.payer_amount_sat - swap.receiver_amount_sat, @@ -1345,6 +1354,7 @@ impl Payment { ) -> Payment { Payment { tx_id: Some(tx.tx_id), + unblinding_data: tx.unblinding_data, // When the swap is present and of type send and receive, we retrieve the destination from the invoice. // If it's a chain swap instead, we use the `claim_address` field from the swap data (either pure Bitcoin or Liquid address). // Otherwise, we specify the Liquid address (BIP21 or pure), set in `payment_details.address`. diff --git a/lib/core/src/persist/migrations.rs b/lib/core/src/persist/migrations.rs index acac55e45..2598f2791 100644 --- a/lib/core/src/persist/migrations.rs +++ b/lib/core/src/persist/migrations.rs @@ -208,5 +208,6 @@ pub(crate) fn current_migrations() -> Vec<&'static str> { data BLOB NOT NULL ) STRICT;", "ALTER TABLE receive_swaps DROP COLUMN mrh_script_pubkey;", + "ALTER TABLE payment_tx_data ADD COLUMN unblinding_data TEXT;", ] } diff --git a/lib/core/src/persist/mod.rs b/lib/core/src/persist/mod.rs index 8658fb75d..1868bedda 100644 --- a/lib/core/src/persist/mod.rs +++ b/lib/core/src/persist/mod.rs @@ -107,6 +107,9 @@ impl Persister { .iter() .find(|output| output.is_some()) .and_then(|output| output.clone().map(|o| o.script_pubkey.to_hex())); + let unblinding_data = tx + .unblinded_url("") + .replace(&format!("tx/{}#blinded=", tx_id), ""); self.insert_or_update_payment( PaymentTxData { tx_id: tx_id.clone(), @@ -118,6 +121,7 @@ impl Persister { false => PaymentType::Send, }, is_confirmed: is_tx_confirmed, + unblinding_data: Some(unblinding_data), }, maybe_script_pubkey, None, @@ -138,9 +142,10 @@ impl Persister { amount_sat, fees_sat, payment_type, - is_confirmed + is_confirmed, + unblinding_data ) - VALUES (?, ?, ?, ?, ?, ?) + VALUES (?, ?, ?, ?, ?, ?, ?) ", ( &ptx.tx_id, @@ -149,6 +154,7 @@ impl Persister { ptx.fees_sat, ptx.payment_type, ptx.is_confirmed, + ptx.unblinding_data, ), )?; @@ -207,6 +213,7 @@ impl Persister { ptx.fees_sat, ptx.payment_type, ptx.is_confirmed, + ptx.unblinding_data, rs.id, rs.created_at, rs.invoice, @@ -280,47 +287,48 @@ impl Persister { fees_sat: row.get(3)?, payment_type: row.get(4)?, is_confirmed: row.get(5)?, + unblinding_data: row.get(6)?, }), _ => None, }; - let maybe_receive_swap_id: Option = row.get(6)?; - let maybe_receive_swap_created_at: Option = row.get(7)?; - let maybe_receive_swap_invoice: Option = row.get(8)?; - let maybe_receive_swap_payment_hash: Option = row.get(9)?; - let maybe_receive_swap_description: Option = row.get(10)?; - let maybe_receive_swap_preimage: Option = row.get(11)?; - let maybe_receive_swap_payer_amount_sat: Option = row.get(12)?; - let maybe_receive_swap_receiver_amount_sat: Option = row.get(13)?; - let maybe_receive_swap_receiver_state: Option = row.get(14)?; - - let maybe_send_swap_id: Option = row.get(15)?; - let maybe_send_swap_created_at: Option = row.get(16)?; - let maybe_send_swap_invoice: Option = row.get(17)?; - let maybe_send_swap_bolt12_offer: Option = row.get(18)?; - let maybe_send_swap_payment_hash: Option = row.get(19)?; - let maybe_send_swap_description: Option = row.get(20)?; - let maybe_send_swap_preimage: Option = row.get(21)?; - let maybe_send_swap_refund_tx_id: Option = row.get(22)?; - let maybe_send_swap_payer_amount_sat: Option = row.get(23)?; - let maybe_send_swap_receiver_amount_sat: Option = row.get(24)?; - let maybe_send_swap_state: Option = row.get(25)?; - - let maybe_chain_swap_id: Option = row.get(26)?; - let maybe_chain_swap_created_at: Option = row.get(27)?; - let maybe_chain_swap_direction: Option = row.get(28)?; - let maybe_chain_swap_preimage: Option = row.get(29)?; - let maybe_chain_swap_description: Option = row.get(30)?; - let maybe_chain_swap_refund_tx_id: Option = row.get(31)?; - let maybe_chain_swap_payer_amount_sat: Option = row.get(32)?; - let maybe_chain_swap_receiver_amount_sat: Option = row.get(33)?; - let maybe_chain_swap_claim_address: Option = row.get(34)?; - let maybe_chain_swap_state: Option = row.get(35)?; - - let maybe_swap_refund_tx_amount_sat: Option = row.get(36)?; - - let maybe_payment_details_destination: Option = row.get(37)?; - let maybe_payment_details_description: Option = row.get(38)?; + let maybe_receive_swap_id: Option = row.get(7)?; + let maybe_receive_swap_created_at: Option = row.get(8)?; + let maybe_receive_swap_invoice: Option = row.get(9)?; + let maybe_receive_swap_payment_hash: Option = row.get(10)?; + let maybe_receive_swap_description: Option = row.get(11)?; + let maybe_receive_swap_preimage: Option = row.get(12)?; + let maybe_receive_swap_payer_amount_sat: Option = row.get(13)?; + let maybe_receive_swap_receiver_amount_sat: Option = row.get(14)?; + let maybe_receive_swap_receiver_state: Option = row.get(15)?; + + let maybe_send_swap_id: Option = row.get(16)?; + let maybe_send_swap_created_at: Option = row.get(17)?; + let maybe_send_swap_invoice: Option = row.get(18)?; + let maybe_send_swap_bolt12_offer: Option = row.get(19)?; + let maybe_send_swap_payment_hash: Option = row.get(20)?; + let maybe_send_swap_description: Option = row.get(21)?; + let maybe_send_swap_preimage: Option = row.get(22)?; + let maybe_send_swap_refund_tx_id: Option = row.get(23)?; + let maybe_send_swap_payer_amount_sat: Option = row.get(24)?; + let maybe_send_swap_receiver_amount_sat: Option = row.get(25)?; + let maybe_send_swap_state: Option = row.get(26)?; + + let maybe_chain_swap_id: Option = row.get(27)?; + let maybe_chain_swap_created_at: Option = row.get(28)?; + let maybe_chain_swap_direction: Option = row.get(29)?; + let maybe_chain_swap_preimage: Option = row.get(30)?; + let maybe_chain_swap_description: Option = row.get(31)?; + let maybe_chain_swap_refund_tx_id: Option = row.get(32)?; + let maybe_chain_swap_payer_amount_sat: Option = row.get(33)?; + let maybe_chain_swap_receiver_amount_sat: Option = row.get(34)?; + let maybe_chain_swap_claim_address: Option = row.get(35)?; + let maybe_chain_swap_state: Option = row.get(36)?; + + let maybe_swap_refund_tx_amount_sat: Option = row.get(37)?; + + let maybe_payment_details_destination: Option = row.get(38)?; + let maybe_payment_details_description: Option = row.get(39)?; let (swap, payment_type) = match maybe_receive_swap_id { Some(receive_swap_id) => ( diff --git a/lib/core/src/receive_swap.rs b/lib/core/src/receive_swap.rs index dd905c8c4..fa0c6c78c 100644 --- a/lib/core/src/receive_swap.rs +++ b/lib/core/src/receive_swap.rs @@ -329,6 +329,7 @@ impl ReceiveSwapHandler { fees_sat: 0, payment_type: PaymentType::Receive, is_confirmed: false, + unblinding_data: None, }, None, None, diff --git a/lib/core/src/sdk.rs b/lib/core/src/sdk.rs index 5894a14b4..b836227ac 100644 --- a/lib/core/src/sdk.rs +++ b/lib/core/src/sdk.rs @@ -1212,6 +1212,7 @@ impl LiquidSdk { fees_sat, payment_type: PaymentType::Send, is_confirmed: false, + unblinding_data: None, }; let destination = address_data.to_uri().unwrap_or(address_data.address); diff --git a/lib/core/src/send_swap.rs b/lib/core/src/send_swap.rs index 1126f8260..d134a041f 100644 --- a/lib/core/src/send_swap.rs +++ b/lib/core/src/send_swap.rs @@ -234,6 +234,7 @@ impl SendSwapHandler { fees_sat: lockup_tx_fees_sat, payment_type: PaymentType::Send, is_confirmed: false, + unblinding_data: None, }, None, None, diff --git a/lib/core/src/test_utils/persist.rs b/lib/core/src/test_utils/persist.rs index 34e0a438a..b6ddf058a 100644 --- a/lib/core/src/test_utils/persist.rs +++ b/lib/core/src/test_utils/persist.rs @@ -133,5 +133,6 @@ pub(crate) fn new_payment_tx_data(payment_type: PaymentType) -> PaymentTxData { fees_sat: 0, payment_type, is_confirmed: false, + unblinding_data: None, } } diff --git a/packages/dart/lib/src/frb_generated.dart b/packages/dart/lib/src/frb_generated.dart index 65cb1a8b0..0c2b6e2f7 100644 --- a/packages/dart/lib/src/frb_generated.dart +++ b/packages/dart/lib/src/frb_generated.dart @@ -2470,16 +2470,17 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { Payment dco_decode_payment(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs final arr = raw as List; - if (arr.length != 8) throw Exception('unexpected arr length: expect 8 but see ${arr.length}'); + if (arr.length != 9) throw Exception('unexpected arr length: expect 9 but see ${arr.length}'); return Payment( destination: dco_decode_opt_String(arr[0]), txId: dco_decode_opt_String(arr[1]), - timestamp: dco_decode_u_32(arr[2]), - amountSat: dco_decode_u_64(arr[3]), - feesSat: dco_decode_u_64(arr[4]), - paymentType: dco_decode_payment_type(arr[5]), - status: dco_decode_payment_state(arr[6]), - details: dco_decode_payment_details(arr[7]), + unblindingData: dco_decode_opt_String(arr[2]), + timestamp: dco_decode_u_32(arr[3]), + amountSat: dco_decode_u_64(arr[4]), + feesSat: dco_decode_u_64(arr[5]), + paymentType: dco_decode_payment_type(arr[6]), + status: dco_decode_payment_state(arr[7]), + details: dco_decode_payment_details(arr[8]), ); } @@ -4444,6 +4445,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { // Codec=Sse (Serialization based), see doc to use other codecs var var_destination = sse_decode_opt_String(deserializer); var var_txId = sse_decode_opt_String(deserializer); + var var_unblindingData = sse_decode_opt_String(deserializer); var var_timestamp = sse_decode_u_32(deserializer); var var_amountSat = sse_decode_u_64(deserializer); var var_feesSat = sse_decode_u_64(deserializer); @@ -4453,6 +4455,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { return Payment( destination: var_destination, txId: var_txId, + unblindingData: var_unblindingData, timestamp: var_timestamp, amountSat: var_amountSat, feesSat: var_feesSat, @@ -6303,6 +6306,7 @@ class RustLibApiImpl extends RustLibApiImplPlatform implements RustLibApi { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_opt_String(self.destination, serializer); sse_encode_opt_String(self.txId, serializer); + sse_encode_opt_String(self.unblindingData, serializer); sse_encode_u_32(self.timestamp, serializer); sse_encode_u_64(self.amountSat, serializer); sse_encode_u_64(self.feesSat, serializer); diff --git a/packages/dart/lib/src/frb_generated.io.dart b/packages/dart/lib/src/frb_generated.io.dart index 8ebf6b025..d5782b36b 100644 --- a/packages/dart/lib/src/frb_generated.io.dart +++ b/packages/dart/lib/src/frb_generated.io.dart @@ -2673,6 +2673,7 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl { void cst_api_fill_to_wire_payment(Payment apiObj, wire_cst_payment wireObj) { wireObj.destination = cst_encode_opt_String(apiObj.destination); wireObj.tx_id = cst_encode_opt_String(apiObj.txId); + wireObj.unblinding_data = cst_encode_opt_String(apiObj.unblindingData); wireObj.timestamp = cst_encode_u_32(apiObj.timestamp); wireObj.amount_sat = cst_encode_u_64(apiObj.amountSat); wireObj.fees_sat = cst_encode_u_64(apiObj.feesSat); @@ -5840,6 +5841,8 @@ final class wire_cst_payment extends ffi.Struct { external ffi.Pointer tx_id; + external ffi.Pointer unblinding_data; + @ffi.Uint32() external int timestamp; diff --git a/packages/dart/lib/src/model.dart b/packages/dart/lib/src/model.dart index 16c963862..8209e2f3d 100644 --- a/packages/dart/lib/src/model.dart +++ b/packages/dart/lib/src/model.dart @@ -531,6 +531,10 @@ class Payment { final String? destination; final String? txId; + /// Data to use in the `blinded` param when unblinding the transaction in an explorer. + /// See: https://docs.liquid.net/docs/unblinding-transactions + final String? unblindingData; + /// Composite timestamp that can be used for sorting or displaying the payment. /// /// If this payment has an associated swap, it is the swap creation time. Otherwise, the point @@ -575,6 +579,7 @@ class Payment { const Payment({ this.destination, this.txId, + this.unblindingData, required this.timestamp, required this.amountSat, required this.feesSat, @@ -587,6 +592,7 @@ class Payment { int get hashCode => destination.hashCode ^ txId.hashCode ^ + unblindingData.hashCode ^ timestamp.hashCode ^ amountSat.hashCode ^ feesSat.hashCode ^ @@ -601,6 +607,7 @@ class Payment { runtimeType == other.runtimeType && destination == other.destination && txId == other.txId && + unblindingData == other.unblindingData && timestamp == other.timestamp && amountSat == other.amountSat && feesSat == other.feesSat && diff --git a/packages/flutter/lib/flutter_breez_liquid_bindings_generated.dart b/packages/flutter/lib/flutter_breez_liquid_bindings_generated.dart index 116cda308..593fd30c8 100644 --- a/packages/flutter/lib/flutter_breez_liquid_bindings_generated.dart +++ b/packages/flutter/lib/flutter_breez_liquid_bindings_generated.dart @@ -4443,6 +4443,8 @@ final class wire_cst_payment extends ffi.Struct { external ffi.Pointer tx_id; + external ffi.Pointer unblinding_data; + @ffi.Uint32() external int timestamp; diff --git a/packages/react-native/android/src/main/java/com/breezsdkliquid/BreezSDKLiquidMapper.kt b/packages/react-native/android/src/main/java/com/breezsdkliquid/BreezSDKLiquidMapper.kt index a10c7568b..3dfcad28d 100644 --- a/packages/react-native/android/src/main/java/com/breezsdkliquid/BreezSDKLiquidMapper.kt +++ b/packages/react-native/android/src/main/java/com/breezsdkliquid/BreezSDKLiquidMapper.kt @@ -1377,7 +1377,8 @@ fun asPayment(payment: ReadableMap): Payment? { val details = payment.getMap("details")?.let { asPaymentDetails(it) }!! val destination = if (hasNonNullKey(payment, "destination")) payment.getString("destination") else null val txId = if (hasNonNullKey(payment, "txId")) payment.getString("txId") else null - return Payment(timestamp, amountSat, feesSat, paymentType, status, details, destination, txId) + val unblindingData = if (hasNonNullKey(payment, "unblindingData")) payment.getString("unblindingData") else null + return Payment(timestamp, amountSat, feesSat, paymentType, status, details, destination, txId, unblindingData) } fun readableMapOf(payment: Payment): ReadableMap = @@ -1390,6 +1391,7 @@ fun readableMapOf(payment: Payment): ReadableMap = "details" to readableMapOf(payment.details), "destination" to payment.destination, "txId" to payment.txId, + "unblindingData" to payment.unblindingData, ) fun asPaymentList(arr: ReadableArray): List { diff --git a/packages/react-native/ios/BreezSDKLiquidMapper.swift b/packages/react-native/ios/BreezSDKLiquidMapper.swift index 1803382bf..41bbf6cb6 100644 --- a/packages/react-native/ios/BreezSDKLiquidMapper.swift +++ b/packages/react-native/ios/BreezSDKLiquidMapper.swift @@ -1639,8 +1639,15 @@ enum BreezSDKLiquidMapper { } txId = txIdTmp } + var unblindingData: String? + if hasNonNilKey(data: payment, key: "unblindingData") { + guard let unblindingDataTmp = payment["unblindingData"] as? String else { + throw SdkError.Generic(message: errUnexpectedValue(fieldName: "unblindingData")) + } + unblindingData = unblindingDataTmp + } - return Payment(timestamp: timestamp, amountSat: amountSat, feesSat: feesSat, paymentType: paymentType, status: status, details: details, destination: destination, txId: txId) + return Payment(timestamp: timestamp, amountSat: amountSat, feesSat: feesSat, paymentType: paymentType, status: status, details: details, destination: destination, txId: txId, unblindingData: unblindingData) } static func dictionaryOf(payment: Payment) -> [String: Any?] { @@ -1653,6 +1660,7 @@ enum BreezSDKLiquidMapper { "details": dictionaryOf(paymentDetails: payment.details), "destination": payment.destination == nil ? nil : payment.destination, "txId": payment.txId == nil ? nil : payment.txId, + "unblindingData": payment.unblindingData == nil ? nil : payment.unblindingData, ] } diff --git a/packages/react-native/src/index.ts b/packages/react-native/src/index.ts index 431289ea9..a61a7300f 100644 --- a/packages/react-native/src/index.ts +++ b/packages/react-native/src/index.ts @@ -256,6 +256,7 @@ export interface Payment { details: PaymentDetails destination?: string txId?: string + unblindingData?: string } export interface PrepareBuyBitcoinRequest {