diff --git a/src/Utils.php b/src/Utils.php index 4f9b6ef..be80c9d 100644 --- a/src/Utils.php +++ b/src/Utils.php @@ -189,7 +189,7 @@ class Utils /** * isAddressChecksum - * + * * @param string $value * @return bool */ @@ -212,6 +212,31 @@ class Utils return true; } + /** + * toChecksumAddress + * + * @param string $value + * @return string + */ + public static function toChecksumAddress($value) + { + if (!is_string($value)) { + throw new InvalidArgumentException('The value to toChecksumAddress function must be string.'); + } + $value = self::stripZero(strtolower($value)); + $hash = self::stripZero(self::sha3($value)); + $ret = '0x'; + + for ($i = 0; $i < 40; $i++) { + if (intval($hash[$i], 16) >= 8) { + $ret .= strtoupper($value[$i]); + } else { + $ret .= $value[$i]; + } + } + return $ret; + } + /** * isHex * diff --git a/test/unit/UtilsTest.php b/test/unit/UtilsTest.php index 37302e5..fc6030d 100644 --- a/test/unit/UtilsTest.php +++ b/test/unit/UtilsTest.php @@ -249,7 +249,7 @@ class UtilsTest extends TestCase /** * testIsAddressChecksum - * + * * @return void */ public function testIsAddressChecksum() @@ -291,9 +291,36 @@ class UtilsTest extends TestCase $isAddressChecksum = Utils::isAddressChecksum(new stdClass); } + /** + * testToChecksumAddress + * + * @return void + */ + public function testToChecksumAddress() + { + $checksumAddressTest = [ + // All caps + '0x52908400098527886E0F7030069857D2E4169EE7', + '0x8617E340B3D01FA5F11F306F4090FD50E238070D', + // All Lower + '0xde709f2102306220921060314715629080e2fb77', + '0x27b1fdb04752bbc536007a920d24acb045561c26', + // Normal + '0x5aAeb6053F3E94C9b9A09f33669435E7Ef1BeAed', + '0xfB6916095ca1df60bB79Ce92cE3Ea74c37c5d359', + '0xdbF03B407c01E7cD3CBea99509d93f8DDDC8C6FB', + '0xD1220A0cf47c7B9Be7A2E6BA89F429762e7b9aDb' + ]; + + for ($i=0; $iassertEquals($checksumAddressTest[$i], $checksumAddress); + } + } + /** * testStripZero - * + * * @return void */ public function testStripZero()