@@ -259,7 +259,11 @@ pub async fn confirm_extended(
259259/// - no two xpubs are the same.
260260///
261261/// keypath: account-level keypath, e.g. m/48'/0'/10'/2'
262- pub fn validate ( multisig : & Multisig , keypath : & [ u32 ] ) -> Result < ( ) , Error > {
262+ pub fn validate (
263+ hal : & mut impl crate :: hal:: Hal ,
264+ multisig : & Multisig ,
265+ keypath : & [ u32 ] ,
266+ ) -> Result < ( ) , Error > {
263267 if multisig. xpubs . len ( ) < 2 || multisig. xpubs . len ( ) > MAX_SIGNERS {
264268 return Err ( Error :: InvalidInput ) ;
265269 }
@@ -270,7 +274,7 @@ pub fn validate(multisig: &Multisig, keypath: &[u32]) -> Result<(), Error> {
270274 return Err ( Error :: InvalidInput ) ;
271275 }
272276
273- let our_xpub = crate :: keystore:: get_xpub_once ( keypath) ?. serialize ( None ) ?;
277+ let our_xpub = crate :: keystore:: get_xpub_once ( hal , keypath) ?. serialize ( None ) ?;
274278 let maybe_our_xpub =
275279 bip32:: Xpub :: from ( & multisig. xpubs [ multisig. our_xpub_index as usize ] ) . serialize ( None ) ?;
276280 if our_xpub != maybe_our_xpub {
@@ -589,18 +593,20 @@ mod tests {
589593 script_type : ScriptType :: P2wsh as _ ,
590594 } ;
591595
596+ let mut mock_hal = crate :: hal:: testing:: TestingHal :: new ( ) ;
597+
592598 // Keystore locked.
593599 crate :: keystore:: lock ( ) ;
594- assert ! ( validate( & multisig, keypath) . is_err( ) ) ;
600+ assert ! ( validate( & mut mock_hal , & multisig, keypath) . is_err( ) ) ;
595601
596602 // Ok.
597603 mock_unlocked_using_mnemonic (
598604 "sudden tenant fault inject concert weather maid people chunk youth stumble grit" ,
599605 "" ,
600606 ) ;
601- assert ! ( validate( & multisig, keypath) . is_ok( ) ) ;
607+ assert ! ( validate( & mut mock_hal , & multisig, keypath) . is_ok( ) ) ;
602608 // Ok at arbitrary keypath.
603- assert ! ( validate( & Multisig {
609+ assert ! ( validate( & mut mock_hal , & Multisig {
604610 threshold: 1 ,
605611 xpubs: vec![
606612 parse_xpub( "xpub6FMWuwbCA9KhoRzAMm63ZhLspk5S2DM5sePo8J8mQhcS1xyMbAqnc7Q7UescVEVFCS6qBMQLkEJWQ9Z3aDPgBov5nFUYxsJhwumsxM4npSo" ) . unwrap( ) ,
@@ -633,53 +639,53 @@ mod tests {
633639 "xpub6ECHc4kmTC2tQg2ZoAoazwyag9C4V6yFsZEhjwMJixdVNsUibot6uEvsZY38ZLVqWCtyc9gbzFEwHQLHCT8EiDDKSNNsFAB8NQYRgkiAQwu" ,
634640 "xpub6F7CaxXzBCtvXwpRi61KYyhBRkgT1856ujHV5AbJK6ySCUYoDruBH6Pnsi6eHkDiuKuAJ2tSc9x3emP7aax9Dc3u7nP7RCQXEjLKihQu6w1" ,
635641 ] . iter ( ) . map ( |s| parse_xpub ( s) . unwrap ( ) ) . collect ( ) ;
636- assert ! ( validate( & invalid, keypath) . is_err( ) ) ;
642+ assert ! ( validate( & mut mock_hal , & invalid, keypath) . is_err( ) ) ;
637643 }
638644
639645 {
640646 // number of cosigners too small
641647
642648 let mut invalid = multisig. clone ( ) ;
643649 invalid. xpubs = vec ! [ ] ;
644- assert ! ( validate( & invalid, keypath) . is_err( ) ) ;
650+ assert ! ( validate( & mut mock_hal , & invalid, keypath) . is_err( ) ) ;
645651 invalid. our_xpub_index = 0 ;
646652 invalid. xpubs = vec ! [ parse_xpub( our_xpub_str) . unwrap( ) ] ;
647- assert ! ( validate( & invalid, keypath) . is_err( ) ) ;
653+ assert ! ( validate( & mut mock_hal , & invalid, keypath) . is_err( ) ) ;
648654 }
649655
650656 {
651657 // threshold larger than number of cosigners
652658 let mut invalid = multisig. clone ( ) ;
653659 invalid. threshold = 3 ;
654- assert ! ( validate( & invalid, keypath) . is_err( ) ) ;
660+ assert ! ( validate( & mut mock_hal , & invalid, keypath) . is_err( ) ) ;
655661
656662 // threshold zero
657663 invalid. threshold = 0 ;
658- assert ! ( validate( & invalid, keypath) . is_err( ) ) ;
664+ assert ! ( validate( & mut mock_hal , & invalid, keypath) . is_err( ) ) ;
659665 }
660666
661667 {
662668 // our xpub index larger than number of cosigners (xpubs[our_xpb_index] would be out of
663669 // bounds).
664670 let mut invalid = multisig. clone ( ) ;
665671 invalid. our_xpub_index = 2 ;
666- assert ! ( validate( & invalid, keypath) . is_err( ) ) ;
672+ assert ! ( validate( & mut mock_hal , & invalid, keypath) . is_err( ) ) ;
667673 }
668674
669675 {
670676 // our xpub is not part of the multisig (overwrite our xpub with an arbitrary other one).
671677
672678 let mut invalid = multisig. clone ( ) ;
673679 invalid. xpubs [ 1 ] = parse_xpub ( "xpub6FNT7x2ZEBMhs4jvZJSEBV2qBCBnRidNsyqe7inT9V2wmEn4sqidTEudB4dVSvEjXz2NytcymwWJb8PPYExRycNf9SH8fAHzPWUsQJAmbR3" ) . unwrap ( ) ;
674- assert ! ( validate( & invalid, keypath) . is_err( ) ) ;
680+ assert ! ( validate( & mut mock_hal , & invalid, keypath) . is_err( ) ) ;
675681 }
676682
677683 {
678684 // duplicate
679685
680686 let mut invalid = multisig. clone ( ) ;
681687 invalid. xpubs [ 0 ] = invalid. xpubs [ 1 ] . clone ( ) ;
682- assert ! ( validate( & invalid, keypath) . is_err( ) ) ;
688+ assert ! ( validate( & mut mock_hal , & invalid, keypath) . is_err( ) ) ;
683689 }
684690 }
685691
0 commit comments