@@ -58,7 +58,7 @@ pub fn validate_account(
58
58
/// - Electrum-style: m/48'/coin'/account'/script_type', where script_type is 1 for p2wsh-p2sh and 2
59
59
/// for p2wsh.
60
60
/// - Nunchuk-style: m/48'/coin'/account', independent of the script type.
61
- pub fn validate_account_multisig (
61
+ fn validate_account_multisig (
62
62
keypath : & [ u32 ] ,
63
63
expected_coin : u32 ,
64
64
script_type : MultisigScriptType ,
@@ -89,22 +89,6 @@ fn validate_change_address(change: u32, address: u32) -> Result<(), ()> {
89
89
}
90
90
}
91
91
92
- /// Validates that the prefix (all but last two elements) of the keypath is a valid multisig account
93
- /// keypath and the last to elements are a valid change and receive element.
94
- pub fn validate_address_multisig (
95
- keypath : & [ u32 ] ,
96
- expected_coin : u32 ,
97
- script_type : MultisigScriptType ,
98
- ) -> Result < ( ) , ( ) > {
99
- if keypath. len ( ) >= 2 {
100
- let ( keypath_account, keypath_rest) = keypath. split_at ( keypath. len ( ) - 2 ) ;
101
- validate_account_multisig ( keypath_account, expected_coin, script_type) ?;
102
- validate_change_address ( keypath_rest[ 0 ] , keypath_rest[ 1 ] )
103
- } else {
104
- Err ( ( ) )
105
- }
106
- }
107
-
108
92
/// Validates that the address index is valid and that the account keypath prefix is not empty.
109
93
///
110
94
/// Note that the change index is not verified as in policies, it can be different to 0 and 1
@@ -166,7 +150,8 @@ pub fn validate_address_simple(
166
150
}
167
151
}
168
152
169
- /// Checks if the keypath is a valid account-level keypath for any supported script type.
153
+ /// Checks if the the xpub at this keypath can be exported without warning the user of that it is an
154
+ /// unusual keypath.
170
155
pub fn validate_xpub ( keypath : & [ u32 ] , expected_coin : u32 , taproot_support : bool ) -> Result < ( ) , ( ) > {
171
156
for & script_type in ALL_MULTISCRIPT_SCRIPT_TYPES . iter ( ) {
172
157
if validate_account_multisig ( keypath, expected_coin, script_type) . is_ok ( ) {
@@ -178,6 +163,10 @@ pub fn validate_xpub(keypath: &[u32], expected_coin: u32, taproot_support: bool)
178
163
return Ok ( ( ) ) ;
179
164
}
180
165
}
166
+ // m/45', used/exported by Unchained.
167
+ if keypath == [ 45 + HARDENED ] {
168
+ return Ok ( ( ) ) ;
169
+ }
181
170
Err ( ( ) )
182
171
}
183
172
@@ -265,161 +254,6 @@ mod tests {
265
254
. is_err( ) ) ;
266
255
}
267
256
268
- #[ test]
269
- fn test_validate_address_multisig ( ) {
270
- let coin = 1 + HARDENED ;
271
- // valid p2wsh
272
- assert ! ( validate_address_multisig(
273
- & [ 48 + HARDENED , coin, 0 + HARDENED , 2 + HARDENED , 0 , 0 ] ,
274
- coin,
275
- MultisigScriptType :: P2wsh
276
- )
277
- . is_ok( ) ) ;
278
-
279
- // valid p2wsh-p2sh
280
- assert ! ( validate_address_multisig(
281
- & [ 48 + HARDENED , coin, 0 + HARDENED , 1 + HARDENED , 0 , 0 ] ,
282
- coin,
283
- MultisigScriptType :: P2wshP2sh
284
- )
285
- . is_ok( ) ) ;
286
-
287
- // valid Nunchuk-style
288
- assert ! ( validate_address_multisig(
289
- & [ 48 + HARDENED , coin, 0 + HARDENED , 0 , 0 ] ,
290
- coin,
291
- MultisigScriptType :: P2wsh
292
- )
293
- . is_ok( ) ) ;
294
- assert ! ( validate_address_multisig(
295
- & [ 48 + HARDENED , coin, 0 + HARDENED , 0 , 0 ] ,
296
- coin,
297
- MultisigScriptType :: P2wshP2sh
298
- )
299
- . is_ok( ) ) ;
300
-
301
- // wrong script type for p2wsh
302
- assert ! ( validate_address_multisig(
303
- & [
304
- 48 + HARDENED ,
305
- coin,
306
- 0 + HARDENED ,
307
- 1 + HARDENED , // should be 2'
308
- 0 ,
309
- 0 ,
310
- ] ,
311
- coin,
312
- MultisigScriptType :: P2wsh
313
- )
314
- . is_err( ) ) ;
315
-
316
- // wrong script type for p2wsh-p2sh
317
- assert ! ( validate_address_multisig(
318
- & [
319
- 48 + HARDENED ,
320
- coin,
321
- 0 + HARDENED ,
322
- 2 + HARDENED , // should be 1'
323
- 0 ,
324
- 0 ,
325
- ] ,
326
- coin,
327
- MultisigScriptType :: P2wshP2sh
328
- )
329
- . is_err( ) ) ;
330
-
331
- // too short
332
- assert ! ( validate_address_multisig(
333
- & [ 48 + HARDENED , coin, 0 + HARDENED , 2 + HARDENED , 0 ] ,
334
- coin,
335
- MultisigScriptType :: P2wsh
336
- )
337
- . is_err( ) ) ;
338
-
339
- // too long
340
- assert ! ( validate_address_multisig(
341
- & [ 48 + HARDENED , coin, 0 + HARDENED , 2 + HARDENED , 0 , 0 , 0 ] ,
342
- coin,
343
- MultisigScriptType :: P2wsh
344
- )
345
- . is_err( ) ) ;
346
-
347
- // wrong purpose
348
- assert ! ( validate_address_multisig(
349
- & [
350
- 49 + HARDENED , // <- wrong
351
- coin,
352
- 0 + HARDENED ,
353
- 2 + HARDENED ,
354
- 0 ,
355
- 0 ,
356
- ] ,
357
- coin,
358
- MultisigScriptType :: P2wsh
359
- )
360
- . is_err( ) ) ;
361
-
362
- // unhardened account
363
- assert ! ( validate_address_multisig(
364
- & [
365
- 48 + HARDENED ,
366
- coin,
367
- 0 , // <- wrong
368
- 2 + HARDENED ,
369
- 0 ,
370
- 0 ,
371
- ] ,
372
- coin,
373
- MultisigScriptType :: P2wsh
374
- )
375
- . is_err( ) ) ;
376
-
377
- // account too high
378
- assert ! ( validate_address_multisig(
379
- & [
380
- 48 + HARDENED ,
381
- coin,
382
- 100 + HARDENED , // <- wrong
383
- 2 + HARDENED ,
384
- 0 ,
385
- 0 ,
386
- ] ,
387
- coin,
388
- MultisigScriptType :: P2wsh
389
- )
390
- . is_err( ) ) ;
391
-
392
- // wrong change
393
- assert ! ( validate_address_multisig(
394
- & [
395
- 48 + HARDENED ,
396
- coin,
397
- 0 + HARDENED ,
398
- 2 + HARDENED ,
399
- 2 , // <- wrong
400
- 0 ,
401
- ] ,
402
- coin,
403
- MultisigScriptType :: P2wsh
404
- )
405
- . is_err( ) ) ;
406
-
407
- // address too high
408
- assert ! ( validate_address_multisig(
409
- & [
410
- 48 + HARDENED ,
411
- coin,
412
- 0 + HARDENED ,
413
- 2 + HARDENED ,
414
- 0 ,
415
- 10000 , // <- wrong
416
- ] ,
417
- coin,
418
- MultisigScriptType :: P2wsh
419
- )
420
- . is_err( ) ) ;
421
- }
422
-
423
257
#[ test]
424
258
fn test_validate_address_simple ( ) {
425
259
let bip44_account = 99 + HARDENED ;
0 commit comments