Skip to content

Commit d8f05ec

Browse files
more work
1 parent 2348b2c commit d8f05ec

File tree

9 files changed

+164
-60
lines changed

9 files changed

+164
-60
lines changed

dash/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ pub mod consensus;
110110
// Private until we either make this a crate or flatten it - still to be decided.
111111
pub mod bls_sig_utils;
112112
pub(crate) mod crypto;
113-
// Re-export dip9 from key-wallet
113+
// Re-export dip9 from key-wallet
114114
use key_wallet::dip9;
115115
pub mod ephemerealdata;
116116
pub mod error;

dash/src/psbt/mod.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@ use core::{cmp, fmt};
1212
use std::collections::{HashMap, HashSet};
1313

1414
use crate::Amount;
15-
use crate::bip32::{self, ExtendedPrivKey, ExtendedPubKey, KeySource};
1615
use crate::Network;
16+
use crate::bip32::{self, ExtendedPrivKey, ExtendedPubKey, KeySource};
1717
use crate::blockdata::script::ScriptBuf;
1818
use crate::blockdata::transaction::Transaction;
1919
use crate::blockdata::transaction::txout::TxOut;
@@ -897,7 +897,8 @@ mod tests {
897897

898898
let mut hd_keypaths: BTreeMap<secp256k1::PublicKey, KeySource> = Default::default();
899899

900-
let mut sk: ExtendedPrivKey = ExtendedPrivKey::new_master(key_wallet::Network::Dash, &seed).unwrap();
900+
let mut sk: ExtendedPrivKey =
901+
ExtendedPrivKey::new_master(key_wallet::Network::Dash, &seed).unwrap();
901902

902903
let fprint = sk.fingerprint(secp);
903904

dash/tests/psbt.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,7 +131,9 @@ fn build_extended_private_key() -> ExtendedPrivKey {
131131
let xpriv = ExtendedPrivKey::from_str(extended_private_key).unwrap();
132132

133133
let sk = PrivateKey::from_wif(seed).unwrap();
134-
let seeded = ExtendedPrivKey::new_master(key_wallet::Network::Testnet, &sk.inner.secret_bytes()).unwrap();
134+
let seeded =
135+
ExtendedPrivKey::new_master(key_wallet::Network::Testnet, &sk.inner.secret_bytes())
136+
.unwrap();
135137
assert_eq!(xpriv, seeded);
136138

137139
xpriv

key-wallet-ffi/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ license = "CC0-1.0"
1010

1111
[lib]
1212
name = "key_wallet_ffi"
13-
crate-type = ["cdylib", "staticlib"]
13+
crate-type = ["cdylib", "staticlib", "lib"]
1414

1515
[features]
1616
default = []

key-wallet-ffi/src/lib.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,9 @@ use secp256k1::{PublicKey, Secp256k1};
1212
// Include the UniFFI scaffolding
1313
uniffi::include_scaffolding!("key_wallet");
1414

15+
#[cfg(test)]
16+
mod lib_tests;
17+
1518
// Initialize function
1619
pub fn initialize() {
1720
// Any global initialization if needed

key-wallet-ffi/src/lib_tests.rs

Lines changed: 134 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,134 @@
1+
//! Internal tests for key-wallet-ffi
2+
//!
3+
//! These tests verify the FFI implementation works correctly.
4+
5+
#[cfg(test)]
6+
mod tests {
7+
use crate::{
8+
validate_mnemonic, Address, AddressGenerator, ExtendedKey, HDWallet, Language, Mnemonic,
9+
Network,
10+
};
11+
12+
#[test]
13+
fn test_mnemonic_functionality() {
14+
// Test mnemonic validation
15+
let valid_phrase = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about".to_string();
16+
let is_valid = validate_mnemonic(valid_phrase.clone(), Language::English).unwrap();
17+
assert!(is_valid);
18+
19+
// Test creating from phrase
20+
let mnemonic = Mnemonic::from_phrase(valid_phrase, Language::English).unwrap();
21+
assert_eq!(mnemonic.get_word_count(), 12);
22+
23+
// Test seed generation
24+
let seed = mnemonic.to_seed("".to_string());
25+
assert_eq!(seed.len(), 64);
26+
}
27+
28+
#[test]
29+
fn test_hd_wallet_functionality() {
30+
// Create wallet from seed
31+
let seed = vec![0u8; 64];
32+
let wallet = HDWallet::from_seed(seed, Network::Testnet).unwrap();
33+
34+
// Test getting master keys
35+
let master_key = wallet.get_master_key().unwrap();
36+
let master_pub_key = wallet.get_master_pub_key().unwrap();
37+
38+
// Test deriving keys
39+
let path = "m/44'/1'/0'/0/0".to_string();
40+
let derived_key = wallet.derive(path.clone()).unwrap();
41+
let derived_pub_key = wallet.derive_pub(path).unwrap();
42+
43+
// Verify we got keys
44+
assert!(master_key.get_fingerprint().len() > 0);
45+
assert!(master_pub_key.get_fingerprint().len() > 0);
46+
assert!(derived_key.get_fingerprint().len() > 0);
47+
assert!(derived_pub_key.get_fingerprint().len() > 0);
48+
}
49+
50+
#[test]
51+
fn test_address_functionality() {
52+
// Test creating P2PKH address from public key
53+
let pubkey = vec![
54+
0x02, 0x9b, 0x63, 0x47, 0x39, 0x85, 0x05, 0xf5, 0xec, 0x93, 0x82, 0x6d, 0xc6, 0x1c,
55+
0x19, 0xf4, 0x7c, 0x66, 0xc0, 0x28, 0x3e, 0xe9, 0xbe, 0x98, 0x0e, 0x29, 0xce, 0x32,
56+
0x5a, 0x0f, 0x46, 0x79, 0xef,
57+
];
58+
let address = Address::p2pkh(pubkey, Network::Testnet).unwrap();
59+
let address_str = address.to_string();
60+
assert!(address_str.starts_with('y')); // Testnet P2PKH addresses start with 'y'
61+
62+
// Test parsing from string
63+
let parsed = Address::from_string(address_str.clone(), Network::Testnet).unwrap();
64+
assert_eq!(parsed.to_string(), address_str);
65+
assert_eq!(parsed.get_network(), Network::Testnet);
66+
67+
// Test script pubkey
68+
let script = address.get_script_pubkey();
69+
assert!(script.len() > 0);
70+
}
71+
72+
#[test]
73+
fn test_address_generator_functionality() {
74+
let seed = vec![0u8; 64];
75+
let wallet = HDWallet::from_seed(seed, Network::Testnet).unwrap();
76+
77+
// Get account extended public key
78+
let account_pub = wallet.derive_pub("m/44'/1'/0'".to_string()).unwrap();
79+
80+
let generator = AddressGenerator::new(Network::Testnet);
81+
82+
// Test single address generation
83+
let single_addr = generator.generate_p2pkh(account_pub.clone()).unwrap();
84+
assert!(single_addr.to_string().starts_with('y'));
85+
86+
// Test address range generation
87+
let addresses = generator.generate_range(account_pub, true, 0, 5).unwrap();
88+
assert_eq!(addresses.len(), 5);
89+
for addr in addresses {
90+
assert!(addr.to_string().starts_with('y'));
91+
}
92+
}
93+
94+
#[test]
95+
fn test_extended_key_methods() {
96+
let seed = vec![0u8; 64];
97+
let wallet = HDWallet::from_seed(seed, Network::Testnet).unwrap();
98+
let key = wallet.get_master_key().unwrap();
99+
100+
// Test all ExtendedKey methods
101+
let fingerprint = key.get_fingerprint();
102+
assert_eq!(fingerprint.len(), 4);
103+
104+
let chain_code = key.get_chain_code();
105+
assert_eq!(chain_code.len(), 32);
106+
107+
let depth = key.get_depth();
108+
assert_eq!(depth, 0); // Master key has depth 0
109+
110+
let child_number = key.get_child_number();
111+
assert_eq!(child_number, 0); // Master key has child number 0
112+
113+
let key_str = key.to_string();
114+
assert!(key_str.starts_with("tprv")); // Testnet private key
115+
}
116+
117+
#[test]
118+
fn test_error_handling() {
119+
// Test invalid mnemonic
120+
let invalid_phrase = "invalid mnemonic phrase".to_string();
121+
let result = Mnemonic::from_phrase(invalid_phrase, Language::English);
122+
assert!(result.is_err());
123+
124+
// Test invalid address
125+
let result = Address::from_string("invalid_address".to_string(), Network::Testnet);
126+
assert!(result.is_err());
127+
128+
// Test invalid derivation path
129+
let seed = vec![0u8; 64];
130+
let wallet = HDWallet::from_seed(seed, Network::Testnet).unwrap();
131+
let result = wallet.derive("invalid/path".to_string());
132+
assert!(result.is_err());
133+
}
134+
}

key-wallet-ffi/tests/ffi_tests.rs

Lines changed: 15 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,19 @@
11
//! FFI tests
2-
3-
/* Temporarily disabled due to uniffi build issues
4-
use key_wallet_ffi::{Mnemonic, Language, Network, HDWallet, AddressGenerator};
5-
use std::sync::Arc;
6-
7-
#[test]
8-
fn test_mnemonic_ffi() {
9-
// Test mnemonic validation
10-
let valid_phrase = "abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon abandon about".to_string();
11-
let is_valid = Mnemonic::validate(valid_phrase.clone(), Language::English).unwrap();
12-
assert!(is_valid);
13-
14-
// Test creating from phrase
15-
let mnemonic = Mnemonic::from_phrase(valid_phrase, Language::English).unwrap();
16-
assert_eq!(mnemonic.get_word_count(), 12);
17-
18-
// Test seed generation
19-
let seed = mnemonic.to_seed("".to_string());
20-
assert_eq!(seed.len(), 64);
21-
}
22-
23-
#[test]
24-
fn test_hd_wallet_ffi() {
25-
// Create wallet from seed
26-
let seed = vec![0u8; 64];
27-
let wallet = HDWallet::from_seed(seed, Network::Testnet).unwrap();
28-
29-
// Test deriving keys
30-
let path = "m/44'/1'/0'/0/0".to_string();
31-
let privkey = wallet.derive_priv_key(path.clone()).unwrap();
32-
let pubkey = wallet.derive_pub_key(path).unwrap();
33-
34-
assert!(!privkey.is_empty());
35-
assert!(!pubkey.is_empty());
36-
}
37-
38-
#[test]
39-
fn test_address_generator_ffi() {
40-
let seed = vec![0u8; 64];
41-
let wallet = Arc::new(HDWallet::from_seed(seed, Network::Testnet).unwrap());
42-
43-
let generator = AddressGenerator::new(wallet, 0, 0, false).unwrap();
44-
45-
// Test address generation
46-
let addresses = generator.generate_addresses(5).unwrap();
47-
assert_eq!(addresses.len(), 5);
48-
}
49-
*/
2+
//!
3+
//! These tests verify the FFI implementation works correctly.
4+
//! They test the Rust implementation directly, not through generated bindings.
505
516
#[test]
52-
fn placeholder_test() {
53-
// Placeholder to ensure tests compile
54-
assert_eq!(1 + 1, 2);
7+
fn test_ffi_types_exist() {
8+
// This test just verifies the crate compiles with all the expected types
9+
use key_wallet_ffi::{
10+
initialize, validate_mnemonic, Address, AddressGenerator, AddressType, ExtendedKey,
11+
HDWallet, KeyWalletError, Language, Mnemonic, Network,
12+
};
13+
14+
// Verify we can call initialize
15+
initialize();
16+
17+
// This test passes if it compiles
18+
assert!(true);
5519
}

key-wallet/src/bip32.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -180,12 +180,12 @@ impl<'de> serde::Deserialize<'de> for ChainCode {
180180
D: serde::Deserializer<'de>,
181181
{
182182
use serde::de::Error;
183-
183+
184184
let s = String::deserialize(deserializer)?;
185185
if s.len() != 64 {
186186
return Err(D::Error::custom("invalid chaincode length"));
187187
}
188-
188+
189189
let mut bytes = [0u8; 32];
190190
for (i, chunk) in s.as_bytes().chunks(2).enumerate() {
191191
if i >= 32 {
@@ -381,7 +381,7 @@ impl<'de> serde::Deserialize<'de> for Fingerprint {
381381
D: serde::Deserializer<'de>,
382382
{
383383
use serde::de::Error;
384-
384+
385385
let s = String::deserialize(deserializer)?;
386386
Self::from_str(&s).map_err(|_| D::Error::custom("invalid fingerprint"))
387387
}

key-wallet/src/test_macros.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,4 @@ macro_rules! serde_round_trip {
99
let decoded = serde_json::from_value(encoded).unwrap();
1010
assert_eq!($var, decoded);
1111
}};
12-
}
12+
}

0 commit comments

Comments
 (0)