Skip to content

Commit 9d5fb2b

Browse files
authored
Add asset id in signing (#4009)
* add assetId to SignerOptions * pull assetId into extrinsic signing * set assetId to optional AnyNumber throughout * add logging of extrinsic options * add assetId to _injectSignature & add getters * re-add import * longer doc comments
1 parent 2cf0e30 commit 9d5fb2b

File tree

4 files changed

+27
-4
lines changed

4 files changed

+27
-4
lines changed

packages/api/src/submittable/types.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ export interface SignerOptions {
4545
nonce: AnyNumber | Codec;
4646
signer?: Signer;
4747
tip?: AnyNumber;
48+
assetId?: AnyNumber;
4849
}
4950

5051
export type AddressOrPair = IKeyringPair | string | AccountId | Address;

packages/types/src/extrinsic/v4/ExtrinsicPayload.ts

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@
33

44
import type { SignOptions } from '@polkadot/keyring/types';
55
import type { ExtrinsicEra } from '../../interfaces/extrinsics';
6-
import type { Balance, Hash, Index } from '../../interfaces/runtime';
6+
import type { AssetId, Balance, Hash, Index } from '../../interfaces/runtime';
77
import type { ExtrinsicPayloadValue, IKeyringPair, Registry } from '../../types';
88

99
import { Compact } from '../../codec/Compact';
1010
import { Enum } from '../../codec/Enum';
11+
import { Option } from '../../codec/Option';
1112
import { Struct } from '../../codec/Struct';
1213
import { Bytes } from '../../primitive/Bytes';
1314
import { u32 } from '../../primitive/U32';
@@ -92,6 +93,14 @@ export class GenericExtrinsicPayloadV4 extends Struct {
9293
return this.get('transactionVersion') as u32;
9394
}
9495

96+
/**
97+
* @description
98+
* The (optional) asset id for this signature for chains that support transaction fees in assets
99+
*/
100+
public get assetId (): Option<AssetId> {
101+
return this.get('assetId') as Option<AssetId>;
102+
}
103+
95104
/**
96105
* @description Sign the payload with the keypair
97106
*/

packages/types/src/extrinsic/v4/ExtrinsicSignature.ts

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@
22
// SPDX-License-Identifier: Apache-2.0
33

44
import type { EcdsaSignature, Ed25519Signature, ExtrinsicEra, ExtrinsicSignature, Sr25519Signature } from '../../interfaces/extrinsics';
5-
import type { Address, Balance, Call, Index } from '../../interfaces/runtime';
5+
import type { Address, AssetId, Balance, Call, Index } from '../../interfaces/runtime';
66
import type { ExtrinsicPayloadValue, IExtrinsicSignature, IKeyringPair, Registry, SignatureOptions } from '../../types';
77
import type { ExtrinsicSignatureOptions } from '../types';
88

99
import { assert, isU8a, stringify, u8aConcat, u8aToHex } from '@polkadot/util';
1010

1111
import { Compact } from '../../codec/Compact';
1212
import { Enum } from '../../codec/Enum';
13+
import { Option } from '../../codec/Option';
1314
import { Struct } from '../../codec/Struct';
1415
import { EMPTY_U8A, IMMORTAL_ERA } from '../constants';
1516
import { GenericExtrinsicPayloadV4 } from './ExtrinsicPayload';
@@ -114,12 +115,21 @@ export class GenericExtrinsicSignatureV4 extends Struct implements IExtrinsicSig
114115
return this.get('tip') as Compact<Balance>;
115116
}
116117

117-
protected _injectSignature (signer: Address, signature: ExtrinsicSignature, { era, nonce, tip }: GenericExtrinsicPayloadV4): IExtrinsicSignature {
118+
/**
119+
* @description
120+
* The (optional) asset id for this signature for chains that support transaction fees in assets
121+
*/
122+
public get assetId (): Option<AssetId> {
123+
return this.get('assetId') as Option<AssetId>;
124+
}
125+
126+
protected _injectSignature (signer: Address, signature: ExtrinsicSignature, { assetId, era, nonce, tip }: GenericExtrinsicPayloadV4): IExtrinsicSignature {
118127
this.set('era', era);
119128
this.set('nonce', nonce);
120129
this.set('signer', signer);
121130
this.set('signature', signature);
122131
this.set('tip', tip);
132+
this.set('assetId', assetId);
123133

124134
return this;
125135
}
@@ -138,8 +148,9 @@ export class GenericExtrinsicSignatureV4 extends Struct implements IExtrinsicSig
138148
/**
139149
* @description Creates a payload from the supplied options
140150
*/
141-
public createPayload (method: Call, { blockHash, era, genesisHash, nonce, runtimeVersion: { specVersion, transactionVersion }, tip }: SignatureOptions): GenericExtrinsicPayloadV4 {
151+
public createPayload (method: Call, { assetId, blockHash, era, genesisHash, nonce, runtimeVersion: { specVersion, transactionVersion }, tip }: SignatureOptions): GenericExtrinsicPayloadV4 {
142152
return new GenericExtrinsicPayloadV4(this.registry, {
153+
assetId,
143154
blockHash,
144155
era: era || IMMORTAL_ERA,
145156
genesisHash,

packages/types/src/types/extrinsic.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,6 +159,7 @@ export interface SignatureOptions {
159159
signedExtensions?: string[];
160160
signer?: Signer;
161161
tip?: AnyNumber;
162+
assetId?: AnyNumber;
162163
}
163164

164165
interface ExtrinsicSignatureBase {
@@ -179,6 +180,7 @@ export interface ExtrinsicPayloadValue {
179180
specVersion: AnyNumber;
180181
tip: AnyNumber;
181182
transactionVersion: AnyNumber;
183+
assetId?: AnyNumber;
182184
}
183185

184186
export interface IExtrinsicSignature extends ExtrinsicSignatureBase, Codec {

0 commit comments

Comments
 (0)