From 3525881b4feb51e661b399a1f8acf2db5cb9e617 Mon Sep 17 00:00:00 2001 From: orlowskilp Date: Sun, 27 Oct 2024 09:20:09 +0800 Subject: [PATCH] feat: Plugged in checksum verification --- src/evm_account/transaction.rs | 32 +++++++++++++++++++------------- 1 file changed, 19 insertions(+), 13 deletions(-) diff --git a/src/evm_account/transaction.rs b/src/evm_account/transaction.rs index 1a5d74a..bdcc7f1 100644 --- a/src/evm_account/transaction.rs +++ b/src/evm_account/transaction.rs @@ -167,7 +167,7 @@ where }) } -fn _compute_address_checksum(address: &str) -> Result { +fn compute_address_checksum(address: &str) -> Result { let address_ascii_lowercase = address.trim_start_matches(HEX_PREFIX).to_ascii_lowercase(); // Compute the hash of the address and represent it as a string of hex digits @@ -207,7 +207,7 @@ fn _compute_address_checksum(address: &str) -> Result { Ok(address_checksum) } -fn _validate_address_checksum(address: &str) -> bool { +fn validate_address_checksum(address: &str) -> bool { // If the address is all in lowercase, this means no checksum was applied and no validation is // needed. This is acceptable, however a warning should be logged. if address == address.to_ascii_lowercase() { @@ -215,7 +215,7 @@ fn _validate_address_checksum(address: &str) -> bool { } // Otherwise strict chgecksum validation is required. - match _compute_address_checksum(address) { + match compute_address_checksum(address) { Ok(checksum) => checksum == address, Err(_) => false, } @@ -227,7 +227,9 @@ where { let address_string = String::deserialize(deserializer)?; - // TODO: Perform checksum verification here + if !validate_address_checksum(&address_string) { + return Err(serde::de::Error::custom("Invalid address checksum")); + } hex_data_string_to_bytes(&address_string) .map_err(|error| { @@ -246,6 +248,10 @@ where { let address_string = String::deserialize(deserializer)?; + if !validate_address_checksum(&address_string) { + return Err(serde::de::Error::custom("Invalid address checksum")); + } + let address_bytes = hex_data_string_to_bytes(&address_string).map_err(|error| { serde::de::Error::custom(format!("Failed to deserialize address: {}", error)) })?; @@ -289,42 +295,42 @@ mod unit_tests { fn validate_recipient_address_test_1_succeed() { let input = TEST_ADDR_STR_1; - assert!(_validate_address_checksum(input)); + assert!(validate_address_checksum(input)); } #[test] fn validate_recipient_address_test_2_succeed() { let input = TEST_ADDR_STR_2; - assert!(_validate_address_checksum(input)); + assert!(validate_address_checksum(input)); } #[test] fn validate_recipient_address_test_3_succeed() { let input = TEST_ADDR_STR_3; - assert!(_validate_address_checksum(input)); + assert!(validate_address_checksum(input)); } #[test] fn validate_recipient_address_test_1_no_checksum_succeed() { let input = TEST_ADDR_STR_1.to_ascii_lowercase(); - assert!(_validate_address_checksum(&input)); + assert!(validate_address_checksum(&input)); } #[test] fn validate_recipient_address_test_2_no_checksum_succeed() { let input = TEST_ADDR_STR_2.to_ascii_lowercase(); - assert!(_validate_address_checksum(&input)); + assert!(validate_address_checksum(&input)); } #[test] fn validate_recipient_address_test_3_no_checksum_succeed() { let input = TEST_ADDR_STR_3.to_ascii_lowercase(); - assert!(_validate_address_checksum(&input)); + assert!(validate_address_checksum(&input)); } #[test] @@ -332,7 +338,7 @@ mod unit_tests { fn validate_recipient_address_test_1_fail() { let input = "0xA9d89186caA663C8Ef0352Fd1Db3596280625573"; - assert!(_validate_address_checksum(&input)); + assert!(validate_address_checksum(&input)); } #[test] @@ -340,7 +346,7 @@ mod unit_tests { fn validate_recipient_address_test_2_fail() { let input = "0x5aAeb6053F3E94c9b9A09F33669435E7Ef1BeAed"; - assert!(_validate_address_checksum(&input)); + assert!(validate_address_checksum(&input)); } #[test] @@ -348,6 +354,6 @@ mod unit_tests { fn validate_recipient_address_test_3_fail() { let input = "0xfb6916095CA1df60bB79Ce92cE3Ea74c37c5d359"; - assert!(_validate_address_checksum(&input)); + assert!(validate_address_checksum(&input)); } }