From b0b86c9eb849155da72b5453b0ce7190166e68ee Mon Sep 17 00:00:00 2001 From: Michael Schmoock Date: Wed, 3 Apr 2019 10:20:39 +0200 Subject: [PATCH] test: opening_tiny_channel with min_capacity_sat --- tests/test_connection.py | 61 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 61 insertions(+) diff --git a/tests/test_connection.py b/tests/test_connection.py index 38cec7dbf..d23c531db 100644 --- a/tests/test_connection.py +++ b/tests/test_connection.py @@ -128,6 +128,67 @@ def test_bad_opening(node_factory): l2.daemon.wait_for_log('to_self_delay 100 larger than 99') +def test_opening_tiny_channel(node_factory): + # Test custom min-capacity-sat parameters + # + # ----> [l2] (1000) - default + # / + # [l1] ----> [l3] (3000) - less than own initial commit tx + # \ + # ----> [l4] (~6000) - enough to cover own initial commit tx + # + # For each: + # 1. Try to establish channel 1sat smaller than min_capacity_sat + # 2. Try to establish channel exact min_capacity_sat + # + # BOLT2 + # The receiving node MAY fail the channel if: + # - funding_satoshis is too small + # - it considers `feerate_per_kw` too small for timely processing or unreasonably large. + # + dustlimit = 546 + reserves = 2 * dustlimit + min_commit_tx_fees = 5430 + min_for_funder = min_commit_tx_fees + dustlimit + 1 + + l2_min_capacity = 1000 + l3_min_capacity = 3000 + l4_min_capacity = min_for_funder + + l1 = node_factory.get_node() + l2 = node_factory.get_node() + l3 = node_factory.get_node(options={'min-capacity-sat': l3_min_capacity}) + l4 = node_factory.get_node(options={'min-capacity-sat': l4_min_capacity}) + + l1.rpc.connect(l2.info['id'], 'localhost', l2.port) + l1.rpc.connect(l3.info['id'], 'localhost', l3.port) + l1.rpc.connect(l4.info['id'], 'localhost', l4.port) + + # Open channel with less than default 1000 sats should be rejected + with pytest.raises(RpcError, match=r'channel capacity is 999sat, which is below 1000000msat'): + l1.fund_channel(l2, l2_min_capacity + reserves - 1) + # Open a channel with exactly the minimal amount for the fundee. + # This will raise an exception at l1, as the funder cannot afford fees for initial_commit_tx. + with pytest.raises(RpcError, match=r'Funder cannot afford fee on initial commitment transaction'): + l1.fund_channel(l2, l2_min_capacity + reserves) + + # Open channel with less than custom 3000 sats should be rejected at l3 + with pytest.raises(RpcError, match=r'channel capacity is 2999sat, which is below 3000000msat'): + l1.fund_channel(l3, l3_min_capacity + reserves - 1) + with pytest.raises(RpcError, match=r'Funder cannot afford fee on initial commitment transaction'): + l1.fund_channel(l3, l3_min_capacity + reserves) + + # Open channel with less than custom ~6000 sats should be rejected at l4 + with pytest.raises(RpcError, match=r'channel capacity is .*, which is below .*msat'): + l1.fund_channel(l4, l4_min_capacity + reserves - 1) + # When amount exactly matches, own initial_commit_tx fees can now be covered + l1.fund_channel(l4, l4_min_capacity + reserves) + + # Also fund channels with minimal funder amount that should not be rejected by own daemon + l1.fund_channel(l2, min_for_funder) + l1.fund_channel(l3, min_for_funder) + + def test_second_channel(node_factory): l1 = node_factory.get_node() l2 = node_factory.get_node()