Skip to content
This repository was archived by the owner on Jan 6, 2025. It is now read-only.

Commit 7b17f02

Browse files
authored
Merge pull request #97 from johncantrell97/override-min-max
allow overriding min/max payment sizes
2 parents bb902df + 307f0cb commit 7b17f02

File tree

5 files changed

+49
-29
lines changed

5 files changed

+49
-29
lines changed

src/lsps2/client.rs

-2
Original file line numberDiff line numberDiff line change
@@ -212,8 +212,6 @@ where
212212
request_id,
213213
counterparty_node_id: *counterparty_node_id,
214214
opening_fee_params_menu: result.opening_fee_params_menu,
215-
min_payment_size_msat: result.min_payment_size_msat,
216-
max_payment_size_msat: result.max_payment_size_msat,
217215
},
218216
));
219217
}

src/lsps2/event.rs

-4
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,6 @@ pub enum LSPS2ClientEvent {
3737
/// The menu of fee parameters the LSP is offering at this time.
3838
/// You must select one of these if you wish to proceed.
3939
opening_fee_params_menu: Vec<OpeningFeeParams>,
40-
/// The min payment size allowed when opening the channel.
41-
min_payment_size_msat: u64,
42-
/// The max payment size allowed when opening the channel.
43-
max_payment_size_msat: u64,
4440
},
4541
/// Provides the necessary information to generate a payable invoice that then may be given to
4642
/// the payer.

src/lsps2/msgs.rs

+29-5
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,12 @@ pub struct RawOpeningFeeParams {
4141
pub valid_until: chrono::DateTime<Utc>,
4242
/// The number of blocks after confirmation that the LSP promises it will keep the channel alive without closing.
4343
pub min_lifetime: u32,
44-
/// T maximum number of blocks that the client is allowed to set its `to_self_delay` parameter.
44+
/// The maximum number of blocks that the client is allowed to set its `to_self_delay` parameter.
4545
pub max_client_to_self_delay: u32,
46+
/// The minimum payment size that the LSP will accept when opening a channel.
47+
pub min_payment_size_msat: u64,
48+
/// The maximum payment size that the LSP will accept when opening a channel.
49+
pub max_payment_size_msat: u64,
4650
}
4751

