@@ -797,7 +797,7 @@ uniffi::deps::static_assertions::assert_impl_all!(Wallet: Sync, Send);
797
797
// crate.
798
798
#[ cfg( test) ]
799
799
mod test {
800
- use crate :: { TxBuilder , Wallet } ;
800
+ use crate :: * ;
801
801
use bdk:: bitcoin:: Address ;
802
802
use bdk:: bitcoin:: Network :: Testnet ;
803
803
use bdk:: wallet:: get_funded_wallet;
@@ -857,4 +857,112 @@ mod test {
857
857
let output_value = psbt. unsigned_tx . output . get ( 0 ) . cloned ( ) . unwrap ( ) . value ;
858
858
assert_eq ! ( output_value, 49_890_u64 ) ; // input - fee
859
859
}
860
+
861
+ fn get_descriptor_secret_key ( ) -> DescriptorSecretKey {
862
+ let mnemonic =
863
+ "chaos fabric time speed sponsor all flat solution wisdom trophy crack object robot pave observe combine where aware bench orient secret primary cable detect" . to_string ( ) ;
864
+ DescriptorSecretKey :: new ( Network :: Testnet , mnemonic, None ) . unwrap ( )
865
+ }
866
+
867
+ fn derive_dsk (
868
+ key : & DescriptorSecretKey ,
869
+ path : & str ,
870
+ ) -> Result < Arc < DescriptorSecretKey > , BdkError > {
871
+ let path = Arc :: new ( DerivationPath :: new ( path. to_string ( ) ) . unwrap ( ) ) ;
872
+ key. derive ( path)
873
+ }
874
+
875
+ fn extend_dsk ( key : & DescriptorSecretKey , path : & str ) -> Arc < DescriptorSecretKey > {
876
+ let path = Arc :: new ( DerivationPath :: new ( path. to_string ( ) ) . unwrap ( ) ) ;
877
+ key. extend ( path)
878
+ }
879
+
880
+ fn derive_dpk (
881
+ key : & DescriptorPublicKey ,
882
+ path : & str ,
883
+ ) -> Result < Arc < DescriptorPublicKey > , BdkError > {
884
+ let path = Arc :: new ( DerivationPath :: new ( path. to_string ( ) ) . unwrap ( ) ) ;
885
+ key. derive ( path)
886
+ }
887
+
888
+ fn extend_dpk ( key : & DescriptorPublicKey , path : & str ) -> Arc < DescriptorPublicKey > {
889
+ let path = Arc :: new ( DerivationPath :: new ( path. to_string ( ) ) . unwrap ( ) ) ;
890
+ key. extend ( path)
891
+ }
892
+
893
+ #[ test]
894
+ fn test_generate_descriptor_secret_key ( ) {
895
+ let master_dsk = get_descriptor_secret_key ( ) ;
896
+ assert_eq ! ( master_dsk. as_string( ) , "tprv8ZgxMBicQKsPdWuqM1t1CDRvQtQuBPyfL6GbhQwtxDKgUAVPbxmj71pRA8raTqLrec5LyTs5TqCxdABcZr77bt2KyWA5bizJHnC4g4ysm4h/*" ) ;
897
+ assert_eq ! ( master_dsk. as_public( ) . as_string( ) , "tpubD6NzVbkrYhZ4WywdEfYbbd62yuvqLjAZuPsNyvzCNV85JekAEMbKHWSHLF9h3j45SxewXDcLv328B1SEZrxg4iwGfmdt1pDFjZiTkGiFqGa/*" ) ;
898
+ }
899
+
900
+ #[ test]
901
+ fn test_derive_self ( ) {
902
+ let master_dsk = get_descriptor_secret_key ( ) ;
903
+ let derived_dsk: & DescriptorSecretKey = & derive_dsk ( & master_dsk, "m" ) . unwrap ( ) ;
904
+ assert_eq ! ( derived_dsk. as_string( ) , "[d1d04177]tprv8ZgxMBicQKsPdWuqM1t1CDRvQtQuBPyfL6GbhQwtxDKgUAVPbxmj71pRA8raTqLrec5LyTs5TqCxdABcZr77bt2KyWA5bizJHnC4g4ysm4h/*" ) ;
905
+
906
+ let master_dpk: & DescriptorPublicKey = & master_dsk. as_public ( ) ;
907
+ let derived_dpk: & DescriptorPublicKey = & derive_dpk ( master_dpk, "m" ) . unwrap ( ) ;
908
+ assert_eq ! ( derived_dpk. as_string( ) , "[d1d04177]tpubD6NzVbkrYhZ4WywdEfYbbd62yuvqLjAZuPsNyvzCNV85JekAEMbKHWSHLF9h3j45SxewXDcLv328B1SEZrxg4iwGfmdt1pDFjZiTkGiFqGa/*" ) ;
909
+ }
910
+
911
+ #[ test]
912
+ fn test_derive_descriptors_keys ( ) {
913
+ let master_dsk = get_descriptor_secret_key ( ) ;
914
+ let derived_dsk: & DescriptorSecretKey = & derive_dsk ( & master_dsk, "m/0" ) . unwrap ( ) ;
915
+ assert_eq ! ( derived_dsk. as_string( ) , "[d1d04177/0]tprv8d7Y4JLmD25jkKbyDZXcdoPHu1YtMHuH21qeN7mFpjfumtSU7eZimFYUCSa3MYzkEYfSNRBV34GEr2QXwZCMYRZ7M1g6PUtiLhbJhBZEGYJ/*" ) ;
916
+
917
+ let master_dpk: & DescriptorPublicKey = & master_dsk. as_public ( ) ;
918
+ let derived_dpk: & DescriptorPublicKey = & derive_dpk ( master_dpk, "m/0" ) . unwrap ( ) ;
919
+ assert_eq ! ( derived_dpk. as_string( ) , "[d1d04177/0]tpubD9oaCiP1MPmQdndm7DCD3D3QU34pWd6BbKSRedoZF1UJcNhEk3PJwkALNYkhxeTKL29oGNR7psqvT1KZydCGqUDEKXN6dVQJY2R8ooLPy8m/*" ) ;
920
+ }
921
+
922
+ #[ test]
923
+ fn test_extend_descriptor_keys ( ) {
924
+ let master_dsk = get_descriptor_secret_key ( ) ;
925
+ let extended_dsk: & DescriptorSecretKey = & extend_dsk ( & master_dsk, "m/0" ) ;
926
+ assert_eq ! ( extended_dsk. as_string( ) , "tprv8ZgxMBicQKsPdWuqM1t1CDRvQtQuBPyfL6GbhQwtxDKgUAVPbxmj71pRA8raTqLrec5LyTs5TqCxdABcZr77bt2KyWA5bizJHnC4g4ysm4h/0/*" ) ;
927
+
928
+ let master_dpk: & DescriptorPublicKey = & master_dsk. as_public ( ) ;
929
+ let extended_dpk: & DescriptorPublicKey = & extend_dpk ( master_dpk, "m/0" ) ;
930
+ assert_eq ! ( extended_dpk. as_string( ) , "tpubD6NzVbkrYhZ4WywdEfYbbd62yuvqLjAZuPsNyvzCNV85JekAEMbKHWSHLF9h3j45SxewXDcLv328B1SEZrxg4iwGfmdt1pDFjZiTkGiFqGa/0/*" ) ;
931
+ }
932
+
933
+ #[ test]
934
+ fn test_derive_and_extend_descriptor_secret_key ( ) {
935
+ let master_dsk = get_descriptor_secret_key ( ) ;
936
+
937
+ // derive DescriptorSecretKey with path "m/0" from master
938
+ let derived_dsk: & DescriptorSecretKey = & derive_dsk ( & master_dsk, "m/0" ) . unwrap ( ) ;
939
+ assert_eq ! ( derived_dsk. as_string( ) , "[d1d04177/0]tprv8d7Y4JLmD25jkKbyDZXcdoPHu1YtMHuH21qeN7mFpjfumtSU7eZimFYUCSa3MYzkEYfSNRBV34GEr2QXwZCMYRZ7M1g6PUtiLhbJhBZEGYJ/*" ) ;
940
+
941
+ // extend derived_dsk with path "m/0"
942
+ let extended_dsk: & DescriptorSecretKey = & extend_dsk ( derived_dsk, "m/0" ) ;
943
+ assert_eq ! ( extended_dsk. as_string( ) , "[d1d04177/0]tprv8d7Y4JLmD25jkKbyDZXcdoPHu1YtMHuH21qeN7mFpjfumtSU7eZimFYUCSa3MYzkEYfSNRBV34GEr2QXwZCMYRZ7M1g6PUtiLhbJhBZEGYJ/0/*" ) ;
944
+ let extended_dsk_mutex = extended_dsk. descriptor_secret_key_mutex . lock ( ) . unwrap ( ) ;
945
+
946
+ // checking extended derivation_path
947
+ assert_eq ! (
948
+ match extended_dsk_mutex. deref( ) {
949
+ BdkDescriptorSecretKey :: XPrv ( xkey) => {
950
+ Some ( xkey. derivation_path. clone( ) )
951
+ }
952
+ _ => {
953
+ None
954
+ }
955
+ }
956
+ . unwrap( )
957
+ . to_string( ) ,
958
+ BdkDerivationPath :: from_str( "m/0" ) . unwrap( ) . to_string( )
959
+ ) ;
960
+ }
961
+
962
+ #[ test]
963
+ fn test_derive_hardened_path_using_public ( ) {
964
+ let master_dpk = get_descriptor_secret_key ( ) . as_public ( ) ;
965
+ let derived_dpk = & derive_dpk ( & master_dpk, "m/84h/1h/0h" ) ;
966
+ assert ! ( derived_dpk. is_err( ) ) ;
967
+ }
860
968
}
0 commit comments