From cde4931f11c901849d126db54223f5397f512fb5 Mon Sep 17 00:00:00 2001 From: willclarktech Date: Tue, 6 Apr 2021 18:26:49 +0200 Subject: [PATCH] tendermint-rpc: Add address helpers --- packages/tendermint-rpc/src/addresses.ts | 33 ++++++++++++++++++++++++ packages/tendermint-rpc/src/index.ts | 6 +++++ 2 files changed, 39 insertions(+) create mode 100644 packages/tendermint-rpc/src/addresses.ts diff --git a/packages/tendermint-rpc/src/addresses.ts b/packages/tendermint-rpc/src/addresses.ts new file mode 100644 index 00000000..24c5d429 --- /dev/null +++ b/packages/tendermint-rpc/src/addresses.ts @@ -0,0 +1,33 @@ +import { ripemd160, sha256 } from "@cosmjs/crypto"; +import { toHex } from "@cosmjs/encoding"; + +export function rawEd25519PubkeyToRawAddress(pubkeyData: Uint8Array): Uint8Array { + if (pubkeyData.length !== 32) { + throw new Error(`Invalid Ed25519 pubkey length: ${pubkeyData.length}`); + } + return sha256(pubkeyData).slice(0, 20); +} + +export function rawSecp256k1PubkeyToRawAddress(pubkeyData: Uint8Array): Uint8Array { + if (pubkeyData.length !== 33) { + throw new Error(`Invalid Secp256k1 pubkey length (compressed): ${pubkeyData.length}`); + } + return ripemd160(sha256(pubkeyData)); +} + +// For secp256k1 this assumes we already have a compressed pubkey. +export function pubkeyToRawAddress(type: "ed25519" | "secp256k1", data: Uint8Array): Uint8Array { + switch (type) { + case "ed25519": + return rawEd25519PubkeyToRawAddress(data); + case "secp256k1": + return rawSecp256k1PubkeyToRawAddress(data); + default: + // Keep this case here to guard against new types being added but not handled + throw new Error(`Pubkey type ${type} not supported`); + } +} + +export function pubkeyToAddress(type: "ed25519" | "secp256k1", data: Uint8Array): string { + return toHex(pubkeyToRawAddress(type, data)).toUpperCase(); +} diff --git a/packages/tendermint-rpc/src/index.ts b/packages/tendermint-rpc/src/index.ts index 10c7e62e..1bcb3e6a 100644 --- a/packages/tendermint-rpc/src/index.ts +++ b/packages/tendermint-rpc/src/index.ts @@ -1,3 +1,9 @@ +export { + pubkeyToAddress, + pubkeyToRawAddress, + rawEd25519PubkeyToRawAddress, + rawSecp256k1PubkeyToRawAddress, +} from "./addresses"; export { adaptor33, adaptor34,