4852
impl RawOpeningFeeParams {
@@ -53,6 +57,8 @@ impl RawOpeningFeeParams {
5357
hmac.input(self.valid_until.to_rfc3339().as_bytes());
5458
hmac.input(&self.min_lifetime.to_be_bytes());
5559
hmac.input(&self.max_client_to_self_delay.to_be_bytes());
60+
hmac.input(&self.min_payment_size_msat.to_be_bytes());
61+
hmac.input(&self.max_payment_size_msat.to_be_bytes());
5662
let promise_bytes = Hmac::from_engine(hmac).to_byte_array();
5763
let promise = utils::hex_str(&promise_bytes[..]);
5864
OpeningFeeParams {
@@ -61,6 +67,8 @@ impl RawOpeningFeeParams {
6167
valid_until: self.valid_until.clone(),
6268
min_lifetime: self.min_lifetime,
6369
max_client_to_self_delay: self.max_client_to_self_delay,
70+
min_payment_size_msat: self.min_payment_size_msat,
71+
max_payment_size_msat: self.max_payment_size_msat,
6472
promise,
6573
}
6674
}
@@ -83,6 +91,10 @@ pub struct OpeningFeeParams {
8391
pub min_lifetime: u32,
8492
/// The maximum number of blocks that the client is allowed to set its `to_self_delay` parameter.
8593
pub max_client_to_self_delay: u32,
94+
/// The minimum payment size that the LSP will accept when opening a channel.
95+
pub min_payment_size_msat: u64,
96+
/// The maximum payment size that the LSP will accept when opening a channel.
97+
pub max_payment_size_msat: u64,
8698
/// The HMAC used to verify the authenticity of these parameters.
8799
pub promise: String,
88100
}
@@ -92,10 +104,6 @@ pub struct OpeningFeeParams {
92104
pub struct GetInfoResponse {
93105
/// A set of opening fee parameters.
94106
pub opening_fee_params_menu: Vec<OpeningFeeParams>,
95-
/// The minimum payment size required to open a channel.
96-
pub min_payment_size_msat: u64,
97-
/// The maximum payment size the lsp will tolerate.
98-
pub max_payment_size_msat: u64,
99107
}
100108

101109
/// A request to buy a JIT channel.
@@ -215,13 +223,17 @@ mod tests {
215223
chrono::DateTime::parse_from_rfc3339("2035-05-20T08:30:45Z").unwrap().into();
216224
let min_lifetime = 144;
217225
let max_client_to_self_delay = 128;
226+
let min_payment_size_msat = 1;
227+
let max_payment_size_msat = 100_000_000;
218228

219229
let raw = RawOpeningFeeParams {
220230
min_fee_msat,
221231
proportional,
222232
valid_until: valid_until.clone().into(),
223233
min_lifetime,
224234
max_client_to_self_delay,
235+
min_payment_size_msat,
236+
max_payment_size_msat,
225237
};
226238

227239
let promise_secret = [1u8; 32];
@@ -244,13 +256,17 @@ mod tests {
244256
let valid_until = chrono::DateTime::parse_from_rfc3339("2035-05-20T08:30:45Z").unwrap();
245257
let min_lifetime = 144;
246258
let max_client_to_self_delay = 128;
259+
let min_payment_size_msat = 1;
260+
let max_payment_size_msat = 100_000_000;
247261

248262
let raw = RawOpeningFeeParams {
249263
min_fee_msat,
250264
proportional,
251265
valid_until: valid_until.into(),
252266
min_lifetime,
253267
max_client_to_self_delay,
268+
min_payment_size_msat,
269+
max_payment_size_msat,
254270
};
255271

256272
let promise_secret = [1u8; 32];
@@ -267,13 +283,17 @@ mod tests {
267283
let valid_until = chrono::DateTime::parse_from_rfc3339("2035-05-20T08:30:45Z").unwrap();
268284
let min_lifetime = 144;
269285
let max_client_to_self_delay = 128;
286+
let min_payment_size_msat = 1;
287+
let max_payment_size_msat = 100_000_000;
270288

271289
let raw = RawOpeningFeeParams {
272290
min_fee_msat,
273291
proportional,
274292
valid_until: valid_until.into(),
275293
min_lifetime,
276294
max_client_to_self_delay,
295+
min_payment_size_msat,
296+
max_payment_size_msat,
277297
};
278298

279299
let promise_secret = [1u8; 32];
@@ -292,13 +312,17 @@ mod tests {
292312
let valid_until = chrono::DateTime::parse_from_rfc3339("2023-05-20T08:30:45Z").unwrap();
293313
let min_lifetime = 144;
294314
let max_client_to_self_delay = 128;
315+
let min_payment_size_msat = 1;
316+
let max_payment_size_msat = 100_000_000;
295317

296318
let raw = RawOpeningFeeParams {
297319
min_fee_msat,
298320
proportional,
299321
valid_until: valid_until.into(),
300322
min_lifetime,
301323
max_client_to_self_delay,
324+
min_payment_size_msat,
325+
max_payment_size_msat,
302326
};
303327

304328
let promise_secret = [1u8; 32];

src/lsps2/service.rs

+18-18
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,6 @@ pub struct LSPS2ServiceConfig {
4444
///
4545
/// Note: If this changes then old promises given out will be considered invalid.
4646
pub promise_secret: [u8; 32],
47-
/// The minimum payment size you are willing to accept.
48-
pub min_payment_size_msat: u64,
49-
/// The maximum payment size you are willing to accept.
50-
pub max_payment_size_msat: u64,
5147
}
5248

5349
#[derive(Copy, Clone, PartialEq, Eq, Debug)]
@@ -69,6 +65,8 @@ enum OutboundJITChannelState {
6965
AwaitingPayment {
7066
min_fee_msat: u64,
7167
proportional_fee: u32,
68+
min_payment_size_msat: u64,
69+
max_payment_size_msat: u64,
7270
htlcs: Vec<InterceptedHTLC>,
7371
payment_size_msat: Option<u64>,
7472
},
@@ -88,18 +86,20 @@ impl OutboundJITChannelState {
8886
OutboundJITChannelState::AwaitingPayment {
8987
min_fee_msat: opening_fee_params.min_fee_msat,
9088
proportional_fee: opening_fee_params.proportional,
89+
min_payment_size_msat: opening_fee_params.min_payment_size_msat,
90+
max_payment_size_msat: opening_fee_params.max_payment_size_msat,
9191
htlcs: vec![],
9292
payment_size_msat,
9393
}
9494
}
9595

96-
fn htlc_intercepted(
97-
&self, htlc: InterceptedHTLC, config: &LSPS2ServiceConfig,
98-
) -> Result<Self, ChannelStateError> {
96+
fn htlc_intercepted(&self, htlc: InterceptedHTLC) -> Result<Self, ChannelStateError> {
9997
match self {
10098
OutboundJITChannelState::AwaitingPayment {
10199
htlcs,
102100
payment_size_msat,
101+
min_payment_size_msat,
102+
max_payment_size_msat,
103103
min_fee_msat,
104104
proportional_fee,
105105
} => {
@@ -122,14 +122,14 @@ impl OutboundJITChannelState {
122122
(total_expected_outbound_amount_msat, false)
123123
};
124124

125-
if expected_payment_size_msat < config.min_payment_size_msat
126-
|| expected_payment_size_msat > config.max_payment_size_msat
125+
if expected_payment_size_msat < *min_payment_size_msat
126+
|| expected_payment_size_msat > *max_payment_size_msat
127127
{
128128
return Err(ChannelStateError(
129129
format!("Payment size violates our limits: expected_payment_size_msat = {}, min_payment_size_msat = {}, max_payment_size_msat = {}",
130130
expected_payment_size_msat,
131-
config.min_payment_size_msat,
132-
config.max_payment_size_msat
131+
min_payment_size_msat,
132+
max_payment_size_msat
133133
)));
134134
}
135135

@@ -164,6 +164,8 @@ impl OutboundJITChannelState {
164164
proportional_fee: *proportional_fee,
165165
htlcs,
166166
payment_size_msat: *payment_size_msat,
167+
min_payment_size_msat: *min_payment_size_msat,
168+
max_payment_size_msat: *max_payment_size_msat,
167169
})
168170
} else {
169171
Err(ChannelStateError(
@@ -211,9 +213,9 @@ impl OutboundJITChannel {
211213
}
212214

213215
fn htlc_intercepted(
214-
&mut self, htlc: InterceptedHTLC, config: &LSPS2ServiceConfig,
216+
&mut self, htlc: InterceptedHTLC,
215217
) -> Result<Option<(u64, u64)>, LightningError> {
216-
self.state = self.state.htlc_intercepted(htlc, config)?;
218+
self.state = self.state.htlc_intercepted(htlc)?;
217219

218220
match &self.state {
219221
OutboundJITChannelState::AwaitingPayment { .. } => {
@@ -370,8 +372,6 @@ where
370372
param.into_opening_fee_params(&self.config.promise_secret)
371373
})
372374
.collect(),
373-
min_payment_size_msat: self.config.min_payment_size_msat,
374-
max_payment_size_msat: self.config.max_payment_size_msat,
375375
});
376376
self.enqueue_response(counterparty_node_id, request_id, response);
377377
Ok(())
@@ -472,7 +472,7 @@ where
472472
peer_state.outbound_channels_by_intercept_scid.get_mut(&intercept_scid)
473473
{
474474
let htlc = InterceptedHTLC { intercept_id, expected_outbound_amount_msat };
475-
match jit_channel.htlc_intercepted(htlc, &self.config) {
475+
match jit_channel.htlc_intercepted(htlc) {
476476
Ok(Some((opening_fee_msat, amt_to_forward_msat))) => {
477477
self.enqueue_event(Event::LSPS2Service(
478478
LSPS2ServiceEvent::OpenChannel {
@@ -616,7 +616,7 @@ where
616616
&self, request_id: RequestId, counterparty_node_id: &PublicKey, params: BuyRequest,
617617
) -> Result<(), LightningError> {
618618
if let Some(payment_size_msat) = params.payment_size_msat {
619-
if payment_size_msat < self.config.min_payment_size_msat {
619+
if payment_size_msat < params.opening_fee_params.min_payment_size_msat {
620620
self.enqueue_response(
621621
counterparty_node_id,
622622
request_id,
@@ -633,7 +633,7 @@ where
633633
});
634634
}
635635

636-
if payment_size_msat > self.config.max_payment_size_msat {
636+
if payment_size_msat > params.opening_fee_params.max_payment_size_msat {
637637
self.enqueue_response(
638638
counterparty_node_id,
639639
request_id,

src/lsps2/utils.rs

+2
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ pub fn is_valid_opening_fee_params(
3737
hmac.input(fee_params.valid_until.to_rfc3339().as_bytes());
3838
hmac.input(&fee_params.min_lifetime.to_be_bytes());
3939
hmac.input(&fee_params.max_client_to_self_delay.to_be_bytes());
40+
hmac.input(&fee_params.min_payment_size_msat.to_be_bytes());
41+
hmac.input(&fee_params.max_payment_size_msat.to_be_bytes());
4042
let promise_bytes = Hmac::from_engine(hmac).to_byte_array();
4143
let promise = utils::hex_str(&promise_bytes[..]);
4244
promise == fee_params.promise

0 commit comments

Comments
 (0)