From 31ca949a8cb6a8a5ef5ae9f7eee32b40b30964d6 Mon Sep 17 00:00:00 2001 From: Simon Warta Date: Mon, 27 Jul 2020 09:58:12 +0200 Subject: [PATCH] Add assertIsPostTxSuccess --- CHANGELOG.md | 2 ++ packages/sdk38/src/cosmosclient.spec.ts | 6 +++--- packages/sdk38/src/cosmosclient.ts | 19 +++++++++++++++++-- packages/sdk38/src/index.ts | 5 +++++ .../sdk38/src/lcdapi/distribution.spec.ts | 8 ++++---- packages/sdk38/src/lcdapi/gov.spec.ts | 10 +++++----- packages/sdk38/src/lcdapi/staking.spec.ts | 10 +++++----- .../sdk38/src/signingcosmosclient.spec.ts | 6 +++--- packages/sdk38/types/cosmosclient.d.ts | 7 ++++++- packages/sdk38/types/index.d.ts | 5 +++++ 10 files changed, 55 insertions(+), 23 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index d922209f..a8b33ef0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -18,3 +18,5 @@ `Uint64.fromNumber(1.1)` produced some result. - @cosmjs/sdk38: Add `SigningCosmosClient.signAndPost` as a mid-level abstraction between `SigningCosmosClient.sendTokens` and `.postTx`. +- @cosmjs/sdk38: Export `PostTxFailure`/`PostTxSuccess` and type checkers + `isPostTxFailure`/`isPostTxSuccess`; export `assertIsPostTxSuccess`. diff --git a/packages/sdk38/src/cosmosclient.spec.ts b/packages/sdk38/src/cosmosclient.spec.ts index 30e5d14c..6087e967 100644 --- a/packages/sdk38/src/cosmosclient.spec.ts +++ b/packages/sdk38/src/cosmosclient.spec.ts @@ -1,8 +1,8 @@ /* eslint-disable @typescript-eslint/naming-convention */ -import { assert, sleep } from "@cosmjs/utils"; +import { sleep } from "@cosmjs/utils"; import { ReadonlyDate } from "readonly-date"; -import { CosmosClient, isPostTxFailure, PrivateCosmWasmClient } from "./cosmosclient"; +import { assertIsPostTxSuccess, CosmosClient, PrivateCosmWasmClient } from "./cosmosclient"; import { makeSignBytes } from "./encoding"; import { findAttribute } from "./logs"; import { MsgSend } from "./msgs"; @@ -234,7 +234,7 @@ describe("CosmosClient", () => { signatures: [signature], }; const txResult = await client.postTx(signedTx); - assert(!isPostTxFailure(txResult)); + assertIsPostTxSuccess(txResult); const { logs, transactionHash } = txResult; const amountAttr = findAttribute(logs, "transfer", "amount"); expect(amountAttr.value).toEqual("1234567ucosm"); diff --git a/packages/sdk38/src/cosmosclient.ts b/packages/sdk38/src/cosmosclient.ts index a447f1b9..34ee4fe0 100644 --- a/packages/sdk38/src/cosmosclient.ts +++ b/packages/sdk38/src/cosmosclient.ts @@ -40,8 +40,23 @@ export interface PostTxSuccess { export type PostTxResult = PostTxSuccess | PostTxFailure; -export function isPostTxFailure(postTxResult: PostTxResult): postTxResult is PostTxFailure { - return !!(postTxResult as PostTxFailure).code; +export function isPostTxFailure(result: PostTxResult): result is PostTxFailure { + return !!(result as PostTxFailure).code; +} + +export function isPostTxSuccess(result: PostTxResult): result is PostTxSuccess { + return !isPostTxFailure(result); +} + +/** + * Ensures the given result is a success. Throws a detailed error message otherwise. + */ +export function assertIsPostTxSuccess(result: PostTxResult): asserts result is PostTxSuccess { + if (isPostTxFailure(result)) { + throw new Error( + `Error when posting tx ${result.transactionHash} at height ${result.height}. Code: ${result.code}; Raw log: ${result.rawLog}`, + ); + } } export interface SearchByIdQuery { diff --git a/packages/sdk38/src/index.ts b/packages/sdk38/src/index.ts index 81ddccea..4afe6c26 100644 --- a/packages/sdk38/src/index.ts +++ b/packages/sdk38/src/index.ts @@ -6,12 +6,17 @@ export { Coin, coin, coins } from "./coins"; export { Account, + assertIsPostTxSuccess, Block, BlockHeader, CosmosClient, GetSequenceResult, IndexedTx, + isPostTxFailure, + isPostTxSuccess, + PostTxFailure, PostTxResult, + PostTxSuccess, SearchByHeightQuery, SearchByIdQuery, SearchBySentFromOrToQuery, diff --git a/packages/sdk38/src/lcdapi/distribution.spec.ts b/packages/sdk38/src/lcdapi/distribution.spec.ts index e57c386e..af63253f 100644 --- a/packages/sdk38/src/lcdapi/distribution.spec.ts +++ b/packages/sdk38/src/lcdapi/distribution.spec.ts @@ -1,9 +1,9 @@ /* eslint-disable @typescript-eslint/naming-convention */ import { Bech32 } from "@cosmjs/encoding"; -import { assert, sleep } from "@cosmjs/utils"; +import { sleep } from "@cosmjs/utils"; import { coin, coins } from "../coins"; -import { isPostTxFailure } from "../cosmosclient"; +import { assertIsPostTxSuccess } from "../cosmosclient"; import { makeSignBytes } from "../encoding"; import { MsgDelegate } from "../msgs"; import { SigningCosmosClient } from "../signingcosmosclient"; @@ -55,8 +55,8 @@ describe("DistributionExtension", () => { signatures: [signature], }; - const receipt = await client.postTx(tx); - assert(!isPostTxFailure(receipt)); + const result = await client.postTx(tx); + assertIsPostTxSuccess(result); await sleep(75); // wait until transactions are indexed } diff --git a/packages/sdk38/src/lcdapi/gov.spec.ts b/packages/sdk38/src/lcdapi/gov.spec.ts index ad379c45..3cb35162 100644 --- a/packages/sdk38/src/lcdapi/gov.spec.ts +++ b/packages/sdk38/src/lcdapi/gov.spec.ts @@ -1,8 +1,8 @@ /* eslint-disable @typescript-eslint/naming-convention */ -import { assert, sleep } from "@cosmjs/utils"; +import { sleep } from "@cosmjs/utils"; import { coins } from "../coins"; -import { isPostTxFailure } from "../cosmosclient"; +import { assertIsPostTxSuccess } from "../cosmosclient"; import { makeSignBytes } from "../encoding"; import { SigningCosmosClient } from "../signingcosmosclient"; import { @@ -66,9 +66,9 @@ describe("GovExtension", () => { signatures: [proposalSignature], }; - const proposalReceipt = await client.postTx(proposalTx); - assert(!isPostTxFailure(proposalReceipt)); - proposalId = proposalReceipt.logs[0].events + const proposalResult = await client.postTx(proposalTx); + assertIsPostTxSuccess(proposalResult); + proposalId = proposalResult.logs[0].events .find(({ type }) => type === "submit_proposal")! .attributes.find(({ key }) => key === "proposal_id")!.value; diff --git a/packages/sdk38/src/lcdapi/staking.spec.ts b/packages/sdk38/src/lcdapi/staking.spec.ts index dfe91717..22996d25 100644 --- a/packages/sdk38/src/lcdapi/staking.spec.ts +++ b/packages/sdk38/src/lcdapi/staking.spec.ts @@ -2,7 +2,7 @@ import { assert, sleep } from "@cosmjs/utils"; import { coin, coins } from "../coins"; -import { isPostTxFailure } from "../cosmosclient"; +import { assertIsPostTxSuccess } from "../cosmosclient"; import { makeSignBytes } from "../encoding"; import { MsgDelegate, MsgUndelegate } from "../msgs"; import { SigningCosmosClient } from "../signingcosmosclient"; @@ -56,8 +56,8 @@ describe("StakingExtension", () => { signatures: [signature], }; - const receipt = await client.postTx(tx); - assert(!isPostTxFailure(receipt)); + const result = await client.postTx(tx); + assertIsPostTxSuccess(result); } { const msg: MsgUndelegate = { @@ -79,8 +79,8 @@ describe("StakingExtension", () => { signatures: [signature], }; - const receipt = await client.postTx(tx); - assert(!isPostTxFailure(receipt)); + const result = await client.postTx(tx); + assertIsPostTxSuccess(result); } await sleep(75); // wait until transactions are indexed diff --git a/packages/sdk38/src/signingcosmosclient.spec.ts b/packages/sdk38/src/signingcosmosclient.spec.ts index f1cb66c6..a1d4c987 100644 --- a/packages/sdk38/src/signingcosmosclient.spec.ts +++ b/packages/sdk38/src/signingcosmosclient.spec.ts @@ -2,7 +2,7 @@ import { assert } from "@cosmjs/utils"; import { Coin, coin, coins } from "./coins"; -import { isPostTxFailure, PrivateCosmWasmClient } from "./cosmosclient"; +import { assertIsPostTxSuccess, PrivateCosmWasmClient } from "./cosmosclient"; import { MsgDelegate } from "./msgs"; import { SigningCosmosClient } from "./signingcosmosclient"; import { makeRandomAddress, pendingWithoutWasmd, validatorAddress } from "./testutils.spec"; @@ -68,7 +68,7 @@ describe("SigningCosmosClient", () => { // send const result = await client.sendTokens(beneficiaryAddress, transferAmount, "for dinner"); - assert(!isPostTxFailure(result)); + assertIsPostTxSuccess(result); const [firstLog] = result.logs; expect(firstLog).toBeTruthy(); @@ -98,7 +98,7 @@ describe("SigningCosmosClient", () => { gas: "120000", // 120k }; const result = await client.signAndPost([msg], fee, "Use your power wisely"); - assert(!isPostTxFailure(result)); + assertIsPostTxSuccess(result); }); }); }); diff --git a/packages/sdk38/types/cosmosclient.d.ts b/packages/sdk38/types/cosmosclient.d.ts index 57879a30..f6a28054 100644 --- a/packages/sdk38/types/cosmosclient.d.ts +++ b/packages/sdk38/types/cosmosclient.d.ts @@ -29,7 +29,12 @@ export interface PostTxSuccess { readonly data?: Uint8Array; } export declare type PostTxResult = PostTxSuccess | PostTxFailure; -export declare function isPostTxFailure(postTxResult: PostTxResult): postTxResult is PostTxFailure; +export declare function isPostTxFailure(result: PostTxResult): result is PostTxFailure; +export declare function isPostTxSuccess(result: PostTxResult): result is PostTxSuccess; +/** + * Ensures the given result is a success. Throws a detailed error message otherwise. + */ +export declare function assertIsPostTxSuccess(result: PostTxResult): asserts result is PostTxSuccess; export interface SearchByIdQuery { readonly id: string; } diff --git a/packages/sdk38/types/index.d.ts b/packages/sdk38/types/index.d.ts index 7aaafa40..d84be9f2 100644 --- a/packages/sdk38/types/index.d.ts +++ b/packages/sdk38/types/index.d.ts @@ -4,12 +4,17 @@ export { pubkeyToAddress, rawSecp256k1PubkeyToAddress } from "./address"; export { Coin, coin, coins } from "./coins"; export { Account, + assertIsPostTxSuccess, Block, BlockHeader, CosmosClient, GetSequenceResult, IndexedTx, + isPostTxFailure, + isPostTxSuccess, + PostTxFailure, PostTxResult, + PostTxSuccess, SearchByHeightQuery, SearchByIdQuery, SearchBySentFromOrToQuery,