From ae820763d97f38b85ec48b577313e4d395251c28 Mon Sep 17 00:00:00 2001 From: blorgon1 <102304575+blorgon1@users.noreply.github.com> Date: Wed, 15 Jun 2022 11:45:15 -0400 Subject: [PATCH] fix: decoding validator update from slashing --- CHANGELOG.md | 2 ++ .../tendermint34/adaptor/responses.spec.ts | 20 +++++++++++++++++++ .../src/tendermint34/adaptor/responses.ts | 4 ++-- .../src/tendermint34/responses.ts | 2 +- .../tendermint35/adaptor/responses.spec.ts | 20 +++++++++++++++++++ .../src/tendermint35/adaptor/responses.ts | 4 ++-- .../src/tendermint35/responses.ts | 2 +- 7 files changed, 48 insertions(+), 6 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 05f2b382ec..a371a7143b 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 04bdd6ee5f..2999791d4a 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 d76fbce23b..9413696a63 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 c9d1ec41ac..3ae525272e 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 04bdd6ee5f..2999791d4a 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 6fa994466e..90b2db0b87 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 d1e9f5a8e2..be2eecca08 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 {