@@ -281,6 +281,17 @@ impl HTLCCandidate {
281
281
}
282
282
}
283
283
284
+ /// Information needed for constructing an invoice route hint for this channel.
285
+ pub struct CounterpartyForwardingInfo {
286
+ /// Base routing fee in millisatoshis.
287
+ pub fee_base_msat : u32 ,
288
+ /// Amount in millionths of a satoshi the channel will charge per transferred satoshi.
289
+ pub fee_proportional_millionths : u32 ,
290
+ /// The number of blocks we'll add to an outgoing HTLC's cltv_expiry before forwarding.
291
+ /// See `msgs::ChannelUpdate`'s `cltv_expiry_delta` for more details.
292
+ pub cltv_expiry_delta : u16 ,
293
+ }
294
+
284
295
// TODO: We should refactor this to be an Inbound/OutboundChannel until initial setup handshaking
285
296
// has been completed, and then turn into a Channel to get compiler-time enforcement of things like
286
297
// calling channel_id() before we're set up or things like get_outbound_funding_signed on an
@@ -391,6 +402,8 @@ pub(super) struct Channel<Signer: Sign> {
391
402
//implied by OUR_MAX_HTLCS: max_accepted_htlcs: u16,
392
403
minimum_depth : u32 ,
393
404
405
+ counterparty_forwarding_info : Option < CounterpartyForwardingInfo > ,
406
+
394
407
pub ( crate ) channel_transaction_parameters : ChannelTransactionParameters ,
395
408
396
409
counterparty_cur_commitment_point : Option < PublicKey > ,
@@ -577,6 +590,8 @@ impl<Signer: Sign> Channel<Signer> {
577
590
counterparty_max_accepted_htlcs : 0 ,
578
591
minimum_depth : 0 , // Filled in in accept_channel
579
592
593
+ counterparty_forwarding_info : None ,
594
+
580
595
channel_transaction_parameters : ChannelTransactionParameters {
581
596
holder_pubkeys : pubkeys,
582
597
holder_selected_contest_delay : config. own_channel_config . our_to_self_delay ,
@@ -813,6 +828,8 @@ impl<Signer: Sign> Channel<Signer> {
813
828
counterparty_max_accepted_htlcs : msg. max_accepted_htlcs ,
814
829
minimum_depth : config. own_channel_config . minimum_depth ,
815
830
831
+ counterparty_forwarding_info : None ,
832
+
816
833
channel_transaction_parameters : ChannelTransactionParameters {
817
834
holder_pubkeys : pubkeys,
818
835
holder_selected_contest_delay : config. own_channel_config . our_to_self_delay ,
@@ -4437,6 +4454,16 @@ impl<Signer: Sign> Writeable for Channel<Signer> {
4437
4454
self . counterparty_max_accepted_htlcs . write ( writer) ?;
4438
4455
self . minimum_depth . write ( writer) ?;
4439
4456
4457
+ match & self . counterparty_forwarding_info {
4458
+ Some ( info) => {
4459
+ 1u8 . write ( writer) ?;
4460
+ info. fee_base_msat . write ( writer) ?;
4461
+ info. fee_proportional_millionths . write ( writer) ?;
4462
+ info. cltv_expiry_delta . write ( writer) ?;
4463
+ } ,
4464
+ None => 0u8 . write ( writer) ?
4465
+ }
4466
+
4440
4467
self . channel_transaction_parameters . write ( writer) ?;
4441
4468
self . counterparty_cur_commitment_point . write ( writer) ?;
4442
4469
@@ -4597,6 +4624,16 @@ impl<'a, Signer: Sign, K: Deref> ReadableArgs<&'a K> for Channel<Signer>
4597
4624
let counterparty_max_accepted_htlcs = Readable :: read ( reader) ?;
4598
4625
let minimum_depth = Readable :: read ( reader) ?;
4599
4626
4627
+ let counterparty_forwarding_info = match <u8 as Readable >:: read ( reader) ? {
4628
+ 0 => None ,
4629
+ 1 => Some ( CounterpartyForwardingInfo {
4630
+ fee_base_msat : Readable :: read ( reader) ?,
4631
+ fee_proportional_millionths : Readable :: read ( reader) ?,
4632
+ cltv_expiry_delta : Readable :: read ( reader) ?,
4633
+ } ) ,
4634
+ _ => return Err ( DecodeError :: InvalidValue ) ,
4635
+ } ;
4636
+
4600
4637
let channel_parameters = Readable :: read ( reader) ?;
4601
4638
let counterparty_cur_commitment_point = Readable :: read ( reader) ?;
4602
4639
@@ -4667,6 +4704,8 @@ impl<'a, Signer: Sign, K: Deref> ReadableArgs<&'a K> for Channel<Signer>
4667
4704
counterparty_max_accepted_htlcs,
4668
4705
minimum_depth,
4669
4706
4707
+ counterparty_forwarding_info,
4708
+
4670
4709
channel_transaction_parameters : channel_parameters,
4671
4710
counterparty_cur_commitment_point,
4672
4711
0 commit comments