diff --git a/CHANGELOG.md b/CHANGELOG.md index b9f100e682..809e68fb68 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,7 @@ Changes: - Add explicit support for `Call` typegen (inclusive of non-defaults) - Deupe `wss://` handling in `polkadot-types-from-{chain, defs}` - Allow for optional `definitions.ts` in typegen (only use chain) +- Optimize `Compact<*>` decoding in Uint8Array streams - Update to latest Substrate, Kusama & Polkadot static metadata diff --git a/packages/types-codec/src/base/Compact.ts b/packages/types-codec/src/base/Compact.ts index 782f2f4756..3ca43ac109 100644 --- a/packages/types-codec/src/base/Compact.ts +++ b/packages/types-codec/src/base/Compact.ts @@ -5,7 +5,7 @@ import type { BN } from '@polkadot/util'; import type { HexString } from '@polkadot/util/types'; import type { AnyJson, AnyNumber, CodecClass, ICompact, Inspect, INumber, IU8a, Registry } from '../types'; -import { compactFromU8a, compactToU8a, isBigInt, isBn, isNumber, isString } from '@polkadot/util'; +import { compactFromU8a, compactToU8a, isU8a } from '@polkadot/util'; import { typeToConstructor } from '../utils'; @@ -48,17 +48,17 @@ export class Compact implements ICompact { /** @internal */ public static decodeCompact (registry: Registry, Type: CodecClass, value: Compact | AnyNumber): [T, number] { - if (value instanceof Compact) { + if (isU8a(value)) { + const [decodedLength, bn] = compactFromU8a(value); + + return [new Type(registry, bn), decodedLength]; + } else if (value instanceof Compact) { return [new Type(registry, value.#raw), 0]; } else if (value instanceof Type) { return [value, 0]; - } else if (isString(value) || isNumber(value) || isBn(value) || isBigInt(value)) { - return [new Type(registry, value), 0]; } - const [decodedLength, bn] = compactFromU8a(value); - - return [new Type(registry, bn), decodedLength]; + return [new Type(registry, value), 0]; } /** diff --git a/packages/types/src/metadata/decorate/extrinsics/createUnchecked.ts b/packages/types/src/metadata/decorate/extrinsics/createUnchecked.ts index 08f3da175c..ccd082d359 100644 --- a/packages/types/src/metadata/decorate/extrinsics/createUnchecked.ts +++ b/packages/types/src/metadata/decorate/extrinsics/createUnchecked.ts @@ -16,7 +16,7 @@ export function createUnchecked (registry: Registry, section: string, callIndex: const expectedArgs = callMetadata.fields; const funcName = stringCamelCase(callMetadata.name); - const extrinsicFn = (...args: any[]): Call => { + const extrinsicFn = (...args: unknown[]): Call => { assert(expectedArgs.length === args.length, () => `Extrinsic ${section}.${funcName} expects ${expectedArgs.length} arguments, got ${args.length}.`); return registry.createTypeUnsafe('Call', [{ args, callIndex }, callMetadata]); diff --git a/packages/types/src/metadata/decorate/extrinsics/index.spec.ts b/packages/types/src/metadata/decorate/extrinsics/index.spec.ts index b8a22c464a..8a6de5f9de 100644 --- a/packages/types/src/metadata/decorate/extrinsics/index.spec.ts +++ b/packages/types/src/metadata/decorate/extrinsics/index.spec.ts @@ -64,7 +64,7 @@ describe('decorateExtrinsics', (): void => { it('should return properly-encoded transactions', (): void => { expect( - registry.createType('Extrinsic', extrinsics.timestamp.set([10101])).toU8a() + registry.createType('Extrinsic', extrinsics.timestamp.set(32)).toU8a() ).toEqual( new Uint8Array([ // length (encoded) @@ -74,7 +74,7 @@ describe('decorateExtrinsics', (): void => { // index 3, 0, // values, Compact - 116 + 32 << 2 ]) ); }); diff --git a/packages/types/src/metadata/decorate/index.spec.ts b/packages/types/src/metadata/decorate/index.spec.ts index 8af857e1f1..c16321263f 100644 --- a/packages/types/src/metadata/decorate/index.spec.ts +++ b/packages/types/src/metadata/decorate/index.spec.ts @@ -31,7 +31,7 @@ describe('Decorated', () => { const tx = decorateExtrinsics(registry, metadata.asLatest, metadata.version); expect( - registry.createType('Extrinsic', tx.timestamp.set([10101])).toU8a() + registry.createType('Extrinsic', tx.timestamp.set(63)).toU8a() ).toEqual( new Uint8Array([ // length (encoded) @@ -41,7 +41,7 @@ describe('Decorated', () => { // index 3, 0, // values, Compact - 116 + 63 << 2 ]) ); });