diff --git a/CHANGELOG.md b/CHANGELOG.md index fab3f74b62..6c2e5904e0 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,6 +6,7 @@ - Ensure metadata is only requested once upon startup (bypass on upgrade subscriptions) - Expand testing around `ExtrinsicEra` construction - Expand `Registry` to direct access to available signed extensions (in addition to types) +- Cater for new `CheckSpecVersion` and `CheckTxVersion` signed extensions (with `SignerPayload` adjustments) # 1.13.1 May 6, 2020 diff --git a/packages/metadata/src/Decorated/extrinsics/index.spec.ts b/packages/metadata/src/Decorated/extrinsics/index.spec.ts index b263cdcd18..7c28680180 100644 --- a/packages/metadata/src/Decorated/extrinsics/index.spec.ts +++ b/packages/metadata/src/Decorated/extrinsics/index.spec.ts @@ -29,7 +29,8 @@ describe('extrinsics', (): void => { implName: 'test', implVersion: new BN(123), specName: 'test', - specVersion: new BN(123) + specVersion: new BN(123), + transactionVersion: new BN(123) } }).toHex() ).toEqual( diff --git a/packages/types/src/extrinsic/SignerPayload.spec.ts b/packages/types/src/extrinsic/SignerPayload.spec.ts index 52e34227e8..476de5921a 100644 --- a/packages/types/src/extrinsic/SignerPayload.spec.ts +++ b/packages/types/src/extrinsic/SignerPayload.spec.ts @@ -24,6 +24,7 @@ describe('SignerPayload', (): void => { nonce: '0x00001234', specVersion: '0x00000006', tip: '0x00000000000000000000000000005678', + transactionVersion: '0x00000007', version: 3 }; @@ -50,6 +51,7 @@ describe('SignerPayload', (): void => { nonce: '0x00001234', specVersion: '0x00000000', tip: '0x00000000000000000000000000005678', + transactionVersion: '0x00000000', version: 3 }); }); diff --git a/packages/types/src/extrinsic/SignerPayload.ts b/packages/types/src/extrinsic/SignerPayload.ts index cd4c06eaac..7443e58691 100644 --- a/packages/types/src/extrinsic/SignerPayload.ts +++ b/packages/types/src/extrinsic/SignerPayload.ts @@ -49,7 +49,7 @@ export default class SignerPayload extends _Payload implements ISignerPayload { * @description Creates an representation of the structure as an ISignerPayload JSON */ public toPayload (): SignerPayloadJSON { - const { address, blockHash, blockNumber, era, genesisHash, method, nonce, runtimeVersion: { specVersion }, tip, version } = this; + const { address, blockHash, blockNumber, era, genesisHash, method, nonce, runtimeVersion: { specVersion, transactionVersion }, tip, version } = this; return { address: address.toString(), @@ -61,6 +61,7 @@ export default class SignerPayload extends _Payload implements ISignerPayload { nonce: nonce.toHex(), specVersion: specVersion.toHex(), tip: tip.toHex(), + transactionVersion: transactionVersion.toHex(), version: version.toNumber() }; } diff --git a/packages/types/src/extrinsic/signedExtensions/substrate.ts b/packages/types/src/extrinsic/signedExtensions/substrate.ts index b31d4459fe..7574c14b63 100644 --- a/packages/types/src/extrinsic/signedExtensions/substrate.ts +++ b/packages/types/src/extrinsic/signedExtensions/substrate.ts @@ -35,6 +35,18 @@ export default { nonce: 'Compact' } }, + CheckSpecVersion: { + extra: { + specVersion: 'u32' + }, + types: {} + }, + CheckTxVersion: { + extra: { + transactionVersion: 'u32' + }, + types: {} + }, CheckVersion: { extra: { specVersion: 'u32' diff --git a/packages/types/src/extrinsic/v1/ExtrinsicSignature.ts b/packages/types/src/extrinsic/v1/ExtrinsicSignature.ts index 6573e285d9..03d11e6e0c 100644 --- a/packages/types/src/extrinsic/v1/ExtrinsicSignature.ts +++ b/packages/types/src/extrinsic/v1/ExtrinsicSignature.ts @@ -131,8 +131,10 @@ export default class ExtrinsicSignatureV1 extends Struct implements IExtrinsicSi genesisHash, method: method.toHex(), nonce, - specVersion: 0, // unused for v1, added for compat - tip: 0 + // unused for v1, added for compat + specVersion: 0, + tip: 0, + transactionVersion: 0 }); } diff --git a/packages/types/src/extrinsic/v2/Extrinsic.spec.ts b/packages/types/src/extrinsic/v2/Extrinsic.spec.ts index ce3a12ff83..ca4c659852 100644 --- a/packages/types/src/extrinsic/v2/Extrinsic.spec.ts +++ b/packages/types/src/extrinsic/v2/Extrinsic.spec.ts @@ -58,7 +58,8 @@ describe('ExtrinsicV2', (): void => { implName: 'test', implVersion: new BN(123), specName: 'test', - specVersion: new BN(123) + specVersion: new BN(123), + transactionVersion: new BN(123) }, tip: 2 }).toHex() diff --git a/packages/types/src/extrinsic/v2/ExtrinsicSignature.ts b/packages/types/src/extrinsic/v2/ExtrinsicSignature.ts index e6684567f9..cc3f5cf4ca 100644 --- a/packages/types/src/extrinsic/v2/ExtrinsicSignature.ts +++ b/packages/types/src/extrinsic/v2/ExtrinsicSignature.ts @@ -127,8 +127,10 @@ export default class ExtrinsicSignatureV2 extends Struct implements IExtrinsicSi genesisHash, method: method.toHex(), nonce, - specVersion: 0, // unused for v2 - tip: tip || 0 + // unused for v2 + specVersion: 0, + tip: tip || 0, + transactionVersion: 0 }); } diff --git a/packages/types/src/extrinsic/v3/Extrinsic.spec.ts b/packages/types/src/extrinsic/v3/Extrinsic.spec.ts index 59facba126..2c6d382ca6 100644 --- a/packages/types/src/extrinsic/v3/Extrinsic.spec.ts +++ b/packages/types/src/extrinsic/v3/Extrinsic.spec.ts @@ -58,7 +58,8 @@ describe('ExtrinsicV3', (): void => { implName: 'test', implVersion: new BN(123), specName: 'test', - specVersion: new BN(123) + specVersion: new BN(123), + transactionVersion: new BN(123) }, tip: 2 }).toHex() diff --git a/packages/types/src/extrinsic/v3/ExtrinsicSignature.ts b/packages/types/src/extrinsic/v3/ExtrinsicSignature.ts index fa0c387f7b..5f0b4f1f41 100644 --- a/packages/types/src/extrinsic/v3/ExtrinsicSignature.ts +++ b/packages/types/src/extrinsic/v3/ExtrinsicSignature.ts @@ -39,7 +39,8 @@ export default class ExtrinsicSignatureV3 extends ExtrinsicSignatureV2 { method: method.toHex(), nonce, specVersion, - tip: tip || 0 + tip: tip || 0, + transactionVersion: 0 }); } diff --git a/packages/types/src/extrinsic/v4/Extrinsic.spec.ts b/packages/types/src/extrinsic/v4/Extrinsic.spec.ts index fe0072b84a..5ed5d04769 100644 --- a/packages/types/src/extrinsic/v4/Extrinsic.spec.ts +++ b/packages/types/src/extrinsic/v4/Extrinsic.spec.ts @@ -58,7 +58,8 @@ describe('ExtrinsicV4', (): void => { implName: 'test', implVersion: new BN(123), specName: 'test', - specVersion: new BN(123) + specVersion: new BN(123), + transactionVersion: new BN(123) }, tip: 2 }).toHex() diff --git a/packages/types/src/extrinsic/v4/ExtrinsicPayload.ts b/packages/types/src/extrinsic/v4/ExtrinsicPayload.ts index 0249fab22f..ffd4263d7d 100644 --- a/packages/types/src/extrinsic/v4/ExtrinsicPayload.ts +++ b/packages/types/src/extrinsic/v4/ExtrinsicPayload.ts @@ -76,6 +76,13 @@ export default class ExtrinsicPayloadV4 extends Struct { return this.get('tip') as Compact; } + /** + * @description The transactionVersion for this signature + */ + public get transactionVersion (): u32 { + return this.get('transactionVersion') as u32; + } + /** * @description Sign the payload with the keypair */ diff --git a/packages/types/src/extrinsic/v4/ExtrinsicSignature.ts b/packages/types/src/extrinsic/v4/ExtrinsicSignature.ts index 1c46c02de6..6cea70f19a 100644 --- a/packages/types/src/extrinsic/v4/ExtrinsicSignature.ts +++ b/packages/types/src/extrinsic/v4/ExtrinsicSignature.ts @@ -125,7 +125,7 @@ export default class ExtrinsicSignatureV4 extends Struct implements IExtrinsicSi /** * @description Creates a payload from the supplied options */ - public createPayload (method: Call, { blockHash, era, genesisHash, nonce, runtimeVersion: { specVersion }, tip }: SignatureOptions): ExtrinsicPayloadV4 { + public createPayload (method: Call, { blockHash, era, genesisHash, nonce, runtimeVersion: { specVersion, transactionVersion }, tip }: SignatureOptions): ExtrinsicPayloadV4 { return new ExtrinsicPayloadV4(this.registry, { blockHash, era: era || IMMORTAL_ERA, @@ -133,7 +133,8 @@ export default class ExtrinsicSignatureV4 extends Struct implements IExtrinsicSi method: method.toHex(), nonce, specVersion, - tip: tip || 0 + tip: tip || 0, + transactionVersion: transactionVersion || 0 }); } diff --git a/packages/types/src/types/extrinsic.ts b/packages/types/src/types/extrinsic.ts index f1c4d87442..72f60b8383 100644 --- a/packages/types/src/types/extrinsic.ts +++ b/packages/types/src/types/extrinsic.ts @@ -82,6 +82,7 @@ export interface ExtrinsicPayloadValue { nonce: AnyNumber; specVersion: AnyNumber; tip: AnyNumber; + transactionVersion: AnyNumber; } // eslint-disable-next-line @typescript-eslint/interface-name-prefix @@ -165,6 +166,11 @@ export interface SignerPayloadJSON { */ tip: string; + /** + * @description The current transaction version for the runtime + */ + transactionVersion: string; + /** * @description The version of the extrinsic we are dealing with */ diff --git a/packages/types/src/types/interfaces.ts b/packages/types/src/types/interfaces.ts index ae1903b2d8..60b4bc9693 100644 --- a/packages/types/src/types/interfaces.ts +++ b/packages/types/src/types/interfaces.ts @@ -42,6 +42,7 @@ export interface IRuntimeVersion { // eslint-disable-next-line @typescript-eslint/ban-types readonly specName: String; readonly specVersion: BN; + readonly transactionVersion: BN; } // A type alias for [Type1, Type2] & Codec, representing a tuple (Type1, Type2)