Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Store unblinding data for the tx #584

Open
wants to merge 1 commit into
base: rt-sync
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -448,6 +448,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;
Expand Down
1 change: 1 addition & 0 deletions lib/bindings/src/breez_sdk_liquid.udl
Original file line number Diff line number Diff line change
Expand Up @@ -555,6 +555,7 @@ dictionary Payment {
u64? swapper_fees_sat = null;
string? destination = null;
string? tx_id = null;
string? unblinding_data = null;
};

enum PaymentType {
Expand Down
2 changes: 2 additions & 0 deletions lib/core/src/chain_swap.rs
Original file line number Diff line number Diff line change
Expand Up @@ -485,6 +485,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 {
Expand Down Expand Up @@ -838,6 +839,7 @@ impl ChainSwapHandler {
fees_sat: 0,
payment_type: PaymentType::Receive,
is_confirmed: false,
unblinding_data: None,
},
None,
None,
Expand Down
7 changes: 7 additions & 0 deletions lib/core/src/frb_generated.rs
Original file line number Diff line number Diff line change
Expand Up @@ -3553,6 +3553,7 @@ impl SseDecode for crate::model::Payment {
fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self {
let mut var_destination = <Option<String>>::sse_decode(deserializer);
let mut var_txId = <Option<String>>::sse_decode(deserializer);
let mut var_unblindingData = <Option<String>>::sse_decode(deserializer);
let mut var_timestamp = <u32>::sse_decode(deserializer);
let mut var_amountSat = <u64>::sse_decode(deserializer);
let mut var_feesSat = <u64>::sse_decode(deserializer);
Expand All @@ -3563,6 +3564,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,
Expand Down Expand Up @@ -5594,6 +5596,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(),
Expand Down Expand Up @@ -7623,6 +7626,7 @@ impl SseEncode for crate::model::Payment {
fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) {
<Option<String>>::sse_encode(self.destination, serializer);
<Option<String>>::sse_encode(self.tx_id, serializer);
<Option<String>>::sse_encode(self.unblinding_data, serializer);
<u32>::sse_encode(self.timestamp, serializer);
<u64>::sse_encode(self.amount_sat, serializer);
<u64>::sse_encode(self.fees_sat, serializer);
Expand Down Expand Up @@ -9606,6 +9610,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(),
Expand Down Expand Up @@ -10833,6 +10838,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(),
Expand Down Expand Up @@ -12997,6 +13003,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,
Expand Down
10 changes: 10 additions & 0 deletions lib/core/src/model.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1195,6 +1195,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<String>,
}

#[derive(Debug, Clone, Serialize)]
Expand Down Expand Up @@ -1328,6 +1332,10 @@ pub struct Payment {

pub tx_id: Option<String>,

/// 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<String>,

/// 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
Expand Down Expand Up @@ -1383,6 +1391,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,
Expand All @@ -1409,6 +1418,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`.
Expand Down
1 change: 1 addition & 0 deletions lib/core/src/persist/migrations.rs
Original file line number Diff line number Diff line change
Expand Up @@ -213,5 +213,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;",
]
}
91 changes: 51 additions & 40 deletions lib/core/src/persist/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -108,6 +108,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(),
Expand All @@ -119,6 +122,7 @@ impl Persister {
false => PaymentType::Send,
},
is_confirmed: is_tx_confirmed,
unblinding_data: Some(unblinding_data),
ok300 marked this conversation as resolved.
Show resolved Hide resolved
},
maybe_script_pubkey,
None,
Expand All @@ -133,7 +137,8 @@ impl Persister {
amount_sat,
fees_sat,
payment_type,
is_confirmed
is_confirmed,
unblinding_data
FROM payment_tx_data
WHERE is_confirmed = 0",
)?;
Expand All @@ -146,6 +151,7 @@ impl Persister {
fees_sat: row.get(3)?,
payment_type: row.get(4)?,
is_confirmed: row.get(5)?,
unblinding_data: row.get(6)?,
})
})?
.map(|i| i.unwrap())
Expand All @@ -167,15 +173,17 @@ impl Persister {
amount_sat,
fees_sat,
payment_type,
is_confirmed
is_confirmed,
unblinding_data
)
VALUES (?, ?, ?, ?, ?, ?)
VALUES (?, ?, ?, ?, ?, ?, ?)
ON CONFLICT (tx_id)
DO UPDATE SET timestamp = CASE WHEN excluded.is_confirmed = 1 THEN excluded.timestamp ELSE timestamp END,
amount_sat = excluded.amount_sat,
fees_sat = excluded.fees_sat,
payment_type = excluded.payment_type,
is_confirmed = excluded.is_confirmed
is_confirmed = excluded.is_confirmed,
unblinding_data = excluded.unblinding_data
",
(
&ptx.tx_id,
Expand All @@ -184,6 +192,7 @@ impl Persister {
ptx.fees_sat,
ptx.payment_type,
ptx.is_confirmed,
ptx.unblinding_data,
),
)?;

Expand Down Expand Up @@ -246,6 +255,7 @@ impl Persister {
ptx.fees_sat,
ptx.payment_type,
ptx.is_confirmed,
ptx.unblinding_data,
rs.id,
rs.created_at,
rs.invoice,
Expand Down Expand Up @@ -322,56 +332,57 @@ 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<String> = row.get(6)?;
let maybe_receive_swap_created_at: Option<u32> = row.get(7)?;
let maybe_receive_swap_invoice: Option<String> = row.get(8)?;
let maybe_receive_swap_payment_hash: Option<String> = row.get(9)?;
let maybe_receive_swap_description: Option<String> = row.get(10)?;
let maybe_receive_swap_preimage: Option<String> = row.get(11)?;
let maybe_receive_swap_payer_amount_sat: Option<u64> = row.get(12)?;
let maybe_receive_swap_receiver_amount_sat: Option<u64> = row.get(13)?;
let maybe_receive_swap_receiver_state: Option<PaymentState> = row.get(14)?;
let maybe_receive_swap_pair_fees_json: Option<String> = row.get(15)?;
let maybe_receive_swap_id: Option<String> = row.get(7)?;
let maybe_receive_swap_created_at: Option<u32> = row.get(8)?;
let maybe_receive_swap_invoice: Option<String> = row.get(9)?;
let maybe_receive_swap_payment_hash: Option<String> = row.get(10)?;
let maybe_receive_swap_description: Option<String> = row.get(11)?;
let maybe_receive_swap_preimage: Option<String> = row.get(12)?;
let maybe_receive_swap_payer_amount_sat: Option<u64> = row.get(13)?;
let maybe_receive_swap_receiver_amount_sat: Option<u64> = row.get(14)?;
let maybe_receive_swap_receiver_state: Option<PaymentState> = row.get(15)?;
let maybe_receive_swap_pair_fees_json: Option<String> = row.get(16)?;
let maybe_receive_swap_pair_fees: Option<ReversePair> =
maybe_receive_swap_pair_fees_json.and_then(|pair| serde_json::from_str(&pair).ok());

let maybe_send_swap_id: Option<String> = row.get(16)?;
let maybe_send_swap_created_at: Option<u32> = row.get(17)?;
let maybe_send_swap_invoice: Option<String> = row.get(18)?;
let maybe_send_swap_bolt12_offer: Option<String> = row.get(19)?;
let maybe_send_swap_payment_hash: Option<String> = row.get(20)?;
let maybe_send_swap_description: Option<String> = row.get(21)?;
let maybe_send_swap_preimage: Option<String> = row.get(22)?;
let maybe_send_swap_refund_tx_id: Option<String> = row.get(23)?;
let maybe_send_swap_payer_amount_sat: Option<u64> = row.get(24)?;
let maybe_send_swap_receiver_amount_sat: Option<u64> = row.get(25)?;
let maybe_send_swap_state: Option<PaymentState> = row.get(26)?;
let maybe_send_swap_pair_fees_json: Option<String> = row.get(27)?;
let maybe_send_swap_id: Option<String> = row.get(17)?;
let maybe_send_swap_created_at: Option<u32> = row.get(18)?;
let maybe_send_swap_invoice: Option<String> = row.get(19)?;
let maybe_send_swap_bolt12_offer: Option<String> = row.get(20)?;
let maybe_send_swap_payment_hash: Option<String> = row.get(21)?;
let maybe_send_swap_description: Option<String> = row.get(22)?;
let maybe_send_swap_preimage: Option<String> = row.get(23)?;
let maybe_send_swap_refund_tx_id: Option<String> = row.get(24)?;
let maybe_send_swap_payer_amount_sat: Option<u64> = row.get(25)?;
let maybe_send_swap_receiver_amount_sat: Option<u64> = row.get(26)?;
let maybe_send_swap_state: Option<PaymentState> = row.get(27)?;
let maybe_send_swap_pair_fees_json: Option<String> = row.get(28)?;
let maybe_send_swap_pair_fees: Option<SubmarinePair> =
maybe_send_swap_pair_fees_json.and_then(|pair| serde_json::from_str(&pair).ok());

let maybe_chain_swap_id: Option<String> = row.get(28)?;
let maybe_chain_swap_created_at: Option<u32> = row.get(29)?;
let maybe_chain_swap_direction: Option<Direction> = row.get(30)?;
let maybe_chain_swap_preimage: Option<String> = row.get(31)?;
let maybe_chain_swap_description: Option<String> = row.get(32)?;
let maybe_chain_swap_refund_tx_id: Option<String> = row.get(33)?;
let maybe_chain_swap_payer_amount_sat: Option<u64> = row.get(34)?;
let maybe_chain_swap_receiver_amount_sat: Option<u64> = row.get(35)?;
let maybe_chain_swap_claim_address: Option<String> = row.get(36)?;
let maybe_chain_swap_state: Option<PaymentState> = row.get(37)?;
let maybe_chain_swap_pair_fees_json: Option<String> = row.get(38)?;
let maybe_chain_swap_id: Option<String> = row.get(29)?;
let maybe_chain_swap_created_at: Option<u32> = row.get(30)?;
let maybe_chain_swap_direction: Option<Direction> = row.get(31)?;
let maybe_chain_swap_preimage: Option<String> = row.get(32)?;
let maybe_chain_swap_description: Option<String> = row.get(33)?;
let maybe_chain_swap_refund_tx_id: Option<String> = row.get(34)?;
let maybe_chain_swap_payer_amount_sat: Option<u64> = row.get(35)?;
let maybe_chain_swap_receiver_amount_sat: Option<u64> = row.get(36)?;
let maybe_chain_swap_claim_address: Option<String> = row.get(37)?;
let maybe_chain_swap_state: Option<PaymentState> = row.get(38)?;
let maybe_chain_swap_pair_fees_json: Option<String> = row.get(39)?;
let maybe_chain_swap_pair_fees: Option<ChainPair> =
maybe_chain_swap_pair_fees_json.and_then(|pair| serde_json::from_str(&pair).ok());

let maybe_swap_refund_tx_amount_sat: Option<u64> = row.get(39)?;
let maybe_swap_refund_tx_amount_sat: Option<u64> = row.get(40)?;

let maybe_payment_details_destination: Option<String> = row.get(40)?;
let maybe_payment_details_description: Option<String> = row.get(41)?;
let maybe_payment_details_destination: Option<String> = row.get(41)?;
let maybe_payment_details_description: Option<String> = row.get(42)?;

let (swap, payment_type) = match maybe_receive_swap_id {
Some(receive_swap_id) => {
Expand Down
1 change: 1 addition & 0 deletions lib/core/src/receive_swap.rs
Original file line number Diff line number Diff line change
Expand Up @@ -354,6 +354,7 @@ impl ReceiveSwapHandler {
fees_sat: 0,
payment_type: PaymentType::Receive,
is_confirmed: false,
unblinding_data: None,
},
None,
None,
Expand Down
1 change: 1 addition & 0 deletions lib/core/src/sdk.rs
Original file line number Diff line number Diff line change
Expand Up @@ -1215,6 +1215,7 @@ impl LiquidSdk {
fees_sat,
payment_type: PaymentType::Send,
is_confirmed: false,
unblinding_data: None,
};

let description = address_data.message;
Expand Down
1 change: 1 addition & 0 deletions lib/core/src/send_swap.rs
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,7 @@ impl SendSwapHandler {
fees_sat: lockup_tx_fees_sat,
payment_type: PaymentType::Send,
is_confirmed: false,
unblinding_data: None,
},
None,
None,
Expand Down
1 change: 1 addition & 0 deletions lib/core/src/test_utils/persist.rs
Original file line number Diff line number Diff line change
Expand Up @@ -162,5 +162,6 @@ pub(crate) fn new_payment_tx_data(payment_type: PaymentType) -> PaymentTxData {
fees_sat: 0,
payment_type,
is_confirmed: false,
unblinding_data: None,
}
}
20 changes: 12 additions & 8 deletions packages/dart/lib/src/frb_generated.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2525,17 +2525,18 @@ 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<dynamic>;
if (arr.length != 9) throw Exception('unexpected arr length: expect 9 but see ${arr.length}');
if (arr.length != 10) throw Exception('unexpected arr length: expect 10 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]),
swapperFeesSat: dco_decode_opt_box_autoadd_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]),
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]),
swapperFeesSat: dco_decode_opt_box_autoadd_u_64(arr[6]),
paymentType: dco_decode_payment_type(arr[7]),
status: dco_decode_payment_state(arr[8]),
details: dco_decode_payment_details(arr[9]),
);
}

Expand Down Expand Up @@ -4580,6 +4581,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);
Expand All @@ -4590,6 +4592,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,
Expand Down Expand Up @@ -6513,6 +6516,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);
Expand Down
3 changes: 3 additions & 0 deletions packages/dart/lib/src/frb_generated.io.dart
Original file line number Diff line number Diff line change
Expand Up @@ -2771,6 +2771,7 @@ abstract class RustLibApiImplPlatform extends BaseApiImpl<RustLibWire> {
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);
Expand Down Expand Up @@ -6024,6 +6025,8 @@ final class wire_cst_payment extends ffi.Struct {

external ffi.Pointer<wire_cst_list_prim_u_8_strict> tx_id;

external ffi.Pointer<wire_cst_list_prim_u_8_strict> unblinding_data;

@ffi.Uint32()
external int timestamp;

Expand Down
Loading
Loading