From 18660b6ad4ee6fbd64d0d8bc13541527fb8932e1 Mon Sep 17 00:00:00 2001 From: legobt <6wbvkn0j@anonaddy.me> Date: Tue, 11 Jul 2023 03:44:43 +0000 Subject: [PATCH] feat: break out address checksum encoding to erc55EncodeAddress function --- src/hex.ts | 37 +++++++++++++++++++++---------------- 1 file changed, 21 insertions(+), 16 deletions(-) diff --git a/src/hex.ts b/src/hex.ts index cbd3bfdab..5022410d7 100644 --- a/src/hex.ts +++ b/src/hex.ts @@ -79,6 +79,26 @@ export function isValidHexAddress(possibleAddress: Hex) { ); } +/** + * Encodes a passed hex string as an ERC-55 mixed-case checksum address. + * Specification: https://eips.ethereum.org/EIPS/eip-55. + * + * @param address - The hex address to encode. + * @returns The address encoded according to ERC-55. + */ +export function erc55EncodeAddress(address: Hex) { + const unPrefixed = remove0x(address.toLowerCase()); + const unPrefixedHash = remove0x(bytesToHex(keccak256(unPrefixed))); + return `0x${unPrefixed + .split('') + .map((character, nibbleIndex) => + parseInt(unPrefixedHash[nibbleIndex] as string, 16) > 7 + ? character.toUpperCase() + : character, + ) + .join('')}`; +} + /** * Validate that the passed hex string is a valid ERC-55 mixed-case * checksum address. @@ -91,22 +111,7 @@ export function isValidChecksumAddress(possibleChecksum: Hex) { return false; } - const unPrefixed = remove0x(possibleChecksum); - const unPrefixedHash = remove0x( - bytesToHex(keccak256(unPrefixed.toLowerCase())), - ); - - for (let i = 0; i < unPrefixedHash.length; i++) { - const value = parseInt(unPrefixedHash[i] as string, 16); - if ( - (value > 7 && unPrefixed[i]?.toUpperCase() !== unPrefixed[i]) || - (value <= 7 && unPrefixed[i]?.toLowerCase() !== unPrefixed[i]) - ) { - return false; - } - } - - return true; + return erc55EncodeAddress(possibleChecksum) === possibleChecksum; } /**