@@ -3212,6 +3212,7 @@ mod tests {
3212
3212
use chain:: chaininterface:: { ChainListener , ChainWatchInterface } ;
3213
3213
use chain:: keysinterface:: KeysInterface ;
3214
3214
use chain:: keysinterface;
3215
+ use ln:: channel:: { COMMITMENT_TX_BASE_WEIGHT , COMMITMENT_TX_WEIGHT_PER_HTLC } ;
3215
3216
use ln:: channelmanager:: { ChannelManager , ChannelManagerReadArgs , OnionKeys , PaymentFailReason , RAACommitmentOrder } ;
3216
3217
use ln:: channelmonitor:: { ChannelMonitor , ChannelMonitorUpdateErr , CLTV_CLAIM_BUFFER , HTLC_FAIL_TIMEOUT_BLOCKS , ManyChannelMonitor } ;
3217
3218
use ln:: router:: { Route , RouteHop , Router } ;
@@ -3501,6 +3502,17 @@ mod tests {
3501
3502
}
3502
3503
}
3503
3504
3505
+ macro_rules! get_feerate {
3506
+ ( $node: expr, $channel_id: expr) => {
3507
+ {
3508
+ let chan_lock = $node. node. channel_state. lock( ) . unwrap( ) ;
3509
+ let chan = chan_lock. by_id. get( & $channel_id) . unwrap( ) ;
3510
+ chan. get_feerate( )
3511
+ }
3512
+ }
3513
+ }
3514
+
3515
+
3504
3516
fn create_chan_between_nodes_with_value_init ( node_a : & Node , node_b : & Node , channel_value : u64 , push_msat : u64 ) -> Transaction {
3505
3517
node_a. node . create_channel ( node_b. node . get_our_node_id ( ) , channel_value, push_msat, 42 ) . unwrap ( ) ;
3506
3518
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 +4146,6 @@ mod tests {
4134
4146
let chan = create_announced_chan_between_nodes ( & nodes, 0 , 1 ) ;
4135
4147
let channel_id = chan. 2 ;
4136
4148
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
4149
// balancing
4146
4150
send_payment ( & nodes[ 0 ] , & vec ! ( & nodes[ 1 ] ) [ ..] , 8000000 ) ;
4147
4151
@@ -4163,7 +4167,7 @@ mod tests {
4163
4167
// (6) RAA is delivered ->
4164
4168
4165
4169
// First nodes[0] generates an update_fee
4166
- nodes[ 0 ] . node . update_fee ( channel_id, get_feerate ! ( nodes[ 0 ] ) + 20 ) . unwrap ( ) ;
4170
+ nodes[ 0 ] . node . update_fee ( channel_id, get_feerate ! ( nodes[ 0 ] , channel_id ) + 20 ) . unwrap ( ) ;
4167
4171
check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
4168
4172
4169
4173
let events_0 = nodes[ 0 ] . node . get_and_clear_pending_msg_events ( ) ;
@@ -4252,19 +4256,11 @@ mod tests {
4252
4256
let chan = create_announced_chan_between_nodes ( & nodes, 0 , 1 ) ;
4253
4257
let channel_id = chan. 2 ;
4254
4258
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
4259
// balancing
4264
4260
send_payment ( & nodes[ 0 ] , & vec ! ( & nodes[ 1 ] ) [ ..] , 8000000 ) ;
4265
4261
4266
4262
// First nodes[0] generates an update_fee
4267
- nodes[ 0 ] . node . update_fee ( channel_id, get_feerate ! ( nodes[ 0 ] ) + 20 ) . unwrap ( ) ;
4263
+ nodes[ 0 ] . node . update_fee ( channel_id, get_feerate ! ( nodes[ 0 ] , channel_id ) + 20 ) . unwrap ( ) ;
4268
4264
check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
4269
4265
4270
4266
let events_0 = nodes[ 0 ] . node . get_and_clear_pending_msg_events ( ) ;
@@ -4310,14 +4306,6 @@ mod tests {
4310
4306
let chan = create_announced_chan_between_nodes ( & nodes, 0 , 1 ) ;
4311
4307
let channel_id = chan. 2 ;
4312
4308
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
4309
// A B
4322
4310
// update_fee/commitment_signed ->
4323
4311
// .- send (1) RAA and (2) commitment_signed
@@ -4338,7 +4326,7 @@ mod tests {
4338
4326
// revoke_and_ack ->
4339
4327
4340
4328
// First nodes[0] generates an update_fee
4341
- let initial_feerate = get_feerate ! ( nodes[ 0 ] ) ;
4329
+ let initial_feerate = get_feerate ! ( nodes[ 0 ] , channel_id ) ;
4342
4330
nodes[ 0 ] . node . update_fee ( channel_id, initial_feerate + 20 ) . unwrap ( ) ;
4343
4331
check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
4344
4332
@@ -4422,16 +4410,8 @@ mod tests {
4422
4410
let chan = create_announced_chan_between_nodes ( & nodes, 0 , 1 ) ;
4423
4411
let channel_id = chan. 2 ;
4424
4412
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 ( ) ;
4413
+ let feerate = get_feerate ! ( nodes[ 0 ] , channel_id) ;
4414
+ nodes[ 0 ] . node . update_fee ( channel_id, feerate+25 ) . unwrap ( ) ;
4435
4415
check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
4436
4416
4437
4417
let events_0 = nodes[ 0 ] . node . get_and_clear_pending_msg_events ( ) ;
@@ -4462,24 +4442,69 @@ mod tests {
4462
4442
check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
4463
4443
}
4464
4444
4445
+ #[ test]
4446
+ fn test_update_fee_that_funder_cannot_afford ( ) {
4447
+ let mut nodes = create_network ( 2 ) ;
4448
+ let channel_value = 1888 ;
4449
+ let chan = create_announced_chan_between_nodes_with_value ( & nodes, 0 , 1 , channel_value, 700000 ) ;
4450
+ let channel_id = chan. 2 ;
4451
+
4452
+ let feerate = 260 ;
4453
+ nodes[ 0 ] . node . update_fee ( channel_id, feerate) . unwrap ( ) ;
4454
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
4455
+ let update_msg = get_htlc_update_msgs ! ( nodes[ 0 ] , nodes[ 1 ] . node. get_our_node_id( ) ) ;
4456
+
4457
+ nodes[ 1 ] . node . handle_update_fee ( & nodes[ 0 ] . node . get_our_node_id ( ) , & update_msg. update_fee . unwrap ( ) ) . unwrap ( ) ;
4458
+
4459
+ commitment_signed_dance ! ( nodes[ 1 ] , nodes[ 0 ] , update_msg. commitment_signed, false ) ;
4460
+
4461
+ //Confirm that the new fee based on the last local commitment txn is what we expected based on the feerate of 260 set above.
4462
+ //This value results in a fee that is exactly what the funder can afford (277 sat + 1000 sat channel reserve)
4463
+ {
4464
+ let chan_lock = nodes[ 1 ] . node . channel_state . lock ( ) . unwrap ( ) ;
4465
+ let chan = chan_lock. by_id . get ( & channel_id) . unwrap ( ) ;
4466
+
4467
+ //We made sure neither party's funds are below the dust limit so -2 non-HTLC txns from number of outputs
4468
+ let num_htlcs = chan. last_local_commitment_txn [ 0 ] . output . len ( ) - 2 ;
4469
+ let total_fee: u64 = feerate * ( COMMITMENT_TX_BASE_WEIGHT + ( num_htlcs as u64 ) * COMMITMENT_TX_WEIGHT_PER_HTLC ) / 1000 ;
4470
+ let mut actual_fee = chan. last_local_commitment_txn [ 0 ] . output . iter ( ) . fold ( 0 , |acc, output| acc + output. value ) ;
4471
+ actual_fee = channel_value - actual_fee;
4472
+ assert_eq ! ( total_fee, actual_fee) ;
4473
+ } //drop the mutex
4474
+
4475
+ //Add 2 to the previous fee rate to the final fee increases by 1 (with no HTLCs the fee is essentially
4476
+ //fee_rate*(724/1000) so the increment of 1*0.724 is rounded back down)
4477
+ nodes[ 0 ] . node . update_fee ( channel_id, feerate+2 ) . unwrap ( ) ;
4478
+ check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
4479
+
4480
+ let update2_msg = get_htlc_update_msgs ! ( nodes[ 0 ] , nodes[ 1 ] . node. get_our_node_id( ) ) ;
4481
+
4482
+ nodes[ 1 ] . node . handle_update_fee ( & nodes[ 0 ] . node . get_our_node_id ( ) , & update2_msg. update_fee . unwrap ( ) ) ;
4483
+
4484
+ //While producing the commitment_signed response after handling a received update_fee request the
4485
+ //check to see if the funder, who sent the update_fee request, can afford the new fee (funder_balance >= fee+channel_reserve)
4486
+ //Should produce and error.
4487
+ let err = nodes[ 1 ] . node . handle_commitment_signed ( & nodes[ 0 ] . node . get_our_node_id ( ) , & update2_msg. commitment_signed ) . unwrap_err ( ) ;
4488
+
4489
+ assert ! ( match err. err {
4490
+ "Funding remote cannot afford proposed new fee" => true ,
4491
+ _ => false ,
4492
+ } ) ;
4493
+
4494
+ //clear the message we could not handle
4495
+ nodes[ 1 ] . node . get_and_clear_pending_msg_events ( ) ;
4496
+ }
4497
+
4465
4498
#[ test]
4466
4499
fn test_update_fee_with_fundee_update_add_htlc ( ) {
4467
4500
let mut nodes = create_network ( 2 ) ;
4468
4501
let chan = create_announced_chan_between_nodes ( & nodes, 0 , 1 ) ;
4469
4502
let channel_id = chan. 2 ;
4470
4503
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
4504
// balancing
4480
4505
send_payment ( & nodes[ 0 ] , & vec ! ( & nodes[ 1 ] ) [ ..] , 8000000 ) ;
4481
4506
4482
- let feerate = get_feerate ! ( nodes[ 0 ] ) ;
4507
+ let feerate = get_feerate ! ( nodes[ 0 ] , channel_id ) ;
4483
4508
nodes[ 0 ] . node . update_fee ( channel_id, feerate+20 ) . unwrap ( ) ;
4484
4509
check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
4485
4510
@@ -4577,14 +4602,6 @@ mod tests {
4577
4602
let chan = create_announced_chan_between_nodes ( & nodes, 0 , 1 ) ;
4578
4603
let channel_id = chan. 2 ;
4579
4604
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
4605
// A B
4589
4606
// (1) update_fee/commitment_signed ->
4590
4607
// <- (2) revoke_and_ack
@@ -4600,7 +4617,7 @@ mod tests {
4600
4617
// revoke_and_ack ->
4601
4618
4602
4619
// Create and deliver (1)...
4603
- let feerate = get_feerate ! ( nodes[ 0 ] ) ;
4620
+ let feerate = get_feerate ! ( nodes[ 0 ] , channel_id ) ;
4604
4621
nodes[ 0 ] . node . update_fee ( channel_id, feerate+20 ) . unwrap ( ) ;
4605
4622
check_added_monitors ! ( nodes[ 0 ] , 1 ) ;
4606
4623
@@ -4674,8 +4691,8 @@ mod tests {
4674
4691
check_added_monitors ! ( nodes[ 1 ] , 1 ) ;
4675
4692
assert ! ( nodes[ 1 ] . node. get_and_clear_pending_msg_events( ) . is_empty( ) ) ;
4676
4693
4677
- assert_eq ! ( get_feerate!( nodes[ 0 ] ) , feerate + 30 ) ;
4678
- assert_eq ! ( get_feerate!( nodes[ 1 ] ) , feerate + 30 ) ;
4694
+ assert_eq ! ( get_feerate!( nodes[ 0 ] , channel_id ) , feerate + 30 ) ;
4695
+ assert_eq ! ( get_feerate!( nodes[ 1 ] , channel_id ) , feerate + 30 ) ;
4679
4696
close_channel ( & nodes[ 0 ] , & nodes[ 1 ] , & chan. 2 , chan. 3 , true ) ;
4680
4697
}
4681
4698
0 commit comments