@ledgerhq/device-signer-kit-ethereum 0.0.0-multisig-20250905101831 → 0.0.0-multisig-20250910160951
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/cjs/api/app-binder/SignTypedDataDeviceActionTypes.js +1 -1
- package/lib/cjs/api/app-binder/SignTypedDataDeviceActionTypes.js.map +2 -2
- package/lib/cjs/internal/app-binder/EthAppBinder.js +1 -1
- package/lib/cjs/internal/app-binder/EthAppBinder.js.map +2 -2
- package/lib/cjs/internal/app-binder/EthAppBinder.test.js +1 -1
- package/lib/cjs/internal/app-binder/EthAppBinder.test.js.map +2 -2
- package/lib/cjs/internal/app-binder/command/SendEIP712FilteringCommand.js +1 -1
- package/lib/cjs/internal/app-binder/command/SendEIP712FilteringCommand.js.map +3 -3
- package/lib/cjs/internal/app-binder/command/SendEIP712FilteringCommand.test.js +1 -1
- package/lib/cjs/internal/app-binder/command/SendEIP712FilteringCommand.test.js.map +3 -3
- package/lib/cjs/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.js +1 -1
- package/lib/cjs/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.js.map +2 -2
- package/lib/cjs/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.test.js +1 -1
- package/lib/cjs/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.test.js.map +2 -2
- package/lib/cjs/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.js +1 -1
- package/lib/cjs/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.js.map +2 -2
- package/lib/cjs/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.test.js +1 -1
- package/lib/cjs/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.test.js.map +3 -3
- package/lib/cjs/internal/app-binder/task/BuildBaseContexts.test.js +1 -1
- package/lib/cjs/internal/app-binder/task/BuildBaseContexts.test.js.map +2 -2
- package/lib/cjs/internal/app-binder/task/BuildEIP712ContextTask.js +1 -1
- package/lib/cjs/internal/app-binder/task/BuildEIP712ContextTask.js.map +3 -3
- package/lib/cjs/internal/app-binder/task/BuildEIP712ContextTask.test.js +1 -1
- package/lib/cjs/internal/app-binder/task/BuildEIP712ContextTask.test.js.map +3 -3
- package/lib/cjs/internal/app-binder/task/BuildFullContextsTask.test.js +1 -1
- package/lib/cjs/internal/app-binder/task/BuildFullContextsTask.test.js.map +2 -2
- package/lib/cjs/internal/app-binder/task/BuildSubcontextsTask.js +1 -1
- package/lib/cjs/internal/app-binder/task/BuildSubcontextsTask.js.map +2 -2
- package/lib/cjs/internal/app-binder/task/BuildSubcontextsTask.test.js +1 -1
- package/lib/cjs/internal/app-binder/task/BuildSubcontextsTask.test.js.map +2 -2
- package/lib/cjs/internal/app-binder/task/ParseTransactionTask.test.js +2 -0
- package/lib/cjs/internal/app-binder/task/ParseTransactionTask.test.js.map +7 -0
- package/lib/cjs/internal/app-binder/task/ProvideContextsTask.js +1 -1
- package/lib/cjs/internal/app-binder/task/ProvideContextsTask.js.map +2 -2
- package/lib/cjs/internal/app-binder/task/ProvideContextsTask.test.js +1 -1
- package/lib/cjs/internal/app-binder/task/ProvideContextsTask.test.js.map +2 -2
- package/lib/cjs/internal/app-binder/task/ProvideEIP712ContextTask.js +1 -1
- package/lib/cjs/internal/app-binder/task/ProvideEIP712ContextTask.js.map +3 -3
- package/lib/cjs/internal/app-binder/task/ProvideEIP712ContextTask.test.js +1 -1
- package/lib/cjs/internal/app-binder/task/ProvideEIP712ContextTask.test.js.map +3 -3
- package/lib/esm/api/app-binder/SignTypedDataDeviceActionTypes.js +1 -1
- package/lib/esm/api/app-binder/SignTypedDataDeviceActionTypes.js.map +2 -2
- package/lib/esm/internal/app-binder/EthAppBinder.js +1 -1
- package/lib/esm/internal/app-binder/EthAppBinder.js.map +2 -2
- package/lib/esm/internal/app-binder/EthAppBinder.test.js +1 -1
- package/lib/esm/internal/app-binder/EthAppBinder.test.js.map +2 -2
- package/lib/esm/internal/app-binder/command/SendEIP712FilteringCommand.js +1 -1
- package/lib/esm/internal/app-binder/command/SendEIP712FilteringCommand.js.map +3 -3
- package/lib/esm/internal/app-binder/command/SendEIP712FilteringCommand.test.js +1 -1
- package/lib/esm/internal/app-binder/command/SendEIP712FilteringCommand.test.js.map +3 -3
- package/lib/esm/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.js +1 -1
- package/lib/esm/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.js.map +2 -2
- package/lib/esm/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.test.js +1 -1
- package/lib/esm/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.test.js.map +2 -2
- package/lib/esm/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.js +1 -1
- package/lib/esm/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.js.map +2 -2
- package/lib/esm/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.test.js +1 -1
- package/lib/esm/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.test.js.map +3 -3
- package/lib/esm/internal/app-binder/task/BuildBaseContexts.test.js +1 -1
- package/lib/esm/internal/app-binder/task/BuildBaseContexts.test.js.map +2 -2
- package/lib/esm/internal/app-binder/task/BuildEIP712ContextTask.js +1 -1
- package/lib/esm/internal/app-binder/task/BuildEIP712ContextTask.js.map +3 -3
- package/lib/esm/internal/app-binder/task/BuildEIP712ContextTask.test.js +1 -1
- package/lib/esm/internal/app-binder/task/BuildEIP712ContextTask.test.js.map +3 -3
- package/lib/esm/internal/app-binder/task/BuildFullContextsTask.test.js +1 -1
- package/lib/esm/internal/app-binder/task/BuildFullContextsTask.test.js.map +2 -2
- package/lib/esm/internal/app-binder/task/BuildSubcontextsTask.js +1 -1
- package/lib/esm/internal/app-binder/task/BuildSubcontextsTask.js.map +2 -2
- package/lib/esm/internal/app-binder/task/BuildSubcontextsTask.test.js +1 -1
- package/lib/esm/internal/app-binder/task/BuildSubcontextsTask.test.js.map +2 -2
- package/lib/esm/internal/app-binder/task/ParseTransactionTask.test.js +2 -0
- package/lib/esm/internal/app-binder/task/ParseTransactionTask.test.js.map +7 -0
- package/lib/esm/internal/app-binder/task/ProvideContextsTask.js +1 -1
- package/lib/esm/internal/app-binder/task/ProvideContextsTask.js.map +2 -2
- package/lib/esm/internal/app-binder/task/ProvideContextsTask.test.js +1 -1
- package/lib/esm/internal/app-binder/task/ProvideContextsTask.test.js.map +2 -2
- package/lib/esm/internal/app-binder/task/ProvideEIP712ContextTask.js +1 -1
- package/lib/esm/internal/app-binder/task/ProvideEIP712ContextTask.js.map +3 -3
- package/lib/esm/internal/app-binder/task/ProvideEIP712ContextTask.test.js +1 -1
- package/lib/esm/internal/app-binder/task/ProvideEIP712ContextTask.test.js.map +3 -3
- package/lib/types/api/app-binder/SignTypedDataDeviceActionTypes.d.ts +4 -0
- package/lib/types/api/app-binder/SignTypedDataDeviceActionTypes.d.ts.map +1 -1
- package/lib/types/internal/app-binder/EthAppBinder.d.ts.map +1 -1
- package/lib/types/internal/app-binder/command/SendEIP712FilteringCommand.d.ts +29 -1
- package/lib/types/internal/app-binder/command/SendEIP712FilteringCommand.d.ts.map +1 -1
- package/lib/types/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.d.ts +4 -0
- package/lib/types/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.d.ts.map +1 -1
- package/lib/types/internal/app-binder/task/BuildEIP712ContextTask.d.ts +8 -1
- package/lib/types/internal/app-binder/task/BuildEIP712ContextTask.d.ts.map +1 -1
- package/lib/types/internal/app-binder/task/BuildSubcontextsTask.d.ts.map +1 -1
- package/lib/types/internal/app-binder/task/ParseTransactionTask.test.d.ts +2 -0
- package/lib/types/internal/app-binder/task/ParseTransactionTask.test.d.ts.map +1 -0
- package/lib/types/internal/app-binder/task/ProvideContextsTask.d.ts.map +1 -1
- package/lib/types/internal/app-binder/task/ProvideEIP712ContextTask.d.ts +12 -2
- package/lib/types/internal/app-binder/task/ProvideEIP712ContextTask.d.ts.map +1 -1
- package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
- package/package.json +8 -8
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../src/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.test.ts"],
|
|
4
|
-
"sourcesContent": ["/* eslint @typescript-eslint/consistent-type-imports: 0 */\nimport { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n CommandResultFactory,\n DeviceActionStatus,\n DeviceModelId,\n DeviceSessionStateType,\n DeviceStatus,\n InvalidStatusWordError,\n UnknownDAError,\n UnknownDeviceExchangeError,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { Just, Nothing } from \"purify-ts\";\n\nimport { type SignTypedDataDAState } from \"@api/app-binder/SignTypedDataDeviceActionTypes\";\nimport { SignTypedDataDAStateStep } from \"@api/app-binder/SignTypedDataDeviceActionTypes\";\nimport { EthAppCommandErrorFactory } from \"@internal/app-binder/command/utils/ethAppErrors\";\nimport { makeDeviceActionInternalApiMock } from \"@internal/app-binder/device-action/__test-utils__/makeInternalApi\";\nimport { setupOpenAppDAMock } from \"@internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock\";\nimport { testDeviceActionStates } from \"@internal/app-binder/device-action/__test-utils__/testDeviceActionStates\";\nimport { type ProvideEIP712ContextTaskArgs } from \"@internal/app-binder/task/ProvideEIP712ContextTask\";\nimport {\n PrimitiveType,\n StructType,\n TypedDataValueField,\n} from \"@internal/typed-data/model/Types\";\nimport { type TypedDataParserService } from \"@internal/typed-data/service/TypedDataParserService\";\n\nimport { SignTypedDataDeviceAction } from \"./SignTypedDataDeviceAction\";\n\nvi.mock(\"@ledgerhq/device-management-kit\", async (importOriginal) => {\n const original =\n await importOriginal<typeof import(\"@ledgerhq/device-management-kit\")>();\n return {\n ...original,\n OpenAppDeviceAction: vi.fn(() => ({\n makeStateMachine: vi.fn(),\n })),\n };\n});\n\ndescribe(\"SignTypedDataDeviceAction\", () => {\n const TEST_MESSAGE = {\n domain: {},\n message: {},\n primaryType: \"TestMessage\",\n types: {},\n };\n const TEST_BUILT_CONTEXT: ProvideEIP712ContextTaskArgs = {\n web3Check: null,\n types: {\n PermitSingle: {\n details: new StructType(\"PermitDetails\"),\n spender: new PrimitiveType(\"address\", \"address\", Nothing),\n sigDeadline: new PrimitiveType(\"uint256\", \"uint\", Just(32)),\n },\n },\n domain: [\n {\n path: \"chainId\",\n type: \"uint256\",\n value: new TypedDataValueField(Uint8Array.from([137])),\n },\n ],\n message: [\n {\n path: \"details.expiration\",\n type: \"uint48\",\n value: new TypedDataValueField(Uint8Array.from([0x13])),\n },\n ],\n clearSignContext: Just({\n type: \"success\",\n messageInfo: {\n displayName: \"Permit2\",\n filtersCount: 1,\n signature:\n \"3045022100e3c597d13d28a87a88b0239404c668373cf5063362f2a81d09eed4582941dfe802207669aabb504fd5b95b2734057f6b8bbf51f14a69a5f9bdf658a5952cefbf44d3\",\n },\n trustedNamesAddresses: {},\n tokens: {},\n filters: {\n \"details.amount\": {\n displayName: \"Amount allowance\",\n path: \"details.amount\",\n signature:\n \"304402201a46e6b4ef89eaf9fcf4945d053bfc5616a826400fd758312fbbe976bafc07ec022025a9b408722baf983ee053f90179c75b0c55bb0668f437d55493e36069bbd5a3\",\n tokenIndex: 255,\n type: \"amount\",\n },\n },\n }),\n };\n\n const mockParser: TypedDataParserService = {\n parse: vi.fn(),\n };\n const mockContextModule: ContextModule = {\n getFieldContext: vi.fn(),\n getContexts: vi.fn(),\n getTypedDataFilters: vi.fn(),\n getWeb3Checks: vi.fn(),\n getSolanaContext: vi.fn(),\n getProxyDelegateCall: vi.fn(),\n };\n const apiMock = makeDeviceActionInternalApiMock();\n const getAppConfigMock = vi.fn();\n const web3CheckOptInMock = vi.fn();\n const buildContextMock = vi.fn();\n const provideContextMock = vi.fn();\n const signTypedDataMock = vi.fn();\n const signTypedDataLegacyMock = vi.fn();\n function extractDependenciesMock() {\n return {\n getAppConfig: getAppConfigMock,\n web3CheckOptIn: web3CheckOptInMock,\n buildContext: buildContextMock,\n provideContext: provideContextMock,\n signTypedData: signTypedDataMock,\n signTypedDataLegacy: signTypedDataLegacyMock,\n };\n }\n\n function createAppConfig(\n version: string,\n web3ChecksEnabled: boolean,\n web3ChecksOptIn: boolean,\n ) {\n return {\n blindSigningEnabled: false,\n web3ChecksEnabled,\n web3ChecksOptIn,\n version,\n };\n }\n\n function setupAppConfig(\n version: string,\n web3ChecksEnabled: boolean,\n web3ChecksOptIn: boolean,\n ) {\n apiMock.getDeviceSessionState.mockReturnValueOnce({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n });\n getAppConfigMock.mockResolvedValue(\n CommandResultFactory({\n data: createAppConfig(version, web3ChecksEnabled, web3ChecksOptIn),\n }),\n );\n }\n\n beforeEach(() => {\n vi.resetAllMocks();\n });\n\n describe(\"Success case\", () => {\n it(\"should call external dependencies with the correct parameters\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\n\n const deviceAction = new SignTypedDataDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_MESSAGE,\n contextModule: mockContextModule,\n parser: mockParser,\n skipOpenApp: false,\n },\n });\n\n // Mock the dependencies to return some sample data\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n buildContextMock.mockResolvedValueOnce(TEST_BUILT_CONTEXT);\n provideContextMock.mockResolvedValueOnce(\n CommandResultFactory({ data: undefined }),\n );\n signTypedDataMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n }),\n );\n\n // Expected intermediate values for the following state sequence:\n // Initial -> OpenApp -> BuildContext -> ProvideContext -> SignTypedData\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.PROVIDE_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.SIGN_TYPED_DATA,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n status: DeviceActionStatus.Completed,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: () => {\n // Verify mocks calls parameters\n expect(buildContextMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n contextModule: mockContextModule,\n parser: mockParser,\n data: TEST_MESSAGE,\n appConfig: createAppConfig(\"1.15.0\", false, false),\n derivationPath: \"44'/60'/0'/0/0\",\n },\n }),\n );\n\n expect(provideContextMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n contextModule: mockContextModule,\n taskArgs: TEST_BUILT_CONTEXT,\n },\n }),\n );\n\n expect(signTypedDataMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n },\n }),\n );\n\n resolve();\n },\n });\n }));\n\n it(\"should be successful whlie skipping OpenApp\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\n\n const deviceAction = new SignTypedDataDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_MESSAGE,\n contextModule: mockContextModule,\n parser: mockParser,\n skipOpenApp: true,\n },\n });\n\n // Mock the dependencies to return some sample data\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n buildContextMock.mockResolvedValueOnce(TEST_BUILT_CONTEXT);\n provideContextMock.mockResolvedValueOnce(\n CommandResultFactory({ data: undefined }),\n );\n signTypedDataMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n }),\n );\n\n // Expected intermediate values for the following state sequence:\n // Initial -> BuildContext -> ProvideContext -> SignTypedData\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.PROVIDE_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.SIGN_TYPED_DATA,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n status: DeviceActionStatus.Completed,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: resolve,\n });\n }));\n\n it(\"should fallback to legacy signing if the new one fails\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\n\n const deviceAction = new SignTypedDataDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_MESSAGE,\n contextModule: mockContextModule,\n parser: mockParser,\n skipOpenApp: false,\n },\n });\n\n // Mock the providing error\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n buildContextMock.mockResolvedValueOnce(TEST_BUILT_CONTEXT);\n provideContextMock.mockResolvedValueOnce(\n CommandResultFactory({\n error: EthAppCommandErrorFactory({\n errorCode: \"6a80\",\n message: \"\",\n }),\n }),\n );\n signTypedDataLegacyMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n }),\n );\n\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.PROVIDE_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.SIGN_TYPED_DATA_LEGACY,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n status: DeviceActionStatus.Completed,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: resolve,\n });\n }));\n\n it(\"should fallback to legacy signing BuildContext fails\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\n\n const deviceAction = new SignTypedDataDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_MESSAGE,\n contextModule: mockContextModule,\n parser: mockParser,\n skipOpenApp: false,\n },\n });\n\n // Mock the providing error\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n buildContextMock.mockRejectedValueOnce(new UnknownDAError(\"Error\"));\n signTypedDataLegacyMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n }),\n );\n\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.SIGN_TYPED_DATA_LEGACY,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n status: DeviceActionStatus.Completed,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: resolve,\n });\n }));\n\n it(\"should not fallback to legacy signing if rejected by the user during streaming\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\n\n const deviceAction = new SignTypedDataDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_MESSAGE,\n contextModule: mockContextModule,\n parser: mockParser,\n skipOpenApp: false,\n },\n });\n\n // Mock the providing error\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n buildContextMock.mockResolvedValueOnce(TEST_BUILT_CONTEXT);\n provideContextMock.mockResolvedValueOnce(\n CommandResultFactory({\n error: EthAppCommandErrorFactory({\n errorCode: \"6985\",\n message: \"\",\n }),\n }),\n );\n signTypedDataLegacyMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n }),\n );\n\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.PROVIDE_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: EthAppCommandErrorFactory({\n errorCode: \"6985\",\n message: \"\",\n }),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: resolve,\n });\n }));\n });\n\n describe(\"Web3Checks\", () => {\n it(\"should call external dependencies with web3Checks enabled and supported\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.16.0\", true, true);\n\n const deviceAction = new SignTypedDataDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_MESSAGE,\n contextModule: mockContextModule,\n parser: mockParser,\n skipOpenApp: false,\n },\n });\n\n // Mock the dependencies to return some sample data\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n buildContextMock.mockRejectedValueOnce(\n new InvalidStatusWordError(\"buildContext error\"),\n );\n signTypedDataLegacyMock.mockRejectedValueOnce(\n new InvalidStatusWordError(\"signTypedDataLegacy error\"),\n );\n\n // Expected intermediate values for the following state sequence:\n // Initial -> OpenApp -> GetAppConfiguration -> BuildContext\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.SIGN_TYPED_DATA_LEGACY,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: new InvalidStatusWordError(\"signTypedDataLegacy error\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: () => {\n // Verify mocks calls parameters\n expect(getAppConfigMock).toHaveBeenCalled();\n expect(buildContextMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n contextModule: mockContextModule,\n parser: mockParser,\n data: TEST_MESSAGE,\n appConfig: createAppConfig(\"1.16.0\", true, true),\n derivationPath: \"44'/60'/0'/0/0\",\n },\n }),\n );\n resolve();\n },\n });\n }));\n\n it(\"should call external dependencies with web3Checks supported but disabled\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.16.0\", false, true);\n\n const deviceAction = new SignTypedDataDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_MESSAGE,\n contextModule: mockContextModule,\n parser: mockParser,\n skipOpenApp: false,\n },\n });\n\n // Mock the dependencies to return some sample data\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n buildContextMock.mockRejectedValueOnce(\n new InvalidStatusWordError(\"buildContext error\"),\n );\n signTypedDataLegacyMock.mockRejectedValueOnce(\n new InvalidStatusWordError(\"signTypedDataLegacy error\"),\n );\n\n // Expected intermediate values for the following state sequence:\n // Initial -> OpenApp -> GetAppConfiguration -> BuildContext\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.SIGN_TYPED_DATA_LEGACY,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: new InvalidStatusWordError(\"signTypedDataLegacy error\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: () => {\n // Verify mocks calls parameters\n expect(getAppConfigMock).toHaveBeenCalled();\n expect(buildContextMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n contextModule: mockContextModule,\n parser: mockParser,\n data: TEST_MESSAGE,\n appConfig: createAppConfig(\"1.16.0\", false, true),\n derivationPath: \"44'/60'/0'/0/0\",\n },\n }),\n );\n resolve();\n },\n });\n }));\n\n it(\"should call external dependencies with web3Checks opt-in, then enabled\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.16.0\", false, false);\n\n const deviceAction = new SignTypedDataDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_MESSAGE,\n contextModule: mockContextModule,\n parser: mockParser,\n skipOpenApp: false,\n },\n });\n\n // Mock the dependencies to return some sample data\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n web3CheckOptInMock.mockResolvedValueOnce(\n CommandResultFactory({ data: { enabled: true } }),\n );\n buildContextMock.mockRejectedValueOnce(\n new InvalidStatusWordError(\"buildContext error\"),\n );\n signTypedDataLegacyMock.mockRejectedValueOnce(\n new InvalidStatusWordError(\"signTypedDataLegacy error\"),\n );\n\n // Expected intermediate values for the following state sequence:\n // Initial -> OpenApp -> GetAppConfiguration -> Web3ChecksOptIn -> BuildContext\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.Web3ChecksOptIn,\n step: SignTypedDataDAStateStep.WEB3_CHECKS_OPT_IN,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.WEB3_CHECKS_OPT_IN_RESULT,\n result: true,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.SIGN_TYPED_DATA_LEGACY,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: new InvalidStatusWordError(\"signTypedDataLegacy error\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: () => {\n // Verify mocks calls parameters\n expect(getAppConfigMock).toHaveBeenCalled();\n expect(web3CheckOptInMock).toHaveBeenCalled();\n expect(buildContextMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n contextModule: mockContextModule,\n parser: mockParser,\n data: TEST_MESSAGE,\n appConfig: createAppConfig(\"1.16.0\", true, false),\n derivationPath: \"44'/60'/0'/0/0\",\n },\n }),\n );\n resolve();\n },\n });\n }));\n\n it(\"should call external dependencies with web3Checks opt-in, then disabled\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.16.0\", false, false);\n\n const deviceAction = new SignTypedDataDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_MESSAGE,\n contextModule: mockContextModule,\n parser: mockParser,\n skipOpenApp: false,\n },\n });\n\n // Mock the dependencies to return some sample data\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n web3CheckOptInMock.mockResolvedValueOnce(\n CommandResultFactory({ data: { enabled: false } }),\n );\n buildContextMock.mockRejectedValueOnce(\n new InvalidStatusWordError(\"buildContext error\"),\n );\n signTypedDataLegacyMock.mockRejectedValueOnce(\n new InvalidStatusWordError(\"signTypedDataLegacy error\"),\n );\n\n // Expected intermediate values for the following state sequence:\n // Initial -> OpenApp -> GetAppConfiguration -> Web3ChecksOptIn -> BuildContext\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.Web3ChecksOptIn,\n step: SignTypedDataDAStateStep.WEB3_CHECKS_OPT_IN,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.WEB3_CHECKS_OPT_IN_RESULT,\n result: false,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.SIGN_TYPED_DATA_LEGACY,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: new InvalidStatusWordError(\"signTypedDataLegacy error\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: () => {\n // Verify mocks calls parameters\n expect(getAppConfigMock).toHaveBeenCalled();\n expect(web3CheckOptInMock).toHaveBeenCalled();\n expect(buildContextMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n contextModule: mockContextModule,\n parser: mockParser,\n data: TEST_MESSAGE,\n appConfig: createAppConfig(\"1.16.0\", false, false),\n derivationPath: \"44'/60'/0'/0/0\",\n },\n }),\n );\n resolve();\n },\n });\n }));\n });\n\n describe(\"error cases\", () => {\n it(\"Error if the open app fails\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock(new UnknownDAError(\"Mocked error\"));\n\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n },\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n },\n {\n status: DeviceActionStatus.Error,\n error: new UnknownDAError(\"Mocked error\"),\n },\n ];\n\n const deviceAction = new SignTypedDataDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_MESSAGE,\n contextModule: mockContextModule,\n parser: mockParser,\n skipOpenApp: false,\n },\n });\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: resolve,\n });\n }));\n\n it(\"Error thrown while providing context\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\n\n const deviceAction = new SignTypedDataDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_MESSAGE,\n contextModule: mockContextModule,\n parser: mockParser,\n skipOpenApp: false,\n },\n });\n\n // Mock the providing error\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n buildContextMock.mockResolvedValueOnce(TEST_BUILT_CONTEXT);\n provideContextMock.mockRejectedValueOnce(new UnknownDAError(\"Error\"));\n\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.PROVIDE_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: new UnknownDAError(\"Error\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: resolve,\n });\n }));\n\n it(\"Error while signing\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\n\n const deviceAction = new SignTypedDataDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_MESSAGE,\n contextModule: mockContextModule,\n parser: mockParser,\n skipOpenApp: false,\n },\n });\n\n // Mock signing error\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n buildContextMock.mockResolvedValueOnce(TEST_BUILT_CONTEXT);\n provideContextMock.mockResolvedValueOnce(\n CommandResultFactory({ data: undefined }),\n );\n signTypedDataMock.mockResolvedValueOnce(\n CommandResultFactory({\n error: new UnknownDeviceExchangeError(\n \"Error while signing the typed data\",\n ),\n }),\n );\n\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.PROVIDE_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.SIGN_TYPED_DATA,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: new UnknownDeviceExchangeError(\n \"Error while signing the typed data\",\n ),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: resolve,\n });\n }));\n });\n});\n"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["CommandResultFactory", "DeviceActionStatus", "DeviceModelId", "DeviceSessionStateType", "DeviceStatus", "InvalidStatusWordError", "UnknownDAError", "UnknownDeviceExchangeError", "UserInteractionRequired", "Just", "Nothing", "SignTypedDataDAStateStep", "EthAppCommandErrorFactory", "makeDeviceActionInternalApiMock", "setupOpenAppDAMock", "testDeviceActionStates", "PrimitiveType", "StructType", "TypedDataValueField", "SignTypedDataDeviceAction", "importOriginal", "TEST_MESSAGE", "TEST_BUILT_CONTEXT", "mockParser", "mockContextModule", "apiMock", "getAppConfigMock", "web3CheckOptInMock", "buildContextMock", "provideContextMock", "signTypedDataMock", "signTypedDataLegacyMock", "extractDependenciesMock", "createAppConfig", "version", "web3ChecksEnabled", "web3ChecksOptIn", "setupAppConfig", "resolve", "reject", "deviceAction", "expectedStates"]
|
|
4
|
+
"sourcesContent": ["/* eslint @typescript-eslint/consistent-type-imports: 0 */\nimport { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n CommandResultFactory,\n DeviceActionStatus,\n DeviceModelId,\n DeviceSessionStateType,\n DeviceStatus,\n InvalidStatusWordError,\n UnknownDAError,\n UnknownDeviceExchangeError,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { Just, Nothing } from \"purify-ts\";\n\nimport { type SignTypedDataDAState } from \"@api/app-binder/SignTypedDataDeviceActionTypes\";\nimport { SignTypedDataDAStateStep } from \"@api/app-binder/SignTypedDataDeviceActionTypes\";\nimport { EthAppCommandErrorFactory } from \"@internal/app-binder/command/utils/ethAppErrors\";\nimport { makeDeviceActionInternalApiMock } from \"@internal/app-binder/device-action/__test-utils__/makeInternalApi\";\nimport { setupOpenAppDAMock } from \"@internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock\";\nimport { testDeviceActionStates } from \"@internal/app-binder/device-action/__test-utils__/testDeviceActionStates\";\nimport { type ProvideEIP712ContextTaskArgs } from \"@internal/app-binder/task/ProvideEIP712ContextTask\";\nimport { type TransactionMapperService } from \"@internal/transaction/service/mapper/TransactionMapperService\";\nimport { type TransactionParserService } from \"@internal/transaction/service/parser/TransactionParserService\";\nimport {\n PrimitiveType,\n StructType,\n TypedDataValueField,\n} from \"@internal/typed-data/model/Types\";\nimport { type TypedDataParserService } from \"@internal/typed-data/service/TypedDataParserService\";\n\nimport { SignTypedDataDeviceAction } from \"./SignTypedDataDeviceAction\";\n\nvi.mock(\"@ledgerhq/device-management-kit\", async (importOriginal) => {\n const original =\n await importOriginal<typeof import(\"@ledgerhq/device-management-kit\")>();\n return {\n ...original,\n OpenAppDeviceAction: vi.fn(() => ({\n makeStateMachine: vi.fn(),\n })),\n };\n});\n\ndescribe(\"SignTypedDataDeviceAction\", () => {\n const TEST_MESSAGE = {\n domain: {},\n message: {},\n primaryType: \"TestMessage\",\n types: {},\n };\n const TEST_BUILT_CONTEXT: ProvideEIP712ContextTaskArgs = {\n derivationPath: \"44'/60'/0'/0/0\",\n web3Check: null,\n types: {\n PermitSingle: {\n details: new StructType(\"PermitDetails\"),\n spender: new PrimitiveType(\"address\", \"address\", Nothing),\n sigDeadline: new PrimitiveType(\"uint256\", \"uint\", Just(32)),\n },\n },\n domain: [\n {\n path: \"chainId\",\n type: \"uint256\",\n value: new TypedDataValueField(Uint8Array.from([137])),\n },\n ],\n message: [\n {\n path: \"details.expiration\",\n type: \"uint48\",\n value: new TypedDataValueField(Uint8Array.from([0x13])),\n },\n ],\n clearSignContext: Just({\n type: \"success\",\n messageInfo: {\n displayName: \"Permit2\",\n filtersCount: 1,\n signature:\n \"3045022100e3c597d13d28a87a88b0239404c668373cf5063362f2a81d09eed4582941dfe802207669aabb504fd5b95b2734057f6b8bbf51f14a69a5f9bdf658a5952cefbf44d3\",\n },\n trustedNamesAddresses: {},\n tokens: {},\n calldatas: {},\n proxy: undefined,\n filters: {\n \"details.amount\": {\n displayName: \"Amount allowance\",\n path: \"details.amount\",\n signature:\n \"304402201a46e6b4ef89eaf9fcf4945d053bfc5616a826400fd758312fbbe976bafc07ec022025a9b408722baf983ee053f90179c75b0c55bb0668f437d55493e36069bbd5a3\",\n tokenIndex: 255,\n type: \"amount\",\n },\n },\n }),\n calldatasContexts: {},\n };\n\n const mockParser: TypedDataParserService = {\n parse: vi.fn(),\n };\n const mockTransactionParser: TransactionParserService = {\n extractValue: vi.fn(),\n } as unknown as TransactionParserService;\n const mockTransactionMapper: TransactionMapperService = {\n mapTransactionToSubset: vi.fn(),\n };\n const mockContextModule: ContextModule = {\n getFieldContext: vi.fn(),\n getContexts: vi.fn(),\n getTypedDataFilters: vi.fn(),\n getWeb3Checks: vi.fn(),\n getSolanaContext: vi.fn(),\n };\n const apiMock = makeDeviceActionInternalApiMock();\n const getAppConfigMock = vi.fn();\n const web3CheckOptInMock = vi.fn();\n const buildContextMock = vi.fn();\n const provideContextMock = vi.fn();\n const signTypedDataMock = vi.fn();\n const signTypedDataLegacyMock = vi.fn();\n function extractDependenciesMock() {\n return {\n getAppConfig: getAppConfigMock,\n web3CheckOptIn: web3CheckOptInMock,\n buildContext: buildContextMock,\n provideContext: provideContextMock,\n signTypedData: signTypedDataMock,\n signTypedDataLegacy: signTypedDataLegacyMock,\n };\n }\n\n function createAppConfig(\n version: string,\n web3ChecksEnabled: boolean,\n web3ChecksOptIn: boolean,\n ) {\n return {\n blindSigningEnabled: false,\n web3ChecksEnabled,\n web3ChecksOptIn,\n version,\n };\n }\n\n function setupAppConfig(\n version: string,\n web3ChecksEnabled: boolean,\n web3ChecksOptIn: boolean,\n ) {\n apiMock.getDeviceSessionState.mockReturnValueOnce({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n });\n getAppConfigMock.mockResolvedValue(\n CommandResultFactory({\n data: createAppConfig(version, web3ChecksEnabled, web3ChecksOptIn),\n }),\n );\n }\n\n beforeEach(() => {\n vi.resetAllMocks();\n });\n\n describe(\"Success case\", () => {\n it(\"should call external dependencies with the correct parameters\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\n\n const deviceAction = new SignTypedDataDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_MESSAGE,\n contextModule: mockContextModule,\n parser: mockParser,\n transactionParser: mockTransactionParser,\n transactionMapper: mockTransactionMapper,\n skipOpenApp: false,\n },\n });\n\n // Mock the dependencies to return some sample data\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n buildContextMock.mockResolvedValueOnce(TEST_BUILT_CONTEXT);\n provideContextMock.mockResolvedValueOnce(\n CommandResultFactory({ data: undefined }),\n );\n signTypedDataMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n }),\n );\n\n // Expected intermediate values for the following state sequence:\n // Initial -> OpenApp -> BuildContext -> ProvideContext -> SignTypedData\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.PROVIDE_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.SIGN_TYPED_DATA,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n status: DeviceActionStatus.Completed,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: () => {\n // Verify mocks calls parameters\n expect(buildContextMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n contextModule: mockContextModule,\n parser: mockParser,\n transactionParser: mockTransactionParser,\n transactionMapper: mockTransactionMapper,\n data: TEST_MESSAGE,\n appConfig: createAppConfig(\"1.15.0\", false, false),\n derivationPath: \"44'/60'/0'/0/0\",\n },\n }),\n );\n\n expect(provideContextMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n contextModule: mockContextModule,\n taskArgs: TEST_BUILT_CONTEXT,\n },\n }),\n );\n\n expect(signTypedDataMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n },\n }),\n );\n\n resolve();\n },\n });\n }));\n\n it(\"should be successful whlie skipping OpenApp\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\n\n const deviceAction = new SignTypedDataDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_MESSAGE,\n contextModule: mockContextModule,\n parser: mockParser,\n transactionParser: mockTransactionParser,\n transactionMapper: mockTransactionMapper,\n skipOpenApp: true,\n },\n });\n\n // Mock the dependencies to return some sample data\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n buildContextMock.mockResolvedValueOnce(TEST_BUILT_CONTEXT);\n provideContextMock.mockResolvedValueOnce(\n CommandResultFactory({ data: undefined }),\n );\n signTypedDataMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n }),\n );\n\n // Expected intermediate values for the following state sequence:\n // Initial -> BuildContext -> ProvideContext -> SignTypedData\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.PROVIDE_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.SIGN_TYPED_DATA,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n status: DeviceActionStatus.Completed,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: resolve,\n });\n }));\n\n it(\"should fallback to legacy signing if the new one fails\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\n\n const deviceAction = new SignTypedDataDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_MESSAGE,\n contextModule: mockContextModule,\n parser: mockParser,\n transactionParser: mockTransactionParser,\n transactionMapper: mockTransactionMapper,\n skipOpenApp: false,\n },\n });\n\n // Mock the providing error\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n buildContextMock.mockResolvedValueOnce(TEST_BUILT_CONTEXT);\n provideContextMock.mockResolvedValueOnce(\n CommandResultFactory({\n error: EthAppCommandErrorFactory({\n errorCode: \"6a80\",\n message: \"\",\n }),\n }),\n );\n signTypedDataLegacyMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n }),\n );\n\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.PROVIDE_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.SIGN_TYPED_DATA_LEGACY,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n status: DeviceActionStatus.Completed,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: resolve,\n });\n }));\n\n it(\"should fallback to legacy signing BuildContext fails\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\n\n const deviceAction = new SignTypedDataDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_MESSAGE,\n contextModule: mockContextModule,\n parser: mockParser,\n transactionParser: mockTransactionParser,\n transactionMapper: mockTransactionMapper,\n skipOpenApp: false,\n },\n });\n\n // Mock the providing error\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n buildContextMock.mockRejectedValueOnce(new UnknownDAError(\"Error\"));\n signTypedDataLegacyMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n }),\n );\n\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.SIGN_TYPED_DATA_LEGACY,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n output: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n status: DeviceActionStatus.Completed,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: resolve,\n });\n }));\n\n it(\"should not fallback to legacy signing if rejected by the user during streaming\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\n\n const deviceAction = new SignTypedDataDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_MESSAGE,\n contextModule: mockContextModule,\n parser: mockParser,\n transactionParser: mockTransactionParser,\n transactionMapper: mockTransactionMapper,\n skipOpenApp: false,\n },\n });\n\n // Mock the providing error\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n buildContextMock.mockResolvedValueOnce(TEST_BUILT_CONTEXT);\n provideContextMock.mockResolvedValueOnce(\n CommandResultFactory({\n error: EthAppCommandErrorFactory({\n errorCode: \"6985\",\n message: \"\",\n }),\n }),\n );\n signTypedDataLegacyMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: {\n v: 0x1c,\n r: \"0x8a540510e13b0f2b11a451275716d29e08caad07e89a1c84964782fb5e1ad788\",\n s: \"0x64a0de235b270fbe81e8e40688f4a9f9ad9d283d690552c9331d7773ceafa513\",\n },\n }),\n );\n\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.PROVIDE_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: EthAppCommandErrorFactory({\n errorCode: \"6985\",\n message: \"\",\n }),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: resolve,\n });\n }));\n });\n\n describe(\"Web3Checks\", () => {\n it(\"should call external dependencies with web3Checks enabled and supported\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.16.0\", true, true);\n\n const deviceAction = new SignTypedDataDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_MESSAGE,\n contextModule: mockContextModule,\n parser: mockParser,\n transactionParser: mockTransactionParser,\n transactionMapper: mockTransactionMapper,\n skipOpenApp: false,\n },\n });\n\n // Mock the dependencies to return some sample data\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n buildContextMock.mockRejectedValueOnce(\n new InvalidStatusWordError(\"buildContext error\"),\n );\n signTypedDataLegacyMock.mockRejectedValueOnce(\n new InvalidStatusWordError(\"signTypedDataLegacy error\"),\n );\n\n // Expected intermediate values for the following state sequence:\n // Initial -> OpenApp -> GetAppConfiguration -> BuildContext\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.SIGN_TYPED_DATA_LEGACY,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: new InvalidStatusWordError(\"signTypedDataLegacy error\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: () => {\n // Verify mocks calls parameters\n expect(getAppConfigMock).toHaveBeenCalled();\n expect(buildContextMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n contextModule: mockContextModule,\n parser: mockParser,\n transactionParser: mockTransactionParser,\n transactionMapper: mockTransactionMapper,\n data: TEST_MESSAGE,\n appConfig: createAppConfig(\"1.16.0\", true, true),\n derivationPath: \"44'/60'/0'/0/0\",\n },\n }),\n );\n resolve();\n },\n });\n }));\n\n it(\"should call external dependencies with web3Checks supported but disabled\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.16.0\", false, true);\n\n const deviceAction = new SignTypedDataDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_MESSAGE,\n contextModule: mockContextModule,\n parser: mockParser,\n transactionParser: mockTransactionParser,\n transactionMapper: mockTransactionMapper,\n skipOpenApp: false,\n },\n });\n\n // Mock the dependencies to return some sample data\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n buildContextMock.mockRejectedValueOnce(\n new InvalidStatusWordError(\"buildContext error\"),\n );\n signTypedDataLegacyMock.mockRejectedValueOnce(\n new InvalidStatusWordError(\"signTypedDataLegacy error\"),\n );\n\n // Expected intermediate values for the following state sequence:\n // Initial -> OpenApp -> GetAppConfiguration -> BuildContext\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.SIGN_TYPED_DATA_LEGACY,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: new InvalidStatusWordError(\"signTypedDataLegacy error\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: () => {\n // Verify mocks calls parameters\n expect(getAppConfigMock).toHaveBeenCalled();\n expect(buildContextMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n contextModule: mockContextModule,\n parser: mockParser,\n transactionParser: mockTransactionParser,\n transactionMapper: mockTransactionMapper,\n data: TEST_MESSAGE,\n appConfig: createAppConfig(\"1.16.0\", false, true),\n derivationPath: \"44'/60'/0'/0/0\",\n },\n }),\n );\n resolve();\n },\n });\n }));\n\n it(\"should call external dependencies with web3Checks opt-in, then enabled\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.16.0\", false, false);\n\n const deviceAction = new SignTypedDataDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_MESSAGE,\n contextModule: mockContextModule,\n parser: mockParser,\n transactionParser: mockTransactionParser,\n transactionMapper: mockTransactionMapper,\n skipOpenApp: false,\n },\n });\n\n // Mock the dependencies to return some sample data\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n web3CheckOptInMock.mockResolvedValueOnce(\n CommandResultFactory({ data: { enabled: true } }),\n );\n buildContextMock.mockRejectedValueOnce(\n new InvalidStatusWordError(\"buildContext error\"),\n );\n signTypedDataLegacyMock.mockRejectedValueOnce(\n new InvalidStatusWordError(\"signTypedDataLegacy error\"),\n );\n\n // Expected intermediate values for the following state sequence:\n // Initial -> OpenApp -> GetAppConfiguration -> Web3ChecksOptIn -> BuildContext\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.Web3ChecksOptIn,\n step: SignTypedDataDAStateStep.WEB3_CHECKS_OPT_IN,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.WEB3_CHECKS_OPT_IN_RESULT,\n result: true,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.SIGN_TYPED_DATA_LEGACY,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: new InvalidStatusWordError(\"signTypedDataLegacy error\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: () => {\n // Verify mocks calls parameters\n expect(getAppConfigMock).toHaveBeenCalled();\n expect(web3CheckOptInMock).toHaveBeenCalled();\n expect(buildContextMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n contextModule: mockContextModule,\n parser: mockParser,\n transactionParser: mockTransactionParser,\n transactionMapper: mockTransactionMapper,\n data: TEST_MESSAGE,\n appConfig: createAppConfig(\"1.16.0\", true, false),\n derivationPath: \"44'/60'/0'/0/0\",\n },\n }),\n );\n resolve();\n },\n });\n }));\n\n it(\"should call external dependencies with web3Checks opt-in, then disabled\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.16.0\", false, false);\n\n const deviceAction = new SignTypedDataDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_MESSAGE,\n contextModule: mockContextModule,\n parser: mockParser,\n transactionParser: mockTransactionParser,\n transactionMapper: mockTransactionMapper,\n skipOpenApp: false,\n },\n });\n\n // Mock the dependencies to return some sample data\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n web3CheckOptInMock.mockResolvedValueOnce(\n CommandResultFactory({ data: { enabled: false } }),\n );\n buildContextMock.mockRejectedValueOnce(\n new InvalidStatusWordError(\"buildContext error\"),\n );\n signTypedDataLegacyMock.mockRejectedValueOnce(\n new InvalidStatusWordError(\"signTypedDataLegacy error\"),\n );\n\n // Expected intermediate values for the following state sequence:\n // Initial -> OpenApp -> GetAppConfiguration -> Web3ChecksOptIn -> BuildContext\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.Web3ChecksOptIn,\n step: SignTypedDataDAStateStep.WEB3_CHECKS_OPT_IN,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.WEB3_CHECKS_OPT_IN_RESULT,\n result: false,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.SIGN_TYPED_DATA_LEGACY,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: new InvalidStatusWordError(\"signTypedDataLegacy error\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: () => {\n // Verify mocks calls parameters\n expect(getAppConfigMock).toHaveBeenCalled();\n expect(web3CheckOptInMock).toHaveBeenCalled();\n expect(buildContextMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n contextModule: mockContextModule,\n parser: mockParser,\n transactionParser: mockTransactionParser,\n transactionMapper: mockTransactionMapper,\n data: TEST_MESSAGE,\n appConfig: createAppConfig(\"1.16.0\", false, false),\n derivationPath: \"44'/60'/0'/0/0\",\n },\n }),\n );\n resolve();\n },\n });\n }));\n });\n\n describe(\"error cases\", () => {\n it(\"Error if the open app fails\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock(new UnknownDAError(\"Mocked error\"));\n\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n },\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n },\n {\n status: DeviceActionStatus.Error,\n error: new UnknownDAError(\"Mocked error\"),\n },\n ];\n\n const deviceAction = new SignTypedDataDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_MESSAGE,\n contextModule: mockContextModule,\n parser: mockParser,\n transactionParser: mockTransactionParser,\n transactionMapper: mockTransactionMapper,\n skipOpenApp: false,\n },\n });\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: resolve,\n });\n }));\n\n it(\"Error thrown while providing context\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\n\n const deviceAction = new SignTypedDataDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_MESSAGE,\n contextModule: mockContextModule,\n parser: mockParser,\n transactionParser: mockTransactionParser,\n transactionMapper: mockTransactionMapper,\n skipOpenApp: false,\n },\n });\n\n // Mock the providing error\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n buildContextMock.mockResolvedValueOnce(TEST_BUILT_CONTEXT);\n provideContextMock.mockRejectedValueOnce(new UnknownDAError(\"Error\"));\n\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.PROVIDE_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: new UnknownDAError(\"Error\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: resolve,\n });\n }));\n\n it(\"Error while signing\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n setupAppConfig(\"1.15.0\", false, false);\n\n const deviceAction = new SignTypedDataDeviceAction({\n input: {\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_MESSAGE,\n contextModule: mockContextModule,\n parser: mockParser,\n transactionParser: mockTransactionParser,\n transactionMapper: mockTransactionMapper,\n skipOpenApp: false,\n },\n });\n\n // Mock signing error\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n buildContextMock.mockResolvedValueOnce(TEST_BUILT_CONTEXT);\n provideContextMock.mockResolvedValueOnce(\n CommandResultFactory({ data: undefined }),\n );\n signTypedDataMock.mockResolvedValueOnce(\n CommandResultFactory({\n error: new UnknownDeviceExchangeError(\n \"Error while signing the typed data\",\n ),\n }),\n );\n\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n step: SignTypedDataDAStateStep.OPEN_APP,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: SignTypedDataDAStateStep.BUILD_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.PROVIDE_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n step: SignTypedDataDAStateStep.SIGN_TYPED_DATA,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: new UnknownDeviceExchangeError(\n \"Error while signing the typed data\",\n ),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(deviceAction, expectedStates, apiMock, {\n onError: reject,\n onDone: resolve,\n });\n }));\n });\n});\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
|
+
"names": ["CommandResultFactory", "DeviceActionStatus", "DeviceModelId", "DeviceSessionStateType", "DeviceStatus", "InvalidStatusWordError", "UnknownDAError", "UnknownDeviceExchangeError", "UserInteractionRequired", "Just", "Nothing", "SignTypedDataDAStateStep", "EthAppCommandErrorFactory", "makeDeviceActionInternalApiMock", "setupOpenAppDAMock", "testDeviceActionStates", "PrimitiveType", "StructType", "TypedDataValueField", "SignTypedDataDeviceAction", "importOriginal", "TEST_MESSAGE", "TEST_BUILT_CONTEXT", "mockParser", "mockTransactionParser", "mockTransactionMapper", "mockContextModule", "apiMock", "getAppConfigMock", "web3CheckOptInMock", "buildContextMock", "provideContextMock", "signTypedDataMock", "signTypedDataLegacyMock", "extractDependenciesMock", "createAppConfig", "version", "web3ChecksEnabled", "web3ChecksOptIn", "setupAppConfig", "resolve", "reject", "deviceAction", "expectedStates"]
|
|
7
7
|
}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import{ClearSignContextType as t}from"@ledgerhq/context-module";import{CommandResultFactory as g,DeviceModelId as l,DeviceSessionStateType as r,DeviceStatus as d,hexaStringToBuffer as h,UnknownDeviceExchangeError as m}from"@ledgerhq/device-management-kit";import{Transaction as v}from"ethers";import{ClearSigningType as u}from"../../../api/model/ClearSigningType";import{makeDeviceActionInternalApiMock as O}from"../../app-binder/device-action/__test-utils__/makeInternalApi";import{BuildBaseContexts as s}from"./BuildBaseContexts";import{GetWeb3CheckTask as T}from"./GetWeb3CheckTask";describe("BuildBaseContexts",()=>{const i={getFieldContext:vi.fn(),getContexts:vi.fn(),getTypedDataFilters:vi.fn(),getWeb3Checks:vi.fn(),getSolanaContext:vi.fn(),getProxyDelegateCall:vi.fn()},x={domain:"domain-name.eth"},y=h(v.from({chainId:1n,nonce:0,data:"0x"}).unsignedSerialized),p={keyUsageNumber:1,payload:new Uint8Array([1,2,3])};let o;const n=O(),c=vi.fn();function S(e){return{blindSigningEnabled:!1,web3ChecksEnabled:e,web3ChecksOptIn:!1,version:"1.13.0"}}beforeEach(()=>{vi.resetAllMocks(),n.sendCommand.mockResolvedValue(g({data:{challenge:"challenge"}})),c.mockReturnValue({run:async()=>Promise.resolve({web3Check:null})}),o={contextModule:i,subset:{chainId:1,to:void 0,data:"0x",selector:"0x"},transaction:y,options:x,appConfig:S(!1),derivationPath:"44'/60'/0'/0/0"}}),it("should init with a default GetWeb3CheckTaskFactory",()=>{const e=new s(n,o);expect(e.getWeb3ChecksFactory).toBeDefined(),expect(e.getWeb3ChecksFactory(n,{contextModule:o.contextModule,derivationPath:o.derivationPath,subset:o.subset,transaction:o.transaction})).toBeInstanceOf(T)}),it("should build the transaction context without clear sign contexts",async()=>{const e=[],a=[];i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const C=await new s(n,{...o,appConfig:S(!0)},c).run();expect(C).toEqual({clearSignContexts:e,clearSignContextsOptional:a,clearSigningType:u.BASIC})}),it("should build the transaction context with web3checks",async()=>{const e=[],a=[],C="web3Check";c.mockReturnValueOnce({run:async()=>Promise.resolve({web3Check:C})}),i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const E=await new s(n,{...o,appConfig:S(!0)},c).run();expect(E).toEqual({clearSignContexts:[C,...e],clearSignContextsOptional:a,clearSigningType:u.BASIC})}),it("should build the transaction context with web3checks and generic-parser clear sign contexts",async()=>{const e=[{type:t.TRANSACTION_INFO,payload:"payload-1",certificate:p},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-2"},{type:t.ENUM,payload:"payload-3",id:1,value:2,certificate:p},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-4"}],a="web3Check";c.mockReturnValueOnce({run:async()=>Promise.resolve({web3Check:a})}),i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.15.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const C=await new s(n,{...o,appConfig:S(!0)},c).run();expect(C).toEqual({clearSignContexts:[e[0],e[1],e[3],a],clearSignContextsOptional:[e[2]],clearSigningType:u.EIP7730})}),it("should build the transaction context with web3checks and generic-parser clear sign contexts in the correct order",async()=>{const e=[{type:t.ENUM,payload:"payload-3",id:1,value:2,certificate:p},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-4"},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-2"},{type:t.TRANSACTION_INFO,payload:"payload-1",certificate:p}],a="web3Check";c.mockReturnValueOnce({run:async()=>Promise.resolve({web3Check:a})}),i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.15.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const C=await new s(n,{...o,appConfig:S(!0)},c).run();expect(C).toEqual({clearSignContexts:[e[3],e[1],e[2],a],clearSignContextsOptional:[e[0]],clearSigningType:u.EIP7730})}),it("should build the transaction context with clear sign contexts",async()=>{const e=[{type:t.TOKEN,payload:"payload-1"},{type:t.NFT,payload:"payload-2"}],a="web3Check";c.mockReturnValueOnce({run:async()=>Promise.resolve({web3Check:a})}),i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const C=await new s(n,o,c).run();expect(C).toEqual({clearSignContexts:e,clearSignContextsOptional:[],clearSigningType:u.BASIC})}),it("should build the transaction context with generic-parser context",async()=>{const e=[{type:t.TRANSACTION_INFO,payload:"payload-1",certificate:p},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-2"},{type:t.ENUM,payload:"payload-3",id:1,value:2,certificate:p},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-4"}];i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.15.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const a=await new s(n,o,c).run();expect(a).toEqual({clearSignContexts:[e[0],e[1],e[3]],clearSignContextsOptional:[e[2]],clearSigningType:u.EIP7730})}),it("should build the transaction context with proxy delegate call context",async()=>{const e=[{type:t.TRANSACTION_INFO,payload:"payload-1",certificate:p},{type:t.PROXY_DELEGATE_CALL,payload:"payload-2"}],a=[];i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.15.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const C=await new s(n,o,c).run();expect(C).toEqual({clearSignContexts:[e[1],e[0]],clearSignContextsOptional:a,clearSigningType:u.EIP7730})}),it("should call the web3checks factory with correct parameters",async()=>{const e=[];i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1}),await new s(n,{...o,appConfig:S(!0)},c).run(),expect(c).toHaveBeenCalledWith(n,{contextModule:i,derivationPath:"44'/60'/0'/0/0",subset:o.subset,transaction:y})}),it("should call the context module with the correct parameters",async()=>{const e=[];i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1}),await new s(n,o,c).run(),expect(i.getContexts).toHaveBeenCalledWith({deviceModelId:l.FLEX,challenge:"challenge",domain:"domain-name.eth",...o.subset})}),it("should call the context module without challenge for Nano S",async()=>{const e=[];i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:l.NANO_S,isSecureConnectionAllowed:!1}),await new s(n,o,c).run(),expect(i.getContexts).toHaveBeenCalledWith({deviceModelId:l.NANO_S,domain:"domain-name.eth",...o.subset})}),it("should call the context module without context on error",async()=>{const e=[];i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1}),n.sendCommand.mockResolvedValueOnce(g({error:new m})),await new s(n,o,c).run(),expect(i.getContexts).toHaveBeenCalledWith({deviceModelId:l.FLEX,challenge:void 0,domain:"domain-name.eth",...o.subset})}),it("should exclude error contexts from the result",async()=>{const e=[{type:t.ERROR,error:new Error("error")},{type:t.TOKEN,payload:"payload-1"},{type:t.ERROR,error:new Error("error")},{type:t.NFT,payload:"payload-2"}];i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const a=await new s(n,o,c).run();expect(a).toEqual({clearSignContexts:[e[1],e[3]],clearSignContextsOptional:[],clearSigningType:u.BASIC})}),it("should exclude generic-parser contexts from the result on old apps",async()=>{const e=[{type:t.TRANSACTION_INFO,payload:"transaction_info",certificate:p},{type:t.TOKEN,payload:"payload-1"},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"transaction_field"},{type:t.NFT,payload:"payload-2"},{type:t.ENUM,payload:"enum",id:1,value:2,certificate:p}];i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const a=await new s(n,o,c).run();expect(a).toEqual({clearSignContexts:[e[1],e[3]],clearSignContextsOptional:[],clearSigningType:u.BASIC})}),it("should exclude generic-parser contexts from the result if no transaction_info was found",async()=>{const e=[{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"transaction_field"},{type:t.TOKEN,payload:"payload-1"},{type:t.ENUM,payload:"enum",id:1,value:2},{type:t.NFT,payload:"payload-2"}];i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.14.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const a=await new s(n,o,c).run();expect(a).toEqual({clearSignContexts:[e[1],e[3]],clearSignContextsOptional:[],clearSigningType:u.BASIC})}),it("should exclude legacy contexts from the result for generic-parser transactions",async()=>{const e=[{type:t.TOKEN,payload:"payload-1"},{type:t.TRANSACTION_INFO,payload:"payload-2",certificate:p},{type:t.EXTERNAL_PLUGIN,payload:"payload-3"},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-4"},{type:t.ENUM,payload:"payload-5",id:1,value:2,certificate:p}];i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.15.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const a=await new s(n,o,c).run();expect(a).toEqual({clearSignContexts:[e[1],e[3]],clearSignContextsOptional:[e[4]],clearSigningType:u.EIP7730})}),it("should exclude generic-parser contexts with a nano s device",async()=>{const e=[{type:t.TOKEN,payload:"payload-1"},{type:t.TRANSACTION_INFO,payload:"payload-2",certificate:p},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-3"},{type:t.ENUM,payload:"payload-4",id:1,value:2,certificate:p}];i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.14.0"},deviceModelId:l.NANO_S,isSecureConnectionAllowed:!1});const a=await new s(n,o,c).run();expect(a).toEqual({clearSignContexts:[e[0]],clearSignContextsOptional:[],clearSigningType:u.BASIC})}),it("should exclude generic-parser contexts with an old app version",async()=>{const e=[{type:t.TOKEN,payload:"payload-1"},{type:t.TRANSACTION_INFO,payload:"payload-2",certificate:p},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-3"},{type:t.ENUM,payload:"payload-4",id:1,value:2,certificate:p}];i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const a=await new s(n,o,c).run();expect(a).toEqual({clearSignContexts:[e[0]],clearSignContextsOptional:[],clearSigningType:u.BASIC})}),it("should exclude generic-parser contexts with a non ready device",async()=>{const e=[{type:t.TOKEN,payload:"payload-1"},{type:t.TRANSACTION_INFO,payload:"payload-2",certificate:p},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-3"},{type:t.ENUM,payload:"payload-4",id:1,value:2,certificate:p}];i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.Connected,deviceStatus:d.NOT_CONNECTED,deviceModelId:l.FLEX});const a=await new s(n,o,c).run();expect(a).toEqual({clearSignContexts:[e[0]],clearSignContextsOptional:[],clearSigningType:u.BASIC})}),it("should return no clear sign context if the transaction info certificate is missing",async()=>{const e=[{type:t.TRANSACTION_INFO,payload:"payload-1"},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-2"},{type:t.ENUM,payload:"payload-3",id:1,value:2}];i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.17.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const a=await new s(n,o,c).run();expect(a).toEqual({clearSignContexts:[],clearSignContextsOptional:[],clearSigningType:u.BASIC})}),it("should not return web3check if the transaction is undefined",async()=>{const e=[];i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.17.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1}),await new s(n,{...o,transaction:void 0},c).run(),expect(c).not.toHaveBeenCalled()})});
|
|
1
|
+
import{ClearSignContextType as t}from"@ledgerhq/context-module";import{CommandResultFactory as g,DeviceModelId as l,DeviceSessionStateType as r,DeviceStatus as d,hexaStringToBuffer as h,UnknownDeviceExchangeError as m}from"@ledgerhq/device-management-kit";import{Transaction as v}from"ethers";import{ClearSigningType as u}from"../../../api/model/ClearSigningType";import{makeDeviceActionInternalApiMock as O}from"../../app-binder/device-action/__test-utils__/makeInternalApi";import{BuildBaseContexts as s}from"./BuildBaseContexts";import{GetWeb3CheckTask as T}from"./GetWeb3CheckTask";describe("BuildBaseContexts",()=>{const i={getFieldContext:vi.fn(),getContexts:vi.fn(),getTypedDataFilters:vi.fn(),getWeb3Checks:vi.fn(),getSolanaContext:vi.fn()},x={domain:"domain-name.eth"},y=h(v.from({chainId:1n,nonce:0,data:"0x"}).unsignedSerialized),p={keyUsageNumber:1,payload:new Uint8Array([1,2,3])};let o;const n=O(),c=vi.fn();function S(e){return{blindSigningEnabled:!1,web3ChecksEnabled:e,web3ChecksOptIn:!1,version:"1.13.0"}}beforeEach(()=>{vi.resetAllMocks(),n.sendCommand.mockResolvedValue(g({data:{challenge:"challenge"}})),c.mockReturnValue({run:async()=>Promise.resolve({web3Check:null})}),o={contextModule:i,subset:{chainId:1,to:void 0,data:"0x",selector:"0x"},transaction:y,options:x,appConfig:S(!1),derivationPath:"44'/60'/0'/0/0"}}),it("should init with a default GetWeb3CheckTaskFactory",()=>{const e=new s(n,o);expect(e.getWeb3ChecksFactory).toBeDefined(),expect(e.getWeb3ChecksFactory(n,{contextModule:o.contextModule,derivationPath:o.derivationPath,subset:o.subset,transaction:o.transaction})).toBeInstanceOf(T)}),it("should build the transaction context without clear sign contexts",async()=>{const e=[],a=[];i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const C=await new s(n,{...o,appConfig:S(!0)},c).run();expect(C).toEqual({clearSignContexts:e,clearSignContextsOptional:a,clearSigningType:u.BASIC})}),it("should build the transaction context with web3checks",async()=>{const e=[],a=[],C="web3Check";c.mockReturnValueOnce({run:async()=>Promise.resolve({web3Check:C})}),i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const E=await new s(n,{...o,appConfig:S(!0)},c).run();expect(E).toEqual({clearSignContexts:[C,...e],clearSignContextsOptional:a,clearSigningType:u.BASIC})}),it("should build the transaction context with web3checks and generic-parser clear sign contexts",async()=>{const e=[{type:t.TRANSACTION_INFO,payload:"payload-1",certificate:p},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-2"},{type:t.ENUM,payload:"payload-3",id:1,value:2,certificate:p},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-4"}],a="web3Check";c.mockReturnValueOnce({run:async()=>Promise.resolve({web3Check:a})}),i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.15.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const C=await new s(n,{...o,appConfig:S(!0)},c).run();expect(C).toEqual({clearSignContexts:[e[0],e[1],e[3],a],clearSignContextsOptional:[e[2]],clearSigningType:u.EIP7730})}),it("should build the transaction context with web3checks and generic-parser clear sign contexts in the correct order",async()=>{const e=[{type:t.ENUM,payload:"payload-3",id:1,value:2,certificate:p},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-4"},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-2"},{type:t.TRANSACTION_INFO,payload:"payload-1",certificate:p}],a="web3Check";c.mockReturnValueOnce({run:async()=>Promise.resolve({web3Check:a})}),i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.15.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const C=await new s(n,{...o,appConfig:S(!0)},c).run();expect(C).toEqual({clearSignContexts:[e[3],e[1],e[2],a],clearSignContextsOptional:[e[0]],clearSigningType:u.EIP7730})}),it("should build the transaction context with clear sign contexts",async()=>{const e=[{type:t.TOKEN,payload:"payload-1"},{type:t.NFT,payload:"payload-2"}],a="web3Check";c.mockReturnValueOnce({run:async()=>Promise.resolve({web3Check:a})}),i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const C=await new s(n,o,c).run();expect(C).toEqual({clearSignContexts:e,clearSignContextsOptional:[],clearSigningType:u.BASIC})}),it("should build the transaction context with generic-parser context",async()=>{const e=[{type:t.TRANSACTION_INFO,payload:"payload-1",certificate:p},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-2"},{type:t.ENUM,payload:"payload-3",id:1,value:2,certificate:p},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-4"}];i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.15.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const a=await new s(n,o,c).run();expect(a).toEqual({clearSignContexts:[e[0],e[1],e[3]],clearSignContextsOptional:[e[2]],clearSigningType:u.EIP7730})}),it("should build the transaction context with proxy delegate call context",async()=>{const e=[{type:t.TRANSACTION_INFO,payload:"payload-1",certificate:p},{type:t.PROXY_DELEGATE_CALL,payload:"payload-2"}],a=[];i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.15.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const C=await new s(n,o,c).run();expect(C).toEqual({clearSignContexts:[e[1],e[0]],clearSignContextsOptional:a,clearSigningType:u.EIP7730})}),it("should call the web3checks factory with correct parameters",async()=>{const e=[];i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1}),await new s(n,{...o,appConfig:S(!0)},c).run(),expect(c).toHaveBeenCalledWith(n,{contextModule:i,derivationPath:"44'/60'/0'/0/0",subset:o.subset,transaction:y})}),it("should call the context module with the correct parameters",async()=>{const e=[];i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1}),await new s(n,o,c).run(),expect(i.getContexts).toHaveBeenCalledWith({deviceModelId:l.FLEX,challenge:"challenge",domain:"domain-name.eth",...o.subset})}),it("should call the context module without challenge for Nano S",async()=>{const e=[];i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:l.NANO_S,isSecureConnectionAllowed:!1}),await new s(n,o,c).run(),expect(i.getContexts).toHaveBeenCalledWith({deviceModelId:l.NANO_S,domain:"domain-name.eth",...o.subset})}),it("should call the context module without context on error",async()=>{const e=[];i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1}),n.sendCommand.mockResolvedValueOnce(g({error:new m})),await new s(n,o,c).run(),expect(i.getContexts).toHaveBeenCalledWith({deviceModelId:l.FLEX,challenge:void 0,domain:"domain-name.eth",...o.subset})}),it("should exclude error contexts from the result",async()=>{const e=[{type:t.ERROR,error:new Error("error")},{type:t.TOKEN,payload:"payload-1"},{type:t.ERROR,error:new Error("error")},{type:t.NFT,payload:"payload-2"}];i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const a=await new s(n,o,c).run();expect(a).toEqual({clearSignContexts:[e[1],e[3]],clearSignContextsOptional:[],clearSigningType:u.BASIC})}),it("should exclude generic-parser contexts from the result on old apps",async()=>{const e=[{type:t.TRANSACTION_INFO,payload:"transaction_info",certificate:p},{type:t.TOKEN,payload:"payload-1"},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"transaction_field"},{type:t.NFT,payload:"payload-2"},{type:t.ENUM,payload:"enum",id:1,value:2,certificate:p}];i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const a=await new s(n,o,c).run();expect(a).toEqual({clearSignContexts:[e[1],e[3]],clearSignContextsOptional:[],clearSigningType:u.BASIC})}),it("should exclude generic-parser contexts from the result if no transaction_info was found",async()=>{const e=[{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"transaction_field"},{type:t.TOKEN,payload:"payload-1"},{type:t.ENUM,payload:"enum",id:1,value:2},{type:t.NFT,payload:"payload-2"}];i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.14.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const a=await new s(n,o,c).run();expect(a).toEqual({clearSignContexts:[e[1],e[3]],clearSignContextsOptional:[],clearSigningType:u.BASIC})}),it("should exclude legacy contexts from the result for generic-parser transactions",async()=>{const e=[{type:t.TOKEN,payload:"payload-1"},{type:t.TRANSACTION_INFO,payload:"payload-2",certificate:p},{type:t.EXTERNAL_PLUGIN,payload:"payload-3"},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-4"},{type:t.ENUM,payload:"payload-5",id:1,value:2,certificate:p}];i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.15.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const a=await new s(n,o,c).run();expect(a).toEqual({clearSignContexts:[e[1],e[3]],clearSignContextsOptional:[e[4]],clearSigningType:u.EIP7730})}),it("should exclude generic-parser contexts with a nano s device",async()=>{const e=[{type:t.TOKEN,payload:"payload-1"},{type:t.TRANSACTION_INFO,payload:"payload-2",certificate:p},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-3"},{type:t.ENUM,payload:"payload-4",id:1,value:2,certificate:p}];i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.14.0"},deviceModelId:l.NANO_S,isSecureConnectionAllowed:!1});const a=await new s(n,o,c).run();expect(a).toEqual({clearSignContexts:[e[0]],clearSignContextsOptional:[],clearSigningType:u.BASIC})}),it("should exclude generic-parser contexts with an old app version",async()=>{const e=[{type:t.TOKEN,payload:"payload-1"},{type:t.TRANSACTION_INFO,payload:"payload-2",certificate:p},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-3"},{type:t.ENUM,payload:"payload-4",id:1,value:2,certificate:p}];i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const a=await new s(n,o,c).run();expect(a).toEqual({clearSignContexts:[e[0]],clearSignContextsOptional:[],clearSigningType:u.BASIC})}),it("should exclude generic-parser contexts with a non ready device",async()=>{const e=[{type:t.TOKEN,payload:"payload-1"},{type:t.TRANSACTION_INFO,payload:"payload-2",certificate:p},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-3"},{type:t.ENUM,payload:"payload-4",id:1,value:2,certificate:p}];i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.Connected,deviceStatus:d.NOT_CONNECTED,deviceModelId:l.FLEX});const a=await new s(n,o,c).run();expect(a).toEqual({clearSignContexts:[e[0]],clearSignContextsOptional:[],clearSigningType:u.BASIC})}),it("should return no clear sign context if the transaction info certificate is missing",async()=>{const e=[{type:t.TRANSACTION_INFO,payload:"payload-1"},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-2"},{type:t.ENUM,payload:"payload-3",id:1,value:2}];i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.17.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1});const a=await new s(n,o,c).run();expect(a).toEqual({clearSignContexts:[],clearSignContextsOptional:[],clearSigningType:u.BASIC})}),it("should not return web3check if the transaction is undefined",async()=>{const e=[];i.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:r.ReadyWithoutSecureChannel,deviceStatus:d.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.17.0"},deviceModelId:l.FLEX,isSecureConnectionAllowed:!1}),await new s(n,{...o,transaction:void 0},c).run(),expect(c).not.toHaveBeenCalled()})});
|
|
2
2
|
//# sourceMappingURL=BuildBaseContexts.test.js.map
|