@@ -9,7 +9,7 @@ use ln::channel::{COMMITMENT_TX_BASE_WEIGHT, COMMITMENT_TX_WEIGHT_PER_HTLC};
9
9
use ln:: channelmanager:: { ChannelManager , ChannelManagerReadArgs , HTLCForwardInfo , RAACommitmentOrder , PaymentPreimage , PaymentHash , BREAKDOWN_TIMEOUT } ;
10
10
use ln:: channelmonitor:: { ChannelMonitor , CLTV_CLAIM_BUFFER , LATENCY_GRACE_PERIOD_BLOCKS , ManyChannelMonitor , ANTI_REORG_DELAY } ;
11
11
use ln:: channel:: { Channel , ChannelError } ;
12
- use ln:: onion_utils;
12
+ use ln:: { chan_utils , onion_utils} ;
13
13
use ln:: router:: { Route , RouteHop } ;
14
14
use ln:: features:: { ChannelFeatures , InitFeatures , NodeFeatures } ;
15
15
use ln:: msgs;
@@ -6972,6 +6972,32 @@ fn test_set_outpoints_partial_claiming() {
6972
6972
}
6973
6973
}
6974
6974
6975
+ #[ test]
6976
+ fn test_counterparty_raa_skip_no_crash ( ) {
6977
+ // Previously, if our counterparty sent two RAAs in a row without us having provided a
6978
+ // commitment transaction, we would have happily carried on and provided them the next
6979
+ // commitment transaction based on one RAA forward. This would probably eventually have led to
6980
+ // channel closure, but it would not have resulted in funds loss. Still, our
6981
+ // EnforcingChannelKeys would have paniced as it doesn't like jumps into the future. Here, we
6982
+ // check simply that the channel is closed in response to such an RAA, but don't check whether
6983
+ // we decide to punish our counterparty for revoking their funds (as we don't currently
6984
+ // implement that).
6985
+ let node_cfgs = create_node_cfgs ( 2 ) ;
6986
+ let node_chanmgrs = create_node_chanmgrs ( 2 , & node_cfgs, & [ None , None ] ) ;
6987
+ let nodes = create_network ( 2 , & node_cfgs, & node_chanmgrs) ;
6988
+ let channel_id = create_announced_chan_between_nodes ( & nodes, 0 , 1 , InitFeatures :: supported ( ) , InitFeatures :: supported ( ) ) . 2 ;
6989
+
6990
+ let commitment_seed = nodes[ 0 ] . node . channel_state . lock ( ) . unwrap ( ) . by_id . get_mut ( & channel_id) . unwrap ( ) . local_keys . commitment_seed ( ) . clone ( ) ;
6991
+ const INITIAL_COMMITMENT_NUMBER : u64 = ( 1 << 48 ) - 1 ;
6992
+ let next_per_commitment_point = PublicKey :: from_secret_key ( & Secp256k1 :: new ( ) ,
6993
+ & SecretKey :: from_slice ( & chan_utils:: build_commitment_secret ( & commitment_seed, INITIAL_COMMITMENT_NUMBER - 2 ) ) . unwrap ( ) ) ;
6994
+ let per_commitment_secret = chan_utils:: build_commitment_secret ( & commitment_seed, INITIAL_COMMITMENT_NUMBER ) ;
6995
+
6996
+ nodes[ 1 ] . node . handle_revoke_and_ack ( & nodes[ 0 ] . node . get_our_node_id ( ) ,
6997
+ & msgs:: RevokeAndACK { channel_id, per_commitment_secret, next_per_commitment_point } ) ;
6998
+ assert_eq ! ( check_closed_broadcast!( nodes[ 1 ] , true ) . unwrap( ) . data, "Received an unexpected revoke_and_ack" ) ;
6999
+ }
7000
+
6975
7001
#[ test]
6976
7002
fn test_bump_txn_sanitize_tracking_maps ( ) {
6977
7003
// Sanitizing pendning_claim_request and claimable_outpoints used to be buggy,
0 commit comments