diff --git a/lightning-liquidity/src/lsps2/client.rs b/lightning-liquidity/src/lsps2/client.rs index 5b7e0902e31..1a499d1cc62 100644 --- a/lightning-liquidity/src/lsps2/client.rs +++ b/lightning-liquidity/src/lsps2/client.rs @@ -214,6 +214,7 @@ where request_id, counterparty_node_id: *counterparty_node_id, opening_fee_params_menu: result.opening_fee_params_menu, + ongoing_proportional: result.ongoing_proportional, }); }, None => { diff --git a/lightning-liquidity/src/lsps2/event.rs b/lightning-liquidity/src/lsps2/event.rs index f5e42665b5c..03920e42e36 100644 --- a/lightning-liquidity/src/lsps2/event.rs +++ b/lightning-liquidity/src/lsps2/event.rs @@ -38,6 +38,8 @@ pub enum LSPS2ClientEvent { /// The menu of fee parameters the LSP is offering at this time. /// You must select one of these if you wish to proceed. opening_fee_params_menu: Vec, + /// A flag indicating whether the LSP will collect ongoing proportional fees after the initial channel is opened. + ongoing_proportional: bool, }, /// Provides the necessary information to generate a payable invoice that then may be given to /// the payer. diff --git a/lightning-liquidity/src/lsps2/msgs.rs b/lightning-liquidity/src/lsps2/msgs.rs index 84875d4ab7c..b2d4c9bd02e 100644 --- a/lightning-liquidity/src/lsps2/msgs.rs +++ b/lightning-liquidity/src/lsps2/msgs.rs @@ -115,6 +115,8 @@ pub struct LSPS2OpeningFeeParams { pub struct LSPS2GetInfoResponse { /// A set of opening fee parameters. pub opening_fee_params_menu: Vec, + /// A flag for whether ongoing proportional fees will be collected. + pub ongoing_proportional: bool, } /// A request to buy a JIT channel. @@ -348,6 +350,7 @@ mod tests { let max_client_to_self_delay = 128; let min_payment_size_msat = 1; let max_payment_size_msat = 100_000_000; + let ongoing_proportional = true; let raw = LSPS2RawOpeningFeeParams { min_fee_msat, @@ -382,7 +385,7 @@ mod tests { assert_eq!(buy_request_variable, serde_json::from_str(json_str).unwrap()); // Check we still deserialize correctly if payment_size_msat is 'null'. - let json_str = r#"{"opening_fee_params":{"max_client_to_self_delay":128,"max_payment_size_msat":"100000000","min_fee_msat":"100","min_lifetime":144,"min_payment_size_msat":"1","promise":"1134a5c51e3ba2e8f4259610d5e12c1bf4c50ddcd3f8af563e0a00d1fff41dea","proportional":21,"valid_until":"2023-05-20T08:30:45Z"},"payment_size_msat":null}"#; + let json_str = r#"{"opening_fee_params":{"max_client_to_self_delay":128,"max_payment_size_msat":"100000000","min_fee_msat":"100","min_lifetime":144,"min_payment_size_msat":"1","promise":"1134a5c51e3ba2e8f4259610d5e12c1bf4c50ddcd3f8af563e0a00d1fff41dea","proportional":21,"valid_until":"2023-05-20T08:30:45Z"},"ongoing_proportional":true,"payment_size_msat":null}"#; assert_eq!(buy_request_variable, serde_json::from_str(json_str).unwrap()); } @@ -411,7 +414,8 @@ mod tests { "max_payment_size_msat": "1000000", "promise": "abcdefghijklmnopqrstuvwxyz" } - ] + ], + "ongoing_proportional": true }"#; let _get_info_response: LSPS2GetInfoResponse = serde_json::from_str(json_str).unwrap(); @@ -426,6 +430,7 @@ mod tests { "max_payment_size_msat": "1000000", "promise": "abcdefghijklmnopqrstuvwxyz" }, + "ongoing_proportional": true, "payment_size_msat": "42000" }"#; let _buy_request: LSPS2BuyRequest = serde_json::from_str(json_str).unwrap(); diff --git a/lightning-liquidity/src/lsps2/service.rs b/lightning-liquidity/src/lsps2/service.rs index abab51366ff..6782d6498b8 100644 --- a/lightning-liquidity/src/lsps2/service.rs +++ b/lightning-liquidity/src/lsps2/service.rs @@ -634,7 +634,7 @@ where /// [`LSPS2ServiceEvent::GetInfo`]: crate::lsps2::event::LSPS2ServiceEvent::GetInfo pub fn opening_fee_params_generated( &self, counterparty_node_id: &PublicKey, request_id: LSPSRequestId, - opening_fee_params_menu: Vec, + opening_fee_params_menu: Vec, ongoing_proportional: bool, ) -> Result<(), APIError> { let (result, response) = { let outer_state_lock = self.per_peer_state.read().unwrap(); @@ -652,6 +652,7 @@ where param.into_opening_fee_params(&self.config.promise_secret) }) .collect(), + ongoing_proportional, }); (Ok(()), Some(response)) }, diff --git a/lightning-liquidity/tests/lsps2_integration_tests.rs b/lightning-liquidity/tests/lsps2_integration_tests.rs index ef88d6220a4..21c4c6025fc 100644 --- a/lightning-liquidity/tests/lsps2_integration_tests.rs +++ b/lightning-liquidity/tests/lsps2_integration_tests.rs @@ -154,11 +154,14 @@ fn invoice_generation_flow() { max_payment_size_msat: 100_000_000, }; + let ongoing_proportional = true; + service_handler .opening_fee_params_generated( &client_node_id, get_info_request_id.clone(), vec![raw_opening_params], + ongoing_proportional, ) .unwrap(); let get_info_response = get_lsps_message!(service_node, client_node_id); @@ -174,9 +177,11 @@ fn invoice_generation_flow() { request_id, counterparty_node_id, opening_fee_params_menu, + ongoing_proportional, }) => { assert_eq!(request_id, get_info_request_id); assert_eq!(counterparty_node_id, service_node_id); + assert_eq!(ongoing_proportional, ongoing_proportional); let opening_fee_params = opening_fee_params_menu.first().unwrap().clone(); assert!(is_valid_opening_fee_params(&opening_fee_params, &promise_secret)); opening_fee_params @@ -282,11 +287,15 @@ fn channel_open_failed() { min_payment_size_msat: 1, max_payment_size_msat: 100_000_000, }; + + let ongoing_proportional = true; + service_handler .opening_fee_params_generated( &client_node_id, get_info_request_id.clone(), vec![raw_opening_params], + ongoing_proportional, ) .unwrap(); @@ -430,11 +439,14 @@ fn channel_open_abandoned() { min_payment_size_msat: 1, max_payment_size_msat: 100_000_000, }; + let ongoing_proportional = true; + service_handler .opening_fee_params_generated( &client_node_id, get_info_request_id.clone(), vec![raw_opening_params], + ongoing_proportional, ) .unwrap(); @@ -584,9 +596,15 @@ fn max_total_requests_buy_rejected() { min_payment_size_msat: 1, max_payment_size_msat: 100_000_000, }; + let ongoing_proportional = true; service_handler - .opening_fee_params_generated(&special_node_id, request_id, vec![raw_opening_params]) + .opening_fee_params_generated( + &special_node_id, + request_id, + vec![raw_opening_params], + ongoing_proportional, + ) .unwrap(); } else { panic!("Unexpected event"); @@ -713,11 +731,13 @@ fn invalid_token_flow() { min_payment_size_msat: 1, max_payment_size_msat: 100_000_000, }; + let ongoing_proportional = true; let result = service_handler.opening_fee_params_generated( &client_node_id, request_id.clone(), vec![raw_opening_params], + ongoing_proportional, ); assert!(result.is_err(), "Request should have been removed from pending_requests");