diff --git a/CHANGELOG.md b/CHANGELOG.md index e0e1388664..a45bf8099e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,11 +5,13 @@ Contributed: - Add `isHistoric` flag to ETH RPCs (Thanks to https://github.com/stwiname) +- Align contract instantiate types with Substrate (Thanks to https://github.com/kwingram25) Changes: - Adjust map header output type with lookup id - Re-enable all `BitVec` tests for `toU8a` +- Expose `txIndex` as event index on extrinsic results - Allow inspection of Codec encoding (experimental) - Allow inspection of storage key encoding (experimental) diff --git a/packages/api-base/src/types/submittable.ts b/packages/api-base/src/types/submittable.ts index 2030cc1540..ffdf33d700 100644 --- a/packages/api-base/src/types/submittable.ts +++ b/packages/api-base/src/types/submittable.ts @@ -66,6 +66,7 @@ export interface SubmittableResultValue { internalError?: Error; status: ExtrinsicStatus; txHash: Hash; + txIndex?: number; } export interface SubmittableExtrinsic extends Extrinsic { diff --git a/packages/api/src/submittable/Result.ts b/packages/api/src/submittable/Result.ts index 59b22332ec..682aff1778 100644 --- a/packages/api/src/submittable/Result.ts +++ b/packages/api/src/submittable/Result.ts @@ -47,13 +47,16 @@ export class SubmittableResult implements ISubmittableResult { public readonly txHash: Hash; - constructor ({ dispatchError, dispatchInfo, events, internalError, status, txHash }: SubmittableResultValue) { + public readonly txIndex?: number; + + constructor ({ dispatchError, dispatchInfo, events, internalError, status, txHash, txIndex }: SubmittableResultValue) { this.dispatchError = dispatchError || extractError(events); this.dispatchInfo = dispatchInfo || extractInfo(events); this.events = events || []; this.internalError = internalError; this.status = status; this.txHash = txHash; + this.txIndex = txIndex; } public get isCompleted (): boolean { diff --git a/packages/api/src/submittable/createClass.ts b/packages/api/src/submittable/createClass.ts index 48f5b2e7fc..c03849c685 100644 --- a/packages/api/src/submittable/createClass.ts +++ b/packages/api/src/submittable/createClass.ts @@ -248,7 +248,7 @@ export function createClass ({ api, apiType, decorate return api.derive.tx.events(blockHash).pipe( map(({ block, events }): ISubmittableResult => this.#transformResult(new SubmittableResult({ - events: filterEvents(txHash, block, events, status), + ...filterEvents(txHash, block, events, status), status, txHash })) diff --git a/packages/api/src/util/filterEvents.ts b/packages/api/src/util/filterEvents.ts index 000ce50452..885b55d677 100644 --- a/packages/api/src/util/filterEvents.ts +++ b/packages/api/src/util/filterEvents.ts @@ -5,14 +5,17 @@ import type { EventRecord, ExtrinsicStatus, H256, SignedBlock } from '@polkadot/ import { l } from './logging'; -export function filterEvents (txHash: H256, { block: { extrinsics, header } }: SignedBlock, allEvents: EventRecord[], status: ExtrinsicStatus): EventRecord[] | undefined { +export function filterEvents (txHash: H256, { block: { extrinsics, header } }: SignedBlock, allEvents: EventRecord[], status: ExtrinsicStatus): { events?: EventRecord[], txIndex?: number } { // extrinsics to hashes - for (const [index, x] of extrinsics.entries()) { + for (const [txIndex, x] of extrinsics.entries()) { if (x.hash.eq(txHash)) { - return allEvents.filter(({ phase }) => - // only ApplyExtrinsic has the extrinsic index - phase.isApplyExtrinsic && phase.asApplyExtrinsic.eqn(index) - ); + return { + events: allEvents.filter(({ phase }) => + phase.isApplyExtrinsic && + phase.asApplyExtrinsic.eqn(txIndex) + ), + txIndex + }; } } @@ -24,5 +27,5 @@ export function filterEvents (txHash: H256, { block: { extrinsics, header } }: S l.warn(`block ${header.hash.toHex()}: Unable to find extrinsic ${txHash.toHex()} inside ${allHashes.join(', ')}`); } - return undefined; + return {}; } diff --git a/packages/types/src/types/extrinsic.ts b/packages/types/src/types/extrinsic.ts index fa400f2b5e..9e4bfc59df 100644 --- a/packages/types/src/types/extrinsic.ts +++ b/packages/types/src/types/extrinsic.ts @@ -22,6 +22,7 @@ export interface ISubmittableResult { readonly isInBlock: boolean; readonly isWarning: boolean; readonly txHash: Hash; + readonly txIndex?: number; filterRecords (section: string, method: string): EventRecord[]; findRecord (section: string, method: string): EventRecord | undefined;