@@ -17,7 +17,7 @@ use crate::chain::chaininterface::LowerBoundedFeeEstimator;
17
17
use crate::chain::channelmonitor;
18
18
use crate::chain::channelmonitor::{CLTV_CLAIM_BUFFER, LATENCY_GRACE_PERIOD_BLOCKS, ANTI_REORG_DELAY};
19
19
use crate::chain::transaction::OutPoint;
20
- use crate :: sign:: { ChannelSigner , EcdsaChannelSigner , EntropySource } ;
20
+ use crate::sign::{ChannelSigner, EcdsaChannelSigner, EntropySource, SignerProvider };
21
21
use crate::events::{Event, MessageSendEvent, MessageSendEventsProvider, PathFailure, PaymentPurpose, ClosureReason, HTLCDestination, PaymentFailureReason};
22
22
use crate::ln::{PaymentPreimage, PaymentSecret, PaymentHash};
23
23
use crate::ln::channel::{commitment_tx_base_weight, COMMITMENT_TX_WEIGHT_PER_HTLC, CONCURRENT_INBOUND_HTLC_FEE_BUFFER, FEE_SPIKE_BUFFER_FEE_INCREASE_MULTIPLE, MIN_AFFORDABLE_HTLC_COUNT, get_holder_selected_channel_reserve_satoshis, OutboundV1Channel, InboundV1Channel};
@@ -31,7 +31,7 @@ use crate::ln::features::{ChannelFeatures, ChannelTypeFeatures, NodeFeatures};
31
31
use crate::ln::msgs;
32
32
use crate::ln::msgs::{ChannelMessageHandler, RoutingMessageHandler, ErrorAction};
33
33
use crate::util::enforcing_trait_impls::EnforcingSigner;
34
- use crate :: util:: test_utils;
34
+ use crate::util::test_utils::{self, WatchtowerPersister} ;
35
35
use crate::util::errors::APIError;
36
36
use crate::util::ser::{Writeable, ReadableArgs};
37
37
use crate::util::string::UntrustedString;
@@ -2549,6 +2549,70 @@ fn revoked_output_claim() {
2549
2549
check_closed_event!(nodes[0], 1, ClosureReason::CommitmentTxConfirmed);
2550
2550
}
2551
2551
2552
+ #[test]
2553
+ fn test_forming_justice_tx_from_monitor_updates() {
2554
+ do_test_forming_justice_tx_from_monitor_updates(true);
2555
+ do_test_forming_justice_tx_from_monitor_updates(false);
2556
+ }
2557
+
2558
+ fn do_test_forming_justice_tx_from_monitor_updates(broadcast_initial_commitment: bool) {
2559
+ // Simple test to make sure that the justice tx formed in WatchtowerPersister
2560
+ // is properly formed and can be broadcasted/confirmed successfully in the event
2561
+ // that a revoked commitment transaction is broadcasted
2562
+ // (Similar to `revoked_output_claim` test but we get the justice tx + broadcast manually)
2563
+ let chanmon_cfgs = create_chanmon_cfgs(2);
2564
+ let destination_script0 = chanmon_cfgs[0].keys_manager.get_destination_script().unwrap();
2565
+ let destination_script1 = chanmon_cfgs[1].keys_manager.get_destination_script().unwrap();
2566
+ let persisters = vec![WatchtowerPersister::new(destination_script0),
2567
+ WatchtowerPersister::new(destination_script1)];
2568
+ let node_cfgs = create_node_cfgs_with_persisters(2, &chanmon_cfgs, persisters.iter().collect());
2569
+ let node_chanmgrs = create_node_chanmgrs(2, &node_cfgs, &[None, None]);
2570
+ let nodes = create_network(2, &node_cfgs, &node_chanmgrs);
2571
+ let (_, _, channel_id, funding_tx) = create_announced_chan_between_nodes(&nodes, 0, 1);
2572
+ let funding_txo = OutPoint { txid: funding_tx.txid(), index: 0 };
2573
+
2574
+ if !broadcast_initial_commitment {
2575
+ // Send a payment to move the channel forward
2576
+ send_payment(&nodes[0], &vec!(&nodes[1])[..], 5_000_000);
2577
+ }
2578
+
2579
+ // node[0] is gonna to revoke an old state thus node[1] should be able to claim the revoked output.
2580
+ // We'll keep this commitment transaction to broadcast once it's revoked.
2581
+ let revoked_local_txn = get_local_commitment_txn!(nodes[0], channel_id);
2582
+ assert_eq!(revoked_local_txn.len(), 1);
2583
+ let revoked_commitment_tx = &revoked_local_txn[0];
2584
+
2585
+ // Send another payment, now revoking the previous commitment tx
2586
+ send_payment(&nodes[0], &vec!(&nodes[1])[..], 5_000_000);
2587
+
2588
+ let justice_tx = persisters[1].justice_tx(funding_txo, &revoked_commitment_tx.txid()).unwrap();
2589
+ check_spends!(justice_tx, revoked_commitment_tx);
2590
+
2591
+ mine_transactions(&nodes[1], &[revoked_commitment_tx, &justice_tx]);
2592
+ mine_transactions(&nodes[0], &[revoked_commitment_tx, &justice_tx]);
2593
+
2594
+ check_added_monitors!(nodes[1], 1);
2595
+ check_closed_event!(nodes[1], 1, ClosureReason::CommitmentTxConfirmed);
2596
+ get_announce_close_broadcast_events(&nodes, 1, 0);
2597
+
2598
+ check_added_monitors!(nodes[0], 1);
2599
+ check_closed_event!(nodes[0], 1, ClosureReason::CommitmentTxConfirmed);
2600
+
2601
+ // Check that the justice tx has sent the revoked output value to nodes[1]
2602
+ let monitor = get_monitor!(nodes[1], channel_id);
2603
+ let total_claimable_balance = monitor.get_claimable_balances().iter().fold(0, |sum, balance| {
2604
+ match balance {
2605
+ channelmonitor::Balance::ClaimableAwaitingConfirmations { claimable_amount_satoshis, .. } => sum + claimable_amount_satoshis,
2606
+ _ => panic!("Unexpected balance type"),
2607
+ }
2608
+ });
2609
+ // On the first commitment, node[1]'s balance was below dust so it didn't have an output
2610
+ let node1_channel_balance = if broadcast_initial_commitment { 0 } else { revoked_commitment_tx.output[0].value };
2611
+ let expected_claimable_balance = node1_channel_balance + justice_tx.output[0].value;
2612
+ assert_eq!(total_claimable_balance, expected_claimable_balance);
2613
+ }
2614
+
2615
+
2552
2616
#[test]
2553
2617
fn claim_htlc_outputs_shared_tx() {
2554
2618
// Node revoked old state, htlcs haven't time out yet, claim them in shared justice tx
0 commit comments