diff --git a/libs/sdk-bindings/bindings-android/lib/src/main/kotlin/breez_sdk_notification/job/ReceivePayment.kt b/libs/sdk-bindings/bindings-android/lib/src/main/kotlin/breez_sdk_notification/job/ReceivePayment.kt index c96dc7a95..4e883e7c5 100644 --- a/libs/sdk-bindings/bindings-android/lib/src/main/kotlin/breez_sdk_notification/job/ReceivePayment.kt +++ b/libs/sdk-bindings/bindings-android/lib/src/main/kotlin/breez_sdk_notification/job/ReceivePayment.kt @@ -29,6 +29,7 @@ class ReceivePaymentJob( private val logger: ServiceLogger, ) : Job { private var receivedPayment: Payment? = null + private var breezSDK: BlockingBreezServices? = null companion object { private const val TAG = "ReceivePaymentJob" @@ -36,6 +37,7 @@ class ReceivePaymentJob( override fun start(breezSDK: BlockingBreezServices) { try { + this.breezSDK = breezSDK val decoder = Json { ignoreUnknownKeys = true } val request = decoder.decodeFromString(ReceivePaymentRequest.serializer(), payload) val payment = breezSDK.paymentByHash(request.paymentHash) @@ -54,8 +56,18 @@ class ReceivePaymentJob( when (e) { is BreezEvent.InvoicePaid -> { val pd = e.details - handleReceivedPayment(pd.bolt11, pd.paymentHash, pd.payment?.amountMsat) - receivedPayment = pd.payment + handleReceivedPayment(pd.paymentHash, pd.amountMsat) + val payment = try { + breezSDK?.paymentByHash(pd.paymentHash) + } catch (e: Exception) { + logger.log( + TAG, + "Failed to load payment by hash ${pd.paymentHash}: ${e.message}", + "WARN" + ) + null + } + receivedPayment = payment } is BreezEvent.Synced -> { @@ -71,13 +83,9 @@ class ReceivePaymentJob( override fun onShutdown() {} - private fun handleReceivedPayment( - bolt11: String, - paymentHash: String, - amountMsat: ULong?, - ) { - logger.log(TAG, "Received payment. Bolt11:${bolt11}\nPayment Hash:${paymentHash}", "INFO") - val amountSat = (amountMsat ?: ULong.MIN_VALUE) / 1000u + private fun handleReceivedPayment(paymentHash: String, amountMsat: ULong) { + logger.log(TAG, "Received payment. Payment Hash:${paymentHash}", "INFO") + val amountSat = amountMsat / 1000u notifyChannel( context, NOTIFICATION_CHANNEL_PAYMENT_RECEIVED, diff --git a/libs/sdk-bindings/bindings-swift/Sources/BreezSDK/Task/ReceivePayment.swift b/libs/sdk-bindings/bindings-swift/Sources/BreezSDK/Task/ReceivePayment.swift index 452875e40..a7c43b4ef 100644 --- a/libs/sdk-bindings/bindings-swift/Sources/BreezSDK/Task/ReceivePayment.swift +++ b/libs/sdk-bindings/bindings-swift/Sources/BreezSDK/Task/ReceivePayment.swift @@ -13,6 +13,7 @@ class ReceivePaymentTask : TaskProtocol { internal var bestAttemptContent: UNMutableNotificationContent? internal var logger: ServiceLogger internal var receivedPayment: Payment? = nil + internal var breezSDK: BlockingBreezServices? = nil init(payload: String, logger: ServiceLogger, contentHandler: ((UNNotificationContent) -> Void)? = nil, bestAttemptContent: UNMutableNotificationContent? = nil) { self.payload = payload @@ -24,8 +25,15 @@ class ReceivePaymentTask : TaskProtocol { public func onEvent(e: BreezEvent) { switch e { case .invoicePaid(details: let details): - self.logger.log(tag: TAG, line: "Received payment. Bolt11: \(details.bolt11)\nPayment Hash:\(details.paymentHash)", level: "INFO") - receivedPayment = details.payment + self.logger.log(tag: TAG, line: "Received payment.\nPayment Hash:\(details.paymentHash)", level: "INFO") + let loadedPayment: Payment? + do { + loadedPayment = try self.breezSDK?.paymentByHash(hash: details.paymentHash) + } catch let e { + self.logger.log(tag: TAG, line: "Failed to load payment by hash \(details.paymentHash): \(e)", level: "WARN") + loadedPayment = nil + } + receivedPayment = loadedPayment break case .synced: self.logger.log(tag: TAG, line: "got synced event", level: "INFO") @@ -40,6 +48,7 @@ class ReceivePaymentTask : TaskProtocol { func start(breezSDK: BlockingBreezServices) throws { do { + self.breezSDK = breezSDK let request = try JSONDecoder().decode(ReceivePaymentNotificationRequest.self, from: self.payload.data(using: .utf8)!) let existingPayment = try breezSDK.paymentByHash(hash: request.payment_hash) if existingPayment != nil { diff --git a/libs/sdk-bindings/src/breez_sdk.udl b/libs/sdk-bindings/src/breez_sdk.udl index c4f77ec6d..e4be9f576 100644 --- a/libs/sdk-bindings/src/breez_sdk.udl +++ b/libs/sdk-bindings/src/breez_sdk.udl @@ -260,7 +260,6 @@ dictionary Payment { u64 fee_msat; PaymentStatus status; string? error; - string? description; PaymentDetails details; string? metadata; }; @@ -320,16 +319,35 @@ dictionary LnPaymentDetails { string payment_preimage; boolean keysend; string bolt11; - SuccessActionProcessed? lnurl_success_action; - string? lnurl_pay_domain; - string? lnurl_pay_comment; - string? lnurl_metadata; - string? ln_address; - string? lnurl_withdraw_endpoint; + string description; + LnUrlInfo? lnurl_info; SwapInfo? swap_info; ReverseSwapInfo? reverse_swap_info; }; +[Enum] +interface LnUrlPayTarget { + LnAddress(string address); + Domain(string domain); +}; + +dictionary LnUrlPayInfo { + LnUrlPayTarget target; + string metadata; + string? comment; + SuccessActionProcessed? success_action; +}; + +dictionary LnUrlWithdrawInfo { + string endpoint; +}; + +[Enum] +interface LnUrlInfo { + Pay(LnUrlPayInfo info); + Withdraw(LnUrlWithdrawInfo info); +}; + dictionary ClosedChannelPaymentDetails { ChannelState state; string funding_txid; @@ -395,8 +413,8 @@ dictionary LogEntry { dictionary InvoicePaidDetails { string payment_hash; - string bolt11; - Payment? payment; + string payment_preimage; + u64 amount_msat; }; dictionary PaymentFailedData { diff --git a/libs/sdk-bindings/src/lib.rs b/libs/sdk-bindings/src/lib.rs index f787c6a23..503956dac 100644 --- a/libs/sdk-bindings/src/lib.rs +++ b/libs/sdk-bindings/src/lib.rs @@ -11,14 +11,15 @@ use breez_sdk_core::{ ConnectRequest, CurrencyInfo, EnvironmentType, EventListener, FeeratePreset, FiatCurrency, HealthCheckStatus, InputType, InvoicePaidDetails, LNInvoice, LNOffer, ListPaymentsRequest, ListSwapsRequest, LnOfferBlindedPath, LnPaymentDetails, LnUrlAuthError, LnUrlAuthRequestData, - LnUrlCallbackStatus, LnUrlErrorData, LnUrlPayError, LnUrlPayErrorData, LnUrlPayRequest, - LnUrlPayRequestData, LnUrlWithdrawError, LnUrlWithdrawRequest, LnUrlWithdrawRequestData, - LnUrlWithdrawResult, LnUrlWithdrawSuccessData, LocaleOverrides, LocalizedName, LogEntry, - LogStream, LspInformation, MessageSuccessActionData, MetadataFilter, MetadataItem, Network, - NodeState, OnchainPaymentLimitsResponse, OpenChannelFeeRequest, OpenChannelFeeResponse, - OpeningFeeParams, OpeningFeeParamsMenu, PayOnchainRequest, PayOnchainResponse, Payment, - PaymentDetails, PaymentFailedData, PaymentStatus, PaymentType, PaymentTypeFilter, - PrepareOnchainPaymentRequest, PrepareOnchainPaymentResponse, PrepareRedeemOnchainFundsRequest, + LnUrlCallbackStatus, LnUrlErrorData, LnUrlInfo, LnUrlPayError, LnUrlPayErrorData, LnUrlPayInfo, + LnUrlPayRequest, LnUrlPayRequestData, LnUrlPayTarget, LnUrlWithdrawError, LnUrlWithdrawInfo, + LnUrlWithdrawRequest, LnUrlWithdrawRequestData, LnUrlWithdrawResult, LnUrlWithdrawSuccessData, + LocaleOverrides, LocalizedName, LogEntry, LogStream, LspInformation, MessageSuccessActionData, + MetadataFilter, MetadataItem, Network, NodeState, OnchainPaymentLimitsResponse, + OpenChannelFeeRequest, OpenChannelFeeResponse, OpeningFeeParams, OpeningFeeParamsMenu, + PayOnchainRequest, PayOnchainResponse, Payment, PaymentDetails, PaymentFailedData, + PaymentStatus, PaymentType, PaymentTypeFilter, PrepareOnchainPaymentRequest, + PrepareOnchainPaymentResponse, PrepareRedeemOnchainFundsRequest, PrepareRedeemOnchainFundsResponse, PrepareRefundRequest, PrepareRefundResponse, Rate, ReceiveOnchainRequest, ReceivePaymentRequest, ReceivePaymentResponse, RecommendedFees, RedeemOnchainFundsRequest, RedeemOnchainFundsResponse, RefundRequest, RefundResponse, diff --git a/libs/sdk-core/src/breez_services.rs b/libs/sdk-core/src/breez_services.rs index 92fe75258..92145c668 100644 --- a/libs/sdk-core/src/breez_services.rs +++ b/libs/sdk-core/src/breez_services.rs @@ -37,6 +37,7 @@ use crate::models::{ }; use crate::node_api::NodeAPI; use crate::persist::db::SqliteStorage; +use crate::persist::payment_store::PaymentStore; use crate::persist::swap::SwapStorage; use crate::persist::transactions::PaymentStorage; use crate::receiver::{PaymentReceiver, Receiver}; @@ -97,8 +98,8 @@ pub struct PaymentFailedData { #[derive(Clone, Debug, PartialEq)] pub struct InvoicePaidDetails { pub payment_hash: String, - pub bolt11: String, - pub payment: Option, + pub payment_preimage: String, + pub amount_msat: u64, } pub trait LogStream: Send + Sync { @@ -144,6 +145,7 @@ pub struct BreezServices { config: Config, started: Mutex, node_api: Arc, + payment_store: Arc, lsp_api: Arc, receiver: Arc, fiat_api: Arc, @@ -297,6 +299,16 @@ impl BreezServices { return Err(SendPaymentError::AlreadyPaid); } + let info = LnPaymentInfo { + bolt11: parsed_invoice.bolt11.clone(), + payment_hash: parsed_invoice.payment_hash.clone(), + destination_pubkey: parsed_invoice.payee_pubkey.clone(), + description: parsed_invoice.description.clone(), + }; + self.payment_store + .set_ln_info(&parsed_invoice.payment_hash, &info) + .await?; + self.persist_pending_payment(&parsed_invoice, amount_msat)?; debug!("attempting normal payment"); @@ -307,13 +319,19 @@ impl BreezServices { .await; debug!("payment returned {payment_res:?}"); - let payment = self + let mut payment = self .on_payment_completed( parsed_invoice.payee_pubkey.clone(), Some(parsed_invoice), payment_res, ) .await?; + if let PaymentDetails::Ln { data } = &mut payment.details { + data.bolt11 = info.bolt11; + data.payment_hash = info.payment_hash; + data.destination_pubkey = info.destination_pubkey; + data.description = info.description; + } Ok(SendPaymentResponse { payment }) } @@ -362,7 +380,7 @@ impl BreezServices { }; let invoice = parse_invoice(cb.pr.as_str())?; - let payment = match self.send_payment(pay_req).await { + let mut payment = match self.send_payment(pay_req).await { Ok(p) => Ok(p), e @ Err( SendPaymentError::InvalidInvoice { .. } @@ -414,9 +432,28 @@ impl BreezServices { let lnurl_pay_domain = match req.data.ln_address { Some(_) => None, - None => Some(req.data.domain), + None => Some(req.data.domain.clone()), }; // Store SA (if available) + LN Address in separate table, associated to payment_hash + let target = match &req.data.ln_address { + Some(address) => LnUrlPayTarget::LnAddress { + address: address.clone(), + }, + None => LnUrlPayTarget::Domain { + domain: req.data.domain, + }, + }; + let info = LnUrlPayInfo { + target, + metadata: req.data.metadata_str.clone(), + comment: req.comment.clone(), + success_action: maybe_sa_processed.clone(), + }; + let info = LnUrlInfo::Pay { info }; + self.payment_store + .set_lnurl_info(&invoice.payment_hash, &info) + .await?; + self.persister.insert_payment_external_info( &details.payment_hash, PaymentExternalInfo { @@ -431,6 +468,9 @@ impl BreezServices { }, )?; + if let PaymentDetails::Ln { data } = &mut payment.details { + data.lnurl_info = Some(info); + } Ok(LnUrlPayResult::EndpointSuccess { data: lnurl::pay::LnUrlPaySuccessData { payment, @@ -455,7 +495,6 @@ impl BreezServices { .receive_payment(ReceivePaymentRequest { amount_msat: req.amount_msat, description: req.description.unwrap_or_default(), - use_description_hash: Some(false), ..Default::default() }) .await? @@ -465,6 +504,14 @@ impl BreezServices { let res = validate_lnurl_withdraw(self.rest_client.as_ref(), req.data, invoice).await?; if let LnUrlWithdrawResult::Ok { ref data } = res { + let info = LnUrlWithdrawInfo { + endpoint: lnurl_w_endpoint.clone(), + }; + let info = LnUrlInfo::Withdraw { info }; + self.payment_store + .set_lnurl_info(&data.invoice.payment_hash, &info) + .await?; + // If endpoint was successfully called, store the LNURL-withdraw endpoint URL as metadata linked to the invoice self.persister.insert_payment_external_info( &data.invoice.payment_hash, @@ -509,7 +556,17 @@ impl BreezServices { &self, req: ReceivePaymentRequest, ) -> Result { - self.receiver.receive_payment(req).await + let response = self.receiver.receive_payment(req.clone()).await?; + let info = LnPaymentInfo { + bolt11: response.ln_invoice.bolt11.clone(), + payment_hash: response.ln_invoice.payment_hash.clone(), + destination_pubkey: self.node_api.node_id().await?, + description: Some(req.description), + }; + self.payment_store + .set_ln_info(&response.ln_invoice.payment_hash, &info) + .await?; + Ok(response) } /// Report an issue. @@ -588,12 +645,55 @@ impl BreezServices { /// List payments matching the given filters, as retrieved from persistent storage pub async fn list_payments(&self, req: ListPaymentsRequest) -> SdkResult> { - Ok(self.persister.list_payments(req)?) + let mut payments = self.persister.list_payments(req)?; + let ln_payment_ids: Vec<&str> = payments + .iter() + .filter(|payment| matches!(payment.details, PaymentDetails::Ln { .. })) + .map(|payment| payment.id.as_str()) + .collect(); + + if !ln_payment_ids.is_empty() { + let mut ln_info = self.payment_store.get_ln_info(&ln_payment_ids).await?; + let mut lnurl_info = self.payment_store.get_lnurl_info(&ln_payment_ids).await?; + for payment in &mut payments { + if let PaymentDetails::Ln { data } = &mut payment.details { + if let Some(info) = ln_info.remove(payment.id.as_str()) { + data.bolt11 = info.bolt11; + data.payment_hash = info.payment_hash; + data.destination_pubkey = info.destination_pubkey; + data.description = info.description; + } + data.lnurl_info = lnurl_info.remove(payment.id.as_str()); + } + } + } + + Ok(payments) } /// Fetch a specific payment by its hash. pub async fn payment_by_hash(&self, hash: String) -> SdkResult> { - Ok(self.persister.get_payment_by_hash(&hash)?) + if let Some(mut payment) = self.persister.get_payment_by_hash(&hash)? { + if let PaymentDetails::Ln { data } = &mut payment.details { + let mut ln_info = self + .payment_store + .get_ln_info(&[payment.id.as_str()]) + .await?; + let mut lnurl_info = self + .payment_store + .get_lnurl_info(&[payment.id.as_str()]) + .await?; + if let Some(info) = ln_info.remove(payment.id.as_str()) { + data.bolt11 = info.bolt11; + data.payment_hash = info.payment_hash; + data.destination_pubkey = info.destination_pubkey; + data.description = info.description; + } + data.lnurl_info = lnurl_info.remove(payment.id.as_str()); + } + return Ok(Some(payment)); + } + Ok(None) } /// Set the external metadata of a payment as a valid JSON string @@ -1111,7 +1211,6 @@ impl BreezServices { fee_msat: 0, status: PaymentStatus::Pending, error: None, - description: invoice.description.clone(), details: PaymentDetails::Ln { data: LnPaymentDetails { payment_hash: invoice.payment_hash.clone(), @@ -1119,14 +1218,8 @@ impl BreezServices { payment_preimage: String::new(), keysend: false, bolt11: invoice.bolt11.clone(), - lnurl_success_action: None, - lnurl_pay_domain: None, - lnurl_pay_comment: None, - ln_address: None, - lnurl_metadata: None, - lnurl_withdraw_endpoint: None, - swap_info: None, - reverse_swap_info: None, + description: invoice.description.clone(), + ..Default::default() }, }, metadata: None, @@ -1450,23 +1543,18 @@ impl BreezServices { }; debug!("invoice stream got new invoice"); - let mut payment: Option = p.clone().try_into().ok(); - if let Some(ref p) = payment { + if let Ok(ref p) = p.clone().try_into() { let res = cloned .persister .insert_or_update_payments(std::slice::from_ref(p), false); debug!("paid invoice was added to payments list {res:?}"); - payment = cloned - .persister - .get_payment_by_hash(&p.id) - .unwrap_or(payment); } _ = cloned .on_event(BreezEvent::InvoicePaid { details: InvoicePaidDetails { payment_hash: hex::encode(p.payment_hash), - bolt11: p.bolt11, - payment, + payment_preimage: hex::encode(p.preimage), + amount_msat: p.amount_msat, }, }) .await; @@ -1887,6 +1975,7 @@ struct BreezServicesBuilder { node_api: Option>, backup_transport: Option>, seed: Option>, + payment_store: Option>, lsp_api: Option>, fiat_api: Option>, persister: Option>, @@ -1908,6 +1997,7 @@ impl BreezServicesBuilder { config, node_api: None, seed: None, + payment_store: None, lsp_api: None, fiat_api: None, persister: None, @@ -1927,6 +2017,11 @@ impl BreezServicesBuilder { self } + pub fn payment_store(&mut self, payment_store: Arc) -> &mut Self { + self.payment_store = Some(payment_store); + self + } + #[cfg(test)] pub fn lsp_api(&mut self, lsp_api: Arc) -> &mut Self { self.lsp_api = Some(lsp_api.clone()); @@ -2023,18 +2118,22 @@ impl BreezServicesBuilder { let mut node_api = self.node_api.clone(); let mut backup_transport = self.backup_transport.clone(); let mut lsp_api = self.lsp_api.clone(); + let mut payment_store = self.payment_store.clone(); if node_api.is_none() { let node_impls = node_builder::build_node( self.config.clone(), self.seed.clone().unwrap(), restore_only, - persister.clone(), ) .await?; node_api = Some(node_impls.node); backup_transport = backup_transport.or(Some(node_impls.backup_transport)); lsp_api = lsp_api.or(node_impls.lsp); + payment_store = payment_store.or(Some(node_impls.payment_store)); } + let payment_store = payment_store.ok_or(ConnectError::Generic { + err: "Payment store should be provided".into(), + })?; let lsp_api = lsp_api.ok_or(ConnectError::Generic { err: "LSP Api should be provided".into(), })?; @@ -2149,6 +2248,7 @@ impl BreezServicesBuilder { config: self.config.clone(), started: Mutex::new(false), node_api: unwrapped_node_api.clone(), + payment_store, lsp_api, receiver, fiat_api: self @@ -2266,6 +2366,7 @@ pub(crate) mod tests { use crate::breez_services::{BreezServices, BreezServicesBuilder}; use crate::models::{LnPaymentDetails, NodeState, Payment, PaymentDetails, PaymentTypeFilter}; use crate::node_api::NodeAPI; + use crate::persist::payment_store::PaymentStore; use crate::persist::swap::SwapStorage; use crate::test_utils::*; use crate::*; @@ -2285,6 +2386,21 @@ pub(crate) mod tests { message: "test message".into(), }, }; + let lnurl_withdraw_info = LnUrlInfo::Withdraw { + info: LnUrlWithdrawInfo { + endpoint: test_lnurl_withdraw_endpoint.to_string(), + }, + }; + let lnurl_pay_info = LnUrlInfo::Pay { + info: LnUrlPayInfo { + target: LnUrlPayTarget::LnAddress { + address: test_ln_address.to_string(), + }, + metadata: lnurl_metadata.to_string(), + comment: None, + success_action: Some(sa.clone()), + }, + }; let payment_hash_lnurl_withdraw = "2222"; let payment_hash_with_lnurl_success_action = "3333"; @@ -2359,7 +2475,6 @@ pub(crate) mod tests { fee_msat: 0, status: PaymentStatus::Complete, error: None, - description: Some("test receive".to_string()), details: PaymentDetails::Ln { data: LnPaymentDetails { payment_hash: "1111".to_string(), @@ -2367,14 +2482,8 @@ pub(crate) mod tests { payment_preimage: "2222".to_string(), keysend: false, bolt11: "1111".to_string(), - lnurl_success_action: None, - lnurl_pay_domain: None, - lnurl_pay_comment: None, - lnurl_metadata: None, - ln_address: None, - lnurl_withdraw_endpoint: None, - swap_info: None, - reverse_swap_info: None, + description: "test receive".to_string(), + ..Default::default() }, }, metadata: None, @@ -2387,7 +2496,6 @@ pub(crate) mod tests { fee_msat: 0, status: PaymentStatus::Complete, error: None, - description: Some("test lnurl-withdraw receive".to_string()), details: PaymentDetails::Ln { data: LnPaymentDetails { payment_hash: payment_hash_lnurl_withdraw.to_string(), @@ -2395,14 +2503,9 @@ pub(crate) mod tests { payment_preimage: "3333".to_string(), keysend: false, bolt11: "1111".to_string(), - lnurl_success_action: None, - lnurl_pay_domain: None, - lnurl_pay_comment: None, - lnurl_metadata: None, - ln_address: None, - lnurl_withdraw_endpoint: Some(test_lnurl_withdraw_endpoint.to_string()), - swap_info: None, - reverse_swap_info: None, + description: "test lnurl-withdraw receive".to_string(), + lnurl_info: Some(lnurl_withdraw_info.clone()), + ..Default::default() }, }, metadata: None, @@ -2415,7 +2518,6 @@ pub(crate) mod tests { fee_msat: 2, status: PaymentStatus::Complete, error: None, - description: Some("test payment".to_string()), details: PaymentDetails::Ln { data: LnPaymentDetails { payment_hash: payment_hash_with_lnurl_success_action.to_string(), @@ -2423,14 +2525,9 @@ pub(crate) mod tests { payment_preimage: "4444".to_string(), keysend: false, bolt11: "123".to_string(), - lnurl_success_action: Some(sa.clone()), - lnurl_pay_domain: None, - lnurl_pay_comment: None, - lnurl_metadata: Some(lnurl_metadata.to_string()), - ln_address: Some(test_ln_address.to_string()), - lnurl_withdraw_endpoint: None, - swap_info: None, - reverse_swap_info: None, + description: "test payment".to_string(), + lnurl_info: Some(lnurl_pay_info.clone()), + ..Default::default() }, }, metadata: None, @@ -2443,7 +2540,6 @@ pub(crate) mod tests { fee_msat: 0, status: PaymentStatus::Complete, error: None, - description: Some("test receive".to_string()), details: PaymentDetails::Ln { data: LnPaymentDetails { payment_hash: hex::encode(payment_hash_swap), @@ -2451,14 +2547,9 @@ pub(crate) mod tests { payment_preimage: "5555".to_string(), keysend: false, bolt11: "312".to_string(), - lnurl_success_action: None, - lnurl_pay_domain: None, - lnurl_pay_comment: None, - lnurl_metadata: None, - ln_address: None, - lnurl_withdraw_endpoint: None, + description: "test receive".to_string(), swap_info: Some(swap_info.clone()), - reverse_swap_info: None, + ..Default::default() }, }, metadata: None, @@ -2471,7 +2562,6 @@ pub(crate) mod tests { fee_msat: 2_000, status: PaymentStatus::Complete, error: None, - description: Some("test send onchain".to_string()), details: PaymentDetails::Ln { data: LnPaymentDetails { payment_hash: hex::encode(payment_hash_rev_swap), @@ -2479,14 +2569,9 @@ pub(crate) mod tests { payment_preimage: hex::encode(preimage_rev_swap), keysend: false, bolt11: "312".to_string(), - lnurl_success_action: None, - lnurl_metadata: None, - lnurl_pay_domain: None, - lnurl_pay_comment: None, - ln_address: None, - lnurl_withdraw_endpoint: None, - swap_info: None, + description: "test send onchain".to_string(), reverse_swap_info: Some(rev_swap_info.clone()), + ..Default::default() }, }, metadata: None, @@ -2536,12 +2621,21 @@ pub(crate) mod tests { .update_reverse_swap_lockup_txid("rev_swap_id", Some("lockup_txid".to_string()))?; persister.update_reverse_swap_claim_txid("rev_swap_id", Some("claim_txid".to_string()))?; + let payment_store = Arc::new(MockPaymentStore::default()); + payment_store + .set_lnurl_info(payment_hash_lnurl_withdraw, &lnurl_withdraw_info) + .await?; + payment_store + .set_lnurl_info(payment_hash_with_lnurl_success_action, &lnurl_pay_info) + .await?; + let mut builder = BreezServicesBuilder::new(test_config.clone()); let breez_services = builder .lsp_api(Arc::new(MockBreezServer {})) .fiat_api(Arc::new(MockBreezServer {})) .node_api(node_api) .persister(persister) + .payment_store(payment_store) .backup_transport(Arc::new(MockBackupTransport::new())) .build(None, None) .await?; @@ -2580,18 +2674,6 @@ pub(crate) mod tests { }) .await?; assert_eq!(sent, vec![cloned[4].clone(), cloned[2].clone()]); - assert!(matches!( - &sent[1].details, - PaymentDetails::Ln {data: LnPaymentDetails {lnurl_success_action, ..}} - if lnurl_success_action == &Some(sa))); - assert!(matches!( - &sent[1].details, - PaymentDetails::Ln {data: LnPaymentDetails {lnurl_pay_domain, ln_address, ..}} - if lnurl_pay_domain.is_none() && ln_address == &Some(test_ln_address.to_string()))); - assert!(matches!( - &received[1].details, - PaymentDetails::Ln {data: LnPaymentDetails {lnurl_withdraw_endpoint, ..}} - if lnurl_withdraw_endpoint == &Some(test_lnurl_withdraw_endpoint.to_string()))); assert!(matches!( &received[0].details, PaymentDetails::Ln {data: LnPaymentDetails {swap_info: swap, ..}} @@ -2705,6 +2787,7 @@ pub(crate) mod tests { .persister(persister) .node_api(node_api) .rest_client(rest_client) + .payment_store(Arc::new(MockPaymentStore::default())) .backup_transport(Arc::new(MockBackupTransport::new())) .build(None, None) .await?; diff --git a/libs/sdk-core/src/frb_generated.rs b/libs/sdk-core/src/frb_generated.rs index f51c7717f..ac5b385da 100644 --- a/libs/sdk-core/src/frb_generated.rs +++ b/libs/sdk-core/src/frb_generated.rs @@ -2298,12 +2298,12 @@ impl SseDecode for crate::breez_services::InvoicePaidDetails { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { let mut var_paymentHash = ::sse_decode(deserializer); - let mut var_bolt11 = ::sse_decode(deserializer); - let mut var_payment = >::sse_decode(deserializer); + let mut var_paymentPreimage = ::sse_decode(deserializer); + let mut var_amountMsat = ::sse_decode(deserializer); return crate::breez_services::InvoicePaidDetails { payment_hash: var_paymentHash, - bolt11: var_bolt11, - payment: var_payment, + payment_preimage: var_paymentPreimage, + amount_msat: var_amountMsat, }; } } @@ -2656,13 +2656,8 @@ impl SseDecode for crate::models::LnPaymentDetails { let mut var_paymentPreimage = ::sse_decode(deserializer); let mut var_keysend = ::sse_decode(deserializer); let mut var_bolt11 = ::sse_decode(deserializer); - let mut var_lnurlSuccessAction = - >::sse_decode(deserializer); - let mut var_lnurlPayDomain = >::sse_decode(deserializer); - let mut var_lnurlPayComment = >::sse_decode(deserializer); - let mut var_lnAddress = >::sse_decode(deserializer); - let mut var_lnurlMetadata = >::sse_decode(deserializer); - let mut var_lnurlWithdrawEndpoint = >::sse_decode(deserializer); + let mut var_description = >::sse_decode(deserializer); + let mut var_lnurlInfo = >::sse_decode(deserializer); let mut var_swapInfo = >::sse_decode(deserializer); let mut var_reverseSwapInfo = >::sse_decode(deserializer); @@ -2672,12 +2667,8 @@ impl SseDecode for crate::models::LnPaymentDetails { payment_preimage: var_paymentPreimage, keysend: var_keysend, bolt11: var_bolt11, - lnurl_success_action: var_lnurlSuccessAction, - lnurl_pay_domain: var_lnurlPayDomain, - lnurl_pay_comment: var_lnurlPayComment, - ln_address: var_lnAddress, - lnurl_metadata: var_lnurlMetadata, - lnurl_withdraw_endpoint: var_lnurlWithdrawEndpoint, + description: var_description, + lnurl_info: var_lnurlInfo, swap_info: var_swapInfo, reverse_swap_info: var_reverseSwapInfo, }; @@ -2727,6 +2718,26 @@ impl SseDecode for crate::binding::LnUrlErrorData { } } +impl SseDecode for crate::models::LnUrlInfo { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut tag_ = ::sse_decode(deserializer); + match tag_ { + 0 => { + let mut var_info = ::sse_decode(deserializer); + return crate::models::LnUrlInfo::Pay { info: var_info }; + } + 1 => { + let mut var_info = ::sse_decode(deserializer); + return crate::models::LnUrlInfo::Withdraw { info: var_info }; + } + _ => { + unimplemented!(""); + } + } + } +} + impl SseDecode for crate::binding::LnUrlPayErrorData { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { @@ -2739,6 +2750,23 @@ impl SseDecode for crate::binding::LnUrlPayErrorData { } } +impl SseDecode for crate::models::LnUrlPayInfo { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_target = ::sse_decode(deserializer); + let mut var_metadata = ::sse_decode(deserializer); + let mut var_comment = >::sse_decode(deserializer); + let mut var_successAction = + >::sse_decode(deserializer); + return crate::models::LnUrlPayInfo { + target: var_target, + metadata: var_metadata, + comment: var_comment, + success_action: var_successAction, + }; + } +} + impl SseDecode for crate::binding::LnUrlPayRequest { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { @@ -2821,6 +2849,38 @@ impl SseDecode for crate::lnurl::pay::LnUrlPaySuccessData { } } +impl SseDecode for crate::models::LnUrlPayTarget { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut tag_ = ::sse_decode(deserializer); + match tag_ { + 0 => { + let mut var_address = ::sse_decode(deserializer); + return crate::models::LnUrlPayTarget::LnAddress { + address: var_address, + }; + } + 1 => { + let mut var_domain = ::sse_decode(deserializer); + return crate::models::LnUrlPayTarget::Domain { domain: var_domain }; + } + _ => { + unimplemented!(""); + } + } + } +} + +impl SseDecode for crate::models::LnUrlWithdrawInfo { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + let mut var_endpoint = ::sse_decode(deserializer); + return crate::models::LnUrlWithdrawInfo { + endpoint: var_endpoint, + }; + } +} + impl SseDecode for crate::binding::LnUrlWithdrawRequest { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { @@ -3150,6 +3210,17 @@ impl SseDecode for Option { } } +impl SseDecode for Option { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { + if (::sse_decode(deserializer)) { + return Some(::sse_decode(deserializer)); + } else { + return None; + } + } +} + impl SseDecode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_decode(deserializer: &mut flutter_rust_bridge::for_generated::SseDeserializer) -> Self { @@ -3354,7 +3425,6 @@ impl SseDecode for crate::models::Payment { let mut var_feeMsat = ::sse_decode(deserializer); let mut var_status = ::sse_decode(deserializer); let mut var_error = >::sse_decode(deserializer); - let mut var_description = >::sse_decode(deserializer); let mut var_details = ::sse_decode(deserializer); let mut var_metadata = >::sse_decode(deserializer); return crate::models::Payment { @@ -3365,7 +3435,6 @@ impl SseDecode for crate::models::Payment { fee_msat: var_feeMsat, status: var_status, error: var_error, - description: var_description, details: var_details, metadata: var_metadata, }; @@ -3565,7 +3634,6 @@ impl SseDecode for crate::models::ReceivePaymentRequest { let mut var_preimage = >>::sse_decode(deserializer); let mut var_openingFeeParams = >::sse_decode(deserializer); - let mut var_useDescriptionHash = >::sse_decode(deserializer); let mut var_expiry = >::sse_decode(deserializer); let mut var_cltv = >::sse_decode(deserializer); return crate::models::ReceivePaymentRequest { @@ -3573,7 +3641,6 @@ impl SseDecode for crate::models::ReceivePaymentRequest { description: var_description, preimage: var_preimage, opening_fee_params: var_openingFeeParams, - use_description_hash: var_useDescriptionHash, expiry: var_expiry, cltv: var_cltv, }; @@ -4666,8 +4733,8 @@ impl flutter_rust_bridge::IntoDart for crate::breez_services::InvoicePaidDetails fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ self.payment_hash.into_into_dart().into_dart(), - self.bolt11.into_into_dart().into_dart(), - self.payment.into_into_dart().into_dart(), + self.payment_preimage.into_into_dart().into_dart(), + self.amount_msat.into_into_dart().into_dart(), ] .into_dart() } @@ -4820,12 +4887,8 @@ impl flutter_rust_bridge::IntoDart for crate::models::LnPaymentDetails { self.payment_preimage.into_into_dart().into_dart(), self.keysend.into_into_dart().into_dart(), self.bolt11.into_into_dart().into_dart(), - self.lnurl_success_action.into_into_dart().into_dart(), - self.lnurl_pay_domain.into_into_dart().into_dart(), - self.lnurl_pay_comment.into_into_dart().into_dart(), - self.ln_address.into_into_dart().into_dart(), - self.lnurl_metadata.into_into_dart().into_dart(), - self.lnurl_withdraw_endpoint.into_into_dart().into_dart(), + self.description.into_into_dart().into_dart(), + self.lnurl_info.into_into_dart().into_dart(), self.swap_info.into_into_dart().into_dart(), self.reverse_swap_info.into_into_dart().into_dart(), ] @@ -4909,6 +4972,28 @@ impl flutter_rust_bridge::IntoIntoDart flutter_rust_bridge::for_generated::DartAbi { + match self { + crate::models::LnUrlInfo::Pay { info } => { + [0.into_dart(), info.into_into_dart().into_dart()].into_dart() + } + crate::models::LnUrlInfo::Withdraw { info } => { + [1.into_dart(), info.into_into_dart().into_dart()].into_dart() + } + _ => { + unimplemented!(""); + } + } + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for crate::models::LnUrlInfo {} +impl flutter_rust_bridge::IntoIntoDart for crate::models::LnUrlInfo { + fn into_into_dart(self) -> crate::models::LnUrlInfo { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ @@ -4930,6 +5015,26 @@ impl flutter_rust_bridge::IntoIntoDart flutter_rust_bridge::for_generated::DartAbi { + [ + self.target.into_into_dart().into_dart(), + self.metadata.into_into_dart().into_dart(), + self.comment.into_into_dart().into_dart(), + self.success_action.into_into_dart().into_dart(), + ] + .into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for crate::models::LnUrlPayInfo {} +impl flutter_rust_bridge::IntoIntoDart + for crate::models::LnUrlPayInfo +{ + fn into_into_dart(self) -> crate::models::LnUrlPayInfo { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ @@ -5036,6 +5141,47 @@ impl flutter_rust_bridge::IntoIntoDart } } // Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::models::LnUrlPayTarget { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + match self { + crate::models::LnUrlPayTarget::LnAddress { address } => { + [0.into_dart(), address.into_into_dart().into_dart()].into_dart() + } + crate::models::LnUrlPayTarget::Domain { domain } => { + [1.into_dart(), domain.into_into_dart().into_dart()].into_dart() + } + _ => { + unimplemented!(""); + } + } + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive for crate::models::LnUrlPayTarget {} +impl flutter_rust_bridge::IntoIntoDart + for crate::models::LnUrlPayTarget +{ + fn into_into_dart(self) -> crate::models::LnUrlPayTarget { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs +impl flutter_rust_bridge::IntoDart for crate::models::LnUrlWithdrawInfo { + fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { + [self.endpoint.into_into_dart().into_dart()].into_dart() + } +} +impl flutter_rust_bridge::for_generated::IntoDartExceptPrimitive + for crate::models::LnUrlWithdrawInfo +{ +} +impl flutter_rust_bridge::IntoIntoDart + for crate::models::LnUrlWithdrawInfo +{ + fn into_into_dart(self) -> crate::models::LnUrlWithdrawInfo { + self + } +} +// Codec=Dco (DartCObject based), see doc to use other codecs impl flutter_rust_bridge::IntoDart for FrbWrapper { fn into_dart(self) -> flutter_rust_bridge::for_generated::DartAbi { [ @@ -5460,7 +5606,6 @@ impl flutter_rust_bridge::IntoDart for crate::models::Payment { self.fee_msat.into_into_dart().into_dart(), self.status.into_into_dart().into_dart(), self.error.into_into_dart().into_dart(), - self.description.into_into_dart().into_dart(), self.details.into_into_dart().into_dart(), self.metadata.into_into_dart().into_dart(), ] @@ -5755,7 +5900,6 @@ impl flutter_rust_bridge::IntoDart for crate::models::ReceivePaymentRequest { self.description.into_into_dart().into_dart(), self.preimage.into_into_dart().into_dart(), self.opening_fee_params.into_into_dart().into_dart(), - self.use_description_hash.into_into_dart().into_dart(), self.expiry.into_into_dart().into_dart(), self.cltv.into_into_dart().into_dart(), ] @@ -6826,8 +6970,8 @@ impl SseEncode for crate::breez_services::InvoicePaidDetails { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { ::sse_encode(self.payment_hash, serializer); - ::sse_encode(self.bolt11, serializer); - >::sse_encode(self.payment, serializer); + ::sse_encode(self.payment_preimage, serializer); + ::sse_encode(self.amount_msat, serializer); } } @@ -7092,15 +7236,8 @@ impl SseEncode for crate::models::LnPaymentDetails { ::sse_encode(self.payment_preimage, serializer); ::sse_encode(self.keysend, serializer); ::sse_encode(self.bolt11, serializer); - >::sse_encode( - self.lnurl_success_action, - serializer, - ); - >::sse_encode(self.lnurl_pay_domain, serializer); - >::sse_encode(self.lnurl_pay_comment, serializer); - >::sse_encode(self.ln_address, serializer); - >::sse_encode(self.lnurl_metadata, serializer); - >::sse_encode(self.lnurl_withdraw_endpoint, serializer); + >::sse_encode(self.description, serializer); + >::sse_encode(self.lnurl_info, serializer); >::sse_encode(self.swap_info, serializer); >::sse_encode(self.reverse_swap_info, serializer); } @@ -7141,6 +7278,25 @@ impl SseEncode for crate::binding::LnUrlErrorData { } } +impl SseEncode for crate::models::LnUrlInfo { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + match self { + crate::models::LnUrlInfo::Pay { info } => { + ::sse_encode(0, serializer); + ::sse_encode(info, serializer); + } + crate::models::LnUrlInfo::Withdraw { info } => { + ::sse_encode(1, serializer); + ::sse_encode(info, serializer); + } + _ => { + unimplemented!(""); + } + } + } +} + impl SseEncode for crate::binding::LnUrlPayErrorData { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { @@ -7149,6 +7305,19 @@ impl SseEncode for crate::binding::LnUrlPayErrorData { } } +impl SseEncode for crate::models::LnUrlPayInfo { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.target, serializer); + ::sse_encode(self.metadata, serializer); + >::sse_encode(self.comment, serializer); + >::sse_encode( + self.success_action, + serializer, + ); + } +} + impl SseEncode for crate::binding::LnUrlPayRequest { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { @@ -7209,6 +7378,32 @@ impl SseEncode for crate::lnurl::pay::LnUrlPaySuccessData { } } +impl SseEncode for crate::models::LnUrlPayTarget { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + match self { + crate::models::LnUrlPayTarget::LnAddress { address } => { + ::sse_encode(0, serializer); + ::sse_encode(address, serializer); + } + crate::models::LnUrlPayTarget::Domain { domain } => { + ::sse_encode(1, serializer); + ::sse_encode(domain, serializer); + } + _ => { + unimplemented!(""); + } + } + } +} + +impl SseEncode for crate::models::LnUrlWithdrawInfo { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.endpoint, serializer); + } +} + impl SseEncode for crate::binding::LnUrlWithdrawRequest { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { @@ -7447,6 +7642,16 @@ impl SseEncode for Option { } } +impl SseEncode for Option { + // Codec=Sse (Serialization based), see doc to use other codecs + fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { + ::sse_encode(self.is_some(), serializer); + if let Some(value) = self { + ::sse_encode(value, serializer); + } + } +} + impl SseEncode for Option { // Codec=Sse (Serialization based), see doc to use other codecs fn sse_encode(self, serializer: &mut flutter_rust_bridge::for_generated::SseSerializer) { @@ -7622,7 +7827,6 @@ impl SseEncode for crate::models::Payment { ::sse_encode(self.fee_msat, serializer); ::sse_encode(self.status, serializer); >::sse_encode(self.error, serializer); - >::sse_encode(self.description, serializer); ::sse_encode(self.details, serializer); >::sse_encode(self.metadata, serializer); } @@ -7785,7 +7989,6 @@ impl SseEncode for crate::models::ReceivePaymentRequest { ::sse_encode(self.description, serializer); >>::sse_encode(self.preimage, serializer); >::sse_encode(self.opening_fee_params, serializer); - >::sse_encode(self.use_description_hash, serializer); >::sse_encode(self.expiry, serializer); >::sse_encode(self.cltv, serializer); } @@ -8475,6 +8678,13 @@ mod io { CstDecode::::cst_decode(*wrap).into() } } + impl CstDecode for *mut wire_cst_ln_url_info { + // Codec=Cst (C-struct based), see doc to use other codecs + fn cst_decode(self) -> crate::models::LnUrlInfo { + let wrap = unsafe { flutter_rust_bridge::for_generated::box_from_leak_ptr(self) }; + CstDecode::::cst_decode(*wrap).into() + } + } impl CstDecode for *mut wire_cst_ln_url_pay_error_data { // Codec=Cst (C-struct based), see doc to use other codecs fn cst_decode(self) -> crate::binding::LnUrlPayErrorData { @@ -8482,6 +8692,13 @@ mod io { CstDecode::::cst_decode(*wrap).into() } } + impl CstDecode for *mut wire_cst_ln_url_pay_info { + // Codec=Cst (C-struct based), see doc to use other codecs + fn cst_decode(self) -> crate::models::LnUrlPayInfo { + let wrap = unsafe { flutter_rust_bridge::for_generated::box_from_leak_ptr(self) }; + CstDecode::::cst_decode(*wrap).into() + } + } impl CstDecode for *mut wire_cst_ln_url_pay_request { // Codec=Cst (C-struct based), see doc to use other codecs fn cst_decode(self) -> crate::binding::LnUrlPayRequest { @@ -8503,6 +8720,13 @@ mod io { CstDecode::::cst_decode(*wrap).into() } } + impl CstDecode for *mut wire_cst_ln_url_withdraw_info { + // Codec=Cst (C-struct based), see doc to use other codecs + fn cst_decode(self) -> crate::models::LnUrlWithdrawInfo { + let wrap = unsafe { flutter_rust_bridge::for_generated::box_from_leak_ptr(self) }; + CstDecode::::cst_decode(*wrap).into() + } + } impl CstDecode for *mut wire_cst_ln_url_withdraw_request { // Codec=Cst (C-struct based), see doc to use other codecs fn cst_decode(self) -> crate::binding::LnUrlWithdrawRequest { @@ -8967,8 +9191,8 @@ mod io { fn cst_decode(self) -> crate::breez_services::InvoicePaidDetails { crate::breez_services::InvoicePaidDetails { payment_hash: self.payment_hash.cst_decode(), - bolt11: self.bolt11.cst_decode(), - payment: self.payment.cst_decode(), + payment_preimage: self.payment_preimage.cst_decode(), + amount_msat: self.amount_msat.cst_decode(), } } } @@ -9242,12 +9466,8 @@ mod io { payment_preimage: self.payment_preimage.cst_decode(), keysend: self.keysend.cst_decode(), bolt11: self.bolt11.cst_decode(), - lnurl_success_action: self.lnurl_success_action.cst_decode(), - lnurl_pay_domain: self.lnurl_pay_domain.cst_decode(), - lnurl_pay_comment: self.lnurl_pay_comment.cst_decode(), - ln_address: self.ln_address.cst_decode(), - lnurl_metadata: self.lnurl_metadata.cst_decode(), - lnurl_withdraw_endpoint: self.lnurl_withdraw_endpoint.cst_decode(), + description: self.description.cst_decode(), + lnurl_info: self.lnurl_info.cst_decode(), swap_info: self.swap_info.cst_decode(), reverse_swap_info: self.reverse_swap_info.cst_decode(), } @@ -9287,6 +9507,26 @@ mod io { } } } + impl CstDecode for wire_cst_ln_url_info { + // Codec=Cst (C-struct based), see doc to use other codecs + fn cst_decode(self) -> crate::models::LnUrlInfo { + match self.tag { + 0 => { + let ans = unsafe { self.kind.Pay }; + crate::models::LnUrlInfo::Pay { + info: ans.info.cst_decode(), + } + } + 1 => { + let ans = unsafe { self.kind.Withdraw }; + crate::models::LnUrlInfo::Withdraw { + info: ans.info.cst_decode(), + } + } + _ => unreachable!(), + } + } + } impl CstDecode for wire_cst_ln_url_pay_error_data { // Codec=Cst (C-struct based), see doc to use other codecs fn cst_decode(self) -> crate::binding::LnUrlPayErrorData { @@ -9296,6 +9536,17 @@ mod io { } } } + impl CstDecode for wire_cst_ln_url_pay_info { + // Codec=Cst (C-struct based), see doc to use other codecs + fn cst_decode(self) -> crate::models::LnUrlPayInfo { + crate::models::LnUrlPayInfo { + target: self.target.cst_decode(), + metadata: self.metadata.cst_decode(), + comment: self.comment.cst_decode(), + success_action: self.success_action.cst_decode(), + } + } + } impl CstDecode for wire_cst_ln_url_pay_request { // Codec=Cst (C-struct based), see doc to use other codecs fn cst_decode(self) -> crate::binding::LnUrlPayRequest { @@ -9359,6 +9610,34 @@ mod io { } } } + impl CstDecode for wire_cst_ln_url_pay_target { + // Codec=Cst (C-struct based), see doc to use other codecs + fn cst_decode(self) -> crate::models::LnUrlPayTarget { + match self.tag { + 0 => { + let ans = unsafe { self.kind.LnAddress }; + crate::models::LnUrlPayTarget::LnAddress { + address: ans.address.cst_decode(), + } + } + 1 => { + let ans = unsafe { self.kind.Domain }; + crate::models::LnUrlPayTarget::Domain { + domain: ans.domain.cst_decode(), + } + } + _ => unreachable!(), + } + } + } + impl CstDecode for wire_cst_ln_url_withdraw_info { + // Codec=Cst (C-struct based), see doc to use other codecs + fn cst_decode(self) -> crate::models::LnUrlWithdrawInfo { + crate::models::LnUrlWithdrawInfo { + endpoint: self.endpoint.cst_decode(), + } + } + } impl CstDecode for wire_cst_ln_url_withdraw_request { // Codec=Cst (C-struct based), see doc to use other codecs fn cst_decode(self) -> crate::binding::LnUrlWithdrawRequest { @@ -9579,7 +9858,6 @@ mod io { fee_msat: self.fee_msat.cst_decode(), status: self.status.cst_decode(), error: self.error.cst_decode(), - description: self.description.cst_decode(), details: self.details.cst_decode(), metadata: self.metadata.cst_decode(), } @@ -9710,7 +9988,6 @@ mod io { description: self.description.cst_decode(), preimage: self.preimage.cst_decode(), opening_fee_params: self.opening_fee_params.cst_decode(), - use_description_hash: self.use_description_hash.cst_decode(), expiry: self.expiry.cst_decode(), cltv: self.cltv.cst_decode(), } @@ -10298,8 +10575,8 @@ mod io { fn new_with_null_ptr() -> Self { Self { payment_hash: core::ptr::null_mut(), - bolt11: core::ptr::null_mut(), - payment: core::ptr::null_mut(), + payment_preimage: core::ptr::null_mut(), + amount_msat: Default::default(), } } } @@ -10404,12 +10681,8 @@ mod io { payment_preimage: core::ptr::null_mut(), keysend: Default::default(), bolt11: core::ptr::null_mut(), - lnurl_success_action: core::ptr::null_mut(), - lnurl_pay_domain: core::ptr::null_mut(), - lnurl_pay_comment: core::ptr::null_mut(), - ln_address: core::ptr::null_mut(), - lnurl_metadata: core::ptr::null_mut(), - lnurl_withdraw_endpoint: core::ptr::null_mut(), + description: core::ptr::null_mut(), + lnurl_info: core::ptr::null_mut(), swap_info: core::ptr::null_mut(), reverse_swap_info: core::ptr::null_mut(), } @@ -10460,6 +10733,19 @@ mod io { Self::new_with_null_ptr() } } + impl NewWithNullPtr for wire_cst_ln_url_info { + fn new_with_null_ptr() -> Self { + Self { + tag: -1, + kind: LnUrlInfoKind { nil__: () }, + } + } + } + impl Default for wire_cst_ln_url_info { + fn default() -> Self { + Self::new_with_null_ptr() + } + } impl NewWithNullPtr for wire_cst_ln_url_pay_error_data { fn new_with_null_ptr() -> Self { Self { @@ -10473,6 +10759,21 @@ mod io { Self::new_with_null_ptr() } } + impl NewWithNullPtr for wire_cst_ln_url_pay_info { + fn new_with_null_ptr() -> Self { + Self { + target: Default::default(), + metadata: core::ptr::null_mut(), + comment: core::ptr::null_mut(), + success_action: core::ptr::null_mut(), + } + } + } + impl Default for wire_cst_ln_url_pay_info { + fn default() -> Self { + Self::new_with_null_ptr() + } + } impl NewWithNullPtr for wire_cst_ln_url_pay_request { fn new_with_null_ptr() -> Self { Self { @@ -10535,6 +10836,31 @@ mod io { Self::new_with_null_ptr() } } + impl NewWithNullPtr for wire_cst_ln_url_pay_target { + fn new_with_null_ptr() -> Self { + Self { + tag: -1, + kind: LnUrlPayTargetKind { nil__: () }, + } + } + } + impl Default for wire_cst_ln_url_pay_target { + fn default() -> Self { + Self::new_with_null_ptr() + } + } + impl NewWithNullPtr for wire_cst_ln_url_withdraw_info { + fn new_with_null_ptr() -> Self { + Self { + endpoint: core::ptr::null_mut(), + } + } + } + impl Default for wire_cst_ln_url_withdraw_info { + fn default() -> Self { + Self::new_with_null_ptr() + } + } impl NewWithNullPtr for wire_cst_ln_url_withdraw_request { fn new_with_null_ptr() -> Self { Self { @@ -10805,7 +11131,6 @@ mod io { fee_msat: Default::default(), status: Default::default(), error: core::ptr::null_mut(), - description: core::ptr::null_mut(), details: Default::default(), metadata: core::ptr::null_mut(), } @@ -10961,7 +11286,6 @@ mod io { description: core::ptr::null_mut(), preimage: core::ptr::null_mut(), opening_fee_params: core::ptr::null_mut(), - use_description_hash: core::ptr::null_mut(), expiry: core::ptr::null_mut(), cltv: core::ptr::null_mut(), } @@ -11948,6 +12272,14 @@ mod io { ) } + #[unsafe(no_mangle)] + pub extern "C" fn frbgen_breez_sdk_cst_new_box_autoadd_ln_url_info() -> *mut wire_cst_ln_url_info + { + flutter_rust_bridge::for_generated::new_leak_box_ptr( + wire_cst_ln_url_info::new_with_null_ptr(), + ) + } + #[unsafe(no_mangle)] pub extern "C" fn frbgen_breez_sdk_cst_new_box_autoadd_ln_url_pay_error_data( ) -> *mut wire_cst_ln_url_pay_error_data { @@ -11956,6 +12288,14 @@ mod io { ) } + #[unsafe(no_mangle)] + pub extern "C" fn frbgen_breez_sdk_cst_new_box_autoadd_ln_url_pay_info( + ) -> *mut wire_cst_ln_url_pay_info { + flutter_rust_bridge::for_generated::new_leak_box_ptr( + wire_cst_ln_url_pay_info::new_with_null_ptr(), + ) + } + #[unsafe(no_mangle)] pub extern "C" fn frbgen_breez_sdk_cst_new_box_autoadd_ln_url_pay_request( ) -> *mut wire_cst_ln_url_pay_request { @@ -11980,6 +12320,14 @@ mod io { ) } + #[unsafe(no_mangle)] + pub extern "C" fn frbgen_breez_sdk_cst_new_box_autoadd_ln_url_withdraw_info( + ) -> *mut wire_cst_ln_url_withdraw_info { + flutter_rust_bridge::for_generated::new_leak_box_ptr( + wire_cst_ln_url_withdraw_info::new_with_null_ptr(), + ) + } + #[unsafe(no_mangle)] pub extern "C" fn frbgen_breez_sdk_cst_new_box_autoadd_ln_url_withdraw_request( ) -> *mut wire_cst_ln_url_withdraw_request { @@ -12745,8 +13093,8 @@ mod io { #[derive(Clone, Copy)] pub struct wire_cst_invoice_paid_details { payment_hash: *mut wire_cst_list_prim_u_8_strict, - bolt11: *mut wire_cst_list_prim_u_8_strict, - payment: *mut wire_cst_payment, + payment_preimage: *mut wire_cst_list_prim_u_8_strict, + amount_msat: u64, } #[repr(C)] #[derive(Clone, Copy)] @@ -12923,12 +13271,8 @@ mod io { payment_preimage: *mut wire_cst_list_prim_u_8_strict, keysend: bool, bolt11: *mut wire_cst_list_prim_u_8_strict, - lnurl_success_action: *mut wire_cst_success_action_processed, - lnurl_pay_domain: *mut wire_cst_list_prim_u_8_strict, - lnurl_pay_comment: *mut wire_cst_list_prim_u_8_strict, - ln_address: *mut wire_cst_list_prim_u_8_strict, - lnurl_metadata: *mut wire_cst_list_prim_u_8_strict, - lnurl_withdraw_endpoint: *mut wire_cst_list_prim_u_8_strict, + description: *mut wire_cst_list_prim_u_8_strict, + lnurl_info: *mut wire_cst_ln_url_info, swap_info: *mut wire_cst_swap_info, reverse_swap_info: *mut wire_cst_reverse_swap_info, } @@ -12964,12 +13308,43 @@ mod io { } #[repr(C)] #[derive(Clone, Copy)] + pub struct wire_cst_ln_url_info { + tag: i32, + kind: LnUrlInfoKind, + } + #[repr(C)] + #[derive(Clone, Copy)] + pub union LnUrlInfoKind { + Pay: wire_cst_LnUrlInfo_Pay, + Withdraw: wire_cst_LnUrlInfo_Withdraw, + nil__: (), + } + #[repr(C)] + #[derive(Clone, Copy)] + pub struct wire_cst_LnUrlInfo_Pay { + info: *mut wire_cst_ln_url_pay_info, + } + #[repr(C)] + #[derive(Clone, Copy)] + pub struct wire_cst_LnUrlInfo_Withdraw { + info: *mut wire_cst_ln_url_withdraw_info, + } + #[repr(C)] + #[derive(Clone, Copy)] pub struct wire_cst_ln_url_pay_error_data { payment_hash: *mut wire_cst_list_prim_u_8_strict, reason: *mut wire_cst_list_prim_u_8_strict, } #[repr(C)] #[derive(Clone, Copy)] + pub struct wire_cst_ln_url_pay_info { + target: wire_cst_ln_url_pay_target, + metadata: *mut wire_cst_list_prim_u_8_strict, + comment: *mut wire_cst_list_prim_u_8_strict, + success_action: *mut wire_cst_success_action_processed, + } + #[repr(C)] + #[derive(Clone, Copy)] pub struct wire_cst_ln_url_pay_request { data: wire_cst_ln_url_pay_request_data, amount_msat: u64, @@ -13027,6 +13402,34 @@ mod io { } #[repr(C)] #[derive(Clone, Copy)] + pub struct wire_cst_ln_url_pay_target { + tag: i32, + kind: LnUrlPayTargetKind, + } + #[repr(C)] + #[derive(Clone, Copy)] + pub union LnUrlPayTargetKind { + LnAddress: wire_cst_LnUrlPayTarget_LnAddress, + Domain: wire_cst_LnUrlPayTarget_Domain, + nil__: (), + } + #[repr(C)] + #[derive(Clone, Copy)] + pub struct wire_cst_LnUrlPayTarget_LnAddress { + address: *mut wire_cst_list_prim_u_8_strict, + } + #[repr(C)] + #[derive(Clone, Copy)] + pub struct wire_cst_LnUrlPayTarget_Domain { + domain: *mut wire_cst_list_prim_u_8_strict, + } + #[repr(C)] + #[derive(Clone, Copy)] + pub struct wire_cst_ln_url_withdraw_info { + endpoint: *mut wire_cst_list_prim_u_8_strict, + } + #[repr(C)] + #[derive(Clone, Copy)] pub struct wire_cst_ln_url_withdraw_request { data: wire_cst_ln_url_withdraw_request_data, amount_msat: u64, @@ -13192,7 +13595,6 @@ mod io { fee_msat: u64, status: i32, error: *mut wire_cst_list_prim_u_8_strict, - description: *mut wire_cst_list_prim_u_8_strict, details: wire_cst_payment_details, metadata: *mut wire_cst_list_prim_u_8_strict, } @@ -13288,7 +13690,6 @@ mod io { description: *mut wire_cst_list_prim_u_8_strict, preimage: *mut wire_cst_list_prim_u_8_strict, opening_fee_params: *mut wire_cst_opening_fee_params, - use_description_hash: *mut bool, expiry: *mut u32, cltv: *mut u32, } diff --git a/libs/sdk-core/src/ldk/event_handling.rs b/libs/sdk-core/src/ldk/event_handling.rs index 9ac8e54d4..444863cf1 100644 --- a/libs/sdk-core/src/ldk/event_handling.rs +++ b/libs/sdk-core/src/ldk/event_handling.rs @@ -35,33 +35,23 @@ pub async fn start_event_handling( payment_hash, amount_msat, .. - } => { - match store.load_preimage(&payment_hash) { - Ok(preimage) => { - let bolt11 = match store.load_bolt11(&payment_hash) { - Ok(bolt11) => bolt11, - Err(err) => { - error!("Failed to read bolt11 for payment with id={payment_id:?}: {err}"); - None - } - }; - let payment = IncomingPayment { - payment_hash: payment_hash.0.to_vec(), - preimage: preimage.0.to_vec(), - amount_msat, - bolt11: bolt11.unwrap_or_default(), - }; - if let Err(e) = incoming_payments_tx.send(payment) { - warn!("Failed to send payment to incoming_payments_tx: {e}"); - } + } => match store.load_preimage(&payment_hash) { + Ok(preimage) => { + let payment = IncomingPayment { + payment_hash: payment_hash.0.to_vec(), + preimage: preimage.0.to_vec(), + amount_msat, + }; + if let Err(e) = incoming_payments_tx.send(payment) { + warn!("Failed to send payment to incoming_payments_tx: {e}"); } - Err(err) => { - error!( + } + Err(err) => { + error!( "Payment received but failed to read preimage for payment with id={payment_id:?}: {err}" ); - } } - } + }, Event::PaymentSuccessful { .. } => (), Event::PaymentFailed { .. } => (), Event::PaymentClaimable { diff --git a/libs/sdk-core/src/ldk/node_api.rs b/libs/sdk-core/src/ldk/node_api.rs index 00cd2d387..d03406f23 100644 --- a/libs/sdk-core/src/ldk/node_api.rs +++ b/libs/sdk-core/src/ldk/node_api.rs @@ -5,8 +5,6 @@ use std::sync::Arc; use std::time::{Duration, SystemTime}; use chrono::{DateTime, Utc}; -use ldk_node::bitcoin::hashes::sha256::Hash as Sha256; -use ldk_node::bitcoin::hashes::Hash; use ldk_node::bitcoin::secp256k1::PublicKey; use ldk_node::lightning::ln::msgs::SocketAddress; use ldk_node::lightning::routing::router::{ @@ -33,11 +31,11 @@ use crate::ldk::node_state::convert_payment; use crate::ldk::restore_state::RestoreStateTracker; use crate::ldk::store::{KVStore, Store}; use crate::ldk::store_builder::{build_mirroring_store, build_vss_store}; -use crate::ldk::utils::Hex; use crate::models::{Config, LspAPI, NodeState, OpeningFeeParams, OpeningFeeParamsMenu}; use crate::node_api::{ CreateInvoiceRequest, FetchBolt11Result, IncomingPayment, NodeAPI, NodeError, NodeResult, }; +use crate::persist::payment_store::PaymentStore; use crate::{ CustomMessage, LspInformation, MaxChannelAmount, Payment, PaymentResponse, PrepareRedeemOnchainFundsRequest, PrepareRedeemOnchainFundsResponse, RouteHintHop, TlvEntry, @@ -129,6 +127,10 @@ impl Ldk { remote_lock_shutdown_tx, }) } + + pub fn get_payment_store(&self) -> Arc { + Arc::new(self.store.clone()) + } } #[tonic::async_trait] @@ -151,15 +153,10 @@ impl NodeAPI for Ldk { } async fn create_invoice(&self, req: CreateInvoiceRequest) -> NodeResult { - let description = if req.use_description_hash.unwrap_or(false) { - let hash = Sha256::hash(req.description.as_bytes()); - Bolt11InvoiceDescription::Hash(ldk_node::lightning_invoice::Sha256(hash)) - } else { - let description = Description::new(req.description).map_err(|e| { - NodeError::Generic(format!("Failed to create invoice description: {e}")) - })?; - Bolt11InvoiceDescription::Direct(description) - }; + let description = Description::new(req.description).map_err(|e| { + NodeError::Generic(format!("Failed to create invoice description: {e}")) + })?; + let description = Bolt11InvoiceDescription::Direct(description); let preimage = match req.preimage.map(|p| p.as_slice().try_into()) { Some(Ok(preimage)) => Some(PaymentPreimage(preimage)), @@ -186,10 +183,7 @@ impl NodeAPI for Ldk { payments.receive_for_hash(req.amount_msat, &description, req.expiry, payment_hash) } }?; - let bolt11 = invoice.to_string(); - self.store - .store_bolt11(&invoice.payment_hash().to_hex(), bolt11.clone())?; - Ok(bolt11) + Ok(invoice.to_string()) } async fn fetch_bolt11(&self, _payment_hash: Vec) -> NodeResult> { @@ -205,11 +199,10 @@ impl NodeAPI for Ldk { } async fn list_payments(&self) -> NodeResult> { - let local_node_id = self.node.node_id(); self.node .list_payments() .into_iter() - .map(|p| convert_payment(p, &local_node_id, &self.store)) + .map(convert_payment) .collect::, _>>() } @@ -224,16 +217,13 @@ impl NodeAPI for Ldk { max_channel_saturation_power_of_half: 2, }); - self.store - .store_bolt11(&invoice.payment_hash().to_hex(), bolt11)?; - let payment_id = match amount_msat { Some(amount_msat) => payments.send_using_amount(&invoice, amount_msat, params), None => payments.send(&invoice, params), }?; let payment = wait_for_payment_success(&self.node, events, payment_id).await?; - convert_payment(payment, &self.node.node_id(), &self.store) + convert_payment(payment) } async fn send_spontaneous_payment( @@ -262,7 +252,7 @@ impl NodeAPI for Ldk { }?; let payment = wait_for_payment_success(&self.node, events, payment_id).await?; - convert_payment(payment, &self.node.node_id(), &self.store) + convert_payment(payment) } async fn node_id(&self) -> NodeResult { diff --git a/libs/sdk-core/src/ldk/node_state.rs b/libs/sdk-core/src/ldk/node_state.rs index 54031d38b..e88027ef6 100644 --- a/libs/sdk-core/src/ldk/node_state.rs +++ b/libs/sdk-core/src/ldk/node_state.rs @@ -1,12 +1,7 @@ -use core::str::FromStr; - -use ldk_node::bitcoin::secp256k1::PublicKey; -use ldk_node::lightning_invoice::Bolt11Invoice; use ldk_node::lightning_types::payment::{PaymentHash, PaymentPreimage}; use ldk_node::LightningBalance::ClaimableOnChannelClose; use ldk_node::{Node, PendingSweepBalance}; -use crate::ldk::store::Store; use crate::ldk::utils::Hex; use crate::node_api::NodeError; use crate::{LnPaymentDetails, NodeState, Payment, PaymentDetails, PaymentStatus, PaymentType}; @@ -71,11 +66,7 @@ impl From<&Node> for NodeState { } } -pub fn convert_payment( - payment: ldk_node::payment::PaymentDetails, - local_node_id: &PublicKey, - store: &Store, -) -> Result { +pub fn convert_payment(payment: ldk_node::payment::PaymentDetails) -> Result { let lsp_fee_msat = match payment.kind { ldk_node::payment::PaymentKind::Bolt11Jit { counterparty_skimmed_fee_msat: Some(lsp_fee_msat), @@ -83,21 +74,8 @@ pub fn convert_payment( } => lsp_fee_msat, _ => 0, }; - let bolt11 = match get_payment_hash(&payment) { - Some(payment_hash) => store.load_bolt11(payment_hash)?, - None => None, - }; - let (description, destination_pubkey) = match &bolt11 { - Some(bolt11) => { - let invoice = Bolt11Invoice::from_str(bolt11)?; - let description = invoice.description().to_string(); - let destination_pubkey = invoice.get_payee_pub_key().to_string(); - (Some(description), destination_pubkey) - } - None => (None, String::new()), - }; - let details = to_payment_details(&payment, local_node_id, bolt11, destination_pubkey)?; + let details = to_payment_details(&payment)?; Ok(Payment { id: payment.id.to_hex(), payment_type: payment.direction.into(), @@ -106,7 +84,6 @@ pub fn convert_payment( fee_msat: payment.fee_paid_msat.unwrap_or(lsp_fee_msat), status: payment.status.into(), error: None, - description, details, metadata: None, }) @@ -114,25 +91,18 @@ pub fn convert_payment( fn to_payment_details( payment: &ldk_node::payment::PaymentDetails, - local_node_id: &PublicKey, - bolt11: Option, - destination_pubkey: String, ) -> Result { - let destination_pubkey = match payment.direction { - ldk_node::payment::PaymentDirection::Inbound => local_node_id.to_string(), - ldk_node::payment::PaymentDirection::Outbound => destination_pubkey, - }; match &payment.kind { ldk_node::payment::PaymentKind::Bolt11 { hash, preimage, .. } => Ok(PaymentDetails::Ln { - data: ln_payment_details(hash, preimage, destination_pubkey, false, bolt11), + data: ln_payment_details(hash, preimage, false), }), ldk_node::payment::PaymentKind::Bolt11Jit { hash, preimage, .. } => { Ok(PaymentDetails::Ln { - data: ln_payment_details(hash, preimage, destination_pubkey, false, bolt11), + data: ln_payment_details(hash, preimage, false), }) } ldk_node::payment::PaymentKind::Spontaneous { hash, preimage } => Ok(PaymentDetails::Ln { - data: ln_payment_details(hash, preimage, destination_pubkey, true, bolt11), + data: ln_payment_details(hash, preimage, true), }), other => Err(NodeError::Generic(format!( "Unsupported payment kind: {other:?}" @@ -143,16 +113,12 @@ fn to_payment_details( fn ln_payment_details( hash: &PaymentHash, preimage: &Option, - destination_pubkey: String, keysend: bool, - bolt11: Option, ) -> LnPaymentDetails { LnPaymentDetails { payment_hash: hash.to_hex(), - destination_pubkey, payment_preimage: preimage.as_ref().map(Hex::to_hex).unwrap_or_default(), keysend, - bolt11: bolt11.unwrap_or_default(), ..Default::default() } } @@ -189,12 +155,3 @@ fn get_balance(balance: &PendingSweepBalance) -> u64 { } => *amount_satoshis, } } - -fn get_payment_hash(payment: &ldk_node::payment::PaymentDetails) -> Option<&PaymentHash> { - match &payment.kind { - ldk_node::payment::PaymentKind::Bolt11 { hash, .. } - | ldk_node::payment::PaymentKind::Bolt11Jit { hash, .. } - | ldk_node::payment::PaymentKind::Spontaneous { hash, .. } => Some(hash), - _ => None, - } -} diff --git a/libs/sdk-core/src/ldk/store/kv_store.rs b/libs/sdk-core/src/ldk/store/kv_store.rs index 8eeb26282..e63095df1 100644 --- a/libs/sdk-core/src/ldk/store/kv_store.rs +++ b/libs/sdk-core/src/ldk/store/kv_store.rs @@ -1,16 +1,21 @@ use core::convert::TryInto; +use std::collections::HashMap; use std::sync::Arc; use bitcoin::io::{Error, ErrorKind}; -use ldk_node::lightning::util::persist::KVStoreSync; +use ldk_node::lightning::util::persist::{KVStore as KVStoreAsync, KVStoreSync}; use ldk_node::lightning_types::payment::{PaymentHash, PaymentPreimage}; use ldk_node::DynStore; +use crate::error::{SdkError, SdkResult}; use crate::ldk::utils::Hex; +use crate::persist::payment_store::PaymentStore; +use crate::{LnPaymentInfo, LnUrlInfo}; pub(crate) const BREEZ_NS: &str = "breez"; -pub(crate) const BOLT11_NS: &str = "bolt11"; pub(crate) const PREIMAGES_NS: &str = "preimages"; +pub(crate) const LN_INFOS_NS: &str = "ln_infos"; +pub(crate) const LNURL_INFOS_NS: &str = "lnurl_infos"; pub(crate) type KVStore = Arc; @@ -50,22 +55,75 @@ impl Store { Err(err) => Err(Error::new(ErrorKind::InvalidData, err)), } } +} - pub(crate) fn store_bolt11(&self, hash: &str, bolt11: String) -> Result<(), Error> { - KVStoreSync::write( +#[tonic::async_trait] +impl PaymentStore for Store { + async fn set_ln_info(&self, payment_id: &str, info: &LnPaymentInfo) -> SdkResult<()> { + let info = serde_json::to_vec(info)?; + KVStoreAsync::write( + self.kv_store.as_ref(), + BREEZ_NS, + LN_INFOS_NS, + payment_id, + info, + ) + .await + .map_err(Into::into) + } + + async fn set_lnurl_info(&self, payment_id: &str, info: &LnUrlInfo) -> SdkResult<()> { + let info = serde_json::to_vec(info)?; + KVStoreAsync::write( self.kv_store.as_ref(), BREEZ_NS, - BOLT11_NS, - hash, - bolt11.into_bytes(), + LNURL_INFOS_NS, + payment_id, + info, ) + .await + .map_err(Into::into) } - pub(crate) fn load_bolt11(&self, hash: &PaymentHash) -> Result, Error> { - match KVStoreSync::read(self.kv_store.as_ref(), BREEZ_NS, BOLT11_NS, &hash.to_hex()) { - Ok(bolt11) => Ok(Some(String::from_utf8_lossy(&bolt11).into_owned())), - Err(e) if e.kind() == ErrorKind::NotFound => Ok(None), - Err(e) => Err(e), + async fn get_ln_info(&self, payment_ids: &[&str]) -> SdkResult> { + let mut infos = HashMap::new(); + for payment_id in payment_ids { + match KVStoreAsync::read(self.kv_store.as_ref(), BREEZ_NS, LN_INFOS_NS, payment_id) + .await + { + Ok(raw) => { + let info = serde_json::from_slice::(&raw)?; + infos.insert((*payment_id).to_string(), info); + } + Err(err) if err.kind() == ErrorKind::NotFound => {} + Err(err) => return Err(SdkError::generic(&err.to_string())), + } + } + Ok(infos) + } + + async fn get_lnurl_info(&self, payment_ids: &[&str]) -> SdkResult> { + let mut infos = HashMap::new(); + for payment_id in payment_ids { + match KVStoreAsync::read(self.kv_store.as_ref(), BREEZ_NS, LNURL_INFOS_NS, payment_id) + .await + { + Ok(raw) => { + let info = serde_json::from_slice::(&raw)?; + infos.insert((*payment_id).to_string(), info); + } + Err(err) if err.kind() == ErrorKind::NotFound => {} + Err(err) => return Err(SdkError::generic(&err.to_string())), + } + } + Ok(infos) + } +} + +impl From for SdkError { + fn from(err: Error) -> Self { + SdkError::Generic { + err: err.to_string(), } } } diff --git a/libs/sdk-core/src/models.rs b/libs/sdk-core/src/models.rs index 53a4f0584..4cc28da47 100644 --- a/libs/sdk-core/src/models.rs +++ b/libs/sdk-core/src/models.rs @@ -654,7 +654,6 @@ pub struct Payment { pub fee_msat: u64, pub status: PaymentStatus, pub error: Option, - pub description: Option, pub details: PaymentDetails, pub metadata: Option, } @@ -672,6 +671,39 @@ pub(crate) struct PaymentExternalInfo { pub attempted_error: Option, } +#[derive(PartialEq, Eq, Debug, Clone, Deserialize, Serialize)] +pub enum LnUrlPayTarget { + LnAddress { address: String }, + Domain { domain: String }, +} + +#[derive(PartialEq, Eq, Debug, Clone, Deserialize, Serialize)] +pub struct LnUrlPayInfo { + pub target: LnUrlPayTarget, + pub metadata: String, + pub comment: Option, + pub success_action: Option, +} + +#[derive(PartialEq, Eq, Debug, Clone, Deserialize, Serialize)] +pub struct LnUrlWithdrawInfo { + pub endpoint: String, +} + +#[derive(PartialEq, Eq, Debug, Clone, Deserialize, Serialize)] +pub enum LnUrlInfo { + Pay { info: LnUrlPayInfo }, + Withdraw { info: LnUrlWithdrawInfo }, +} + +#[derive(Default, PartialEq, Eq, Debug, Clone, Deserialize, Serialize)] +pub(crate) struct LnPaymentInfo { + pub bolt11: String, + pub payment_hash: String, + pub destination_pubkey: String, + pub description: Option, +} + /// Represents a list payments request. #[derive(Default)] pub struct ListPaymentsRequest { @@ -728,25 +760,9 @@ pub struct LnPaymentDetails { pub payment_preimage: String, pub keysend: bool, pub bolt11: String, + pub description: Option, - /// Only set for [PaymentType::Sent] payments that are part of a LNURL-pay workflow where - /// the endpoint returns a success action - pub lnurl_success_action: Option, - - /// Only set for [PaymentType::Sent] payments if it is not a payment to a Lightning Address - pub lnurl_pay_domain: Option, - - /// Only set for [PaymentType::Sent] payments if the user sent the comment using LNURL-pay - pub lnurl_pay_comment: Option, - - /// Only set for [PaymentType::Sent] payments that are sent to a Lightning Address - pub ln_address: Option, - - /// Only set for [PaymentType::Sent] payments where the receiver endpoint returned LNURL metadata - pub lnurl_metadata: Option, - - /// Only set for [PaymentType::Received] payments that were received as part of LNURL-withdraw - pub lnurl_withdraw_endpoint: Option, + pub lnurl_info: Option, /// Only set for [PaymentType::Received] payments that were received in the context of a swap pub swap_info: Option, @@ -796,8 +812,6 @@ pub struct ReceivePaymentRequest { /// If set and valid, these fess options are used when a new channels is needed. /// Otherwise the default fee options will be used. pub opening_fee_params: Option, - /// If set to true, then the bolt11 invoice returned includes the description hash. - pub use_description_hash: Option, /// if specified, set the time the invoice is valid for, in seconds. pub expiry: Option, /// if specified, sets the min_final_cltv_expiry for the invoice diff --git a/libs/sdk-core/src/node_api.rs b/libs/sdk-core/src/node_api.rs index 34e7b03ed..be025c8a4 100644 --- a/libs/sdk-core/src/node_api.rs +++ b/libs/sdk-core/src/node_api.rs @@ -102,7 +102,6 @@ impl From for LnUrlAuthError { pub struct CreateInvoiceRequest { pub amount_msat: u64, pub description: String, - pub use_description_hash: Option, pub preimage: Option>, pub opening_fee_msat: Option, pub expiry: u32, @@ -118,7 +117,6 @@ pub struct IncomingPayment { pub payment_hash: Vec, pub preimage: Vec, pub amount_msat: u64, - pub bolt11: String, } impl TryFrom for Payment { @@ -126,7 +124,6 @@ impl TryFrom for Payment { fn try_from(p: IncomingPayment) -> std::result::Result { let payment_time = SystemTime::now().duration_since(UNIX_EPOCH).map_err(|e| NodeError::Generic(format!("{e}")))?.as_secs() as i64; - let ln_invoice = parse_invoice(&p.bolt11)?; Ok(Payment { id: hex::encode(p.payment_hash.clone()), payment_type: PaymentType::Received, @@ -135,22 +132,12 @@ impl TryFrom for Payment { fee_msat: 0, status: PaymentStatus::Complete, error: None, - description: ln_invoice.description, details: PaymentDetails::Ln { data: LnPaymentDetails { payment_hash: hex::encode(p.payment_hash), - destination_pubkey: ln_invoice.payee_pubkey, payment_preimage: hex::encode(p.preimage), keysend: false, - bolt11: p.bolt11, - lnurl_success_action: None, // For received payments, this is None - lnurl_pay_domain: None, // For received payments, this is None - lnurl_pay_comment: None, // For received payments, this is None - lnurl_metadata: None, // For received payments, this is None - ln_address: None, - lnurl_withdraw_endpoint: None, - swap_info: None, - reverse_swap_info: None, + ..Default::default() }, }, metadata: None, diff --git a/libs/sdk-core/src/node_builder.rs b/libs/sdk-core/src/node_builder.rs index 78d1c09ca..8ea8085a9 100644 --- a/libs/sdk-core/src/node_builder.rs +++ b/libs/sdk-core/src/node_builder.rs @@ -4,28 +4,29 @@ use crate::backup::BackupTransport; use crate::ldk::{Ldk, LdkBackupTransport}; use crate::models::{Config, LspAPI}; use crate::node_api::{NodeAPI, NodeResult}; -use crate::persist::db::SqliteStorage; +use crate::persist::payment_store::PaymentStore; pub struct NodeImpls { pub node: Arc, pub backup_transport: Arc, pub lsp: Option>, + pub payment_store: Arc, } -#[allow(unused_variables)] pub async fn build_node( config: Config, seed: Vec, restore_only: Option, - persister: Arc, ) -> NodeResult { let backup_transport = Arc::new(LdkBackupTransport::new(&config, &seed)?); let ldk = Ldk::build(config, &seed, restore_only).await?; let ldk = Arc::new(ldk); let lsp: Option> = Some(ldk.clone()); + let payment_store = ldk.get_payment_store(); Ok(NodeImpls { node: ldk, backup_transport, lsp, + payment_store, }) } diff --git a/libs/sdk-core/src/persist/mod.rs b/libs/sdk-core/src/persist/mod.rs index e63cf9cda..a22a037f8 100644 --- a/libs/sdk-core/src/persist/mod.rs +++ b/libs/sdk-core/src/persist/mod.rs @@ -2,6 +2,7 @@ pub(crate) mod cache; pub(crate) mod db; pub(crate) mod error; pub(crate) mod migrations; +pub(crate) mod payment_store; pub(crate) mod reverseswap; pub(crate) mod send_pays; pub(crate) mod settings; diff --git a/libs/sdk-core/src/persist/payment_store.rs b/libs/sdk-core/src/persist/payment_store.rs new file mode 100644 index 000000000..59e17bdc6 --- /dev/null +++ b/libs/sdk-core/src/persist/payment_store.rs @@ -0,0 +1,13 @@ +use std::collections::HashMap; + +use crate::error::SdkResult; +use crate::models::LnPaymentInfo; +use crate::LnUrlInfo; + +#[tonic::async_trait] +pub trait PaymentStore: Send + Sync { + async fn set_ln_info(&self, payment_id: &str, info: &LnPaymentInfo) -> SdkResult<()>; + async fn set_lnurl_info(&self, payment_id: &str, info: &LnUrlInfo) -> SdkResult<()>; + async fn get_ln_info(&self, payment_ids: &[&str]) -> SdkResult>; + async fn get_lnurl_info(&self, payment_ids: &[&str]) -> SdkResult>; +} diff --git a/libs/sdk-core/src/persist/transactions.rs b/libs/sdk-core/src/persist/transactions.rs index d7fd7e52b..10e5dc5a0 100644 --- a/libs/sdk-core/src/persist/transactions.rs +++ b/libs/sdk-core/src/persist/transactions.rs @@ -1,7 +1,7 @@ use std::collections::{HashMap, HashSet}; use std::str::FromStr; -use rusqlite::types::{FromSql, FromSqlError, FromSqlResult, ToSql, ToSqlOutput, Type, ValueRef}; +use rusqlite::types::{FromSql, FromSqlError, FromSqlResult, ToSql, ToSqlOutput, ValueRef}; use rusqlite::Row; use rusqlite::{named_params, params, OptionalExtension}; use sdk_common::prelude::*; @@ -52,11 +52,10 @@ impl SqliteStorage { amount_msat, fee_msat, status, - description, details, is_pseudo ) - VALUES (?1,?2,?3,?4,?5,?6,?7,?8,?9) + VALUES (?1,?2,?3,?4,?5,?6,?7,?8) ", )?; @@ -68,7 +67,6 @@ impl SqliteStorage { &ln_tx.amount_msat, &ln_tx.fee_msat, &ln_tx.status, - &ln_tx.description, &ln_tx.details, &is_pseudo, ))?; @@ -318,26 +316,12 @@ impl SqliteStorage { }, fee_msat: row.get(4)?, status, - description: row.get(6)?, details: row.get(7)?, error: row.get(13)?, metadata: row.get(14)?, }; if let PaymentDetails::Ln { ref mut data } = payment.details { - let lnurl_success_action_str: Option = row.get(8)?; - data.lnurl_success_action = match lnurl_success_action_str { - None => None, - Some(s) => serde_json::from_str(&s).map_err(|e| { - rusqlite::Error::FromSqlConversionFailure(8, Type::Text, Box::new(e)) - })?, - }; - - data.lnurl_pay_domain = row.get(15)?; - data.lnurl_pay_comment = row.get(16)?; - data.lnurl_metadata = row.get(9)?; - data.ln_address = row.get(10)?; - data.lnurl_withdraw_endpoint = row.get(11)?; data.swap_info = self.sql_row_to_swap(row, "swaps_").ok(); if let Ok(fr) = self.sql_row_to_reverse_swap(row, "revswaps_") { data.reverse_swap_info = Some(fr.get_reverse_swap_info_using_cached_values()); @@ -545,7 +529,6 @@ mod test { fee_msat: 20, status: PaymentStatus::Complete, error: None, - description: None, details: PaymentDetails::Ln { data: LnPaymentDetails { payment_hash: payment_hash_with_lnurl_success_action.to_string(), @@ -553,12 +536,8 @@ mod test { payment_preimage: "1111".to_string(), keysend: true, bolt11: "bolt11".to_string(), - lnurl_success_action: Some(sa.clone()), - lnurl_pay_domain: None, - lnurl_pay_comment: None, - lnurl_metadata: Some(lnurl_metadata.to_string()), - ln_address: Some(test_ln_address.to_string()), - lnurl_withdraw_endpoint: None, + description: String::new(), + lnurl_info: None, swap_info: None, reverse_swap_info: None, }, @@ -573,7 +552,6 @@ mod test { fee_msat: 20, status: PaymentStatus::Complete, error: None, - description: Some("desc".to_string()), details: PaymentDetails::Ln { data: LnPaymentDetails { payment_hash: payment_hash_with_lnurl_withdraw.to_string(), @@ -581,12 +559,8 @@ mod test { payment_preimage: "2222".to_string(), keysend: true, bolt11: "bolt11".to_string(), - lnurl_success_action: None, - lnurl_pay_domain: None, - lnurl_pay_comment: None, - lnurl_metadata: None, - ln_address: None, - lnurl_withdraw_endpoint: Some(lnurl_withdraw_url.to_string()), + description: "desc".to_string(), + lnurl_info: None, swap_info: None, reverse_swap_info: None, }, @@ -601,7 +575,6 @@ mod test { fee_msat: 20, status: PaymentStatus::Complete, error: None, - description: Some("desc".to_string()), details: PaymentDetails::Ln { data: LnPaymentDetails { payment_hash: hex::encode(payment_hash_with_swap_info), @@ -609,12 +582,8 @@ mod test { payment_preimage: "3333".to_string(), keysend: false, bolt11: "swap_bolt11".to_string(), - lnurl_success_action: None, - lnurl_pay_domain: None, - lnurl_pay_comment: None, - lnurl_metadata: None, - ln_address: None, - lnurl_withdraw_endpoint: None, + description: "desc".to_string(), + lnurl_info: None, swap_info: Some(swap_info.clone()), reverse_swap_info: None, }, @@ -629,7 +598,6 @@ mod test { fee_msat: 200, status: PaymentStatus::Complete, error: None, - description: Some("desc".to_string()), details: PaymentDetails::Ln { data: LnPaymentDetails { payment_hash: hex::encode(payment_hash_with_rev_swap_info), @@ -637,12 +605,8 @@ mod test { payment_preimage: hex::encode(rev_swap_preimage), keysend: false, bolt11: "swap_bolt11".to_string(), - lnurl_success_action: None, - lnurl_metadata: None, - lnurl_pay_domain: None, - lnurl_pay_comment: None, - ln_address: None, - lnurl_withdraw_endpoint: None, + description: "desc".to_string(), + lnurl_info: None, swap_info: None, reverse_swap_info: Some(rev_swap_info.clone()), }, @@ -657,7 +621,6 @@ mod test { fee_msat: 20, status: PaymentStatus::Complete, error: None, - description: None, details: PaymentDetails::Ln { data: LnPaymentDetails { payment_hash: payment_hash_with_lnurl_domain.to_string(), @@ -665,12 +628,8 @@ mod test { payment_preimage: "payment_preimage".to_string(), keysend: true, bolt11: "bolt11".to_string(), - lnurl_success_action: None, - lnurl_pay_domain: Some(test_lnurl_pay_domain.to_string()), - lnurl_pay_comment: Some(test_lnurl_pay_comment.to_string()), - lnurl_metadata: Some(lnurl_metadata.to_string()), - ln_address: None, - lnurl_withdraw_endpoint: None, + description: String::new(), + lnurl_info: None, swap_info: None, reverse_swap_info: None, }, @@ -686,7 +645,6 @@ mod test { fee_msat: 0, status: PaymentStatus::Failed, error: None, - description: Some("desc".to_string()), details: PaymentDetails::Ln { data: LnPaymentDetails { payment_hash: "125".to_string(), @@ -694,12 +652,8 @@ mod test { payment_preimage: "4444".to_string(), keysend: true, bolt11: "bolt11".to_string(), - lnurl_success_action: None, - lnurl_pay_domain: None, - lnurl_pay_comment: None, - lnurl_metadata: None, - ln_address: None, - lnurl_withdraw_endpoint: None, + description: "desc".to_string(), + lnurl_info: None, swap_info: None, reverse_swap_info: None, }, @@ -776,15 +730,6 @@ mod test { assert_eq!(retrieve_txs.len(), 3); assert_eq!(retrieve_txs[0], txs[0]); assert_eq!(retrieve_txs[1], txs[3]); - assert!( - matches!( &retrieve_txs[0].details, PaymentDetails::Ln {data: LnPaymentDetails {lnurl_success_action, ..}} if lnurl_success_action == &Some(sa)) - ); - assert!( - matches!( &retrieve_txs[0].details, PaymentDetails::Ln {data: LnPaymentDetails {lnurl_pay_domain, ln_address, ..}} if lnurl_pay_domain.is_none() && ln_address == &Some(test_ln_address.to_string())) - ); - assert!( - matches!( &retrieve_txs[2].details, PaymentDetails::Ln {data: LnPaymentDetails {lnurl_pay_domain, ln_address, ..}} if lnurl_pay_domain == &Some(test_lnurl_pay_domain.to_string()) && ln_address.is_none()) - ); assert!( matches!( &retrieve_txs[1].details, PaymentDetails::Ln {data: LnPaymentDetails {reverse_swap_info: rev_swap, ..}} if rev_swap == &Some(rev_swap_info)) ); diff --git a/libs/sdk-core/src/receiver.rs b/libs/sdk-core/src/receiver.rs index adbff0a9e..1e0b5c30f 100644 --- a/libs/sdk-core/src/receiver.rs +++ b/libs/sdk-core/src/receiver.rs @@ -72,7 +72,6 @@ impl Receiver for PaymentReceiver { description, preimage, opening_fee_params: requested_opening_fee_params, - use_description_hash, expiry, cltv: _, } = req; @@ -105,7 +104,6 @@ impl Receiver for PaymentReceiver { .create_invoice(CreateInvoiceRequest { amount_msat, description, - use_description_hash, preimage, opening_fee_msat, expiry, diff --git a/libs/sdk-core/src/swap_in/swap.rs b/libs/sdk-core/src/swap_in/swap.rs index 082bf9845..0c075993e 100644 --- a/libs/sdk-core/src/swap_in/swap.rs +++ b/libs/sdk-core/src/swap_in/swap.rs @@ -991,7 +991,6 @@ impl BTCReceiveSwap { expiry: Some(blocks.saturating_mul(EXPIRY_SECONDS_PER_BLOCK)), opening_fee_params, preimage: Some(swap_info.preimage.clone()), - use_description_hash: None, }) .await; match receive_resp { diff --git a/libs/sdk-core/src/test_utils.rs b/libs/sdk-core/src/test_utils.rs index f6730b4d6..f028ddd2a 100644 --- a/libs/sdk-core/src/test_utils.rs +++ b/libs/sdk-core/src/test_utils.rs @@ -41,12 +41,13 @@ use crate::lightning::bitcoin::secp256k1 as ldk_secp256k1; use crate::lightning_invoice::{Currency, InvoiceBuilder, PaymentSecret, RawBolt11Invoice}; use crate::lsp::LspInformation; use crate::models::{ - LnPaymentDetails, LspAPI, NodeState, Payment, PaymentDetails, PaymentStatus, PaymentType, - ReverseSwapServiceAPI, SwapperAPI, TlvEntry, + LnPaymentDetails, LnPaymentInfo, LnUrlInfo, LspAPI, NodeState, Payment, PaymentDetails, + PaymentStatus, PaymentType, ReverseSwapServiceAPI, SwapperAPI, TlvEntry, }; use crate::node_api::{ CreateInvoiceRequest, FetchBolt11Result, IncomingPayment, NodeAPI, NodeError, NodeResult, }; +use crate::persist::payment_store::PaymentStore; use crate::swap_in::TaprootSwapperAPI; use crate::swap_out::boltzswap::{BoltzApiCreateReverseSwapResponse, BoltzApiReverseSwapStatus}; use crate::swap_out::error::{ReverseSwapError, ReverseSwapResult}; @@ -164,6 +165,53 @@ impl ReverseSwapServiceAPI for MockReverseSwapperAPI { } } +#[derive(Default)] +pub struct MockPaymentStore { + ln_info: std::sync::Mutex>, + lnurl_info: std::sync::Mutex>, +} + +#[tonic::async_trait] +impl PaymentStore for MockPaymentStore { + async fn set_ln_info(&self, payment_id: &str, info: &LnPaymentInfo) -> SdkResult<()> { + self.ln_info + .lock() + .unwrap() + .insert(payment_id.to_string(), info.clone()); + Ok(()) + } + + async fn set_lnurl_info(&self, payment_id: &str, info: &LnUrlInfo) -> SdkResult<()> { + self.lnurl_info + .lock() + .unwrap() + .insert(payment_id.to_string(), info.clone()); + Ok(()) + } + + async fn get_ln_info(&self, payment_ids: &[&str]) -> SdkResult> { + let ln_info = self.ln_info.lock().unwrap(); + let mut res = HashMap::new(); + for payment_id in payment_ids { + if let Some(info) = ln_info.get(*payment_id) { + res.insert((*payment_id).to_string(), info.clone()); + } + } + Ok(res) + } + + async fn get_lnurl_info(&self, payment_ids: &[&str]) -> SdkResult> { + let lnurl_info = self.lnurl_info.lock().unwrap(); + let mut res = HashMap::new(); + for payment_id in payment_ids { + if let Some(info) = lnurl_info.get(*payment_id) { + res.insert((*payment_id).to_string(), info.clone()); + } + } + Ok(res) + } +} + #[derive(Clone)] pub struct MockChainService { pub tip: u32, @@ -456,7 +504,6 @@ impl MockNodeAPI { fee_msat: 0, status: status.unwrap_or(PaymentStatus::Complete), error: None, - description: None, details: PaymentDetails::Ln { data: LnPaymentDetails { payment_hash: hex::encode(inv.payment_hash()), @@ -464,14 +511,7 @@ impl MockNodeAPI { payment_preimage: preimage, keysend: false, bolt11: inv.to_string(), - lnurl_success_action: None, - lnurl_pay_domain: None, - lnurl_pay_comment: None, - lnurl_metadata: None, - ln_address: None, - lnurl_withdraw_endpoint: None, - swap_info: None, - reverse_swap_info: None, + ..Default::default() }, }, metadata: None, diff --git a/libs/sdk-flutter/ios/Classes/frb_generated.h b/libs/sdk-flutter/ios/Classes/frb_generated.h index 46050e1c1..91a050d76 100644 --- a/libs/sdk-flutter/ios/Classes/frb_generated.h +++ b/libs/sdk-flutter/ios/Classes/frb_generated.h @@ -39,6 +39,34 @@ typedef struct wire_cst_list_prim_u_8_strict { int32_t len; } wire_cst_list_prim_u_8_strict; +typedef struct wire_cst_invoice_paid_details { + struct wire_cst_list_prim_u_8_strict *payment_hash; + struct wire_cst_list_prim_u_8_strict *payment_preimage; + uint64_t amount_msat; +} wire_cst_invoice_paid_details; + +typedef struct wire_cst_BreezEvent_InvoicePaid { + struct wire_cst_invoice_paid_details *details; +} wire_cst_BreezEvent_InvoicePaid; + +typedef struct wire_cst_LnUrlPayTarget_LnAddress { + struct wire_cst_list_prim_u_8_strict *address; +} wire_cst_LnUrlPayTarget_LnAddress; + +typedef struct wire_cst_LnUrlPayTarget_Domain { + struct wire_cst_list_prim_u_8_strict *domain; +} wire_cst_LnUrlPayTarget_Domain; + +typedef union LnUrlPayTargetKind { + struct wire_cst_LnUrlPayTarget_LnAddress LnAddress; + struct wire_cst_LnUrlPayTarget_Domain Domain; +} LnUrlPayTargetKind; + +typedef struct wire_cst_ln_url_pay_target { + int32_t tag; + union LnUrlPayTargetKind kind; +} wire_cst_ln_url_pay_target; + typedef struct wire_cst_aes_success_action_data_decrypted { struct wire_cst_list_prim_u_8_strict *description; struct wire_cst_list_prim_u_8_strict *plaintext; @@ -95,6 +123,35 @@ typedef struct wire_cst_success_action_processed { union SuccessActionProcessedKind kind; } wire_cst_success_action_processed; +typedef struct wire_cst_ln_url_pay_info { + struct wire_cst_ln_url_pay_target target; + struct wire_cst_list_prim_u_8_strict *metadata; + struct wire_cst_list_prim_u_8_strict *comment; + struct wire_cst_success_action_processed *success_action; +} wire_cst_ln_url_pay_info; + +typedef struct wire_cst_LnUrlInfo_Pay { + struct wire_cst_ln_url_pay_info *info; +} wire_cst_LnUrlInfo_Pay; + +typedef struct wire_cst_ln_url_withdraw_info { + struct wire_cst_list_prim_u_8_strict *endpoint; +} wire_cst_ln_url_withdraw_info; + +typedef struct wire_cst_LnUrlInfo_Withdraw { + struct wire_cst_ln_url_withdraw_info *info; +} wire_cst_LnUrlInfo_Withdraw; + +typedef union LnUrlInfoKind { + struct wire_cst_LnUrlInfo_Pay Pay; + struct wire_cst_LnUrlInfo_Withdraw Withdraw; +} LnUrlInfoKind; + +typedef struct wire_cst_ln_url_info { + int32_t tag; + union LnUrlInfoKind kind; +} wire_cst_ln_url_info; + typedef struct wire_cst_list_String { struct wire_cst_list_prim_u_8_strict **ptr; int32_t len; @@ -151,12 +208,8 @@ typedef struct wire_cst_ln_payment_details { struct wire_cst_list_prim_u_8_strict *payment_preimage; bool keysend; struct wire_cst_list_prim_u_8_strict *bolt11; - struct wire_cst_success_action_processed *lnurl_success_action; - struct wire_cst_list_prim_u_8_strict *lnurl_pay_domain; - struct wire_cst_list_prim_u_8_strict *lnurl_pay_comment; - struct wire_cst_list_prim_u_8_strict *ln_address; - struct wire_cst_list_prim_u_8_strict *lnurl_metadata; - struct wire_cst_list_prim_u_8_strict *lnurl_withdraw_endpoint; + struct wire_cst_list_prim_u_8_strict *description; + struct wire_cst_ln_url_info *lnurl_info; struct wire_cst_swap_info *swap_info; struct wire_cst_reverse_swap_info *reverse_swap_info; } wire_cst_ln_payment_details; @@ -194,21 +247,10 @@ typedef struct wire_cst_payment { uint64_t fee_msat; int32_t status; struct wire_cst_list_prim_u_8_strict *error; - struct wire_cst_list_prim_u_8_strict *description; struct wire_cst_payment_details details; struct wire_cst_list_prim_u_8_strict *metadata; } wire_cst_payment; -typedef struct wire_cst_invoice_paid_details { - struct wire_cst_list_prim_u_8_strict *payment_hash; - struct wire_cst_list_prim_u_8_strict *bolt11; - struct wire_cst_payment *payment; -} wire_cst_invoice_paid_details; - -typedef struct wire_cst_BreezEvent_InvoicePaid { - struct wire_cst_invoice_paid_details *details; -} wire_cst_BreezEvent_InvoicePaid; - typedef struct wire_cst_BreezEvent_PaymentSucceed { struct wire_cst_payment *details; } wire_cst_BreezEvent_PaymentSucceed; @@ -462,7 +504,6 @@ typedef struct wire_cst_receive_payment_request { struct wire_cst_list_prim_u_8_strict *description; struct wire_cst_list_prim_u_8_strict *preimage; struct wire_cst_opening_fee_params *opening_fee_params; - bool *use_description_hash; uint32_t *expiry; uint32_t *cltv; } wire_cst_receive_payment_request; @@ -1132,14 +1173,20 @@ struct wire_cst_ln_url_auth_request_data *frbgen_breez_sdk_cst_new_box_autoadd_l struct wire_cst_ln_url_error_data *frbgen_breez_sdk_cst_new_box_autoadd_ln_url_error_data(void); +struct wire_cst_ln_url_info *frbgen_breez_sdk_cst_new_box_autoadd_ln_url_info(void); + struct wire_cst_ln_url_pay_error_data *frbgen_breez_sdk_cst_new_box_autoadd_ln_url_pay_error_data(void); +struct wire_cst_ln_url_pay_info *frbgen_breez_sdk_cst_new_box_autoadd_ln_url_pay_info(void); + struct wire_cst_ln_url_pay_request *frbgen_breez_sdk_cst_new_box_autoadd_ln_url_pay_request(void); struct wire_cst_ln_url_pay_request_data *frbgen_breez_sdk_cst_new_box_autoadd_ln_url_pay_request_data(void); struct wire_cst_ln_url_pay_success_data *frbgen_breez_sdk_cst_new_box_autoadd_ln_url_pay_success_data(void); +struct wire_cst_ln_url_withdraw_info *frbgen_breez_sdk_cst_new_box_autoadd_ln_url_withdraw_info(void); + struct wire_cst_ln_url_withdraw_request *frbgen_breez_sdk_cst_new_box_autoadd_ln_url_withdraw_request(void); struct wire_cst_ln_url_withdraw_request_data *frbgen_breez_sdk_cst_new_box_autoadd_ln_url_withdraw_request_data(void); @@ -1263,10 +1310,13 @@ static int64_t dummy_method_to_enforce_bundling(void) { dummy_var ^= ((int64_t) (void*) frbgen_breez_sdk_cst_new_box_autoadd_ln_payment_details); dummy_var ^= ((int64_t) (void*) frbgen_breez_sdk_cst_new_box_autoadd_ln_url_auth_request_data); dummy_var ^= ((int64_t) (void*) frbgen_breez_sdk_cst_new_box_autoadd_ln_url_error_data); + dummy_var ^= ((int64_t) (void*) frbgen_breez_sdk_cst_new_box_autoadd_ln_url_info); dummy_var ^= ((int64_t) (void*) frbgen_breez_sdk_cst_new_box_autoadd_ln_url_pay_error_data); + dummy_var ^= ((int64_t) (void*) frbgen_breez_sdk_cst_new_box_autoadd_ln_url_pay_info); dummy_var ^= ((int64_t) (void*) frbgen_breez_sdk_cst_new_box_autoadd_ln_url_pay_request); dummy_var ^= ((int64_t) (void*) frbgen_breez_sdk_cst_new_box_autoadd_ln_url_pay_request_data); dummy_var ^= ((int64_t) (void*) frbgen_breez_sdk_cst_new_box_autoadd_ln_url_pay_success_data); + dummy_var ^= ((int64_t) (void*) frbgen_breez_sdk_cst_new_box_autoadd_ln_url_withdraw_info); dummy_var ^= ((int64_t) (void*) frbgen_breez_sdk_cst_new_box_autoadd_ln_url_withdraw_request); dummy_var ^= ((int64_t) (void*) frbgen_breez_sdk_cst_new_box_autoadd_ln_url_withdraw_request_data); dummy_var ^= ((int64_t) (void*) frbgen_breez_sdk_cst_new_box_autoadd_ln_url_withdraw_success_data); diff --git a/libs/sdk-flutter/lib/generated/breez_services.dart b/libs/sdk-flutter/lib/generated/breez_services.dart index 389e31e81..a8cafb414 100644 --- a/libs/sdk-flutter/lib/generated/breez_services.dart +++ b/libs/sdk-flutter/lib/generated/breez_services.dart @@ -108,13 +108,17 @@ class CheckMessageResponse { /// Details of an invoice that has been paid, included as payload in an emitted [BreezEvent] class InvoicePaidDetails { final String paymentHash; - final String bolt11; - final Payment? payment; + final String paymentPreimage; + final BigInt amountMsat; - const InvoicePaidDetails({required this.paymentHash, required this.bolt11, this.payment}); + const InvoicePaidDetails({ + required this.paymentHash, + required this.paymentPreimage, + required this.amountMsat, + }); @override - int get hashCode => paymentHash.hashCode ^ bolt11.hashCode ^ payment.hashCode; + int get hashCode => paymentHash.hashCode ^ paymentPreimage.hashCode ^ amountMsat.hashCode; @override bool operator ==(Object other) => @@ -122,8 +126,8 @@ class InvoicePaidDetails { other is InvoicePaidDetails && runtimeType == other.runtimeType && paymentHash == other.paymentHash && - bolt11 == other.bolt11 && - payment == other.payment; + paymentPreimage == other.paymentPreimage && + amountMsat == other.amountMsat; } class PaymentFailedData { diff --git a/libs/sdk-flutter/lib/generated/frb_generated.dart b/libs/sdk-flutter/lib/generated/frb_generated.dart index 041686d49..e80c6a5c5 100644 --- a/libs/sdk-flutter/lib/generated/frb_generated.dart +++ b/libs/sdk-flutter/lib/generated/frb_generated.dart @@ -1684,12 +1684,24 @@ class BreezSdkBindingsApiImpl extends BreezSdkBindingsApiImplPlatform implements return dco_decode_ln_url_error_data(raw); } + @protected + LnUrlInfo dco_decode_box_autoadd_ln_url_info(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_ln_url_info(raw); + } + @protected LnUrlPayErrorData dco_decode_box_autoadd_ln_url_pay_error_data(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs return dco_decode_ln_url_pay_error_data(raw); } + @protected + LnUrlPayInfo dco_decode_box_autoadd_ln_url_pay_info(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_ln_url_pay_info(raw); + } + @protected LnUrlPayRequest dco_decode_box_autoadd_ln_url_pay_request(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs @@ -1708,6 +1720,12 @@ class BreezSdkBindingsApiImpl extends BreezSdkBindingsApiImplPlatform implements return dco_decode_ln_url_pay_success_data(raw); } + @protected + LnUrlWithdrawInfo dco_decode_box_autoadd_ln_url_withdraw_info(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return dco_decode_ln_url_withdraw_info(raw); + } + @protected LnUrlWithdrawRequest dco_decode_box_autoadd_ln_url_withdraw_request(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs @@ -2127,8 +2145,8 @@ class BreezSdkBindingsApiImpl extends BreezSdkBindingsApiImplPlatform implements if (arr.length != 3) throw Exception('unexpected arr length: expect 3 but see ${arr.length}'); return InvoicePaidDetails( paymentHash: dco_decode_String(arr[0]), - bolt11: dco_decode_String(arr[1]), - payment: dco_decode_opt_box_autoadd_payment(arr[2]), + paymentPreimage: dco_decode_String(arr[1]), + amountMsat: dco_decode_u_64(arr[2]), ); } @@ -2326,21 +2344,17 @@ class BreezSdkBindingsApiImpl extends BreezSdkBindingsApiImplPlatform implements LnPaymentDetails dco_decode_ln_payment_details(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs final arr = raw as List; - if (arr.length != 13) throw Exception('unexpected arr length: expect 13 but see ${arr.length}'); + if (arr.length != 9) throw Exception('unexpected arr length: expect 9 but see ${arr.length}'); return LnPaymentDetails( paymentHash: dco_decode_String(arr[0]), destinationPubkey: dco_decode_String(arr[1]), paymentPreimage: dco_decode_String(arr[2]), keysend: dco_decode_bool(arr[3]), bolt11: dco_decode_String(arr[4]), - lnurlSuccessAction: dco_decode_opt_box_autoadd_success_action_processed(arr[5]), - lnurlPayDomain: dco_decode_opt_String(arr[6]), - lnurlPayComment: dco_decode_opt_String(arr[7]), - lnAddress: dco_decode_opt_String(arr[8]), - lnurlMetadata: dco_decode_opt_String(arr[9]), - lnurlWithdrawEndpoint: dco_decode_opt_String(arr[10]), - swapInfo: dco_decode_opt_box_autoadd_swap_info(arr[11]), - reverseSwapInfo: dco_decode_opt_box_autoadd_reverse_swap_info(arr[12]), + description: dco_decode_opt_String(arr[5]), + lnurlInfo: dco_decode_opt_box_autoadd_ln_url_info(arr[6]), + swapInfo: dco_decode_opt_box_autoadd_swap_info(arr[7]), + reverseSwapInfo: dco_decode_opt_box_autoadd_reverse_swap_info(arr[8]), ); } @@ -2378,6 +2392,19 @@ class BreezSdkBindingsApiImpl extends BreezSdkBindingsApiImplPlatform implements return LnUrlErrorData(reason: dco_decode_String(arr[0])); } + @protected + LnUrlInfo dco_decode_ln_url_info(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + switch (raw[0]) { + case 0: + return LnUrlInfo_Pay(info: dco_decode_box_autoadd_ln_url_pay_info(raw[1])); + case 1: + return LnUrlInfo_Withdraw(info: dco_decode_box_autoadd_ln_url_withdraw_info(raw[1])); + default: + throw Exception("unreachable"); + } + } + @protected LnUrlPayErrorData dco_decode_ln_url_pay_error_data(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs @@ -2386,6 +2413,19 @@ class BreezSdkBindingsApiImpl extends BreezSdkBindingsApiImplPlatform implements return LnUrlPayErrorData(paymentHash: dco_decode_String(arr[0]), reason: dco_decode_String(arr[1])); } + @protected + LnUrlPayInfo dco_decode_ln_url_pay_info(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 4) throw Exception('unexpected arr length: expect 4 but see ${arr.length}'); + return LnUrlPayInfo( + target: dco_decode_ln_url_pay_target(arr[0]), + metadata: dco_decode_String(arr[1]), + comment: dco_decode_opt_String(arr[2]), + successAction: dco_decode_opt_box_autoadd_success_action_processed(arr[3]), + ); + } + @protected LnUrlPayRequest dco_decode_ln_url_pay_request(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs @@ -2444,6 +2484,27 @@ class BreezSdkBindingsApiImpl extends BreezSdkBindingsApiImplPlatform implements ); } + @protected + LnUrlPayTarget dco_decode_ln_url_pay_target(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + switch (raw[0]) { + case 0: + return LnUrlPayTarget_LnAddress(address: dco_decode_String(raw[1])); + case 1: + return LnUrlPayTarget_Domain(domain: dco_decode_String(raw[1])); + default: + throw Exception("unreachable"); + } + } + + @protected + LnUrlWithdrawInfo dco_decode_ln_url_withdraw_info(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + final arr = raw as List; + if (arr.length != 1) throw Exception('unexpected arr length: expect 1 but see ${arr.length}'); + return LnUrlWithdrawInfo(endpoint: dco_decode_String(arr[0])); + } + @protected LnUrlWithdrawRequest dco_decode_ln_url_withdraw_request(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs @@ -2672,6 +2733,12 @@ class BreezSdkBindingsApiImpl extends BreezSdkBindingsApiImplPlatform implements return raw == null ? null : dco_decode_box_autoadd_ln_invoice(raw); } + @protected + LnUrlInfo? dco_decode_opt_box_autoadd_ln_url_info(dynamic raw) { + // Codec=Dco (DartCObject based), see doc to use other codecs + return raw == null ? null : dco_decode_box_autoadd_ln_url_info(raw); + } + @protected LspInformation? dco_decode_opt_box_autoadd_lsp_information(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs @@ -2785,7 +2852,7 @@ class BreezSdkBindingsApiImpl extends BreezSdkBindingsApiImplPlatform implements Payment dco_decode_payment(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs final arr = raw as List; - if (arr.length != 10) throw Exception('unexpected arr length: expect 10 but see ${arr.length}'); + if (arr.length != 9) throw Exception('unexpected arr length: expect 9 but see ${arr.length}'); return Payment( id: dco_decode_String(arr[0]), paymentType: dco_decode_payment_type(arr[1]), @@ -2794,9 +2861,8 @@ class BreezSdkBindingsApiImpl extends BreezSdkBindingsApiImplPlatform implements feeMsat: dco_decode_u_64(arr[4]), status: dco_decode_payment_status(arr[5]), error: dco_decode_opt_String(arr[6]), - description: dco_decode_opt_String(arr[7]), - details: dco_decode_payment_details(arr[8]), - metadata: dco_decode_opt_String(arr[9]), + details: dco_decode_payment_details(arr[7]), + metadata: dco_decode_opt_String(arr[8]), ); } @@ -2939,15 +3005,14 @@ class BreezSdkBindingsApiImpl extends BreezSdkBindingsApiImplPlatform implements ReceivePaymentRequest dco_decode_receive_payment_request(dynamic raw) { // Codec=Dco (DartCObject based), see doc to use other codecs final arr = raw as List; - if (arr.length != 7) throw Exception('unexpected arr length: expect 7 but see ${arr.length}'); + if (arr.length != 6) throw Exception('unexpected arr length: expect 6 but see ${arr.length}'); return ReceivePaymentRequest( amountMsat: dco_decode_u_64(arr[0]), description: dco_decode_String(arr[1]), preimage: dco_decode_opt_list_prim_u_8_strict(arr[2]), openingFeeParams: dco_decode_opt_box_autoadd_opening_fee_params(arr[3]), - useDescriptionHash: dco_decode_opt_box_autoadd_bool(arr[4]), - expiry: dco_decode_opt_box_autoadd_u_32(arr[5]), - cltv: dco_decode_opt_box_autoadd_u_32(arr[6]), + expiry: dco_decode_opt_box_autoadd_u_32(arr[4]), + cltv: dco_decode_opt_box_autoadd_u_32(arr[5]), ); } @@ -3576,12 +3641,24 @@ class BreezSdkBindingsApiImpl extends BreezSdkBindingsApiImplPlatform implements return (sse_decode_ln_url_error_data(deserializer)); } + @protected + LnUrlInfo sse_decode_box_autoadd_ln_url_info(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_ln_url_info(deserializer)); + } + @protected LnUrlPayErrorData sse_decode_box_autoadd_ln_url_pay_error_data(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs return (sse_decode_ln_url_pay_error_data(deserializer)); } + @protected + LnUrlPayInfo sse_decode_box_autoadd_ln_url_pay_info(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_ln_url_pay_info(deserializer)); + } + @protected LnUrlPayRequest sse_decode_box_autoadd_ln_url_pay_request(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs @@ -3600,6 +3677,12 @@ class BreezSdkBindingsApiImpl extends BreezSdkBindingsApiImplPlatform implements return (sse_decode_ln_url_pay_success_data(deserializer)); } + @protected + LnUrlWithdrawInfo sse_decode_box_autoadd_ln_url_withdraw_info(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + return (sse_decode_ln_url_withdraw_info(deserializer)); + } + @protected LnUrlWithdrawRequest sse_decode_box_autoadd_ln_url_withdraw_request(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs @@ -4054,9 +4137,13 @@ class BreezSdkBindingsApiImpl extends BreezSdkBindingsApiImplPlatform implements InvoicePaidDetails sse_decode_invoice_paid_details(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs var var_paymentHash = sse_decode_String(deserializer); - var var_bolt11 = sse_decode_String(deserializer); - var var_payment = sse_decode_opt_box_autoadd_payment(deserializer); - return InvoicePaidDetails(paymentHash: var_paymentHash, bolt11: var_bolt11, payment: var_payment); + var var_paymentPreimage = sse_decode_String(deserializer); + var var_amountMsat = sse_decode_u_64(deserializer); + return InvoicePaidDetails( + paymentHash: var_paymentHash, + paymentPreimage: var_paymentPreimage, + amountMsat: var_amountMsat, + ); } @protected @@ -4389,12 +4476,8 @@ class BreezSdkBindingsApiImpl extends BreezSdkBindingsApiImplPlatform implements var var_paymentPreimage = sse_decode_String(deserializer); var var_keysend = sse_decode_bool(deserializer); var var_bolt11 = sse_decode_String(deserializer); - var var_lnurlSuccessAction = sse_decode_opt_box_autoadd_success_action_processed(deserializer); - var var_lnurlPayDomain = sse_decode_opt_String(deserializer); - var var_lnurlPayComment = sse_decode_opt_String(deserializer); - var var_lnAddress = sse_decode_opt_String(deserializer); - var var_lnurlMetadata = sse_decode_opt_String(deserializer); - var var_lnurlWithdrawEndpoint = sse_decode_opt_String(deserializer); + var var_description = sse_decode_opt_String(deserializer); + var var_lnurlInfo = sse_decode_opt_box_autoadd_ln_url_info(deserializer); var var_swapInfo = sse_decode_opt_box_autoadd_swap_info(deserializer); var var_reverseSwapInfo = sse_decode_opt_box_autoadd_reverse_swap_info(deserializer); return LnPaymentDetails( @@ -4403,12 +4486,8 @@ class BreezSdkBindingsApiImpl extends BreezSdkBindingsApiImplPlatform implements paymentPreimage: var_paymentPreimage, keysend: var_keysend, bolt11: var_bolt11, - lnurlSuccessAction: var_lnurlSuccessAction, - lnurlPayDomain: var_lnurlPayDomain, - lnurlPayComment: var_lnurlPayComment, - lnAddress: var_lnAddress, - lnurlMetadata: var_lnurlMetadata, - lnurlWithdrawEndpoint: var_lnurlWithdrawEndpoint, + description: var_description, + lnurlInfo: var_lnurlInfo, swapInfo: var_swapInfo, reverseSwapInfo: var_reverseSwapInfo, ); @@ -4447,6 +4526,23 @@ class BreezSdkBindingsApiImpl extends BreezSdkBindingsApiImplPlatform implements return LnUrlErrorData(reason: var_reason); } + @protected + LnUrlInfo sse_decode_ln_url_info(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var tag_ = sse_decode_i_32(deserializer); + switch (tag_) { + case 0: + var var_info = sse_decode_box_autoadd_ln_url_pay_info(deserializer); + return LnUrlInfo_Pay(info: var_info); + case 1: + var var_info = sse_decode_box_autoadd_ln_url_withdraw_info(deserializer); + return LnUrlInfo_Withdraw(info: var_info); + default: + throw UnimplementedError(''); + } + } + @protected LnUrlPayErrorData sse_decode_ln_url_pay_error_data(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs @@ -4455,6 +4551,21 @@ class BreezSdkBindingsApiImpl extends BreezSdkBindingsApiImplPlatform implements return LnUrlPayErrorData(paymentHash: var_paymentHash, reason: var_reason); } + @protected + LnUrlPayInfo sse_decode_ln_url_pay_info(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_target = sse_decode_ln_url_pay_target(deserializer); + var var_metadata = sse_decode_String(deserializer); + var var_comment = sse_decode_opt_String(deserializer); + var var_successAction = sse_decode_opt_box_autoadd_success_action_processed(deserializer); + return LnUrlPayInfo( + target: var_target, + metadata: var_metadata, + comment: var_comment, + successAction: var_successAction, + ); + } + @protected LnUrlPayRequest sse_decode_ln_url_pay_request(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs @@ -4525,6 +4636,30 @@ class BreezSdkBindingsApiImpl extends BreezSdkBindingsApiImplPlatform implements return LnUrlPaySuccessData(payment: var_payment, successAction: var_successAction); } + @protected + LnUrlPayTarget sse_decode_ln_url_pay_target(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + var tag_ = sse_decode_i_32(deserializer); + switch (tag_) { + case 0: + var var_address = sse_decode_String(deserializer); + return LnUrlPayTarget_LnAddress(address: var_address); + case 1: + var var_domain = sse_decode_String(deserializer); + return LnUrlPayTarget_Domain(domain: var_domain); + default: + throw UnimplementedError(''); + } + } + + @protected + LnUrlWithdrawInfo sse_decode_ln_url_withdraw_info(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + var var_endpoint = sse_decode_String(deserializer); + return LnUrlWithdrawInfo(endpoint: var_endpoint); + } + @protected LnUrlWithdrawRequest sse_decode_ln_url_withdraw_request(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs @@ -4797,6 +4932,17 @@ class BreezSdkBindingsApiImpl extends BreezSdkBindingsApiImplPlatform implements } } + @protected + LnUrlInfo? sse_decode_opt_box_autoadd_ln_url_info(SseDeserializer deserializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + if (sse_decode_bool(deserializer)) { + return (sse_decode_box_autoadd_ln_url_info(deserializer)); + } else { + return null; + } + } + @protected LspInformation? sse_decode_opt_box_autoadd_lsp_information(SseDeserializer deserializer) { // Codec=Sse (Serialization based), see doc to use other codecs @@ -4987,7 +5133,6 @@ class BreezSdkBindingsApiImpl extends BreezSdkBindingsApiImplPlatform implements var var_feeMsat = sse_decode_u_64(deserializer); var var_status = sse_decode_payment_status(deserializer); var var_error = sse_decode_opt_String(deserializer); - var var_description = sse_decode_opt_String(deserializer); var var_details = sse_decode_payment_details(deserializer); var var_metadata = sse_decode_opt_String(deserializer); return Payment( @@ -4998,7 +5143,6 @@ class BreezSdkBindingsApiImpl extends BreezSdkBindingsApiImplPlatform implements feeMsat: var_feeMsat, status: var_status, error: var_error, - description: var_description, details: var_details, metadata: var_metadata, ); @@ -5150,7 +5294,6 @@ class BreezSdkBindingsApiImpl extends BreezSdkBindingsApiImplPlatform implements var var_description = sse_decode_String(deserializer); var var_preimage = sse_decode_opt_list_prim_u_8_strict(deserializer); var var_openingFeeParams = sse_decode_opt_box_autoadd_opening_fee_params(deserializer); - var var_useDescriptionHash = sse_decode_opt_box_autoadd_bool(deserializer); var var_expiry = sse_decode_opt_box_autoadd_u_32(deserializer); var var_cltv = sse_decode_opt_box_autoadd_u_32(deserializer); return ReceivePaymentRequest( @@ -5158,7 +5301,6 @@ class BreezSdkBindingsApiImpl extends BreezSdkBindingsApiImplPlatform implements description: var_description, preimage: var_preimage, openingFeeParams: var_openingFeeParams, - useDescriptionHash: var_useDescriptionHash, expiry: var_expiry, cltv: var_cltv, ); @@ -5922,12 +6064,24 @@ class BreezSdkBindingsApiImpl extends BreezSdkBindingsApiImplPlatform implements sse_encode_ln_url_error_data(self, serializer); } + @protected + void sse_encode_box_autoadd_ln_url_info(LnUrlInfo self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_ln_url_info(self, serializer); + } + @protected void sse_encode_box_autoadd_ln_url_pay_error_data(LnUrlPayErrorData self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_ln_url_pay_error_data(self, serializer); } + @protected + void sse_encode_box_autoadd_ln_url_pay_info(LnUrlPayInfo self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_ln_url_pay_info(self, serializer); + } + @protected void sse_encode_box_autoadd_ln_url_pay_request(LnUrlPayRequest self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs @@ -5946,6 +6100,12 @@ class BreezSdkBindingsApiImpl extends BreezSdkBindingsApiImplPlatform implements sse_encode_ln_url_pay_success_data(self, serializer); } + @protected + void sse_encode_box_autoadd_ln_url_withdraw_info(LnUrlWithdrawInfo self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_ln_url_withdraw_info(self, serializer); + } + @protected void sse_encode_box_autoadd_ln_url_withdraw_request(LnUrlWithdrawRequest self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs @@ -6367,8 +6527,8 @@ class BreezSdkBindingsApiImpl extends BreezSdkBindingsApiImplPlatform implements void sse_encode_invoice_paid_details(InvoicePaidDetails self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs sse_encode_String(self.paymentHash, serializer); - sse_encode_String(self.bolt11, serializer); - sse_encode_opt_box_autoadd_payment(self.payment, serializer); + sse_encode_String(self.paymentPreimage, serializer); + sse_encode_u_64(self.amountMsat, serializer); } @protected @@ -6609,12 +6769,8 @@ class BreezSdkBindingsApiImpl extends BreezSdkBindingsApiImplPlatform implements sse_encode_String(self.paymentPreimage, serializer); sse_encode_bool(self.keysend, serializer); sse_encode_String(self.bolt11, serializer); - sse_encode_opt_box_autoadd_success_action_processed(self.lnurlSuccessAction, serializer); - sse_encode_opt_String(self.lnurlPayDomain, serializer); - sse_encode_opt_String(self.lnurlPayComment, serializer); - sse_encode_opt_String(self.lnAddress, serializer); - sse_encode_opt_String(self.lnurlMetadata, serializer); - sse_encode_opt_String(self.lnurlWithdrawEndpoint, serializer); + sse_encode_opt_String(self.description, serializer); + sse_encode_opt_box_autoadd_ln_url_info(self.lnurlInfo, serializer); sse_encode_opt_box_autoadd_swap_info(self.swapInfo, serializer); sse_encode_opt_box_autoadd_reverse_swap_info(self.reverseSwapInfo, serializer); } @@ -6646,6 +6802,19 @@ class BreezSdkBindingsApiImpl extends BreezSdkBindingsApiImplPlatform implements sse_encode_String(self.reason, serializer); } + @protected + void sse_encode_ln_url_info(LnUrlInfo self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + switch (self) { + case LnUrlInfo_Pay(info: final info): + sse_encode_i_32(0, serializer); + sse_encode_box_autoadd_ln_url_pay_info(info, serializer); + case LnUrlInfo_Withdraw(info: final info): + sse_encode_i_32(1, serializer); + sse_encode_box_autoadd_ln_url_withdraw_info(info, serializer); + } + } + @protected void sse_encode_ln_url_pay_error_data(LnUrlPayErrorData self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs @@ -6653,6 +6822,15 @@ class BreezSdkBindingsApiImpl extends BreezSdkBindingsApiImplPlatform implements sse_encode_String(self.reason, serializer); } + @protected + void sse_encode_ln_url_pay_info(LnUrlPayInfo self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_ln_url_pay_target(self.target, serializer); + sse_encode_String(self.metadata, serializer); + sse_encode_opt_String(self.comment, serializer); + sse_encode_opt_box_autoadd_success_action_processed(self.successAction, serializer); + } + @protected void sse_encode_ln_url_pay_request(LnUrlPayRequest self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs @@ -6700,6 +6878,25 @@ class BreezSdkBindingsApiImpl extends BreezSdkBindingsApiImplPlatform implements sse_encode_opt_box_autoadd_success_action_processed(self.successAction, serializer); } + @protected + void sse_encode_ln_url_pay_target(LnUrlPayTarget self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + switch (self) { + case LnUrlPayTarget_LnAddress(address: final address): + sse_encode_i_32(0, serializer); + sse_encode_String(address, serializer); + case LnUrlPayTarget_Domain(domain: final domain): + sse_encode_i_32(1, serializer); + sse_encode_String(domain, serializer); + } + } + + @protected + void sse_encode_ln_url_withdraw_info(LnUrlWithdrawInfo self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + sse_encode_String(self.endpoint, serializer); + } + @protected void sse_encode_ln_url_withdraw_request(LnUrlWithdrawRequest self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs @@ -6907,6 +7104,16 @@ class BreezSdkBindingsApiImpl extends BreezSdkBindingsApiImplPlatform implements } } + @protected + void sse_encode_opt_box_autoadd_ln_url_info(LnUrlInfo? self, SseSerializer serializer) { + // Codec=Sse (Serialization based), see doc to use other codecs + + sse_encode_bool(self != null, serializer); + if (self != null) { + sse_encode_box_autoadd_ln_url_info(self, serializer); + } + } + @protected void sse_encode_opt_box_autoadd_lsp_information(LspInformation? self, SseSerializer serializer) { // Codec=Sse (Serialization based), see doc to use other codecs @@ -7083,7 +7290,6 @@ class BreezSdkBindingsApiImpl extends BreezSdkBindingsApiImplPlatform implements sse_encode_u_64(self.feeMsat, serializer); sse_encode_payment_status(self.status, serializer); sse_encode_opt_String(self.error, serializer); - sse_encode_opt_String(self.description, serializer); sse_encode_payment_details(self.details, serializer); sse_encode_opt_String(self.metadata, serializer); } @@ -7209,7 +7415,6 @@ class BreezSdkBindingsApiImpl extends BreezSdkBindingsApiImplPlatform implements sse_encode_String(self.description, serializer); sse_encode_opt_list_prim_u_8_strict(self.preimage, serializer); sse_encode_opt_box_autoadd_opening_fee_params(self.openingFeeParams, serializer); - sse_encode_opt_box_autoadd_bool(self.useDescriptionHash, serializer); sse_encode_opt_box_autoadd_u_32(self.expiry, serializer); sse_encode_opt_box_autoadd_u_32(self.cltv, serializer); } diff --git a/libs/sdk-flutter/lib/generated/frb_generated.io.dart b/libs/sdk-flutter/lib/generated/frb_generated.io.dart index 4df28672b..61c516433 100644 --- a/libs/sdk-flutter/lib/generated/frb_generated.io.dart +++ b/libs/sdk-flutter/lib/generated/frb_generated.io.dart @@ -125,9 +125,15 @@ abstract class BreezSdkBindingsApiImplPlatform extends BaseApiImpl cst_encode_box_autoadd_ln_url_info(LnUrlInfo raw) { + // Codec=Cst (C-struct based), see doc to use other codecs + final ptr = wire.cst_new_box_autoadd_ln_url_info(); + cst_api_fill_to_wire_ln_url_info(raw, ptr.ref); + return ptr; + } + @protected ffi.Pointer cst_encode_box_autoadd_ln_url_pay_error_data( LnUrlPayErrorData raw, @@ -1549,6 +1605,14 @@ abstract class BreezSdkBindingsApiImplPlatform extends BaseApiImpl cst_encode_box_autoadd_ln_url_pay_info(LnUrlPayInfo raw) { + // Codec=Cst (C-struct based), see doc to use other codecs + final ptr = wire.cst_new_box_autoadd_ln_url_pay_info(); + cst_api_fill_to_wire_ln_url_pay_info(raw, ptr.ref); + return ptr; + } + @protected ffi.Pointer cst_encode_box_autoadd_ln_url_pay_request(LnUrlPayRequest raw) { // Codec=Cst (C-struct based), see doc to use other codecs @@ -1577,6 +1641,16 @@ abstract class BreezSdkBindingsApiImplPlatform extends BaseApiImpl cst_encode_box_autoadd_ln_url_withdraw_info( + LnUrlWithdrawInfo raw, + ) { + // Codec=Cst (C-struct based), see doc to use other codecs + final ptr = wire.cst_new_box_autoadd_ln_url_withdraw_info(); + cst_api_fill_to_wire_ln_url_withdraw_info(raw, ptr.ref); + return ptr; + } + @protected ffi.Pointer cst_encode_box_autoadd_ln_url_withdraw_request( LnUrlWithdrawRequest raw, @@ -2094,6 +2168,12 @@ abstract class BreezSdkBindingsApiImplPlatform extends BaseApiImpl cst_encode_opt_box_autoadd_ln_url_info(LnUrlInfo? raw) { + // Codec=Cst (C-struct based), see doc to use other codecs + return raw == null ? ffi.nullptr : cst_encode_box_autoadd_ln_url_info(raw); + } + @protected ffi.Pointer cst_encode_opt_box_autoadd_lsp_information(LspInformation? raw) { // Codec=Cst (C-struct based), see doc to use other codecs @@ -2417,6 +2497,14 @@ abstract class BreezSdkBindingsApiImplPlatform extends BaseApiImpl wireObj, + ) { + cst_api_fill_to_wire_ln_url_info(apiObj, wireObj.ref); + } + @protected void cst_api_fill_to_wire_box_autoadd_ln_url_pay_error_data( LnUrlPayErrorData apiObj, @@ -2425,6 +2513,14 @@ abstract class BreezSdkBindingsApiImplPlatform extends BaseApiImpl wireObj, + ) { + cst_api_fill_to_wire_ln_url_pay_info(apiObj, wireObj.ref); + } + @protected void cst_api_fill_to_wire_box_autoadd_ln_url_pay_request( LnUrlPayRequest apiObj, @@ -2449,6 +2545,14 @@ abstract class BreezSdkBindingsApiImplPlatform extends BaseApiImpl wireObj, + ) { + cst_api_fill_to_wire_ln_url_withdraw_info(apiObj, wireObj.ref); + } + @protected void cst_api_fill_to_wire_box_autoadd_ln_url_withdraw_request( LnUrlWithdrawRequest apiObj, @@ -2895,8 +2999,8 @@ abstract class BreezSdkBindingsApiImplPlatform extends BaseApiImpl Function()>(); + ffi.Pointer cst_new_box_autoadd_ln_url_info() { + return _cst_new_box_autoadd_ln_url_info(); + } + + late final _cst_new_box_autoadd_ln_url_infoPtr = + _lookup Function()>>( + 'frbgen_breez_sdk_cst_new_box_autoadd_ln_url_info', + ); + late final _cst_new_box_autoadd_ln_url_info = _cst_new_box_autoadd_ln_url_infoPtr + .asFunction Function()>(); + ffi.Pointer cst_new_box_autoadd_ln_url_pay_error_data() { return _cst_new_box_autoadd_ln_url_pay_error_data(); } @@ -5426,6 +5605,17 @@ class BreezSdkBindingsWire implements BaseWire { late final _cst_new_box_autoadd_ln_url_pay_error_data = _cst_new_box_autoadd_ln_url_pay_error_dataPtr .asFunction Function()>(); + ffi.Pointer cst_new_box_autoadd_ln_url_pay_info() { + return _cst_new_box_autoadd_ln_url_pay_info(); + } + + late final _cst_new_box_autoadd_ln_url_pay_infoPtr = + _lookup Function()>>( + 'frbgen_breez_sdk_cst_new_box_autoadd_ln_url_pay_info', + ); + late final _cst_new_box_autoadd_ln_url_pay_info = _cst_new_box_autoadd_ln_url_pay_infoPtr + .asFunction Function()>(); + ffi.Pointer cst_new_box_autoadd_ln_url_pay_request() { return _cst_new_box_autoadd_ln_url_pay_request(); } @@ -5459,6 +5649,17 @@ class BreezSdkBindingsWire implements BaseWire { late final _cst_new_box_autoadd_ln_url_pay_success_data = _cst_new_box_autoadd_ln_url_pay_success_dataPtr .asFunction Function()>(); + ffi.Pointer cst_new_box_autoadd_ln_url_withdraw_info() { + return _cst_new_box_autoadd_ln_url_withdraw_info(); + } + + late final _cst_new_box_autoadd_ln_url_withdraw_infoPtr = + _lookup Function()>>( + 'frbgen_breez_sdk_cst_new_box_autoadd_ln_url_withdraw_info', + ); + late final _cst_new_box_autoadd_ln_url_withdraw_info = _cst_new_box_autoadd_ln_url_withdraw_infoPtr + .asFunction Function()>(); + ffi.Pointer cst_new_box_autoadd_ln_url_withdraw_request() { return _cst_new_box_autoadd_ln_url_withdraw_request(); } @@ -6053,6 +6254,40 @@ final class wire_cst_list_prim_u_8_strict extends ffi.Struct { external int len; } +final class wire_cst_invoice_paid_details extends ffi.Struct { + external ffi.Pointer payment_hash; + + external ffi.Pointer payment_preimage; + + @ffi.Uint64() + external int amount_msat; +} + +final class wire_cst_BreezEvent_InvoicePaid extends ffi.Struct { + external ffi.Pointer details; +} + +final class wire_cst_LnUrlPayTarget_LnAddress extends ffi.Struct { + external ffi.Pointer address; +} + +final class wire_cst_LnUrlPayTarget_Domain extends ffi.Struct { + external ffi.Pointer domain; +} + +final class LnUrlPayTargetKind extends ffi.Union { + external wire_cst_LnUrlPayTarget_LnAddress LnAddress; + + external wire_cst_LnUrlPayTarget_Domain Domain; +} + +final class wire_cst_ln_url_pay_target extends ffi.Struct { + @ffi.Int32() + external int tag; + + external LnUrlPayTargetKind kind; +} + final class wire_cst_aes_success_action_data_decrypted extends ffi.Struct { external ffi.Pointer description; @@ -6120,6 +6355,41 @@ final class wire_cst_success_action_processed extends ffi.Struct { external SuccessActionProcessedKind kind; } +final class wire_cst_ln_url_pay_info extends ffi.Struct { + external wire_cst_ln_url_pay_target target; + + external ffi.Pointer metadata; + + external ffi.Pointer comment; + + external ffi.Pointer success_action; +} + +final class wire_cst_LnUrlInfo_Pay extends ffi.Struct { + external ffi.Pointer info; +} + +final class wire_cst_ln_url_withdraw_info extends ffi.Struct { + external ffi.Pointer endpoint; +} + +final class wire_cst_LnUrlInfo_Withdraw extends ffi.Struct { + external ffi.Pointer info; +} + +final class LnUrlInfoKind extends ffi.Union { + external wire_cst_LnUrlInfo_Pay Pay; + + external wire_cst_LnUrlInfo_Withdraw Withdraw; +} + +final class wire_cst_ln_url_info extends ffi.Struct { + @ffi.Int32() + external int tag; + + external LnUrlInfoKind kind; +} + final class wire_cst_list_String extends ffi.Struct { external ffi.Pointer> ptr; @@ -6233,17 +6503,9 @@ final class wire_cst_ln_payment_details extends ffi.Struct { external ffi.Pointer bolt11; - external ffi.Pointer lnurl_success_action; - - external ffi.Pointer lnurl_pay_domain; - - external ffi.Pointer lnurl_pay_comment; - - external ffi.Pointer ln_address; - - external ffi.Pointer lnurl_metadata; + external ffi.Pointer description; - external ffi.Pointer lnurl_withdraw_endpoint; + external ffi.Pointer lnurl_info; external ffi.Pointer swap_info; @@ -6302,25 +6564,11 @@ final class wire_cst_payment extends ffi.Struct { external ffi.Pointer error; - external ffi.Pointer description; - external wire_cst_payment_details details; external ffi.Pointer metadata; } -final class wire_cst_invoice_paid_details extends ffi.Struct { - external ffi.Pointer payment_hash; - - external ffi.Pointer bolt11; - - external ffi.Pointer payment; -} - -final class wire_cst_BreezEvent_InvoicePaid extends ffi.Struct { - external ffi.Pointer details; -} - final class wire_cst_BreezEvent_PaymentSucceed extends ffi.Struct { external ffi.Pointer details; } @@ -6712,8 +6960,6 @@ final class wire_cst_receive_payment_request extends ffi.Struct { external ffi.Pointer opening_fee_params; - external ffi.Pointer use_description_hash; - external ffi.Pointer expiry; external ffi.Pointer cltv; diff --git a/libs/sdk-flutter/lib/generated/models.dart b/libs/sdk-flutter/lib/generated/models.dart index b6cbd9e52..e45030c2a 100644 --- a/libs/sdk-flutter/lib/generated/models.dart +++ b/libs/sdk-flutter/lib/generated/models.dart @@ -324,25 +324,8 @@ class LnPaymentDetails { final String paymentPreimage; final bool keysend; final String bolt11; - - /// Only set for [PaymentType::Sent] payments that are part of a LNURL-pay workflow where - /// the endpoint returns a success action - final SuccessActionProcessed? lnurlSuccessAction; - - /// Only set for [PaymentType::Sent] payments if it is not a payment to a Lightning Address - final String? lnurlPayDomain; - - /// Only set for [PaymentType::Sent] payments if the user sent the comment using LNURL-pay - final String? lnurlPayComment; - - /// Only set for [PaymentType::Sent] payments that are sent to a Lightning Address - final String? lnAddress; - - /// Only set for [PaymentType::Sent] payments where the receiver endpoint returned LNURL metadata - final String? lnurlMetadata; - - /// Only set for [PaymentType::Received] payments that were received as part of LNURL-withdraw - final String? lnurlWithdrawEndpoint; + final String? description; + final LnUrlInfo? lnurlInfo; /// Only set for [PaymentType::Received] payments that were received in the context of a swap final SwapInfo? swapInfo; @@ -356,12 +339,8 @@ class LnPaymentDetails { required this.paymentPreimage, required this.keysend, required this.bolt11, - this.lnurlSuccessAction, - this.lnurlPayDomain, - this.lnurlPayComment, - this.lnAddress, - this.lnurlMetadata, - this.lnurlWithdrawEndpoint, + this.description, + this.lnurlInfo, this.swapInfo, this.reverseSwapInfo, }); @@ -373,12 +352,8 @@ class LnPaymentDetails { paymentPreimage.hashCode ^ keysend.hashCode ^ bolt11.hashCode ^ - lnurlSuccessAction.hashCode ^ - lnurlPayDomain.hashCode ^ - lnurlPayComment.hashCode ^ - lnAddress.hashCode ^ - lnurlMetadata.hashCode ^ - lnurlWithdrawEndpoint.hashCode ^ + description.hashCode ^ + lnurlInfo.hashCode ^ swapInfo.hashCode ^ reverseSwapInfo.hashCode; @@ -392,16 +367,64 @@ class LnPaymentDetails { paymentPreimage == other.paymentPreimage && keysend == other.keysend && bolt11 == other.bolt11 && - lnurlSuccessAction == other.lnurlSuccessAction && - lnurlPayDomain == other.lnurlPayDomain && - lnurlPayComment == other.lnurlPayComment && - lnAddress == other.lnAddress && - lnurlMetadata == other.lnurlMetadata && - lnurlWithdrawEndpoint == other.lnurlWithdrawEndpoint && + description == other.description && + lnurlInfo == other.lnurlInfo && swapInfo == other.swapInfo && reverseSwapInfo == other.reverseSwapInfo; } +@freezed +sealed class LnUrlInfo with _$LnUrlInfo { + const LnUrlInfo._(); + + const factory LnUrlInfo.pay({required LnUrlPayInfo info}) = LnUrlInfo_Pay; + const factory LnUrlInfo.withdraw({required LnUrlWithdrawInfo info}) = LnUrlInfo_Withdraw; +} + +class LnUrlPayInfo { + final LnUrlPayTarget target; + final String metadata; + final String? comment; + final SuccessActionProcessed? successAction; + + const LnUrlPayInfo({required this.target, required this.metadata, this.comment, this.successAction}); + + @override + int get hashCode => target.hashCode ^ metadata.hashCode ^ comment.hashCode ^ successAction.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is LnUrlPayInfo && + runtimeType == other.runtimeType && + target == other.target && + metadata == other.metadata && + comment == other.comment && + successAction == other.successAction; +} + +@freezed +sealed class LnUrlPayTarget with _$LnUrlPayTarget { + const LnUrlPayTarget._(); + + const factory LnUrlPayTarget.lnAddress({required String address}) = LnUrlPayTarget_LnAddress; + const factory LnUrlPayTarget.domain({required String domain}) = LnUrlPayTarget_Domain; +} + +class LnUrlWithdrawInfo { + final String endpoint; + + const LnUrlWithdrawInfo({required this.endpoint}); + + @override + int get hashCode => endpoint.hashCode; + + @override + bool operator ==(Object other) => + identical(this, other) || + other is LnUrlWithdrawInfo && runtimeType == other.runtimeType && endpoint == other.endpoint; +} + /// Internal SDK log entry class LogEntry { final String line; @@ -696,7 +719,6 @@ class Payment { final BigInt feeMsat; final PaymentStatus status; final String? error; - final String? description; final PaymentDetails details; final String? metadata; @@ -708,7 +730,6 @@ class Payment { required this.feeMsat, required this.status, this.error, - this.description, required this.details, this.metadata, }); @@ -722,7 +743,6 @@ class Payment { feeMsat.hashCode ^ status.hashCode ^ error.hashCode ^ - description.hashCode ^ details.hashCode ^ metadata.hashCode; @@ -738,7 +758,6 @@ class Payment { feeMsat == other.feeMsat && status == other.status && error == other.error && - description == other.description && details == other.details && metadata == other.metadata; } @@ -952,9 +971,6 @@ class ReceivePaymentRequest { /// Otherwise the default fee options will be used. final OpeningFeeParams? openingFeeParams; - /// If set to true, then the bolt11 invoice returned includes the description hash. - final bool? useDescriptionHash; - /// if specified, set the time the invoice is valid for, in seconds. final int? expiry; @@ -966,7 +982,6 @@ class ReceivePaymentRequest { required this.description, this.preimage, this.openingFeeParams, - this.useDescriptionHash, this.expiry, this.cltv, }); @@ -977,7 +992,6 @@ class ReceivePaymentRequest { description.hashCode ^ preimage.hashCode ^ openingFeeParams.hashCode ^ - useDescriptionHash.hashCode ^ expiry.hashCode ^ cltv.hashCode; @@ -990,7 +1004,6 @@ class ReceivePaymentRequest { description == other.description && preimage == other.preimage && openingFeeParams == other.openingFeeParams && - useDescriptionHash == other.useDescriptionHash && expiry == other.expiry && cltv == other.cltv; } diff --git a/libs/sdk-flutter/lib/generated/models.freezed.dart b/libs/sdk-flutter/lib/generated/models.freezed.dart index 1d36987c4..b43394398 100644 --- a/libs/sdk-flutter/lib/generated/models.freezed.dart +++ b/libs/sdk-flutter/lib/generated/models.freezed.dart @@ -12,6 +12,330 @@ part of 'models.dart'; // dart format off T _$identity(T value) => value; +/// @nodoc +mixin _$LnUrlInfo { + + Object get info; + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is LnUrlInfo&&const DeepCollectionEquality().equals(other.info, info)); +} + + +@override +int get hashCode => Object.hash(runtimeType,const DeepCollectionEquality().hash(info)); + +@override +String toString() { + return 'LnUrlInfo(info: $info)'; +} + + +} + +/// @nodoc +class $LnUrlInfoCopyWith<$Res> { +$LnUrlInfoCopyWith(LnUrlInfo _, $Res Function(LnUrlInfo) __); +} + + +/// @nodoc + + +class LnUrlInfo_Pay extends LnUrlInfo { + const LnUrlInfo_Pay({required this.info}): super._(); + + +@override final LnUrlPayInfo info; + +/// Create a copy of LnUrlInfo +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$LnUrlInfo_PayCopyWith get copyWith => _$LnUrlInfo_PayCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is LnUrlInfo_Pay&&(identical(other.info, info) || other.info == info)); +} + + +@override +int get hashCode => Object.hash(runtimeType,info); + +@override +String toString() { + return 'LnUrlInfo.pay(info: $info)'; +} + + +} + +/// @nodoc +abstract mixin class $LnUrlInfo_PayCopyWith<$Res> implements $LnUrlInfoCopyWith<$Res> { + factory $LnUrlInfo_PayCopyWith(LnUrlInfo_Pay value, $Res Function(LnUrlInfo_Pay) _then) = _$LnUrlInfo_PayCopyWithImpl; +@useResult +$Res call({ + LnUrlPayInfo info +}); + + + + +} +/// @nodoc +class _$LnUrlInfo_PayCopyWithImpl<$Res> + implements $LnUrlInfo_PayCopyWith<$Res> { + _$LnUrlInfo_PayCopyWithImpl(this._self, this._then); + + final LnUrlInfo_Pay _self; + final $Res Function(LnUrlInfo_Pay) _then; + +/// Create a copy of LnUrlInfo +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? info = null,}) { + return _then(LnUrlInfo_Pay( +info: null == info ? _self.info : info // ignore: cast_nullable_to_non_nullable +as LnUrlPayInfo, + )); +} + + +} + +/// @nodoc + + +class LnUrlInfo_Withdraw extends LnUrlInfo { + const LnUrlInfo_Withdraw({required this.info}): super._(); + + +@override final LnUrlWithdrawInfo info; + +/// Create a copy of LnUrlInfo +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$LnUrlInfo_WithdrawCopyWith get copyWith => _$LnUrlInfo_WithdrawCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is LnUrlInfo_Withdraw&&(identical(other.info, info) || other.info == info)); +} + + +@override +int get hashCode => Object.hash(runtimeType,info); + +@override +String toString() { + return 'LnUrlInfo.withdraw(info: $info)'; +} + + +} + +/// @nodoc +abstract mixin class $LnUrlInfo_WithdrawCopyWith<$Res> implements $LnUrlInfoCopyWith<$Res> { + factory $LnUrlInfo_WithdrawCopyWith(LnUrlInfo_Withdraw value, $Res Function(LnUrlInfo_Withdraw) _then) = _$LnUrlInfo_WithdrawCopyWithImpl; +@useResult +$Res call({ + LnUrlWithdrawInfo info +}); + + + + +} +/// @nodoc +class _$LnUrlInfo_WithdrawCopyWithImpl<$Res> + implements $LnUrlInfo_WithdrawCopyWith<$Res> { + _$LnUrlInfo_WithdrawCopyWithImpl(this._self, this._then); + + final LnUrlInfo_Withdraw _self; + final $Res Function(LnUrlInfo_Withdraw) _then; + +/// Create a copy of LnUrlInfo +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? info = null,}) { + return _then(LnUrlInfo_Withdraw( +info: null == info ? _self.info : info // ignore: cast_nullable_to_non_nullable +as LnUrlWithdrawInfo, + )); +} + + +} + +/// @nodoc +mixin _$LnUrlPayTarget { + + + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is LnUrlPayTarget); +} + + +@override +int get hashCode => runtimeType.hashCode; + +@override +String toString() { + return 'LnUrlPayTarget()'; +} + + +} + +/// @nodoc +class $LnUrlPayTargetCopyWith<$Res> { +$LnUrlPayTargetCopyWith(LnUrlPayTarget _, $Res Function(LnUrlPayTarget) __); +} + + +/// @nodoc + + +class LnUrlPayTarget_LnAddress extends LnUrlPayTarget { + const LnUrlPayTarget_LnAddress({required this.address}): super._(); + + + final String address; + +/// Create a copy of LnUrlPayTarget +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$LnUrlPayTarget_LnAddressCopyWith get copyWith => _$LnUrlPayTarget_LnAddressCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is LnUrlPayTarget_LnAddress&&(identical(other.address, address) || other.address == address)); +} + + +@override +int get hashCode => Object.hash(runtimeType,address); + +@override +String toString() { + return 'LnUrlPayTarget.lnAddress(address: $address)'; +} + + +} + +/// @nodoc +abstract mixin class $LnUrlPayTarget_LnAddressCopyWith<$Res> implements $LnUrlPayTargetCopyWith<$Res> { + factory $LnUrlPayTarget_LnAddressCopyWith(LnUrlPayTarget_LnAddress value, $Res Function(LnUrlPayTarget_LnAddress) _then) = _$LnUrlPayTarget_LnAddressCopyWithImpl; +@useResult +$Res call({ + String address +}); + + + + +} +/// @nodoc +class _$LnUrlPayTarget_LnAddressCopyWithImpl<$Res> + implements $LnUrlPayTarget_LnAddressCopyWith<$Res> { + _$LnUrlPayTarget_LnAddressCopyWithImpl(this._self, this._then); + + final LnUrlPayTarget_LnAddress _self; + final $Res Function(LnUrlPayTarget_LnAddress) _then; + +/// Create a copy of LnUrlPayTarget +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? address = null,}) { + return _then(LnUrlPayTarget_LnAddress( +address: null == address ? _self.address : address // ignore: cast_nullable_to_non_nullable +as String, + )); +} + + +} + +/// @nodoc + + +class LnUrlPayTarget_Domain extends LnUrlPayTarget { + const LnUrlPayTarget_Domain({required this.domain}): super._(); + + + final String domain; + +/// Create a copy of LnUrlPayTarget +/// with the given fields replaced by the non-null parameter values. +@JsonKey(includeFromJson: false, includeToJson: false) +@pragma('vm:prefer-inline') +$LnUrlPayTarget_DomainCopyWith get copyWith => _$LnUrlPayTarget_DomainCopyWithImpl(this, _$identity); + + + +@override +bool operator ==(Object other) { + return identical(this, other) || (other.runtimeType == runtimeType&&other is LnUrlPayTarget_Domain&&(identical(other.domain, domain) || other.domain == domain)); +} + + +@override +int get hashCode => Object.hash(runtimeType,domain); + +@override +String toString() { + return 'LnUrlPayTarget.domain(domain: $domain)'; +} + + +} + +/// @nodoc +abstract mixin class $LnUrlPayTarget_DomainCopyWith<$Res> implements $LnUrlPayTargetCopyWith<$Res> { + factory $LnUrlPayTarget_DomainCopyWith(LnUrlPayTarget_Domain value, $Res Function(LnUrlPayTarget_Domain) _then) = _$LnUrlPayTarget_DomainCopyWithImpl; +@useResult +$Res call({ + String domain +}); + + + + +} +/// @nodoc +class _$LnUrlPayTarget_DomainCopyWithImpl<$Res> + implements $LnUrlPayTarget_DomainCopyWith<$Res> { + _$LnUrlPayTarget_DomainCopyWithImpl(this._self, this._then); + + final LnUrlPayTarget_Domain _self; + final $Res Function(LnUrlPayTarget_Domain) _then; + +/// Create a copy of LnUrlPayTarget +/// with the given fields replaced by the non-null parameter values. +@pragma('vm:prefer-inline') $Res call({Object? domain = null,}) { + return _then(LnUrlPayTarget_Domain( +domain: null == domain ? _self.domain : domain // ignore: cast_nullable_to_non_nullable +as String, + )); +} + + +} + /// @nodoc mixin _$PaymentDetails { diff --git a/libs/sdk-itest/tests/node.rs b/libs/sdk-itest/tests/node.rs index 2f0b5d0e4..51eec8abc 100644 --- a/libs/sdk-itest/tests/node.rs +++ b/libs/sdk-itest/tests/node.rs @@ -111,10 +111,10 @@ async fn test_node_receive_payments() { assert_eq!(payment.amount_msat, huge_amount_msat - opening_fee_msat); assert_eq!(payment.fee_msat, opening_fee_msat); assert_eq!(payment.payment_type, PaymentType::Received); - assert_eq!(payment.description.unwrap(), "Init"); if let PaymentDetails::Ln { data } = &payment.details { assert_eq!(data.bolt11, invoice.bolt11); assert_eq!(data.destination_pubkey, node_pubkey); + assert_eq!(data.description, "Init"); } else { panic!("Expected LN payment details"); } @@ -148,10 +148,10 @@ async fn test_node_receive_payments() { assert_eq!(payment.amount_msat, small_amount_msat); assert_eq!(payment.fee_msat, 0); assert_eq!(payment.payment_type, PaymentType::Received); - assert_eq!(payment.description.unwrap(), "small"); if let PaymentDetails::Ln { data } = &payment.details { assert_eq!(data.bolt11, invoice.bolt11); assert_eq!(data.destination_pubkey, node_pubkey); + assert_eq!(data.description, "small"); } else { panic!("Expected LN payment details"); } @@ -253,12 +253,12 @@ async fn test_node_receive_payments() { PaymentStatus::Pending | PaymentStatus::Complete )); - let payment = sent_payment.await.unwrap().unwrap().payment; - assert_eq!(payment.status, PaymentStatus::Complete); - assert_eq!(payment.amount_msat, amount.to_msat()); - assert_eq!(payment.fee_msat, 1000); + let sent_payment = sent_payment.await.unwrap().unwrap().payment; + assert_eq!(sent_payment.status, PaymentStatus::Complete); + assert_eq!(sent_payment.amount_msat, amount.to_msat()); + assert_eq!(sent_payment.fee_msat, 1000); assert!(matches!( - payment.details, + sent_payment.details, PaymentDetails::Ln { data: LnPaymentDetails { keysend: false, .. } } @@ -270,14 +270,15 @@ async fn test_node_receive_payments() { )); let payments = services.list_payments(Default::default()).await.unwrap(); assert_eq!(payments.len(), 3); - let payment = payments.first().cloned().unwrap(); + let payment = payments.first().unwrap(); + assert_eq!(&sent_payment, payment); assert_eq!(payment.payment_type, PaymentType::Sent); assert_eq!(payment.amount_msat, amount.to_msat()); assert_eq!(payment.fee_msat, 1000); - assert_eq!(payment.description.unwrap(), "LND"); if let PaymentDetails::Ln { data } = &payment.details { assert_eq!(data.bolt11, bolt11); assert_eq!(data.destination_pubkey, lnd_pubkey); + assert_eq!(data.description, "LND"); } else { panic!("Expected LN payment details"); } @@ -315,10 +316,10 @@ async fn test_node_receive_payments() { assert_eq!(payment.payment_type, PaymentType::Sent); assert_eq!(payment.amount_msat, amount.to_msat()); assert_eq!(payment.fee_msat, 1000); - assert_eq!(payment.description.unwrap(), "LND"); if let PaymentDetails::Ln { data } = &payment.details { assert_eq!(data.bolt11, bolt11); assert_eq!(data.destination_pubkey, lnd_pubkey); + assert_eq!(data.description, "LND"); } else { panic!("Expected LN payment details"); } @@ -363,10 +364,10 @@ async fn test_node_receive_payments() { data: LnPaymentDetails { keysend: true, .. } } )); - assert!(payment.description.is_none()); if let PaymentDetails::Ln { data } = &payment.details { assert_eq!(data.bolt11, ""); assert_eq!(data.destination_pubkey, ""); + assert_eq!(data.description, ""); } else { panic!("Expected LN payment details"); } diff --git a/libs/sdk-react-native/android/src/main/java/com/breezsdk/BreezSDKMapper.kt b/libs/sdk-react-native/android/src/main/java/com/breezsdk/BreezSDKMapper.kt index 6a3230cbd..e8fefa55a 100644 --- a/libs/sdk-react-native/android/src/main/java/com/breezsdk/BreezSDKMapper.kt +++ b/libs/sdk-react-native/android/src/main/java/com/breezsdk/BreezSDKMapper.kt @@ -575,23 +575,24 @@ fun asInvoicePaidDetails(invoicePaidDetails: ReadableMap): InvoicePaidDetails? { invoicePaidDetails, arrayOf( "paymentHash", - "bolt11", + "paymentPreimage", + "amountMsat", ), ) ) { return null } val paymentHash = invoicePaidDetails.getString("paymentHash")!! - val bolt11 = invoicePaidDetails.getString("bolt11")!! - val payment = if (hasNonNullKey(invoicePaidDetails, "payment")) invoicePaidDetails.getMap("payment")?.let { asPayment(it) } else null - return InvoicePaidDetails(paymentHash, bolt11, payment) + val paymentPreimage = invoicePaidDetails.getString("paymentPreimage")!! + val amountMsat = invoicePaidDetails.getDouble("amountMsat").toULong() + return InvoicePaidDetails(paymentHash, paymentPreimage, amountMsat) } fun readableMapOf(invoicePaidDetails: InvoicePaidDetails): ReadableMap = readableMapOf( "paymentHash" to invoicePaidDetails.paymentHash, - "bolt11" to invoicePaidDetails.bolt11, - "payment" to invoicePaidDetails.payment?.let { readableMapOf(it) }, + "paymentPreimage" to invoicePaidDetails.paymentPreimage, + "amountMsat" to invoicePaidDetails.amountMsat, ) fun asInvoicePaidDetailsList(arr: ReadableArray): List { @@ -871,6 +872,7 @@ fun asLnPaymentDetails(lnPaymentDetails: ReadableMap): LnPaymentDetails? { "paymentPreimage", "keysend", "bolt11", + "description", ), ) ) { @@ -881,25 +883,14 @@ fun asLnPaymentDetails(lnPaymentDetails: ReadableMap): LnPaymentDetails? { val paymentPreimage = lnPaymentDetails.getString("paymentPreimage")!! val keysend = lnPaymentDetails.getBoolean("keysend") val bolt11 = lnPaymentDetails.getString("bolt11")!! - val lnurlSuccessAction = - if (hasNonNullKey(lnPaymentDetails, "lnurlSuccessAction")) { - lnPaymentDetails.getMap("lnurlSuccessAction")?.let { - asSuccessActionProcessed(it) - } - } else { - null - } - val lnurlPayDomain = if (hasNonNullKey(lnPaymentDetails, "lnurlPayDomain")) lnPaymentDetails.getString("lnurlPayDomain") else null - val lnurlPayComment = if (hasNonNullKey(lnPaymentDetails, "lnurlPayComment")) lnPaymentDetails.getString("lnurlPayComment") else null - val lnurlMetadata = if (hasNonNullKey(lnPaymentDetails, "lnurlMetadata")) lnPaymentDetails.getString("lnurlMetadata") else null - val lnAddress = if (hasNonNullKey(lnPaymentDetails, "lnAddress")) lnPaymentDetails.getString("lnAddress") else null - val lnurlWithdrawEndpoint = + val description = lnPaymentDetails.getString("description")!! + val lnurlInfo = if (hasNonNullKey( lnPaymentDetails, - "lnurlWithdrawEndpoint", + "lnurlInfo", ) ) { - lnPaymentDetails.getString("lnurlWithdrawEndpoint") + lnPaymentDetails.getMap("lnurlInfo")?.let { asLnUrlInfo(it) } } else { null } @@ -918,12 +909,8 @@ fun asLnPaymentDetails(lnPaymentDetails: ReadableMap): LnPaymentDetails? { paymentPreimage, keysend, bolt11, - lnurlSuccessAction, - lnurlPayDomain, - lnurlPayComment, - lnurlMetadata, - lnAddress, - lnurlWithdrawEndpoint, + description, + lnurlInfo, swapInfo, reverseSwapInfo, ) @@ -936,12 +923,8 @@ fun readableMapOf(lnPaymentDetails: LnPaymentDetails): ReadableMap = "paymentPreimage" to lnPaymentDetails.paymentPreimage, "keysend" to lnPaymentDetails.keysend, "bolt11" to lnPaymentDetails.bolt11, - "lnurlSuccessAction" to lnPaymentDetails.lnurlSuccessAction?.let { readableMapOf(it) }, - "lnurlPayDomain" to lnPaymentDetails.lnurlPayDomain, - "lnurlPayComment" to lnPaymentDetails.lnurlPayComment, - "lnurlMetadata" to lnPaymentDetails.lnurlMetadata, - "lnAddress" to lnPaymentDetails.lnAddress, - "lnurlWithdrawEndpoint" to lnPaymentDetails.lnurlWithdrawEndpoint, + "description" to lnPaymentDetails.description, + "lnurlInfo" to lnPaymentDetails.lnurlInfo?.let { readableMapOf(it) }, "swapInfo" to lnPaymentDetails.swapInfo?.let { readableMapOf(it) }, "reverseSwapInfo" to lnPaymentDetails.reverseSwapInfo?.let { readableMapOf(it) }, ) @@ -1058,6 +1041,50 @@ fun asLnUrlPayErrorDataList(arr: ReadableArray): List { return list } +fun asLnUrlPayInfo(lnUrlPayInfo: ReadableMap): LnUrlPayInfo? { + if (!validateMandatoryFields( + lnUrlPayInfo, + arrayOf( + "target", + "metadata", + ), + ) + ) { + return null + } + val target = lnUrlPayInfo.getMap("target")?.let { asLnUrlPayTarget(it) }!! + val metadata = lnUrlPayInfo.getString("metadata")!! + val comment = if (hasNonNullKey(lnUrlPayInfo, "comment")) lnUrlPayInfo.getString("comment") else null + val successAction = + if (hasNonNullKey(lnUrlPayInfo, "successAction")) { + lnUrlPayInfo.getMap("successAction")?.let { + asSuccessActionProcessed(it) + } + } else { + null + } + return LnUrlPayInfo(target, metadata, comment, successAction) +} + +fun readableMapOf(lnUrlPayInfo: LnUrlPayInfo): ReadableMap = + readableMapOf( + "target" to readableMapOf(lnUrlPayInfo.target), + "metadata" to lnUrlPayInfo.metadata, + "comment" to lnUrlPayInfo.comment, + "successAction" to lnUrlPayInfo.successAction?.let { readableMapOf(it) }, + ) + +fun asLnUrlPayInfoList(arr: ReadableArray): List { + val list = ArrayList() + for (value in arr.toArrayList()) { + when (value) { + is ReadableMap -> list.add(asLnUrlPayInfo(value)!!) + else -> throw SdkException.Generic(errUnexpectedType("${value::class.java.name}")) + } + } + return list +} + fun asLnUrlPayRequest(lnUrlPayRequest: ReadableMap): LnUrlPayRequest? { if (!validateMandatoryFields( lnUrlPayRequest, @@ -1207,6 +1234,36 @@ fun asLnUrlPaySuccessDataList(arr: ReadableArray): List { return list } +fun asLnUrlWithdrawInfo(lnUrlWithdrawInfo: ReadableMap): LnUrlWithdrawInfo? { + if (!validateMandatoryFields( + lnUrlWithdrawInfo, + arrayOf( + "endpoint", + ), + ) + ) { + return null + } + val endpoint = lnUrlWithdrawInfo.getString("endpoint")!! + return LnUrlWithdrawInfo(endpoint) +} + +fun readableMapOf(lnUrlWithdrawInfo: LnUrlWithdrawInfo): ReadableMap = + readableMapOf( + "endpoint" to lnUrlWithdrawInfo.endpoint, + ) + +fun asLnUrlWithdrawInfoList(arr: ReadableArray): List { + val list = ArrayList() + for (value in arr.toArrayList()) { + when (value) { + is ReadableMap -> list.add(asLnUrlWithdrawInfo(value)!!) + else -> throw SdkException.Generic(errUnexpectedType("${value::class.java.name}")) + } + } + return list +} + fun asLnUrlWithdrawRequest(lnUrlWithdrawRequest: ReadableMap): LnUrlWithdrawRequest? { if (!validateMandatoryFields( lnUrlWithdrawRequest, @@ -1931,10 +1988,9 @@ fun asPayment(payment: ReadableMap): Payment? { val feeMsat = payment.getDouble("feeMsat").toULong() val status = payment.getString("status")?.let { asPaymentStatus(it) }!! val error = if (hasNonNullKey(payment, "error")) payment.getString("error") else null - val description = if (hasNonNullKey(payment, "description")) payment.getString("description") else null val details = payment.getMap("details")?.let { asPaymentDetails(it) }!! val metadata = if (hasNonNullKey(payment, "metadata")) payment.getString("metadata") else null - return Payment(id, paymentType, paymentTime, amountMsat, feeMsat, status, error, description, details, metadata) + return Payment(id, paymentType, paymentTime, amountMsat, feeMsat, status, error, details, metadata) } fun readableMapOf(payment: Payment): ReadableMap = @@ -1946,7 +2002,6 @@ fun readableMapOf(payment: Payment): ReadableMap = "feeMsat" to payment.feeMsat, "status" to snakeToLowerCamelCase(payment.status.name), "error" to payment.error, - "description" to payment.description, "details" to readableMapOf(payment.details), "metadata" to payment.metadata, ) @@ -3781,6 +3836,47 @@ fun asLnUrlCallbackStatusList(arr: ReadableArray): List { return list } +fun asLnUrlInfo(lnUrlInfo: ReadableMap): LnUrlInfo? { + val type = lnUrlInfo.getString("type") + + if (type == "pay") { + val info = lnUrlInfo.getMap("info")?.let { asLnUrlPayInfo(it) }!! + return LnUrlInfo.Pay(info) + } + if (type == "withdraw") { + val info = lnUrlInfo.getMap("info")?.let { asLnUrlWithdrawInfo(it) }!! + return LnUrlInfo.Withdraw(info) + } + return null +} + +fun readableMapOf(lnUrlInfo: LnUrlInfo): ReadableMap? { + val map = Arguments.createMap() + when (lnUrlInfo) { + is LnUrlInfo.Pay -> { + pushToMap(map, "type", "pay") + pushToMap(map, "info", readableMapOf(lnUrlInfo.info)) + } + + is LnUrlInfo.Withdraw -> { + pushToMap(map, "type", "withdraw") + pushToMap(map, "info", readableMapOf(lnUrlInfo.info)) + } + } + return map +} + +fun asLnUrlInfoList(arr: ReadableArray): List { + val list = ArrayList() + for (value in arr.toArrayList()) { + when (value) { + is ReadableMap -> list.add(asLnUrlInfo(value)!!) + else -> throw SdkException.Generic(errUnexpectedType("${value::class.java.name}")) + } + } + return list +} + fun asLnUrlPayResult(lnUrlPayResult: ReadableMap): LnUrlPayResult? { val type = lnUrlPayResult.getString("type") @@ -3831,6 +3927,47 @@ fun asLnUrlPayResultList(arr: ReadableArray): List { return list } +fun asLnUrlPayTarget(lnUrlPayTarget: ReadableMap): LnUrlPayTarget? { + val type = lnUrlPayTarget.getString("type") + + if (type == "lnAddress") { + val address = lnUrlPayTarget.getString("address")!! + return LnUrlPayTarget.LnAddress(address) + } + if (type == "domain") { + val domain = lnUrlPayTarget.getString("domain")!! + return LnUrlPayTarget.Domain(domain) + } + return null +} + +fun readableMapOf(lnUrlPayTarget: LnUrlPayTarget): ReadableMap? { + val map = Arguments.createMap() + when (lnUrlPayTarget) { + is LnUrlPayTarget.LnAddress -> { + pushToMap(map, "type", "lnAddress") + pushToMap(map, "address", lnUrlPayTarget.address) + } + + is LnUrlPayTarget.Domain -> { + pushToMap(map, "type", "domain") + pushToMap(map, "domain", lnUrlPayTarget.domain) + } + } + return map +} + +fun asLnUrlPayTargetList(arr: ReadableArray): List { + val list = ArrayList() + for (value in arr.toArrayList()) { + when (value) { + is ReadableMap -> list.add(asLnUrlPayTarget(value)!!) + else -> throw SdkException.Generic(errUnexpectedType("${value::class.java.name}")) + } + } + return list +} + fun asLnUrlWithdrawResult(lnUrlWithdrawResult: ReadableMap): LnUrlWithdrawResult? { val type = lnUrlWithdrawResult.getString("type") diff --git a/libs/sdk-react-native/ios/BreezSDKMapper.swift b/libs/sdk-react-native/ios/BreezSDKMapper.swift index 71c3f2755..fde454934 100644 --- a/libs/sdk-react-native/ios/BreezSDKMapper.swift +++ b/libs/sdk-react-native/ios/BreezSDKMapper.swift @@ -649,22 +649,21 @@ enum BreezSDKMapper { guard let paymentHash = invoicePaidDetails["paymentHash"] as? String else { throw SdkError.Generic(message: errMissingMandatoryField(fieldName: "paymentHash", typeName: "InvoicePaidDetails")) } - guard let bolt11 = invoicePaidDetails["bolt11"] as? String else { - throw SdkError.Generic(message: errMissingMandatoryField(fieldName: "bolt11", typeName: "InvoicePaidDetails")) + guard let paymentPreimage = invoicePaidDetails["paymentPreimage"] as? String else { + throw SdkError.Generic(message: errMissingMandatoryField(fieldName: "paymentPreimage", typeName: "InvoicePaidDetails")) } - var payment: Payment? - if let paymentTmp = invoicePaidDetails["payment"] as? [String: Any?] { - payment = try asPayment(payment: paymentTmp) + guard let amountMsat = invoicePaidDetails["amountMsat"] as? UInt64 else { + throw SdkError.Generic(message: errMissingMandatoryField(fieldName: "amountMsat", typeName: "InvoicePaidDetails")) } - return InvoicePaidDetails(paymentHash: paymentHash, bolt11: bolt11, payment: payment) + return InvoicePaidDetails(paymentHash: paymentHash, paymentPreimage: paymentPreimage, amountMsat: amountMsat) } static func dictionaryOf(invoicePaidDetails: InvoicePaidDetails) -> [String: Any?] { return [ "paymentHash": invoicePaidDetails.paymentHash, - "bolt11": invoicePaidDetails.bolt11, - "payment": invoicePaidDetails.payment == nil ? nil : dictionaryOf(payment: invoicePaidDetails.payment!), + "paymentPreimage": invoicePaidDetails.paymentPreimage, + "amountMsat": invoicePaidDetails.amountMsat, ] } @@ -1046,46 +1045,14 @@ enum BreezSDKMapper { guard let bolt11 = lnPaymentDetails["bolt11"] as? String else { throw SdkError.Generic(message: errMissingMandatoryField(fieldName: "bolt11", typeName: "LnPaymentDetails")) } - var lnurlSuccessAction: SuccessActionProcessed? - if let lnurlSuccessActionTmp = lnPaymentDetails["lnurlSuccessAction"] as? [String: Any?] { - lnurlSuccessAction = try asSuccessActionProcessed(successActionProcessed: lnurlSuccessActionTmp) + guard let description = lnPaymentDetails["description"] as? String else { + throw SdkError.Generic(message: errMissingMandatoryField(fieldName: "description", typeName: "LnPaymentDetails")) } - - var lnurlPayDomain: String? - if hasNonNilKey(data: lnPaymentDetails, key: "lnurlPayDomain") { - guard let lnurlPayDomainTmp = lnPaymentDetails["lnurlPayDomain"] as? String else { - throw SdkError.Generic(message: errUnexpectedValue(fieldName: "lnurlPayDomain")) - } - lnurlPayDomain = lnurlPayDomainTmp - } - var lnurlPayComment: String? - if hasNonNilKey(data: lnPaymentDetails, key: "lnurlPayComment") { - guard let lnurlPayCommentTmp = lnPaymentDetails["lnurlPayComment"] as? String else { - throw SdkError.Generic(message: errUnexpectedValue(fieldName: "lnurlPayComment")) - } - lnurlPayComment = lnurlPayCommentTmp - } - var lnurlMetadata: String? - if hasNonNilKey(data: lnPaymentDetails, key: "lnurlMetadata") { - guard let lnurlMetadataTmp = lnPaymentDetails["lnurlMetadata"] as? String else { - throw SdkError.Generic(message: errUnexpectedValue(fieldName: "lnurlMetadata")) - } - lnurlMetadata = lnurlMetadataTmp - } - var lnAddress: String? - if hasNonNilKey(data: lnPaymentDetails, key: "lnAddress") { - guard let lnAddressTmp = lnPaymentDetails["lnAddress"] as? String else { - throw SdkError.Generic(message: errUnexpectedValue(fieldName: "lnAddress")) - } - lnAddress = lnAddressTmp - } - var lnurlWithdrawEndpoint: String? - if hasNonNilKey(data: lnPaymentDetails, key: "lnurlWithdrawEndpoint") { - guard let lnurlWithdrawEndpointTmp = lnPaymentDetails["lnurlWithdrawEndpoint"] as? String else { - throw SdkError.Generic(message: errUnexpectedValue(fieldName: "lnurlWithdrawEndpoint")) - } - lnurlWithdrawEndpoint = lnurlWithdrawEndpointTmp + var lnurlInfo: LnUrlInfo? + if let lnurlInfoTmp = lnPaymentDetails["lnurlInfo"] as? [String: Any?] { + lnurlInfo = try asLnUrlInfo(lnUrlInfo: lnurlInfoTmp) } + var swapInfo: SwapInfo? if let swapInfoTmp = lnPaymentDetails["swapInfo"] as? [String: Any?] { swapInfo = try asSwapInfo(swapInfo: swapInfoTmp) @@ -1096,7 +1063,7 @@ enum BreezSDKMapper { reverseSwapInfo = try asReverseSwapInfo(reverseSwapInfo: reverseSwapInfoTmp) } - return LnPaymentDetails(paymentHash: paymentHash, destinationPubkey: destinationPubkey, paymentPreimage: paymentPreimage, keysend: keysend, bolt11: bolt11, lnurlSuccessAction: lnurlSuccessAction, lnurlPayDomain: lnurlPayDomain, lnurlPayComment: lnurlPayComment, lnurlMetadata: lnurlMetadata, lnAddress: lnAddress, lnurlWithdrawEndpoint: lnurlWithdrawEndpoint, swapInfo: swapInfo, reverseSwapInfo: reverseSwapInfo) + return LnPaymentDetails(paymentHash: paymentHash, destinationPubkey: destinationPubkey, paymentPreimage: paymentPreimage, keysend: keysend, bolt11: bolt11, description: description, lnurlInfo: lnurlInfo, swapInfo: swapInfo, reverseSwapInfo: reverseSwapInfo) } static func dictionaryOf(lnPaymentDetails: LnPaymentDetails) -> [String: Any?] { @@ -1106,12 +1073,8 @@ enum BreezSDKMapper { "paymentPreimage": lnPaymentDetails.paymentPreimage, "keysend": lnPaymentDetails.keysend, "bolt11": lnPaymentDetails.bolt11, - "lnurlSuccessAction": lnPaymentDetails.lnurlSuccessAction == nil ? nil : dictionaryOf(successActionProcessed: lnPaymentDetails.lnurlSuccessAction!), - "lnurlPayDomain": lnPaymentDetails.lnurlPayDomain == nil ? nil : lnPaymentDetails.lnurlPayDomain, - "lnurlPayComment": lnPaymentDetails.lnurlPayComment == nil ? nil : lnPaymentDetails.lnurlPayComment, - "lnurlMetadata": lnPaymentDetails.lnurlMetadata == nil ? nil : lnPaymentDetails.lnurlMetadata, - "lnAddress": lnPaymentDetails.lnAddress == nil ? nil : lnPaymentDetails.lnAddress, - "lnurlWithdrawEndpoint": lnPaymentDetails.lnurlWithdrawEndpoint == nil ? nil : lnPaymentDetails.lnurlWithdrawEndpoint, + "description": lnPaymentDetails.description, + "lnurlInfo": lnPaymentDetails.lnurlInfo == nil ? nil : dictionaryOf(lnUrlInfo: lnPaymentDetails.lnurlInfo!), "swapInfo": lnPaymentDetails.swapInfo == nil ? nil : dictionaryOf(swapInfo: lnPaymentDetails.swapInfo!), "reverseSwapInfo": lnPaymentDetails.reverseSwapInfo == nil ? nil : dictionaryOf(reverseSwapInfo: lnPaymentDetails.reverseSwapInfo!), ] @@ -1247,6 +1210,56 @@ enum BreezSDKMapper { return lnUrlPayErrorDataList.map { v -> [String: Any?] in return dictionaryOf(lnUrlPayErrorData: v) } } + static func asLnUrlPayInfo(lnUrlPayInfo: [String: Any?]) throws -> LnUrlPayInfo { + guard let targetTmp = lnUrlPayInfo["target"] as? [String: Any?] else { + throw SdkError.Generic(message: errMissingMandatoryField(fieldName: "target", typeName: "LnUrlPayInfo")) + } + let target = try asLnUrlPayTarget(lnUrlPayTarget: targetTmp) + + guard let metadata = lnUrlPayInfo["metadata"] as? String else { + throw SdkError.Generic(message: errMissingMandatoryField(fieldName: "metadata", typeName: "LnUrlPayInfo")) + } + var comment: String? + if hasNonNilKey(data: lnUrlPayInfo, key: "comment") { + guard let commentTmp = lnUrlPayInfo["comment"] as? String else { + throw SdkError.Generic(message: errUnexpectedValue(fieldName: "comment")) + } + comment = commentTmp + } + var successAction: SuccessActionProcessed? + if let successActionTmp = lnUrlPayInfo["successAction"] as? [String: Any?] { + successAction = try asSuccessActionProcessed(successActionProcessed: successActionTmp) + } + + return LnUrlPayInfo(target: target, metadata: metadata, comment: comment, successAction: successAction) + } + + static func dictionaryOf(lnUrlPayInfo: LnUrlPayInfo) -> [String: Any?] { + return [ + "target": dictionaryOf(lnUrlPayTarget: lnUrlPayInfo.target), + "metadata": lnUrlPayInfo.metadata, + "comment": lnUrlPayInfo.comment == nil ? nil : lnUrlPayInfo.comment, + "successAction": lnUrlPayInfo.successAction == nil ? nil : dictionaryOf(successActionProcessed: lnUrlPayInfo.successAction!), + ] + } + + static func asLnUrlPayInfoList(arr: [Any]) throws -> [LnUrlPayInfo] { + var list = [LnUrlPayInfo]() + for value in arr { + if let val = value as? [String: Any?] { + var lnUrlPayInfo = try asLnUrlPayInfo(lnUrlPayInfo: val) + list.append(lnUrlPayInfo) + } else { + throw SdkError.Generic(message: errUnexpectedType(typeName: "LnUrlPayInfo")) + } + } + return list + } + + static func arrayOf(lnUrlPayInfoList: [LnUrlPayInfo]) -> [Any] { + return lnUrlPayInfoList.map { v -> [String: Any?] in return dictionaryOf(lnUrlPayInfo: v) } + } + static func asLnUrlPayRequest(lnUrlPayRequest: [String: Any?]) throws -> LnUrlPayRequest { guard let dataTmp = lnUrlPayRequest["data"] as? [String: Any?] else { throw SdkError.Generic(message: errMissingMandatoryField(fieldName: "data", typeName: "LnUrlPayRequest")) @@ -1417,6 +1430,37 @@ enum BreezSDKMapper { return lnUrlPaySuccessDataList.map { v -> [String: Any?] in return dictionaryOf(lnUrlPaySuccessData: v) } } + static func asLnUrlWithdrawInfo(lnUrlWithdrawInfo: [String: Any?]) throws -> LnUrlWithdrawInfo { + guard let endpoint = lnUrlWithdrawInfo["endpoint"] as? String else { + throw SdkError.Generic(message: errMissingMandatoryField(fieldName: "endpoint", typeName: "LnUrlWithdrawInfo")) + } + + return LnUrlWithdrawInfo(endpoint: endpoint) + } + + static func dictionaryOf(lnUrlWithdrawInfo: LnUrlWithdrawInfo) -> [String: Any?] { + return [ + "endpoint": lnUrlWithdrawInfo.endpoint, + ] + } + + static func asLnUrlWithdrawInfoList(arr: [Any]) throws -> [LnUrlWithdrawInfo] { + var list = [LnUrlWithdrawInfo]() + for value in arr { + if let val = value as? [String: Any?] { + var lnUrlWithdrawInfo = try asLnUrlWithdrawInfo(lnUrlWithdrawInfo: val) + list.append(lnUrlWithdrawInfo) + } else { + throw SdkError.Generic(message: errUnexpectedType(typeName: "LnUrlWithdrawInfo")) + } + } + return list + } + + static func arrayOf(lnUrlWithdrawInfoList: [LnUrlWithdrawInfo]) -> [Any] { + return lnUrlWithdrawInfoList.map { v -> [String: Any?] in return dictionaryOf(lnUrlWithdrawInfo: v) } + } + static func asLnUrlWithdrawRequest(lnUrlWithdrawRequest: [String: Any?]) throws -> LnUrlWithdrawRequest { guard let dataTmp = lnUrlWithdrawRequest["data"] as? [String: Any?] else { throw SdkError.Generic(message: errMissingMandatoryField(fieldName: "data", typeName: "LnUrlWithdrawRequest")) @@ -2212,13 +2256,6 @@ enum BreezSDKMapper { } error = errorTmp } - var description: String? - if hasNonNilKey(data: payment, key: "description") { - guard let descriptionTmp = payment["description"] as? String else { - throw SdkError.Generic(message: errUnexpectedValue(fieldName: "description")) - } - description = descriptionTmp - } guard let detailsTmp = payment["details"] as? [String: Any?] else { throw SdkError.Generic(message: errMissingMandatoryField(fieldName: "details", typeName: "Payment")) } @@ -2232,7 +2269,7 @@ enum BreezSDKMapper { metadata = metadataTmp } - return Payment(id: id, paymentType: paymentType, paymentTime: paymentTime, amountMsat: amountMsat, feeMsat: feeMsat, status: status, error: error, description: description, details: details, metadata: metadata) + return Payment(id: id, paymentType: paymentType, paymentTime: paymentTime, amountMsat: amountMsat, feeMsat: feeMsat, status: status, error: error, details: details, metadata: metadata) } static func dictionaryOf(payment: Payment) -> [String: Any?] { @@ -2244,7 +2281,6 @@ enum BreezSDKMapper { "feeMsat": payment.feeMsat, "status": valueOf(paymentStatus: payment.status), "error": payment.error == nil ? nil : payment.error, - "description": payment.description == nil ? nil : payment.description, "details": dictionaryOf(paymentDetails: payment.details), "metadata": payment.metadata == nil ? nil : payment.metadata, ] @@ -4539,6 +4575,65 @@ enum BreezSDKMapper { return list } + static func asLnUrlInfo(lnUrlInfo: [String: Any?]) throws -> LnUrlInfo { + let type = lnUrlInfo["type"] as! String + if type == "pay" { + guard let infoTmp = lnUrlInfo["info"] as? [String: Any?] else { + throw SdkError.Generic(message: errMissingMandatoryField(fieldName: "info", typeName: "LnUrlInfo")) + } + let _info = try asLnUrlPayInfo(lnUrlPayInfo: infoTmp) + + return LnUrlInfo.pay(info: _info) + } + if type == "withdraw" { + guard let infoTmp = lnUrlInfo["info"] as? [String: Any?] else { + throw SdkError.Generic(message: errMissingMandatoryField(fieldName: "info", typeName: "LnUrlInfo")) + } + let _info = try asLnUrlWithdrawInfo(lnUrlWithdrawInfo: infoTmp) + + return LnUrlInfo.withdraw(info: _info) + } + + throw SdkError.Generic(message: "Unexpected type \(type) for enum LnUrlInfo") + } + + static func dictionaryOf(lnUrlInfo: LnUrlInfo) -> [String: Any?] { + switch lnUrlInfo { + case let .pay( + info + ): + return [ + "type": "pay", + "info": dictionaryOf(lnUrlPayInfo: info), + ] + + case let .withdraw( + info + ): + return [ + "type": "withdraw", + "info": dictionaryOf(lnUrlWithdrawInfo: info), + ] + } + } + + static func arrayOf(lnUrlInfoList: [LnUrlInfo]) -> [Any] { + return lnUrlInfoList.map { v -> [String: Any?] in return dictionaryOf(lnUrlInfo: v) } + } + + static func asLnUrlInfoList(arr: [Any]) throws -> [LnUrlInfo] { + var list = [LnUrlInfo]() + for value in arr { + if let val = value as? [String: Any?] { + var lnUrlInfo = try asLnUrlInfo(lnUrlInfo: val) + list.append(lnUrlInfo) + } else { + throw SdkError.Generic(message: errUnexpectedType(typeName: "LnUrlInfo")) + } + } + return list + } + static func asLnUrlPayResult(lnUrlPayResult: [String: Any?]) throws -> LnUrlPayResult { let type = lnUrlPayResult["type"] as! String if type == "endpointSuccess" { @@ -4614,6 +4709,61 @@ enum BreezSDKMapper { return list } + static func asLnUrlPayTarget(lnUrlPayTarget: [String: Any?]) throws -> LnUrlPayTarget { + let type = lnUrlPayTarget["type"] as! String + if type == "lnAddress" { + guard let _address = lnUrlPayTarget["address"] as? String else { + throw SdkError.Generic(message: errMissingMandatoryField(fieldName: "address", typeName: "LnUrlPayTarget")) + } + return LnUrlPayTarget.lnAddress(address: _address) + } + if type == "domain" { + guard let _domain = lnUrlPayTarget["domain"] as? String else { + throw SdkError.Generic(message: errMissingMandatoryField(fieldName: "domain", typeName: "LnUrlPayTarget")) + } + return LnUrlPayTarget.domain(domain: _domain) + } + + throw SdkError.Generic(message: "Unexpected type \(type) for enum LnUrlPayTarget") + } + + static func dictionaryOf(lnUrlPayTarget: LnUrlPayTarget) -> [String: Any?] { + switch lnUrlPayTarget { + case let .lnAddress( + address + ): + return [ + "type": "lnAddress", + "address": address, + ] + + case let .domain( + domain + ): + return [ + "type": "domain", + "domain": domain, + ] + } + } + + static func arrayOf(lnUrlPayTargetList: [LnUrlPayTarget]) -> [Any] { + return lnUrlPayTargetList.map { v -> [String: Any?] in return dictionaryOf(lnUrlPayTarget: v) } + } + + static func asLnUrlPayTargetList(arr: [Any]) throws -> [LnUrlPayTarget] { + var list = [LnUrlPayTarget]() + for value in arr { + if let val = value as? [String: Any?] { + var lnUrlPayTarget = try asLnUrlPayTarget(lnUrlPayTarget: val) + list.append(lnUrlPayTarget) + } else { + throw SdkError.Generic(message: errUnexpectedType(typeName: "LnUrlPayTarget")) + } + } + return list + } + static func asLnUrlWithdrawResult(lnUrlWithdrawResult: [String: Any?]) throws -> LnUrlWithdrawResult { let type = lnUrlWithdrawResult["type"] as! String if type == "ok" { diff --git a/libs/sdk-react-native/src/index.ts b/libs/sdk-react-native/src/index.ts index bc88dcf94..f5f0d5185 100644 --- a/libs/sdk-react-native/src/index.ts +++ b/libs/sdk-react-native/src/index.ts @@ -112,8 +112,8 @@ export interface FiatCurrency { export interface InvoicePaidDetails { paymentHash: string - bolt11: string - payment?: Payment + paymentPreimage: string + amountMsat: number } export interface LnInvoice { @@ -170,12 +170,8 @@ export interface LnPaymentDetails { paymentPreimage: string keysend: boolean bolt11: string - lnurlSuccessAction?: SuccessActionProcessed - lnurlPayDomain?: string - lnurlPayComment?: string - lnurlMetadata?: string - lnAddress?: string - lnurlWithdrawEndpoint?: string + description: string + lnurlInfo?: LnUrlInfo swapInfo?: SwapInfo reverseSwapInfo?: ReverseSwapInfo } @@ -196,6 +192,13 @@ export interface LnUrlPayErrorData { reason: string } +export interface LnUrlPayInfo { + target: LnUrlPayTarget + metadata: string + comment?: string + successAction?: SuccessActionProcessed +} + export interface LnUrlPayRequest { data: LnUrlPayRequestData amountMsat: number @@ -221,6 +224,10 @@ export interface LnUrlPaySuccessData { payment: Payment } +export interface LnUrlWithdrawInfo { + endpoint: string +} + export interface LnUrlWithdrawRequest { data: LnUrlWithdrawRequestData amountMsat: number @@ -345,7 +352,6 @@ export interface Payment { feeMsat: number status: PaymentStatus error?: string - description?: string details: PaymentDetails metadata?: string } @@ -731,6 +737,19 @@ export type LnUrlCallbackStatus = { data: LnUrlErrorData } +export enum LnUrlInfoVariant { + PAY = "pay", + WITHDRAW = "withdraw" +} + +export type LnUrlInfo = { + type: LnUrlInfoVariant.PAY, + info: LnUrlPayInfo +} | { + type: LnUrlInfoVariant.WITHDRAW, + info: LnUrlWithdrawInfo +} + export enum LnUrlPayResultVariant { ENDPOINT_SUCCESS = "endpointSuccess", ENDPOINT_ERROR = "endpointError", @@ -748,6 +767,19 @@ export type LnUrlPayResult = { data: LnUrlPayErrorData } +export enum LnUrlPayTargetVariant { + LN_ADDRESS = "lnAddress", + DOMAIN = "domain" +} + +export type LnUrlPayTarget = { + type: LnUrlPayTargetVariant.LN_ADDRESS, + address: string +} | { + type: LnUrlPayTargetVariant.DOMAIN, + domain: string +} + export enum LnUrlWithdrawResultVariant { OK = "ok", TIMEOUT = "timeout",