From f719343b4e93915a6a2b11e39eea3d3b1f6430f5 Mon Sep 17 00:00:00 2001 From: niftynei Date: Thu, 5 Aug 2021 12:32:58 -0500 Subject: [PATCH] tests: check that we don't re-up the leased funds when we RBF Check that the peer won't put funds into a RBF'd channel lease. FIXME: allow leases to pass through to RBFs Changelog-None. --- tests/test_opening.py | 79 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 79 insertions(+) diff --git a/tests/test_opening.py b/tests/test_opening.py index cdd351e2d..15cdbef8c 100644 --- a/tests/test_opening.py +++ b/tests/test_opening.py @@ -334,6 +334,85 @@ def test_v2_rbf_single(node_factory, bitcoind, chainparams): l1.daemon.wait_for_log('sendrawtx exit 0') +@unittest.skipIf(TEST_NETWORK != 'regtest', 'elementsd doesnt yet support PSBT features we need') +@pytest.mark.openchannel('v2') +def test_v2_rbf_liquidity_ad(node_factory, bitcoind, chainparams): + + opts = {'funder-policy': 'match', 'funder-policy-mod': 100, + 'lease-fee-base-msat': '100sat', 'lease-fee-basis': 100, + 'may_reconnect': True} + l1, l2 = node_factory.get_nodes(2, opts=opts) + + # what happens when we RBF? + feerate = 2000 + amount = 500000 + l1.fundwallet(20000000) + l2.fundwallet(20000000) + + # l1 leases a channel from l2 + l1.rpc.connect(l2.info['id'], 'localhost', l2.port) + rates = l1.rpc.dev_queryrates(l2.info['id'], amount, amount) + l1.daemon.wait_for_log('disconnect') + l1.rpc.connect(l2.info['id'], 'localhost', l2.port) + chan_id = l1.rpc.fundchannel(l2.info['id'], amount, request_amt=amount, + feerate='{}perkw'.format(feerate), + compact_lease=rates['compact_lease'])['channel_id'] + + vins = [x for x in l1.rpc.listfunds()['outputs'] if x['reserved']] + assert only_one(vins) + prev_utxos = ["{}:{}".format(vins[0]['txid'], vins[0]['output'])] + + # Check that we're waiting for lockin + l1.daemon.wait_for_log(' to DUALOPEND_AWAITING_LOCKIN') + + est_fees = calc_lease_fee(amount, feerate, rates) + + # This should be the accepter's amount + fundings = only_one(only_one(l1.rpc.listpeers()['peers'])['channels'])['funding'] + assert Millisatoshi(est_fees + amount * 1000) == Millisatoshi(fundings['remote_msat']) + + # rbf the lease with a higher amount + rate = int(find_next_feerate(l1, l2)[:-5]) + # We 4x the feerate to beat the min-relay fee + next_feerate = '{}perkw'.format(rate * 4) + + # Initiate an RBF + startweight = 42 + 172 # base weight, funding output + initpsbt = l1.rpc.utxopsbt(amount, next_feerate, startweight, + prev_utxos, reservedok=True, + min_witness_weight=110, + excess_as_change=True)['psbt'] + + # do the bump + bump = l1.rpc.openchannel_bump(chan_id, amount, initpsbt, + funding_feerate=next_feerate) + update = l1.rpc.openchannel_update(chan_id, bump['psbt']) + assert update['commitments_secured'] + # Sign our inputs, and continue + signed_psbt = l1.rpc.signpsbt(update['psbt'])['signed_psbt'] + l1.rpc.openchannel_signed(chan_id, signed_psbt) + + # what happens when the channel opens? + bitcoind.generate_block(6) + l1.daemon.wait_for_log('to CHANNELD_NORMAL') + + # This should be the accepter's amount + fundings = only_one(only_one(l1.rpc.listpeers()['peers'])['channels'])['funding'] + # FIXME: The lease goes away :( + assert Millisatoshi(0) == Millisatoshi(fundings['remote_msat']) + + wait_for(lambda: [c['active'] for c in l1.rpc.listchannels(l1.get_channel_scid(l2))['channels']] == [True, True]) + + # send some payments, mine a block or two + inv = l2.rpc.invoice(10**4, '1', 'no_1') + l1.rpc.pay(inv['bolt11']) + + # l2 attempts to close a channel that it leased, should succeed + # (channel isnt leased) + l2.rpc.close(l1.get_channel_scid(l2)) + l1.daemon.wait_for_log('State changed from CLOSINGD_SIGEXCHANGE to CLOSINGD_COMPLETE') + + @unittest.skipIf(TEST_NETWORK != 'regtest', 'elementsd doesnt yet support PSBT features we need') @pytest.mark.openchannel('v2') def test_v2_rbf_multi(node_factory, bitcoind, chainparams):