Skip to content

Commit 2ab9e09

Browse files
committed
Added tests for DescriptorSecretKey and DescriptorPublicKey
1 parent 508e15d commit 2ab9e09

File tree

1 file changed

+109
-1
lines changed

1 file changed

+109
-1
lines changed

src/lib.rs

Lines changed: 109 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -797,7 +797,7 @@ uniffi::deps::static_assertions::assert_impl_all!(Wallet: Sync, Send);
797797
// crate.
798798
#[cfg(test)]
799799
mod test {
800-
use crate::{TxBuilder, Wallet};
800+
use crate::*;
801801
use bdk::bitcoin::Address;
802802
use bdk::bitcoin::Network::Testnet;
803803
use bdk::wallet::get_funded_wallet;
@@ -857,4 +857,112 @@ mod test {
857857
let output_value = psbt.unsigned_tx.output.get(0).cloned().unwrap().value;
858858
assert_eq!(output_value, 49_890_u64); // input - fee
859859
}
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+
}
860968
}

0 commit comments

Comments
 (0)