diff --git a/CHANGELOG.md b/CHANGELOG.md index 05f2b382..a371a714 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,8 +10,10 @@ and this project adheres to - @cosmjs/stargate: Fix valid values of `BondStatusString` for `validators` query ([#1170]). +- @cosmjs/tendermint-rpc: Fix decoding validator updates due to slashing ([#1177]). [#1170]: https://github.com/cosmos/cosmjs/issues/1170 +[#1177]: https://github.com/cosmos/cosmjs/issues/1177 ### Changed diff --git a/packages/tendermint-rpc/src/tendermint34/adaptor/responses.spec.ts b/packages/tendermint-rpc/src/tendermint34/adaptor/responses.spec.ts index 04bdd6ee..2999791d 100644 --- a/packages/tendermint-rpc/src/tendermint34/adaptor/responses.spec.ts +++ b/packages/tendermint-rpc/src/tendermint34/adaptor/responses.spec.ts @@ -49,6 +49,26 @@ describe("Adaptor Responses", () => { votingPower: 11418237, }); }); + + it("works for block results format without voting power", () => { + // from https://rpc.cosmos.network/block_results?height=10883046 + const update = decodeValidatorUpdate({ + pub_key: { + Sum: { + type: "tendermint.crypto.PublicKey_Ed25519", + value: { + ed25519: "HjSC7VkhKih6xMhudlqfaFE8ZZnP8RKJPv4iqR7RhcE=" + } + } + } + }); + expect(update).toEqual({ + pubkey: { + algorithm: "ed25519", + data: fromBase64("HjSC7VkhKih6xMhudlqfaFE8ZZnP8RKJPv4iqR7RhcE="), + }, + }); + }); }); describe("decodeValidatorInfo", () => { diff --git a/packages/tendermint-rpc/src/tendermint34/adaptor/responses.ts b/packages/tendermint-rpc/src/tendermint34/adaptor/responses.ts index d76fbce2..9413696a 100644 --- a/packages/tendermint-rpc/src/tendermint34/adaptor/responses.ts +++ b/packages/tendermint-rpc/src/tendermint34/adaptor/responses.ts @@ -257,13 +257,13 @@ function decodeConsensusParams(data: RpcConsensusParams): responses.ConsensusPar // for block results interface RpcValidatorUpdate { readonly pub_key: RpcPubkey; - readonly power: string; + readonly power?: string; } export function decodeValidatorUpdate(data: RpcValidatorUpdate): responses.ValidatorUpdate { return { pubkey: decodePubkey(assertObject(data.pub_key)), - votingPower: Integer.parse(assertNotEmpty(data.power)), + votingPower: data.power ? Integer.parse(data.power) : undefined, }; } diff --git a/packages/tendermint-rpc/src/tendermint34/responses.ts b/packages/tendermint-rpc/src/tendermint34/responses.ts index c9d1ec41..3ae52527 100644 --- a/packages/tendermint-rpc/src/tendermint34/responses.ts +++ b/packages/tendermint-rpc/src/tendermint34/responses.ts @@ -356,7 +356,7 @@ export interface Validator { export interface ValidatorUpdate { readonly pubkey: ValidatorPubkey; - readonly votingPower: number; + readonly votingPower?: number; } export interface ConsensusParams { diff --git a/packages/tendermint-rpc/src/tendermint35/adaptor/responses.spec.ts b/packages/tendermint-rpc/src/tendermint35/adaptor/responses.spec.ts index 04bdd6ee..2999791d 100644 --- a/packages/tendermint-rpc/src/tendermint35/adaptor/responses.spec.ts +++ b/packages/tendermint-rpc/src/tendermint35/adaptor/responses.spec.ts @@ -49,6 +49,26 @@ describe("Adaptor Responses", () => { votingPower: 11418237, }); }); + + it("works for block results format without voting power", () => { + // from https://rpc.cosmos.network/block_results?height=10883046 + const update = decodeValidatorUpdate({ + pub_key: { + Sum: { + type: "tendermint.crypto.PublicKey_Ed25519", + value: { + ed25519: "HjSC7VkhKih6xMhudlqfaFE8ZZnP8RKJPv4iqR7RhcE=" + } + } + } + }); + expect(update).toEqual({ + pubkey: { + algorithm: "ed25519", + data: fromBase64("HjSC7VkhKih6xMhudlqfaFE8ZZnP8RKJPv4iqR7RhcE="), + }, + }); + }); }); describe("decodeValidatorInfo", () => { diff --git a/packages/tendermint-rpc/src/tendermint35/adaptor/responses.ts b/packages/tendermint-rpc/src/tendermint35/adaptor/responses.ts index 6fa99446..90b2db0b 100644 --- a/packages/tendermint-rpc/src/tendermint35/adaptor/responses.ts +++ b/packages/tendermint-rpc/src/tendermint35/adaptor/responses.ts @@ -259,13 +259,13 @@ function decodeConsensusParams(data: RpcConsensusParams): responses.ConsensusPar // for block results interface RpcValidatorUpdate { readonly pub_key: RpcPubkey; - readonly power: string; + readonly power?: string; } export function decodeValidatorUpdate(data: RpcValidatorUpdate): responses.ValidatorUpdate { return { pubkey: decodePubkey(assertObject(data.pub_key)), - votingPower: Integer.parse(assertNotEmpty(data.power)), + votingPower: data.power ? Integer.parse(data.power) : undefined, }; } diff --git a/packages/tendermint-rpc/src/tendermint35/responses.ts b/packages/tendermint-rpc/src/tendermint35/responses.ts index d1e9f5a8..be2eecca 100644 --- a/packages/tendermint-rpc/src/tendermint35/responses.ts +++ b/packages/tendermint-rpc/src/tendermint35/responses.ts @@ -361,7 +361,7 @@ export interface Validator { export interface ValidatorUpdate { readonly pubkey: ValidatorPubkey; - readonly votingPower: number; + readonly votingPower?: number; } export interface ConsensusParams {