use evm_client::provider::Transaction; use evm_client::provider::{parse_signature_rs_v, get_balance}; use ethers_core::types::{Address, U256}; #[cfg(not(target_arch = "wasm32"))] mod native_tests { use super::*; use vault::{SessionManager, KeyType}; use tempfile::TempDir; use kvstore::native::NativeStore; use alloy_primitives::keccak256; #[tokio::test] async fn test_vault_sessionmanager_balance_for_new_keypair() { let tmp_dir = TempDir::new().expect("create temp dir"); let store = NativeStore::open(tmp_dir.path().to_str().unwrap()).expect("Failed to open native store"); let mut vault = vault::Vault::new(store.clone()); let keyspace = "testspace"; let password = b"testpass"; // 1. Create keyspace vault.create_keyspace(keyspace, password, None).await.expect("create keyspace"); // 2. Add secp256k1 keypair let key_id = vault.add_keypair(keyspace, password, Some(KeyType::Secp256k1), None).await.expect("add keypair"); // 3. Create SessionManager and unlock keyspace let mut session = SessionManager::new(vault); session.unlock_keyspace(keyspace, password).await.expect("unlock keyspace"); session.select_keyspace(keyspace).expect("select keyspace"); session.select_keypair(&key_id).expect("select keypair"); let kp = session.current_keypair().expect("current keypair"); // 4. Derive Ethereum address from public key (same as in evm_client) let pubkey = &kp.public_key; // Remove leading 0x04 if present (uncompressed SEC1) let pubkey = if pubkey.len() == 65 && pubkey[0] == 0x04 { &pubkey[1..] } else { pubkey.as_slice() }; let hash = keccak256(pubkey); let address = Address::from_slice(&hash[12..]); // 5. Query balance let url = "https://ethereum.blockpi.network/v1/rpc/public"; let balance = get_balance(url, address).await.expect("Failed to get balance"); assert_eq!(balance, ethers_core::types::U256::zero(), "New keypair should have zero balance"); } } use ethers_core::types::Bytes; #[test] fn test_rlp_encode_unsigned() { let tx = Transaction { nonce: U256::from(1), to: Address::zero(), value: U256::from(100), gas: U256::from(21000), gas_price: U256::from(1), data: Bytes::new(), chain_id: 1u64, }; let rlp = tx.rlp_encode_unsigned(); assert!(!rlp.is_empty()); } #[test] fn test_parse_signature_rs_v() { let mut sig = [0u8; 65]; sig[31] = 1; sig[63] = 2; sig[64] = 27; let (r, s, v) = parse_signature_rs_v(&sig, 1).unwrap(); assert_eq!(r, U256::from(1)); assert_eq!(s, U256::from(2)); assert_eq!(v, 27 + 1 * 2 + 8); } #[cfg(not(target_arch = "wasm32"))] #[tokio::test] async fn test_get_balance_real_address() { // Vitalik's address let address = "d8dA6BF26964aF9D7eEd9e03E53415D37aA96045"; let address = ethers_core::types::Address::from_slice(&hex::decode(address).unwrap()); let url = "https://ethereum.blockpi.network/v1/rpc/public"; let balance = get_balance(url, address).await.expect("Failed to get balance"); assert!(balance > ethers_core::types::U256::zero(), "Vitalik's balance should be greater than zero"); }