@@ -1560,17 +1560,17 @@ class NormalSplicesStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLik
1560
1560
awaitCond(bob.stateName == OFFLINE )
1561
1561
}
1562
1562
1563
- private def reconnect (f : FixtureParam ): (ChannelReestablish , ChannelReestablish ) = {
1563
+ private def reconnect (f : FixtureParam , sendReestablish : Boolean = true ): (ChannelReestablish , ChannelReestablish ) = {
1564
1564
import f ._
1565
1565
1566
1566
val aliceInit = Init (alice.stateData.asInstanceOf [ChannelDataWithCommitments ].commitments.params.localParams.initFeatures)
1567
1567
val bobInit = Init (bob.stateData.asInstanceOf [ChannelDataWithCommitments ].commitments.params.localParams.initFeatures)
1568
1568
alice ! INPUT_RECONNECTED (alice2bob.ref, aliceInit, bobInit)
1569
1569
bob ! INPUT_RECONNECTED (bob2alice.ref, bobInit, aliceInit)
1570
1570
val channelReestablishAlice = alice2bob.expectMsgType[ChannelReestablish ]
1571
- alice2bob.forward(bob)
1571
+ if (sendReestablish) alice2bob.forward(bob)
1572
1572
val channelReestablishBob = bob2alice.expectMsgType[ChannelReestablish ]
1573
- bob2alice.forward(alice)
1573
+ if (sendReestablish) bob2alice.forward(alice)
1574
1574
(channelReestablishAlice, channelReestablishBob)
1575
1575
}
1576
1576
@@ -1638,6 +1638,54 @@ class NormalSplicesStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLik
1638
1638
resolveHtlcs(f, htlcs)
1639
1639
}
1640
1640
1641
+ test(" disconnect (commit_sig not received, reestablish with previous commitment_number)" ) { f =>
1642
+ import f ._
1643
+
1644
+ val htlcs = setupHtlcs(f)
1645
+ val aliceCommitIndex = alice.stateData.asInstanceOf [DATA_NORMAL ].commitments.localCommitIndex
1646
+ val bobCommitIndex = bob.stateData.asInstanceOf [DATA_NORMAL ].commitments.localCommitIndex
1647
+
1648
+ val sender = initiateSpliceWithoutSigs(f, spliceIn_opt = Some (SpliceIn (500_000 sat)), spliceOut_opt = Some (SpliceOut (100_000 sat, defaultSpliceOutScriptPubKey)))
1649
+ alice2bob.expectMsgType[CommitSig ] // Bob doesn't receive Alice's commit_sig
1650
+ bob2alice.expectMsgType[CommitSig ] // Alice doesn't receive Bob's commit_sig
1651
+ awaitCond(alice.stateData.asInstanceOf [DATA_NORMAL ].spliceStatus.isInstanceOf [SpliceStatus .SpliceWaitingForSigs ])
1652
+ val spliceStatus = alice.stateData.asInstanceOf [DATA_NORMAL ].spliceStatus.asInstanceOf [SpliceStatus .SpliceWaitingForSigs ]
1653
+
1654
+ disconnect(f)
1655
+ val (channelReestablishAlice, channelReestablishBob) = reconnect(f, sendReestablish = false )
1656
+ assert(channelReestablishAlice.nextFundingTxId_opt.contains(spliceStatus.signingSession.fundingTx.txId))
1657
+ assert(channelReestablishAlice.nextLocalCommitmentNumber == aliceCommitIndex + 1 )
1658
+ alice2bob.forward(bob, channelReestablishAlice.copy(nextLocalCommitmentNumber = aliceCommitIndex))
1659
+ assert(channelReestablishBob.nextFundingTxId_opt.contains(spliceStatus.signingSession.fundingTx.txId))
1660
+ assert(channelReestablishBob.nextLocalCommitmentNumber == bobCommitIndex + 1 )
1661
+ bob2alice.forward(alice, channelReestablishBob.copy(nextLocalCommitmentNumber = bobCommitIndex))
1662
+
1663
+ // Alice and Bob retransmit commit_sig and tx_signatures.
1664
+ alice2bob.expectMsgType[CommitSig ]
1665
+ alice2bob.forward(bob)
1666
+ bob2alice.expectMsgType[CommitSig ]
1667
+ bob2alice.forward(alice)
1668
+ bob2alice.expectMsgType[TxSignatures ]
1669
+ bob2alice.forward(alice)
1670
+ alice2bob.expectMsgType[TxSignatures ]
1671
+ alice2bob.forward(bob)
1672
+ sender.expectMsgType[RES_SPLICE ]
1673
+
1674
+ val spliceTx = alice.stateData.asInstanceOf [DATA_NORMAL ].commitments.latest.localFundingStatus.signedTx_opt.get
1675
+ alice2blockchain.expectWatchFundingConfirmed(spliceTx.txid)
1676
+ bob2blockchain.expectWatchFundingConfirmed(spliceTx.txid)
1677
+ alice ! WatchFundingConfirmedTriggered (BlockHeight (42 ), 0 , spliceTx)
1678
+ alice2bob.expectMsgType[SpliceLocked ]
1679
+ alice2bob.forward(bob)
1680
+ bob ! WatchFundingConfirmedTriggered (BlockHeight (42 ), 0 , spliceTx)
1681
+ bob2alice.expectMsgType[SpliceLocked ]
1682
+ bob2alice.forward(alice)
1683
+ awaitCond(alice.stateData.asInstanceOf [DATA_NORMAL ].commitments.active.size == 1 )
1684
+ awaitCond(bob.stateData.asInstanceOf [DATA_NORMAL ].commitments.active.size == 1 )
1685
+
1686
+ resolveHtlcs(f, htlcs)
1687
+ }
1688
+
1641
1689
test(" disconnect (commit_sig received by alice)" ) { f =>
1642
1690
import f ._
1643
1691
@@ -1686,6 +1734,56 @@ class NormalSplicesStateSpec extends TestKitBaseClass with FixtureAnyFunSuiteLik
1686
1734
resolveHtlcs(f, htlcs)
1687
1735
}
1688
1736
1737
+ test(" disconnect (commit_sig received by alice, reestablish with previous commitment_number)" ) { f =>
1738
+ import f ._
1739
+
1740
+ val htlcs = setupHtlcs(f)
1741
+ val aliceCommitIndex = alice.stateData.asInstanceOf [DATA_NORMAL ].commitments.localCommitIndex
1742
+ val bobCommitIndex = bob.stateData.asInstanceOf [DATA_NORMAL ].commitments.localCommitIndex
1743
+ assert(aliceCommitIndex != bobCommitIndex)
1744
+
1745
+ val sender = initiateSpliceWithoutSigs(f, spliceIn_opt = Some (SpliceIn (500_000 sat)), spliceOut_opt = Some (SpliceOut (100_000 sat, defaultSpliceOutScriptPubKey)))
1746
+ alice2bob.expectMsgType[CommitSig ] // Bob doesn't receive Alice's commit_sig
1747
+ bob2alice.expectMsgType[CommitSig ]
1748
+ bob2alice.forward(alice)
1749
+ awaitCond(alice.stateData.asInstanceOf [DATA_NORMAL ].spliceStatus.isInstanceOf [SpliceStatus .SpliceWaitingForSigs ])
1750
+ val spliceStatus = alice.stateData.asInstanceOf [DATA_NORMAL ].spliceStatus.asInstanceOf [SpliceStatus .SpliceWaitingForSigs ]
1751
+
1752
+ disconnect(f)
1753
+ val (channelReestablishAlice, channelReestablishBob) = reconnect(f, sendReestablish = false )
1754
+ assert(channelReestablishAlice.nextFundingTxId_opt.contains(spliceStatus.signingSession.fundingTx.txId))
1755
+ assert(channelReestablishAlice.nextLocalCommitmentNumber == aliceCommitIndex + 1 )
1756
+ alice2bob.forward(bob, channelReestablishAlice)
1757
+ assert(channelReestablishBob.nextFundingTxId_opt.contains(spliceStatus.signingSession.fundingTx.txId))
1758
+ assert(channelReestablishBob.nextLocalCommitmentNumber == bobCommitIndex + 1 )
1759
+ bob2alice.forward(alice, channelReestablishBob.copy(nextLocalCommitmentNumber = bobCommitIndex))
1760
+
1761
+ // Alice and Bob retransmit commit_sig and tx_signatures.
1762
+ alice2bob.expectMsgType[CommitSig ]
1763
+ alice2bob.forward(bob)
1764
+ bob2alice.expectMsgType[CommitSig ]
1765
+ bob2alice.forward(alice)
1766
+ bob2alice.expectMsgType[TxSignatures ]
1767
+ bob2alice.forward(alice)
1768
+ alice2bob.expectMsgType[TxSignatures ]
1769
+ alice2bob.forward(bob)
1770
+ sender.expectMsgType[RES_SPLICE ]
1771
+
1772
+ val spliceTx = alice.stateData.asInstanceOf [DATA_NORMAL ].commitments.latest.localFundingStatus.signedTx_opt.get
1773
+ alice2blockchain.expectWatchFundingConfirmed(spliceTx.txid)
1774
+ bob2blockchain.expectWatchFundingConfirmed(spliceTx.txid)
1775
+ alice ! WatchFundingConfirmedTriggered (BlockHeight (42 ), 0 , spliceTx)
1776
+ alice2bob.expectMsgType[SpliceLocked ]
1777
+ alice2bob.forward(bob)
1778
+ bob ! WatchFundingConfirmedTriggered (BlockHeight (42 ), 0 , spliceTx)
1779
+ bob2alice.expectMsgType[SpliceLocked ]
1780
+ bob2alice.forward(alice)
1781
+ awaitCond(alice.stateData.asInstanceOf [DATA_NORMAL ].commitments.active.size == 1 )
1782
+ awaitCond(bob.stateData.asInstanceOf [DATA_NORMAL ].commitments.active.size == 1 )
1783
+
1784
+ resolveHtlcs(f, htlcs)
1785
+ }
1786
+
1689
1787
test(" disconnect (tx_signatures sent by bob)" ) { f =>
1690
1788
import f ._
1691
1789
0 commit comments