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 1/4] 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 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 { From 296e2178de65068e3277633e27b7969cd1cd462c Mon Sep 17 00:00:00 2001 From: blorgon1 <102304575+blorgon1@users.noreply.github.com> Date: Wed, 15 Jun 2022 11:53:11 -0400 Subject: [PATCH 2/4] fix: lint --- .../src/tendermint34/adaptor/responses.spec.ts | 8 ++++---- .../src/tendermint35/adaptor/responses.spec.ts | 8 ++++---- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/packages/tendermint-rpc/src/tendermint34/adaptor/responses.spec.ts b/packages/tendermint-rpc/src/tendermint34/adaptor/responses.spec.ts index 2999791d..558bbc3f 100644 --- a/packages/tendermint-rpc/src/tendermint34/adaptor/responses.spec.ts +++ b/packages/tendermint-rpc/src/tendermint34/adaptor/responses.spec.ts @@ -57,10 +57,10 @@ describe("Adaptor Responses", () => { Sum: { type: "tendermint.crypto.PublicKey_Ed25519", value: { - ed25519: "HjSC7VkhKih6xMhudlqfaFE8ZZnP8RKJPv4iqR7RhcE=" - } - } - } + ed25519: "HjSC7VkhKih6xMhudlqfaFE8ZZnP8RKJPv4iqR7RhcE=", + }, + }, + }, }); expect(update).toEqual({ pubkey: { diff --git a/packages/tendermint-rpc/src/tendermint35/adaptor/responses.spec.ts b/packages/tendermint-rpc/src/tendermint35/adaptor/responses.spec.ts index 2999791d..558bbc3f 100644 --- a/packages/tendermint-rpc/src/tendermint35/adaptor/responses.spec.ts +++ b/packages/tendermint-rpc/src/tendermint35/adaptor/responses.spec.ts @@ -57,10 +57,10 @@ describe("Adaptor Responses", () => { Sum: { type: "tendermint.crypto.PublicKey_Ed25519", value: { - ed25519: "HjSC7VkhKih6xMhudlqfaFE8ZZnP8RKJPv4iqR7RhcE=" - } - } - } + ed25519: "HjSC7VkhKih6xMhudlqfaFE8ZZnP8RKJPv4iqR7RhcE=", + }, + }, + }, }); expect(update).toEqual({ pubkey: { From 145f2c65def8212aed2cc2a0521dc7618627e37b Mon Sep 17 00:00:00 2001 From: blorgon1 <102304575+blorgon1@users.noreply.github.com> Date: Wed, 15 Jun 2022 11:57:20 -0400 Subject: [PATCH 3/4] fix: voting power undefined test --- .../tendermint-rpc/src/tendermint34/adaptor/responses.spec.ts | 1 + .../tendermint-rpc/src/tendermint35/adaptor/responses.spec.ts | 1 + 2 files changed, 2 insertions(+) diff --git a/packages/tendermint-rpc/src/tendermint34/adaptor/responses.spec.ts b/packages/tendermint-rpc/src/tendermint34/adaptor/responses.spec.ts index 558bbc3f..9cb3d251 100644 --- a/packages/tendermint-rpc/src/tendermint34/adaptor/responses.spec.ts +++ b/packages/tendermint-rpc/src/tendermint34/adaptor/responses.spec.ts @@ -67,6 +67,7 @@ describe("Adaptor Responses", () => { algorithm: "ed25519", data: fromBase64("HjSC7VkhKih6xMhudlqfaFE8ZZnP8RKJPv4iqR7RhcE="), }, + votingPower: undefined, }); }); }); diff --git a/packages/tendermint-rpc/src/tendermint35/adaptor/responses.spec.ts b/packages/tendermint-rpc/src/tendermint35/adaptor/responses.spec.ts index 558bbc3f..9cb3d251 100644 --- a/packages/tendermint-rpc/src/tendermint35/adaptor/responses.spec.ts +++ b/packages/tendermint-rpc/src/tendermint35/adaptor/responses.spec.ts @@ -67,6 +67,7 @@ describe("Adaptor Responses", () => { algorithm: "ed25519", data: fromBase64("HjSC7VkhKih6xMhudlqfaFE8ZZnP8RKJPv4iqR7RhcE="), }, + votingPower: undefined, }); }); }); From 4397815d4cb80e79e19c18c3a9ed2f95ec8fda77 Mon Sep 17 00:00:00 2001 From: blorgon1 <102304575+blorgon1@users.noreply.github.com> Date: Mon, 20 Jun 2022 10:50:28 -0400 Subject: [PATCH 4/4] fix: validator update zero voting power repr --- .../tendermint-rpc/src/tendermint34/adaptor/responses.spec.ts | 2 +- packages/tendermint-rpc/src/tendermint34/adaptor/responses.ts | 3 ++- packages/tendermint-rpc/src/tendermint34/responses.ts | 2 +- .../tendermint-rpc/src/tendermint35/adaptor/responses.spec.ts | 2 +- packages/tendermint-rpc/src/tendermint35/adaptor/responses.ts | 3 ++- packages/tendermint-rpc/src/tendermint35/responses.ts | 2 +- 6 files changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/tendermint-rpc/src/tendermint34/adaptor/responses.spec.ts b/packages/tendermint-rpc/src/tendermint34/adaptor/responses.spec.ts index 9cb3d251..d00a3120 100644 --- a/packages/tendermint-rpc/src/tendermint34/adaptor/responses.spec.ts +++ b/packages/tendermint-rpc/src/tendermint34/adaptor/responses.spec.ts @@ -67,7 +67,7 @@ describe("Adaptor Responses", () => { algorithm: "ed25519", data: fromBase64("HjSC7VkhKih6xMhudlqfaFE8ZZnP8RKJPv4iqR7RhcE="), }, - votingPower: undefined, + votingPower: 0, }); }); }); diff --git a/packages/tendermint-rpc/src/tendermint34/adaptor/responses.ts b/packages/tendermint-rpc/src/tendermint34/adaptor/responses.ts index 9413696a..f4ac865f 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; + // 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: data.power ? Integer.parse(data.power) : undefined, + votingPower: Integer.parse(data.power ?? 0), }; } diff --git a/packages/tendermint-rpc/src/tendermint34/responses.ts b/packages/tendermint-rpc/src/tendermint34/responses.ts index 3ae52527..c9d1ec41 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 9cb3d251..d00a3120 100644 --- a/packages/tendermint-rpc/src/tendermint35/adaptor/responses.spec.ts +++ b/packages/tendermint-rpc/src/tendermint35/adaptor/responses.spec.ts @@ -67,7 +67,7 @@ describe("Adaptor Responses", () => { algorithm: "ed25519", data: fromBase64("HjSC7VkhKih6xMhudlqfaFE8ZZnP8RKJPv4iqR7RhcE="), }, - votingPower: undefined, + votingPower: 0, }); }); }); diff --git a/packages/tendermint-rpc/src/tendermint35/adaptor/responses.ts b/packages/tendermint-rpc/src/tendermint35/adaptor/responses.ts index 90b2db0b..3fd99ce3 100644 --- a/packages/tendermint-rpc/src/tendermint35/adaptor/responses.ts +++ b/packages/tendermint-rpc/src/tendermint35/adaptor/responses.ts @@ -259,13 +259,14 @@ function decodeConsensusParams(data: RpcConsensusParams): responses.ConsensusPar // for block results interface RpcValidatorUpdate { readonly pub_key: RpcPubkey; + // 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: data.power ? Integer.parse(data.power) : undefined, + votingPower: Integer.parse(data.power ?? 0), }; } diff --git a/packages/tendermint-rpc/src/tendermint35/responses.ts b/packages/tendermint-rpc/src/tendermint35/responses.ts index be2eecca..d1e9f5a8 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 {