From 3a1106f2dd406aff2c4c8daa7ac081376ac2076c Mon Sep 17 00:00:00 2001 From: jpuri Date: Thu, 23 Jan 2025 11:21:41 +0530 Subject: [PATCH] Add primaryType field in signature metrics --- .../hooks/useSignatureMetrics.test.ts | 67 ++++---- .../hooks/useSignatureMetrics.ts | 57 ++++--- .../hooks/useTypedSignSimulationEnabled.ts | 2 +- .../confirmations/utils/signature.test.ts | 84 +++++++-- .../Views/confirmations/utils/signature.ts | 54 +++++- app/util/test/confirm-data-helpers.ts | 159 +++++++++++------- 6 files changed, 286 insertions(+), 137 deletions(-) diff --git a/app/components/Views/confirmations/hooks/useSignatureMetrics.test.ts b/app/components/Views/confirmations/hooks/useSignatureMetrics.test.ts index 05f6b9d1f84..ee227b23e6c 100644 --- a/app/components/Views/confirmations/hooks/useSignatureMetrics.test.ts +++ b/app/components/Views/confirmations/hooks/useSignatureMetrics.test.ts @@ -1,27 +1,15 @@ import { MetaMetricsEvents } from '../../../../core/Analytics'; +import { + securityAlertResponse, + typedSignV4ConfirmationState, + typedSignV4SignatureRequest, +} from '../../../../util/test/confirm-data-helpers'; import { renderHookWithProvider } from '../../../../util/test/renderWithProvider'; import { useSignatureMetrics } from './useSignatureMetrics'; -import { SignatureRequestType, SignatureRequest } from '@metamask/signature-controller'; - -const mockSigRequest = { - type: SignatureRequestType.PersonalSign, - messageParams: { - data: '0x4578616d706c652060706572736f6e616c5f7369676e60206d657373616765', - from: '0x935e73edb9ff52e23bac7f7e043a1ecd06d05477', - meta: { - url: 'https://metamask.github.io/test-dapp/', - title: 'E2E Test Dapp', - icon: { uri: 'https://metamask.github.io/metamask-fox.svg' }, - analytics: { request_source: 'In-App-Browser' }, - }, - origin: 'metamask.github.io', - metamaskId: '76b33b40-7b5c-11ef-bc0a-25bce29dbc09', - }, - chainId: '0x1' as `0x${string}`, -} as const; +const mockTypedSignV4SignatureRequest = typedSignV4SignatureRequest; jest.mock('./useSignatureRequest', () => ({ - useSignatureRequest: () => mockSigRequest, + useSignatureRequest: () => mockTypedSignV4SignatureRequest, })); jest.mock('../../../../util/address', () => ({ @@ -36,6 +24,30 @@ jest.mock('../../../../core/Analytics', () => ({ }, })); +const mockAddProperties = jest + .fn() + .mockImplementation(() => ({ build: () => ({}) })); +jest.mock('../../../../core/Analytics/MetricsEventBuilder', () => ({ + ...jest.requireActual('../../../../core/Analytics/MetricsEventBuilder'), + MetricsEventBuilder: { + createEventBuilder: () => ({ addProperties: mockAddProperties }), + }, +})); + +const SignatureMetrics = { + account_type: '0x935e73edb9ff52e23bac7f7e043a1ecd06d05477', + chain_id: '1', + dapp_host_name: 'metamask.github.io', + eip712_primary_type: 'Permit', + request_source: 'In-App-Browser', + security_alert_reason: 'permit_farming', + security_alert_response: 'Malicious', + security_alert_source: 'api', + signature_type: 'eth_signTypedData', + ui_customizations: ['flagged_as_malicious'], + version: 'V4', +}; + describe('useSignatureMetrics', () => { beforeEach(() => { jest.clearAllMocks(); @@ -43,29 +55,22 @@ describe('useSignatureMetrics', () => { it('should capture metrics events correctly', async () => { const { result } = renderHookWithProvider(() => useSignatureMetrics(), { state: { - engine: { - backgroundState: { - PreferencesController: { - useTransactionSimulations: true, - }, - SignatureController: { - signatureRequests: { - [mockSigRequest.messageParams.metamaskId]: mockSigRequest, - } as unknown as Record, - }, - }, - }, + ...typedSignV4ConfirmationState, + signatureRequest: { securityAlertResponse }, }, }); // first call for 'SIGNATURE_REQUESTED' event expect(mockTrackEvent).toHaveBeenCalledTimes(1); + expect(mockAddProperties).toHaveBeenCalledWith(SignatureMetrics); result?.current?.captureSignatureMetrics( MetaMetricsEvents.SIGNATURE_APPROVED, ); expect(mockTrackEvent).toHaveBeenCalledTimes(2); + expect(mockAddProperties).toHaveBeenLastCalledWith(SignatureMetrics); result?.current?.captureSignatureMetrics( MetaMetricsEvents.SIGNATURE_REJECTED, ); expect(mockTrackEvent).toHaveBeenCalledTimes(3); + expect(mockAddProperties).toHaveBeenLastCalledWith(SignatureMetrics); }); }); diff --git a/app/components/Views/confirmations/hooks/useSignatureMetrics.ts b/app/components/Views/confirmations/hooks/useSignatureMetrics.ts index d1e870efa09..7465f6e7542 100644 --- a/app/components/Views/confirmations/hooks/useSignatureMetrics.ts +++ b/app/components/Views/confirmations/hooks/useSignatureMetrics.ts @@ -1,7 +1,7 @@ import type { Hex } from '@metamask/utils'; import { DecodingData } from '@metamask/signature-controller'; import { SecurityAlertResponse } from '@metamask/transaction-controller'; -import { useCallback, useEffect } from 'react'; +import { useCallback, useEffect, useMemo } from 'react'; import getDecimalChainId from '../../../../util/networks/getDecimalChainId'; import { MetricsEventBuilder } from '../../../../core/Analytics/MetricsEventBuilder'; @@ -14,6 +14,7 @@ import { getSignatureDecodingEventProps } from '../utils/signatureMetrics'; import { useSignatureRequest } from './useSignatureRequest'; import { useSecurityAlertResponse } from './useSecurityAlertResponse'; import { useTypedSignSimulationEnabled } from './useTypedSignSimulationEnabled'; +import { getSignatureRequestPrimaryType } from '../utils/signature'; interface MessageParamsType { meta: Record; @@ -30,6 +31,7 @@ const getAnalyticsParams = ( decodingData: DecodingData | undefined, decodingLoading: boolean, isSimulationEnabled: boolean, + primaryType: string, ) => { const { meta = {}, from, version } = messageParams; @@ -40,6 +42,7 @@ const getAnalyticsParams = ( version: version || 'N/A', chain_id: chainId ? getDecimalChainId(chainId) : '', ui_customizations: ['redesigned_confirmation'], + ...(primaryType ? { eip712_primary_type: primaryType } : {}), ...(meta.analytics as Record), ...(securityAlertResponse ? getBlockaidMetricsParams(securityAlertResponse) @@ -59,40 +62,50 @@ export const useSignatureMetrics = () => { const { chainId, decodingData, decodingLoading, messageParams, type } = signatureRequest ?? {}; + const primaryType = + signatureRequest && getSignatureRequestPrimaryType(signatureRequest); + + const analyticsParams = useMemo(() => { + if (!type || !isSignatureRequest(type)) { + return; + } + + return getAnalyticsParams( + messageParams as unknown as MessageParamsType, + securityAlertResponse as SecurityAlertResponse, + type, + chainId, + decodingData, + !!decodingLoading, + !!isSimulationEnabled, + primaryType, + ); + }, [ + chainId, + decodingData, + decodingLoading, + isSimulationEnabled, + messageParams, + primaryType, + securityAlertResponse, + type, + ]); const captureSignatureMetrics = useCallback( async ( event: (typeof MetaMetricsEvents)[keyof typeof MetaMetricsEvents], ) => { - if (!type || !isSignatureRequest(type)) { + if (!analyticsParams) { return; } MetaMetrics.getInstance().trackEvent( MetricsEventBuilder.createEventBuilder(event) - .addProperties( - getAnalyticsParams( - messageParams as unknown as MessageParamsType, - securityAlertResponse as SecurityAlertResponse, - type, - chainId, - decodingData, - !!decodingLoading, - !!isSimulationEnabled, - ), - ) + .addProperties(analyticsParams) .build(), ); }, - [ - chainId, - decodingData, - decodingLoading, - isSimulationEnabled, - messageParams, - securityAlertResponse, - type, - ], + [analyticsParams], ); useEffect(() => { diff --git a/app/components/Views/confirmations/hooks/useTypedSignSimulationEnabled.ts b/app/components/Views/confirmations/hooks/useTypedSignSimulationEnabled.ts index 41b1e5899bb..ddb87d0c74e 100644 --- a/app/components/Views/confirmations/hooks/useTypedSignSimulationEnabled.ts +++ b/app/components/Views/confirmations/hooks/useTypedSignSimulationEnabled.ts @@ -60,7 +60,7 @@ export function useTypedSignSimulationEnabled() { requestType === SignatureRequestType.TypedSign && (signatureMethod === SignTypedDataVersion.V3 || signatureMethod === SignTypedDataVersion.V4); - const isPermit = isTypedSignV3V4 && isRecognizedPermit(signatureRequest); + const isPermit = isRecognizedPermit(signatureRequest); const nonPermitSupportedByDecodingAPI: boolean = isTypedSignV3V4 && isNonPermitSupportedByDecodingAPI(signatureRequest); diff --git a/app/components/Views/confirmations/utils/signature.test.ts b/app/components/Views/confirmations/utils/signature.test.ts index 1b0a8b5cb39..9dfa6ed2939 100644 --- a/app/components/Views/confirmations/utils/signature.test.ts +++ b/app/components/Views/confirmations/utils/signature.test.ts @@ -1,20 +1,34 @@ -import { parseTypedDataMessage, isRecognizedPermit } from './signature'; +import { + parseTypedDataMessage, + isRecognizedPermit, + isTypedSignV3V4Request, + getSignatureRequestPrimaryType, +} from './signature'; import { PRIMARY_TYPES_PERMIT } from '../constants/signatures'; -import { SignatureRequest, SignatureRequestType } from '@metamask/signature-controller'; +import { + SignatureRequest, + SignatureRequestType, +} from '@metamask/signature-controller'; +import { + personalSignSignatureRequest, + typedSignV1SignatureRequest, + typedSignV3SignatureRequest, + typedSignV4SignatureRequest, +} from '../../../../util/test/confirm-data-helpers'; describe('Signature Utils', () => { describe('parseTypedDataMessage', () => { it('should parse typed data message correctly', () => { const data = JSON.stringify({ message: { - value: '123' - } + value: '123', + }, }); const result = parseTypedDataMessage(data); expect(result).toEqual({ message: { - value: '123' - } + value: '123', + }, }); }); @@ -25,13 +39,12 @@ describe('Signature Utils', () => { expect(result.message.value).toBe('3000123'); }); - it('should handle large message values. This prevents native JS number coercion when the value is greater than Number.MAX_SAFE_INTEGER.', () => { const largeValue = '123456789012345678901234567890'; const data = JSON.stringify({ message: { - value: largeValue - } + value: largeValue, + }, }); const result = parseTypedDataMessage(data); expect(result.message.value).toBe(largeValue); @@ -49,10 +62,11 @@ describe('Signature Utils', () => { const mockRequest: SignatureRequest = { messageParams: { data: JSON.stringify({ - primaryType: PRIMARY_TYPES_PERMIT[0] - }) + primaryType: PRIMARY_TYPES_PERMIT[0], + }), + version: 'V3', }, - type: SignatureRequestType.TypedSign + type: SignatureRequestType.TypedSign, } as SignatureRequest; expect(isRecognizedPermit(mockRequest)).toBe(true); @@ -62,13 +76,53 @@ describe('Signature Utils', () => { const mockRequest: SignatureRequest = { messageParams: { data: JSON.stringify({ - primaryType: 'UnrecognizedType' - }) + primaryType: 'UnrecognizedType', + }), + version: 'V3', }, - type: SignatureRequestType.TypedSign + type: SignatureRequestType.TypedSign, } as SignatureRequest; expect(isRecognizedPermit(mockRequest)).toBe(false); }); + + it('should return false for typed sign V1 request', () => { + expect(isRecognizedPermit(typedSignV1SignatureRequest)).toBe(false); + expect(isRecognizedPermit(personalSignSignatureRequest)).toBe(false); + }); + }); + + describe('isTypedSignV3V4Request', () => { + it('return true for typed sign V3, V4 messages', () => { + expect(isTypedSignV3V4Request(typedSignV3SignatureRequest)).toBe(true); + expect(isTypedSignV3V4Request(typedSignV4SignatureRequest)).toBe(true); + }); + it('return false for typed sign V1 message', () => { + expect(isTypedSignV3V4Request(typedSignV1SignatureRequest)).toBe(false); + }); + it('return false for personal sign message', () => { + expect(isTypedSignV3V4Request(personalSignSignatureRequest)).toBe(false); + }); + }); + + describe('getSignatureRequestPrimaryType', () => { + it('return correct primary type', () => { + expect(getSignatureRequestPrimaryType(typedSignV3SignatureRequest)).toBe( + 'Mail', + ); + expect(getSignatureRequestPrimaryType(typedSignV4SignatureRequest)).toBe( + 'Permit', + ); + }); + it('return undefined for for typed sign V1 message', () => { + expect(getSignatureRequestPrimaryType(typedSignV1SignatureRequest)).toBe( + undefined, + ); + }); + it('return undefined for personal sign message', () => { + expect(getSignatureRequestPrimaryType(personalSignSignatureRequest)).toBe( + undefined, + ); + }); }); }); diff --git a/app/components/Views/confirmations/utils/signature.ts b/app/components/Views/confirmations/utils/signature.ts index 5c30d885f78..80d6dfc1d73 100644 --- a/app/components/Views/confirmations/utils/signature.ts +++ b/app/components/Views/confirmations/utils/signature.ts @@ -1,5 +1,10 @@ -import { SignatureRequest, SignatureRequestType } from '@metamask/signature-controller'; +import { + MessageParamsTyped, + SignatureRequest, + SignatureRequestType, +} from '@metamask/signature-controller'; import { PRIMARY_TYPES_PERMIT } from '../constants/signatures'; +import { SignTypedDataVersion } from '@metamask/eth-sig-util'; /** * The contents of this file have been taken verbatim from @@ -8,7 +13,8 @@ import { PRIMARY_TYPES_PERMIT } from '../constants/signatures'; * If updating, please be mindful of this or delete this comment. */ -const REGEX_MESSAGE_VALUE_LARGE = /"message"\s*:\s*\{[^}]*"value"\s*:\s*(\d{15,})/u; +const REGEX_MESSAGE_VALUE_LARGE = + /"message"\s*:\s*\{[^}]*"value"\s*:\s*(\d{15,})/u; function extractLargeMessageValue(dataToParse: string): string | undefined { if (typeof dataToParse !== 'string') { @@ -44,13 +50,39 @@ export const parseTypedDataMessage = (dataToParse: string) => { return result; }; +interface TypedSignatureRequest { + messageParams: MessageParamsTyped; + type: SignatureRequestType.TypedSign; +} + +/** + * Returns true if the request is Typed Sign V3 or V4 request + * + * @param signatureRequest - The signature request to check + */ +export const isTypedSignV3V4Request = (signatureRequest: SignatureRequest) => { + const { + type, + messageParams: { version }, + } = signatureRequest as TypedSignatureRequest; + + return ( + type === SignatureRequestType.TypedSign && + (version === SignTypedDataVersion.V3 || version === SignTypedDataVersion.V4) + ); +}; + /** * Returns true if the request is a recognized Permit Typed Sign signature request * * @param request - The signature request to check */ export const isRecognizedPermit = (request: SignatureRequest) => { - if (!request || request.type !== SignatureRequestType.TypedSign) { + if ( + !request || + request.type !== SignatureRequestType.TypedSign || + !isTypedSignV3V4Request(request) + ) { return false; } @@ -59,3 +91,19 @@ export const isRecognizedPermit = (request: SignatureRequest) => { const { primaryType } = parseTypedDataMessage(data); return PRIMARY_TYPES_PERMIT.includes(primaryType); }; + +/** + * Returns primary type of typed signature request + * + * @param signatureRequest - The signature request get primary type from + */ +export const getSignatureRequestPrimaryType = ( + signatureRequest: SignatureRequest, +) => { + if (!isTypedSignV3V4Request(signatureRequest)) { + return; + } + const data = signatureRequest.messageParams?.data as string; + const { primaryType } = parseTypedDataMessage(data); + return primaryType; +}; diff --git a/app/util/test/confirm-data-helpers.ts b/app/util/test/confirm-data-helpers.ts index 485228a065a..db76ee22a3a 100644 --- a/app/util/test/confirm-data-helpers.ts +++ b/app/util/test/confirm-data-helpers.ts @@ -1,11 +1,33 @@ import { MessageParamsTyped, + SignatureRequest, SignatureRequestStatus, - SignatureRequestType + SignatureRequestType, } from '@metamask/signature-controller'; import { backgroundState } from './initial-root-state'; import { Hex } from '@metamask/utils'; +export const personalSignSignatureRequest = { + chainId: '0x1', + type: SignatureRequestType.PersonalSign, + id: 'aa2b3071-d946-11ef-9f90-a5603493ed8d', + messageParams: { + data: '0x4578616d706c652060706572736f6e616c5f7369676e60206d657373616765', + from: '0x935e73edb9ff52e23bac7f7e043a1ecd06d05477', + meta: { + url: 'https://metamask.github.io/test-dapp/', + title: 'E2E Test Dapp', + icon: { uri: 'https://metamask.github.io/metamask-fox.svg' }, + analytics: { request_source: 'In-App-Browser' }, + }, + origin: 'metamask.github.io', + metamaskId: '76b33b40-7b5c-11ef-bc0a-25bce29dbc09', + }, + networkClientId: '1', + status: SignatureRequestStatus.Unapproved, + time: 1733143817088, +} as SignatureRequest; + export const personalSignatureConfirmationState = { engine: { backgroundState: { @@ -15,7 +37,7 @@ export const personalSignatureConfirmationState = { '76b33b40-7b5c-11ef-bc0a-25bce29dbc09': { id: '76b33b40-7b5c-11ef-bc0a-25bce29dbc09', origin: 'metamask.github.io', - type: 'personal_sign', + type: SignatureRequestType.PersonalSign, time: 1727282253048, requestData: { data: '0x4578616d706c652060706572736f6e616c5f7369676e60206d657373616765', @@ -47,6 +69,27 @@ export const personalSignatureConfirmationState = { }, }; +export const typedSignV1SignatureRequest = { + chainId: '0x1' as Hex, + messageParams: { + data: [ + { type: 'string', name: 'Message', value: 'Hi, Alice!' }, + { type: 'uint32', name: 'A number', value: '1337' }, + ], + from: '0x935e73edb9ff52e23bac7f7e043a1ecd06d05477', + requestId: 2453610887, + meta: { + url: 'https://metamask.github.io/test-dapp/', + title: 'E2E Test Dapp', + icon: { uri: 'https://metamask.github.io/metamask-fox.svg' }, + analytics: { request_source: 'In-App-Browser' }, + }, + origin: 'metamask.github.io', + metamaskId: '7e62bcb0-a4e9-11ef-9b51-ddf21c91a998', + version: 'V1', + } as MessageParamsTyped, +} as SignatureRequest; + export const typedSignV1ConfirmationState = { engine: { backgroundState: { @@ -56,7 +99,7 @@ export const typedSignV1ConfirmationState = { '7e62bcb1-a4e9-11ef-9b51-ddf21c91a998': { id: '7e62bcb1-a4e9-11ef-9b51-ddf21c91a998', origin: 'metamask.github.io', - type: 'eth_signTypedData', + type: SignatureRequestType.TypedSign, time: 1731850822653, requestData: { data: [ @@ -84,26 +127,7 @@ export const typedSignV1ConfirmationState = { }, SignatureController: { signatureRequests: { - '7e62bcb1-a4e9-11ef-9b51-ddf21c91a998': { - chainId: '0x1' as Hex, - messageParams: { - data: [ - { type: 'string', name: 'Message', value: 'Hi, Alice!' }, - { type: 'uint32', name: 'A number', value: '1337' }, - ], - from: '0x935e73edb9ff52e23bac7f7e043a1ecd06d05477', - requestId: 2453610887, - meta: { - url: 'https://metamask.github.io/test-dapp/', - title: 'E2E Test Dapp', - icon: { uri: 'https://metamask.github.io/metamask-fox.svg' }, - analytics: { request_source: 'In-App-Browser' }, - }, - origin: 'metamask.github.io', - metamaskId: '7e62bcb0-a4e9-11ef-9b51-ddf21c91a998', - version: 'V1', - } as MessageParamsTyped, - }, + '7e62bcb1-a4e9-11ef-9b51-ddf21c91a998': typedSignV1SignatureRequest, }, }, RemoteFeatureFlagController: { @@ -149,6 +173,25 @@ export const mockTypedSignV3Message = { }, }; +export const typedSignV3SignatureRequest = { + chainId: '0x1' as Hex, + type: SignatureRequestType.TypedSign, + messageParams: { + data: JSON.stringify(mockTypedSignV3Message), + from: '0x8eeee1781fd885ff5ddef7789486676961873d12', + requestId: 3298650200, + meta: { + url: 'https://metamask.github.io/test-dapp/', + title: 'E2E Test Dapp', + icon: { uri: 'https://metamask.github.io/metamask-fox.svg' }, + analytics: { request_source: 'In-App-Browser' }, + }, + origin: 'metamask.github.io', + metamaskId: 'fb2029e1-b0ab-11ef-9227-05a11087c334', + version: 'V3', + } as MessageParamsTyped, +} as SignatureRequest; + export const typedSignV3ConfirmationState = { engine: { backgroundState: { @@ -158,7 +201,7 @@ export const typedSignV3ConfirmationState = { 'fb2029e1-b0ab-11ef-9227-05a11087c334': { id: 'fb2029e1-b0ab-11ef-9227-05a11087c334', origin: 'metamask.github.io', - type: 'eth_signTypedData', + type: SignatureRequestType.TypedSign, time: 1733143817088, requestData: { data: JSON.stringify(mockTypedSignV3Message), @@ -183,23 +226,7 @@ export const typedSignV3ConfirmationState = { }, SignatureController: { signatureRequests: { - 'fb2029e1-b0ab-11ef-9227-05a11087c334': { - chainId: '0x1' as Hex, - messageParams: { - data: JSON.stringify(mockTypedSignV3Message), - from: '0x8eeee1781fd885ff5ddef7789486676961873d12', - requestId: 3298650200, - meta: { - url: 'https://metamask.github.io/test-dapp/', - title: 'E2E Test Dapp', - icon: { uri: 'https://metamask.github.io/metamask-fox.svg' }, - analytics: { request_source: 'In-App-Browser' }, - }, - origin: 'metamask.github.io', - metamaskId: 'fb2029e1-b0ab-11ef-9227-05a11087c334', - version: 'V3', - } as MessageParamsTyped, - }, + 'fb2029e1-b0ab-11ef-9227-05a11087c334': typedSignV3SignatureRequest, }, }, RemoteFeatureFlagController: { @@ -213,6 +240,30 @@ export const typedSignV3ConfirmationState = { }, }; +export const typedSignV4SignatureRequest = { + id: 'fb2029e1-b0ab-11ef-9227-05a11087c334', + chainId: '0x1' as Hex, + type: SignatureRequestType.TypedSign, + messageParams: { + data: '{"types":{"EIP712Domain":[{"name":"name","type":"string"},{"name":"version","type":"string"},{"name":"chainId","type":"uint256"},{"name":"verifyingContract","type":"address"}],"Permit":[{"name":"owner","type":"address"},{"name":"spender","type":"address"},{"name":"value","type":"uint256"},{"name":"nonce","type":"uint256"},{"name":"deadline","type":"uint256"}]},"primaryType":"Permit","domain":{"name":"MyToken","version":"1","verifyingContract":"0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC","chainId":1},"message":{"owner":"0x935e73edb9ff52e23bac7f7e043a1ecd06d05477","spender":"0x5B38Da6a701c568545dCfcB03FcB875f56beddC4","value":3000,"nonce":0,"deadline":50000000000}}', + from: '0x935e73edb9ff52e23bac7f7e043a1ecd06d05477', + version: 'V4', + requestId: 14, + signatureMethod: 'eth_signTypedData_v4', + origin: 'https://metamask.github.io', + metamaskId: 'fb2029e0-b0ab-11ef-9227-05a11087c334', + meta: { + url: 'https://metamask.github.io/test-dapp/', + title: 'E2E Test Dapp', + icon: { uri: 'https://metamask.github.io/metamask-fox.svg' }, + analytics: { request_source: 'In-App-Browser' }, + }, + }, + networkClientId: '1', + status: SignatureRequestStatus.Unapproved, + time: 1733143817088, +} as SignatureRequest; + export const typedSignV4ConfirmationState = { engine: { backgroundState: { @@ -222,7 +273,7 @@ export const typedSignV4ConfirmationState = { 'fb2029e1-b0ab-11ef-9227-05a11087c334': { id: 'fb2029e1-b0ab-11ef-9227-05a11087c334', origin: 'metamask.github.io', - type: 'eth_signTypedData', + type: SignatureRequestType.TypedSign, time: 1733143817088, requestData: { data: '{"types":{"EIP712Domain":[{"name":"name","type":"string"},{"name":"version","type":"string"},{"name":"chainId","type":"uint256"},{"name":"verifyingContract","type":"address"}],"Permit":[{"name":"owner","type":"address"},{"name":"spender","type":"address"},{"name":"value","type":"uint256"},{"name":"nonce","type":"uint256"},{"name":"deadline","type":"uint256"}]},"primaryType":"Permit","domain":{"name":"MyToken","version":"1","verifyingContract":"0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC","chainId":1},"message":{"owner":"0x935e73edb9ff52e23bac7f7e043a1ecd06d05477","spender":"0x5B38Da6a701c568545dCfcB03FcB875f56beddC4","value":3000,"nonce":0,"deadline":50000000000}}', @@ -248,29 +299,7 @@ export const typedSignV4ConfirmationState = { }, SignatureController: { signatureRequests: { - 'fb2029e1-b0ab-11ef-9227-05a11087c334': { - id: 'fb2029e1-b0ab-11ef-9227-05a11087c334', - chainId: '0x1' as Hex, - type: SignatureRequestType.TypedSign, - messageParams: { - data: '{"types":{"EIP712Domain":[{"name":"name","type":"string"},{"name":"version","type":"string"},{"name":"chainId","type":"uint256"},{"name":"verifyingContract","type":"address"}],"Permit":[{"name":"owner","type":"address"},{"name":"spender","type":"address"},{"name":"value","type":"uint256"},{"name":"nonce","type":"uint256"},{"name":"deadline","type":"uint256"}]},"primaryType":"Permit","domain":{"name":"MyToken","version":"1","verifyingContract":"0xCcCCccccCCCCcCCCCCCcCcCccCcCCCcCcccccccC","chainId":1},"message":{"owner":"0x935e73edb9ff52e23bac7f7e043a1ecd06d05477","spender":"0x5B38Da6a701c568545dCfcB03FcB875f56beddC4","value":3000,"nonce":0,"deadline":50000000000}}', - from: '0x935e73edb9ff52e23bac7f7e043a1ecd06d05477', - version: 'V4', - requestId: 14, - signatureMethod: 'eth_signTypedData_v4', - origin: 'https://metamask.github.io', - metamaskId: 'fb2029e0-b0ab-11ef-9227-05a11087c334', - meta: { - url: 'https://metamask.github.io/test-dapp/', - title: 'E2E Test Dapp', - icon: { uri: 'https://metamask.github.io/metamask-fox.svg' }, - analytics: { request_source: 'In-App-Browser' }, - }, - }, - networkClientId: '1', - status: SignatureRequestStatus.Unapproved, - time: 1733143817088 - }, + 'fb2029e1-b0ab-11ef-9227-05a11087c334': typedSignV4SignatureRequest, }, }, },