Create submittable via hex (#919)

* Create submittable via hex

* typo
This commit is contained in:
Jaco Greeff
2019-06-12 16:45:45 +12:00
committed by Ian He
parent a487bda3bd
commit 53ab0127cd
4 changed files with 44 additions and 97 deletions
+6 -3
View File
@@ -510,6 +510,9 @@ export default abstract class ApiBase<CodecResult, SubscriptionResult> implement
}
private decorateExtrinsics<C, S> (extrinsics: ModulesWithMethods, onCall: OnCallDefinition<C, S>): SubmittableExtrinsics<C, S> {
const creator = (value: Uint8Array | string): SubmittableExtrinsic<C, S> =>
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<CodecResult, SubscriptionResult> implement
}, {} as SubmittableModuleExtrinsics<C, S>);
return result;
}, {} as SubmittableExtrinsics<C, S>);
}, creator as SubmittableExtrinsics<C, S>);
}
private decorateExtrinsicEntry<C, S> (method: MethodFunction, onCall: OnCallDefinition<C, S>): SubmittableExtrinsicFunction<C, S> {
const decorated: any = (...params: Array<CodecArg>): SubmittableExtrinsic<C, S> =>
const decorated = (...params: Array<CodecArg>): SubmittableExtrinsic<C, S> =>
createSubmittable(this.type, this._rx as ApiInterface$Rx, onCall, method(...params));
return this.decorateFunctionMeta(method, decorated) as SubmittableExtrinsicFunction<C, S>;
return this.decorateFunctionMeta(method, decorated as any) as SubmittableExtrinsicFunction<C, S>;
}
private decorateStorage<C, S> (storage: Storage, onCall: OnCallDefinition<C, S>): QueryableStorage<C, S> {
+1 -1
View File
@@ -69,7 +69,7 @@ export interface SubmittableExtrinsic<CodecResult, SubscriptionResult> extends I
signAndSend (account: KeyringPair | string | AccountId | Address, statusCb: StatusCb): SumbitableResultSubscription<CodecResult, SubscriptionResult>;
}
export default function createSubmittableExtrinsic<CodecResult, SubscriptionResult> (type: ApiType, api: ApiInterface$Rx, onCall: OnCallDefinition<CodecResult, SubscriptionResult>, extrinsic: Method, trackingCb?: (result: SubmittableResult) => any): SubmittableExtrinsic<CodecResult, SubscriptionResult> {
export default function createSubmittableExtrinsic<CodecResult, SubscriptionResult> (type: ApiType, api: ApiInterface$Rx, onCall: OnCallDefinition<CodecResult, SubscriptionResult>, extrinsic: Method | Uint8Array | string, trackingCb?: (result: SubmittableResult) => any): SubmittableExtrinsic<CodecResult, SubscriptionResult> {
const _extrinsic = new (getTypeRegistry().getOrThrow('Extrinsic'))(extrinsic) as SubmittableExtrinsic<CodecResult, SubscriptionResult>;
const _noStatusCb = type === 'rxjs';
+1
View File
@@ -103,6 +103,7 @@ export interface SubmittableModuleExtrinsics<CodecResult, SubscriptionResult> {
}
export interface SubmittableExtrinsics<CodecResult, SubscriptionResult> {
(extrinsic: Uint8Array | string): SubmittableExtrinsic<CodecResult, SubscriptionResult>;
[index: string]: SubmittableModuleExtrinsics<CodecResult, SubscriptionResult>;
}
+36 -93
View File
@@ -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);