Skip to content

Commit cfc72a6

Browse files
committed
fix: Keyring.signTypedData accepts types for V1
1 parent 925efd8 commit cfc72a6

File tree

4 files changed

+31
-14
lines changed

4 files changed

+31
-14
lines changed

packages/keyring-eth-ledger-bridge/src/ledger-keyring.ts

+8-4
Original file line numberDiff line numberDiff line change
@@ -484,12 +484,16 @@ export class LedgerKeyring implements Keyring {
484484
return hdPath;
485485
}
486486

487-
async signTypedData<T extends MessageTypes>(
487+
async signTypedData<
488+
Version extends SignTypedDataVersion.V4,
489+
Types extends MessageTypes,
490+
Options extends { version?: Version },
491+
>(
488492
withAccount: Hex,
489-
data: TypedMessage<T>,
490-
options: { version?: string } = {},
493+
data: TypedMessage<Types>,
494+
options: Options,
491495
): Promise<string> {
492-
const isV4 = options.version === 'V4';
496+
const isV4 = options?.version === 'V4';
493497
if (!isV4) {
494498
throw new Error(
495499
'Ledger: Only version 4 of typed data signing is supported',

packages/keyring-eth-simple/src/simple-keyring.ts

+15-6
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ import {
1010
toBuffer,
1111
} from '@ethereumjs/util';
1212
import {
13+
type TypedDataV1,
14+
type MessageTypes,
15+
type TypedMessage,
1316
concatSig,
1417
decrypt,
1518
EIP7702Authorization,
@@ -147,17 +150,23 @@ export default class SimpleKeyring implements Keyring {
147150
return decrypt({ privateKey, encryptedData });
148151
}
149152

150-
// personal_signTypedData, signs data along with the schema
151-
async signTypedData(
153+
async signTypedData<
154+
Version extends SignTypedDataVersion,
155+
Types extends MessageTypes,
156+
Options extends { version: Version } & KeyringOpt,
157+
>(
152158
address: Hex,
153-
typedData: any,
154-
opts: KeyringOpt = { version: SignTypedDataVersion.V1 },
159+
typedData: Version extends SignTypedDataVersion.V1
160+
? TypedDataV1
161+
: TypedMessage<Types>,
162+
opts?: Options,
155163
): Promise<string> {
164+
const options = opts ?? { version: SignTypedDataVersion.V1 };
156165
// Treat invalid versions as "V1"
157166
let version = SignTypedDataVersion.V1;
158167

159-
if (opts.version && isSignTypedDataVersion(opts.version)) {
160-
version = SignTypedDataVersion[opts.version];
168+
if (options.version && isSignTypedDataVersion(options.version)) {
169+
version = SignTypedDataVersion[options.version];
161170
}
162171

163172
const privateKey = this.#getPrivateKeyFor(address, opts);

packages/keyring-eth-trezor/src/trezor-keyring.ts

+7-3
Original file line numberDiff line numberDiff line change
@@ -453,10 +453,14 @@ export class TrezorKeyring implements Keyring {
453453
}
454454

455455
// EIP-712 Sign Typed Data
456-
async signTypedData<T extends MessageTypes>(
456+
async signTypedData<
457+
Version extends SignTypedDataVersion.V3 | SignTypedDataVersion.V4,
458+
Types extends MessageTypes,
459+
Options extends { version?: Version },
460+
>(
457461
address: Hex,
458-
data: TypedMessage<T>,
459-
{ version }: { version: SignTypedDataVersion },
462+
data: TypedMessage<Types>,
463+
{ version }: Options,
460464
): Promise<string> {
461465
const dataWithHashes = transformTypedData(
462466
data,

packages/keyring-utils/src/keyring.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -229,7 +229,7 @@ export type Keyring = {
229229
*/
230230
signTypedData?(
231231
address: Hex,
232-
typedData: Record<string, unknown>,
232+
typedData: unknown[] | Record<string, unknown>,
233233
options?: Record<string, unknown>,
234234
): Promise<string>;
235235

0 commit comments

Comments
 (0)