diff --git a/contrib/pyln-client/pyln/client/lightning.py b/contrib/pyln-client/pyln/client/lightning.py index 52e5c3fe3..3433eb10a 100644 --- a/contrib/pyln-client/pyln/client/lightning.py +++ b/contrib/pyln-client/pyln/client/lightning.py @@ -1338,7 +1338,7 @@ class LightningRpc(UnixDomainSocketRpc): } return self.call("unreserveinputs", payload) - def fundpsbt(self, satoshi, feerate, startweight, minconf=None, reserve=True, locktime=None, min_witness_weight=None, excess_as_change=False): + def fundpsbt(self, satoshi, feerate, startweight, minconf=None, reserve=None, locktime=None, min_witness_weight=None, excess_as_change=False): """ Create a PSBT with inputs sufficient to give an output of satoshi. """ @@ -1354,7 +1354,7 @@ class LightningRpc(UnixDomainSocketRpc): } return self.call("fundpsbt", payload) - def utxopsbt(self, satoshi, feerate, startweight, utxos, reserve=True, reservedok=False, locktime=None, min_witness_weight=None, excess_as_change=False): + def utxopsbt(self, satoshi, feerate, startweight, utxos, reserve=None, reservedok=False, locktime=None, min_witness_weight=None, excess_as_change=False): """ Create a PSBT with given inputs, to give an output of satoshi. """ diff --git a/doc/lightning-fundpsbt.7.md b/doc/lightning-fundpsbt.7.md index 553efdec3..177d26f21 100644 --- a/doc/lightning-fundpsbt.7.md +++ b/doc/lightning-fundpsbt.7.md @@ -33,10 +33,9 @@ added any inputs. *minconf* specifies the minimum number of confirmations that used outputs should have. Default is 1. -*reserve* is either boolean or a number: if *true* or a non-zero -number then *reserveinputs* is called (successfully, with -*exclusive* true) on the returned PSBT for this number of blocks (or -72 blocks if *reserve* is simply *true*). +If *reserve* if not zero, then *reserveinputs* is called (successfully, with +*exclusive* true) on the returned PSBT for this number of blocks (default +72 blocks if unspecified). *locktime* is an optional locktime: if not set, it is set to a recent block height. diff --git a/doc/lightning-utxopsbt.7.md b/doc/lightning-utxopsbt.7.md index 090d66961..bc20d1830 100644 --- a/doc/lightning-utxopsbt.7.md +++ b/doc/lightning-utxopsbt.7.md @@ -23,10 +23,9 @@ the resulting transaction plus *startweight* at the given *feerate*, with at least *satoshi* left over (unless *satoshi* is **all**, which is equivalent to setting it to zero). -*reserve* is either boolean or a number: if *true* or a non-zero -number then *reserveinputs* is called (successfully, with -*exclusive* true) on the returned PSBT for this number of blocks (or -72 blocks if *reserve* is simply *true*). +If *reserve* if not zero, then *reserveinputs* is called (successfully, with +*exclusive* true) on the returned PSBT for this number of blocks (default +72 blocks if unspecified). Unless *reservedok* is set to true (default is false) it will also fail if any of the *utxos* are already reserved. diff --git a/plugins/funder.c b/plugins/funder.c index d2c572a63..7880a6dba 100644 --- a/plugins/funder.c +++ b/plugins/funder.c @@ -455,7 +455,6 @@ listfunds_success(struct command *cmd, &psbt_funded, &psbt_fund_failed, info); - json_add_bool(req->js, "reserve", true); json_add_string(req->js, "satoshi", type_to_string(tmpctx, struct amount_sat, &info->our_funding)); diff --git a/plugins/spender/multiwithdraw.c b/plugins/spender/multiwithdraw.c index b89638c68..8790f88e0 100644 --- a/plugins/spender/multiwithdraw.c +++ b/plugins/spender/multiwithdraw.c @@ -369,7 +369,6 @@ static struct command_result *start_mw(struct multiwithdraw_command *mw) mw); json_add_u32(req->js, "minconf", *mw->minconf); } - json_add_bool(req->js, "reserve", true); if (mw->has_all) json_add_string(req->js, "satoshi", "all"); else { diff --git a/tests/test_connection.py b/tests/test_connection.py index bc7855e97..523b90c1a 100644 --- a/tests/test_connection.py +++ b/tests/test_connection.py @@ -320,7 +320,7 @@ def test_channel_abandon(node_factory, bitcoind): l1.rpc.fundchannel(l2.info['id'], SATS, feerate='1875perkw') opening_utxo = only_one([o for o in l1.rpc.listfunds()['outputs'] if o['reserved']]) - psbt = l1.rpc.utxopsbt(0, "253perkw", 0, [opening_utxo['txid'] + ':' + str(opening_utxo['output'])], reserve=False, reservedok=True)['psbt'] + psbt = l1.rpc.utxopsbt(0, "253perkw", 0, [opening_utxo['txid'] + ':' + str(opening_utxo['output'])], reserve=0, reservedok=True)['psbt'] # We expect a reservation for 2016 blocks; unreserve it. reservations = only_one(l1.rpc.unreserveinputs(psbt, reserve=2015)['reservations']) @@ -1178,7 +1178,7 @@ def test_funding_external_wallet_corners(node_factory, bitcoind): wait_for(lambda: len(l1.rpc.listfunds()["outputs"]) != 0) # Some random (valid) psbt - psbt = l1.rpc.fundpsbt(amount, '253perkw', 250, reserve=False)['psbt'] + psbt = l1.rpc.fundpsbt(amount, '253perkw', 250, reserve=0)['psbt'] with pytest.raises(RpcError, match=r'Unknown peer'): l1.rpc.fundchannel_start(l2.info['id'], amount) @@ -1296,7 +1296,7 @@ def test_funding_v2_corners(node_factory, bitcoind): wait_for(lambda: len(l1.rpc.listfunds()["outputs"]) != 0) # Some random (valid) psbt - psbt = l1.rpc.fundpsbt(amount, '253perkw', 250, reserve=False)['psbt'] + psbt = l1.rpc.fundpsbt(amount, '253perkw', 250, reserve=0)['psbt'] nonexist_chanid = '11' * 32 with pytest.raises(RpcError, match=r'Unknown peer'): @@ -1324,7 +1324,7 @@ def test_funding_v2_corners(node_factory, bitcoind): # Should be able to 'restart' after canceling amount2 = 1000000 l1.rpc.unreserveinputs(psbt) - psbt = l1.rpc.fundpsbt(amount2, '253perkw', 250, reserve=False)['psbt'] + psbt = l1.rpc.fundpsbt(amount2, '253perkw', 250, reserve=0)['psbt'] l1.rpc.connect(l2.info['id'], 'localhost', l2.port) start = l1.rpc.openchannel_init(l2.info['id'], amount2, psbt) @@ -1455,7 +1455,7 @@ def test_funding_v2_cancel_race(node_factory, bitcoind, executor): for count, n in enumerate(nodes): l1.rpc.connect(n.info['id'], 'localhost', n.port) - psbt = l1.rpc.fundpsbt(amount, '7500perkw', 250, reserve=False, + psbt = l1.rpc.fundpsbt(amount, '7500perkw', 250, reserve=0, excess_as_change=True, min_witness_weight=110)['psbt'] start = l1.rpc.openchannel_init(n.info['id'], amount, psbt) diff --git a/tests/test_wallet.py b/tests/test_wallet.py index 05cf54319..38d63318b 100644 --- a/tests/test_wallet.py +++ b/tests/test_wallet.py @@ -507,7 +507,7 @@ def test_fundpsbt(node_factory, bitcoind, chainparams): feerate = '7500perkw' # Should get one input, plus some excess - funding = l1.rpc.fundpsbt(amount // 2, feerate, 0, reserve=False) + funding = l1.rpc.fundpsbt(amount // 2, feerate, 0, reserve=0) psbt = bitcoind.rpc.decodepsbt(funding['psbt']) # We can fuzz this up to 99 blocks back. assert psbt['tx']['locktime'] > bitcoind.rpc.getblockcount() - 100 @@ -520,7 +520,7 @@ def test_fundpsbt(node_factory, bitcoind, chainparams): assert 'reservations' not in funding # This should add 99 to the weight, but otherwise be identical (might choose different inputs though!) except for locktime. - funding2 = l1.rpc.fundpsbt(amount // 2, feerate, 99, reserve=False, locktime=bitcoind.rpc.getblockcount() + 1) + funding2 = l1.rpc.fundpsbt(amount // 2, feerate, 99, reserve=0, locktime=bitcoind.rpc.getblockcount() + 1) psbt2 = bitcoind.rpc.decodepsbt(funding2['psbt']) assert psbt2['tx']['locktime'] == bitcoind.rpc.getblockcount() + 1 assert len(psbt2['tx']['vin']) == 1 @@ -537,7 +537,7 @@ def test_fundpsbt(node_factory, bitcoind, chainparams): with pytest.raises(RpcError, match=r"not afford"): l1.rpc.fundpsbt(amount // 2, feerate, 0, minconf=2) - funding3 = l1.rpc.fundpsbt(amount // 2, feerate, 0, reserve=False, excess_as_change=True) + funding3 = l1.rpc.fundpsbt(amount // 2, feerate, 0, reserve=0, excess_as_change=True) assert funding3['excess_msat'] == Millisatoshi(0) # Should have the excess msat as the output value (minus fee for change) psbt = bitcoind.rpc.decodepsbt(funding3['psbt']) @@ -550,7 +550,7 @@ def test_fundpsbt(node_factory, bitcoind, chainparams): assert funding['excess_msat'] == change + change_fee # Should get two inputs. - psbt = bitcoind.rpc.decodepsbt(l1.rpc.fundpsbt(amount, feerate, 0, reserve=False)['psbt']) + psbt = bitcoind.rpc.decodepsbt(l1.rpc.fundpsbt(amount, feerate, 0, reserve=0)['psbt']) assert len(psbt['tx']['vin']) == 2 # Should not use reserved outputs. @@ -594,7 +594,7 @@ def test_utxopsbt(node_factory, bitcoind, chainparams): # Explicitly spend the first output above. funding = l1.rpc.utxopsbt(amount // 2, feerate, 0, ['{}:{}'.format(outputs[0][0], outputs[0][1])], - reserve=False) + reserve=0) psbt = bitcoind.rpc.decodepsbt(funding['psbt']) # We can fuzz this up to 99 blocks back. assert psbt['tx']['locktime'] > bitcoind.rpc.getblockcount() - 100 @@ -610,7 +610,7 @@ def test_utxopsbt(node_factory, bitcoind, chainparams): start_weight = 99 funding2 = l1.rpc.utxopsbt(amount // 2, feerate, start_weight, ['{}:{}'.format(outputs[0][0], outputs[0][1])], - reserve=False, locktime=bitcoind.rpc.getblockcount() + 1) + reserve=0, locktime=bitcoind.rpc.getblockcount() + 1) psbt2 = bitcoind.rpc.decodepsbt(funding2['psbt']) assert psbt2['tx']['locktime'] == bitcoind.rpc.getblockcount() + 1 assert psbt2['tx']['vin'] == psbt['tx']['vin'] @@ -638,7 +638,7 @@ def test_utxopsbt(node_factory, bitcoind, chainparams): funding3 = l1.rpc.utxopsbt(amount // 2, feerate, 0, ['{}:{}'.format(outputs[0][0], outputs[0][1])], - reserve=False, + reserve=0, excess_as_change=True) assert funding3['excess_msat'] == Millisatoshi(0) # Should have the excess msat as the output value (minus fee for change) @@ -655,7 +655,7 @@ def test_utxopsbt(node_factory, bitcoind, chainparams): funding4 = l1.rpc.utxopsbt(amount - 3500, feerate, 0, ['{}:{}'.format(outputs[0][0], outputs[0][1])], - reserve=False, + reserve=0, excess_as_change=True) assert 'change_outnum' not in funding4 @@ -713,8 +713,7 @@ def test_sign_and_send_psbt(node_factory, bitcoind, chainparams): # Make a PSBT out of our inputs funding = l1.rpc.fundpsbt(satoshi=out_total, feerate=7500, - startweight=42, - reserve=True) + startweight=42) assert len([x for x in l1.rpc.listfunds()['outputs'] if x['reserved']]) == 4 psbt = bitcoind.rpc.decodepsbt(funding['psbt']) saved_input = psbt['tx']['vin'][0] @@ -778,8 +777,7 @@ def test_sign_and_send_psbt(node_factory, bitcoind, chainparams): wait_for(lambda: len(l2.rpc.listfunds()['outputs']) == total_outs) l2_funding = l2.rpc.fundpsbt(satoshi=out_total, feerate=7500, - startweight=42, - reserve=True) + startweight=42) # Try to get L1 to sign it with pytest.raises(RpcError, match=r"No wallet inputs to sign"): @@ -792,8 +790,7 @@ def test_sign_and_send_psbt(node_factory, bitcoind, chainparams): # Add some of our own PSBT inputs to it l1_funding = l1.rpc.fundpsbt(satoshi=out_total, feerate=7500, - startweight=42, - reserve=True) + startweight=42) l1_num_inputs = len(bitcoind.rpc.decodepsbt(l1_funding['psbt'])['tx']['vin']) l2_num_inputs = len(bitcoind.rpc.decodepsbt(l2_funding['psbt'])['tx']['vin']) @@ -833,8 +830,7 @@ def test_sign_and_send_psbt(node_factory, bitcoind, chainparams): # Send a PSBT that's not ours l2_funding = l2.rpc.fundpsbt(satoshi=out_total, feerate=7500, - startweight=42, - reserve=True) + startweight=42) out_amt = Millisatoshi(l2_funding['excess_msat']) output_psbt = bitcoind.rpc.createpsbt([], [{addr: float((out_total + out_amt).to_btc())}]) diff --git a/wallet/reservation.c b/wallet/reservation.c index eea112e18..7130159a4 100644 --- a/wallet/reservation.c +++ b/wallet/reservation.c @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -444,14 +445,16 @@ static struct command_result *param_reserve_num(struct command *cmd, { bool flag; - /* "reserve=true" means 6 hours */ - if (json_to_bool(buffer, tok, &flag)) { - *num = tal(cmd, unsigned int); - if (flag) - **num = RESERVATION_DEFAULT; - else - **num = 0; - return NULL; + if (deprecated_apis) { + /* "reserve=true" means 6 hours */ + if (json_to_bool(buffer, tok, &flag)) { + *num = tal(cmd, unsigned int); + if (flag) + **num = RESERVATION_DEFAULT; + else + **num = 0; + return NULL; + } } return param_number(cmd, name, buffer, tok, num);