@@ -89,17 +89,20 @@ def run_test(self):
89
89
# # Test importing of a P2PKH descriptor
90
90
key = get_generate_key ()
91
91
self .log .info ("Should import a p2pkh descriptor" )
92
- self . test_importdesc ( {"desc" : descsum_create ("pkh(" + key .pubkey + ")" ),
93
- "timestamp" : "now" ,
94
- "label" : "Descriptor import test" },
95
- success = True )
92
+ import_request = {"desc" : descsum_create ("pkh(" + key .pubkey + ")" ),
93
+ "timestamp" : "now" ,
94
+ "label" : "Descriptor import test" }
95
+ self . test_importdesc ( import_request , success = True )
96
96
test_address (w1 ,
97
97
key .p2pkh_addr ,
98
98
solvable = True ,
99
99
ismine = True ,
100
100
labels = ["Descriptor import test" ])
101
101
assert_equal (w1 .getwalletinfo ()['keypoolsize' ], 0 )
102
102
103
+ self .log .info ("Test can import same descriptor with public key twice" )
104
+ self .test_importdesc (import_request , success = True )
105
+
103
106
self .log .info ("Internal addresses cannot have labels" )
104
107
self .test_importdesc ({"desc" : descsum_create ("pkh(" + key .pubkey + ")" ),
105
108
"timestamp" : "now" ,
@@ -305,7 +308,7 @@ def run_test(self):
305
308
306
309
# Check active=False default
307
310
self .log .info ('Check imported descriptors are not active by default' )
308
- self .test_importdesc ({'desc' : descsum_create ('pkh([12345678/0h/0h ]' + xpub + '/*)' ),
311
+ self .test_importdesc ({'desc' : descsum_create ('pkh([12345678/1h ]' + xpub + '/*)' ),
309
312
'range' : [0 , 2 ],
310
313
'timestamp' : 'now' ,
311
314
'internal' : True
@@ -322,6 +325,10 @@ def run_test(self):
322
325
"timestamp" : "now" },
323
326
success = True ,
324
327
wallet = wpriv )
328
+
329
+ self .log .info ('Test can import same descriptor with private key twice' )
330
+ self .test_importdesc ({"desc" : descsum_create (desc ), "timestamp" : "now" }, success = True , wallet = wpriv )
331
+
325
332
test_address (wpriv ,
326
333
address ,
327
334
solvable = True ,
@@ -339,14 +346,25 @@ def run_test(self):
339
346
wmulti_priv = self .nodes [1 ].get_wallet_rpc ("wmulti_priv" )
340
347
assert_equal (wmulti_priv .getwalletinfo ()['keypoolsize' ], 0 )
341
348
342
- self .test_importdesc ({"desc" :"wsh(multi(2,tprv8ZgxMBicQKsPevADjDCWsa6DfhkVXicu8NQUzfibwX2MexVwW4tCec5mXdCW8kJwkzBRRmAay1KZya4WsehVvjTGVW6JLqiqd8DdZ4xSg52/84h/0h/0h/*,tprv8ZgxMBicQKsPdSNWUhDiwTScDr6JfkZuLshTRwzvZGnMSnGikV6jxpmdDkC3YRc4T3GD6Nvg9uv6hQg73RVv1EiTXDZwxVbsLugVHU8B1aq/84h/0h/0h/*,tprv8ZgxMBicQKsPeonDt8Ka2mrQmHa61hQ5FQCsvWBTpSNzBFgM58cV2EuXNAHF14VawVpznnme3SuTbA62sGriwWyKifJmXntfNeK7zeqMCj1/84h/0h/0h/*))#m2sr93jn" ,
349
+ xprv1 = 'tprv8ZgxMBicQKsPevADjDCWsa6DfhkVXicu8NQUzfibwX2MexVwW4tCec5mXdCW8kJwkzBRRmAay1KZya4WsehVvjTGVW6JLqiqd8DdZ4xSg52'
350
+ acc_xpub1 = 'tpubDCJtdt5dgJpdhW4MtaVYDhG4T4tF6jcLR1PxL43q9pq1mxvXgMS9Mzw1HnXG15vxUGQJMMSqCQHMTy3F1eW5VkgVroWzchsPD5BUojrcWs8' # /84'/0'/0'
351
+ chg_xpub1 = 'tpubDCXqdwWZcszwqYJSnZp8eARkxGJfHAk23KDxbztV4BbschfaTfYLTcSkSJ3TN64dRqwa1rnFUScsYormKkGqNbbPwkorQimVevXjxzUV9Gf' # /84'/1'/0'
352
+ xprv2 = 'tprv8ZgxMBicQKsPdSNWUhDiwTScDr6JfkZuLshTRwzvZGnMSnGikV6jxpmdDkC3YRc4T3GD6Nvg9uv6hQg73RVv1EiTXDZwxVbsLugVHU8B1aq'
353
+ acc_xprv2 = 'tprv8gVCsmRAxVSxyUpsL13Y7ZEWBFPWbgS5E2MmFVNGuANrknvmmn2vWnmHvU8AwEFYzR2ji6EeZLSCLVacsYkvor3Pcb5JY5FGcevqTwYvdYx'
354
+ acc_xpub2 = 'tpubDDBF2BTR6s8drwrfDei8WxtckGuSm1cyoKxYY1QaKSBFbHBYQArWhHPA6eJrzZej6nfHGLSURYSLHr7GuYch8aY5n61tGqgn8b4cXrMuoPH'
355
+ chg_xpub2 = 'tpubDCYfZY2ceyHzYzMMVPt9MNeiqtQ2T7Uyp9QSFwYXh8Vi9iJFYXcuphJaGXfF3jUQJi5Y3GMNXvM11gaL4txzZgNGK22BFAwMXynnzv4z2Jh'
356
+ xprv3 = 'tprv8ZgxMBicQKsPeonDt8Ka2mrQmHa61hQ5FQCsvWBTpSNzBFgM58cV2EuXNAHF14VawVpznnme3SuTbA62sGriwWyKifJmXntfNeK7zeqMCj1'
357
+ acc_xpub3 = 'tpubDCsWoW1kuQB9kG5MXewHqkbjPtqPueRnXju7uM2NK7y3JYb2ajAZ9EiuZXNNuE4661RAfriBWhL8UsnAPpk8zrKKnZw1Ug7X4oHgMdZiU4E'
358
+ chg_xpub3 = 'tpubDC6UGqnsQStngYuGD4MKsMy7eD1Yg9NTJfPdvjdG2JE5oZ7EsSL3WHg4Gsw2pR5K39ZwJ46M1wZayhedVdQtMGaUhq5S23PH6fnENK3V1sb'
359
+
360
+ self .test_importdesc ({"desc" :"wsh(multi(2," + xprv1 + "/84h/0h/0h/*," + xprv2 + "/84h/0h/0h/*," + xprv3 + "/84h/0h/0h/*))#m2sr93jn" ,
343
361
"active" : True ,
344
362
"range" : 1000 ,
345
363
"next_index" : 0 ,
346
364
"timestamp" : "now" },
347
365
success = True ,
348
366
wallet = wmulti_priv )
349
- self .test_importdesc ({"desc" :"wsh(multi(2,tprv8ZgxMBicQKsPevADjDCWsa6DfhkVXicu8NQUzfibwX2MexVwW4tCec5mXdCW8kJwkzBRRmAay1KZya4WsehVvjTGVW6JLqiqd8DdZ4xSg52 /84h/1h/0h/*,tprv8ZgxMBicQKsPdSNWUhDiwTScDr6JfkZuLshTRwzvZGnMSnGikV6jxpmdDkC3YRc4T3GD6Nvg9uv6hQg73RVv1EiTXDZwxVbsLugVHU8B1aq /84h/1h/0h/*,tprv8ZgxMBicQKsPeonDt8Ka2mrQmHa61hQ5FQCsvWBTpSNzBFgM58cV2EuXNAHF14VawVpznnme3SuTbA62sGriwWyKifJmXntfNeK7zeqMCj1 /84h/1h/0h/*))#q3sztvx5" ,
367
+ self .test_importdesc ({"desc" :"wsh(multi(2," + xprv1 + " /84h/1h/0h/*," + xprv2 + " /84h/1h/0h/*," + xprv3 + " /84h/1h/0h/*))#q3sztvx5" ,
350
368
"active" : True ,
351
369
"internal" : True ,
352
370
"range" : 1000 ,
@@ -374,14 +392,14 @@ def run_test(self):
374
392
wmulti_pub = self .nodes [1 ].get_wallet_rpc ("wmulti_pub" )
375
393
assert_equal (wmulti_pub .getwalletinfo ()['keypoolsize' ], 0 )
376
394
377
- self .test_importdesc ({"desc" :"wsh(multi(2,[7b2d0242/84h/0h/0h]tpubDCJtdt5dgJpdhW4MtaVYDhG4T4tF6jcLR1PxL43q9pq1mxvXgMS9Mzw1HnXG15vxUGQJMMSqCQHMTy3F1eW5VkgVroWzchsPD5BUojrcWs8 /*,[59b09cd6/84h/0h/0h]tpubDDBF2BTR6s8drwrfDei8WxtckGuSm1cyoKxYY1QaKSBFbHBYQArWhHPA6eJrzZej6nfHGLSURYSLHr7GuYch8aY5n61tGqgn8b4cXrMuoPH /*,[e81a0532/84h/0h/0h]tpubDCsWoW1kuQB9kG5MXewHqkbjPtqPueRnXju7uM2NK7y3JYb2ajAZ9EiuZXNNuE4661RAfriBWhL8UsnAPpk8zrKKnZw1Ug7X4oHgMdZiU4E /*))#tsry0s5e" ,
395
+ self .test_importdesc ({"desc" :"wsh(multi(2,[7b2d0242/84h/0h/0h]" + acc_xpub1 + " /*,[59b09cd6/84h/0h/0h]" + acc_xpub2 + " /*,[e81a0532/84h/0h/0h]" + acc_xpub3 + " /*))#tsry0s5e" ,
378
396
"active" : True ,
379
397
"range" : 1000 ,
380
398
"next_index" : 0 ,
381
399
"timestamp" : "now" },
382
400
success = True ,
383
401
wallet = wmulti_pub )
384
- self .test_importdesc ({"desc" :"wsh(multi(2,[7b2d0242/84h/1h/0h]tpubDCXqdwWZcszwqYJSnZp8eARkxGJfHAk23KDxbztV4BbschfaTfYLTcSkSJ3TN64dRqwa1rnFUScsYormKkGqNbbPwkorQimVevXjxzUV9Gf /*,[59b09cd6/84h/1h/0h]tpubDCYfZY2ceyHzYzMMVPt9MNeiqtQ2T7Uyp9QSFwYXh8Vi9iJFYXcuphJaGXfF3jUQJi5Y3GMNXvM11gaL4txzZgNGK22BFAwMXynnzv4z2Jh /*,[e81a0532/84h/1h/0h]tpubDC6UGqnsQStngYuGD4MKsMy7eD1Yg9NTJfPdvjdG2JE5oZ7EsSL3WHg4Gsw2pR5K39ZwJ46M1wZayhedVdQtMGaUhq5S23PH6fnENK3V1sb /*))#c08a2rzv" ,
402
+ self .test_importdesc ({"desc" :"wsh(multi(2,[7b2d0242/84h/1h/0h]" + chg_xpub1 + " /*,[59b09cd6/84h/1h/0h]" + chg_xpub2 + " /*,[e81a0532/84h/1h/0h]" + chg_xpub3 + " /*))#c08a2rzv" ,
385
403
"active" : True ,
386
404
"internal" : True ,
387
405
"range" : 1000 ,
@@ -396,8 +414,15 @@ def run_test(self):
396
414
change_addr = wmulti_pub .getrawchangeaddress ('bech32' )
397
415
assert_equal (change_addr , 'bcrt1qt9uhe3a9hnq7vajl7a094z4s3crm9ttf8zw3f5v9gr2nyd7e3lnsy44n8e' )
398
416
assert_equal (wmulti_pub .getwalletinfo ()['keypoolsize' ], 999 )
417
+
418
+ # generate some utxos for next tests
399
419
txid = w0 .sendtoaddress (addr , 10 )
400
420
vout = find_vout_for_address (self .nodes [0 ], txid , addr )
421
+
422
+ addr2 = wmulti_pub .getnewaddress ('' , 'bech32' )
423
+ txid2 = w0 .sendtoaddress (addr2 , 10 )
424
+ vout2 = find_vout_for_address (self .nodes [0 ], txid2 , addr2 )
425
+
401
426
self .nodes [0 ].generate (6 )
402
427
self .sync_all ()
403
428
assert_equal (wmulti_pub .getbalance (), wmulti_priv .getbalance ())
@@ -411,14 +436,14 @@ def run_test(self):
411
436
wmulti_priv1 = self .nodes [1 ].get_wallet_rpc ("wmulti_priv1" )
412
437
res = wmulti_priv1 .importdescriptors ([
413
438
{
414
- "desc" : descsum_create ("wsh(multi(2,tprv8ZgxMBicQKsPevADjDCWsa6DfhkVXicu8NQUzfibwX2MexVwW4tCec5mXdCW8kJwkzBRRmAay1KZya4WsehVvjTGVW6JLqiqd8DdZ4xSg52 /84h/0h/0h/*,[59b09cd6/84h/0h/0h]tpubDDBF2BTR6s8drwrfDei8WxtckGuSm1cyoKxYY1QaKSBFbHBYQArWhHPA6eJrzZej6nfHGLSURYSLHr7GuYch8aY5n61tGqgn8b4cXrMuoPH /*,[e81a0532/84h/0h/0h]tpubDCsWoW1kuQB9kG5MXewHqkbjPtqPueRnXju7uM2NK7y3JYb2ajAZ9EiuZXNNuE4661RAfriBWhL8UsnAPpk8zrKKnZw1Ug7X4oHgMdZiU4E /*))" ),
439
+ "desc" : descsum_create ("wsh(multi(2," + xprv1 + " /84h/0h/0h/*,[59b09cd6/84h/0h/0h]" + acc_xpub2 + " /*,[e81a0532/84h/0h/0h]" + acc_xpub3 + " /*))" ),
415
440
"active" : True ,
416
441
"range" : 1000 ,
417
442
"next_index" : 0 ,
418
443
"timestamp" : "now"
419
444
},
420
445
{
421
- "desc" : descsum_create ("wsh(multi(2,tprv8ZgxMBicQKsPevADjDCWsa6DfhkVXicu8NQUzfibwX2MexVwW4tCec5mXdCW8kJwkzBRRmAay1KZya4WsehVvjTGVW6JLqiqd8DdZ4xSg52 /84h/1h/0h/*,[59b09cd6/84h/1h/0h]tpubDCYfZY2ceyHzYzMMVPt9MNeiqtQ2T7Uyp9QSFwYXh8Vi9iJFYXcuphJaGXfF3jUQJi5Y3GMNXvM11gaL4txzZgNGK22BFAwMXynnzv4z2Jh /*,[e81a0532/84h/1h/0h]tpubDC6UGqnsQStngYuGD4MKsMy7eD1Yg9NTJfPdvjdG2JE5oZ7EsSL3WHg4Gsw2pR5K39ZwJ46M1wZayhedVdQtMGaUhq5S23PH6fnENK3V1sb /*))" ),
446
+ "desc" : descsum_create ("wsh(multi(2," + xprv1 + " /84h/1h/0h/*,[59b09cd6/84h/1h/0h]" + chg_xpub2 + " /*,[e81a0532/84h/1h/0h]" + chg_xpub3 + " /*))" ),
422
447
"active" : True ,
423
448
"internal" : True ,
424
449
"range" : 1000 ,
@@ -434,14 +459,14 @@ def run_test(self):
434
459
wmulti_priv2 = self .nodes [1 ].get_wallet_rpc ('wmulti_priv2' )
435
460
res = wmulti_priv2 .importdescriptors ([
436
461
{
437
- "desc" : descsum_create ("wsh(multi(2,[7b2d0242/84h/0h/0h]tpubDCJtdt5dgJpdhW4MtaVYDhG4T4tF6jcLR1PxL43q9pq1mxvXgMS9Mzw1HnXG15vxUGQJMMSqCQHMTy3F1eW5VkgVroWzchsPD5BUojrcWs8 /*,tprv8ZgxMBicQKsPdSNWUhDiwTScDr6JfkZuLshTRwzvZGnMSnGikV6jxpmdDkC3YRc4T3GD6Nvg9uv6hQg73RVv1EiTXDZwxVbsLugVHU8B1aq /84h/0h/0h/*,[e81a0532/84h/0h/0h]tpubDCsWoW1kuQB9kG5MXewHqkbjPtqPueRnXju7uM2NK7y3JYb2ajAZ9EiuZXNNuE4661RAfriBWhL8UsnAPpk8zrKKnZw1Ug7X4oHgMdZiU4E /*))" ),
462
+ "desc" : descsum_create ("wsh(multi(2,[7b2d0242/84h/0h/0h]" + acc_xpub1 + " /*," + xprv2 + " /84h/0h/0h/*,[e81a0532/84h/0h/0h]" + acc_xpub3 + " /*))" ),
438
463
"active" : True ,
439
464
"range" : 1000 ,
440
465
"next_index" : 0 ,
441
466
"timestamp" : "now"
442
467
},
443
468
{
444
- "desc" : descsum_create ("wsh(multi(2,[7b2d0242/84h/1h/0h]tpubDCXqdwWZcszwqYJSnZp8eARkxGJfHAk23KDxbztV4BbschfaTfYLTcSkSJ3TN64dRqwa1rnFUScsYormKkGqNbbPwkorQimVevXjxzUV9Gf /*,tprv8ZgxMBicQKsPdSNWUhDiwTScDr6JfkZuLshTRwzvZGnMSnGikV6jxpmdDkC3YRc4T3GD6Nvg9uv6hQg73RVv1EiTXDZwxVbsLugVHU8B1aq /84h/1h/0h/*,[e81a0532/84h/1h/0h]tpubDC6UGqnsQStngYuGD4MKsMy7eD1Yg9NTJfPdvjdG2JE5oZ7EsSL3WHg4Gsw2pR5K39ZwJ46M1wZayhedVdQtMGaUhq5S23PH6fnENK3V1sb /*))" ),
469
+ "desc" : descsum_create ("wsh(multi(2,[7b2d0242/84h/1h/0h]" + chg_xpub1 + " /*," + xprv2 + " /84h/1h/0h/*,[e81a0532/84h/1h/0h]" + chg_xpub3 + " /*))" ),
445
470
"active" : True ,
446
471
"internal" : True ,
447
472
"range" : 1000 ,
@@ -531,6 +556,33 @@ def run_test(self):
531
556
)
532
557
533
558
559
+ self .log .info ("Amending multisig with new private keys" )
560
+ self .nodes [1 ].createwallet (wallet_name = "wmulti_priv3" , descriptors = True )
561
+ wmulti_priv3 = self .nodes [1 ].get_wallet_rpc ("wmulti_priv3" )
562
+ res = wmulti_priv3 .importdescriptors ([
563
+ {
564
+ "desc" : descsum_create ("wsh(multi(2," + xprv1 + "/84h/0h/0h/*,[59b09cd6/84h/0h/0h]" + acc_xpub2 + "/*,[e81a0532/84h/0h/0h]" + acc_xpub3 + "/*))" ),
565
+ "active" : True ,
566
+ "range" : 1000 ,
567
+ "next_index" : 0 ,
568
+ "timestamp" : "now"
569
+ }])
570
+ assert_equal (res [0 ]['success' ], True )
571
+ res = wmulti_priv3 .importdescriptors ([
572
+ {
573
+ "desc" : descsum_create ("wsh(multi(2," + xprv1 + "/84h/0h/0h/*,[59b09cd6/84h/0h/0h]" + acc_xprv2 + "/*,[e81a0532/84h/0h/0h]" + acc_xpub3 + "/*))" ),
574
+ "active" : True ,
575
+ "range" : 1000 ,
576
+ "next_index" : 0 ,
577
+ "timestamp" : "now"
578
+ }])
579
+ assert_equal (res [0 ]['success' ], True )
580
+
581
+ rawtx = self .nodes [1 ].createrawtransaction ([{'txid' : txid2 , 'vout' : vout2 }], {w0 .getnewaddress (): 9.999 })
582
+ tx = wmulti_priv3 .signrawtransactionwithwallet (rawtx )
583
+ assert_equal (tx ['complete' ], True )
584
+ self .nodes [1 ].sendrawtransaction (tx ['hex' ])
585
+
534
586
self .log .info ("Combo descriptors cannot be active" )
535
587
self .test_importdesc ({"desc" : descsum_create ("combo(tpubDCJtdt5dgJpdhW4MtaVYDhG4T4tF6jcLR1PxL43q9pq1mxvXgMS9Mzw1HnXG15vxUGQJMMSqCQHMTy3F1eW5VkgVroWzchsPD5BUojrcWs8/*)" ),
536
588
"active" : True ,
0 commit comments