ether_link/
lib.rs

1#[cfg(feature = "wallet")]
2pub mod wallet;
3#[cfg(feature = "wallet")]
4pub use wallet::Wallet;
5
6#[cfg(feature = "signature")]
7pub mod signature;
8#[cfg(feature = "signature")]
9pub use signature::EthereumSignature;
10
11#[cfg(test)]
12mod tests {
13    use super::*;
14
15    #[tokio::test]
16    async fn test_random_wallet_generation() {
17        let wallet = Wallet::new();
18        println!("Private Key: {}", wallet.privkey);
19        println!("Compressed Public Key: {}", wallet.pubkey_compressed);
20        println!("Uncompressed Public Key: {}", wallet.pubkey_uncompressed);
21        println!("Ethereum Address: {}", wallet.address);
22    }
23
24    #[tokio::test]
25    async fn test_wallet_from_private_key() {
26        let wallet = Wallet::from_private_key(Some("0x1b5667a5972dba94b9baf4026288e4b51fdbc0c9c896473d394b78c5bd2ee92e"))
27            .unwrap_or_else(|e| panic!("Failed to create wallet: {}", e));
28        println!("Private Key: {}", wallet.privkey);
29        println!("Compressed Public Key: {}", wallet.pubkey_compressed);
30        println!("Uncompressed Public Key: {}", wallet.pubkey_uncompressed);
31        println!("Ethereum Address: {}", wallet.address);
32    }
33
34    #[tokio::test]
35    async fn test_wallet_from_private_key_invalid() {
36        match Wallet::from_private_key(Some("0x1b5667a5972dba94b9baf4026288e4b51fdbc0c9c896473d394b78c5bd2ee92")) {
37            Ok(wallet) => {
38                println!("Private Key: {}", wallet.privkey);
39                println!("Compressed Public Key: {}", wallet.pubkey_compressed);
40                println!("Uncompressed Public Key: {}", wallet.pubkey_uncompressed);
41                println!("Ethereum Address: {}", wallet.address);
42            },
43            Err(e) => {
44                println!("Expected error occurred: {}", e);
45                assert!(e.contains("Invalid private key"), "Error message should indicate invalid private key");
46            }
47        }
48    }
49
50    #[tokio::test]
51    async fn test_sign_message() {
52        let wallet = Wallet::new();
53        let message = "Hello, world!";
54        let signature = wallet.sign_message(message).await.unwrap_or_else(|e| panic!("Failed to sign message: {}", e));
55        
56        // Parse the signature JSON string
57        let sig_json: serde_json::Value = serde_json::from_str(&signature).unwrap_or_else(|e| panic!("Failed to parse signature JSON: {}", e));
58        println!("Signature JSON: {}", serde_json::to_string_pretty(&sig_json).unwrap_or_else(|e| panic!("Failed to format JSON: {}", e)));
59        
60        // Verify the signature contains all expected fields
61        assert!(sig_json.get("address").is_some());
62        assert!(sig_json.get("signed_message").is_some());
63        assert!(sig_json.get("signature").is_some());
64    }
65
66    
67
68    #[tokio::test]
69    async fn test_check_signature_is_valid() {
70        let wallet = Wallet::new();
71        let message = "Hello, world!";
72        let signature_json = wallet.sign_message(&message).await.unwrap_or_else(|e| panic!("Failed to sign message: {}", e));
73        
74        // Parse the signature JSON to extract the components
75        let sig_json: serde_json::Value = serde_json::from_str(&signature_json).unwrap_or_else(|e| panic!("Failed to parse signature JSON: {}", e));
76        let address = sig_json["address"].as_str().unwrap().to_string();
77        let signed_message = sig_json["signed_message"].as_str().unwrap().to_string();
78        let signature = sig_json["signature"].as_str().unwrap().to_string();
79
80        println!("Address: {}", address);
81        println!("Signed Message: {}", signed_message);
82        println!("Signature: {}", signature);
83
84        let eth_signature = EthereumSignature::new(address, signed_message, signature);
85        let is_valid = eth_signature.verify().unwrap_or_else(|e| panic!("Failed to verify signature: {}", e));
86        println!("Signature is valid: {}", is_valid);
87        assert!(is_valid, "Signature verification failed");
88    }
89    #[tokio::test]
90    async fn test_encrypt_and_decrypt_message() {
91        let sender = Wallet::from_private_key(Some("0x1f87cca105d954f1ae230f6ccdf8ea2c7df5eec8bb5d6c706344b42b725bd07d"))
92            .unwrap_or_else(|e| panic!("Failed to create sender wallet: {}", e));
93        let receiver = Wallet::from_private_key(Some("0xa4df62cbf0d00a76c6bceb5c6606823b8f4edb69c8b68607621dcc0a2e87a766"))
94            .unwrap_or_else(|e| panic!("Failed to create receiver wallet: {}", e));
95        let message = "message from d07d to a4df: hello friend...ggagagag.?";
96        let encrypted_message = sender.encrypt_message(message, &receiver.pubkey_compressed).unwrap_or_else(|e| panic!("Failed to encrypt message: {}", e));
97        println!("Encrypted Message from sender(d07d) to receiver(a4df): {}", encrypted_message);
98        println!("Length of encrypted message: {}", encrypted_message.len());
99        let decrypted_message = receiver.decrypt_message(&encrypted_message).unwrap_or_else(|e| panic!("Failed to decrypt message: {}", e));
100        println!("Decrypted Message from receiver(a4df) to sender(d07d): {}", decrypted_message);
101    }
102}