diff --git a/packages/tendermint-rpc/src/adaptors/v0-33/responses.ts b/packages/tendermint-rpc/src/adaptors/v0-33/responses.ts index e62ed00c..de08739c 100644 --- a/packages/tendermint-rpc/src/adaptors/v0-33/responses.ts +++ b/packages/tendermint-rpc/src/adaptors/v0-33/responses.ts @@ -1,6 +1,7 @@ /* eslint-disable @typescript-eslint/naming-convention */ import { fromBase64, fromHex } from "@cosmjs/encoding"; import { JsonRpcSuccessResponse } from "@cosmjs/json-rpc"; +import { assert } from "@cosmjs/utils"; import { assertArray, @@ -18,7 +19,7 @@ import { } from "../../encodings"; import * as responses from "../../responses"; import { SubscriptionEvent } from "../../rpcclients"; -import { ValidatorPubkey, ValidatorSignature } from "../../types"; +import { BlockIdFlag, CommitSignature, ValidatorPubkey } from "../../types"; import { hashTx } from "./hasher"; interface AbciInfoResult { @@ -396,6 +397,11 @@ function decodeBroadcastTxCommit(data: RpcBroadcastTxCommitResponse): responses. }; } +function decodeBlockIdFlag(blockIdFlag: number): BlockIdFlag { + assert(blockIdFlag in BlockIdFlag); + return blockIdFlag; +} + type RpcSignature = { readonly block_id_flag: number; /** hex encoded */ @@ -405,22 +411,28 @@ type RpcSignature = { readonly signature: string; }; -function decodeSignature(data: RpcSignature): ValidatorSignature { +function decodeCommitSignature(data: RpcSignature): CommitSignature { return { - algorithm: "ed25519", - data: fromBase64(assertNotEmpty(data.signature)), + blockIdFlag: decodeBlockIdFlag(data.block_id_flag), + validatorAddress: fromHex(data.validator_address), + timestamp: new Date(assertNotEmpty(data.timestamp)), + signature: fromBase64(assertNotEmpty(data.signature)), }; } interface RpcCommit { readonly block_id: RpcBlockId; + readonly height: string; + readonly round: string; readonly signatures: readonly RpcSignature[]; } function decodeCommit(data: RpcCommit): responses.Commit { return { blockId: decodeBlockId(assertObject(data.block_id)), - signatures: assertArray(data.signatures).map(decodeSignature), + height: Integer.parse(assertNotEmpty(data.height)), + round: Integer.parse(data.round), + signatures: assertArray(data.signatures).map(decodeCommitSignature), }; } diff --git a/packages/tendermint-rpc/src/client.spec.ts b/packages/tendermint-rpc/src/client.spec.ts index 40ae694d..949288db 100644 --- a/packages/tendermint-rpc/src/client.spec.ts +++ b/packages/tendermint-rpc/src/client.spec.ts @@ -115,12 +115,26 @@ function defaultTestSuite(rpcFactory: () => RpcClient, adaptor: Adaptor, expecte client.disconnect(); }); + it("can get a commit", async () => { + pendingWithoutTendermint(); + const client = await Client.create(rpcFactory(), adaptor); + const response = await client.commit(4); + + expect(response).toBeTruthy(); + expect(response.commit.signatures.length).toBeGreaterThanOrEqual(1); + expect(response.commit.signatures[0].blockIdFlag).toEqual(2); + expect(response.commit.signatures[0].validatorAddress.length).toEqual(20); + expect(response.commit.signatures[0].timestamp).toBeInstanceOf(Date); + expect(response.commit.signatures[0].signature.length).toEqual(64); + + client.disconnect(); + }); + it("can call a bunch of methods", async () => { pendingWithoutTendermint(); const client = await Client.create(rpcFactory(), adaptor); expect(await client.block()).toBeTruthy(); - expect(await client.commit(4)).toBeTruthy(); expect(await client.genesis()).toBeTruthy(); expect(await client.health()).toBeNull(); expect(await client.validators()).toBeTruthy(); diff --git a/packages/tendermint-rpc/src/index.ts b/packages/tendermint-rpc/src/index.ts index 46d92f4c..d08f42d7 100644 --- a/packages/tendermint-rpc/src/index.ts +++ b/packages/tendermint-rpc/src/index.ts @@ -73,9 +73,4 @@ export { VoteType, } from "./responses"; export { HttpClient, WebsocketClient } from "./rpcclients"; // TODO: Why do we export those outside of this package? -export { - ValidatorEd25519Pubkey, - ValidatorEd25519Signature, - ValidatorPubkey, - ValidatorSignature, -} from "./types"; +export { BlockIdFlag, CommitSignature, ValidatorEd25519Pubkey, ValidatorPubkey } from "./types"; diff --git a/packages/tendermint-rpc/src/responses.ts b/packages/tendermint-rpc/src/responses.ts index 6b940fcb..226fe1b5 100644 --- a/packages/tendermint-rpc/src/responses.ts +++ b/packages/tendermint-rpc/src/responses.ts @@ -1,6 +1,6 @@ import { ReadonlyDate } from "readonly-date"; -import { ValidatorPubkey, ValidatorSignature } from "./types"; +import { CommitSignature, ValidatorPubkey } from "./types"; export type Response = | AbciInfoResponse @@ -222,7 +222,9 @@ export interface Evidence { export interface Commit { readonly blockId: BlockId; - readonly signatures: readonly ValidatorSignature[]; + readonly height: number; + readonly round: number; + readonly signatures: readonly CommitSignature[]; } /** @@ -241,7 +243,7 @@ export interface Vote { readonly round: number; readonly timestamp: ReadonlyDate; readonly blockId: BlockId; - readonly signature: ValidatorSignature; + readonly signature: Uint8Array; } export interface Version { diff --git a/packages/tendermint-rpc/src/types.ts b/packages/tendermint-rpc/src/types.ts index bc4d62fb..9e268ea3 100644 --- a/packages/tendermint-rpc/src/types.ts +++ b/packages/tendermint-rpc/src/types.ts @@ -12,13 +12,17 @@ export interface ValidatorEd25519Pubkey { */ export type ValidatorPubkey = ValidatorEd25519Pubkey; -export interface ValidatorEd25519Signature { - readonly algorithm: "ed25519"; - readonly data: Uint8Array; +export enum BlockIdFlag { + Unknown = 0, + Absent = 1, + Commit = 2, + Nil = 3, + Unrecognized = -1, } -/** - * Union type for different possible voting signatures. - * Currently only Ed25519 supported. - */ -export type ValidatorSignature = ValidatorEd25519Signature; +export interface CommitSignature { + blockIdFlag: BlockIdFlag; + validatorAddress: Uint8Array; + timestamp?: Date; + signature: Uint8Array; +}