@ -1694,13 +1694,13 @@ class LightningDTests(BaseLightningDTests):
payfuture = self . executor . submit ( l1 . rpc . pay , inv )
payfuture = self . executor . submit ( l1 . rpc . pay , inv )
# l1 will drop to chain, not reconnect.
# l1 will disconnect, and not reconnect.
l1 . daemon . wait_for_log ( ' dev_disconnect: @WIRE_REVOKE_AND_ACK ' )
l1 . daemon . wait_for_log ( ' dev_disconnect: @WIRE_REVOKE_AND_ACK ' )
# Takes 6 blocks to timeout (cltv-final + 1), but we also give grace period of 1 block.
# Takes 6 blocks to timeout (cltv-final + 1), but we also give grace period of 1 block.
bitcoind . generate_block ( 5 + 1 )
bitcoind . generate_block ( 5 + 1 )
assert not l1 . daemon . is_in_log ( ' hit deadline ' )
assert not l1 . daemon . is_in_log ( ' hit deadline ' )
bitcoind . generate_block ( 2 )
bitcoind . generate_block ( 1 )
l1 . daemon . wait_for_log ( ' Offered HTLC 0 SENT_ADD_ACK_REVOCATION cltv .* hit deadline ' )
l1 . daemon . wait_for_log ( ' Offered HTLC 0 SENT_ADD_ACK_REVOCATION cltv .* hit deadline ' )
l1 . daemon . wait_for_log ( ' sendrawtx exit 0 ' )
l1 . daemon . wait_for_log ( ' sendrawtx exit 0 ' )
@ -1708,6 +1708,26 @@ class LightningDTests(BaseLightningDTests):
l1 . daemon . wait_for_log ( ' -> ONCHAIND_OUR_UNILATERAL ' )
l1 . daemon . wait_for_log ( ' -> ONCHAIND_OUR_UNILATERAL ' )
l2 . daemon . wait_for_log ( ' -> ONCHAIND_THEIR_UNILATERAL ' )
l2 . daemon . wait_for_log ( ' -> ONCHAIND_THEIR_UNILATERAL ' )
# L1 will timeout HTLC immediately
l1 . daemon . wait_for_logs ( [ ' Propose handling OUR_UNILATERAL/OUR_HTLC by OUR_HTLC_TIMEOUT_TX .* in 0 blocks ' ,
' Propose handling OUR_UNILATERAL/DELAYED_OUTPUT_TO_US by OUR_DELAYED_RETURN_TO_WALLET .* in 5 blocks ' ] )
l1 . daemon . wait_for_log ( ' sendrawtx exit 0 ' )
bitcoind . generate_block ( 1 )
l1 . daemon . wait_for_log ( ' Propose handling OUR_HTLC_TIMEOUT_TX/DELAYED_OUTPUT_TO_US by OUR_DELAYED_RETURN_TO_WALLET .* in 5 blocks ' )
bitcoind . generate_block ( 5 )
# It should now claim both the to-local and htlc-timeout-tx outputs.
l1 . daemon . wait_for_logs ( [ ' Broadcasting OUR_DELAYED_RETURN_TO_WALLET ' ,
' Broadcasting OUR_DELAYED_RETURN_TO_WALLET ' ,
' sendrawtx exit 0 ' ,
' sendrawtx exit 0 ' ] )
# Now, 100 blocks it should be done.
bitcoind . generate_block ( 100 )
l1 . daemon . wait_for_log ( ' onchaind complete, forgetting peer ' )
l2 . daemon . wait_for_log ( ' onchaind complete, forgetting peer ' )
@unittest . skipIf ( not DEVELOPER , " needs DEVELOPER=1 " )
@unittest . skipIf ( not DEVELOPER , " needs DEVELOPER=1 " )
def test_htlc_in_timeout ( self ) :
def test_htlc_in_timeout ( self ) :
""" Test that we drop onchain if the peer doesn ' t accept fulfilled HTLC """
""" Test that we drop onchain if the peer doesn ' t accept fulfilled HTLC """
@ -1734,13 +1754,13 @@ class LightningDTests(BaseLightningDTests):
payfuture = self . executor . submit ( l1 . rpc . pay , inv )
payfuture = self . executor . submit ( l1 . rpc . pay , inv )
# l1 will drop to chain, not reconnect.
# l1 will disonnect and not reconnect.
l1 . daemon . wait_for_log ( ' dev_disconnect: -WIRE_REVOKE_AND_ACK ' )
l1 . daemon . wait_for_log ( ' dev_disconnect: -WIRE_REVOKE_AND_ACK ' )
# Deadline HTLC expiry minus 1/2 cltv-expiry delta (rounded up) (== cltv - 3). ctlv is 5+1.
# Deadline HTLC expiry minus 1/2 cltv-expiry delta (rounded up) (== cltv - 3). ctlv is 5+1.
bitcoind . generate_block ( 2 )
bitcoind . generate_block ( 2 )
assert not l2 . daemon . is_in_log ( ' hit deadline ' )
assert not l2 . daemon . is_in_log ( ' hit deadline ' )
bitcoind . generate_block ( 2 )
bitcoind . generate_block ( 1 )
l2 . daemon . wait_for_log ( ' Fulfilled HTLC 0 SENT_REMOVE_COMMIT cltv .* hit deadline ' )
l2 . daemon . wait_for_log ( ' Fulfilled HTLC 0 SENT_REMOVE_COMMIT cltv .* hit deadline ' )
l2 . daemon . wait_for_log ( ' sendrawtx exit 0 ' )
l2 . daemon . wait_for_log ( ' sendrawtx exit 0 ' )
@ -1748,6 +1768,20 @@ class LightningDTests(BaseLightningDTests):
l2 . daemon . wait_for_log ( ' -> ONCHAIND_OUR_UNILATERAL ' )
l2 . daemon . wait_for_log ( ' -> ONCHAIND_OUR_UNILATERAL ' )
l1 . daemon . wait_for_log ( ' -> ONCHAIND_THEIR_UNILATERAL ' )
l1 . daemon . wait_for_log ( ' -> ONCHAIND_THEIR_UNILATERAL ' )
# L2 will collect HTLC
l2 . daemon . wait_for_log ( ' Propose handling OUR_UNILATERAL/THEIR_HTLC by OUR_HTLC_SUCCESS_TX .* in 0 blocks ' )
l2 . daemon . wait_for_log ( ' sendrawtx exit 0 ' )
bitcoind . generate_block ( 1 )
l2 . daemon . wait_for_log ( ' Propose handling OUR_HTLC_SUCCESS_TX/DELAYED_OUTPUT_TO_US by OUR_DELAYED_RETURN_TO_WALLET .* in 5 blocks ' )
bitcoind . generate_block ( 5 )
l2 . daemon . wait_for_log ( ' Broadcasting OUR_DELAYED_RETURN_TO_WALLET ' )
l2 . daemon . wait_for_log ( ' sendrawtx exit 0 ' )
# Now, 100 blocks it should be both done.
bitcoind . generate_block ( 100 )
l1 . daemon . wait_for_log ( ' onchaind complete, forgetting peer ' )
l2 . daemon . wait_for_log ( ' onchaind complete, forgetting peer ' )
@unittest . skipIf ( not DEVELOPER , " needs DEVELOPER=1 " )
@unittest . skipIf ( not DEVELOPER , " needs DEVELOPER=1 " )
def test_disconnect ( self ) :
def test_disconnect ( self ) :
# These should all make us fail, and retry.
# These should all make us fail, and retry.