Skip to content

Commit c11875c

Browse files
committed
Add segwit address tests for importmulti
1 parent 201451b commit c11875c

File tree

1 file changed

+161
-1
lines changed

1 file changed

+161
-1
lines changed

test/functional/wallet_importmulti.py

Lines changed: 161 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,14 @@
1111
assert_greater_than,
1212
assert_raises_rpc_error,
1313
bytes_to_hex_str,
14+
hex_str_to_bytes
1415
)
15-
16+
from test_framework.script import (
17+
CScript,
18+
OP_0,
19+
hash160
20+
)
21+
from test_framework.messages import sha256
1622

1723
class ImportMultiTest(BitcoinTestFramework):
1824
def set_test_params(self):
@@ -90,6 +96,19 @@ def run_test (self):
9096
assert_equal(address_assert['ismine'], False)
9197
assert_equal(address_assert['timestamp'], timestamp)
9298

99+
# ScriptPubKey + internal + label
100+
self.log.info("Should not allow a label to be specified when internal is true")
101+
address = self.nodes[0].getaddressinfo(self.nodes[0].getnewaddress())
102+
result = self.nodes[1].importmulti([{
103+
"scriptPubKey": address['scriptPubKey'],
104+
"timestamp": "now",
105+
"internal": True,
106+
"label": "Example label"
107+
}])
108+
assert_equal(result[0]['success'], False)
109+
assert_equal(result[0]['error']['code'], -8)
110+
assert_equal(result[0]['error']['message'], 'Internal addresses should not have a label')
111+
93112
# Nonstandard scriptPubKey + !internal
94113
self.log.info("Should not import a nonstandard scriptPubKey without internal flag")
95114
nonstandardScriptPubKey = address['scriptPubKey'] + bytes_to_hex_str(script.CScript([script.OP_NOP]))
@@ -458,6 +477,147 @@ def run_test (self):
458477
"timestamp": "",
459478
}])
460479

