From a808a8218c877185cc2c80511c70914bfcbc9b4e Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Thu, 2 Mar 2023 14:22:35 +0100 Subject: [PATCH] Add TendermintClient --- CHANGELOG.md | 5 +- .../cosmwasm-stargate/src/cosmwasmclient.ts | 17 ++++--- .../src/signingcosmwasmclient.ts | 4 +- .../stargate/src/queryclient/queryclient.ts | 46 +++++++++---------- .../stargate/src/signingstargateclient.ts | 4 +- packages/stargate/src/stargateclient.ts | 17 ++++--- packages/tendermint-rpc/src/index.ts | 1 + .../tendermint-rpc/src/tendermintclient.ts | 13 ++++++ 8 files changed, 67 insertions(+), 40 deletions(-) create mode 100644 packages/tendermint-rpc/src/tendermintclient.ts diff --git a/CHANGELOG.md b/CHANGELOG.md index c5d0b2f8..4b76adeb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -35,7 +35,10 @@ and this project adheres to - @cosmjs/stargate: Add `granteeGrants` and `granterGrants` queries to `AuthzExtension` ([#1308]). - @cosmjs/tendermint-rpc: Add new `Tendermint37Client` and remove unused - `Tendermint35Client` ([#1376]). + `Tendermint35Client`; Add `TendermintClient` as a union type for + `Tendermint34Client` or `Tendermint37Client` and + `isTendermint34Client`/`isTendermint37Client` to get the specific type + ([#1376]). [#1308]: https://github.com/cosmos/cosmjs/pull/1308 [#1376]: https://github.com/cosmos/cosmjs/pull/1376 diff --git a/packages/cosmwasm-stargate/src/cosmwasmclient.ts b/packages/cosmwasm-stargate/src/cosmwasmclient.ts index 158d3eab..866daf4f 100644 --- a/packages/cosmwasm-stargate/src/cosmwasmclient.ts +++ b/packages/cosmwasm-stargate/src/cosmwasmclient.ts @@ -25,7 +25,12 @@ import { TimeoutError, TxExtension, } from "@cosmjs/stargate"; -import { HttpEndpoint, Tendermint34Client, toRfc3339WithNanoseconds } from "@cosmjs/tendermint-rpc"; +import { + HttpEndpoint, + Tendermint34Client, + TendermintClient, + toRfc3339WithNanoseconds, +} from "@cosmjs/tendermint-rpc"; import { assert, sleep } from "@cosmjs/utils"; import { CodeInfoResponse, @@ -77,14 +82,14 @@ export interface ContractCodeHistoryEntry { /** Use for testing only */ export interface PrivateCosmWasmClient { - readonly tmClient: Tendermint34Client | undefined; + readonly tmClient: TendermintClient | undefined; readonly queryClient: | (QueryClient & AuthExtension & BankExtension & TxExtension & WasmExtension) | undefined; } export class CosmWasmClient { - private readonly tmClient: Tendermint34Client | undefined; + private readonly tmClient: TendermintClient | undefined; private readonly queryClient: | (QueryClient & AuthExtension & BankExtension & TxExtension & WasmExtension) | undefined; @@ -96,7 +101,7 @@ export class CosmWasmClient { return new CosmWasmClient(tmClient); } - protected constructor(tmClient: Tendermint34Client | undefined) { + protected constructor(tmClient: TendermintClient | undefined) { if (tmClient) { this.tmClient = tmClient; this.queryClient = QueryClient.withExtensions( @@ -109,11 +114,11 @@ export class CosmWasmClient { } } - protected getTmClient(): Tendermint34Client | undefined { + protected getTmClient(): TendermintClient | undefined { return this.tmClient; } - protected forceGetTmClient(): Tendermint34Client { + protected forceGetTmClient(): TendermintClient { if (!this.tmClient) { throw new Error( "Tendermint client not available. You cannot use online functionality in offline mode.", diff --git a/packages/cosmwasm-stargate/src/signingcosmwasmclient.ts b/packages/cosmwasm-stargate/src/signingcosmwasmclient.ts index 5d03812a..e3843404 100644 --- a/packages/cosmwasm-stargate/src/signingcosmwasmclient.ts +++ b/packages/cosmwasm-stargate/src/signingcosmwasmclient.ts @@ -31,7 +31,7 @@ import { SignerData, StdFee, } from "@cosmjs/stargate"; -import { HttpEndpoint, Tendermint34Client } from "@cosmjs/tendermint-rpc"; +import { HttpEndpoint, Tendermint34Client, TendermintClient } from "@cosmjs/tendermint-rpc"; import { assert, assertDefined } from "@cosmjs/utils"; import { MsgWithdrawDelegatorReward } from "cosmjs-types/cosmos/distribution/v1beta1/tx"; import { MsgDelegate, MsgUndelegate } from "cosmjs-types/cosmos/staking/v1beta1/tx"; @@ -209,7 +209,7 @@ export class SigningCosmWasmClient extends CosmWasmClient { } protected constructor( - tmClient: Tendermint34Client | undefined, + tmClient: TendermintClient | undefined, signer: OfflineSigner, options: SigningCosmWasmClientOptions, ) { diff --git a/packages/stargate/src/queryclient/queryclient.ts b/packages/stargate/src/queryclient/queryclient.ts index 66644433..aaa000a9 100644 --- a/packages/stargate/src/queryclient/queryclient.ts +++ b/packages/stargate/src/queryclient/queryclient.ts @@ -2,7 +2,7 @@ import { iavlSpec, ics23, tendermintSpec, verifyExistence, verifyNonExistence } from "@confio/ics23"; import { toAscii, toHex } from "@cosmjs/encoding"; import { firstEvent } from "@cosmjs/stream"; -import { tendermint34, Tendermint34Client } from "@cosmjs/tendermint-rpc"; +import { tendermint34, TendermintClient } from "@cosmjs/tendermint-rpc"; import { arrayContentEquals, assert, assertDefined, isNonNullObject, sleep } from "@cosmjs/utils"; import { ProofOps } from "cosmjs-types/tendermint/crypto/proof"; import { Stream } from "xstream"; @@ -45,24 +45,24 @@ export interface QueryAbciResponse { export class QueryClient { /** Constructs a QueryClient with 0 extensions */ - public static withExtensions(tmClient: Tendermint34Client): QueryClient; + public static withExtensions(tmClient: TendermintClient): QueryClient; /** Constructs a QueryClient with 1 extension */ public static withExtensions( - tmClient: Tendermint34Client, + tmClient: TendermintClient, setupExtensionA: QueryExtensionSetup, ): QueryClient & A; /** Constructs a QueryClient with 2 extensions */ public static withExtensions( - tmClient: Tendermint34Client, + tmClient: TendermintClient, setupExtensionA: QueryExtensionSetup, setupExtensionB: QueryExtensionSetup, ): QueryClient & A & B; /** Constructs a QueryClient with 3 extensions */ public static withExtensions( - tmClient: Tendermint34Client, + tmClient: TendermintClient, setupExtensionA: QueryExtensionSetup, setupExtensionB: QueryExtensionSetup, setupExtensionC: QueryExtensionSetup, @@ -70,7 +70,7 @@ export class QueryClient { /** Constructs a QueryClient with 4 extensions */ public static withExtensions( - tmClient: Tendermint34Client, + tmClient: TendermintClient, setupExtensionA: QueryExtensionSetup, setupExtensionB: QueryExtensionSetup, setupExtensionC: QueryExtensionSetup, @@ -85,7 +85,7 @@ export class QueryClient { D extends object, E extends object, >( - tmClient: Tendermint34Client, + tmClient: TendermintClient, setupExtensionA: QueryExtensionSetup, setupExtensionB: QueryExtensionSetup, setupExtensionC: QueryExtensionSetup, @@ -102,7 +102,7 @@ export class QueryClient { E extends object, F extends object, >( - tmClient: Tendermint34Client, + tmClient: TendermintClient, setupExtensionA: QueryExtensionSetup, setupExtensionB: QueryExtensionSetup, setupExtensionC: QueryExtensionSetup, @@ -121,7 +121,7 @@ export class QueryClient { F extends object, G extends object, >( - tmClient: Tendermint34Client, + tmClient: TendermintClient, setupExtensionA: QueryExtensionSetup, setupExtensionB: QueryExtensionSetup, setupExtensionC: QueryExtensionSetup, @@ -142,7 +142,7 @@ export class QueryClient { G extends object, H extends object, >( - tmClient: Tendermint34Client, + tmClient: TendermintClient, setupExtensionA: QueryExtensionSetup, setupExtensionB: QueryExtensionSetup, setupExtensionC: QueryExtensionSetup, @@ -165,7 +165,7 @@ export class QueryClient { H extends object, I extends object, >( - tmClient: Tendermint34Client, + tmClient: TendermintClient, setupExtensionA: QueryExtensionSetup, setupExtensionB: QueryExtensionSetup, setupExtensionC: QueryExtensionSetup, @@ -190,7 +190,7 @@ export class QueryClient { I extends object, J extends object, >( - tmClient: Tendermint34Client, + tmClient: TendermintClient, setupExtensionA: QueryExtensionSetup, setupExtensionB: QueryExtensionSetup, setupExtensionC: QueryExtensionSetup, @@ -217,7 +217,7 @@ export class QueryClient { J extends object, K extends object, >( - tmClient: Tendermint34Client, + tmClient: TendermintClient, setupExtensionA: QueryExtensionSetup, setupExtensionB: QueryExtensionSetup, setupExtensionC: QueryExtensionSetup, @@ -246,7 +246,7 @@ export class QueryClient { K extends object, L extends object, >( - tmClient: Tendermint34Client, + tmClient: TendermintClient, setupExtensionA: QueryExtensionSetup, setupExtensionB: QueryExtensionSetup, setupExtensionC: QueryExtensionSetup, @@ -277,7 +277,7 @@ export class QueryClient { L extends object, M extends object, >( - tmClient: Tendermint34Client, + tmClient: TendermintClient, setupExtensionA: QueryExtensionSetup, setupExtensionB: QueryExtensionSetup, setupExtensionC: QueryExtensionSetup, @@ -310,7 +310,7 @@ export class QueryClient { M extends object, N extends object, >( - tmClient: Tendermint34Client, + tmClient: TendermintClient, setupExtensionA: QueryExtensionSetup, setupExtensionB: QueryExtensionSetup, setupExtensionC: QueryExtensionSetup, @@ -345,7 +345,7 @@ export class QueryClient { N extends object, O extends object, >( - tmClient: Tendermint34Client, + tmClient: TendermintClient, setupExtensionA: QueryExtensionSetup, setupExtensionB: QueryExtensionSetup, setupExtensionC: QueryExtensionSetup, @@ -382,7 +382,7 @@ export class QueryClient { O extends object, P extends object, >( - tmClient: Tendermint34Client, + tmClient: TendermintClient, setupExtensionA: QueryExtensionSetup, setupExtensionB: QueryExtensionSetup, setupExtensionC: QueryExtensionSetup, @@ -421,7 +421,7 @@ export class QueryClient { P extends object, Q extends object, >( - tmClient: Tendermint34Client, + tmClient: TendermintClient, setupExtensionA: QueryExtensionSetup, setupExtensionB: QueryExtensionSetup, setupExtensionC: QueryExtensionSetup, @@ -462,7 +462,7 @@ export class QueryClient { Q extends object, R extends object, >( - tmClient: Tendermint34Client, + tmClient: TendermintClient, setupExtensionA: QueryExtensionSetup, setupExtensionB: QueryExtensionSetup, setupExtensionC: QueryExtensionSetup, @@ -484,7 +484,7 @@ export class QueryClient { ): QueryClient & A & B & C & D & E & F & G & H & I & J & K & L & M & N & O & P & Q & R; public static withExtensions( - tmClient: Tendermint34Client, + tmClient: TendermintClient, ...extensionSetups: Array> ): any { const client = new QueryClient(tmClient); @@ -506,9 +506,9 @@ export class QueryClient { return client; } - private readonly tmClient: Tendermint34Client; + private readonly tmClient: TendermintClient; - public constructor(tmClient: Tendermint34Client) { + public constructor(tmClient: TendermintClient) { this.tmClient = tmClient; } diff --git a/packages/stargate/src/signingstargateclient.ts b/packages/stargate/src/signingstargateclient.ts index ed89c7e9..73fa8143 100644 --- a/packages/stargate/src/signingstargateclient.ts +++ b/packages/stargate/src/signingstargateclient.ts @@ -12,7 +12,7 @@ import { Registry, TxBodyEncodeObject, } from "@cosmjs/proto-signing"; -import { HttpEndpoint, Tendermint34Client } from "@cosmjs/tendermint-rpc"; +import { HttpEndpoint, Tendermint34Client, TendermintClient } from "@cosmjs/tendermint-rpc"; import { assert, assertDefined } from "@cosmjs/utils"; import { Coin } from "cosmjs-types/cosmos/base/v1beta1/coin"; import { MsgWithdrawDelegatorReward } from "cosmjs-types/cosmos/distribution/v1beta1/tx"; @@ -140,7 +140,7 @@ export class SigningStargateClient extends StargateClient { } protected constructor( - tmClient: Tendermint34Client | undefined, + tmClient: TendermintClient | undefined, signer: OfflineSigner, options: SigningStargateClientOptions, ) { diff --git a/packages/stargate/src/stargateclient.ts b/packages/stargate/src/stargateclient.ts index 400f59ff..ddcf763a 100644 --- a/packages/stargate/src/stargateclient.ts +++ b/packages/stargate/src/stargateclient.ts @@ -2,7 +2,12 @@ import { addCoins } from "@cosmjs/amino"; import { toHex } from "@cosmjs/encoding"; import { Uint53 } from "@cosmjs/math"; -import { HttpEndpoint, Tendermint34Client, toRfc3339WithNanoseconds } from "@cosmjs/tendermint-rpc"; +import { + HttpEndpoint, + Tendermint34Client, + TendermintClient, + toRfc3339WithNanoseconds, +} from "@cosmjs/tendermint-rpc"; import { assert, sleep } from "@cosmjs/utils"; import { MsgData } from "cosmjs-types/cosmos/base/abci/v1beta1/abci"; import { Coin } from "cosmjs-types/cosmos/base/v1beta1/coin"; @@ -171,7 +176,7 @@ export class BroadcastTxError extends Error { /** Use for testing only */ export interface PrivateStargateClient { - readonly tmClient: Tendermint34Client | undefined; + readonly tmClient: TendermintClient | undefined; } export interface StargateClientOptions { @@ -179,7 +184,7 @@ export interface StargateClientOptions { } export class StargateClient { - private readonly tmClient: Tendermint34Client | undefined; + private readonly tmClient: TendermintClient | undefined; private readonly queryClient: | (QueryClient & AuthExtension & BankExtension & StakingExtension & TxExtension) | undefined; @@ -194,7 +199,7 @@ export class StargateClient { return new StargateClient(tmClient, options); } - protected constructor(tmClient: Tendermint34Client | undefined, options: StargateClientOptions) { + protected constructor(tmClient: TendermintClient | undefined, options: StargateClientOptions) { if (tmClient) { this.tmClient = tmClient; this.queryClient = QueryClient.withExtensions( @@ -209,11 +214,11 @@ export class StargateClient { this.accountParser = accountParser; } - protected getTmClient(): Tendermint34Client | undefined { + protected getTmClient(): TendermintClient | undefined { return this.tmClient; } - protected forceGetTmClient(): Tendermint34Client { + protected forceGetTmClient(): TendermintClient { if (!this.tmClient) { throw new Error( "Tendermint client not available. You cannot use online functionality in offline mode.", diff --git a/packages/tendermint-rpc/src/index.ts b/packages/tendermint-rpc/src/index.ts index 757012a3..5b645eff 100644 --- a/packages/tendermint-rpc/src/index.ts +++ b/packages/tendermint-rpc/src/index.ts @@ -97,6 +97,7 @@ export * as tendermint34 from "./tendermint34"; export { Tendermint34Client } from "./tendermint34"; export * as tendermint37 from "./tendermint37"; export { Tendermint37Client } from "./tendermint37"; +export { isTendermint34Client, isTendermint37Client, TendermintClient } from "./tendermintclient"; export { BlockIdFlag, CommitSignature, diff --git a/packages/tendermint-rpc/src/tendermintclient.ts b/packages/tendermint-rpc/src/tendermintclient.ts new file mode 100644 index 00000000..3d07558b --- /dev/null +++ b/packages/tendermint-rpc/src/tendermintclient.ts @@ -0,0 +1,13 @@ +import { Tendermint34Client } from "./tendermint34"; +import { Tendermint37Client } from "./tendermint37"; + +/** A TendermintClient is either a Tendermint34Client or a Tendermint37Client */ +export type TendermintClient = Tendermint34Client | Tendermint37Client; + +export function isTendermint34Client(client: TendermintClient): client is Tendermint34Client { + return client instanceof Tendermint34Client; +} + +export function isTendermint37Client(client: TendermintClient): client is Tendermint37Client { + return client instanceof Tendermint37Client; +}