diff --git a/packages/api/src/submittable/types.ts b/packages/api/src/submittable/types.ts index 533aa34651..741bc5335d 100644 --- a/packages/api/src/submittable/types.ts +++ b/packages/api/src/submittable/types.ts @@ -45,6 +45,7 @@ export interface SignerOptions { nonce: AnyNumber | Codec; signer?: Signer; tip?: AnyNumber; + assetId?: AnyNumber; } export type AddressOrPair = IKeyringPair | string | AccountId | Address; diff --git a/packages/types/src/extrinsic/v4/ExtrinsicPayload.ts b/packages/types/src/extrinsic/v4/ExtrinsicPayload.ts index 712abe9961..9b2575d06c 100644 --- a/packages/types/src/extrinsic/v4/ExtrinsicPayload.ts +++ b/packages/types/src/extrinsic/v4/ExtrinsicPayload.ts @@ -3,11 +3,12 @@ import type { SignOptions } from '@polkadot/keyring/types'; import type { ExtrinsicEra } from '../../interfaces/extrinsics'; -import type { Balance, Hash, Index } from '../../interfaces/runtime'; +import type { AssetId, Balance, Hash, Index } from '../../interfaces/runtime'; import type { ExtrinsicPayloadValue, IKeyringPair, Registry } from '../../types'; import { Compact } from '../../codec/Compact'; import { Enum } from '../../codec/Enum'; +import { Option } from '../../codec/Option'; import { Struct } from '../../codec/Struct'; import { Bytes } from '../../primitive/Bytes'; import { u32 } from '../../primitive/U32'; @@ -92,6 +93,14 @@ export class GenericExtrinsicPayloadV4 extends Struct { return this.get('transactionVersion') as u32; } + /** + * @description + * The (optional) asset id for this signature for chains that support transaction fees in assets + */ + public get assetId (): Option { + return this.get('assetId') as Option; + } + /** * @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 865fe33ebb..4916a5023a 100644 --- a/packages/types/src/extrinsic/v4/ExtrinsicSignature.ts +++ b/packages/types/src/extrinsic/v4/ExtrinsicSignature.ts @@ -2,7 +2,7 @@ // SPDX-License-Identifier: Apache-2.0 import type { EcdsaSignature, Ed25519Signature, ExtrinsicEra, ExtrinsicSignature, Sr25519Signature } from '../../interfaces/extrinsics'; -import type { Address, Balance, Call, Index } from '../../interfaces/runtime'; +import type { Address, AssetId, Balance, Call, Index } from '../../interfaces/runtime'; import type { ExtrinsicPayloadValue, IExtrinsicSignature, IKeyringPair, Registry, SignatureOptions } from '../../types'; import type { ExtrinsicSignatureOptions } from '../types'; @@ -10,6 +10,7 @@ import { assert, isU8a, stringify, u8aConcat, u8aToHex } from '@polkadot/util'; import { Compact } from '../../codec/Compact'; import { Enum } from '../../codec/Enum'; +import { Option } from '../../codec/Option'; import { Struct } from '../../codec/Struct'; import { EMPTY_U8A, IMMORTAL_ERA } from '../constants'; import { GenericExtrinsicPayloadV4 } from './ExtrinsicPayload'; @@ -114,12 +115,21 @@ export class GenericExtrinsicSignatureV4 extends Struct implements IExtrinsicSig return this.get('tip') as Compact; } - protected _injectSignature (signer: Address, signature: ExtrinsicSignature, { era, nonce, tip }: GenericExtrinsicPayloadV4): IExtrinsicSignature { + /** + * @description + * The (optional) asset id for this signature for chains that support transaction fees in assets + */ + public get assetId (): Option { + return this.get('assetId') as Option; + } + + protected _injectSignature (signer: Address, signature: ExtrinsicSignature, { assetId, era, nonce, tip }: GenericExtrinsicPayloadV4): IExtrinsicSignature { this.set('era', era); this.set('nonce', nonce); this.set('signer', signer); this.set('signature', signature); this.set('tip', tip); + this.set('assetId', assetId); return this; } @@ -138,8 +148,9 @@ export class GenericExtrinsicSignatureV4 extends Struct implements IExtrinsicSig /** * @description Creates a payload from the supplied options */ - public createPayload (method: Call, { blockHash, era, genesisHash, nonce, runtimeVersion: { specVersion, transactionVersion }, tip }: SignatureOptions): GenericExtrinsicPayloadV4 { + public createPayload (method: Call, { assetId, blockHash, era, genesisHash, nonce, runtimeVersion: { specVersion, transactionVersion }, tip }: SignatureOptions): GenericExtrinsicPayloadV4 { return new GenericExtrinsicPayloadV4(this.registry, { + assetId, blockHash, era: era || IMMORTAL_ERA, genesisHash, diff --git a/packages/types/src/types/extrinsic.ts b/packages/types/src/types/extrinsic.ts index 511d052787..acbd3ddd74 100644 --- a/packages/types/src/types/extrinsic.ts +++ b/packages/types/src/types/extrinsic.ts @@ -159,6 +159,7 @@ export interface SignatureOptions { signedExtensions?: string[]; signer?: Signer; tip?: AnyNumber; + assetId?: AnyNumber; } interface ExtrinsicSignatureBase { @@ -179,6 +180,7 @@ export interface ExtrinsicPayloadValue { specVersion: AnyNumber; tip: AnyNumber; transactionVersion: AnyNumber; + assetId?: AnyNumber; } export interface IExtrinsicSignature extends ExtrinsicSignatureBase, Codec {