Skip to content

Commit

Permalink
Added checksum address encoder.
Browse files Browse the repository at this point in the history
  • Loading branch information
conor10 committed Feb 26, 2018
1 parent 3738e4e commit 8a0caa8
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 0 deletions.
26 changes: 26 additions & 0 deletions crypto/src/main/java/org/web3j/crypto/Keys.java
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,32 @@ public static byte[] getAddress(byte[] publicKey) {
return Arrays.copyOfRange(hash, hash.length - 20, hash.length); // right most 160 bits
}

/**
* Checksum address encoding as per
* <a href="https://github.com/ethereum/EIPs/blob/master/EIPS/eip-55.md">EIP-55</a>.
*
* @param address a valid hex encoded address
* @return hex encoded checksum address
*/
public static String toChecksumAddress(String address) {
String lowercaseAddress = Numeric.cleanHexPrefix(address).toLowerCase();
String addressHash = Numeric.cleanHexPrefix(Hash.sha3String(lowercaseAddress));

StringBuilder result = new StringBuilder(lowercaseAddress.length() + 2);

result.append("0x");

for (int i = 0; i < lowercaseAddress.length(); i++) {
if (Integer.parseInt(String.valueOf(addressHash.charAt(i)), 16) >= 8) {
result.append(String.valueOf(lowercaseAddress.charAt(i)).toUpperCase());
} else {
result.append(lowercaseAddress.charAt(i));
}
}

return result.toString();
}

public static byte[] serialize(ECKeyPair ecKeyPair) {
byte[] privateKey = Numeric.toBytesPadded(ecKeyPair.getPrivateKey(), PRIVATE_KEY_SIZE);
byte[] publicKey = Numeric.toBytesPadded(ecKeyPair.getPublicKey(), PUBLIC_KEY_SIZE);
Expand Down
30 changes: 30 additions & 0 deletions crypto/src/test/java/org/web3j/crypto/KeysTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,36 @@ public void testGetAddressZeroPadded() {
equalTo(expected));
}

@Test
public void testToChecksumAddress() {
// Test cases as per https://github.com/ethereum/EIPs/blob/master/EIPS/eip-55.md#test-cases

assertThat(Keys.toChecksumAddress("0xfb6916095ca1df60bb79ce92ce3ea74c37c5d359"),
is("0xfB6916095ca1df60bB79Ce92cE3Ea74c37c5d359"));

// All uppercase
assertThat(Keys.toChecksumAddress("0x52908400098527886E0F7030069857D2E4169EE7"),
is("0x52908400098527886E0F7030069857D2E4169EE7"));
assertThat(Keys.toChecksumAddress("0x8617E340B3D01FA5F11F306F4090FD50E238070D"),
is("0x8617E340B3D01FA5F11F306F4090FD50E238070D"));

// All lowercase
assertThat(Keys.toChecksumAddress("0xde709f2102306220921060314715629080e2fb77"),
is("0xde709f2102306220921060314715629080e2fb77"));
assertThat(Keys.toChecksumAddress("0x27b1fdb04752bbc536007a920d24acb045561c26"),
is("0x27b1fdb04752bbc536007a920d24acb045561c26"));

// Normal
assertThat(Keys.toChecksumAddress("0x5aAeb6053F3E94C9b9A09f33669435E7Ef1BeAed"),
is("0x5aAeb6053F3E94C9b9A09f33669435E7Ef1BeAed"));
assertThat(Keys.toChecksumAddress("0xfB6916095ca1df60bB79Ce92cE3Ea74c37c5d359"),
is("0xfB6916095ca1df60bB79Ce92cE3Ea74c37c5d359"));
assertThat(Keys.toChecksumAddress("0xdbF03B407c01E7cD3CBea99509d93f8DDDC8C6FB"),
is("0xdbF03B407c01E7cD3CBea99509d93f8DDDC8C6FB"));
assertThat(Keys.toChecksumAddress("0xD1220A0cf47c7B9Be7A2E6BA89F429762e7b9aDb"),
is("0xD1220A0cf47c7B9Be7A2E6BA89F429762e7b9aDb"));
}

@Test
public void testSerializeECKey() {
assertThat(Keys.serialize(SampleKeys.KEY_PAIR), is(ENCODED));
Expand Down

0 comments on commit 8a0caa8

Please sign in to comment.