480+
# Import P2WPKH address as watch only
481+
self.log.info("Should import a P2WPKH address as watch only")
482+
address = self.nodes[0].getaddressinfo(self.nodes[0].getnewaddress(address_type="bech32"))
483+
result = self.nodes[1].importmulti([{
484+
"scriptPubKey": {
485+
"address": address['address']
486+
},
487+
"timestamp": "now",
488+
}])
489+
assert_equal(result[0]['success'], True)
490+
address_assert = self.nodes[1].getaddressinfo(address['address'])
491+
assert_equal(address_assert['iswatchonly'], True)
492+
assert_equal(address_assert['solvable'], False)
493+
494+
# Import P2WPKH address with public key but no private key
495+
self.log.info("Should import a P2WPKH address and public key as solvable but not spendable")
496+
address = self.nodes[0].getaddressinfo(self.nodes[0].getnewaddress(address_type="bech32"))
497+
result = self.nodes[1].importmulti([{
498+
"scriptPubKey": {
499+
"address": address['address']
500+
},
501+
"timestamp": "now",
502+
"pubkeys": [ address['pubkey'] ]
503+
}])
504+
assert_equal(result[0]['success'], True)
505+
address_assert = self.nodes[1].getaddressinfo(address['address'])
506+
assert_equal(address_assert['ismine'], False)
507+
assert_equal(address_assert['solvable'], True)
508+
509+
# Import P2WPKH address with key and check it is spendable
510+
self.log.info("Should import a P2WPKH address with key")
511+
address = self.nodes[0].getaddressinfo(self.nodes[0].getnewaddress(address_type="bech32"))
512+
result = self.nodes[1].importmulti([{
513+
"scriptPubKey": {
514+
"address": address['address']
515+
},
516+
"timestamp": "now",
517+
"keys": [self.nodes[0].dumpprivkey(address['address'])]
518+
}])
519+
assert_equal(result[0]['success'], True)
520+
address_assert = self.nodes[1].getaddressinfo(address['address'])
521+
assert_equal(address_assert['iswatchonly'], False)
522+
assert_equal(address_assert['ismine'], True)
523+
524+
# P2WSH multisig address without scripts or keys
525+
sig_address_1 = self.nodes[0].getaddressinfo(self.nodes[0].getnewaddress())
526+
sig_address_2 = self.nodes[0].getaddressinfo(self.nodes[0].getnewaddress())
527+
multi_sig_script = self.nodes[0].addmultisigaddress(2, [sig_address_1['pubkey'], sig_address_2['pubkey']], "", "bech32")
528+
self.log.info("Should import a p2wsh multisig as watch only without respective redeem script and private keys")
529+
result = self.nodes[1].importmulti([{
530+
"scriptPubKey": {
531+
"address": multi_sig_script['address']
532+
},
533+
"timestamp": "now"
534+
}])
535+
assert_equal(result[0]['success'], True)
536+
address_assert = self.nodes[1].getaddressinfo(multi_sig_script['address'])
537+
assert_equal(address_assert['solvable'], False)
538+
539+
# Same P2WSH multisig address as above, but now with witnessscript + private keys
540+
self.log.info("Should import a p2wsh with respective redeem script and private keys")
541+
result = self.nodes[1].importmulti([{
542+
"scriptPubKey": {
543+
"address": multi_sig_script['address']
544+
},
545+
"timestamp": "now",
546+
"witnessscript": multi_sig_script['redeemScript'],
547+
"keys": [ self.nodes[0].dumpprivkey(sig_address_1['address']), self.nodes[0].dumpprivkey(sig_address_2['address']) ]
548+
}])
549+
assert_equal(result[0]['success'], True)
550+
address_assert = self.nodes[1].getaddressinfo(multi_sig_script['address'])
551+
assert_equal(address_assert['solvable'], True)
552+
assert_equal(address_assert['ismine'], True)
553+
assert_equal(address_assert['sigsrequired'], 2)
554+
555+
# P2SH-P2WPKH address with no redeemscript or public or private key
556+
sig_address_1 = self.nodes[0].getaddressinfo(self.nodes[0].getnewaddress(address_type="p2sh-segwit"))
557+
pubkeyhash = hash160(hex_str_to_bytes(sig_address_1['pubkey']))
558+
pkscript = CScript([OP_0, pubkeyhash])
559+
self.log.info("Should import a p2sh-p2wpkh without redeem script or keys")
560+
result = self.nodes[1].importmulti([{
561+
"scriptPubKey": {
562+
"address": sig_address_1['address']
563+
},
564+
"timestamp": "now"
565+
}])
566+
assert_equal(result[0]['success'], True)
567+
address_assert = self.nodes[1].getaddressinfo(sig_address_1['address'])
568+
assert_equal(address_assert['solvable'], False)
569+
assert_equal(address_assert['ismine'], False)
570+
571+
# P2SH-P2WPKH address + redeemscript + public key with no private key
572+
self.log.info("Should import a p2sh-p2wpkh with respective redeem script and pubkey as solvable")
573+
result = self.nodes[1].importmulti([{
574+
"scriptPubKey": {
575+
"address": sig_address_1['address']
576+
},
577+
"timestamp": "now",
578+
"redeemscript": bytes_to_hex_str(pkscript),
579+
"pubkeys": [ sig_address_1['pubkey'] ]
580+
}])
581+
assert_equal(result[0]['success'], True)
582+
address_assert = self.nodes[1].getaddressinfo(sig_address_1['address'])
583+
assert_equal(address_assert['solvable'], True)
584+
assert_equal(address_assert['ismine'], False)
585+
586+
# P2SH-P2WPKH address + redeemscript + private key
587+
sig_address_1 = self.nodes[0].getaddressinfo(self.nodes[0].getnewaddress(address_type="p2sh-segwit"))
588+
pubkeyhash = hash160(hex_str_to_bytes(sig_address_1['pubkey']))
589+
pkscript = CScript([OP_0, pubkeyhash])
590+
self.log.info("Should import a p2sh-p2wpkh with respective redeem script and private keys")
591+
result = self.nodes[1].importmulti([{
592+
"scriptPubKey": {
593+
"address": sig_address_1['address']
594+
},
595+
"timestamp": "now",
596+
"redeemscript": bytes_to_hex_str(pkscript),
597+
"keys": [ self.nodes[0].dumpprivkey(sig_address_1['address'])]
598+
}])
599+
assert_equal(result[0]['success'], True)
600+
address_assert = self.nodes[1].getaddressinfo(sig_address_1['address'])
601+
assert_equal(address_assert['solvable'], True)
602+
assert_equal(address_assert['ismine'], True)
603+
604+
# P2SH-P2WSH 1-of-1 multisig + redeemscript with no private key
605+
sig_address_1 = self.nodes[0].getaddressinfo(self.nodes[0].getnewaddress())
606+
multi_sig_script = self.nodes[0].addmultisigaddress(1, [sig_address_1['pubkey']], "", "p2sh-segwit")
607+
scripthash = sha256(hex_str_to_bytes(multi_sig_script['redeemScript']))
608+
redeem_script = CScript([OP_0, scripthash])
609+
self.log.info("Should import a p2sh-p2wsh with respective redeem script but no private key")
610+
result = self.nodes[1].importmulti([{
611+
"scriptPubKey": {
612+
"address": multi_sig_script['address']
613+
},
614+
"timestamp": "now",
615+
"redeemscript": bytes_to_hex_str(redeem_script),
616+
"witnessscript": multi_sig_script['redeemScript']
617+
}])
618+
assert_equal(result[0]['success'], True)
619+
address_assert = self.nodes[1].getaddressinfo(multi_sig_script['address'])
620+
assert_equal(address_assert['solvable'], True)
461621

462622
if __name__ == '__main__':
463623
ImportMultiTest ().main ()

0 commit comments

Comments
 (0)