Skip to main content

contextvm_sdk/signer/
mod.rs

1//! Nostr signer utilities.
2//!
3//! Re-exports key types from nostr-sdk and provides convenience constructors.
4
5pub use nostr_sdk::prelude::{Keys, NostrSigner, PublicKey};
6
7/// Create keys from a private key string (hex or nsec/bech32).
8pub fn from_sk(sk: &str) -> std::result::Result<Keys, nostr_sdk::key::Error> {
9    Keys::parse(sk)
10}
11
12/// Generate a new random keypair.
13pub fn generate() -> Keys {
14    Keys::generate()
15}
16
17#[cfg(test)]
18mod tests {
19    use super::*;
20
21    #[test]
22    fn test_generate_produces_valid_keys() {
23        let keys = generate();
24        let pubkey = keys.public_key();
25        // Public key hex should be 64 chars
26        assert_eq!(pubkey.to_hex().len(), 64);
27    }
28
29    #[test]
30    fn test_generate_produces_unique_keys() {
31        let k1 = generate();
32        let k2 = generate();
33        assert_ne!(k1.public_key(), k2.public_key());
34    }
35
36    #[test]
37    fn test_from_sk_hex() {
38        let keys = generate();
39        let sk_hex = keys.secret_key().to_secret_hex();
40        let restored = from_sk(&sk_hex).unwrap();
41        assert_eq!(restored.public_key(), keys.public_key());
42    }
43
44    #[test]
45    fn test_from_sk_nsec() {
46        let keys = generate();
47        use nostr_sdk::ToBech32;
48        let nsec = keys.secret_key().to_bech32().unwrap();
49        let restored = from_sk(&nsec).unwrap();
50        assert_eq!(restored.public_key(), keys.public_key());
51    }
52
53    #[test]
54    fn test_from_sk_invalid() {
55        assert!(from_sk("not_a_valid_key").is_err());
56        assert!(from_sk("").is_err());
57    }
58}