diff --git a/packages/api/src/promise/SubmittableExtrinsic.ts b/packages/api/src/promise/SubmittableExtrinsic.ts index 7e1cc8064e..34f179e670 100644 --- a/packages/api/src/promise/SubmittableExtrinsic.ts +++ b/packages/api/src/promise/SubmittableExtrinsic.ts @@ -7,7 +7,8 @@ import { AnyNumber, AnyU8a } from '@polkadot/types/types'; import { SubmittableSendResult } from '../types'; import { ApiPromiseInterface, UnsubFunction } from './types'; -import { EventRecord, Extrinsic, ExtrinsicStatus, Hash, Method, SignedBlock } from '@polkadot/types/index'; +import { EventRecord, Extrinsic, ExtrinsicStatus, Hash, Index, Method, SignedBlock } from '@polkadot/types/index'; +import { assert } from '@polkadot/util'; import filterEvents from '../util/filterEvents'; @@ -20,7 +21,6 @@ export default class SubmittableExtrinsic extends Extrinsic { this._api = api; } - // FIXME split into graph derivation once available private trackStatus (statusCb: (result: SubmittableSendResult) => any): (status: ExtrinsicStatus) => Promise { return async (status: ExtrinsicStatus): Promise => { let events: Array | undefined = undefined; @@ -54,4 +54,25 @@ export default class SubmittableExtrinsic extends Extrinsic { return this; } + + signAndSend (signerPair: KeyringPair, statusCb: (result: SubmittableSendResult) => any): Promise | UnsubFunction { + assert(this._api.hasSubscriptions, 'Api does not support subscriptions'); + + let unsubscribe: UnsubFunction | undefined; + + this._api.query.system + .accountNonce(signerPair.address()) + .then((nonce) => { + unsubscribe = this.sign(signerPair, nonce as Index).send(statusCb) as UnsubFunction; + }) + .catch(console.error); + + return (): void => { + if (unsubscribe) { + unsubscribe(); + } + + unsubscribe = undefined; + }; + } } diff --git a/packages/api/src/rx/SubmittableExtrinsic.ts b/packages/api/src/rx/SubmittableExtrinsic.ts index 1ff3d1b35b..c0d452d7cd 100644 --- a/packages/api/src/rx/SubmittableExtrinsic.ts +++ b/packages/api/src/rx/SubmittableExtrinsic.ts @@ -8,8 +8,8 @@ import { SubmittableSendResult } from '../types'; import { ApiRxInterface } from './types'; import { Observable, of, combineLatest } from 'rxjs'; -import { map, switchMap } from 'rxjs/operators'; -import { Extrinsic, ExtrinsicStatus, Hash, Method } from '@polkadot/types/index'; +import { first, map, switchMap } from 'rxjs/operators'; +import { Extrinsic, ExtrinsicStatus, Hash, Index, Method } from '@polkadot/types/index'; import filterEvents from '../util/filterEvents'; @@ -22,7 +22,6 @@ export default class SubmittableExtrinsic extends Extrinsic { this._api = api; } - // FIXME split into graph derivation once available private trackStatus = (status: ExtrinsicStatus): Observable => { if (status.type !== 'Finalised') { return of({ @@ -56,4 +55,15 @@ export default class SubmittableExtrinsic extends Extrinsic { return this; } + + signAndSend (signerPair: KeyringPair): Observable { + return this._api.query.system + .accountNonce(signerPair.address()) + .pipe( + first(), + switchMap((nonce) => + this.sign(signerPair, nonce as Index).send() + ) + ); + } }