diff --git a/packages/status-js/src/utils/private-key-to-address.test.ts b/packages/status-js/src/utils/private-key-to-address.test.ts new file mode 100644 index 00000000..b5ffab4e --- /dev/null +++ b/packages/status-js/src/utils/private-key-to-address.test.ts @@ -0,0 +1,10 @@ +import { privateKeyToAddress } from './private-key-to-address' + +describe('privateKeyToAddress', () => { + it('should return public address', () => { + const privateKey = + '0x348ce564d427a3311b6536bbcff9390d69395b06ed6c486954e971d960fe8709' + const address = privateKeyToAddress(privateKey) + expect(address).toEqual('0xb8CE9ab6943e0eCED004cDe8e3bBed6568B2Fa01') + }) +}) diff --git a/packages/status-js/src/utils/private-key-to-address.ts b/packages/status-js/src/utils/private-key-to-address.ts new file mode 100644 index 00000000..e32f7802 --- /dev/null +++ b/packages/status-js/src/utils/private-key-to-address.ts @@ -0,0 +1,13 @@ +import { keccak256 } from 'ethereum-cryptography/keccak' +import { getPublicKey } from 'ethereum-cryptography/secp256k1' +import { bytesToHex } from 'ethereum-cryptography/utils' + +export function privateKeyToAddress(privateKey: string): string { + const publicKey = getPublicKey(privateKey) + const publicKeyWithoutPrefix = publicKey.slice(1) // uncompressed public key has 04 prefix + const hash = keccak256(publicKeyWithoutPrefix) + const address = bytesToHex(hash.slice(12)) + + // TODO: add checksum + return address +}