From e8ca742838552375089933e017fb6fdb14beb8ab Mon Sep 17 00:00:00 2001 From: Jaco Greeff Date: Mon, 15 Oct 2018 13:03:02 +0200 Subject: [PATCH] SignedBlock extrinsic decoding (era) (#295) --- packages/types/src/Extrinsic.spec.js | 2 -- packages/types/src/ExtrinsicEra.ts | 15 ++++++++++----- packages/types/src/ExtrinsicSignature.ts | 5 +++++ packages/types/src/SignedBlock.rpc.json | 2 +- packages/types/src/SignedBlock.spec.js | 20 ++++++++++++++++++-- 5 files changed, 34 insertions(+), 10 deletions(-) diff --git a/packages/types/src/Extrinsic.spec.js b/packages/types/src/Extrinsic.spec.js index db7d6d6799..24d8dc7247 100644 --- a/packages/types/src/Extrinsic.spec.js +++ b/packages/types/src/Extrinsic.spec.js @@ -23,8 +23,6 @@ describe('Extrinsic', () => { it('decodes an actual transaction with indexes', () => { const extrinsic = new Extrinsic('0x8110f8e1ebdd3cdef7423d24fe68f3863945ea21c190907d7f3394ddf153f633c77b894af36f7a36e7ec767f4593bfd8d084b66d805605905054327a08ff604187080100000000000000270e0100ff0e6422725af0e9aede3bef6eba77bc87afadf60b9735057ae93801f4c472ad7b00407a10f35a00000000000000000000'); - console.error('signature', extrinsic.args); - expect(extrinsic.isSigned).toEqual(true); expect(extrinsic.signature.signer.toU8a()).toEqual(new Uint8Array([0x10])); expect(extrinsic.signature.signature.toHex()).toEqual('0xf8e1ebdd3cdef7423d24fe68f3863945ea21c190907d7f3394ddf153f633c77b894af36f7a36e7ec767f4593bfd8d084b66d805605905054327a08ff60418708'); diff --git a/packages/types/src/ExtrinsicEra.ts b/packages/types/src/ExtrinsicEra.ts index 64a46cfcef..06c893a96d 100644 --- a/packages/types/src/ExtrinsicEra.ts +++ b/packages/types/src/ExtrinsicEra.ts @@ -7,13 +7,12 @@ import { AnyU8a } from './types'; import toU8a from '@polkadot/util/u8a/toU8a'; import U8a from './codec/U8a'; -import U8aFixed from './codec/U8aFixed'; -export default class ExtrinsicEra extends U8aFixed { +export default class ExtrinsicEra extends U8a { constructor (value?: AnyU8a) { - const decoded = ExtrinsicEra.decodeExtrinsicEra(value); - - super(decoded, (decoded.length * 8) as any); + super( + ExtrinsicEra.decodeExtrinsicEra(value) + ); } static decodeExtrinsicEra (value?: AnyU8a): Uint8Array { @@ -29,4 +28,10 @@ export default class ExtrinsicEra extends U8aFixed { return new Uint8Array([0]); } + + fromU8a (input: Uint8Array): ExtrinsicEra { + super.fromU8a(ExtrinsicEra.decodeExtrinsicEra(input)); + + return this; + } } diff --git a/packages/types/src/ExtrinsicSignature.ts b/packages/types/src/ExtrinsicSignature.ts index 66d8ab5127..631db46522 100644 --- a/packages/types/src/ExtrinsicSignature.ts +++ b/packages/types/src/ExtrinsicSignature.ts @@ -7,6 +7,7 @@ import { AnyNumber, AnyU8a } from './types'; import isU8a from '@polkadot/util/is/u8a'; import u8aConcat from '@polkadot/util/u8a/concat'; +import u8aToU8a from '@polkadot/util/u8a/toU8a'; import Struct from './codec/Struct'; import Address from './Address'; @@ -121,6 +122,10 @@ export default class ExtrinsicSignature extends Struct { return this; } + fromJSON (input: any) { + return this.fromU8a(u8aToU8a(input)); + } + fromU8a (input: Uint8Array): ExtrinsicSignature { const version = input[0]; diff --git a/packages/types/src/SignedBlock.rpc.json b/packages/types/src/SignedBlock.rpc.json index e02bab9efd..bcf8a76bbe 100644 --- a/packages/types/src/SignedBlock.rpc.json +++ b/packages/types/src/SignedBlock.rpc.json @@ -1 +1 @@ -{"jsonrpc":"2.0","result":{"block":{"extrinsics":["0x010200dd2bb75b00000000"],"header":{"digest":{"logs":[]},"extrinsicsRoot":"0x06811f569c9b822d10c659695ec4b1f6391472b3a65ecc78131485bc3fafe780","number":2769,"parentHash":"0x89c31b0f09782a2c27c0be0c7e2f096b13ce6541a5d14cc43a9553e50a89314a","stateRoot":"0x6e4e88dc766d13c8975e7806e30cc1627e9553a2ebe59ab123f985d1c925c5ff"}},"justification":{"hash":"0x7ac267bb86a5b674582fba9e84d3e3e9988621124c3e33358f7771224d176795","round_number":0,"signatures":[["0xd172a74cda4c865912c32ba0a80a57ae69abae410e5ccb59dee84e2f4432db4f","0xf9aa2cd44ee75a40ec230b589f847e1cf1a921f4a85e9825f9cd3892d29eeda628c7bc44b9f55ec305c1ae745d6b96e163338bbd9ae262c60626a50405868701"]]}},"id":16} +{"jsonrpc":"2.0","result":{"block":{"extrinsics":["0x0102004629c35b00000000","0x8110f8e1ebdd3cdef7423d24fe68f3863945ea21c190907d7f3394ddf153f633c77b894af36f7a36e7ec767f4593bfd8d084b66d805605905054327a08ff604187080100000000000000270e0100ff0e6422725af0e9aede3bef6eba77bc87afadf60b9735057ae93801f4c472ad7b00407a10f35a00000000000000000000"],"header":{"digest":{"logs":[]},"extrinsicsRoot":"0x79e749f5b04d6fde65503874daf1ca2a95509dfada574565fb81c11af236397c","number":206053,"parentHash":"0x6799fcd718579b07900bde8e14e2a1bde1c386f4539ef9cbb4407eebf5cb4857","stateRoot":"0xbfe02f7c26e5dad1226eccb1f4ef5306312602f7e1edbb9be50e8b87d9c7840b"}},"justification":{"hash":"0xfab4bb3a8b0a072d3d09858dc865ad2750b2e708536b6dacc89fad369eba781a","round_number":0,"signatures":[["0x8101764f45778d4980dadaceee6e8af2517d3ab91ac9bec9cd1714fa5994081c","0x84e343ddfd126d7c7a5c8feeac33dae947a08e4bee7b94080448fd31ae00f3a5e1a3e916926535976671ee61c430c215dbda1a781a7692a6ffc8f955b9d2d603"],["0x82c39b31a2b79a90f8e66e7a77fdb85a4ed5517f2ae39f6a80565e8ecae85cf5","0x67089e8cbf4fec1c362de972c1430c468f572ceba0a26ca1ed4782155efc3ae2156cef02fb57f0012fe7766d932d2ccde9fd8d48bb4c869d7461079b66c1f002"],["0x063d7787ebca768b7445dfebe7d62cbb1625ff4dba288ea34488da266dd6dca5","0x9822441c8196fe9737e8d1aa49f4c0da046c15eba695fa89f98e2736fcc747e5ae88720fb554cc509d1e405e04194fda10a956eb85c76bde057ba01ffeef8507"],["0x4de37a07567ebcbf8c64568428a835269a566723687058e017b6d69db00a77e7","0x1753981ad2dd67d18ca7026b2b2e8c3e0071da561eda8e3532a5b4a713415248f1df6ef32b32136ba2cb75cd4b4165aa9e1abe259b533046fb199e41b67f9406"]]}},"id":8} diff --git a/packages/types/src/SignedBlock.spec.js b/packages/types/src/SignedBlock.spec.js index 01d1bb7565..bf59d459c9 100644 --- a/packages/types/src/SignedBlock.spec.js +++ b/packages/types/src/SignedBlock.spec.js @@ -11,12 +11,28 @@ describe('SignedBlock', () => { it('has the correct stateRoot', () => { expect( block.block.header.stateRoot.toString() - ).toEqual('0x6e4e88dc766d13c8975e7806e30cc1627e9553a2ebe59ab123f985d1c925c5ff'); + ).toEqual('0xbfe02f7c26e5dad1226eccb1f4ef5306312602f7e1edbb9be50e8b87d9c7840b'); }); it('has the justification', () => { expect( block.justification.hash.toHex() - ).toEqual('0x7ac267bb86a5b674582fba9e84d3e3e9988621124c3e33358f7771224d176795'); + ).toEqual('0xfab4bb3a8b0a072d3d09858dc865ad2750b2e708536b6dacc89fad369eba781a'); + }); + + describe('extrinsics', () => { + const extrinsics = block.block.extrinsics; + + it('has the correct callIndex for the first', () => { + const x = extrinsics.get(0); + + expect(x.callIndex).toEqual(new Uint8Array([2, 0])); + }); + + it('has the correct callIndex for the second', () => { + const x = extrinsics.get(1); + + expect(x.callIndex).toEqual(new Uint8Array([1, 0])); + }); }); });