From 95ec897ac0709be12935ac522ff0ff414c8daf54 Mon Sep 17 00:00:00 2001 From: niftynei Date: Fri, 8 Jul 2022 17:07:06 -0500 Subject: [PATCH] dual-fund: Fail if you try to buy a liquidity ad w/o dualfunding on Fixes #5271 In-Collaboration-With: Base58 'n Coding Seminar Participants Changelog-Changed: `fundchannel` now errors if you try to buy a liquidity ad but dont' have `experimental-dual-fund` enabled --- plugins/spender/multifundchannel.c | 10 +++++++++- tests/test_opening.py | 19 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/plugins/spender/multifundchannel.c b/plugins/spender/multifundchannel.c index 7cdfaf72f..e9e5949ab 100644 --- a/plugins/spender/multifundchannel.c +++ b/plugins/spender/multifundchannel.c @@ -1611,13 +1611,21 @@ connect_ok(struct command *cmd, json_tok_full_len(features_tok), json_tok_full(buf, features_tok)); + dest->state = MULTIFUNDCHANNEL_CONNECTED; + /* Set the open protocol to use now */ if (feature_negotiated(plugin_feature_set(mfc->cmd->plugin), dest->their_features, OPT_DUAL_FUND)) dest->protocol = OPEN_CHANNEL; + else if (!amount_sat_zero(dest->request_amt) || !(!dest->rates)) + /* Return an error */ + fail_destination_msg(dest, FUNDING_V2_NOT_SUPPORTED, + "Tried to buy a liquidity ad" + " but we(?) don't have" + " experimental-dual-fund" + " enabled"); - dest->state = MULTIFUNDCHANNEL_CONNECTED; return connect_done(dest); } diff --git a/tests/test_opening.py b/tests/test_opening.py index 58cfadde2..3a454d50e 100644 --- a/tests/test_opening.py +++ b/tests/test_opening.py @@ -1391,3 +1391,22 @@ def test_zeroconf_forward(node_factory, bitcoind): wait_for(lambda: len(l3.rpc.listchannels()['channels']) == 4) inv = l1.rpc.invoice(42, 'back1', 'desc')['bolt11'] l3.rpc.pay(inv) + + +@pytest.mark.openchannel('v1') +def test_buy_liquidity_ad_no_v2(node_factory, bitcoind): + """ Test that you can't actually request amt for a + node that doesn' support v2 opens """ + + l1, l2, = node_factory.get_nodes(2) + amount = 500000 + feerate = 2000 + + l1.fundwallet(amount * 100) + l1.rpc.connect(l2.info['id'], 'localhost', l2.port) + + # l1 leases a channel from l2 + with pytest.raises(RpcError, match=r"Tried to buy a liquidity ad but we[(][?][)] don't have experimental-dual-fund enabled"): + l1.rpc.fundchannel(l2.info['id'], amount, request_amt=amount, + feerate='{}perkw'.format(feerate), + compact_lease='029a002d000000004b2003e8')