@@ -22,7 +22,7 @@ use secp256k1;
22
22
23
23
use chain:: chaininterface:: { BroadcasterInterface , ChainListener , ChainWatchInterface , FeeEstimator } ;
24
24
use chain:: transaction:: OutPoint ;
25
- use ln:: channel:: { Channel , ChannelError } ;
25
+ use ln:: channel:: { Channel , ChannelError , COMMITMENT_TX_BASE_WEIGHT , COMMITMENT_TX_WEIGHT_PER_HTLC } ;
26
26
use ln:: channelmonitor:: { ChannelMonitor , ChannelMonitorUpdateErr , ManyChannelMonitor , CLTV_CLAIM_BUFFER , HTLC_FAIL_TIMEOUT_BLOCKS } ;
27
27
use ln:: router:: { Route , RouteHop } ;
28
28
use ln:: msgs;
@@ -3501,6 +3501,17 @@ mod tests {
3501
3501
}
3502
3502
}
3503
3503
3504
+ macro_rules! get_feerate {
3505
+ ( $node: expr, $channel_id: expr) => {
3506
+ {
3507
+ let chan_lock = $node. node. channel_state. lock( ) . unwrap( ) ;
3508
+ let chan = chan_lock. by_id. get( & $channel_id) . unwrap( ) ;
3509
+ chan. get_feerate( )
3510
+ }
3511
+ }
3512
+ }
3513
+
3514
+
3504
3515
fn create_chan_between_nodes_with_value_init ( node_a : & Node , node_b : & Node , channel_value : u64 , push_msat : u64 ) -> Transaction {
3505
3516
node_a. node . create_channel ( node_b. node . get_our_node_id ( ) , channel_value, push_msat, 42 ) . unwrap ( ) ;
3506
3517
node_b. node . handle_open_channel ( & node_a. node . get_our_node_id ( ) , & get_event_msg ! ( node_a, MessageSendEvent :: SendOpenChannel , node_b. node. get_our_node_id( ) ) ) . unwrap ( ) ;
@@ -4134,14 +4145,6 @@ mod tests {
4134
4145
let chan = create_announced_chan_between_nodes ( & nodes, 0 , 1 ) ;
4135
4146
let channel_id = chan. 2 ;
4136
4147
4137
- macro_rules! get_feerate {
4138
- ( $node: expr) => { {
4139
- let chan_lock = $node. node. channel_state. lock( ) . unwrap( ) ;
4140
- let chan = chan_lock. by_id. get( & channel_id) . unwrap( ) ;
4141
- chan. get_feerate( )
4142
- } }
4143
- }
4144
-
4145
4148
// balancing
4146
4149
send_payment ( & nodes[ 0 ] , & vec ! ( & nodes[ 1 ] ) [ ..] , 8000000 ) ;
4147
4150
@@ -4163,7 +4166,7 @@ mod tests {
4163
4166
// (6) RAA is delivered ->
4164
4167
4165
4168
// First nodes[0] generates an update_fee
4166
- nodes[ 0 ] . node . update_fee ( channel_id, get_feerate ! ( nodes[ 0 ] ) + 20 ) . unwrap ( ) ;
4169
+ nodes[ 0 ] . node . update_fee ( channel_id, get_feerate ! ( nodes[ 0 ] , channel_id ) + 20 ) . unwrap ( ) ;
4167
4170
check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
4168
4171
4169
4172
let events_0 = nodes[ 0 ] . node . get_and_clear_pending_msg_events ( ) ;
@@ -4252,19 +4255,11 @@ mod tests {
4252
4255
let chan = create_announced_chan_between_nodes ( & nodes, 0 , 1 ) ;
4253
4256
let channel_id = chan. 2 ;
4254
4257
4255
- macro_rules! get_feerate {
4256
- ( $node: expr) => { {
4257
- let chan_lock = $node. node. channel_state. lock( ) . unwrap( ) ;
4258
- let chan = chan_lock. by_id. get( & channel_id) . unwrap( ) ;
4259
- chan. get_feerate( )
4260
- } }
4261
- }
4262
-
4263
4258
// balancing
4264
4259
send_payment ( & nodes[ 0 ] , & vec ! ( & nodes[ 1 ] ) [ ..] , 8000000 ) ;
4265
4260
4266
4261
// First nodes[0] generates an update_fee
4267
- nodes[ 0 ] . node . update_fee ( channel_id, get_feerate ! ( nodes[ 0 ] ) + 20 ) . unwrap ( ) ;
4262
+ nodes[ 0 ] . node . update_fee ( channel_id, get_feerate ! ( nodes[ 0 ] , channel_id ) + 20 ) . unwrap ( ) ;
4268
4263
check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
4269
4264
4270
4265
let events_0 = nodes[ 0 ] . node . get_and_clear_pending_msg_events ( ) ;
@@ -4310,14 +4305,6 @@ mod tests {
4310
4305
let chan = create_announced_chan_between_nodes ( & nodes, 0 , 1 ) ;
4311
4306
let channel_id = chan. 2 ;
4312
4307
4313
- macro_rules! get_feerate {
4314
- ( $node: expr) => { {
4315
- let chan_lock = $node. node. channel_state. lock( ) . unwrap( ) ;
4316
- let chan = chan_lock. by_id. get( & channel_id) . unwrap( ) ;
4317
- chan. get_feerate( )
4318
- } }
4319
- }
4320
-
4321
4308
// A B
4322
4309
// update_fee/commitment_signed ->
4323
4310
// .- send (1) RAA and (2) commitment_signed
@@ -4338,7 +4325,7 @@ mod tests {
4338
4325
// revoke_and_ack ->
4339
4326
4340
4327
// First nodes[0] generates an update_fee
4341
- let initial_feerate = get_feerate ! ( nodes[ 0 ] ) ;
4328
+ let initial_feerate = get_feerate ! ( nodes[ 0 ] , channel_id ) ;
4342
4329
nodes[ 0 ] . node . update_fee ( channel_id, initial_feerate + 20 ) . unwrap ( ) ;
4343
4330
check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
4344
4331
@@ -4422,16 +4409,8 @@ mod tests {
4422
4409
let chan = create_announced_chan_between_nodes ( & nodes, 0 , 1 ) ;
4423
4410
let channel_id = chan. 2 ;
4424
4411
4425
- macro_rules! get_feerate {
4426
- ( $node: expr) => { {
4427
- let chan_lock = $node. node. channel_state. lock( ) . unwrap( ) ;
4428
- let chan = chan_lock. by_id. get( & channel_id) . unwrap( ) ;
4429
- chan. get_feerate( )
4430
- } }
4431
- }
4432
-
4433
- let feerate = get_feerate ! ( nodes[ 0 ] ) ;
4434
- nodes[ 0 ] . node . update_fee ( channel_id, feerate+20 ) . unwrap ( ) ;
4412
+ let feerate = get_feerate ! ( nodes[ 0 ] , channel_id) ;
4413
+ nodes[ 0 ] . node . update_fee ( channel_id, feerate+25 ) . unwrap ( ) ;
4435
4414
check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
4436
4415
4437
4416
let events_0 = nodes[ 0 ] . node . get_and_clear_pending_msg_events ( ) ;
@@ -4462,24 +4441,82 @@ mod tests {
4462
4441
check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
4463
4442
}
4464
4443
4444
+ #[ test]
4445
+ fn test_update_fee_that_funder_cannot_afford ( ) {
4446
+ let mut nodes = create_network ( 2 ) ;
4447
+ let chan = create_announced_chan_between_nodes_with_value ( & nodes, 0 , 1 , 1432 , 200000 ) ;
4448
+ let channel_id = chan. 2 ;
4449
+
4450
+ let feerate = 260 ;
4451
+ nodes[ 0 ] . node . update_fee ( channel_id, feerate) . unwrap ( ) ;
4452
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
4453
+
4454
+ let events_0 = nodes[ 0 ] . node . get_and_clear_pending_msg_events ( ) ;
4455
+ assert_eq ! ( events_0. len( ) , 1 ) ;
4456
+ let ( update_msg, commitment_signed) = match events_0[ 0 ] {
4457
+ MessageSendEvent :: UpdateHTLCs {
4458
+ node_id : _, updates : msgs:: CommitmentUpdate {
4459
+ update_add_htlcs : _, update_fulfill_htlcs : _, update_fail_htlcs : _, update_fail_malformed_htlcs : _, ref update_fee, ref commitment_signed
4460
+ }
4461
+ } => {
4462
+ ( update_fee. as_ref ( ) , commitment_signed)
4463
+ } ,
4464
+ _ => panic ! ( "Unexpected event" ) ,
4465
+ } ;
4466
+ nodes[ 1 ] . node . handle_update_fee ( & nodes[ 0 ] . node . get_our_node_id ( ) , update_msg. unwrap ( ) ) . unwrap ( ) ;
4467
+
4468
+ commitment_signed_dance ! ( nodes[ 1 ] , nodes[ 0 ] , commitment_signed, false ) ;
4469
+
4470
+ //Confirm that the new fee based on the last local commitment txn is what we expected based on the feerate of 260 set above.
4471
+ //This value results in a fee that is exactly what the funder can afford (277 sat + 1000 sat channel reserve)
4472
+ {
4473
+ let chan_lock = nodes[ 1 ] . node . channel_state . lock ( ) . unwrap ( ) ;
4474
+ let chan = chan_lock. by_id . get ( & channel_id) . unwrap ( ) ;
4475
+
4476
+ let num_htlcs = chan. last_local_commitment_txn [ 0 ] . output . len ( ) ;
4477
+ let total_fee: u64 = feerate * ( super :: COMMITMENT_TX_BASE_WEIGHT + ( num_htlcs as u64 ) * super :: COMMITMENT_TX_WEIGHT_PER_HTLC ) / 1000 ;
4478
+ let fee_for_single_update_to_commitment = feerate * ( super :: COMMITMENT_TX_BASE_WEIGHT + 1 * super :: COMMITMENT_TX_WEIGHT_PER_HTLC ) / 1000 ;
4479
+ assert_eq ! ( total_fee, fee_for_single_update_to_commitment) ;
4480
+ } //drop the mutex
4481
+
4482
+ nodes[ 0 ] . node . update_fee ( channel_id, feerate+1 ) . unwrap ( ) ;
4483
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
4484
+
4485
+ let events_0 = nodes[ 0 ] . node . get_and_clear_pending_msg_events ( ) ;
4486
+ assert_eq ! ( events_0. len( ) , 1 ) ;
4487
+ let ( update_msg, commitment_signed) = match events_0[ 0 ] {
4488
+ MessageSendEvent :: UpdateHTLCs { node_id : _, updates : msgs:: CommitmentUpdate { update_add_htlcs : _, update_fulfill_htlcs : _, update_fail_htlcs : _, update_fail_malformed_htlcs : _, ref update_fee, ref commitment_signed } } => {
4489
+ ( update_fee. as_ref ( ) , commitment_signed)
4490
+ } ,
4491
+ _ => panic ! ( "Unexpected event" ) ,
4492
+ } ;
4493
+
4494
+ nodes[ 1 ] . node . handle_update_fee ( & nodes[ 0 ] . node . get_our_node_id ( ) , update_msg. unwrap ( ) ) ;
4495
+
4496
+ //While producing the commitment_signed response after handling a received update_fee request the
4497
+ //check to see if the funder, who sent the update_fee request, can afford the new fee (funder_balance >= fee+channel_reserve)
4498
+ //Should produce and error.
4499
+ let err = nodes[ 1 ] . node . handle_commitment_signed ( & nodes[ 0 ] . node . get_our_node_id ( ) , & commitment_signed) . unwrap_err ( ) ;
4500
+
4501
+ assert ! ( match err. action. unwrap( ) {
4502
+ msgs:: ErrorAction :: DisconnectPeer { ..} => true ,
4503
+ _ => false ,
4504
+ } ) ;
4505
+
4506
+ //clear the message we could not handle
4507
+ nodes[ 1 ] . node . get_and_clear_pending_msg_events ( ) ;
4508
+ }
4509
+
4465
4510
#[ test]
4466
4511
fn test_update_fee_with_fundee_update_add_htlc ( ) {
4467
4512
let mut nodes = create_network ( 2 ) ;
4468
4513
let chan = create_announced_chan_between_nodes ( & nodes, 0 , 1 ) ;
4469
4514
let channel_id = chan. 2 ;
4470
4515
4471
- macro_rules! get_feerate {
4472
- ( $node: expr) => { {
4473
- let chan_lock = $node. node. channel_state. lock( ) . unwrap( ) ;
4474
- let chan = chan_lock. by_id. get( & channel_id) . unwrap( ) ;
4475
- chan. get_feerate( )
4476
- } }
4477
- }
4478
-
4479
4516
// balancing
4480
4517
send_payment ( & nodes[ 0 ] , & vec ! ( & nodes[ 1 ] ) [ ..] , 8000000 ) ;
4481
4518
4482
- let feerate = get_feerate ! ( nodes[ 0 ] ) ;
4519
+ let feerate = get_feerate ! ( nodes[ 0 ] , channel_id ) ;
4483
4520
nodes[ 0 ] . node . update_fee ( channel_id, feerate+20 ) . unwrap ( ) ;
4484
4521
check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
4485
4522
@@ -4577,14 +4614,6 @@ mod tests {
4577
4614
let chan = create_announced_chan_between_nodes ( & nodes, 0 , 1 ) ;
4578
4615
let channel_id = chan. 2 ;
4579
4616
4580
- macro_rules! get_feerate {
4581
- ( $node: expr) => { {
4582
- let chan_lock = $node. node. channel_state. lock( ) . unwrap( ) ;
4583
- let chan = chan_lock. by_id. get( & channel_id) . unwrap( ) ;
4584
- chan. get_feerate( )
4585
- } }
4586
- }
4587
-
4588
4617
// A B
4589
4618
// (1) update_fee/commitment_signed ->
4590
4619
// <- (2) revoke_and_ack
@@ -4600,7 +4629,7 @@ mod tests {
4600
4629
// revoke_and_ack ->
4601
4630
4602
4631
// Create and deliver (1)...
4603
- let feerate = get_feerate ! ( nodes[ 0 ] ) ;
4632
+ let feerate = get_feerate ! ( nodes[ 0 ] , channel_id ) ;
4604
4633
nodes[ 0 ] . node . update_fee ( channel_id, feerate+20 ) . unwrap ( ) ;
4605
4634
check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
4606
4635
@@ -4674,8 +4703,8 @@ mod tests {
4674
4703
check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
4675
4704
assert ! ( nodes[ 1 ] . node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
4676
4705
4677
- assert_eq ! ( get_feerate!( nodes[ 0 ] ) , feerate + 30 ) ;
4678
- assert_eq ! ( get_feerate!( nodes[ 1 ] ) , feerate + 30 ) ;
4706
+ assert_eq ! ( get_feerate!( nodes[ 0 ] , channel_id ) , feerate + 30 ) ;
4707
+ assert_eq ! ( get_feerate!( nodes[ 1 ] , channel_id ) , feerate + 30 ) ;
4679
4708
close_channel ( & nodes[ 0 ] , & nodes[ 1 ] , & chan. 2 , chan. 3 , true ) ;
4680
4709
}
4681
4710
0 commit comments