diff --git a/CHANGELOG.md b/CHANGELOG.md index ae235846..39be5e03 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -86,6 +86,7 @@ and this project adheres to `isMsgClearAdminEncodeObject` etc helpers. - @cosmjs/stargate: Add transfer queries codec, as well as transfer query methods to IBC query extension. +- @cosmjs/tendermint-rpc: Export `ValidatorSecp256k1Pubkey` interface. ### Changed @@ -152,6 +153,10 @@ and this project adheres to instead of a single `hdPath`. `DirectSecp256k1HdWallet.generate` now also accepts options via this interface. This adds support for multiple accounts from the same mnemonic to `DirectSecp256k1HdWallet`. +- @cosmjs/tendermint-rpc: `ValidatorPubkey` is now a union of + `ValidatorEd25519Pubkey` and the newly exported `ValidatorSecp256k1Pubkey` + interface. +- @cosmjs/tendermint-rpc: `decodePubkey` now supports secp256k1 public keys. ### Deprecated diff --git a/packages/tendermint-rpc/src/index.ts b/packages/tendermint-rpc/src/index.ts index 1bcb3e6a..5530c322 100644 --- a/packages/tendermint-rpc/src/index.ts +++ b/packages/tendermint-rpc/src/index.ts @@ -85,6 +85,12 @@ export { toSeconds, } from "./dates"; export { HttpClient, WebsocketClient } from "./rpcclients"; // TODO: Why do we export those outside of this package? -export { BlockIdFlag, CommitSignature, ValidatorEd25519Pubkey, ValidatorPubkey } from "./types"; +export { + BlockIdFlag, + CommitSignature, + ValidatorEd25519Pubkey, + ValidatorSecp256k1Pubkey, + ValidatorPubkey, +} from "./types"; export * as tendermint34 from "./tendermint34"; export { Tendermint34Client } from "./tendermint34"; diff --git a/packages/tendermint-rpc/src/legacy/adaptors/v0-33/responses.ts b/packages/tendermint-rpc/src/legacy/adaptors/v0-33/responses.ts index 9feb8c2e..381904e4 100644 --- a/packages/tendermint-rpc/src/legacy/adaptors/v0-33/responses.ts +++ b/packages/tendermint-rpc/src/legacy/adaptors/v0-33/responses.ts @@ -150,14 +150,21 @@ interface RpcPubkey { } function decodePubkey(data: RpcPubkey): ValidatorPubkey { - if (data.type === "tendermint/PubKeyEd25519") { + switch (data.type) { // go-amino special code - return { - algorithm: "ed25519", - data: fromBase64(assertNotEmpty(data.value)), - }; + case "tendermint/PubKeyEd25519": + return { + algorithm: "ed25519", + data: fromBase64(assertNotEmpty(data.value)), + }; + case "tendermint/PubKeySecp256k1": + return { + algorithm: "secp256k1", + data: fromBase64(assertNotEmpty(data.value)), + }; + default: + throw new Error(`unknown pubkey type: ${data.type}`); } - throw new Error(`unknown pubkey type: ${data.type}`); } // for evidence, block results, etc. diff --git a/packages/tendermint-rpc/src/tendermint34/adaptors/v0-34/responses.ts b/packages/tendermint-rpc/src/tendermint34/adaptors/v0-34/responses.ts index 84c2ea33..5386c7e1 100644 --- a/packages/tendermint-rpc/src/tendermint34/adaptors/v0-34/responses.ts +++ b/packages/tendermint-rpc/src/tendermint34/adaptors/v0-34/responses.ts @@ -156,14 +156,21 @@ interface RpcPubkey { } function decodePubkey(data: RpcPubkey): ValidatorPubkey { - if (data.type === "tendermint/PubKeyEd25519") { + switch (data.type) { // go-amino special code - return { - algorithm: "ed25519", - data: fromBase64(assertNotEmpty(data.value)), - }; + case "tendermint/PubKeyEd25519": + return { + algorithm: "ed25519", + data: fromBase64(assertNotEmpty(data.value)), + }; + case "tendermint/PubKeySecp256k1": + return { + algorithm: "secp256k1", + data: fromBase64(assertNotEmpty(data.value)), + }; + default: + throw new Error(`unknown pubkey type: ${data.type}`); } - throw new Error(`unknown pubkey type: ${data.type}`); } // for evidence, block results, etc. diff --git a/packages/tendermint-rpc/src/types.ts b/packages/tendermint-rpc/src/types.ts index ae0c74b0..faa5dcec 100644 --- a/packages/tendermint-rpc/src/types.ts +++ b/packages/tendermint-rpc/src/types.ts @@ -8,11 +8,15 @@ export interface ValidatorEd25519Pubkey { readonly data: Uint8Array; } +export interface ValidatorSecp256k1Pubkey { + readonly algorithm: "secp256k1"; + readonly data: Uint8Array; +} + /** * Union type for different possible pubkeys. - * Currently only Ed25519 supported. */ -export type ValidatorPubkey = ValidatorEd25519Pubkey; +export type ValidatorPubkey = ValidatorEd25519Pubkey | ValidatorSecp256k1Pubkey; export enum BlockIdFlag { Unknown = 0,