@@ -272,11 +272,15 @@ struct HolderSignedTx {
272
272
b_htlc_key : PublicKey ,
273
273
delayed_payment_key : PublicKey ,
274
274
per_commitment_point : PublicKey ,
275
- feerate_per_kw : u32 ,
276
275
htlc_outputs : Vec < ( HTLCOutputInCommitment , Option < Signature > , Option < HTLCSource > ) > ,
276
+ to_self_value_sat : u64 ,
277
+ feerate_per_kw : u32 ,
277
278
}
278
279
impl_writeable_tlv_based ! ( HolderSignedTx , {
279
280
( 0 , txid, required) ,
281
+ // Note that this is filled in with data from OnchainTxHandler if its missing. For
282
+ // HolderSignedTx objects serialized with 0.0.100+, this should be filled in.
283
+ ( 1 , to_self_value_sat, ( default_value, u64 :: max_value( ) ) ) ,
280
284
( 2 , revocation_key, required) ,
281
285
( 4 , a_htlc_key, required) ,
282
286
( 6 , b_htlc_key, required) ,
@@ -869,8 +873,9 @@ impl<Signer: Sign> ChannelMonitor<Signer> {
869
873
b_htlc_key : tx_keys. countersignatory_htlc_key ,
870
874
delayed_payment_key : tx_keys. broadcaster_delayed_payment_key ,
871
875
per_commitment_point : tx_keys. per_commitment_point ,
872
- feerate_per_kw : trusted_tx. feerate_per_kw ( ) ,
873
876
htlc_outputs : Vec :: new ( ) , // There are never any HTLCs in the initial commitment transactions
877
+ to_self_value_sat : initial_holder_commitment_tx. to_broadcaster_value_sat ( ) ,
878
+ feerate_per_kw : trusted_tx. feerate_per_kw ( ) ,
874
879
} ;
875
880
( holder_commitment_tx, trusted_tx. commitment_number ( ) )
876
881
} ;
@@ -1424,8 +1429,9 @@ impl<Signer: Sign> ChannelMonitorImpl<Signer> {
1424
1429
b_htlc_key : tx_keys. countersignatory_htlc_key ,
1425
1430
delayed_payment_key : tx_keys. broadcaster_delayed_payment_key ,
1426
1431
per_commitment_point : tx_keys. per_commitment_point ,
1427
- feerate_per_kw : trusted_tx. feerate_per_kw ( ) ,
1428
1432
htlc_outputs,
1433
+ to_self_value_sat : holder_commitment_tx. to_broadcaster_value_sat ( ) ,
1434
+ feerate_per_kw : trusted_tx. feerate_per_kw ( ) ,
1429
1435
}
1430
1436
} ;
1431
1437
self . onchain_tx_handler . provide_latest_holder_tx ( holder_commitment_tx) ;
@@ -2710,14 +2716,15 @@ impl<'a, Signer: Sign, K: KeysInterface<Signer = Signer>> ReadableArgs<&'a K>
2710
2716
}
2711
2717
}
2712
2718
2713
- let prev_holder_signed_commitment_tx = match <u8 as Readable >:: read ( reader) ? {
2714
- 0 => None ,
2715
- 1 => {
2716
- Some ( Readable :: read ( reader) ?)
2717
- } ,
2718
- _ => return Err ( DecodeError :: InvalidValue ) ,
2719
- } ;
2720
- let current_holder_commitment_tx = Readable :: read ( reader) ?;
2719
+ let mut prev_holder_signed_commitment_tx: Option < HolderSignedTx > =
2720
+ match <u8 as Readable >:: read ( reader) ? {
2721
+ 0 => None ,
2722
+ 1 => {
2723
+ Some ( Readable :: read ( reader) ?)
2724
+ } ,
2725
+ _ => return Err ( DecodeError :: InvalidValue ) ,
2726
+ } ;
2727
+ let mut current_holder_commitment_tx: HolderSignedTx = Readable :: read ( reader) ?;
2721
2728
2722
2729
let current_counterparty_commitment_number = <U48 as Readable >:: read ( reader) ?. 0 ;
2723
2730
let current_holder_commitment_number = <U48 as Readable >:: read ( reader) ?. 0 ;
@@ -2774,11 +2781,28 @@ impl<'a, Signer: Sign, K: KeysInterface<Signer = Signer>> ReadableArgs<&'a K>
2774
2781
return Err ( DecodeError :: InvalidValue ) ;
2775
2782
}
2776
2783
}
2777
- let onchain_tx_handler = ReadableArgs :: read ( reader, keys_manager) ?;
2784
+ let onchain_tx_handler: OnchainTxHandler < Signer > = ReadableArgs :: read ( reader, keys_manager) ?;
2778
2785
2779
2786
let lockdown_from_offchain = Readable :: read ( reader) ?;
2780
2787
let holder_tx_signed = Readable :: read ( reader) ?;
2781
2788
2789
+ if let Some ( prev_commitment_tx) = prev_holder_signed_commitment_tx. as_mut ( ) {
2790
+ let prev_holder_value = onchain_tx_handler. get_prev_holder_commitment_to_self_value ( ) ;
2791
+ if prev_holder_value. is_none ( ) { return Err ( DecodeError :: InvalidValue ) ; }
2792
+ if prev_commitment_tx. to_self_value_sat == u64:: max_value ( ) {
2793
+ prev_commitment_tx. to_self_value_sat = prev_holder_value. unwrap ( ) ;
2794
+ } else if prev_commitment_tx. to_self_value_sat != prev_holder_value. unwrap ( ) {
2795
+ return Err ( DecodeError :: InvalidValue ) ;
2796
+ }
2797
+ }
2798
+
2799
+ let cur_holder_value = onchain_tx_handler. get_cur_holder_commitment_to_self_value ( ) ;
2800
+ if current_holder_commitment_tx. to_self_value_sat == u64:: max_value ( ) {
2801
+ current_holder_commitment_tx. to_self_value_sat = cur_holder_value;
2802
+ } else if current_holder_commitment_tx. to_self_value_sat != cur_holder_value {
2803
+ return Err ( DecodeError :: InvalidValue ) ;
2804
+ }
2805
+
2782
2806
read_tlv_fields ! ( reader, { } ) ;
2783
2807
2784
2808
let mut secp_ctx = Secp256k1 :: new ( ) ;
0 commit comments