From a57083f520bf27ffa82642e07c9f02ac7d4c3ba4 Mon Sep 17 00:00:00 2001 From: Ross Savage <551697+dangeross@users.noreply.github.com> Date: Fri, 13 Dec 2024 13:11:56 +0100 Subject: [PATCH] Check MRH has already been paid (#596) --- lib/core/src/persist/mod.rs | 8 ++++++-- lib/core/src/sdk.rs | 19 +++++++++++++++++-- 2 files changed, 23 insertions(+), 4 deletions(-) diff --git a/lib/core/src/persist/mod.rs b/lib/core/src/persist/mod.rs index 0da92df..be6324b 100644 --- a/lib/core/src/persist/mod.rs +++ b/lib/core/src/persist/mod.rs @@ -115,13 +115,17 @@ impl Persister { )?; if let Some(destination) = destination { + // Only store the destination if there is no payment_details entry else + // the destination is overwritten by the tx script_pubkey con.execute( - "INSERT OR REPLACE INTO payment_details ( + "INSERT INTO payment_details ( tx_id, destination, description ) - VALUES (?, ?, ?) + VALUES (?1, ?2, ?3) + ON CONFLICT (tx_id) + DO UPDATE SET description = COALESCE(?3, description) ", (ptx.tx_id, destination, description), )?; diff --git a/lib/core/src/sdk.rs b/lib/core/src/sdk.rs index 34a8d16..17397fa 100644 --- a/lib/core/src/sdk.rs +++ b/lib/core/src/sdk.rs @@ -1020,7 +1020,7 @@ impl LiquidSdk { PaymentError::InsufficientFunds ); - self.pay_liquid(liquid_address_data.clone(), amount_sat, *fees_sat) + self.pay_liquid(liquid_address_data.clone(), amount_sat, *fees_sat, true) .await } SendDestination::Bolt11 { invoice } => { @@ -1074,6 +1074,7 @@ impl LiquidSdk { }, amount_sat, fees_sat, + false, ) .await } @@ -1127,7 +1128,22 @@ impl LiquidSdk { address_data: LiquidAddressData, receiver_amount_sat: u64, fees_sat: u64, + skip_already_paid_check: bool, ) -> Result { + let destination = address_data + .to_uri() + .unwrap_or(address_data.address.clone()); + let payments = self.persister.get_payments(&ListPaymentsRequest { + details: Some(ListPaymentDetails::Liquid { + destination: destination.clone(), + }), + ..Default::default() + })?; + ensure_sdk!( + skip_already_paid_check || payments.is_empty(), + PaymentError::AlreadyPaid + ); + let tx = self .onchain_wallet .build_tx_or_drain_tx( @@ -1159,7 +1175,6 @@ impl LiquidSdk { is_confirmed: false, }; - let destination = address_data.to_uri().unwrap_or(address_data.address); let description = address_data.message; self.persister.insert_or_update_payment(