diff --git a/packages/types/src/Bytes.spec.ts b/packages/types/src/Bytes.spec.ts index 4f44e00c01..d74bbc6a90 100644 --- a/packages/types/src/Bytes.spec.ts +++ b/packages/types/src/Bytes.spec.ts @@ -15,6 +15,12 @@ describe('Bytes', () => { ).toEqual(CODE); }); + it('decodes from Array', () => { + expect( + new Bytes([0x3a, 0x63, 0x6f, 0x64, 0x65]).toU8a() + ).toEqual(CODE); + }); + it('creates via storagedata (no prefix)', () => { expect( new Bytes( diff --git a/packages/types/src/Bytes.ts b/packages/types/src/Bytes.ts index b79f8ceeea..99c3bc1a3e 100644 --- a/packages/types/src/Bytes.ts +++ b/packages/types/src/Bytes.ts @@ -2,7 +2,7 @@ // This software may be modified and distributed under the terms // of the Apache-2.0 license. See the LICENSE file for details. -import { hexToU8a, isHex, isString, isU8a, u8aToU8a } from '@polkadot/util'; +import { isString, isU8a, u8aToU8a } from '@polkadot/util'; import { AnyU8a } from './types'; import Compact from './codec/Compact'; @@ -26,10 +26,8 @@ export default class Bytes extends U8a { // StorageData to cater for the _specific_ problematic case const StorageData = require('./StorageData').default; - if (isHex(value)) { - // FIXME We manually add the length prefix for hex for now - // https://github.com/paritytech/substrate/issues/889 - const u8a = hexToU8a(value); + if (Array.isArray(value) || isString(value)) { + const u8a = u8aToU8a(value); return Bytes.decodeBytes( Compact.addLengthPrefix(u8a) @@ -51,8 +49,6 @@ export default class Bytes extends U8a { const [offset, length] = Compact.decodeU8a(value); return value.subarray(offset, offset + length.toNumber()); - } else if (Array.isArray(value) || isString(value)) { - return Bytes.decodeBytes(u8aToU8a(value)); } return value; diff --git a/packages/types/src/Extrinsic.spec.ts b/packages/types/src/Extrinsic.spec.ts index ada99676e9..bb1557312a 100644 --- a/packages/types/src/Extrinsic.spec.ts +++ b/packages/types/src/Extrinsic.spec.ts @@ -3,7 +3,9 @@ // of the Apache-2.0 license. See the LICENSE file for details. import extrinsics from '@polkadot/extrinsics/static'; +import { hexToU8a, u8aToHex } from '@polkadot/util'; +import Compact from './codec/Compact'; import Extrinsic from './Extrinsic'; import Method from './Method'; @@ -31,4 +33,24 @@ describe('Extrinsic', () => { expect(extrinsic.callIndex).toEqual(new Uint8Array([2, 0])); expect(extrinsic.args[0].toString()).toEqual('5CPaGq4KcmntaboAxg5nyqGXdyzaBV2hj6PvhNA3syigiRg8'); }); + + it('decodes an actual transaction with indexes (new format)', () => { + const extrinsic = new Extrinsic( + u8aToHex( + Compact.addLengthPrefix( + hexToU8a( + '0x8110f8e1ebdd3cdef7423d24fe68f3863945ea21c190907d7f3394ddf153f633c77b894af36f7a36e7ec767f4593bfd8d084b66d805605905054327a08ff6041870804270e0200ff0e6422725af0e9aede3bef6eba77bc87afadf60b9735057ae93801f4c472ad7b00407a10f35a00000000000000000000' + ) + ) + ) + ); + + expect(extrinsic.isSigned).toEqual(true); + expect(extrinsic.signature.signer.toU8a()).toEqual(new Uint8Array([0x10])); + expect(extrinsic.signature.signature.toHex()).toEqual('0xf8e1ebdd3cdef7423d24fe68f3863945ea21c190907d7f3394ddf153f633c77b894af36f7a36e7ec767f4593bfd8d084b66d805605905054327a08ff60418708'); + expect(extrinsic.signature.nonce.toNumber()).toEqual(1); + expect(extrinsic.signature.era.toU8a()).toEqual(new Uint8Array([0x27, 0x0e])); + expect(extrinsic.callIndex).toEqual(new Uint8Array([2, 0])); + expect(extrinsic.args[0].toString()).toEqual('5CPaGq4KcmntaboAxg5nyqGXdyzaBV2hj6PvhNA3syigiRg8'); + }); }); diff --git a/packages/types/src/Extrinsic.ts b/packages/types/src/Extrinsic.ts index 7e20672272..14c2f9426e 100644 --- a/packages/types/src/Extrinsic.ts +++ b/packages/types/src/Extrinsic.ts @@ -5,7 +5,7 @@ import { KeyringPair } from '@polkadot/keyring/types'; import { AnyNumber, AnyU8a, Codec } from './types'; -import { hexToU8a, isHex, isU8a, u8aToHex } from '@polkadot/util'; +import { isHex, isU8a, u8aToHex, u8aToU8a } from '@polkadot/util'; import { blake2AsU8a } from '@polkadot/util-crypto'; import Compact from './codec/Compact'; @@ -42,15 +42,20 @@ export default class Extrinsic extends Struct { } static decodeExtrinsic (value: ExtrinsicValue | AnyU8a | Method): ExtrinsicValue | Array | Uint8Array { - if (isHex(value)) { - // FIXME We manually add the length prefix for hex for now - // https://github.com/paritytech/substrate/issues/889 + if (Array.isArray(value) || isHex(value)) { // Instead of the block below, it should simply be: // return Extrinsic.decodeExtrinsic(hexToU8a(value as string)); - const u8a = hexToU8a(value); + const u8a = u8aToU8a(value); + + // HACK 11 Jan 2019 - before https://github.com/paritytech/substrate/pull/1388 + // extrinsics didn't have the length, cater for both approaches + const [offset, length] = Compact.decodeU8a(u8a); + const withPrefix = u8a.length === (offset + length.toNumber()); return Extrinsic.decodeExtrinsic( - Compact.addLengthPrefix(u8a) + withPrefix + ? u8a + : Compact.addLengthPrefix(u8a) ); } else if (isU8a(value)) { const [offset, length] = Compact.decodeU8a(value);