ether_link/
lib.rs

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