Expose txHash on submittable results (#4387)

* Expose txHash on submittable results

* CHANGELOG

* CHANGELOG
This commit is contained in:
Jaco
2021-12-24 09:08:56 +02:00
committed by GitHub
parent 938eb7d390
commit 9800a3b55d
6 changed files with 29 additions and 14 deletions
+7
View File
@@ -2,9 +2,16 @@
## master
Contributed:
- Expose `storageDepositLimit` on contract options (Thanks to https://github.com/kwingram25)
Changes:
- Expose `txHash` on submittable results, e.g. `tx.signAndSend(..., ({ txHash }) => ...)`
- Align casing for TS & exposed queries (adjusts for `ALLCAPS` entries)
- Split `types-augment` into `registry` & `lookup` variants (better control)
- Additional tests for `Option` codec (explicit in expectations)
## 7.0.2 Dec 21, 2021
@@ -65,6 +65,7 @@ export interface SubmittableResultValue {
events?: EventRecord[];
internalError?: Error;
status: ExtrinsicStatus;
txHash: Hash;
}
export interface SubmittableExtrinsic<ApiType extends ApiTypes, R extends ISubmittableResult = ISubmittableResult> extends Extrinsic {
+5 -2
View File
@@ -1,7 +1,7 @@
// Copyright 2017-2021 @polkadot/api authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { DispatchError, DispatchInfo, EventRecord, ExtrinsicStatus } from '@polkadot/types/interfaces';
import type { DispatchError, DispatchInfo, EventRecord, ExtrinsicStatus, Hash } from '@polkadot/types/interfaces';
import type { AnyJson, ISubmittableResult } from '@polkadot/types/types';
import type { SubmittableResultValue } from './types';
@@ -45,12 +45,15 @@ export class SubmittableResult implements ISubmittableResult {
public readonly status: ExtrinsicStatus;
constructor ({ dispatchError, dispatchInfo, events, internalError, status }: SubmittableResultValue) {
public readonly txHash: Hash;
constructor ({ dispatchError, dispatchInfo, events, internalError, status, txHash }: SubmittableResultValue) {
this.dispatchError = dispatchError || extractError(events);
this.dispatchInfo = dispatchInfo || extractInfo(events);
this.events = events || [];
this.internalError = internalError;
this.status = status;
this.txHash = txHash;
}
public get isCompleted (): boolean {
+10 -7
View File
@@ -233,10 +233,11 @@ export function createClass <ApiType extends ApiTypes> ({ api, apiType, decorate
);
};
#observeStatus = (hash: Hash, status: ExtrinsicStatus): Observable<ISubmittableResult> => {
#observeStatus = (txHash: Hash, status: ExtrinsicStatus): Observable<ISubmittableResult> => {
if (!status.isFinalized && !status.isInBlock) {
return of(this.#transformResult(new SubmittableResult({
status
status,
txHash
})));
}
@@ -247,14 +248,16 @@ export function createClass <ApiType extends ApiTypes> ({ api, apiType, decorate
return api.derive.tx.events(blockHash).pipe(
map(({ block, events }): ISubmittableResult =>
this.#transformResult(new SubmittableResult({
events: filterEvents(hash, block, events, status),
status
events: filterEvents(txHash, block, events, status),
status,
txHash
}))
),
catchError((internalError: Error) =>
of(this.#transformResult(new SubmittableResult({
internalError,
status
status,
txHash
})))
)
);
@@ -269,11 +272,11 @@ export function createClass <ApiType extends ApiTypes> ({ api, apiType, decorate
};
#observeSubscribe = (updateId = -1): Observable<ISubmittableResult> => {
const hash = this.hash;
const txHash = this.hash;
return api.rpc.author.submitAndWatchExtrinsic(this).pipe(
switchMap((status): Observable<ISubmittableResult> =>
this.#observeStatus(hash, status)
this.#observeStatus(txHash, status)
),
tap((status): void => {
this.#updateSigner(updateId, status);
+4 -4
View File
@@ -5,10 +5,10 @@ import type { EventRecord, ExtrinsicStatus, H256, SignedBlock } from '@polkadot/
import { l } from './logging';
export function filterEvents (extHash: H256, { block: { extrinsics, header } }: SignedBlock, allEvents: EventRecord[], status: ExtrinsicStatus): EventRecord[] | undefined {
export function filterEvents (txHash: H256, { block: { extrinsics, header } }: SignedBlock, allEvents: EventRecord[], status: ExtrinsicStatus): EventRecord[] | undefined {
// extrinsics to hashes
for (const [index, extrinsic] of extrinsics.entries()) {
if (extrinsic.hash.eq(extHash)) {
for (const [index, 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)
@@ -21,7 +21,7 @@ export function filterEvents (extHash: H256, { block: { extrinsics, header } }:
if (status.isInBlock) {
const allHashes = extrinsics.map((x) => x.hash.toHex());
l.warn(`block ${header.hash.toHex()}: Unable to find extrinsic ${extHash.toHex()} inside ${allHashes.join(', ')}`);
l.warn(`block ${header.hash.toHex()}: Unable to find extrinsic ${txHash.toHex()} inside ${allHashes.join(', ')}`);
}
return undefined;
+2 -1
View File
@@ -5,7 +5,7 @@ import type { AnyJson, AnyNumber, AnyTuple, AnyU8a, Codec } from '@polkadot/type
import type { HexString } from '@polkadot/util/types';
import type { ExtrinsicStatus } from '../interfaces/author';
import type { EcdsaSignature, Ed25519Signature, Sr25519Signature } from '../interfaces/extrinsics';
import type { Address, Balance, Call, H256, Index } from '../interfaces/runtime';
import type { Address, Balance, Call, H256, Hash, Index } from '../interfaces/runtime';
import type { DispatchError, DispatchInfo, EventRecord } from '../interfaces/system';
import type { ICompact, IKeyringPair, IMethod, IRuntimeVersion } from './interfaces';
import type { Registry } from './registry';
@@ -21,6 +21,7 @@ export interface ISubmittableResult {
readonly isFinalized: boolean;
readonly isInBlock: boolean;
readonly isWarning: boolean;
readonly txHash: Hash;
filterRecords (section: string, method: string): EventRecord[];
findRecord (section: string, method: string): EventRecord | undefined;