From 484fdc2fd02116af084f840b9c0182834c40f8e7 Mon Sep 17 00:00:00 2001 From: willclarktech Date: Wed, 10 Feb 2021 18:02:23 +0000 Subject: [PATCH 1/4] tendermint-rpc: Enable all params in validators query --- .../tendermint-rpc/src/adaptors/v0-33/requests.ts | 15 ++++++++++++++- packages/tendermint-rpc/src/client.spec.ts | 2 +- packages/tendermint-rpc/src/client.ts | 4 ++-- packages/tendermint-rpc/src/index.ts | 1 + packages/tendermint-rpc/src/requests.ts | 10 +++++++--- 5 files changed, 25 insertions(+), 7 deletions(-) diff --git a/packages/tendermint-rpc/src/adaptors/v0-33/requests.ts b/packages/tendermint-rpc/src/adaptors/v0-33/requests.ts index c5d8a7ac..0ec03de3 100644 --- a/packages/tendermint-rpc/src/adaptors/v0-33/requests.ts +++ b/packages/tendermint-rpc/src/adaptors/v0-33/requests.ts @@ -84,6 +84,19 @@ function encodeTxSearchParams(params: requests.TxSearchParams): RpcTxSearchParam }; } +interface RpcValidatorsParams { + readonly height?: string; + readonly page?: string; + readonly per_page?: string; +} +function encodeValidatorsParams(params: requests.ValidatorsParams): RpcValidatorsParams { + return { + height: may(Integer.encode, params.height), + page: may(Integer.encode, params.page), + per_page: may(Integer.encode, params.per_page), + }; +} + export class Params { public static encodeAbciInfo(req: requests.AbciInfoRequest): JsonRpcRequest { return createJsonRpcRequest(req.method); @@ -141,6 +154,6 @@ export class Params { } public static encodeValidators(req: requests.ValidatorsRequest): JsonRpcRequest { - return createJsonRpcRequest(req.method, encodeHeightParam(req.params)); + return createJsonRpcRequest(req.method, encodeValidatorsParams(req.params)); } } diff --git a/packages/tendermint-rpc/src/client.spec.ts b/packages/tendermint-rpc/src/client.spec.ts index 0cc81bff..39240f36 100644 --- a/packages/tendermint-rpc/src/client.spec.ts +++ b/packages/tendermint-rpc/src/client.spec.ts @@ -133,7 +133,7 @@ function defaultTestSuite(rpcFactory: () => RpcClient, adaptor: Adaptor, expecte it("can get validators", async () => { pendingWithoutTendermint(); const client = await Client.create(rpcFactory(), adaptor); - const response = await client.validators(); + const response = await client.validators({}); expect(response).toBeTruthy(); expect(response.blockHeight).toBeGreaterThanOrEqual(1); diff --git a/packages/tendermint-rpc/src/client.ts b/packages/tendermint-rpc/src/client.ts index 9df10731..a9519114 100644 --- a/packages/tendermint-rpc/src/client.ts +++ b/packages/tendermint-rpc/src/client.ts @@ -248,10 +248,10 @@ export class Client { }; } - public async validators(height?: number): Promise { + public async validators(params: requests.ValidatorsParams): Promise { const query: requests.ValidatorsRequest = { method: requests.Method.Validators, - params: { height: height }, + params: params, }; return this.doCall(query, this.p.encodeValidators, this.r.decodeValidators); } diff --git a/packages/tendermint-rpc/src/index.ts b/packages/tendermint-rpc/src/index.ts index 1d762ea2..6b87b4e2 100644 --- a/packages/tendermint-rpc/src/index.ts +++ b/packages/tendermint-rpc/src/index.ts @@ -31,6 +31,7 @@ export { TxSearchParams, TxSearchRequest, ValidatorsRequest, + ValidatorsParams, } from "./requests"; export { AbciInfoResponse, diff --git a/packages/tendermint-rpc/src/requests.ts b/packages/tendermint-rpc/src/requests.ts index b4c7e8f4..d985b8e6 100644 --- a/packages/tendermint-rpc/src/requests.ts +++ b/packages/tendermint-rpc/src/requests.ts @@ -161,9 +161,13 @@ export interface TxSearchParams { export interface ValidatorsRequest { readonly method: Method.Validators; - readonly params: { - readonly height?: number; - }; + readonly params: ValidatorsParams; +} + +export interface ValidatorsParams { + readonly height?: number; + readonly page?: number; + readonly per_page?: number; } export interface BuildQueryComponents { From c5adeace6d90cc21aa13c56f04fc31e9a42e6e46 Mon Sep 17 00:00:00 2001 From: willclarktech Date: Wed, 10 Feb 2021 18:09:46 +0000 Subject: [PATCH 2/4] tendermint-rpc: Add validatorsAll query --- packages/tendermint-rpc/src/client.spec.ts | 18 +++++++++++++ packages/tendermint-rpc/src/client.ts | 30 ++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/packages/tendermint-rpc/src/client.spec.ts b/packages/tendermint-rpc/src/client.spec.ts index 39240f36..5eef03cf 100644 --- a/packages/tendermint-rpc/src/client.spec.ts +++ b/packages/tendermint-rpc/src/client.spec.ts @@ -148,6 +148,24 @@ function defaultTestSuite(rpcFactory: () => RpcClient, adaptor: Adaptor, expecte client.disconnect(); }); + it("can get all validators", async () => { + pendingWithoutTendermint(); + const client = await Client.create(rpcFactory(), adaptor); + const response = await client.validatorsAll({}); + + expect(response).toBeTruthy(); + expect(response.blockHeight).toBeGreaterThanOrEqual(1); + expect(response.count).toBeGreaterThanOrEqual(1); + expect(response.total).toBeGreaterThanOrEqual(1); + expect(response.validators.length).toBeGreaterThanOrEqual(1); + expect(response.validators[0].address.length).toEqual(20); + expect(response.validators[0].pubkey).toBeDefined(); + expect(response.validators[0].votingPower).toBeGreaterThanOrEqual(0); + expect(response.validators[0].proposerPriority).toBeGreaterThanOrEqual(0); + + client.disconnect(); + }); + it("can call a bunch of methods", async () => { pendingWithoutTendermint(); const client = await Client.create(rpcFactory(), adaptor); diff --git a/packages/tendermint-rpc/src/client.ts b/packages/tendermint-rpc/src/client.ts index a9519114..1367dd41 100644 --- a/packages/tendermint-rpc/src/client.ts +++ b/packages/tendermint-rpc/src/client.ts @@ -1,3 +1,4 @@ +/* eslint-disable @typescript-eslint/naming-convention */ import { Stream } from "xstream"; import { Adaptor, Decoder, Encoder, Params, Responses } from "./adaptor"; @@ -256,6 +257,35 @@ export class Client { return this.doCall(query, this.p.encodeValidators, this.r.decodeValidators); } + public async validatorsAll(params: requests.ValidatorsParams): Promise { + let page = params.page || 1; + const validators: responses.Validator[] = []; + let done = false; + let blockHeight = 0; + + while (!done) { + const resp = await this.validators({ + per_page: 50, + ...params, + page: page, + }); + validators.push(...resp.validators); + blockHeight = resp.blockHeight; + if (validators.length < resp.total) { + page++; + } else { + done = true; + } + } + + return { + blockHeight: blockHeight, + count: validators.length, + total: validators.length, + validators: validators, + }; + } + // doCall is a helper to handle the encode/call/decode logic private async doCall( request: T, From 397d17d4c55b13610b6569e1b9b4a6f8b3d39ad3 Mon Sep 17 00:00:00 2001 From: willclarktech Date: Tue, 16 Feb 2021 12:17:51 +0000 Subject: [PATCH 3/4] tendermint-rpc: Set height in validatorsAll query --- packages/tendermint-rpc/src/client.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/tendermint-rpc/src/client.ts b/packages/tendermint-rpc/src/client.ts index 1367dd41..299d4960 100644 --- a/packages/tendermint-rpc/src/client.ts +++ b/packages/tendermint-rpc/src/client.ts @@ -260,13 +260,17 @@ export class Client { public async validatorsAll(params: requests.ValidatorsParams): Promise { let page = params.page || 1; const validators: responses.Validator[] = []; + const baseParams = { + per_page: 50, + height: params.height ?? (await this.status()).syncInfo.latestBlockHeight, + ...params, + }; let done = false; let blockHeight = 0; while (!done) { const resp = await this.validators({ - per_page: 50, - ...params, + ...baseParams, page: page, }); validators.push(...resp.validators); From 3e41b9ce048ca6c3dcda498e61de18658e25c445 Mon Sep 17 00:00:00 2001 From: willclarktech Date: Thu, 18 Feb 2021 10:43:03 +0000 Subject: [PATCH 4/4] tendermint-rpc: Update validatorsAll for review --- packages/tendermint-rpc/src/client.spec.ts | 2 +- packages/tendermint-rpc/src/client.ts | 25 ++++++++++------------ 2 files changed, 12 insertions(+), 15 deletions(-) diff --git a/packages/tendermint-rpc/src/client.spec.ts b/packages/tendermint-rpc/src/client.spec.ts index 5eef03cf..c9b523ea 100644 --- a/packages/tendermint-rpc/src/client.spec.ts +++ b/packages/tendermint-rpc/src/client.spec.ts @@ -151,7 +151,7 @@ function defaultTestSuite(rpcFactory: () => RpcClient, adaptor: Adaptor, expecte it("can get all validators", async () => { pendingWithoutTendermint(); const client = await Client.create(rpcFactory(), adaptor); - const response = await client.validatorsAll({}); + const response = await client.validatorsAll(); expect(response).toBeTruthy(); expect(response.blockHeight).toBeGreaterThanOrEqual(1); diff --git a/packages/tendermint-rpc/src/client.ts b/packages/tendermint-rpc/src/client.ts index 299d4960..945db730 100644 --- a/packages/tendermint-rpc/src/client.ts +++ b/packages/tendermint-rpc/src/client.ts @@ -257,25 +257,21 @@ export class Client { return this.doCall(query, this.p.encodeValidators, this.r.decodeValidators); } - public async validatorsAll(params: requests.ValidatorsParams): Promise { - let page = params.page || 1; + public async validatorsAll(height?: number): Promise { const validators: responses.Validator[] = []; - const baseParams = { - per_page: 50, - height: params.height ?? (await this.status()).syncInfo.latestBlockHeight, - ...params, - }; + let page = 1; let done = false; - let blockHeight = 0; + let blockHeight = height; while (!done) { - const resp = await this.validators({ - ...baseParams, + const response = await this.validators({ + per_page: 50, + height: blockHeight, page: page, }); - validators.push(...resp.validators); - blockHeight = resp.blockHeight; - if (validators.length < resp.total) { + validators.push(...response.validators); + blockHeight = blockHeight || response.blockHeight; + if (validators.length < response.total) { page++; } else { done = true; @@ -283,7 +279,8 @@ export class Client { } return { - blockHeight: blockHeight, + // NOTE: Default value is for type safety but this should always be set + blockHeight: blockHeight ?? 0, count: validators.length, total: validators.length, validators: validators,