@@ -273,8 +273,14 @@ impl_writeable_tlv_based!(ChannelCounterparty, {
273
273
274
274
/// Details of a channel, as returned by [`ChannelManager::list_channels`] and [`ChannelManager::list_usable_channels`]
275
275
///
276
+ /// Balances of a channel are available through [`ChainMonitor::get_claimable_balances`] and
277
+ /// [`ChannelMonitor::get_claimable_balances`], calculated with respect to the corresponding on-chain
278
+ /// transactions.
279
+ ///
276
280
/// [`ChannelManager::list_channels`]: crate::ln::channelmanager::ChannelManager::list_channels
277
281
/// [`ChannelManager::list_usable_channels`]: crate::ln::channelmanager::ChannelManager::list_usable_channels
282
+ /// [`ChainMonitor::get_claimable_balances`]: crate::chain::chainmonitor::ChainMonitor::get_claimable_balances
283
+ /// [`ChannelMonitor::get_claimable_balances`]: crate::chain::channelmonitor::ChannelMonitor::get_claimable_balances
278
284
#[ derive( Clone , Debug , PartialEq ) ]
279
285
pub struct ChannelDetails {
280
286
/// The channel's ID (prior to funding transaction generation, this is a random 32 bytes,
@@ -363,6 +369,7 @@ pub struct ChannelDetails {
363
369
/// This does not consider any on-chain fees.
364
370
///
365
371
/// See also [`ChannelDetails::outbound_capacity_msat`]
372
+ #[ deprecated( since = "0.0.124" , note = "use [`ChainMonitor::get_claimable_balances`] instead" ) ]
366
373
pub balance_msat : u64 ,
367
374
/// The available outbound capacity for sending HTLCs to the remote peer. This does not include
368
375
/// any pending HTLCs which are not yet fully resolved (and, thus, whose balance is not
@@ -495,6 +502,7 @@ impl ChannelDetails {
495
502
let balance = context. get_available_balances ( fee_estimator) ;
496
503
let ( to_remote_reserve_satoshis, to_self_reserve_satoshis) =
497
504
context. get_holder_counterparty_selected_channel_reserve_satoshis ( ) ;
505
+ #[ allow( deprecated) ] // TODO: Remove once balance_msat is removed.
498
506
ChannelDetails {
499
507
channel_id : context. channel_id ( ) ,
500
508
counterparty : ChannelCounterparty {
@@ -561,38 +569,41 @@ impl Writeable for ChannelDetails {
561
569
// versions prior to 0.0.113, the u128 is serialized as two separate u64 values.
562
570
let user_channel_id_low = self . user_channel_id as u64 ;
563
571
let user_channel_id_high_opt = Some ( ( self . user_channel_id >> 64 ) as u64 ) ;
564
- write_tlv_fields ! ( writer, {
565
- ( 1 , self . inbound_scid_alias, option) ,
566
- ( 2 , self . channel_id, required) ,
567
- ( 3 , self . channel_type, option) ,
568
- ( 4 , self . counterparty, required) ,
569
- ( 5 , self . outbound_scid_alias, option) ,
570
- ( 6 , self . funding_txo, option) ,
571
- ( 7 , self . config, option) ,
572
- ( 8 , self . short_channel_id, option) ,
573
- ( 9 , self . confirmations, option) ,
574
- ( 10 , self . channel_value_satoshis, required) ,
575
- ( 12 , self . unspendable_punishment_reserve, option) ,
576
- ( 14 , user_channel_id_low, required) ,
577
- ( 16 , self . balance_msat, required) ,
578
- ( 18 , self . outbound_capacity_msat, required) ,
579
- ( 19 , self . next_outbound_htlc_limit_msat, required) ,
580
- ( 20 , self . inbound_capacity_msat, required) ,
581
- ( 21 , self . next_outbound_htlc_minimum_msat, required) ,
582
- ( 22 , self . confirmations_required, option) ,
583
- ( 24 , self . force_close_spend_delay, option) ,
584
- ( 26 , self . is_outbound, required) ,
585
- ( 28 , self . is_channel_ready, required) ,
586
- ( 30 , self . is_usable, required) ,
587
- ( 32 , self . is_public, required) ,
588
- ( 33 , self . inbound_htlc_minimum_msat, option) ,
589
- ( 35 , self . inbound_htlc_maximum_msat, option) ,
590
- ( 37 , user_channel_id_high_opt, option) ,
591
- ( 39 , self . feerate_sat_per_1000_weight, option) ,
592
- ( 41 , self . channel_shutdown_state, option) ,
593
- ( 43 , self . pending_inbound_htlcs, optional_vec) ,
594
- ( 45 , self . pending_outbound_htlcs, optional_vec) ,
595
- } ) ;
572
+ #[ allow( deprecated) ] // TODO: Remove once balance_msat is removed.
573
+ {
574
+ write_tlv_fields ! ( writer, {
575
+ ( 1 , self . inbound_scid_alias, option) ,
576
+ ( 2 , self . channel_id, required) ,
577
+ ( 3 , self . channel_type, option) ,
578
+ ( 4 , self . counterparty, required) ,
579
+ ( 5 , self . outbound_scid_alias, option) ,
580
+ ( 6 , self . funding_txo, option) ,
581
+ ( 7 , self . config, option) ,
582
+ ( 8 , self . short_channel_id, option) ,
583
+ ( 9 , self . confirmations, option) ,
584
+ ( 10 , self . channel_value_satoshis, required) ,
585
+ ( 12 , self . unspendable_punishment_reserve, option) ,
586
+ ( 14 , user_channel_id_low, required) ,
587
+ ( 16 , self . balance_msat, required) ,
588
+ ( 18 , self . outbound_capacity_msat, required) ,
589
+ ( 19 , self . next_outbound_htlc_limit_msat, required) ,
590
+ ( 20 , self . inbound_capacity_msat, required) ,
591
+ ( 21 , self . next_outbound_htlc_minimum_msat, required) ,
592
+ ( 22 , self . confirmations_required, option) ,
593
+ ( 24 , self . force_close_spend_delay, option) ,
594
+ ( 26 , self . is_outbound, required) ,
595
+ ( 28 , self . is_channel_ready, required) ,
596
+ ( 30 , self . is_usable, required) ,
597
+ ( 32 , self . is_public, required) ,
598
+ ( 33 , self . inbound_htlc_minimum_msat, option) ,
599
+ ( 35 , self . inbound_htlc_maximum_msat, option) ,
600
+ ( 37 , user_channel_id_high_opt, option) ,
601
+ ( 39 , self . feerate_sat_per_1000_weight, option) ,
602
+ ( 41 , self . channel_shutdown_state, option) ,
603
+ ( 43 , self . pending_inbound_htlcs, optional_vec) ,
604
+ ( 45 , self . pending_outbound_htlcs, optional_vec) ,
605
+ } ) ;
606
+ }
596
607
Ok ( ( ) )
597
608
}
598
609
}
@@ -640,6 +651,7 @@ impl Readable for ChannelDetails {
640
651
let user_channel_id = user_channel_id_low as u128
641
652
+ ( ( user_channel_id_high_opt. unwrap_or ( 0 as u64 ) as u128 ) << 64 ) ;
642
653
654
+ #[ allow( deprecated) ] // TODO: Remove once balance_msat is removed.
643
655
Ok ( Self {
644
656
inbound_scid_alias,
645
657
channel_id : channel_id. 0 . unwrap ( ) ,
@@ -703,3 +715,93 @@ impl_writeable_tlv_based_enum!(ChannelShutdownState,
703
715
( 6 , NegotiatingClosingFee ) => { } ,
704
716
( 8 , ShutdownComplete ) => { } ,
705
717
) ;
718
+
719
+ #[ cfg( test) ]
720
+ mod tests {
721
+ use bitcoin:: { hashes:: Hash as _, secp256k1:: PublicKey } ;
722
+ use lightning_types:: features:: Features ;
723
+ use types:: payment:: PaymentHash ;
724
+
725
+ use crate :: {
726
+ chain:: transaction:: OutPoint ,
727
+ ln:: {
728
+ channel_state:: {
729
+ InboundHTLCDetails , InboundHTLCStateDetails , OutboundHTLCDetails ,
730
+ OutboundHTLCStateDetails ,
731
+ } ,
732
+ types:: ChannelId ,
733
+ } ,
734
+ util:: {
735
+ config:: ChannelConfig ,
736
+ ser:: { Readable , Writeable } ,
737
+ } ,
738
+ } ;
739
+
740
+ use super :: { ChannelCounterparty , ChannelDetails , ChannelShutdownState } ;
741
+
742
+ #[ test]
743
+ fn test_channel_details_serialization ( ) {
744
+ #[ allow( deprecated) ]
745
+ let channel_details = ChannelDetails {
746
+ channel_id : ChannelId :: new_zero ( ) ,
747
+ counterparty : ChannelCounterparty {
748
+ features : Features :: empty ( ) ,
749
+ node_id : PublicKey :: from_slice ( & [ 2 ; 33 ] ) . unwrap ( ) ,
750
+ unspendable_punishment_reserve : 1983 ,
751
+ forwarding_info : None ,
752
+ outbound_htlc_minimum_msat : None ,
753
+ outbound_htlc_maximum_msat : None ,
754
+ } ,
755
+ funding_txo : Some ( OutPoint {
756
+ txid : bitcoin:: Txid :: from_slice ( & [ 0 ; 32 ] ) . unwrap ( ) ,
757
+ index : 1 ,
758
+ } ) ,
759
+ channel_type : None ,
760
+ short_channel_id : None ,
761
+ outbound_scid_alias : None ,
762
+ inbound_scid_alias : None ,
763
+ channel_value_satoshis : 50_100 ,
764
+ user_channel_id : ( u64:: MAX as u128 ) + 1 , // Gets us into the high bytes
765
+ balance_msat : 23_100 ,
766
+ outbound_capacity_msat : 24_300 ,
767
+ next_outbound_htlc_limit_msat : 20_000 ,
768
+ next_outbound_htlc_minimum_msat : 132 ,
769
+ inbound_capacity_msat : 42 ,
770
+ unspendable_punishment_reserve : Some ( 8273 ) ,
771
+ confirmations_required : Some ( 5 ) ,
772
+ confirmations : Some ( 73 ) ,
773
+ force_close_spend_delay : Some ( 10 ) ,
774
+ is_outbound : true ,
775
+ is_channel_ready : false ,
776
+ is_usable : true ,
777
+ is_public : false ,
778
+ inbound_htlc_minimum_msat : Some ( 98 ) ,
779
+ inbound_htlc_maximum_msat : Some ( 983274 ) ,
780
+ config : Some ( ChannelConfig :: default ( ) ) ,
781
+ feerate_sat_per_1000_weight : Some ( 212 ) ,
782
+ channel_shutdown_state : Some ( ChannelShutdownState :: NotShuttingDown ) ,
783
+ pending_inbound_htlcs : vec ! [ InboundHTLCDetails {
784
+ htlc_id: 12 ,
785
+ amount_msat: 333 ,
786
+ cltv_expiry: 127 ,
787
+ payment_hash: PaymentHash ( [ 3 ; 32 ] ) ,
788
+ state: Some ( InboundHTLCStateDetails :: AwaitingRemoteRevokeToAdd ) ,
789
+ is_dust: true ,
790
+ } ] ,
791
+ pending_outbound_htlcs : vec ! [ OutboundHTLCDetails {
792
+ htlc_id: Some ( 81 ) ,
793
+ amount_msat: 5000 ,
794
+ cltv_expiry: 129 ,
795
+ payment_hash: PaymentHash ( [ 4 ; 32 ] ) ,
796
+ state: Some ( OutboundHTLCStateDetails :: AwaitingRemoteRevokeToAdd ) ,
797
+ skimmed_fee_msat: Some ( 42 ) ,
798
+ is_dust: false ,
799
+ } ] ,
800
+ } ;
801
+ let mut buffer = Vec :: new ( ) ;
802
+ channel_details. write ( & mut buffer) . unwrap ( ) ;
803
+ let deser_channel_details = ChannelDetails :: read ( & mut buffer. as_slice ( ) ) . unwrap ( ) ;
804
+
805
+ assert_eq ! ( deser_channel_details, channel_details) ;
806
+ }
807
+ }
0 commit comments