@@ -270,11 +270,15 @@ struct HolderSignedTx {
270
270
b_htlc_key : PublicKey ,
271
271
delayed_payment_key : PublicKey ,
272
272
per_commitment_point : PublicKey ,
273
- feerate_per_kw : u32 ,
274
273
htlc_outputs : Vec < ( HTLCOutputInCommitment , Option < Signature > , Option < HTLCSource > ) > ,
274
+ to_self_value_sat : u64 ,
275
+ feerate_per_kw : u32 ,
275
276
}
276
277
impl_writeable_tlv_based ! ( HolderSignedTx , {
277
278
( 0 , txid, required) ,
279
+ // Note that this is filled in with data from OnchainTxHandler if its missing. For
280
+ // HolderSignedTx objects serialized with 0.0.100+, this should be filled in.
281
+ ( 1 , to_self_value_sat, ( default_value, u64 :: max_value( ) ) ) ,
278
282
( 2 , revocation_key, required) ,
279
283
( 4 , a_htlc_key, required) ,
280
284
( 6 , b_htlc_key, required) ,
@@ -855,8 +859,9 @@ impl<Signer: Sign> ChannelMonitor<Signer> {
855
859
b_htlc_key : tx_keys. countersignatory_htlc_key ,
856
860
delayed_payment_key : tx_keys. broadcaster_delayed_payment_key ,
857
861
per_commitment_point : tx_keys. per_commitment_point ,
858
- feerate_per_kw : trusted_tx. feerate_per_kw ( ) ,
859
862
htlc_outputs : Vec :: new ( ) , // There are never any HTLCs in the initial commitment transactions
863
+ to_self_value_sat : initial_holder_commitment_tx. to_broadcaster_value_sat ( ) ,
864
+ feerate_per_kw : trusted_tx. feerate_per_kw ( ) ,
860
865
} ;
861
866
( holder_commitment_tx, trusted_tx. commitment_number ( ) )
862
867
} ;
@@ -1397,8 +1402,9 @@ impl<Signer: Sign> ChannelMonitorImpl<Signer> {
1397
1402
b_htlc_key : tx_keys. countersignatory_htlc_key ,
1398
1403
delayed_payment_key : tx_keys. broadcaster_delayed_payment_key ,
1399
1404
per_commitment_point : tx_keys. per_commitment_point ,
1400
- feerate_per_kw : trusted_tx. feerate_per_kw ( ) ,
1401
1405
htlc_outputs,
1406
+ to_self_value_sat : holder_commitment_tx. to_broadcaster_value_sat ( ) ,
1407
+ feerate_per_kw : trusted_tx. feerate_per_kw ( ) ,
1402
1408
}
1403
1409
} ;
1404
1410
self . onchain_tx_handler . provide_latest_holder_tx ( holder_commitment_tx) ;
@@ -2668,14 +2674,15 @@ impl<'a, Signer: Sign, K: KeysInterface<Signer = Signer>> ReadableArgs<&'a K>
2668
2674
}
2669
2675
}
2670
2676
2671
- let prev_holder_signed_commitment_tx = match <u8 as Readable >:: read ( reader) ? {
2672
- 0 => None ,
2673
- 1 => {
2674
- Some ( Readable :: read ( reader) ?)
2675
- } ,
2676
- _ => return Err ( DecodeError :: InvalidValue ) ,
2677
- } ;
2678
- let current_holder_commitment_tx = Readable :: read ( reader) ?;
2677
+ let mut prev_holder_signed_commitment_tx: Option < HolderSignedTx > =
2678
+ match <u8 as Readable >:: read ( reader) ? {
2679
+ 0 => None ,
2680
+ 1 => {
2681
+ Some ( Readable :: read ( reader) ?)
2682
+ } ,
2683
+ _ => return Err ( DecodeError :: InvalidValue ) ,
2684
+ } ;
2685
+ let mut current_holder_commitment_tx: HolderSignedTx = Readable :: read ( reader) ?;
2679
2686
2680
2687
let current_counterparty_commitment_number = <U48 as Readable >:: read ( reader) ?. 0 ;
2681
2688
let current_holder_commitment_number = <U48 as Readable >:: read ( reader) ?. 0 ;
@@ -2732,11 +2739,28 @@ impl<'a, Signer: Sign, K: KeysInterface<Signer = Signer>> ReadableArgs<&'a K>
2732
2739
return Err ( DecodeError :: InvalidValue ) ;
2733
2740
}
2734
2741
}
2735
- let onchain_tx_handler = ReadableArgs :: read ( reader, keys_manager) ?;
2742
+ let onchain_tx_handler: OnchainTxHandler < Signer > = ReadableArgs :: read ( reader, keys_manager) ?;
2736
2743
2737
2744
let lockdown_from_offchain = Readable :: read ( reader) ?;
2738
2745
let holder_tx_signed = Readable :: read ( reader) ?;
2739
2746
2747
+ if let Some ( prev_commitment_tx) = prev_holder_signed_commitment_tx. as_mut ( ) {
2748
+ let prev_holder_value = onchain_tx_handler. get_prev_holder_commitment_to_self_value ( ) ;
2749
+ if prev_holder_value. is_none ( ) { return Err ( DecodeError :: InvalidValue ) ; }
2750
+ if prev_commitment_tx. to_self_value_sat == u64:: max_value ( ) {
2751
+ prev_commitment_tx. to_self_value_sat = prev_holder_value. unwrap ( ) ;
2752
+ } else if prev_commitment_tx. to_self_value_sat != prev_holder_value. unwrap ( ) {
2753
+ return Err ( DecodeError :: InvalidValue ) ;
2754
+ }
2755
+ }
2756
+
2757
+ let cur_holder_value = onchain_tx_handler. get_cur_holder_commitment_to_self_value ( ) ;
2758
+ if current_holder_commitment_tx. to_self_value_sat == u64:: max_value ( ) {
2759
+ current_holder_commitment_tx. to_self_value_sat = cur_holder_value;
2760
+ } else if current_holder_commitment_tx. to_self_value_sat != cur_holder_value {
2761
+ return Err ( DecodeError :: InvalidValue ) ;
2762
+ }
2763
+
2740
2764
read_tlv_fields ! ( reader, { } ) ;
2741
2765
2742
2766
let mut secp_ctx = Secp256k1 :: new ( ) ;
0 commit comments