signAndSend for SubmittableExtrinsic (#558)

* signAndSend for SubmittableExtrinsic

* signAndSend for ApiPromise

* Import odering
This commit is contained in:
Jaco Greeff
2019-01-10 18:02:39 +01:00
committed by GitHub
parent 7b89e55f9a
commit a083a6bb38
2 changed files with 36 additions and 5 deletions
@@ -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<void> {
return async (status: ExtrinsicStatus): Promise<void> => {
let events: Array<any> | undefined = undefined;
@@ -54,4 +54,25 @@ export default class SubmittableExtrinsic extends Extrinsic {
return this;
}
signAndSend (signerPair: KeyringPair, statusCb: (result: SubmittableSendResult) => any): Promise<Hash> | 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;
};
}
}
+13 -3
View File
@@ -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<SubmittableSendResult> => {
if (status.type !== 'Finalised') {
return of({
@@ -56,4 +55,15 @@ export default class SubmittableExtrinsic extends Extrinsic {
return this;
}
signAndSend (signerPair: KeyringPair): Observable<SubmittableSendResult> {
return this._api.query.system
.accountNonce(signerPair.address())
.pipe(
first(),
switchMap((nonce) =>
this.sign(signerPair, nonce as Index).send()
)
);
}
}