diff --git a/CHANGELOG.md b/CHANGELOG.md index 7150347676..bc7cdf73e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,10 @@ and this project adheres to ## [Unreleased] +- @cosmjs/tendermint-rpc: Fix decoding validator updates due to slashing ([#1177]). + +[#1177]: https://github.com/cosmos/cosmjs/issues/1177 + ## [0.28.7] - 2022-06-14 ### Fixed diff --git a/packages/tendermint-rpc/src/tendermint34/adaptor/responses.spec.ts b/packages/tendermint-rpc/src/tendermint34/adaptor/responses.spec.ts index 04bdd6ee5f..d00a31209d 100644 --- a/packages/tendermint-rpc/src/tendermint34/adaptor/responses.spec.ts +++ b/packages/tendermint-rpc/src/tendermint34/adaptor/responses.spec.ts @@ -49,6 +49,27 @@ 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="), + }, + votingPower: 0, + }); + }); }); describe("decodeValidatorInfo", () => { diff --git a/packages/tendermint-rpc/src/tendermint34/adaptor/responses.ts b/packages/tendermint-rpc/src/tendermint34/adaptor/responses.ts index d76fbce23b..f4ac865fa3 100644 --- a/packages/tendermint-rpc/src/tendermint34/adaptor/responses.ts +++ b/packages/tendermint-rpc/src/tendermint34/adaptor/responses.ts @@ -257,13 +257,14 @@ function decodeConsensusParams(data: RpcConsensusParams): responses.ConsensusPar // for block results interface RpcValidatorUpdate { readonly pub_key: RpcPubkey; - readonly power: string; + // When omitted, this means zero (see https://github.com/cosmos/cosmjs/issues/1177#issuecomment-1160115080) + readonly power?: string; } export function decodeValidatorUpdate(data: RpcValidatorUpdate): responses.ValidatorUpdate { return { pubkey: decodePubkey(assertObject(data.pub_key)), - votingPower: Integer.parse(assertNotEmpty(data.power)), + votingPower: Integer.parse(data.power ?? 0), }; }