diff --git a/CHANGELOG.md b/CHANGELOG.md index de7e613a..49c08b41 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -65,6 +65,10 @@ and this project adheres to - @cosmjs/tendermint-rpc: Add `pubkeyToAddress`, `pubkeyToRawAddress`, `rawEd25519PubkeyToRawAddress`, and `rawSecp256k1PubkeyToRawAddress` helper functions. +- @cosmjs/stargate: `StargateClient.broadcastTx` and `.getTx` results now + include `gasUsed` and `gasWanted` properties. +- @cosmjs/cosmwasm-stargate: `CosmWasmClient.broadcastTx` and `.getTx` results + now include `gasUsed` and `gasWanted` properties. ### Changed @@ -119,6 +123,8 @@ and this project adheres to - @cosmjs/cosmwasm-stargate: `CosmWasmClient.broadcastTx` now uses sync mode and then polls for the transaction before resolving. The timeout and poll interval can be configured. +- @cosmjs/tendermint-rpc: Tendermint v34 `TxData` type now includes `codeSpace`, + `gasWanted`, and `gasUsed` properties. ### Deprecated diff --git a/packages/cosmwasm-stargate/src/cosmwasmclient.ts b/packages/cosmwasm-stargate/src/cosmwasmclient.ts index 80f33b38..3137e5c7 100644 --- a/packages/cosmwasm-stargate/src/cosmwasmclient.ts +++ b/packages/cosmwasm-stargate/src/cosmwasmclient.ts @@ -224,6 +224,8 @@ export class CosmWasmClient { height: result.height, rawLog: result.rawLog, transactionHash: txId, + gasUsed: result.gasUsed, + gasWanted: result.gasWanted, } : pollForTx(txId); }; @@ -382,6 +384,8 @@ export class CosmWasmClient { code: tx.result.code, rawLog: tx.result.log || "", tx: tx.tx, + gasUsed: tx.result.gasUsed, + gasWanted: tx.result.gasWanted, }; }); } diff --git a/packages/stargate/src/stargateclient.spec.ts b/packages/stargate/src/stargateclient.spec.ts index 1d22ab83..9565df05 100644 --- a/packages/stargate/src/stargateclient.spec.ts +++ b/packages/stargate/src/stargateclient.spec.ts @@ -332,7 +332,8 @@ describe("StargateClient", () => { const txResult = await client.broadcastTx(txRawBytes); assertIsBroadcastTxSuccess(txResult); - const { rawLog, transactionHash } = txResult; + const { gasUsed, rawLog, transactionHash } = txResult; + expect(gasUsed).toBeGreaterThan(0); expect(rawLog).toMatch(/{"key":"amount","value":"1234567ucosm"}/); expect(transactionHash).toMatch(/^[0-9A-F]{64}$/); diff --git a/packages/stargate/src/stargateclient.ts b/packages/stargate/src/stargateclient.ts index cd9e0091..c442db3e 100644 --- a/packages/stargate/src/stargateclient.ts +++ b/packages/stargate/src/stargateclient.ts @@ -1,11 +1,7 @@ /* eslint-disable @typescript-eslint/naming-convention */ import { toHex } from "@cosmjs/encoding"; import { Uint53 } from "@cosmjs/math"; -import { - BroadcastTxSyncResponse, - Tendermint34Client, - toRfc3339WithNanoseconds, -} from "@cosmjs/tendermint-rpc"; +import { Tendermint34Client, toRfc3339WithNanoseconds } from "@cosmjs/tendermint-rpc"; import { sleep } from "@cosmjs/utils"; import { Account, accountFromAny } from "./accounts"; @@ -63,6 +59,8 @@ export interface IndexedTx { readonly code: number; readonly rawLog: string; readonly tx: Uint8Array; + readonly gasUsed: number; + readonly gasWanted: number; } export interface SequenceResponse { @@ -83,6 +81,8 @@ export interface BroadcastTxSuccess { readonly transactionHash: string; readonly rawLog?: string; readonly data?: readonly MsgData[]; + readonly gasUsed: number; + readonly gasWanted: number; } export type BroadcastTxResponse = BroadcastTxSuccess | BroadcastTxFailure; @@ -303,6 +303,8 @@ export class StargateClient { height: result.height, rawLog: result.rawLog, transactionHash: txId, + gasUsed: result.gasUsed, + gasWanted: result.gasWanted, } : pollForTx(txId); }; @@ -310,7 +312,7 @@ export class StargateClient { return new Promise((resolve, reject) => this.forceGetTmClient() .broadcastTxSync({ tx }) - .then(({ hash }: BroadcastTxSyncResponse) => pollForTx(toHex(hash).toUpperCase())) + .then(({ hash }) => pollForTx(toHex(hash).toUpperCase())) .then(resolve, reject) .finally(() => clearTimeout(txPollTimeout)), ); @@ -325,6 +327,8 @@ export class StargateClient { code: tx.result.code, rawLog: tx.result.log || "", tx: tx.tx, + gasUsed: tx.result.gasUsed, + gasWanted: tx.result.gasWanted, }; }); } diff --git a/packages/tendermint-rpc/src/tendermint34/adaptors/v0-34/responses.ts b/packages/tendermint-rpc/src/tendermint34/adaptors/v0-34/responses.ts index 8b721900..84c2ea33 100644 --- a/packages/tendermint-rpc/src/tendermint34/adaptors/v0-34/responses.ts +++ b/packages/tendermint-rpc/src/tendermint34/adaptors/v0-34/responses.ts @@ -126,19 +126,25 @@ function decodeEvents(events: readonly RpcEvent[]): readonly responses.Event[] { } interface RpcTxData { + readonly codespace?: string; readonly code?: number; readonly log?: string; /** base64 encoded */ readonly data?: string; readonly events?: readonly RpcEvent[]; + readonly gas_wanted?: string; + readonly gas_used?: string; } function decodeTxData(data: RpcTxData): responses.TxData { return { - data: may(fromBase64, data.data), - log: data.log, code: Integer.parse(assertNumber(optional(data.code, 0))), + codeSpace: data.codespace, + log: data.log, + data: may(fromBase64, data.data), events: data.events ? decodeEvents(data.events) : [], + gasWanted: Integer.parse(optional(data.gas_wanted, "0")), + gasUsed: Integer.parse(optional(data.gas_used, "0")), }; } diff --git a/packages/tendermint-rpc/src/tendermint34/responses.ts b/packages/tendermint-rpc/src/tendermint34/responses.ts index 229db65a..5e11184c 100644 --- a/packages/tendermint-rpc/src/tendermint34/responses.ts +++ b/packages/tendermint-rpc/src/tendermint34/responses.ts @@ -176,10 +176,12 @@ export interface Event { export interface TxData { readonly code: number; + readonly codeSpace?: string; readonly log?: string; readonly data?: Uint8Array; readonly events: readonly Event[]; - // readonly fees?: any; + readonly gasWanted: number; + readonly gasUsed: number; } export interface TxProof {