Skip to content

Commit 6737d96

Browse files
committed
test: wallet importdescriptors update existing
1 parent 586f1d5 commit 6737d96

File tree

1 file changed

+61
-5
lines changed

1 file changed

+61
-5
lines changed

test/functional/wallet_importdescriptors.py

+61-5
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,6 @@ def run_test(self):
7979
# RPC importdescriptors -----------------------------------------------
8080

8181
# # Test import fails if no descriptor present
82-
key = get_generate_key()
8382
self.log.info("Import should fail if a descriptor is not provided")
8483
self.test_importdesc({"timestamp": "now"},
8584
success=False,
@@ -103,11 +102,12 @@ def run_test(self):
103102
self.log.info("Test can import same descriptor with public key twice")
104103
self.test_importdesc(import_request, success=True)
105104

105+
self.log.info("Test can update descriptor label")
106+
self.test_importdesc({**import_request, "label": "Updated label"}, success=True)
107+
test_address(w1, key.p2pkh_addr, solvable=True, ismine=True, labels=["Updated label"])
108+
106109
self.log.info("Internal addresses cannot have labels")
107-
self.test_importdesc({"desc": descsum_create("pkh(" + key.pubkey + ")"),
108-
"timestamp": "now",
109-
"internal": True,
110-
"label": "Descriptor import test"},
110+
self.test_importdesc({**import_request, "internal": True},
111111
success=False,
112112
error_code=-8,
113113
error_message="Internal addresses should not have a label")
@@ -255,6 +255,39 @@ def run_test(self):
255255
self.test_importdesc({"desc": descsum_create(desc), "timestamp": "now", "range": [0, 1000001]},
256256
success=False, error_code=-8, error_message='Range is too large')
257257

258+
self.log.info("Verify we can only extend descriptor's range")
259+
range_request = {"desc": descsum_create(desc), "timestamp": "now", "range": [5, 10], 'active': True}
260+
self.test_importdesc(range_request, wallet=wpriv, success=True)
261+
assert_equal(wpriv.getwalletinfo()['keypoolsize'], 6)
262+
self.test_importdesc({**range_request, "range": [0, 10]}, wallet=wpriv, success=True)
263+
assert_equal(wpriv.getwalletinfo()['keypoolsize'], 11)
264+
self.test_importdesc({**range_request, "range": [0, 20]}, wallet=wpriv, success=True)
265+
assert_equal(wpriv.getwalletinfo()['keypoolsize'], 21)
266+
# Can keep range the same
267+
self.test_importdesc({**range_request, "range": [0, 20]}, wallet=wpriv, success=True)
268+
assert_equal(wpriv.getwalletinfo()['keypoolsize'], 21)
269+
270+
self.test_importdesc({**range_request, "range": [5, 10]}, wallet=wpriv, success=False,
271+
error_code=-8, error_message='new range must include current range = [0,20]')
272+
self.test_importdesc({**range_request, "range": [0, 10]}, wallet=wpriv, success=False,
273+
error_code=-8, error_message='new range must include current range = [0,20]')
274+
self.test_importdesc({**range_request, "range": [5, 20]}, wallet=wpriv, success=False,
275+
error_code=-8, error_message='new range must include current range = [0,20]')
276+
assert_equal(wpriv.getwalletinfo()['keypoolsize'], 21)
277+
278+
self.log.info("Check we can change descriptor internal flag")
279+
self.test_importdesc({**range_request, "range": [0, 20], "internal": True}, wallet=wpriv, success=True)
280+
assert_equal(wpriv.getwalletinfo()['keypoolsize'], 0)
281+
assert_raises_rpc_error(-4, 'This wallet has no available keys', wpriv.getnewaddress, '', 'p2sh-segwit')
282+
assert_equal(wpriv.getwalletinfo()['keypoolsize_hd_internal'], 21)
283+
wpriv.getrawchangeaddress('p2sh-segwit')
284+
285+
self.test_importdesc({**range_request, "range": [0, 20], "internal": False}, wallet=wpriv, success=True)
286+
assert_equal(wpriv.getwalletinfo()['keypoolsize'], 21)
287+
wpriv.getnewaddress('', 'p2sh-segwit')
288+
assert_equal(wpriv.getwalletinfo()['keypoolsize_hd_internal'], 0)
289+
assert_raises_rpc_error(-4, 'This wallet has no available keys', wpriv.getrawchangeaddress, 'p2sh-segwit')
290+
258291
# Make sure ranged imports import keys in order
259292
w1 = self.nodes[1].get_wallet_rpc('w1')
260293
self.log.info('Key ranges should be imported in order')
@@ -306,6 +339,18 @@ def run_test(self):
306339
w1.keypoolrefill()
307340
assert_equal(w1.getwalletinfo()['keypoolsize'], 5 * 3)
308341

342+
self.log.info("Check we can change next_index")
343+
# go back and forth with next_index
344+
for i in [4, 0, 2, 1, 3]:
345+
self.test_importdesc({'desc': descsum_create('wpkh([80002067/0h/0h]' + xpub + '/*)'),
346+
'active': True,
347+
'range': [0, 9],
348+
'next_index': i,
349+
'timestamp': 'now'
350+
},
351+
success=True)
352+
assert_equal(w1.getnewaddress('', 'bech32'), addresses[i])
353+
309354
# Check active=False default
310355
self.log.info('Check imported descriptors are not active by default')
311356
self.test_importdesc({'desc': descsum_create('pkh([12345678/1h]' + xpub + '/*)'),
@@ -316,6 +361,17 @@ def run_test(self):
316361
success=True)
317362
assert_raises_rpc_error(-4, 'This wallet has no available keys', w1.getrawchangeaddress, 'legacy')
318363

364+
self.log.info('Check can activate inactive descriptor')
365+
self.test_importdesc({'desc': descsum_create('pkh([12345678]' + xpub + '/*)'),
366+
'range': [0, 5],
367+
'active': True,
368+
'timestamp': 'now',
369+
'internal': True
370+
},
371+
success=True)
372+
address = w1.getrawchangeaddress('legacy')
373+
assert_equal(address, "mpA2Wh9dvZT7yfELq1UnrUmAoc5qCkMetg")
374+
319375
# # Test importing a descriptor containing a WIF private key
320376
wif_priv = "cTe1f5rdT8A8DFgVWTjyPwACsDPJM9ff4QngFxUixCSvvbg1x6sh"
321377
address = "2MuhcG52uHPknxDgmGPsV18jSHFBnnRgjPg"

0 commit comments

Comments
 (0)