From f0fa409abbc5892bd1d6c5dd3d75aa3cf0ed6539 Mon Sep 17 00:00:00 2001 From: ka Date: Fri, 6 Jun 2025 10:03:28 +0800 Subject: [PATCH 1/2] add preimage field to /listpayments and /getpayment response --- openapi.yaml | 4 ++++ src/routes.rs | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/openapi.yaml b/openapi.yaml index c152fdc..060060a 100644 --- a/openapi.yaml +++ b/openapi.yaml @@ -1892,6 +1892,10 @@ components: payee_pubkey: type: string example: 03b79a4bc1ec365524b4fab9a39eb133753646babb5a1da5c4bc94c53110b7795d + preimage: + type: string + description: Optional custom payment preimage (hex string, 32 bytes) + example: "1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef" Peer: type: object properties: diff --git a/src/routes.rs b/src/routes.rs index e00c46e..796e148 100644 --- a/src/routes.rs +++ b/src/routes.rs @@ -821,6 +821,7 @@ pub(crate) struct Payment { pub(crate) created_at: u64, pub(crate) updated_at: u64, pub(crate) payee_pubkey: String, + pub(crate) preimage: Option, } #[derive(Clone, Deserialize, Serialize)] @@ -2027,6 +2028,7 @@ pub(crate) async fn list_payments( created_at: payment_info.created_at, updated_at: payment_info.updated_at, payee_pubkey: payment_info.payee_pubkey.to_string(), + preimage: payment_info.preimage.map(|p| hex_str(&p.0)), }); } @@ -2053,6 +2055,7 @@ pub(crate) async fn list_payments( created_at: payment_info.created_at, updated_at: payment_info.updated_at, payee_pubkey: payment_info.payee_pubkey.to_string(), + preimage: payment_info.preimage.map(|p| hex_str(&p.0)), }); } @@ -2097,6 +2100,7 @@ pub(crate) async fn get_payment( created_at: payment_info.created_at, updated_at: payment_info.updated_at, payee_pubkey: payment_info.payee_pubkey.to_string(), + preimage: payment_info.preimage.map(|p| hex_str(&p.0)), }, })); } @@ -2126,6 +2130,7 @@ pub(crate) async fn get_payment( created_at: payment_info.created_at, updated_at: payment_info.updated_at, payee_pubkey: payment_info.payee_pubkey.to_string(), + preimage: payment_info.preimage.map(|p| hex_str(&p.0)), }, })); } From 1cabca1cc81d5b95e937e3ee7ba0f1ae22b01762 Mon Sep 17 00:00:00 2001 From: ka Date: Mon, 16 Jun 2025 11:19:31 +0800 Subject: [PATCH 2/2] add test for get_payment APIs --- src/test/payment.rs | 32 ++++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) diff --git a/src/test/payment.rs b/src/test/payment.rs index 93aa88d..bacea51 100644 --- a/src/test/payment.rs +++ b/src/test/payment.rs @@ -63,10 +63,18 @@ async fn success() { assert_eq!(payment.asset_id, Some(asset_id.clone())); assert_eq!(payment.asset_amount, asset_amount); assert_eq!(payment.status, HTLCStatus::Succeeded); + assert!( + payment.preimage.is_some(), + "Payment preimage should be present for successful payment" + ); let payment = get_payment(node2_addr, &decoded.payment_hash).await; assert_eq!(payment.asset_id, Some(asset_id.clone())); assert_eq!(payment.asset_amount, asset_amount); assert_eq!(payment.status, HTLCStatus::Succeeded); + assert!( + payment.preimage.is_some(), + "Payment preimage should be present for successful payment" + ); let asset_amount = Some(50); let LNInvoiceResponse { invoice } = @@ -85,10 +93,18 @@ async fn success() { assert_eq!(payment.asset_id, Some(asset_id.clone())); assert_eq!(payment.asset_amount, asset_amount); assert_eq!(payment.status, HTLCStatus::Succeeded); + assert!( + payment.preimage.is_some(), + "Payment preimage should be present for successful payment" + ); let payment = get_payment(node2_addr, &decoded.payment_hash).await; assert_eq!(payment.asset_id, Some(asset_id.clone())); assert_eq!(payment.asset_amount, asset_amount); assert_eq!(payment.status, HTLCStatus::Succeeded); + assert!( + payment.preimage.is_some(), + "Payment preimage should be present for successful payment" + ); let LNInvoiceResponse { invoice } = ln_invoice(node2_addr, None, Some(&asset_id), asset_amount, 900).await; @@ -99,10 +115,18 @@ async fn success() { assert_eq!(payment.asset_id, Some(asset_id.clone())); assert_eq!(payment.asset_amount, asset_amount); assert_eq!(payment.status, HTLCStatus::Succeeded); + assert!( + payment.preimage.is_some(), + "Payment preimage should be present for successful payment" + ); let payment = get_payment(node2_addr, &decoded.payment_hash).await; assert_eq!(payment.asset_id, Some(asset_id.clone())); assert_eq!(payment.asset_amount, asset_amount); assert_eq!(payment.status, HTLCStatus::Succeeded); + assert!( + payment.preimage.is_some(), + "Payment preimage should be present for successful payment" + ); let LNInvoiceResponse { invoice } = ln_invoice(node1_addr, None, Some(&asset_id), asset_amount, 900).await; @@ -113,10 +137,18 @@ async fn success() { assert_eq!(payment.asset_id, Some(asset_id.clone())); assert_eq!(payment.asset_amount, asset_amount); assert_eq!(payment.status, HTLCStatus::Succeeded); + assert!( + payment.preimage.is_some(), + "Payment preimage should be present for successful payment" + ); let payment = get_payment(node2_addr, &decoded.payment_hash).await; assert_eq!(payment.asset_id, Some(asset_id.clone())); assert_eq!(payment.asset_amount, asset_amount); assert_eq!(payment.status, HTLCStatus::Succeeded); + assert!( + payment.preimage.is_some(), + "Payment preimage should be present for successful payment" + ); let channels_1 = list_channels(node1_addr).await; let channels_2 = list_channels(node2_addr).await;