@@ -140,5 +140,62 @@ def run_test(self):
140
140
nopriv_rpc = self .nodes [0 ].get_wallet_rpc ('desc_no_priv' )
141
141
assert_raises_rpc_error (- 4 , 'This wallet has no available keys' , nopriv_rpc .getnewaddress )
142
142
143
+ self .log .info ("Test descriptor exports" )
144
+ self .nodes [0 ].createwallet (wallet_name = 'desc_export' , descriptors = True )
145
+ exp_rpc = self .nodes [0 ].get_wallet_rpc ('desc_export' )
146
+ self .nodes [0 ].createwallet (wallet_name = 'desc_import' , disable_private_keys = True , descriptors = True )
147
+ imp_rpc = self .nodes [0 ].get_wallet_rpc ('desc_import' )
148
+
149
+ addr_types = [('legacy' , False , 'pkh(' , '44\' /1\' /0\' ' , - 13 ),
150
+ ('p2sh-segwit' , False , 'sh(wpkh(' , '49\' /1\' /0\' ' , - 14 ),
151
+ ('bech32' , False , 'wpkh(' , '84\' /1\' /0\' ' , - 13 ),
152
+ ('legacy' , True , 'pkh(' , '44\' /1\' /0\' ' , - 13 ),
153
+ ('p2sh-segwit' , True , 'sh(wpkh(' , '49\' /1\' /0\' ' , - 14 ),
154
+ ('bech32' , True , 'wpkh(' , '84\' /1\' /0\' ' , - 13 )]
155
+
156
+ for addr_type , internal , desc_prefix , deriv_path , int_idx in addr_types :
157
+ int_str = 'internal' if internal else 'external'
158
+
159
+ self .log .info ("Testing descriptor address type for {} {}" .format (addr_type , int_str ))
160
+ if internal :
161
+ addr = exp_rpc .getrawchangeaddress (address_type = addr_type )
162
+ else :
163
+ addr = exp_rpc .getnewaddress (address_type = addr_type )
164
+ desc = exp_rpc .getaddressinfo (addr )['parent_desc' ]
165
+ assert_equal (desc_prefix , desc [0 :len (desc_prefix )])
166
+ idx = desc .index ('/' ) + 1
167
+ assert_equal (deriv_path , desc [idx :idx + 9 ])
168
+ if internal :
169
+ assert_equal ('1' , desc [int_idx ])
170
+ else :
171
+ assert_equal ('0' , desc [int_idx ])
172
+
173
+ self .log .info ("Testing the same descriptor is returned for address type {} {}" .format (addr_type , int_str ))
174
+ for i in range (0 , 10 ):
175
+ if internal :
176
+ addr = exp_rpc .getrawchangeaddress (address_type = addr_type )
177
+ else :
178
+ addr = exp_rpc .getnewaddress (address_type = addr_type )
179
+ test_desc = exp_rpc .getaddressinfo (addr )['parent_desc' ]
180
+ assert_equal (desc , test_desc )
181
+
182
+ self .log .info ("Testing import of exported {} descriptor" .format (addr_type ))
183
+ imp_rpc .importdescriptors ([{
184
+ 'desc' : desc ,
185
+ 'active' : True ,
186
+ 'next_index' : 11 ,
187
+ 'timestamp' : 'now' ,
188
+ 'internal' : internal
189
+ }])
190
+
191
+ for i in range (0 , 10 ):
192
+ if internal :
193
+ exp_addr = exp_rpc .getrawchangeaddress (address_type = addr_type )
194
+ imp_addr = imp_rpc .getrawchangeaddress (address_type = addr_type )
195
+ else :
196
+ exp_addr = exp_rpc .getnewaddress (address_type = addr_type )
197
+ imp_addr = imp_rpc .getnewaddress (address_type = addr_type )
198
+ assert_equal (exp_addr , imp_addr )
199
+
143
200
if __name__ == '__main__' :
144
201
WalletDescriptorTest ().main ()
0 commit comments