diff --git a/CHANGELOG.md b/CHANGELOG.md index 653ef899e4..ad82a96850 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,6 @@ # 1.1.0-beta.x +- Inject and use SignedExtensions by name from V11 metadata (V4 extrinsics only) - Add typings for `api.tx.*.*` - the `polkadot-types-from-chain` now also generates these - Remove additional V1-only derives `(staking.recentlyOffline`, `balances.nominatorsFor`) diff --git a/packages/api/src/base/Init.ts b/packages/api/src/base/Init.ts index a993b592c5..55adae5153 100644 --- a/packages/api/src/base/Init.ts +++ b/packages/api/src/base/Init.ts @@ -128,9 +128,12 @@ export default abstract class Init extends Decorate { const api = await ApiPromise.create({ provider, registry, signer }); const transfer = api.tx.balances.transfer(keyring.getPair('0xe659a7a1628cdd93febc04a4e0646ea20e9f5f0ce097d9a05290d4a9e054df4e').address, 12345); - await transfer.signAsync(aliceEd, {}); + await transfer.signAsync(aliceEd.address, {}); expect(transfer.signature.toHex()).toEqual( - '0x6b9ccc95afbd4e916d30c65c720f4f7b70a77db545735b48a763844aa5210e695aa346686bad1224af77d00bcfbf6fc8d2c216a60731027835d5a414186a2607' + // v1 extrinsic + // '0x6b9ccc95afbd4e916d30c65c720f4f7b70a77db545735b48a763844aa5210e695aa346686bad1224af77d00bcfbf6fc8d2c216a60731027835d5a414186a2607' + // v4 extrinsic + '0x0716cbdc3b649dad8741238bcc8e4336f859c518cf2b17a3427b2f5d0b8a79cf518da71b9ac71d92c517342e0978f297f5e05362babf5987d3f1c5ba3314af08' ); }); }); diff --git a/packages/types/src/codec/AbstractInt.ts b/packages/types/src/codec/AbstractInt.ts index cacd4529a4..93c47f6bb3 100644 --- a/packages/types/src/codec/AbstractInt.ts +++ b/packages/types/src/codec/AbstractInt.ts @@ -39,6 +39,7 @@ export default abstract class AbstractInt extends BN implements Codec { this._isNegative = isNegative; } + /** @internal */ public static decodeAbstracInt (value: AnyNumber, bitLength: UIntBitLength, isNegative: boolean): string { // This function returns a string, which will be passed in the BN // constructor. It would be ideal to actually return a BN, but there's a @@ -54,6 +55,7 @@ export default abstract class AbstractInt extends BN implements Codec { return bnToBn(value).toString(); } + /** @internal */ private static decodeAbstracIntU8a (value: Uint8Array, bitLength: UIntBitLength, isNegative: boolean): string { if (!value.length) { return '0'; diff --git a/packages/types/src/codec/BTreeMap.ts b/packages/types/src/codec/BTreeMap.ts index 87d26eaee7..54f660757e 100644 --- a/packages/types/src/codec/BTreeMap.ts +++ b/packages/types/src/codec/BTreeMap.ts @@ -42,6 +42,7 @@ export default class BTreeMap * - Map, where both key and value types are either * constructors or decodeable values for their types. * @param jsonMap + * @internal */ private static decodeBTreeMap (registry: Registry, KeyClass: Constructor, ValClass: Constructor, value: Uint8Array | string | Map): Map { if (!value) { @@ -57,6 +58,7 @@ export default class BTreeMap throw new Error('BTreeMap: cannot decode type'); } + /** @internal */ private static decodeBTreeMapFromU8a (registry: Registry, KeyClass: Constructor, ValClass: Constructor, u8a: Uint8Array): Map { const output = new Map(); const [offset, length] = Compact.decodeU8a(u8a); @@ -75,6 +77,7 @@ export default class BTreeMap return output; } + /** @internal */ private static decodeBTreeMapFromMap (registry: Registry, KeyClass: Constructor, ValClass: Constructor, value: Map): Map { const output = new Map(); diff --git a/packages/types/src/codec/BTreeSet.ts b/packages/types/src/codec/BTreeSet.ts index 7cfab93982..f578e7c139 100644 --- a/packages/types/src/codec/BTreeSet.ts +++ b/packages/types/src/codec/BTreeSet.ts @@ -37,6 +37,7 @@ export default class BTreeSet extends Set implements * - Set, where both key and value types are either * constructors or decodeable values for their types. * @param jsonSet + * @internal */ private static decodeBTreeSet (registry: Registry, ValClass: Constructor, value: Uint8Array | string | Set): Set { if (!value) { @@ -52,6 +53,7 @@ export default class BTreeSet extends Set implements throw new Error('BTreeSet: cannot decode type'); } + /** @internal */ private static decodeBTreeSetFromU8a (registry: Registry, ValClass: Constructor, u8a: Uint8Array): Set { const output = new Set(); const [offset, length] = Compact.decodeU8a(u8a); @@ -70,6 +72,7 @@ export default class BTreeSet extends Set implements return output; } + /** @internal */ private static decodeBTreeSetFromSet (registry: Registry, ValClass: Constructor, value: Set): Set { const output = new Set(); diff --git a/packages/types/src/codec/Compact.ts b/packages/types/src/codec/Compact.ts index 146f11a463..fbea690ec2 100644 --- a/packages/types/src/codec/Compact.ts +++ b/packages/types/src/codec/Compact.ts @@ -56,6 +56,7 @@ export default class Compact extends Base impleme return value; } + /** @internal */ public static decodeCompact (registry: Registry, Type: Constructor, value: Compact | AnyNumber): CompactEncodable { if (value instanceof Compact) { return new Type(registry, value.raw); diff --git a/packages/types/src/codec/Date.ts b/packages/types/src/codec/Date.ts index f0968273dc..77401243e7 100644 --- a/packages/types/src/codec/Date.ts +++ b/packages/types/src/codec/Date.ts @@ -35,6 +35,7 @@ export default class CodecDate extends Date implements Codec { this.raw = this; } + /** @internal */ public static decodeDate (value: CodecDate | Date | AnyNumber): Date { if (value instanceof Date) { return value; diff --git a/packages/types/src/codec/Enum.ts b/packages/types/src/codec/Enum.ts index ba5ef8cc23..c25f9abf09 100644 --- a/packages/types/src/codec/Enum.ts +++ b/packages/types/src/codec/Enum.ts @@ -121,6 +121,7 @@ export default class Enum extends Base { this._index = this._indexes.indexOf(decoded.index) || 0; } + /** @internal */ private static decodeEnum (registry: Registry, def: TypesDef, value?: any, index?: number): Decoded { // NOTE We check the index path first, before looking at values - this allows treating // the optional indexes before anything else, more-specific > less-specific diff --git a/packages/types/src/codec/Option.ts b/packages/types/src/codec/Option.ts index cbd8dcbd79..d7944f6bd2 100644 --- a/packages/types/src/codec/Option.ts +++ b/packages/types/src/codec/Option.ts @@ -29,6 +29,7 @@ export default class Option extends Base { this._Type = Clazz; } + /** @internal */ public static decodeOption (registry: Registry, Type: Constructor, value?: any): Codec { if (isNull(value) || isUndefined(value) || value instanceof Null) { return new Null(registry); @@ -46,6 +47,7 @@ export default class Option extends Base { return new Type(registry, value); } + /** @internal */ private static decodeOptionU8a (registry: Registry, Type: Constructor, value: Uint8Array): Codec { return !value.length || value[0] === 0 ? new Null(registry) diff --git a/packages/types/src/codec/Raw.ts b/packages/types/src/codec/Raw.ts index af07ff9ff9..9c6efc016e 100644 --- a/packages/types/src/codec/Raw.ts +++ b/packages/types/src/codec/Raw.ts @@ -25,6 +25,7 @@ export default class Raw extends Uint8Array implements IU8a { this.registry = registry; } + /** @internal */ private static decodeU8a (value?: any): Uint8Array { if (isU8a(value)) { return value; diff --git a/packages/types/src/codec/Set.ts b/packages/types/src/codec/Set.ts index cf136d4486..dee4925dbd 100644 --- a/packages/types/src/codec/Set.ts +++ b/packages/types/src/codec/Set.ts @@ -32,6 +32,7 @@ export default class CodecSet extends Set implements Codec { this._setValues = setValues; } + /** @internal */ public static decodeSet (setValues: SetValues, value: string[] | Set | Uint8Array | BN | number | string = 0): string[] { if (isString(value)) { return CodecSet.decodeSet(setValues, u8aToU8a(value)); @@ -48,6 +49,7 @@ export default class CodecSet extends Set implements Codec { return CodecSet.decodeSetNumber(setValues, value); } + /** @internal */ private static decodeSetArray (setValues: SetValues, value: string[]): string[] { return value.reduce((result, key): string[] => { assert(!isUndefined(setValues[key]), `Set: Invalid key '${key}' passed to Set, allowed ${Object.keys(setValues).join(', ')}`); @@ -58,6 +60,7 @@ export default class CodecSet extends Set implements Codec { }, [] as string[]); } + /** @internal */ private static decodeSetNumber (setValues: SetValues, _value: BN | number): string[] { const bn = bnToBn(_value); const result = Object.keys(setValues).reduce((result, key): string[] => { diff --git a/packages/types/src/codec/Struct.ts b/packages/types/src/codec/Struct.ts index 9a6e2f3de3..26dda6f6a7 100644 --- a/packages/types/src/codec/Struct.ts +++ b/packages/types/src/codec/Struct.ts @@ -62,6 +62,7 @@ export default class Struct< * - array with `[value1, value2]` assuming the array has the same length as * `Object.keys(Types)` * @param jsonMap + * @internal */ private static decodeStruct (registry: Registry, Types: ConstructorDef, value: any, jsonMap: Map): T { if (isHex(value)) { @@ -84,6 +85,7 @@ export default class Struct< return Struct.decodeStructFromObject(registry, Types, value, jsonMap); } + /** @internal */ private static decodeStructFromObject (registry: Registry, Types: ConstructorDef, value: any, jsonMap: Map): T { return Object.keys(Types).reduce((raw, key, index): T => { // The key in the JSON can be snake_case (or other cases), but in our diff --git a/packages/types/src/codec/StructAny.ts b/packages/types/src/codec/StructAny.ts index 945bb8813c..584947e736 100644 --- a/packages/types/src/codec/StructAny.ts +++ b/packages/types/src/codec/StructAny.ts @@ -43,6 +43,7 @@ export default class StructAny extends Map implements Codec { }); } + /** @internal */ private static decodeJson (value?: { [index: string]: any } | null): [string, any][] { return Object.entries(value || {}); } diff --git a/packages/types/src/codec/Tuple.ts b/packages/types/src/codec/Tuple.ts index 622df869eb..5f5018a5b1 100644 --- a/packages/types/src/codec/Tuple.ts +++ b/packages/types/src/codec/Tuple.ts @@ -36,6 +36,7 @@ export default class Tuple extends AbstractArray { this._Types = Clazzes; } + /** @internal */ private static decodeTuple (registry: Registry, _Types: TupleConstructors, value: AnyU8a | string | (AnyU8a | AnyNumber | AnyString | undefined | null)[]): Codec[] { if (isU8a(value)) { return decodeU8a(registry, value, _Types); diff --git a/packages/types/src/codec/U8aFixed.ts b/packages/types/src/codec/U8aFixed.ts index f24d968af7..1ee958c1cb 100644 --- a/packages/types/src/codec/U8aFixed.ts +++ b/packages/types/src/codec/U8aFixed.ts @@ -24,6 +24,7 @@ export default class U8aFixed extends Raw { super(registry, U8aFixed.decodeU8aFixed(value, bitLength)); } + /** @internal */ private static decodeU8aFixed (value: AnyU8a, bitLength: BitLength): AnyU8a { if (Array.isArray(value) || isString(value)) { return U8aFixed.decodeU8aFixed(u8aToU8a(value), bitLength); diff --git a/packages/types/src/codec/Vec.ts b/packages/types/src/codec/Vec.ts index 8f6f95cdd5..321e8e0b43 100644 --- a/packages/types/src/codec/Vec.ts +++ b/packages/types/src/codec/Vec.ts @@ -30,6 +30,7 @@ export default class Vec extends AbstractArray { this._Type = Clazz; } + /** @internal */ public static decodeVec (registry: Registry, Type: Constructor, value: Vec | Uint8Array | string | any[]): T[] { if (Array.isArray(value)) { return value.map((entry, index): T => { diff --git a/packages/types/src/codec/VecFixed.ts b/packages/types/src/codec/VecFixed.ts index 24f34af876..3d7460b5c0 100644 --- a/packages/types/src/codec/VecFixed.ts +++ b/packages/types/src/codec/VecFixed.ts @@ -25,6 +25,7 @@ export default class VecFixed extends AbstractArray { this._Type = Clazz; } + /** @internal */ public static decodeVecFixed (registry: Registry, Type: Constructor, allocLength: number, value: VecFixed | Uint8Array | string | any[]): T[] { const values = Vec.decodeVec( registry, diff --git a/packages/types/src/codec/create/registry.ts b/packages/types/src/codec/create/registry.ts index 7394919bcd..4a1e52f48a 100644 --- a/packages/types/src/codec/create/registry.ts +++ b/packages/types/src/codec/create/registry.ts @@ -3,13 +3,14 @@ // This software may be modified and distributed under the terms // of the Apache-2.0 license. See the LICENSE file for details. -import { CallFunction, Codec, Constructor, RegistryError, RegistryTypes, Registry, RegistryMetadata, TypeDef } from '../../types'; +import { CallFunction, Codec, Constructor, InterfaceTypes, RegistryError, RegistryTypes, Registry, RegistryMetadata, TypeDef } from '../../types'; import extrinsicsFromMeta from '@polkadot/metadata/Decorated/extrinsics/fromMetadata'; import { assert, isFunction, isString, isUndefined, stringCamelCase, u8aToHex } from '@polkadot/util'; import Raw from '../Raw'; import { EventData } from '../../primitive/Generic/Event'; +import { defaultExtensions, expandExtensionTypes } from '../../primitive/Extrinsic/SignedExtensions'; import { createClass } from './createClass'; import { getTypeClass } from './getTypeClass'; import { getTypeDef } from './getTypeDef'; @@ -85,6 +86,8 @@ export class TypeRegistry implements Registry { private _metadataEvents: Record> = {}; + private _metadataExtensions: string[] = defaultExtensions; + constructor () { // we only want to import these on creation, i.e. we want to avoid types // weird side-effects from circular references. (Since registry is injected @@ -165,6 +168,14 @@ export class TypeRegistry implements Registry { return type; } + public getSignedExtensionExtra (): Record { + return expandExtensionTypes(this._metadataExtensions, 'extra'); + } + + public getSignedExtensionTypes (): Record { + return expandExtensionTypes(this._metadataExtensions, 'types'); + } + public hasClass (name: string): boolean { return this._classes.has(name); } @@ -221,5 +232,10 @@ export class TypeRegistry implements Registry { decorateExtrinsics(this, metadata, this._metadataCalls); decorateErrors(this, metadata, this._metadataErrors); decorateEvents(this, metadata, this._metadataEvents); + + // setup the available extensions + this._metadataExtensions = metadata.asLatest.extrinsic.version.gtn(0) + ? metadata.asLatest.extrinsic.signedExtensions.map((key): string => key.toString()) + : defaultExtensions; } } diff --git a/packages/types/src/interfaceRegistry.ts b/packages/types/src/interfaceRegistry.ts index 0653d9873f..9d25715d82 100644 --- a/packages/types/src/interfaceRegistry.ts +++ b/packages/types/src/interfaceRegistry.ts @@ -3,7 +3,7 @@ import { Compact, Option, Raw, Vec } from '@polkadot/types/codec'; import { Bytes, Data, Fixed64, H160, H256, H512, IdentityFields, Null, StorageData, StorageKey, Text, Type, U256, bool, i128, i16, i256, i32, i64, i8, u128, u16, u256, u32, u64, u8, usize } from '@polkadot/types/primitive'; -import { AccountId, AccountIdOf, AccountIndex, Address, AssetId, Balance, BalanceOf, Block, BlockNumber, Call, ChangesTrieConfiguration, Consensus, ConsensusEngineId, Digest, DigestItem, DispatchClass, DispatchInfo, DispatchInfoTo190, EcdsaSignature, Ed25519Signature, Extrinsic, ExtrinsicEra, ExtrinsicPayload, ExtrinsicPayloadUnknown, ExtrinsicPayloadV1, ExtrinsicPayloadV2, ExtrinsicPayloadV3, ExtrinsicPayloadV4, ExtrinsicUnknown, ExtrinsicV1, ExtrinsicV2, ExtrinsicV3, ExtrinsicV4, Hash, Header, ImmortalEra, Index, Justification, KeyTypeId, KeyValue, LockIdentifier, Moment, MortalEra, MultiSignature, Origin, Perbill, Percent, Permill, Perquintill, Phantom, PhantomData, PreRuntime, Seal, SealV0, Signature, SignedBlock, SignerPayload, Sr25519Signature, ValidatorId, Weight, WeightMultiplier } from '@polkadot/types/interfaces/runtime'; +import { AccountId, AccountIdOf, AccountIndex, Address, AssetId, Balance, BalanceOf, Block, BlockNumber, Call, ChangesTrieConfiguration, Consensus, ConsensusEngineId, Digest, DigestItem, DispatchClass, DispatchInfo, DispatchInfoTo190, EcdsaSignature, Ed25519Signature, Extrinsic, ExtrinsicEra, ExtrinsicPayload, ExtrinsicPayloadUnknown, ExtrinsicPayloadV1, ExtrinsicPayloadV2, ExtrinsicPayloadV3, ExtrinsicPayloadV4, ExtrinsicSignatureV1, ExtrinsicSignatureV2, ExtrinsicSignatureV3, ExtrinsicSignatureV4, ExtrinsicUnknown, ExtrinsicV1, ExtrinsicV2, ExtrinsicV3, ExtrinsicV4, Hash, Header, ImmortalEra, Index, Justification, KeyTypeId, KeyValue, LockIdentifier, Moment, MortalEra, MultiSignature, Origin, Perbill, Percent, Permill, Perquintill, Phantom, PhantomData, PreRuntime, Seal, SealV0, Signature, SignedBlock, SignerPayload, Sr25519Signature, ValidatorId, Weight, WeightMultiplier } from '@polkadot/types/interfaces/runtime'; import { InclusionHeight, Uncle, UncleEntryItem } from '@polkadot/types/interfaces/authorship'; import { RawAuraPreDigest } from '@polkadot/types/interfaces/aura'; import { BabeAuthorityWeight, BabeBlockWeight, BabeWeight, MaybeVrf, RawBabePreDigest, RawBabePreDigestCompat, RawBabePreDigestPrimary, RawBabePreDigestPrimaryTo159, RawBabePreDigestSecondary, RawBabePreDigestSecondaryTo159, RawBabePreDigestTo159, SlotNumber, VrfData, VrfProof } from '@polkadot/types/interfaces/babe'; @@ -127,6 +127,57 @@ export interface InterfaceRegistry { Raw: Raw; 'Option': Option; 'Vec': Vec; + Extrinsic: Extrinsic; + 'Option': Option; + 'Vec': Vec; + ExtrinsicEra: ExtrinsicEra; + 'Option': Option; + 'Vec': Vec; + ExtrinsicPayload: ExtrinsicPayload; + 'Option': Option; + 'Vec': Vec; + ExtrinsicV1: ExtrinsicV1; + 'Option': Option; + 'Vec': Vec; + ExtrinsicPayloadV1: ExtrinsicPayloadV1; + 'Option': Option; + 'Vec': Vec; + ExtrinsicSignatureV1: ExtrinsicSignatureV1; + 'Option': Option; + 'Vec': Vec; + ExtrinsicV2: ExtrinsicV2; + 'Option': Option; + 'Vec': Vec; + ExtrinsicPayloadV2: ExtrinsicPayloadV2; + 'Option': Option; + 'Vec': Vec; + ExtrinsicSignatureV2: ExtrinsicSignatureV2; + 'Option': Option; + 'Vec': Vec; + ExtrinsicV3: ExtrinsicV3; + 'Option': Option; + 'Vec': Vec; + ExtrinsicPayloadV3: ExtrinsicPayloadV3; + 'Option': Option; + 'Vec': Vec; + ExtrinsicSignatureV3: ExtrinsicSignatureV3; + 'Option': Option; + 'Vec': Vec; + ExtrinsicV4: ExtrinsicV4; + 'Option': Option; + 'Vec': Vec; + ExtrinsicPayloadV4: ExtrinsicPayloadV4; + 'Option': Option; + 'Vec': Vec; + ExtrinsicSignatureV4: ExtrinsicSignatureV4; + 'Option': Option; + 'Vec': Vec; + ExtrinsicUnknown: ExtrinsicUnknown; + 'Option': Option; + 'Vec': Vec; + ExtrinsicPayloadUnknown: ExtrinsicPayloadUnknown; + 'Option': Option; + 'Vec': Vec; AccountId: AccountId; 'Option': Option; 'Vec': Vec; @@ -183,45 +234,6 @@ export interface InterfaceRegistry { DispatchInfoTo190: DispatchInfoTo190; 'Option': Option; 'Vec': Vec; - Extrinsic: Extrinsic; - 'Option': Option; - 'Vec': Vec; - ExtrinsicEra: ExtrinsicEra; - 'Option': Option; - 'Vec': Vec; - ExtrinsicPayload: ExtrinsicPayload; - 'Option': Option; - 'Vec': Vec; - ExtrinsicPayloadUnknown: ExtrinsicPayloadUnknown; - 'Option': Option; - 'Vec': Vec; - ExtrinsicPayloadV1: ExtrinsicPayloadV1; - 'Option': Option; - 'Vec': Vec; - ExtrinsicPayloadV2: ExtrinsicPayloadV2; - 'Option': Option; - 'Vec': Vec; - ExtrinsicPayloadV3: ExtrinsicPayloadV3; - 'Option': Option; - 'Vec': Vec; - ExtrinsicPayloadV4: ExtrinsicPayloadV4; - 'Option': Option; - 'Vec': Vec; - ExtrinsicUnknown: ExtrinsicUnknown; - 'Option': Option; - 'Vec': Vec; - ExtrinsicV1: ExtrinsicV1; - 'Option': Option; - 'Vec': Vec; - ExtrinsicV2: ExtrinsicV2; - 'Option': Option; - 'Vec': Vec; - ExtrinsicV3: ExtrinsicV3; - 'Option': Option; - 'Vec': Vec; - ExtrinsicV4: ExtrinsicV4; - 'Option': Option; - 'Vec': Vec; Hash: Hash; 'Option': Option; 'Vec': Vec; diff --git a/packages/types/src/interfaces/runtime/definitions.ts b/packages/types/src/interfaces/runtime/definitions.ts index 3fef70a773..c5e39bc0ca 100644 --- a/packages/types/src/interfaces/runtime/definitions.ts +++ b/packages/types/src/interfaces/runtime/definitions.ts @@ -2,8 +2,30 @@ // This software may be modified and distributed under the terms // of the Apache-2.0 license. See the LICENSE file for details. +// Extrinsic definitions, extracted for readability +const extrinsic = { + Extrinsic: 'GenericExtrinsic', + ExtrinsicEra: 'GenericExtrinsicEra', + ExtrinsicPayload: 'GenericExtrinsicPayload', + ExtrinsicV1: 'GenericExtrinsicV1', + ExtrinsicPayloadV1: 'GenericExtrinsicPayloadV1', + ExtrinsicSignatureV1: 'GenericExtrinsicSignatureV1', + ExtrinsicV2: 'GenericExtrinsicV2', + ExtrinsicPayloadV2: 'GenericExtrinsicPayloadV2', + ExtrinsicSignatureV2: 'GenericExtrinsicSignatureV2', + ExtrinsicV3: 'GenericExtrinsicV3', + ExtrinsicPayloadV3: 'GenericExtrinsicPayloadV3', + ExtrinsicSignatureV3: 'GenericExtrinsicSignatureV3', + ExtrinsicV4: 'GenericExtrinsicV4', + ExtrinsicPayloadV4: 'GenericExtrinsicPayloadV4', + ExtrinsicSignatureV4: 'GenericExtrinsicSignatureV4', + ExtrinsicUnknown: 'GenericExtrinsicUnknown', + ExtrinsicPayloadUnknown: 'GenericExtrinsicPayloadUnknown' +}; + export default { types: { + ...extrinsic, AccountId: 'GenericAccountId', AccountIdOf: 'AccountId', AccountIndex: 'GenericAccountIndex', @@ -33,19 +55,6 @@ export default { weight: 'Weight', class: 'DispatchClass' }, - Extrinsic: 'GenericExtrinsic', - ExtrinsicEra: 'GenericExtrinsicEra', - ExtrinsicPayload: 'GenericExtrinsicPayload', - ExtrinsicPayloadUnknown: 'GenericExtrinsicPayloadUnknown', - ExtrinsicPayloadV1: 'GenericExtrinsicPayloadV1', - ExtrinsicPayloadV2: 'GenericExtrinsicPayloadV2', - ExtrinsicPayloadV3: 'GenericExtrinsicPayloadV3', - ExtrinsicPayloadV4: 'GenericExtrinsicPayloadV4', - ExtrinsicUnknown: 'GenericExtrinsicUnknown', - ExtrinsicV1: 'GenericExtrinsicV1', - ExtrinsicV2: 'GenericExtrinsicV2', - ExtrinsicV3: 'GenericExtrinsicV3', - ExtrinsicV4: 'GenericExtrinsicV4', Hash: 'H256', Header: { parentHash: 'Hash', diff --git a/packages/types/src/interfaces/runtime/types.ts b/packages/types/src/interfaces/runtime/types.ts index ee32bc2023..0cc05d46b8 100644 --- a/packages/types/src/interfaces/runtime/types.ts +++ b/packages/types/src/interfaces/runtime/types.ts @@ -3,7 +3,7 @@ import { Codec, ITuple } from '@polkadot/types/types'; import { Compact, Enum, Struct } from '@polkadot/types/codec'; -import { Bytes, Fixed64, GenericAccountId, GenericAccountIndex, GenericAddress, GenericBlock, GenericCall, GenericConsensusEngineId, GenericDigest, GenericDigestItem, GenericExtrinsic, GenericExtrinsicEra, GenericExtrinsicPayload, GenericExtrinsicPayloadUnknown, GenericExtrinsicPayloadV1, GenericExtrinsicPayloadV2, GenericExtrinsicPayloadV3, GenericExtrinsicPayloadV4, GenericExtrinsicUnknown, GenericExtrinsicV1, GenericExtrinsicV2, GenericExtrinsicV3, GenericExtrinsicV4, GenericImmortalEra, GenericMortalEra, GenericOrigin, GenericSignerPayload, H256, H512, Null, StorageData, StorageKey, bool, u128, u32, u64, u8 } from '@polkadot/types/primitive'; +import { Bytes, Fixed64, GenericAccountId, GenericAccountIndex, GenericAddress, GenericBlock, GenericCall, GenericConsensusEngineId, GenericDigest, GenericDigestItem, GenericExtrinsic, GenericExtrinsicEra, GenericExtrinsicPayload, GenericExtrinsicPayloadUnknown, GenericExtrinsicPayloadV1, GenericExtrinsicPayloadV2, GenericExtrinsicPayloadV3, GenericExtrinsicPayloadV4, GenericExtrinsicSignatureV1, GenericExtrinsicSignatureV2, GenericExtrinsicSignatureV3, GenericExtrinsicSignatureV4, GenericExtrinsicUnknown, GenericExtrinsicV1, GenericExtrinsicV2, GenericExtrinsicV3, GenericExtrinsicV4, GenericImmortalEra, GenericMortalEra, GenericOrigin, GenericSignerPayload, H256, H512, Null, StorageData, StorageKey, bool, u128, u32, u64, u8 } from '@polkadot/types/primitive'; /** @name AccountId */ export interface AccountId extends GenericAccountId {} @@ -102,6 +102,18 @@ export interface ExtrinsicPayloadV3 extends GenericExtrinsicPayloadV3 {} /** @name ExtrinsicPayloadV4 */ export interface ExtrinsicPayloadV4 extends GenericExtrinsicPayloadV4 {} +/** @name ExtrinsicSignatureV1 */ +export interface ExtrinsicSignatureV1 extends GenericExtrinsicSignatureV1 {} + +/** @name ExtrinsicSignatureV2 */ +export interface ExtrinsicSignatureV2 extends GenericExtrinsicSignatureV2 {} + +/** @name ExtrinsicSignatureV3 */ +export interface ExtrinsicSignatureV3 extends GenericExtrinsicSignatureV3 {} + +/** @name ExtrinsicSignatureV4 */ +export interface ExtrinsicSignatureV4 extends GenericExtrinsicSignatureV4 {} + /** @name ExtrinsicUnknown */ export interface ExtrinsicUnknown extends GenericExtrinsicUnknown {} diff --git a/packages/types/src/primitive/Bool.ts b/packages/types/src/primitive/Bool.ts index 7c76fca611..4e13047ef3 100644 --- a/packages/types/src/primitive/Bool.ts +++ b/packages/types/src/primitive/Bool.ts @@ -25,6 +25,7 @@ export default class Bool extends Boolean implements Codec { this.registry = registry; } + /** @internal */ private static decodeBool (value: any): boolean { if (value instanceof Boolean) { return value.valueOf(); diff --git a/packages/types/src/primitive/Bytes.ts b/packages/types/src/primitive/Bytes.ts index ba8b3485fb..237b47e94a 100644 --- a/packages/types/src/primitive/Bytes.ts +++ b/packages/types/src/primitive/Bytes.ts @@ -21,6 +21,7 @@ export default class Bytes extends Raw { super(registry, Bytes.decodeBytes(value)); } + /** @internal */ private static decodeBytes (value?: AnyU8a): Uint8Array | undefined { if (Array.isArray(value) || isString(value)) { return u8aToU8a(value); @@ -33,6 +34,7 @@ export default class Bytes extends Raw { return value; } + /** @internal */ private static decodeBytesU8a (value: Uint8Array): Uint8Array { if (!value.length) { return new Uint8Array(); diff --git a/packages/types/src/primitive/Extrinsic/Extrinsic.ts b/packages/types/src/primitive/Extrinsic/Extrinsic.ts index 5c365cf2fc..c9501599a1 100644 --- a/packages/types/src/primitive/Extrinsic/Extrinsic.ts +++ b/packages/types/src/primitive/Extrinsic/Extrinsic.ts @@ -39,7 +39,7 @@ const VERSIONS: InterfaceTypes[] = [ export { TRANSACTION_VERSION as LATEST_EXTRINSIC_VERSION } from './v4/Extrinsic'; /** - * @name Extrinsic + * @name GenericExtrinsic * @description * Representation of an Extrinsic in the system. It contains the actual call, * (optional) signature and encodes with an actual length prefix @@ -55,6 +55,7 @@ export default class Extrinsic extends Base impl super(registry, Extrinsic.decodeExtrinsic(registry, value, version)); } + /** @internal */ private static newFromValue (registry: Registry, value: any, version: number): ExtrinsicVx | ExtrinsicUnknown { if (value instanceof Extrinsic) { return value.raw; @@ -68,6 +69,7 @@ export default class Extrinsic extends Base impl return createType(registry, type, value, { isSigned, version }) as ExtrinsicVx; } + /** @internal */ public static decodeExtrinsic (registry: Registry, value: Extrinsic | ExtrinsicValue | AnyU8a | Call | undefined, version: number = DEFAULT_VERSION): ExtrinsicVx | ExtrinsicUnknown { if (Array.isArray(value) || isHex(value)) { return Extrinsic.decodeU8aLike(registry, value, version); @@ -80,6 +82,7 @@ export default class Extrinsic extends Base impl return Extrinsic.newFromValue(registry, value, version); } + /** @internal */ private static decodeU8aLike (registry: Registry, value: string | number[], version: number): ExtrinsicVx | ExtrinsicUnknown { // Instead of the block below, it should simply be: // return Extrinsic.decodeExtrinsic(hexToU8a(value as string)); @@ -100,6 +103,7 @@ export default class Extrinsic extends Base impl ); } + /** @internal */ private static decodeU8a (registry: Registry, value: Uint8Array, version: number): ExtrinsicVx | ExtrinsicUnknown { if (!value.length) { return Extrinsic.newFromValue(registry, new Uint8Array(), version); diff --git a/packages/types/src/primitive/Extrinsic/ExtrinsicEra.ts b/packages/types/src/primitive/Extrinsic/ExtrinsicEra.ts index 80dc3e5782..d5839a15e1 100644 --- a/packages/types/src/primitive/Extrinsic/ExtrinsicEra.ts +++ b/packages/types/src/primitive/Extrinsic/ExtrinsicEra.ts @@ -55,6 +55,7 @@ export class MortalEra extends Tuple { }, MortalEra.decodeMortalEra(registry, value)); } + /** @internal */ private static decodeMortalEra (registry: Registry, value?: MortalMethod | Uint8Array | number[] | string): MortalEraValue { if (isHex(value)) { return MortalEra.decodeMortalU8a(registry, hexToU8a(value)); @@ -71,6 +72,7 @@ export class MortalEra extends Tuple { throw new Error('Invalid data passed to Mortal era'); } + /** @internal */ private static decodeMortalObject (registry: Registry, value: MortalMethod): MortalEraValue { const { current, period } = value; let calPeriod = Math.pow(2, Math.ceil(Math.log2(period))); @@ -82,6 +84,7 @@ export class MortalEra extends Tuple { return [new U64(registry, calPeriod), new U64(registry, quantizedPhase)]; } + /** @internal */ private static decodeMortalU8a (registry: Registry, value: Uint8Array): MortalEraValue { if (value.length === 0) { return [new U64(registry), new U64(registry)]; @@ -186,7 +189,7 @@ export class MortalEra extends Tuple { } /** - * @name ExtrinsicEra + * @name GenericExtrinsicEra * @description * The era for an extrinsic, indicating either a mortal or immortal extrinsic */ @@ -198,6 +201,7 @@ export default class ExtrinsicEra extends Enum implements IExtrinsicEra { }, ExtrinsicEra.decodeExtrinsicEra(value)); } + /** @internal */ // eslint-disable-next-line @typescript-eslint/ban-types private static decodeExtrinsicEra (value: IExtrinsicEra | MortalMethod | MortalEnumDef | ImmortalEnumDef | Uint8Array | string = new Uint8Array()): Uint8Array | Object | undefined { if (!value) { diff --git a/packages/types/src/primitive/Extrinsic/ExtrinsicPayload.spec.ts b/packages/types/src/primitive/Extrinsic/ExtrinsicPayload.spec.ts index bc1cc4c2b6..adaf5c4578 100644 --- a/packages/types/src/primitive/Extrinsic/ExtrinsicPayload.spec.ts +++ b/packages/types/src/primitive/Extrinsic/ExtrinsicPayload.spec.ts @@ -1,4 +1,4 @@ -// Copyright 2017-2020 @polkadot/api authors & contributors +// Copyright 2017-2020 @polkadot/types authors & contributors // This software may be modified and distributed under the terms // of the Apache-2.0 license. See the LICENSE file for details. diff --git a/packages/types/src/primitive/Extrinsic/ExtrinsicPayload.ts b/packages/types/src/primitive/Extrinsic/ExtrinsicPayload.ts index 7ee26489ec..0f8cee9bb4 100644 --- a/packages/types/src/primitive/Extrinsic/ExtrinsicPayload.ts +++ b/packages/types/src/primitive/Extrinsic/ExtrinsicPayload.ts @@ -31,7 +31,7 @@ const VERSIONS: InterfaceTypes[] = [ ]; /** - * @name ExtrinsicPayload + * @name GenericExtrinsicPayload * @description * A signing payload for an [[Extrinsic]]. For the final encoding, it is variable length based * on the contents included @@ -41,6 +41,7 @@ export default class ExtrinsicPayload extends Base { super(registry, ExtrinsicPayload.decodeExtrinsicPayload(registry, value as ExtrinsicPayloadValue, version)); } + /** @internal */ public static decodeExtrinsicPayload (registry: Registry, value: ExtrinsicPayload | ExtrinsicPayloadValue | Uint8Array | string | undefined, version: number = DEFAULT_VERSION): ExtrinsicPayloadVx { if (value instanceof ExtrinsicPayload) { return value.raw; diff --git a/packages/types/src/primitive/Extrinsic/ExtrinsicPayloadUnknown.ts b/packages/types/src/primitive/Extrinsic/ExtrinsicPayloadUnknown.ts index 19fa7bfdbb..5b4d22616e 100644 --- a/packages/types/src/primitive/Extrinsic/ExtrinsicPayloadUnknown.ts +++ b/packages/types/src/primitive/Extrinsic/ExtrinsicPayloadUnknown.ts @@ -8,7 +8,7 @@ import { ExtrinsicPayloadOptions } from './types'; import Struct from '../../codec/Struct'; /** - * @name ExtrinsicPayloadUnknown + * @name GenericExtrinsicPayloadUnknown * @description * A default handler for payloads where the version is not known (default throw) */ diff --git a/packages/types/src/primitive/Extrinsic/ExtrinsicUnknown.ts b/packages/types/src/primitive/Extrinsic/ExtrinsicUnknown.ts index cb50670d32..ef10fdddd2 100644 --- a/packages/types/src/primitive/Extrinsic/ExtrinsicUnknown.ts +++ b/packages/types/src/primitive/Extrinsic/ExtrinsicUnknown.ts @@ -9,7 +9,7 @@ import Struct from '../../codec/Struct'; import { UNMASK_VERSION } from './constants'; /** - * @name ExtrinsicUnknown + * @name GenericExtrinsicUnknown * @description * A default handler for extrinsics where the version is not known (default throw) */ diff --git a/packages/types/src/primitive/Extrinsic/SignedExtensions.ts b/packages/types/src/primitive/Extrinsic/SignedExtensions.ts new file mode 100644 index 0000000000..e7ffdbd2ee --- /dev/null +++ b/packages/types/src/primitive/Extrinsic/SignedExtensions.ts @@ -0,0 +1,86 @@ +// Copyright 2017-2020 @polkadot/types authors & contributors +// This software may be modified and distributed under the terms +// of the Apache-2.0 license. See the LICENSE file for details. + +import { InterfaceTypes } from '../../types'; + +type ExtTypes = Record; +type ExtInfo = { + extra: ExtTypes; + types: ExtTypes; +} + +// A mapping of the known signed extensions to the extra fields that they contain. Unlike in the actual extensions, +// we define the extra fields not as a Tuple, but rather as a struct so they can be named. These will be expanded +// into the various fields when added to the payload (we only support V4 onwards with these, V3 and earlier are +// deemded fixed and non-changeable) +const allExtensions: Record = { + ChargeTransactionPayment: { + extra: {}, + types: { + tip: 'Compact' + } + }, + CheckBlockGasLimit: { + extra: {}, + types: {} + }, + CheckEra: { + extra: { + blockHash: 'Hash' + }, + types: { + era: 'ExtrinsicEra' + } + }, + CheckGenesis: { + extra: { + genesisHash: 'Hash' + }, + types: {} + }, + CheckNonce: { + extra: {}, + types: { + nonce: 'Compact' + } + }, + CheckVersion: { + extra: { + specVersion: 'u32' + }, + types: {} + }, + CheckWeight: { + extra: {}, + types: {} + } +}; + +// the v4 signed extensions (the order is important here) +const defaultExtensions: Array = [ + 'CheckVersion', + 'CheckGenesis', + 'CheckEra', + 'CheckNonce', + 'CheckWeight', + 'ChargeTransactionPayment', + 'CheckBlockGasLimit' +]; + +function expandExtensionTypes (extensions: string[], type: keyof ExtInfo): ExtTypes { + return extensions + .map((key): ExtInfo => { + const info = allExtensions[key]; + + if (!info) { + console.warn(`Unknown signed extension ${key} found, treating it as empty with no extra data`); + } + + return info; + }) + .filter((info): boolean => !!info) + .reduce((result, info): ExtTypes => ({ ...result, ...info[type] }), {}); +} + +export { allExtensions, defaultExtensions, expandExtensionTypes }; diff --git a/packages/types/src/primitive/Extrinsic/SignerPayload.spec.ts b/packages/types/src/primitive/Extrinsic/SignerPayload.spec.ts index 342124ab53..0d05d49229 100644 --- a/packages/types/src/primitive/Extrinsic/SignerPayload.spec.ts +++ b/packages/types/src/primitive/Extrinsic/SignerPayload.spec.ts @@ -1,4 +1,4 @@ -// Copyright 2017-2020 @polkadot/api authors & contributors +// Copyright 2017-2020 @polkadot/types authors & contributors // This software may be modified and distributed under the terms // of the Apache-2.0 license. See the LICENSE file for details. diff --git a/packages/types/src/primitive/Extrinsic/SignerPayload.ts b/packages/types/src/primitive/Extrinsic/SignerPayload.ts index 24af5199a0..b64606b6b9 100644 --- a/packages/types/src/primitive/Extrinsic/SignerPayload.ts +++ b/packages/types/src/primitive/Extrinsic/SignerPayload.ts @@ -1,4 +1,4 @@ -// Copyright 2017-2020 @polkadot/api authors & contributors +// Copyright 2017-2020 @polkadot/types authors & contributors // This software may be modified and distributed under the terms // of the Apache-2.0 license. See the LICENSE file for details. @@ -38,6 +38,11 @@ const _Payload: Constructor = Struct.with({ version: 'u8' }) as any; +/** + * @name SignerPayload + * @description + * A generic signer payload that can be used for serialization between API and signer + */ export default class SignerPayload extends _Payload implements ISignerPayload { /** * @description Creates an representation of the structure as an ISignerPayload JSON diff --git a/packages/types/src/primitive/Extrinsic/index.ts b/packages/types/src/primitive/Extrinsic/index.ts index bd0dd06cde..e3ea192f97 100644 --- a/packages/types/src/primitive/Extrinsic/index.ts +++ b/packages/types/src/primitive/Extrinsic/index.ts @@ -2,7 +2,6 @@ // This software may be modified and distributed under the terms // of the Apache-2.0 license. See the LICENSE file for details. -// generic export { default as GenericExtrinsic } from './Extrinsic'; export { default as GenericExtrinsicEra, MortalEra as GenericMortalEra, ImmortalEra as GenericImmortalEra } from './ExtrinsicEra'; export { default as GenericExtrinsicPayload } from './ExtrinsicPayload'; @@ -10,15 +9,7 @@ export { default as GenericExtrinsicPayloadUnknown } from './ExtrinsicPayloadUnk export { default as GenericExtrinsicUnknown } from './ExtrinsicUnknown'; export { default as GenericSignerPayload } from './SignerPayload'; -// versioned -export { default as GenericExtrinsicV1 } from './v1/Extrinsic'; -export { default as GenericExtrinsicPayloadV1 } from './v1/ExtrinsicPayload'; - -export { default as GenericExtrinsicV2 } from './v2/Extrinsic'; -export { default as GenericExtrinsicPayloadV2 } from './v2/ExtrinsicPayload'; - -export { default as GenericExtrinsicV3 } from './v3/Extrinsic'; -export { default as GenericExtrinsicPayloadV3 } from './v3/ExtrinsicPayload'; - -export { default as GenericExtrinsicV4 } from './v4/Extrinsic'; -export { default as GenericExtrinsicPayloadV4 } from './v4/ExtrinsicPayload'; +export * from './v1'; +export * from './v2'; +export * from './v3'; +export * from './v4'; diff --git a/packages/types/src/primitive/Extrinsic/v1/Extrinsic.ts b/packages/types/src/primitive/Extrinsic/v1/Extrinsic.ts index cae0b7b644..fe612a7b22 100644 --- a/packages/types/src/primitive/Extrinsic/v1/Extrinsic.ts +++ b/packages/types/src/primitive/Extrinsic/v1/Extrinsic.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 { Address, Call } from '../../../interfaces/runtime'; +import { Address, Call, ExtrinsicSignatureV1 } from '../../../interfaces/runtime'; import { ExtrinsicPayloadValue, IExtrinsicImpl, IKeyringPair, Registry, SignatureOptions } from '../../../types'; import { ExtrinsicOptions } from '../types'; @@ -10,7 +10,6 @@ import { isU8a } from '@polkadot/util'; import { createType } from '../../../codec/create'; import Struct from '../../../codec/Struct'; -import ExtrinsicSignatureV1 from './ExtrinsicSignature'; export interface ExtrinsicValueV1 { method?: Call; @@ -20,26 +19,25 @@ export interface ExtrinsicValueV1 { const TRANSACTION_VERSION = 1; /** - * @name ExtrinsicV1 + * @name GenericExtrinsicV1 * @description * The first generation of compact extrinsics */ export default class ExtrinsicV1 extends Struct implements IExtrinsicImpl { constructor (registry: Registry, value?: Uint8Array | ExtrinsicValueV1, { isSigned }: Partial = {}) { super(registry, { - signature: ExtrinsicSignatureV1, + signature: 'ExtrinsicSignatureV1', method: 'Call' }, ExtrinsicV1.decodeExtrinsic(registry, value, isSigned)); } + /** @internal */ public static decodeExtrinsic (registry: Registry, value?: Uint8Array | ExtrinsicValueV1, isSigned = false): ExtrinsicValueV1 { - if (!value) { - return {}; - } else if (value instanceof ExtrinsicV1) { + if (value instanceof ExtrinsicV1) { return value; } else if (isU8a(value)) { // here we decode manually since we need to pull through the version information - const signature = new ExtrinsicSignatureV1(registry, value, { isSigned }); + const signature = createType(registry, 'ExtrinsicSignatureV1', value, { isSigned }); const method = createType(registry, 'Call', value.subarray(signature.encodedLength)); return { @@ -48,7 +46,7 @@ export default class ExtrinsicV1 extends Struct implements IExtrinsicImpl { }; } - return value; + return value || {}; } /** diff --git a/packages/types/src/primitive/Extrinsic/v1/ExtrinsicPayload.ts b/packages/types/src/primitive/Extrinsic/v1/ExtrinsicPayload.ts index 794021d548..12736db268 100644 --- a/packages/types/src/primitive/Extrinsic/v1/ExtrinsicPayload.ts +++ b/packages/types/src/primitive/Extrinsic/v1/ExtrinsicPayload.ts @@ -11,7 +11,7 @@ import Bytes from '../../../primitive/Bytes'; import { sign } from '../util'; /** - * @name ExtrinsicPayloadV1 + * @name GenericExtrinsicPayloadV1 * @description * A signing payload for an [[Extrinsic]]. For the final encoding, it is variable length based * on the contents included diff --git a/packages/types/src/primitive/Extrinsic/v1/ExtrinsicSignature.ts b/packages/types/src/primitive/Extrinsic/v1/ExtrinsicSignature.ts index 9f1686f2d3..32eac24d80 100644 --- a/packages/types/src/primitive/Extrinsic/v1/ExtrinsicSignature.ts +++ b/packages/types/src/primitive/Extrinsic/v1/ExtrinsicSignature.ts @@ -13,7 +13,7 @@ import { EMPTY_U8A, IMMORTAL_ERA } from '../constants'; import ExtrinsicPayloadV1 from './ExtrinsicPayload'; /** - * @name ExtrinsicSignatureV1 + * @name GenericExtrinsicSignatureV1 * @description * A container for the [[Signature]] associated with a specific [[Extrinsic]] */ @@ -32,6 +32,7 @@ export default class ExtrinsicSignatureV1 extends Struct implements IExtrinsicSi }, ExtrinsicSignatureV1.decodeExtrinsicSignature(value, isSigned)); } + /** @internal */ public static decodeExtrinsicSignature (value: ExtrinsicSignatureV1 | Uint8Array | undefined, isSigned = false): ExtrinsicSignatureV1 | Uint8Array { if (!value) { return EMPTY_U8A; diff --git a/packages/types/src/primitive/Extrinsic/v1/index.ts b/packages/types/src/primitive/Extrinsic/v1/index.ts new file mode 100644 index 0000000000..d020f4aa93 --- /dev/null +++ b/packages/types/src/primitive/Extrinsic/v1/index.ts @@ -0,0 +1,7 @@ +// Copyright 2017-2020 @polkadot/types authors & contributors +// This software may be modified and distributed under the terms +// of the Apache-2.0 license. See the LICENSE file for details. + +export { default as GenericExtrinsicV1 } from './Extrinsic'; +export { default as GenericExtrinsicPayloadV1 } from './ExtrinsicPayload'; +export { default as GenericExtrinsicSignatureV1 } from './ExtrinsicSignature'; diff --git a/packages/types/src/primitive/Extrinsic/v2/Extrinsic.ts b/packages/types/src/primitive/Extrinsic/v2/Extrinsic.ts index 61e8fd4cc7..801b2ce669 100644 --- a/packages/types/src/primitive/Extrinsic/v2/Extrinsic.ts +++ b/packages/types/src/primitive/Extrinsic/v2/Extrinsic.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 { Address, Call } from '../../../interfaces/runtime'; +import { Address, Call, ExtrinsicSignatureV2 } from '../../../interfaces/runtime'; import { ExtrinsicPayloadValue, IExtrinsicImpl, IKeyringPair, Registry, SignatureOptions } from '../../../types'; import { ExtrinsicOptions } from '../types'; @@ -10,7 +10,6 @@ import { isU8a } from '@polkadot/util'; import { createType, ClassOf } from '../../../codec/create'; import Struct from '../../../codec/Struct'; -import ExtrinsicSignatureV2 from './ExtrinsicSignature'; const TRANSACTION_VERSION = 2; @@ -20,28 +19,27 @@ export interface ExtrinsicValueV2 { } /** - * @name ExtrinsicV2 + * @name GenericExtrinsicV2 * @description * The second generation of compact extrinsics */ export default class ExtrinsicV2 extends Struct implements IExtrinsicImpl { constructor (registry: Registry, value?: Uint8Array | ExtrinsicValueV2 | Call, { isSigned }: Partial = {}) { super(registry, { - signature: ExtrinsicSignatureV2, + signature: 'ExtrinsicSignatureV2', method: 'Call' }, ExtrinsicV2.decodeExtrinsic(registry, value, isSigned)); } + /** @internal */ public static decodeExtrinsic (registry: Registry, value?: Call | Uint8Array | ExtrinsicValueV2, isSigned = false): ExtrinsicValueV2 { - if (!value) { - return {}; - } else if (value instanceof ExtrinsicV2) { + if (value instanceof ExtrinsicV2) { return value; } else if (value instanceof ClassOf(registry, 'Call')) { return { method: value }; } else if (isU8a(value)) { // here we decode manually since we need to pull through the version information - const signature = new ExtrinsicSignatureV2(registry, value, { isSigned }); + const signature = createType(registry, 'ExtrinsicSignatureV2', value, { isSigned }); const method = createType(registry, 'Call', value.subarray(signature.encodedLength)); return { @@ -50,7 +48,7 @@ export default class ExtrinsicV2 extends Struct implements IExtrinsicImpl { }; } - return value; + return value || {}; } /** diff --git a/packages/types/src/primitive/Extrinsic/v2/ExtrinsicPayload.ts b/packages/types/src/primitive/Extrinsic/v2/ExtrinsicPayload.ts index d9d8cf14f2..488eaea6f9 100644 --- a/packages/types/src/primitive/Extrinsic/v2/ExtrinsicPayload.ts +++ b/packages/types/src/primitive/Extrinsic/v2/ExtrinsicPayload.ts @@ -3,23 +3,15 @@ // of the Apache-2.0 license. See the LICENSE file for details. import { Balance, ExtrinsicEra, Hash, Index } from '../../../interfaces/runtime'; -import { ExtrinsicPayloadValue, IKeyringPair, InterfaceTypes, Registry } from '../../../types'; +import { ExtrinsicPayloadValue, IKeyringPair, Registry } from '../../../types'; import Compact from '../../../codec/Compact'; import Struct from '../../../codec/Struct'; import Bytes from '../../../primitive/Bytes'; import { sign } from '../util'; -// the base definition (excluding extras) -export const SignedPayloadBaseV2: Record = { - method: 'Bytes', - era: 'ExtrinsicEra', - nonce: 'Compact', - tip: 'Compact' -}; - /** - * @name ExtrinsicPayloadV2 + * @name GenericExtrinsicPayloadV2 * @description * A signing payload for an [[Extrinsic]]. For the final encoding, it is variable length based * on the contents included @@ -27,7 +19,10 @@ export const SignedPayloadBaseV2: Record = { export default class ExtrinsicPayloadV2 extends Struct { constructor (registry: Registry, value?: ExtrinsicPayloadValue | Uint8Array | string) { super(registry, { - ...SignedPayloadBaseV2, + method: 'Bytes', + era: 'ExtrinsicEra', + nonce: 'Compact', + tip: 'Compact', blockHash: 'Hash' }, value); } diff --git a/packages/types/src/primitive/Extrinsic/v2/ExtrinsicSignature.ts b/packages/types/src/primitive/Extrinsic/v2/ExtrinsicSignature.ts index 265459c94b..ba398252a7 100644 --- a/packages/types/src/primitive/Extrinsic/v2/ExtrinsicSignature.ts +++ b/packages/types/src/primitive/Extrinsic/v2/ExtrinsicSignature.ts @@ -13,7 +13,7 @@ import { EMPTY_U8A, IMMORTAL_ERA } from '../constants'; import ExtrinsicPayloadV2 from './ExtrinsicPayload'; /** - * @name ExtrinsicSignatureV2 + * @name GenericExtrinsicSignatureV2 * @description * A container for the [[Signature]] associated with a specific [[Extrinsic]] */ @@ -28,6 +28,7 @@ export default class ExtrinsicSignatureV2 extends Struct implements IExtrinsicSi }, ExtrinsicSignatureV2.decodeExtrinsicSignature(value, isSigned)); } + /** @internal */ public static decodeExtrinsicSignature (value: ExtrinsicSignatureV2 | Uint8Array | undefined, isSigned = false): ExtrinsicSignatureV2 | Uint8Array { if (!value) { return EMPTY_U8A; diff --git a/packages/types/src/primitive/Extrinsic/v2/index.ts b/packages/types/src/primitive/Extrinsic/v2/index.ts new file mode 100644 index 0000000000..f5f90d1ccf --- /dev/null +++ b/packages/types/src/primitive/Extrinsic/v2/index.ts @@ -0,0 +1,7 @@ +// Copyright 2017-2020 @polkadot/types authors & contributors +// This software may be modified and distributed under the terms +// of the Apache-2.0 license. See the LICENSE file for details. + +export { default as GenericExtrinsicV2 } from './Extrinsic'; +export { default as GenericExtrinsicPayloadV2 } from './ExtrinsicPayload'; +export { default as GenericExtrinsicSignatureV2 } from './ExtrinsicSignature'; diff --git a/packages/types/src/primitive/Extrinsic/v3/Extrinsic.ts b/packages/types/src/primitive/Extrinsic/v3/Extrinsic.ts index ef16d4ecf4..00253c2e9d 100644 --- a/packages/types/src/primitive/Extrinsic/v3/Extrinsic.ts +++ b/packages/types/src/primitive/Extrinsic/v3/Extrinsic.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 { Address, Call } from '../../../interfaces/runtime'; +import { Address, Call, ExtrinsicSignatureV3 } from '../../../interfaces/runtime'; import { ExtrinsicPayloadValue, IExtrinsicImpl, IKeyringPair, Registry, SignatureOptions } from '../../../types'; import { ExtrinsicOptions } from '../types'; @@ -10,7 +10,6 @@ import { isU8a } from '@polkadot/util'; import { createType, ClassOf } from '../../../codec/create'; import Struct from '../../../codec/Struct'; -import ExtrinsicSignatureV3 from './ExtrinsicSignature'; const TRANSACTION_VERSION = 3; @@ -20,28 +19,27 @@ export interface ExtrinsicValueV3 { } /** - * @name ExtrinsicV3 + * @name GenericExtrinsicV3 * @description * The third generation of compact extrinsics */ export default class ExtrinsicV3 extends Struct implements IExtrinsicImpl { constructor (registry: Registry, value?: Uint8Array | ExtrinsicValueV3 | Call, { isSigned }: Partial = {}) { super(registry, { - signature: ExtrinsicSignatureV3, + signature: 'ExtrinsicSignatureV3', method: 'Call' }, ExtrinsicV3.decodeExtrinsic(registry, value, isSigned)); } + /** @internal */ public static decodeExtrinsic (registry: Registry, value?: Call | Uint8Array | ExtrinsicValueV3, isSigned = false): ExtrinsicValueV3 { - if (!value) { - return {}; - } else if (value instanceof ExtrinsicV3) { + if (value instanceof ExtrinsicV3) { return value; } else if (value instanceof ClassOf(registry, 'Call')) { return { method: value }; } else if (isU8a(value)) { // here we decode manually since we need to pull through the version information - const signature = new ExtrinsicSignatureV3(registry, value, { isSigned }); + const signature = createType(registry, 'ExtrinsicSignatureV3', value, { isSigned }); const method = createType(registry, 'Call', value.subarray(signature.encodedLength)); return { @@ -50,7 +48,7 @@ export default class ExtrinsicV3 extends Struct implements IExtrinsicImpl { }; } - return value; + return value || {}; } /** diff --git a/packages/types/src/primitive/Extrinsic/v3/ExtrinsicPayload.ts b/packages/types/src/primitive/Extrinsic/v3/ExtrinsicPayload.ts index 09aa55e765..4cd4dd2604 100644 --- a/packages/types/src/primitive/Extrinsic/v3/ExtrinsicPayload.ts +++ b/packages/types/src/primitive/Extrinsic/v3/ExtrinsicPayload.ts @@ -10,10 +10,9 @@ import Struct from '../../../codec/Struct'; import Bytes from '../../../primitive/Bytes'; import u32 from '../../../primitive/U32'; import { sign } from '../util'; -import { SignedPayloadBaseV2 as SignedPayloadBaseV3 } from '../v2/ExtrinsicPayload'; /** - * @name ExtrinsicPayloadV3 + * @name GenericExtrinsicPayloadV3 * @description * A signing payload for an [[Extrinsic]]. For the final encoding, it is variable length based * on the contents included @@ -21,8 +20,12 @@ import { SignedPayloadBaseV2 as SignedPayloadBaseV3 } from '../v2/ExtrinsicPaylo export default class ExtrinsicPayloadV3 extends Struct { constructor (registry: Registry, value?: ExtrinsicPayloadValue | Uint8Array | string) { super(registry, { - ...SignedPayloadBaseV3, - // signed extensions + method: 'Bytes', + // extensions + era: 'ExtrinsicEra', + nonce: 'Compact', + tip: 'Compact', + // extensions (additional) specVersion: 'u32', genesisHash: 'Hash', blockHash: 'Hash' diff --git a/packages/types/src/primitive/Extrinsic/v3/ExtrinsicSignature.ts b/packages/types/src/primitive/Extrinsic/v3/ExtrinsicSignature.ts index 6f9f965f1c..539856a978 100644 --- a/packages/types/src/primitive/Extrinsic/v3/ExtrinsicSignature.ts +++ b/packages/types/src/primitive/Extrinsic/v3/ExtrinsicSignature.ts @@ -11,7 +11,7 @@ import ExtrinsicSignatureV2 from '../v2/ExtrinsicSignature'; import ExtrinsicPayloadV3 from './ExtrinsicPayload'; /** - * @name ExtrinsicSignatureV3 + * @name GenericExtrinsicSignatureV3 * @description * A container for the [[Signature]] associated with a specific [[Extrinsic]] */ diff --git a/packages/types/src/primitive/Extrinsic/v3/index.ts b/packages/types/src/primitive/Extrinsic/v3/index.ts new file mode 100644 index 0000000000..935ffcd8bd --- /dev/null +++ b/packages/types/src/primitive/Extrinsic/v3/index.ts @@ -0,0 +1,7 @@ +// Copyright 2017-2020 @polkadot/types authors & contributors +// This software may be modified and distributed under the terms +// of the Apache-2.0 license. See the LICENSE file for details. + +export { default as GenericExtrinsicV3 } from './Extrinsic'; +export { default as GenericExtrinsicPayloadV3 } from './ExtrinsicPayload'; +export { default as GenericExtrinsicSignatureV3 } from './ExtrinsicSignature'; diff --git a/packages/types/src/primitive/Extrinsic/v4/Extrinsic.ts b/packages/types/src/primitive/Extrinsic/v4/Extrinsic.ts index f967edacb1..41464d4eab 100644 --- a/packages/types/src/primitive/Extrinsic/v4/Extrinsic.ts +++ b/packages/types/src/primitive/Extrinsic/v4/Extrinsic.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 { Address, Call } from '../../../interfaces/runtime'; +import { Address, Call, ExtrinsicSignatureV4 } from '../../../interfaces/runtime'; import { ExtrinsicPayloadValue, IExtrinsicImpl, IKeyringPair, Registry, SignatureOptions } from '../../../types'; import { ExtrinsicOptions } from '../types'; @@ -10,7 +10,6 @@ import { isU8a } from '@polkadot/util'; import { createType, ClassOf } from '../../../codec/create'; import Struct from '../../../codec/Struct'; -import ExtrinsicSignatureV4 from './ExtrinsicSignature'; export const TRANSACTION_VERSION = 4; @@ -20,28 +19,27 @@ export interface ExtrinsicValueV4 { } /** - * @name ExtrinsicV4 + * @name GenericExtrinsicV4 * @description * The third generation of compact extrinsics */ export default class ExtrinsicV4 extends Struct implements IExtrinsicImpl { constructor (registry: Registry, value?: Uint8Array | ExtrinsicValueV4 | Call, { isSigned }: Partial = {}) { super(registry, { - signature: ExtrinsicSignatureV4, + signature: 'ExtrinsicSignatureV4', method: 'Call' }, ExtrinsicV4.decodeExtrinsic(registry, value, isSigned)); } + /** @internal */ public static decodeExtrinsic (registry: Registry, value?: Call | Uint8Array | ExtrinsicValueV4, isSigned = false): ExtrinsicValueV4 { - if (!value) { - return {}; - } else if (value instanceof ExtrinsicV4) { + if (value instanceof ExtrinsicV4) { return value; } else if (value instanceof ClassOf(registry, 'Call')) { return { method: value }; } else if (isU8a(value)) { // here we decode manually since we need to pull through the version information - const signature = new ExtrinsicSignatureV4(registry, value, { isSigned }); + const signature = createType(registry, 'ExtrinsicSignatureV4', value, { isSigned }); const method = createType(registry, 'Call', value.subarray(signature.encodedLength)); return { @@ -50,7 +48,7 @@ export default class ExtrinsicV4 extends Struct implements IExtrinsicImpl { }; } - return value; + return value || {}; } /** diff --git a/packages/types/src/primitive/Extrinsic/v4/ExtrinsicPayload.ts b/packages/types/src/primitive/Extrinsic/v4/ExtrinsicPayload.ts index 590239ac9a..3c95382a99 100644 --- a/packages/types/src/primitive/Extrinsic/v4/ExtrinsicPayload.ts +++ b/packages/types/src/primitive/Extrinsic/v4/ExtrinsicPayload.ts @@ -10,10 +10,9 @@ import Struct from '../../../codec/Struct'; import Bytes from '../../../primitive/Bytes'; import u32 from '../../../primitive/U32'; import { sign } from '../util'; -import { SignedPayloadBaseV2 as SignedPayloadBaseV4 } from '../v2/ExtrinsicPayload'; /** - * @name ExtrinsicPayloadV4 + * @name GenericExtrinsicPayloadV4 * @description * A signing payload for an [[Extrinsic]]. For the final encoding, it is variable length based * on the contents included @@ -21,19 +20,9 @@ import { SignedPayloadBaseV2 as SignedPayloadBaseV4 } from '../v2/ExtrinsicPaylo export default class ExtrinsicPayloadV4 extends Struct { constructor (registry: Registry, value?: ExtrinsicPayloadValue | Uint8Array | string) { super(registry, { - ...SignedPayloadBaseV4, - // TODO get the signed extensions from the registry and apply - ...{ - // system::CheckVersion - specVersion: 'u32', - // system::CheckGenesis - genesisHash: 'Hash', - // system::CheckEra - blockHash: 'Hash' - // system::CheckNonce - // system::CheckWeight - // balances::TakeFees - } + method: 'Bytes', + ...registry.getSignedExtensionTypes(), + ...registry.getSignedExtensionExtra() }, value); } diff --git a/packages/types/src/primitive/Extrinsic/v4/ExtrinsicSignature.ts b/packages/types/src/primitive/Extrinsic/v4/ExtrinsicSignature.ts index f0df79cada..363d0d39a2 100644 --- a/packages/types/src/primitive/Extrinsic/v4/ExtrinsicSignature.ts +++ b/packages/types/src/primitive/Extrinsic/v4/ExtrinsicSignature.ts @@ -15,7 +15,7 @@ import { EMPTY_U8A, IMMORTAL_ERA } from '../constants'; import ExtrinsicPayloadV4 from './ExtrinsicPayload'; /** - * @name ExtrinsicSignatureV4 + * @name GenericExtrinsicSignatureV4 * @description * A container for the [[Signature]] associated with a specific [[Extrinsic]] */ @@ -24,12 +24,11 @@ export default class ExtrinsicSignatureV4 extends Struct implements IExtrinsicSi super(registry, { signer: 'Address', signature: 'MultiSignature', - era: 'ExtrinsicEra', - nonce: 'Compact', - tip: 'Compact' + ...registry.getSignedExtensionTypes() }, ExtrinsicSignatureV4.decodeExtrinsicSignature(value, isSigned)); } + /** @internal */ public static decodeExtrinsicSignature (value: ExtrinsicSignatureV4 | Uint8Array | undefined, isSigned = false): ExtrinsicSignatureV4 | Uint8Array { if (!value) { return EMPTY_U8A; diff --git a/packages/types/src/primitive/Extrinsic/v4/index.ts b/packages/types/src/primitive/Extrinsic/v4/index.ts new file mode 100644 index 0000000000..7bf857af07 --- /dev/null +++ b/packages/types/src/primitive/Extrinsic/v4/index.ts @@ -0,0 +1,7 @@ +// Copyright 2017-2020 @polkadot/types authors & contributors +// This software may be modified and distributed under the terms +// of the Apache-2.0 license. See the LICENSE file for details. + +export { default as GenericExtrinsicV4 } from './Extrinsic'; +export { default as GenericExtrinsicPayloadV4 } from './ExtrinsicPayload'; +export { default as GenericExtrinsicSignatureV4 } from './ExtrinsicSignature'; diff --git a/packages/types/src/primitive/Generic/AccountId.ts b/packages/types/src/primitive/Generic/AccountId.ts index 93c738a016..f0535f54af 100644 --- a/packages/types/src/primitive/Generic/AccountId.ts +++ b/packages/types/src/primitive/Generic/AccountId.ts @@ -25,6 +25,7 @@ export default class AccountId extends U8aFixed { return encodeAddress(value); } + /** @internal */ private static decodeAccountId (value: AnyU8a | AnyString): Uint8Array { if (isU8a(value) || Array.isArray(value)) { return u8aToU8a(value); diff --git a/packages/types/src/primitive/Generic/AccountIndex.ts b/packages/types/src/primitive/Generic/AccountIndex.ts index 0eae84cc0f..e49448102b 100644 --- a/packages/types/src/primitive/Generic/AccountIndex.ts +++ b/packages/types/src/primitive/Generic/AccountIndex.ts @@ -32,6 +32,7 @@ export default class AccountIndex extends U32 { super(registry, AccountIndex.decodeAccountIndex(value)); } + /** @internal */ public static decodeAccountIndex (value: AnyNumber): BN | Uint8Array | number | string { if (value instanceof AccountIndex) { // `value.toBn()` on AccountIndex returns a pure BN (i.e. not an diff --git a/packages/types/src/primitive/Generic/Address.ts b/packages/types/src/primitive/Generic/Address.ts index 779d768dfa..1467c02ec8 100644 --- a/packages/types/src/primitive/Generic/Address.ts +++ b/packages/types/src/primitive/Generic/Address.ts @@ -30,6 +30,7 @@ export default class Address extends Base { super(registry, Address.decodeAddress(registry, value)); } + /** @internal */ public static decodeAddress (registry: Registry, value: AnyAddress): AccountId | AccountIndex { if (value instanceof AccountId || value instanceof AccountIndex) { return value; @@ -44,6 +45,7 @@ export default class Address extends Base { return Address.decodeString(registry, value); } + /** @internal */ private static decodeString (registry: Registry, value: string): AccountId | AccountIndex { const decoded = decodeAddress(value); @@ -52,6 +54,7 @@ export default class Address extends Base { : createType(registry, 'AccountIndex', u8aToBn(decoded, true)); } + /** @internal */ private static decodeU8a (registry: Registry, value: Uint8Array): AccountId | AccountIndex { // This allows us to instantiate an address with a raw publicKey. Do this first before // we checking the first byte, otherwise we may split an already-existent valid address diff --git a/packages/types/src/primitive/Generic/Call.ts b/packages/types/src/primitive/Generic/Call.ts index 2596eb9dfc..9fb6748b52 100644 --- a/packages/types/src/primitive/Generic/Call.ts +++ b/packages/types/src/primitive/Generic/Call.ts @@ -61,6 +61,7 @@ export default class Call extends Struct implements IMethod { * - {@see DecodeMethodInput} * @param _meta - Metadata to use, so that `injectMethods` lookup is not * necessary. + * @internal */ private static decodeCall (registry: Registry, value: DecodedMethod | Uint8Array | string = new Uint8Array(), _meta?: FunctionMetadataLatest): DecodedMethod { if (isHex(value) || isU8a(value)) { @@ -72,6 +73,7 @@ export default class Call extends Struct implements IMethod { throw new Error(`Call: Cannot decode value '${value}' of type ${typeof value}`); } + /** @internal */ private static decodeCallViaObject (registry: Registry, value: DecodedMethod, _meta?: FunctionMetadataLatest): DecodedMethod { // we only pass args/methodsIndex out const { args, callIndex } = value; @@ -92,6 +94,7 @@ export default class Call extends Struct implements IMethod { }; } + /** @internal */ private static decodeCallViaU8a (registry: Registry, value: Uint8Array, _meta?: FunctionMetadataLatest): DecodedMethod { // We need 2 bytes for the callIndex const callIndex = new Uint8Array(2); @@ -124,6 +127,7 @@ export default class Call extends Struct implements IMethod { * its metadata. * * @param meta - The function metadata used to get the definition. + * @internal */ private static getArgsDef (registry: Registry, meta: FunctionMetadataLatest): ArgsDef { return Call.filterOrigin(meta).reduce((result, { name, type }): ArgsDef => { diff --git a/packages/types/src/primitive/Generic/Event.ts b/packages/types/src/primitive/Generic/Event.ts index 6054a12def..62608b9b9b 100644 --- a/packages/types/src/primitive/Generic/Event.ts +++ b/packages/types/src/primitive/Generic/Event.ts @@ -81,6 +81,7 @@ export default class Event extends Struct { }, value); } + /** @internal */ public static decodeEvent (registry: Registry, value: Uint8Array = new Uint8Array()): { DataType: Constructor | Constructor; value?: { index: Uint8Array; data: Uint8Array } } { if (!value.length) { return { diff --git a/packages/types/src/primitive/Generic/Vote.ts b/packages/types/src/primitive/Generic/Vote.ts index 46ceda1c96..be7b910f81 100644 --- a/packages/types/src/primitive/Generic/Vote.ts +++ b/packages/types/src/primitive/Generic/Vote.ts @@ -45,6 +45,7 @@ export default class Vote extends U8aFixed { this._conviction = createType(this.registry, 'Conviction', decoded[0] & CON_MASK); } + /** @internal */ private static decodeVote (registry: Registry, value?: InputTypes): Uint8Array { if (isUndefined(value)) { return Vote.decodeVoteBool(false); @@ -62,12 +63,14 @@ export default class Vote extends U8aFixed { return new Uint8Array([vote | conviction.index]); } + /** @internal */ private static decodeVoteBool (value: boolean): Uint8Array { return value ? new Uint8Array([AYE_BITS | DEF_CONV]) : new Uint8Array([NAY_BITS]); } + /** @internal */ private static decodeVoteU8a (value: Uint8Array): Uint8Array { return value.length ? value.subarray(0, 1) diff --git a/packages/types/src/primitive/StorageKey.ts b/packages/types/src/primitive/StorageKey.ts index d13ffbbcc8..8ed886055e 100644 --- a/packages/types/src/primitive/StorageKey.ts +++ b/packages/types/src/primitive/StorageKey.ts @@ -74,6 +74,7 @@ export default class StorageKey extends Bytes { this._section = override.section || section; } + /** @internal */ public static decodeStorageKey (value?: AnyU8a | StorageKey | StorageEntry | [StorageEntry, any]): Decoded { if (value instanceof StorageKey) { return { diff --git a/packages/types/src/primitive/Text.ts b/packages/types/src/primitive/Text.ts index 49f15d5c9d..d82696dcf4 100644 --- a/packages/types/src/primitive/Text.ts +++ b/packages/types/src/primitive/Text.ts @@ -31,6 +31,7 @@ export default class Text extends String implements Codec { this.registry = registry; } + /** @internal */ private static decodeText (value: Text | string | AnyU8a | { toString: () => string }): string { if (isHex(value)) { return u8aToString(hexToU8a(value.toString())); diff --git a/packages/types/src/types.ts b/packages/types/src/types.ts index 7aeb96b51a..4e3046cb47 100644 --- a/packages/types/src/types.ts +++ b/packages/types/src/types.ts @@ -372,6 +372,12 @@ export interface RegistryMetadataEvents { unwrap (): RegistryMetadataEvent[]; } +export interface RegistryMetadataExtrinsic { + version: BN; + // eslint-disable-next-line @typescript-eslint/ban-types + signedExtensions: String[]; +} + export interface RegistryMetadataModule { calls: RegistryMetadataCalls; errors: RegistryMetadataErrors; @@ -381,6 +387,7 @@ export interface RegistryMetadataModule { export interface RegistryMetadataLatest { modules: RegistryMetadataModule[]; + extrinsic: RegistryMetadataExtrinsic; } export interface RegistryMetadata { @@ -396,6 +403,8 @@ export interface Registry { get (name: string): Constructor | undefined; getOrThrow (name: string, msg?: string): Constructor; + getSignedExtensionExtra (): Record; + getSignedExtensionTypes (): Record; hasClass (name: string): boolean; hasDef (name: string): boolean; hasType (name: string): boolean;