From 63082a9e85f377559b4fa06b28c63d8f653ec50e Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 21 Sep 2020 12:47:36 +0200 Subject: [PATCH 1/4] Remove obsolete `TxData.tags` and make `TxData.events` non-optional --- CHANGELOG.md | 2 ++ packages/tendermint-rpc/src/client.spec.ts | 16 ++++------------ packages/tendermint-rpc/src/responses.ts | 3 +-- packages/tendermint-rpc/src/v0-33/responses.ts | 4 ++-- packages/tendermint-rpc/types/responses.d.ts | 3 +-- 5 files changed, 10 insertions(+), 18 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 5e9e0a31..147cd66a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -54,6 +54,8 @@ is always set. - @cosmjs/tendermint-rpc: Change type of `GenesisResponse.appState` to `Record | undefined`. +- @cosmjs/tendermint-rpc: Remove obsolete `TxData.tags` and make `TxData.events` + non-optional. - @cosmjs/utils: Add `assertDefined`. - @cosmjs/faucet: Rename binary from `cosmwasm-faucet` to `cosmos-faucet`. diff --git a/packages/tendermint-rpc/src/client.spec.ts b/packages/tendermint-rpc/src/client.spec.ts index ff4703f0..41f4a052 100644 --- a/packages/tendermint-rpc/src/client.spec.ts +++ b/packages/tendermint-rpc/src/client.spec.ts @@ -485,6 +485,7 @@ function websocketTestSuite(rpcFactory: () => RpcClient, adaptor: Adaptor, appCr expect(event.height).toBeGreaterThan(0); expect(event.index).toEqual(0); expect(event.result).toBeTruthy(); + expect(event.result.events.length).toBeGreaterThanOrEqual(1); events.push(event); @@ -507,12 +508,7 @@ function websocketTestSuite(rpcFactory: () => RpcClient, adaptor: Adaptor, appCr expect(events.length).toEqual(2); // Meta expect(events[1].height).toEqual(events[0].height + 1); - if (events[1].result.tags && events[0].result.tags) { - expect(events[1].result.tags).not.toEqual(events[0].result.tags); - } - if (events[1].result.events && events[0].result.events) { - expect(events[1].result.events).not.toEqual(events[0].result.events); - } + expect(events[1].result.events).not.toEqual(events[0].result.events); // Content expect(events[0].tx).toEqual(transactionData1); expect(events[1].tx).toEqual(transactionData2); @@ -536,6 +532,7 @@ function websocketTestSuite(rpcFactory: () => RpcClient, adaptor: Adaptor, appCr expect(event.height).toBeGreaterThan(0); expect(event.index).toEqual(0); expect(event.result).toBeTruthy(); + expect(event.result.events.length).toBeGreaterThanOrEqual(1); events.push(event); if (events.length === 2) { @@ -554,12 +551,7 @@ function websocketTestSuite(rpcFactory: () => RpcClient, adaptor: Adaptor, appCr expect(events.length).toEqual(2); // Meta expect(events[1].height).toEqual(events[0].height + 1); - if (events[1].result.tags && events[0].result.tags) { - expect(events[1].result.tags).not.toEqual(events[0].result.tags); - } - if (events[1].result.events && events[0].result.events) { - expect(events[1].result.events).not.toEqual(events[0].result.events); - } + expect(events[1].result.events).not.toEqual(events[0].result.events); // Content expect(events[0].tx).toEqual(transactionData1); expect(events[1].tx).toEqual(transactionData2); diff --git a/packages/tendermint-rpc/src/responses.ts b/packages/tendermint-rpc/src/responses.ts index 9f3ae892..09b00e9e 100644 --- a/packages/tendermint-rpc/src/responses.ts +++ b/packages/tendermint-rpc/src/responses.ts @@ -177,8 +177,7 @@ export interface TxData { readonly code: number; readonly log?: string; readonly data?: Uint8Array; - readonly tags?: readonly Tag[]; - readonly events?: readonly Event[]; + readonly events: readonly Event[]; // readonly fees?: any; } diff --git a/packages/tendermint-rpc/src/v0-33/responses.ts b/packages/tendermint-rpc/src/v0-33/responses.ts index 3e785ac1..f15ab54e 100644 --- a/packages/tendermint-rpc/src/v0-33/responses.ts +++ b/packages/tendermint-rpc/src/v0-33/responses.ts @@ -126,7 +126,7 @@ interface RpcTxData { readonly code?: number; readonly log?: string; readonly data?: Base64String; - readonly events?: readonly RpcEvent[]; + readonly events: readonly RpcEvent[]; } function decodeTxData(data: RpcTxData): responses.TxData { @@ -134,7 +134,7 @@ function decodeTxData(data: RpcTxData): responses.TxData { data: may(Base64.decode, data.data), log: data.log, code: Integer.parse(assertNumber(optional(data.code, 0))), - events: may(decodeEvents, data.events), + events: decodeEvents(data.events), }; } diff --git a/packages/tendermint-rpc/types/responses.d.ts b/packages/tendermint-rpc/types/responses.d.ts index 7707c6e1..1fbf7912 100644 --- a/packages/tendermint-rpc/types/responses.d.ts +++ b/packages/tendermint-rpc/types/responses.d.ts @@ -138,8 +138,7 @@ export interface TxData { readonly code: number; readonly log?: string; readonly data?: Uint8Array; - readonly tags?: readonly Tag[]; - readonly events?: readonly Event[]; + readonly events: readonly Event[]; } export interface TxProof { readonly data: Uint8Array; From c97c43fbc709389d809adaad286f2280b4e5bfac Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 21 Sep 2020 12:59:22 +0200 Subject: [PATCH 2/4] Rename `Tag` to `Attribute` --- CHANGELOG.md | 2 +- packages/tendermint-rpc/src/responses.ts | 9 +++++---- .../tendermint-rpc/src/v0-33/responses.ts | 20 +++++++++---------- packages/tendermint-rpc/types/responses.d.ts | 9 +++++---- 4 files changed, 21 insertions(+), 19 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 147cd66a..ff3806f4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -55,7 +55,7 @@ - @cosmjs/tendermint-rpc: Change type of `GenesisResponse.appState` to `Record | undefined`. - @cosmjs/tendermint-rpc: Remove obsolete `TxData.tags` and make `TxData.events` - non-optional. + non-optional. Rename `Tag` to `Attribute`. - @cosmjs/utils: Add `assertDefined`. - @cosmjs/faucet: Rename binary from `cosmwasm-faucet` to `cosmos-faucet`. diff --git a/packages/tendermint-rpc/src/responses.ts b/packages/tendermint-rpc/src/responses.ts index 09b00e9e..0c202a7c 100644 --- a/packages/tendermint-rpc/src/responses.ts +++ b/packages/tendermint-rpc/src/responses.ts @@ -55,8 +55,8 @@ export interface BlockResultsResponse { readonly results: readonly TxData[]; readonly validatorUpdates: readonly Validator[]; readonly consensusUpdates?: ConsensusParams; - readonly beginBlock?: readonly Tag[]; - readonly endBlock?: readonly Tag[]; + readonly beginBlock?: readonly Attribute[]; + readonly endBlock?: readonly Attribute[]; } export interface BlockchainResponse { @@ -163,14 +163,15 @@ export const getBlockEventHeight = (event: NewBlockEvent): number => event.heade // Helper items used above -export interface Tag { +/** An event attribute */ +export interface Attribute { readonly key: Uint8Array; readonly value: Uint8Array; } export interface Event { readonly type: string; - readonly attributes: readonly Tag[]; + readonly attributes: readonly Attribute[]; } export interface TxData { diff --git a/packages/tendermint-rpc/src/v0-33/responses.ts b/packages/tendermint-rpc/src/v0-33/responses.ts index f15ab54e..6d35ca4d 100644 --- a/packages/tendermint-rpc/src/v0-33/responses.ts +++ b/packages/tendermint-rpc/src/v0-33/responses.ts @@ -90,31 +90,31 @@ function decodeAbciQuery(data: RpcAbciQueryResponse): responses.AbciQueryRespons }; } -interface RpcTag { +interface RpcAttribute { readonly key: Base64String; readonly value: Base64String; } -function decodeTag(tag: RpcTag): responses.Tag { +function decodeAttribute(attribute: RpcAttribute): responses.Attribute { return { - key: Base64.decode(assertNotEmpty(tag.key)), - value: Base64.decode(assertNotEmpty(tag.value)), + key: Base64.decode(assertNotEmpty(attribute.key)), + value: Base64.decode(assertNotEmpty(attribute.value)), }; } -function decodeTags(tags: readonly RpcTag[]): readonly responses.Tag[] { - return assertArray(tags).map(decodeTag); +function decodeAttributes(attributes: readonly RpcAttribute[]): responses.Attribute[] { + return assertArray(attributes).map(decodeAttribute); } interface RpcEvent { readonly type: string; - readonly attributes: readonly RpcTag[]; + readonly attributes: readonly RpcAttribute[]; } function decodeEvent(event: RpcEvent): responses.Event { return { type: event.type, - attributes: decodeTags(event.attributes), + attributes: decodeAttributes(event.attributes), }; } @@ -248,8 +248,8 @@ function decodeBlockResults(data: RpcBlockResultsResponse): responses.BlockResul results: results.map(decodeTxData), validatorUpdates: validatorUpdates.map(decodeValidatorUpdate), consensusUpdates: may(decodeConsensusParams, data.consensus_param_updates), - beginBlock: may(decodeTags, data.begin_block_events), - endBlock: may(decodeTags, data.end_block_events), + beginBlock: may(decodeAttributes, data.begin_block_events), + endBlock: may(decodeAttributes, data.end_block_events), }; } diff --git a/packages/tendermint-rpc/types/responses.d.ts b/packages/tendermint-rpc/types/responses.d.ts index 1fbf7912..306d7716 100644 --- a/packages/tendermint-rpc/types/responses.d.ts +++ b/packages/tendermint-rpc/types/responses.d.ts @@ -47,8 +47,8 @@ export interface BlockResultsResponse { readonly results: readonly TxData[]; readonly validatorUpdates: readonly Validator[]; readonly consensusUpdates?: ConsensusParams; - readonly beginBlock?: readonly Tag[]; - readonly endBlock?: readonly Tag[]; + readonly beginBlock?: readonly Attribute[]; + readonly endBlock?: readonly Attribute[]; } export interface BlockchainResponse { readonly lastHeight: number; @@ -126,13 +126,14 @@ export interface TxEvent { export declare const getTxEventHeight: (event: TxEvent) => number; export declare const getHeaderEventHeight: (event: NewBlockHeaderEvent) => number; export declare const getBlockEventHeight: (event: NewBlockEvent) => number; -export interface Tag { +/** An event attribute */ +export interface Attribute { readonly key: Uint8Array; readonly value: Uint8Array; } export interface Event { readonly type: string; - readonly attributes: readonly Tag[]; + readonly attributes: readonly Attribute[]; } export interface TxData { readonly code: number; From 318e37868e0cb214f0cb5fdd5fc6a8425fc11707 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 21 Sep 2020 13:24:51 +0200 Subject: [PATCH 3/4] Fix beginBlockEvents/endBlockEvents --- CHANGELOG.md | 3 +++ packages/tendermint-rpc/src/client.spec.ts | 17 ++++++++++++++++- packages/tendermint-rpc/src/responses.ts | 4 ++-- packages/tendermint-rpc/src/v0-33/responses.ts | 8 ++++---- packages/tendermint-rpc/types/responses.d.ts | 4 ++-- 5 files changed, 27 insertions(+), 9 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index ff3806f4..01ac395a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -56,6 +56,9 @@ `Record | undefined`. - @cosmjs/tendermint-rpc: Remove obsolete `TxData.tags` and make `TxData.events` non-optional. Rename `Tag` to `Attribute`. +- @cosmjs/tendermint-rpc: Remove obsolete `BlockResultsResponse.beginBlock` and + `.beginBlock`. The new `.beginBlockEvents` and `.endBlockEvents` now parse the + events correctly. - @cosmjs/utils: Add `assertDefined`. - @cosmjs/faucet: Rename binary from `cosmwasm-faucet` to `cosmos-faucet`. diff --git a/packages/tendermint-rpc/src/client.spec.ts b/packages/tendermint-rpc/src/client.spec.ts index 41f4a052..13bb567d 100644 --- a/packages/tendermint-rpc/src/client.spec.ts +++ b/packages/tendermint-rpc/src/client.spec.ts @@ -119,7 +119,6 @@ function defaultTestSuite(rpcFactory: () => RpcClient, adaptor: Adaptor): void { const client = new Client(rpcFactory(), adaptor); expect(await client.block()).toBeTruthy(); - expect(await client.blockResults(3)).toBeTruthy(); expect(await client.commit(4)).toBeTruthy(); expect(await client.genesis()).toBeTruthy(); expect(await client.health()).toBeNull(); @@ -145,6 +144,22 @@ function defaultTestSuite(rpcFactory: () => RpcClient, adaptor: Adaptor): void { }); }); + describe("blockResults", () => { + it("works", async () => { + pendingWithoutTendermint(); + const client = new Client(rpcFactory(), adaptor); + + const height = 3; + const results = await client.blockResults(height); + expect(results.height).toEqual(height); + expect(results.results).toEqual([]); + expect(results.beginBlockEvents).toEqual([]); + expect(results.endBlockEvents).toEqual([]); + + client.disconnect(); + }); + }); + describe("blockchain", () => { it("returns latest in descending order by default", async () => { pendingWithoutTendermint(); diff --git a/packages/tendermint-rpc/src/responses.ts b/packages/tendermint-rpc/src/responses.ts index 0c202a7c..d3770923 100644 --- a/packages/tendermint-rpc/src/responses.ts +++ b/packages/tendermint-rpc/src/responses.ts @@ -55,8 +55,8 @@ export interface BlockResultsResponse { readonly results: readonly TxData[]; readonly validatorUpdates: readonly Validator[]; readonly consensusUpdates?: ConsensusParams; - readonly beginBlock?: readonly Attribute[]; - readonly endBlock?: readonly Attribute[]; + readonly beginBlockEvents: readonly Event[]; + readonly endBlockEvents: readonly Event[]; } export interface BlockchainResponse { diff --git a/packages/tendermint-rpc/src/v0-33/responses.ts b/packages/tendermint-rpc/src/v0-33/responses.ts index 6d35ca4d..efdf473c 100644 --- a/packages/tendermint-rpc/src/v0-33/responses.ts +++ b/packages/tendermint-rpc/src/v0-33/responses.ts @@ -234,8 +234,8 @@ function decodeConsensusParams(data: RpcConsensusParams): responses.ConsensusPar interface RpcBlockResultsResponse { readonly height: IntegerString; readonly txs_results: readonly RpcTxData[] | null; - readonly begin_block_events: null; - readonly end_block_events: null; + readonly begin_block_events: readonly RpcEvent[] | null; + readonly end_block_events: readonly RpcEvent[] | null; readonly validator_updates: null; readonly consensus_param_updates: null; } @@ -248,8 +248,8 @@ function decodeBlockResults(data: RpcBlockResultsResponse): responses.BlockResul results: results.map(decodeTxData), validatorUpdates: validatorUpdates.map(decodeValidatorUpdate), consensusUpdates: may(decodeConsensusParams, data.consensus_param_updates), - beginBlock: may(decodeAttributes, data.begin_block_events), - endBlock: may(decodeAttributes, data.end_block_events), + beginBlockEvents: decodeEvents(data.begin_block_events || []), + endBlockEvents: decodeEvents(data.end_block_events || []), }; } diff --git a/packages/tendermint-rpc/types/responses.d.ts b/packages/tendermint-rpc/types/responses.d.ts index 306d7716..fba36aba 100644 --- a/packages/tendermint-rpc/types/responses.d.ts +++ b/packages/tendermint-rpc/types/responses.d.ts @@ -47,8 +47,8 @@ export interface BlockResultsResponse { readonly results: readonly TxData[]; readonly validatorUpdates: readonly Validator[]; readonly consensusUpdates?: ConsensusParams; - readonly beginBlock?: readonly Attribute[]; - readonly endBlock?: readonly Attribute[]; + readonly beginBlockEvents: readonly Event[]; + readonly endBlockEvents: readonly Event[]; } export interface BlockchainResponse { readonly lastHeight: number; From ec3c3d158ad3433413116b29de4630d9040aee46 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 21 Sep 2020 13:30:00 +0200 Subject: [PATCH 4/4] Polish some code in decodeBlockResults --- packages/tendermint-rpc/src/v0-33/responses.ts | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/packages/tendermint-rpc/src/v0-33/responses.ts b/packages/tendermint-rpc/src/v0-33/responses.ts index efdf473c..3b17a02e 100644 --- a/packages/tendermint-rpc/src/v0-33/responses.ts +++ b/packages/tendermint-rpc/src/v0-33/responses.ts @@ -236,17 +236,15 @@ interface RpcBlockResultsResponse { readonly txs_results: readonly RpcTxData[] | null; readonly begin_block_events: readonly RpcEvent[] | null; readonly end_block_events: readonly RpcEvent[] | null; - readonly validator_updates: null; - readonly consensus_param_updates: null; + readonly validator_updates: readonly RpcValidatorUpdate[] | null; + readonly consensus_param_updates: RpcConsensusParams | null; } function decodeBlockResults(data: RpcBlockResultsResponse): responses.BlockResultsResponse { - const results = optional(data.txs_results, [] as readonly RpcTxData[]); - const validatorUpdates = optional(data.validator_updates, [] as readonly RpcValidatorUpdate[]); return { height: Integer.parse(assertNotEmpty(data.height)), - results: results.map(decodeTxData), - validatorUpdates: validatorUpdates.map(decodeValidatorUpdate), + results: (data.txs_results || []).map(decodeTxData), + validatorUpdates: (data.validator_updates || []).map(decodeValidatorUpdate), consensusUpdates: may(decodeConsensusParams, data.consensus_param_updates), beginBlockEvents: decodeEvents(data.begin_block_events || []), endBlockEvents: decodeEvents(data.end_block_events || []),