20
20
"""
21
21
22
22
from test_framework .test_framework import BitcoinTestFramework
23
+ from test_framework .address import AddressType
23
24
from test_framework .util import (
24
25
connect_nodes ,
25
26
assert_equal ,
37
38
Rescan = enum .Enum ("Rescan" , "no yes late_timestamp" )
38
39
39
40
40
- class Variant (collections .namedtuple ("Variant" , "call data rescan prune" )):
41
+ class Variant (collections .namedtuple ("Variant" , "call data address_type rescan prune" )):
41
42
"""Helper for importing one key and verifying scanned transactions."""
42
43
43
44
def do_import (self , timestamp ):
44
45
"""Call one key import RPC."""
45
46
rescan = self .rescan == Rescan .yes
46
47
48
+ assert_equal (self .address ["solvable" ], True )
49
+ assert_equal (self .address ["isscript" ], self .address_type == AddressType .p2sh_segwit )
50
+ assert_equal (self .address ["iswitness" ], self .address_type == AddressType .bech32 )
51
+ if self .address ["isscript" ]:
52
+ assert_equal (self .address ["embedded" ]["isscript" ], False )
53
+ assert_equal (self .address ["embedded" ]["iswitness" ], True )
54
+
47
55
if self .call == Call .single :
48
56
if self .data == Data .address :
49
57
response = self .node .importaddress (address = self .address ["address" ], label = self .label , rescan = rescan )
@@ -54,7 +62,7 @@ def do_import(self, timestamp):
54
62
assert_equal (response , None )
55
63
56
64
elif self .call in (Call .multiaddress , Call .multiscript ):
57
- response = self . node . importmulti ([ {
65
+ request = {
58
66
"scriptPubKey" : {
59
67
"address" : self .address ["address" ]
60
68
} if self .call == Call .multiaddress else self .address ["scriptPubKey" ],
@@ -63,7 +71,14 @@ def do_import(self, timestamp):
63
71
"keys" : [self .key ] if self .data == Data .priv else [],
64
72
"label" : self .label ,
65
73
"watchonly" : self .data != Data .priv
66
- }], {"rescan" : self .rescan in (Rescan .yes , Rescan .late_timestamp )})
74
+ }
75
+ if self .address_type == AddressType .p2sh_segwit and self .data != Data .address :
76
+ # We need solving data when providing a pubkey or privkey as data
77
+ request .update ({"redeemscript" : self .address ['embedded' ]['scriptPubKey' ]})
78
+ response = self .node .importmulti (
79
+ requests = [request ],
80
+ options = {"rescan" : self .rescan in (Rescan .yes , Rescan .late_timestamp )},
81
+ )
67
82
assert_equal (response , [{"success" : True }])
68
83
69
84
def check (self , txid = None , amount = None , confirmation_height = None ):
@@ -105,7 +120,7 @@ def check(self, txid=None, amount=None, confirmation_height=None):
105
120
106
121
107
122
# List of Variants for each way a key or address could be imported.
108
- IMPORT_VARIANTS = [Variant (* variants ) for variants in itertools .product (Call , Data , Rescan , (False , True ))]
123
+ IMPORT_VARIANTS = [Variant (* variants ) for variants in itertools .product (Call , Data , AddressType , Rescan , (False , True ))]
109
124
110
125
# List of nodes to import keys to. Half the nodes will have pruning disabled,
111
126
# half will have it enabled. Different nodes will be used for imports that are
@@ -135,12 +150,12 @@ def skip_test_if_missing_module(self):
135
150
self .skip_if_no_wallet ()
136
151
137
152
def setup_network (self ):
138
- extra_args = [["-addresstype=legacy" ] for _ in range ( self .num_nodes )]
153
+ self . extra_args = [[]] * self .num_nodes
139
154
for i , import_node in enumerate (IMPORT_NODES , 2 ):
140
155
if import_node .prune :
141
- extra_args [i ] += ["-prune=1" ]
156
+ self . extra_args [i ] += ["-prune=1" ]
142
157
143
- self .add_nodes (self .num_nodes , extra_args = extra_args )
158
+ self .add_nodes (self .num_nodes , extra_args = self . extra_args )
144
159
145
160
# Import keys with pruning disabled
146
161
self .start_nodes (extra_args = [[]] * self .num_nodes )
@@ -157,7 +172,10 @@ def run_test(self):
157
172
# each possible type of wallet import RPC.
158
173
for i , variant in enumerate (IMPORT_VARIANTS ):
159
174
variant .label = "label {} {}" .format (i , variant )
160
- variant .address = self .nodes [1 ].getaddressinfo (self .nodes [1 ].getnewaddress (variant .label ))
175
+ variant .address = self .nodes [1 ].getaddressinfo (self .nodes [1 ].getnewaddress (
176
+ label = variant .label ,
177
+ address_type = variant .address_type .value ,
178
+ ))
161
179
variant .key = self .nodes [1 ].dumpprivkey (variant .address ["address" ])
162
180
variant .initial_amount = get_rand_amount ()
163
181
variant .initial_txid = self .nodes [0 ].sendtoaddress (variant .address ["address" ], variant .initial_amount )
0 commit comments