From 53ab0127cd26c0d6c092c7b9726ce6fcd630321c Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Thu, 16 May 2019 17:05:16 +0200 Subject: [PATCH] Create submittable via hex (#919) * Create submittable via hex * typo --- packages/api/src/Base.ts | 9 +- packages/api/src/SubmittableExtrinsic.ts | 2 +- packages/api/src/types.ts | 1 + packages/api/test/e2e/promise-tx.spec.js | 129 +++++++---------------- 4 files changed, 44 insertions(+), 97 deletions(-) diff --git a/packages/api/src/Base.ts b/packages/api/src/Base.ts index b65faaadd7..733456123a 100644 --- a/packages/api/src/Base.ts +++ b/packages/api/src/Base.ts @@ -510,6 +510,9 @@ export default abstract class ApiBase implement } private decorateExtrinsics (extrinsics: ModulesWithMethods, onCall: OnCallDefinition): SubmittableExtrinsics { + const creator = (value: Uint8Array | string): SubmittableExtrinsic => + createSubmittable(this.type, this._rx as ApiInterface$Rx, onCall, value); + return Object.keys(extrinsics).reduce((result, sectionName) => { const section = extrinsics[sectionName]; @@ -520,14 +523,14 @@ export default abstract class ApiBase implement }, {} as SubmittableModuleExtrinsics); return result; - }, {} as SubmittableExtrinsics); + }, creator as SubmittableExtrinsics); } private decorateExtrinsicEntry (method: MethodFunction, onCall: OnCallDefinition): SubmittableExtrinsicFunction { - const decorated: any = (...params: Array): SubmittableExtrinsic => + const decorated = (...params: Array): SubmittableExtrinsic => createSubmittable(this.type, this._rx as ApiInterface$Rx, onCall, method(...params)); - return this.decorateFunctionMeta(method, decorated) as SubmittableExtrinsicFunction; + return this.decorateFunctionMeta(method, decorated as any) as SubmittableExtrinsicFunction; } private decorateStorage (storage: Storage, onCall: OnCallDefinition): QueryableStorage { diff --git a/packages/api/src/SubmittableExtrinsic.ts b/packages/api/src/SubmittableExtrinsic.ts index e628914eaf..7135abe06f 100644 --- a/packages/api/src/SubmittableExtrinsic.ts +++ b/packages/api/src/SubmittableExtrinsic.ts @@ -69,7 +69,7 @@ export interface SubmittableExtrinsic extends I signAndSend (account: KeyringPair | string | AccountId | Address, statusCb: StatusCb): SumbitableResultSubscription; } -export default function createSubmittableExtrinsic (type: ApiType, api: ApiInterface$Rx, onCall: OnCallDefinition, extrinsic: Method, trackingCb?: (result: SubmittableResult) => any): SubmittableExtrinsic { +export default function createSubmittableExtrinsic (type: ApiType, api: ApiInterface$Rx, onCall: OnCallDefinition, extrinsic: Method | Uint8Array | string, trackingCb?: (result: SubmittableResult) => any): SubmittableExtrinsic { const _extrinsic = new (getTypeRegistry().getOrThrow('Extrinsic'))(extrinsic) as SubmittableExtrinsic; const _noStatusCb = type === 'rxjs'; diff --git a/packages/api/src/types.ts b/packages/api/src/types.ts index f6e9e3396a..613db4a5d2 100644 --- a/packages/api/src/types.ts +++ b/packages/api/src/types.ts @@ -103,6 +103,7 @@ export interface SubmittableModuleExtrinsics { } export interface SubmittableExtrinsics { + (extrinsic: Uint8Array | string): SubmittableExtrinsic; [index: string]: SubmittableModuleExtrinsics; } diff --git a/packages/api/test/e2e/promise-tx.spec.js b/packages/api/test/e2e/promise-tx.spec.js index de1ff22fd5..6fbcffb6b5 100644 --- a/packages/api/test/e2e/promise-tx.spec.js +++ b/packages/api/test/e2e/promise-tx.spec.js @@ -8,9 +8,28 @@ import { randomAsHex } from '@plugnet/util-crypto'; import Api from '../../src/promise'; import WsProvider from '../../../rpc-provider/src/ws'; -import SingleAccountSigner from "../util/SingleAccountSigner"; +import SingleAccountSigner from '../util/SingleAccountSigner'; describe.skip('e2e transactions', () => { + // log all events for the transfare, calling done() when finalized + const logEvents = (done) => + ({ events, status }) => { + console.log('Transaction status:', status.type); + + if (status.isFinalized) { + console.log('Completed at block hash', status.value.toHex()); + console.log('Events:'); + + events.forEach(({ phase, event: { data, method, section } }) => { + console.log('\t', phase.toString(), `: ${section}.${method}`, data.toString()); + }); + + if (events.length) { + done(); + } + } + }; + const keyring = testingPairs({ type: 'ed25519' }); let api; @@ -29,28 +48,23 @@ describe.skip('e2e transactions', () => { jest.setTimeout(5000); }); + it('can submit an extrinsic from hex', async (done) => { + const nonce = await api.query.system.accountNonce(keyring.dave.address()); + const hex = api.tx.balances + .transfer(keyring.eve.address(), 12345) + .sign(keyring.dave, { nonce }) + .toHex(); + + return api.tx(hex).send(logEvents(done)); + }); + it('makes a transfer (sign, then send)', async (done) => { const nonce = await api.query.system.accountNonce(keyring.dave.address()); return api.tx.balances .transfer(keyring.eve.address(), 12345) .sign(keyring.dave, { nonce }) - .send(({ events, status }) => { - console.log('Transaction status:', status.type); - - if (status.isFinalized) { - console.log('Completed at block hash', status.value.toHex()); - console.log('Events:'); - - events.forEach(({ phase, event: { data, method, section } }) => { - console.log('\t', phase.toString(), `: ${section}.${method}`, data.toString()); - }); - - if (events.length) { - done(); - } - } - }); + .send(logEvents(done)); }); it('makes a transfer (sign, then send - compat version)', async (done) => { @@ -59,43 +73,13 @@ describe.skip('e2e transactions', () => { return api.tx.balances .transfer(keyring.eve.address(), 12345) .sign(keyring.dave, nonce) - .send(({ events, status }) => { - console.log('Transaction status:', status.type); - - if (status.isFinalized) { - console.log('Completed at block hash', status.value.toHex()); - console.log('Events:'); - - events.forEach(({ phase, event: { data, method, section } }) => { - console.log('\t', phase.toString(), `: ${section}.${method}`, data.toString()); - }); - - if (events.length) { - done(); - } - } - }); + .send(logEvents(done)); }); it('makes a transfer (signAndSend)', async (done) => { return api.tx.balances .transfer(keyring.eve.address(), 12345) - .signAndSend(keyring.dave, ({ events, status }) => { - console.log('Transaction status:', status.type); - - if (status.isFinalized) { - console.log('Completed at block hash', status.value.toHex()); - console.log('Events:'); - - events.forEach(({ phase, event: { data, method, section } }) => { - console.log('\t', phase.toString(), `: ${section}.${method}`, data.toString()); - }); - - if (events.length) { - done(); - } - } - }); + .signAndSend(keyring.dave, logEvents(done)); }); it('makes a transfer (signAndSend via Signer)', async (done) => { @@ -105,22 +89,7 @@ describe.skip('e2e transactions', () => { return api.tx.balances .transfer(keyring.eve.address(), 12345) - .signAndSend(keyring.dave.address(), ({ events, status }) => { - console.log('Transaction status:', status.type); - - if (status.isFinalized) { - console.log('Completed at block hash', status.value.toHex()); - console.log('Events:'); - - events.forEach(({ phase, event: { data, method, section } }) => { - console.log('\t', phase.toString(), `: ${section}.${method}`, data.toString()); - }); - - if (events.length) { - done(); - } - } - }); + .signAndSend(keyring.dave.address(), logEvents(done)); }); it('makes a transfer (signAndSend via Signer) - sad path', async () => { @@ -171,39 +140,13 @@ describe.skip('e2e transactions', () => { function doOne (cb) { return api.tx.balances .transfer(pair.address(), 123456) - .signAndSend(keyring.dave, ({ events, status }) => { - console.log('One: Transaction status:', status.type); - - if (status.isFinalized) { - console.log('Completed at block hash', status.value.toHex()); - console.log('Events:'); - - events.forEach(({ phase, event: { data, method, section } }) => { - console.log('\t', phase.toString(), `: ${section}.${method}`, data.toString()); - }); - - cb() - } - }); + .signAndSend(keyring.dave, logEvents(cb)); }; function doTwo (cb) { return api.tx.balances .transfer(keyring.alice.address(), 12345) - .signAndSend(pair, ({ events, status }) => { - console.log('One: Transaction status:', status.type); - - if (status.isFinalized) { - console.log('Completed at block hash', status.value.toHex()); - console.log('Events:'); - - events.forEach(({ phase, event: { data, method, section } }) => { - console.log('\t', phase.toString(), `: ${section}.${method}`, data.toString()); - }); - - cb() - } - }); + .signAndSend(pair, logEvents(cb)); } // return doTwo(done);