@ledgerhq/device-signer-kit-ethereum 1.2.0 → 1.3.0

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.
Files changed (141) hide show
  1. package/lib/cjs/api/app-binder/GetConfigCommandTypes.js +2 -0
  2. package/lib/cjs/api/app-binder/GetConfigCommandTypes.js.map +7 -0
  3. package/lib/cjs/api/app-binder/SignTransactionDeviceActionTypes.js +1 -1
  4. package/lib/cjs/api/app-binder/SignTransactionDeviceActionTypes.js.map +1 -1
  5. package/lib/cjs/index.js.map +1 -1
  6. package/lib/cjs/internal/app-binder/EthAppBinder.test.js +1 -1
  7. package/lib/cjs/internal/app-binder/EthAppBinder.test.js.map +2 -2
  8. package/lib/cjs/internal/app-binder/command/GetAppConfigurationCommand.js +2 -0
  9. package/lib/cjs/internal/app-binder/command/GetAppConfigurationCommand.js.map +7 -0
  10. package/lib/cjs/internal/app-binder/command/GetAppConfigurationCommand.test.js +2 -0
  11. package/lib/cjs/internal/app-binder/command/GetAppConfigurationCommand.test.js.map +7 -0
  12. package/lib/cjs/internal/app-binder/command/ProvideWeb3CheckCommand.js +2 -0
  13. package/lib/cjs/internal/app-binder/command/ProvideWeb3CheckCommand.js.map +7 -0
  14. package/lib/cjs/internal/app-binder/command/ProvideWeb3CheckCommand.test.js +2 -0
  15. package/lib/cjs/internal/app-binder/command/ProvideWeb3CheckCommand.test.js.map +7 -0
  16. package/lib/cjs/internal/app-binder/command/Web3CheckOptInCommand.js +2 -0
  17. package/lib/cjs/internal/app-binder/command/Web3CheckOptInCommand.js.map +7 -0
  18. package/lib/cjs/internal/app-binder/command/Web3CheckOptInCommand.test.js +2 -0
  19. package/lib/cjs/internal/app-binder/command/Web3CheckOptInCommand.test.js.map +7 -0
  20. package/lib/cjs/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.js +1 -1
  21. package/lib/cjs/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.js.map +3 -3
  22. package/lib/cjs/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.test.js +1 -1
  23. package/lib/cjs/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.test.js.map +3 -3
  24. package/lib/cjs/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.js +1 -1
  25. package/lib/cjs/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.js.map +2 -2
  26. package/lib/cjs/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.test.js +1 -1
  27. package/lib/cjs/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.test.js.map +2 -2
  28. package/lib/cjs/internal/app-binder/device-action/__test-utils__/makeInternalApi.js +1 -1
  29. package/lib/cjs/internal/app-binder/device-action/__test-utils__/makeInternalApi.js.map +3 -3
  30. package/lib/cjs/internal/app-binder/task/BuildEIP712ContextTask.js +1 -1
  31. package/lib/cjs/internal/app-binder/task/BuildEIP712ContextTask.js.map +3 -3
  32. package/lib/cjs/internal/app-binder/task/BuildEIP712ContextTask.test.js +1 -1
  33. package/lib/cjs/internal/app-binder/task/BuildEIP712ContextTask.test.js.map +3 -3
  34. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.test.js +1 -1
  35. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.test.js.map +2 -2
  36. package/lib/cjs/internal/app-binder/task/GetWeb3CheckTask.js +2 -0
  37. package/lib/cjs/internal/app-binder/task/GetWeb3CheckTask.js.map +7 -0
  38. package/lib/cjs/internal/app-binder/task/GetWeb3CheckTask.test.js +2 -0
  39. package/lib/cjs/internal/app-binder/task/GetWeb3CheckTask.test.js.map +7 -0
  40. package/lib/cjs/internal/app-binder/task/ProvideEIP712ContextTask.js +1 -1
  41. package/lib/cjs/internal/app-binder/task/ProvideEIP712ContextTask.js.map +3 -3
  42. package/lib/cjs/internal/app-binder/task/ProvideEIP712ContextTask.test.js +1 -1
  43. package/lib/cjs/internal/app-binder/task/ProvideEIP712ContextTask.test.js.map +3 -3
  44. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.js +1 -1
  45. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.js.map +3 -3
  46. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.test.js +1 -1
  47. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.test.js.map +2 -2
  48. package/lib/cjs/internal/app-binder/task/ProvideTransactionFieldDescriptionTask.js +1 -1
  49. package/lib/cjs/internal/app-binder/task/ProvideTransactionFieldDescriptionTask.js.map +3 -3
  50. package/lib/cjs/internal/app-binder/task/ProvideTransactionGenericContextTask.js +1 -1
  51. package/lib/cjs/internal/app-binder/task/ProvideTransactionGenericContextTask.js.map +3 -3
  52. package/lib/cjs/internal/app-binder/task/ProvideTransactionGenericContextTask.test.js +1 -1
  53. package/lib/cjs/internal/app-binder/task/ProvideTransactionGenericContextTask.test.js.map +2 -2
  54. package/lib/cjs/package.json +3 -3
  55. package/lib/esm/api/app-binder/GetConfigCommandTypes.js +1 -0
  56. package/lib/esm/api/app-binder/GetConfigCommandTypes.js.map +7 -0
  57. package/lib/esm/internal/app-binder/EthAppBinder.test.js +1 -1
  58. package/lib/esm/internal/app-binder/EthAppBinder.test.js.map +2 -2
  59. package/lib/esm/internal/app-binder/command/GetAppConfigurationCommand.js +2 -0
  60. package/lib/esm/internal/app-binder/command/GetAppConfigurationCommand.js.map +7 -0
  61. package/lib/esm/internal/app-binder/command/GetAppConfigurationCommand.test.js +2 -0
  62. package/lib/esm/internal/app-binder/command/GetAppConfigurationCommand.test.js.map +7 -0
  63. package/lib/esm/internal/app-binder/command/ProvideWeb3CheckCommand.js +2 -0
  64. package/lib/esm/internal/app-binder/command/ProvideWeb3CheckCommand.js.map +7 -0
  65. package/lib/esm/internal/app-binder/command/ProvideWeb3CheckCommand.test.js +2 -0
  66. package/lib/esm/internal/app-binder/command/ProvideWeb3CheckCommand.test.js.map +7 -0
  67. package/lib/esm/internal/app-binder/command/Web3CheckOptInCommand.js +2 -0
  68. package/lib/esm/internal/app-binder/command/Web3CheckOptInCommand.js.map +7 -0
  69. package/lib/esm/internal/app-binder/command/Web3CheckOptInCommand.test.js +2 -0
  70. package/lib/esm/internal/app-binder/command/Web3CheckOptInCommand.test.js.map +7 -0
  71. package/lib/esm/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.js +1 -1
  72. package/lib/esm/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.js.map +3 -3
  73. package/lib/esm/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.test.js +1 -1
  74. package/lib/esm/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.test.js.map +3 -3
  75. package/lib/esm/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.js +1 -1
  76. package/lib/esm/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.js.map +2 -2
  77. package/lib/esm/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.test.js +1 -1
  78. package/lib/esm/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.test.js.map +2 -2
  79. package/lib/esm/internal/app-binder/device-action/__test-utils__/makeInternalApi.js +1 -1
  80. package/lib/esm/internal/app-binder/device-action/__test-utils__/makeInternalApi.js.map +3 -3
  81. package/lib/esm/internal/app-binder/task/BuildEIP712ContextTask.js +1 -1
  82. package/lib/esm/internal/app-binder/task/BuildEIP712ContextTask.js.map +3 -3
  83. package/lib/esm/internal/app-binder/task/BuildEIP712ContextTask.test.js +1 -1
  84. package/lib/esm/internal/app-binder/task/BuildEIP712ContextTask.test.js.map +3 -3
  85. package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.test.js +1 -1
  86. package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.test.js.map +2 -2
  87. package/lib/esm/internal/app-binder/task/GetWeb3CheckTask.js +2 -0
  88. package/lib/esm/internal/app-binder/task/GetWeb3CheckTask.js.map +7 -0
  89. package/lib/esm/internal/app-binder/task/GetWeb3CheckTask.test.js +2 -0
  90. package/lib/esm/internal/app-binder/task/GetWeb3CheckTask.test.js.map +7 -0
  91. package/lib/esm/internal/app-binder/task/ProvideEIP712ContextTask.js +1 -1
  92. package/lib/esm/internal/app-binder/task/ProvideEIP712ContextTask.js.map +3 -3
  93. package/lib/esm/internal/app-binder/task/ProvideEIP712ContextTask.test.js +1 -1
  94. package/lib/esm/internal/app-binder/task/ProvideEIP712ContextTask.test.js.map +3 -3
  95. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.js +1 -1
  96. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.js.map +3 -3
  97. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.test.js +1 -1
  98. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.test.js.map +2 -2
  99. package/lib/esm/internal/app-binder/task/ProvideTransactionFieldDescriptionTask.js +1 -1
  100. package/lib/esm/internal/app-binder/task/ProvideTransactionFieldDescriptionTask.js.map +3 -3
  101. package/lib/esm/internal/app-binder/task/ProvideTransactionGenericContextTask.js +1 -1
  102. package/lib/esm/internal/app-binder/task/ProvideTransactionGenericContextTask.js.map +3 -3
  103. package/lib/esm/internal/app-binder/task/ProvideTransactionGenericContextTask.test.js +1 -1
  104. package/lib/esm/internal/app-binder/task/ProvideTransactionGenericContextTask.test.js.map +2 -2
  105. package/lib/esm/package.json +3 -3
  106. package/lib/types/api/app-binder/GetConfigCommandTypes.d.ts +7 -0
  107. package/lib/types/api/app-binder/GetConfigCommandTypes.d.ts.map +1 -0
  108. package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts +2 -1
  109. package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts.map +1 -1
  110. package/lib/types/internal/app-binder/command/GetAppConfigurationCommand.d.ts +10 -0
  111. package/lib/types/internal/app-binder/command/GetAppConfigurationCommand.d.ts.map +1 -0
  112. package/lib/types/internal/app-binder/command/GetAppConfigurationCommand.test.d.ts +2 -0
  113. package/lib/types/internal/app-binder/command/GetAppConfigurationCommand.test.d.ts.map +1 -0
  114. package/lib/types/internal/app-binder/command/ProvideWeb3CheckCommand.d.ts +17 -0
  115. package/lib/types/internal/app-binder/command/ProvideWeb3CheckCommand.d.ts.map +1 -0
  116. package/lib/types/internal/app-binder/command/ProvideWeb3CheckCommand.test.d.ts +2 -0
  117. package/lib/types/internal/app-binder/command/ProvideWeb3CheckCommand.test.d.ts.map +1 -0
  118. package/lib/types/internal/app-binder/command/Web3CheckOptInCommand.d.ts +15 -0
  119. package/lib/types/internal/app-binder/command/Web3CheckOptInCommand.d.ts.map +1 -0
  120. package/lib/types/internal/app-binder/command/Web3CheckOptInCommand.test.d.ts +2 -0
  121. package/lib/types/internal/app-binder/command/Web3CheckOptInCommand.test.d.ts.map +1 -0
  122. package/lib/types/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.d.ts +13 -1
  123. package/lib/types/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.d.ts.map +1 -1
  124. package/lib/types/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.d.ts +1 -0
  125. package/lib/types/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.d.ts.map +1 -1
  126. package/lib/types/internal/app-binder/device-action/__test-utils__/makeInternalApi.d.ts.map +1 -1
  127. package/lib/types/internal/app-binder/task/BuildEIP712ContextTask.d.ts +4 -1
  128. package/lib/types/internal/app-binder/task/BuildEIP712ContextTask.d.ts.map +1 -1
  129. package/lib/types/internal/app-binder/task/GetWeb3CheckTask.d.ts +31 -0
  130. package/lib/types/internal/app-binder/task/GetWeb3CheckTask.d.ts.map +1 -0
  131. package/lib/types/internal/app-binder/task/GetWeb3CheckTask.test.d.ts +2 -0
  132. package/lib/types/internal/app-binder/task/GetWeb3CheckTask.test.d.ts.map +1 -0
  133. package/lib/types/internal/app-binder/task/ProvideEIP712ContextTask.d.ts +2 -0
  134. package/lib/types/internal/app-binder/task/ProvideEIP712ContextTask.d.ts.map +1 -1
  135. package/lib/types/internal/app-binder/task/ProvideTransactionContextTask.d.ts +3 -2
  136. package/lib/types/internal/app-binder/task/ProvideTransactionContextTask.d.ts.map +1 -1
  137. package/lib/types/internal/app-binder/task/ProvideTransactionFieldDescriptionTask.d.ts.map +1 -1
  138. package/lib/types/internal/app-binder/task/ProvideTransactionGenericContextTask.d.ts +1 -0
  139. package/lib/types/internal/app-binder/task/ProvideTransactionGenericContextTask.d.ts.map +1 -1
  140. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  141. package/package.json +10 -10
@@ -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 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 { 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 messageHash:\n \"0x8887109c22cd7358af93c04b5397e91b1331e0c389951542e11af4b227a4aa1d\",\n domainHash:\n \"0x06c37168a7db5138defc7866392bb87a741f9b3d104deb5094588ce041cae335\",\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 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 getContext: vi.fn(),\n getContexts: vi.fn(),\n getTypedDataFilters: vi.fn(),\n };\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 buildContext: buildContextMock,\n provideContext: provideContextMock,\n signTypedData: signTypedDataMock,\n signTypedDataLegacy: signTypedDataLegacyMock,\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\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 },\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 },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\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(\n deviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\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 },\n }),\n );\n\n expect(provideContextMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\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\n it(\"should fallback to legacy signing if the new one fails\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\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 },\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 },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\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(\n deviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onError: reject,\n onDone: resolve,\n },\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\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 },\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 },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\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(\n deviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onError: reject,\n onDone: 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 },\n },\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\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 },\n });\n\n testDeviceActionStates(\n deviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onError: reject,\n onDone: resolve,\n },\n );\n }));\n\n it(\"Error while building context\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\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 },\n });\n\n // Mock the parsing error\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n buildContextMock.mockRejectedValueOnce(new UnknownDAError(\"Error\"));\n\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: new UnknownDAError(\"Error\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(\n deviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onError: reject,\n onDone: resolve,\n },\n );\n }));\n\n it(\"Error thrown while providing context\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\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 },\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 },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: new UnknownDAError(\"Error\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(\n deviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onError: reject,\n onDone: resolve,\n },\n );\n }));\n\n it(\"Error while signing\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\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 },\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 },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\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(\n deviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onError: reject,\n onDone: resolve,\n },\n );\n }));\n });\n});\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/* eslint @typescript-eslint/consistent-type-imports: 0 */\nimport { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n CommandResultFactory,\n DeviceActionStatus,\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 { 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 messageHash:\n \"0x8887109c22cd7358af93c04b5397e91b1331e0c389951542e11af4b227a4aa1d\",\n domainHash:\n \"0x06c37168a7db5138defc7866392bb87a741f9b3d104deb5094588ce041cae335\",\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 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 getContext: vi.fn(),\n getContexts: vi.fn(),\n getTypedDataFilters: vi.fn(),\n getWeb3Checks: vi.fn(),\n };\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 buildContext: buildContextMock,\n provideContext: provideContextMock,\n signTypedData: signTypedDataMock,\n signTypedDataLegacy: signTypedDataLegacyMock,\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\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 },\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 },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\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(\n deviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\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 derivationPath: \"44'/60'/0'/0/0\",\n },\n }),\n );\n\n expect(provideContextMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\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\n it(\"should fallback to legacy signing if the new one fails\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\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 },\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 },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\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(\n deviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onError: reject,\n onDone: resolve,\n },\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\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 },\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 },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\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(\n deviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onError: reject,\n onDone: 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 },\n },\n {\n status: DeviceActionStatus.Pending,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\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 },\n });\n\n testDeviceActionStates(\n deviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onError: reject,\n onDone: resolve,\n },\n );\n }));\n\n it(\"Error while building context\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\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 },\n });\n\n // Mock the parsing error\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n buildContextMock.mockRejectedValueOnce(new UnknownDAError(\"Error\"));\n\n const expectedStates: Array<SignTypedDataDAState> = [\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: new UnknownDAError(\"Error\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(\n deviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onError: reject,\n onDone: resolve,\n },\n );\n }));\n\n it(\"Error thrown while providing context\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\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 },\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 },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n error: new UnknownDAError(\"Error\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(\n deviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onError: reject,\n onDone: resolve,\n },\n );\n }));\n\n it(\"Error while signing\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\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 },\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 },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\n },\n status: DeviceActionStatus.Pending,\n },\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTypedData,\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(\n deviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onError: reject,\n onDone: resolve,\n },\n );\n }));\n });\n});\n"],
5
+ "mappings": "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",
6
6
  "names": ["CommandResultFactory", "DeviceActionStatus", "UnknownDAError", "UnknownDeviceExchangeError", "UserInteractionRequired", "Just", "Nothing", "EthAppCommandErrorFactory", "makeDeviceActionInternalApiMock", "setupOpenAppDAMock", "testDeviceActionStates", "PrimitiveType", "StructType", "TypedDataValueField", "SignTypedDataDeviceAction", "importOriginal", "TEST_MESSAGE", "TEST_BUILT_CONTEXT", "mockParser", "mockContextModule", "buildContextMock", "provideContextMock", "signTypedDataMock", "signTypedDataLegacyMock", "extractDependenciesMock", "resolve", "reject", "deviceAction", "expectedStates"]
7
7
  }
@@ -1,2 +1,2 @@
1
- const e=vi.fn(),n=vi.fn(),t=vi.fn(),i=vi.fn(),c=vi.fn(),o=vi.fn(),s=vi.fn();function a(){return{sendApdu:e,sendCommand:n,getDeviceSessionState:t,getDeviceSessionStateObservable:i,setDeviceSessionState:c,getManagerApiService:o,getSecureChannelService:s}}export{a as makeDeviceActionInternalApiMock};
1
+ const e=vi.fn(),n=vi.fn(),t=vi.fn(),i=vi.fn(),c=vi.fn(),o=vi.fn(),s=vi.fn(),a=vi.fn();function r(){return{sendApdu:e,sendCommand:n,getDeviceSessionState:t,getDeviceSessionStateObservable:i,setDeviceSessionState:c,getManagerApiService:o,getSecureChannelService:s,disableRefresher:a}}export{r as makeDeviceActionInternalApiMock};
2
2
  //# sourceMappingURL=makeInternalApi.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/internal/app-binder/device-action/__test-utils__/makeInternalApi.ts"],
4
- "sourcesContent": ["import { type InternalApi } from \"@ledgerhq/device-management-kit\";\nimport { type Mocked } from \"vitest\";\n\nconst sendApduMock = vi.fn();\nconst sendCommandMock = vi.fn();\nconst apiGetDeviceSessionStateMock = vi.fn();\nconst apiGetDeviceSessionStateObservableMock = vi.fn();\nconst setDeviceSessionStateMock = vi.fn();\nconst getManagerApiServiceMock = vi.fn();\nconst getSecureChannelServiceMock = vi.fn();\n\nexport function makeDeviceActionInternalApiMock(): Mocked<InternalApi> {\n return {\n sendApdu: sendApduMock,\n sendCommand: sendCommandMock,\n getDeviceSessionState: apiGetDeviceSessionStateMock,\n getDeviceSessionStateObservable: apiGetDeviceSessionStateObservableMock,\n setDeviceSessionState: setDeviceSessionStateMock,\n getManagerApiService: getManagerApiServiceMock,\n getSecureChannelService: getSecureChannelServiceMock,\n };\n}\n"],
5
- "mappings": "AAGA,MAAMA,EAAe,GAAG,GAAG,EACrBC,EAAkB,GAAG,GAAG,EACxBC,EAA+B,GAAG,GAAG,EACrCC,EAAyC,GAAG,GAAG,EAC/CC,EAA4B,GAAG,GAAG,EAClCC,EAA2B,GAAG,GAAG,EACjCC,EAA8B,GAAG,GAAG,EAEnC,SAASC,GAAuD,CACrE,MAAO,CACL,SAAUP,EACV,YAAaC,EACb,sBAAuBC,EACvB,gCAAiCC,EACjC,sBAAuBC,EACvB,qBAAsBC,EACtB,wBAAyBC,CAC3B,CACF",
6
- "names": ["sendApduMock", "sendCommandMock", "apiGetDeviceSessionStateMock", "apiGetDeviceSessionStateObservableMock", "setDeviceSessionStateMock", "getManagerApiServiceMock", "getSecureChannelServiceMock", "makeDeviceActionInternalApiMock"]
4
+ "sourcesContent": ["import { type InternalApi } from \"@ledgerhq/device-management-kit\";\nimport { type Mocked } from \"vitest\";\n\nconst sendApduMock = vi.fn();\nconst sendCommandMock = vi.fn();\nconst apiGetDeviceSessionStateMock = vi.fn();\nconst apiGetDeviceSessionStateObservableMock = vi.fn();\nconst setDeviceSessionStateMock = vi.fn();\nconst getManagerApiServiceMock = vi.fn();\nconst getSecureChannelServiceMock = vi.fn();\nconst disableRefresherMock = vi.fn();\n\nexport function makeDeviceActionInternalApiMock(): Mocked<InternalApi> {\n return {\n sendApdu: sendApduMock,\n sendCommand: sendCommandMock,\n getDeviceSessionState: apiGetDeviceSessionStateMock,\n getDeviceSessionStateObservable: apiGetDeviceSessionStateObservableMock,\n setDeviceSessionState: setDeviceSessionStateMock,\n getManagerApiService: getManagerApiServiceMock,\n getSecureChannelService: getSecureChannelServiceMock,\n disableRefresher: disableRefresherMock,\n };\n}\n"],
5
+ "mappings": "AAGA,MAAMA,EAAe,GAAG,GAAG,EACrBC,EAAkB,GAAG,GAAG,EACxBC,EAA+B,GAAG,GAAG,EACrCC,EAAyC,GAAG,GAAG,EAC/CC,EAA4B,GAAG,GAAG,EAClCC,EAA2B,GAAG,GAAG,EACjCC,EAA8B,GAAG,GAAG,EACpCC,EAAuB,GAAG,GAAG,EAE5B,SAASC,GAAuD,CACrE,MAAO,CACL,SAAUR,EACV,YAAaC,EACb,sBAAuBC,EACvB,gCAAiCC,EACjC,sBAAuBC,EACvB,qBAAsBC,EACtB,wBAAyBC,EACzB,iBAAkBC,CACpB,CACF",
6
+ "names": ["sendApduMock", "sendCommandMock", "apiGetDeviceSessionStateMock", "apiGetDeviceSessionStateObservableMock", "setDeviceSessionStateMock", "getManagerApiServiceMock", "getSecureChannelServiceMock", "disableRefresherMock", "makeDeviceActionInternalApiMock"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{DeviceSessionStateType as g}from"@ledgerhq/device-management-kit";import{TypedDataEncoder as y}from"ethers";import{Just as r,Nothing as i}from"purify-ts";import{gte as C}from"semver";import{TypedDataValueField as D}from"../../typed-data/model/Types";const S="0x0000000000000000000000000000000000000000";class V{constructor(t,a,m,o){this.api=t;this.contextModule=a;this.parser=m;this.data=o}async run(){const t=y.hashDomain(this.data.domain);if(!this.data.types[this.data.primaryType])throw new Error(`Primary type "${this.data.primaryType}" is not defined in the types.`);const a=this.data.types,{EIP712Domain:m,...o}=a,h=y.hashStruct(this.data.primaryType,o,this.data.message),s=this.parser.parse(this.data);if(s.isLeft())throw s.extract();const{types:l,domain:u,message:n}=s.unsafeCoerce();let p=i;const d=this.getClearSignVersion();if(d.isJust()){const v=this.data.domain.verifyingContract?.toLowerCase()||S,f=this.data.domain.chainId||0,T=n.filter(e=>e.value instanceof D).map(e=>({path:e.path,value:e.value.data})),c=await this.contextModule.getTypedDataFilters({verifyingContract:v,chainId:f,version:d.extract(),schema:this.data.types,fieldsValues:T});c.type==="success"&&(p=r(c))}return{types:l,domain:u,message:n,clearSignContext:p,domainHash:t,messageHash:h}}getClearSignVersion(){const t=this.api.getDeviceSessionState();return t.sessionStateType===g.Connected?i:t.currentApp.name!=="Ethereum"?i:C(t.currentApp.version,"1.12.0")?r("v2"):r("v1")}}export{V as BuildEIP712ContextTask,S as ZERO_ADDRESS};
1
+ import{DeviceSessionStateType as f}from"@ledgerhq/device-management-kit";import{TypedDataEncoder as m}from"ethers";import{Just as i,Nothing as o}from"purify-ts";import{gte as S}from"semver";import{GetWeb3CheckTask as x}from"../../app-binder/task/GetWeb3CheckTask";import{TypedDataValueField as D}from"../../typed-data/model/Types";const k="0x0000000000000000000000000000000000000000";class V{constructor(e,s,n,u,p,c=(t,r)=>new x(t,r)){this.api=e;this.contextModule=s;this.parser=n;this.data=u;this.derivationPath=p;this.getWeb3ChecksFactory=c}async run(){const e=(await this.getWeb3ChecksFactory(this.api,{contextModule:this.contextModule,derivationPath:this.derivationPath,data:this.data}).run()).web3Check,s=m.hashDomain(this.data.domain);if(!this.data.types[this.data.primaryType])throw new Error(`Primary type "${this.data.primaryType}" is not defined in the types.`);const n=this.data.types,{EIP712Domain:u,...p}=n,c=m.hashStruct(this.data.primaryType,p,this.data.message),t=this.parser.parse(this.data);if(t.isLeft())throw t.extract();const{types:r,domain:C,message:d}=t.unsafeCoerce();let y=o;const h=this.getClearSignVersion();if(h.isJust()){const g=this.data.domain.verifyingContract?.toLowerCase()||k,v=this.data.domain.chainId||0,T=d.filter(a=>a.value instanceof D).map(a=>({path:a.path,value:a.value.data})),l=await this.contextModule.getTypedDataFilters({verifyingContract:g,chainId:v,version:h.extract(),schema:this.data.types,fieldsValues:T});l.type==="success"&&(y=i(l))}return{web3Check:e,types:r,domain:C,message:d,clearSignContext:y,domainHash:s,messageHash:c}}getClearSignVersion(){const e=this.api.getDeviceSessionState();return e.sessionStateType===f.Connected?o:e.currentApp.name!=="Ethereum"?o:S(e.currentApp.version,"1.12.0")?i("v2"):i("v1")}}export{V as BuildEIP712ContextTask,k as ZERO_ADDRESS};
2
2
  //# sourceMappingURL=BuildEIP712ContextTask.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/task/BuildEIP712ContextTask.ts"],
4
- "sourcesContent": ["import {\n type ContextModule,\n type TypedDataClearSignContextSuccess,\n} from \"@ledgerhq/context-module\";\nimport {\n DeviceSessionStateType,\n type InternalApi,\n} from \"@ledgerhq/device-management-kit\";\nimport { TypedDataEncoder, type TypedDataField } from \"ethers\";\nimport { Just, type Maybe, Nothing } from \"purify-ts\";\nimport { gte } from \"semver\";\n\nimport { type TypedData } from \"@api/model/TypedData\";\nimport { type ProvideEIP712ContextTaskArgs } from \"@internal/app-binder/task/ProvideEIP712ContextTask\";\nimport { TypedDataValueField } from \"@internal/typed-data/model/Types\";\nimport { type TypedDataParserService } from \"@internal/typed-data/service/TypedDataParserService\";\n\nexport const ZERO_ADDRESS = \"0x0000000000000000000000000000000000000000\";\n\nexport class BuildEIP712ContextTask {\n constructor(\n private api: InternalApi,\n private contextModule: ContextModule,\n private parser: TypedDataParserService,\n private data: TypedData,\n ) {}\n\n async run(): Promise<ProvideEIP712ContextTaskArgs> {\n // Legacy blind signing context\n const domainHash = TypedDataEncoder.hashDomain(this.data.domain);\n\n if (!this.data.types[this.data.primaryType]) {\n throw new Error(\n `Primary type \"${this.data.primaryType}\" is not defined in the types.`,\n );\n }\n\n const typesRecord: Record<string, TypedDataField[]> = this.data.types;\n const { EIP712Domain, ...rest } = typesRecord;\n const messageHash = TypedDataEncoder.hashStruct(\n this.data.primaryType,\n rest,\n this.data.message,\n );\n\n // Clear signing context\n // Parse the message types and values\n const parsed = this.parser.parse(this.data);\n if (parsed.isLeft()) {\n throw parsed.extract();\n }\n const { types, domain, message } = parsed.unsafeCoerce();\n\n // Get clear signing context, if any\n let clearSignContext: Maybe<TypedDataClearSignContextSuccess> = Nothing;\n const version = this.getClearSignVersion();\n if (version.isJust()) {\n const verifyingContract =\n this.data.domain.verifyingContract?.toLowerCase() || ZERO_ADDRESS;\n const chainId = this.data.domain.chainId || 0;\n const fieldsValues = message\n .filter((v) => v.value instanceof TypedDataValueField)\n .map((v) => ({\n path: v.path,\n value: (v.value as TypedDataValueField).data,\n }));\n const filters = await this.contextModule.getTypedDataFilters({\n verifyingContract,\n chainId,\n version: version.extract(),\n schema: this.data.types,\n fieldsValues,\n });\n if (filters.type === \"success\") {\n clearSignContext = Just(filters);\n }\n }\n\n // Return the args for provide context task\n const provideTaskArgs: ProvideEIP712ContextTaskArgs = {\n types,\n domain,\n message,\n clearSignContext,\n domainHash,\n messageHash,\n };\n return provideTaskArgs;\n }\n\n private getClearSignVersion(): Maybe<\"v1\" | \"v2\"> {\n const deviceState = this.api.getDeviceSessionState();\n if (deviceState.sessionStateType === DeviceSessionStateType.Connected) {\n return Nothing;\n }\n if (deviceState.currentApp.name !== \"Ethereum\") {\n return Nothing;\n }\n // EIP712 v2 (amount & datetime filters) supported since 1.11.0:\n // https://github.com/LedgerHQ/app-ethereum/blob/develop/doc/ethapp.adoc#1110-1\n // But some issues were still present until 1.12.0 among which:\n // * V2 descriptor with missing token not supported by the app\n // * Empty arrays with filters not correctly handled\n // * Trusted name filters not yet released\n // Therefore it's safer and easier to use V1 filters before 1.12.0:\n // https://github.com/LedgerHQ/app-ethereum/blob/develop/doc/ethapp.adoc#1120\n const shouldUseV2Filters = gte(deviceState.currentApp.version, \"1.12.0\");\n return shouldUseV2Filters ? Just(\"v2\") : Just(\"v1\");\n }\n}\n"],
5
- "mappings": "AAIA,OACE,0BAAAA,MAEK,kCACP,OAAS,oBAAAC,MAA6C,SACtD,OAAS,QAAAC,EAAkB,WAAAC,MAAe,YAC1C,OAAS,OAAAC,MAAW,SAIpB,OAAS,uBAAAC,MAA2B,mCAG7B,MAAMC,EAAe,6CAErB,MAAMC,CAAuB,CAClC,YACUC,EACAC,EACAC,EACAC,EACR,CAJQ,SAAAH,EACA,mBAAAC,EACA,YAAAC,EACA,UAAAC,CACP,CAEH,MAAM,KAA6C,CAEjD,MAAMC,EAAaX,EAAiB,WAAW,KAAK,KAAK,MAAM,EAE/D,GAAI,CAAC,KAAK,KAAK,MAAM,KAAK,KAAK,WAAW,EACxC,MAAM,IAAI,MACR,iBAAiB,KAAK,KAAK,WAAW,gCACxC,EAGF,MAAMY,EAAgD,KAAK,KAAK,MAC1D,CAAE,aAAAC,EAAc,GAAGC,CAAK,EAAIF,EAC5BG,EAAcf,EAAiB,WACnC,KAAK,KAAK,YACVc,EACA,KAAK,KAAK,OACZ,EAIME,EAAS,KAAK,OAAO,MAAM,KAAK,IAAI,EAC1C,GAAIA,EAAO,OAAO,EAChB,MAAMA,EAAO,QAAQ,EAEvB,KAAM,CAAE,MAAAC,EAAO,OAAAC,EAAQ,QAAAC,CAAQ,EAAIH,EAAO,aAAa,EAGvD,IAAII,EAA4DlB,EAChE,MAAMmB,EAAU,KAAK,oBAAoB,EACzC,GAAIA,EAAQ,OAAO,EAAG,CACpB,MAAMC,EACJ,KAAK,KAAK,OAAO,mBAAmB,YAAY,GAAKjB,EACjDkB,EAAU,KAAK,KAAK,OAAO,SAAW,EACtCC,EAAeL,EAClB,OAAQM,GAAMA,EAAE,iBAAiBrB,CAAmB,EACpD,IAAKqB,IAAO,CACX,KAAMA,EAAE,KACR,MAAQA,EAAE,MAA8B,IAC1C,EAAE,EACEC,EAAU,MAAM,KAAK,cAAc,oBAAoB,CAC3D,kBAAAJ,EACA,QAAAC,EACA,QAASF,EAAQ,QAAQ,EACzB,OAAQ,KAAK,KAAK,MAClB,aAAAG,CACF,CAAC,EACGE,EAAQ,OAAS,YACnBN,EAAmBnB,EAAKyB,CAAO,EAEnC,CAWA,MARsD,CACpD,MAAAT,EACA,OAAAC,EACA,QAAAC,EACA,iBAAAC,EACA,WAAAT,EACA,YAAAI,CACF,CAEF,CAEQ,qBAA0C,CAChD,MAAMY,EAAc,KAAK,IAAI,sBAAsB,EACnD,OAAIA,EAAY,mBAAqB5B,EAAuB,UACnDG,EAELyB,EAAY,WAAW,OAAS,WAC3BzB,EAUkBC,EAAIwB,EAAY,WAAW,QAAS,QAAQ,EAC3C1B,EAAK,IAAI,EAAIA,EAAK,IAAI,CACpD,CACF",
6
- "names": ["DeviceSessionStateType", "TypedDataEncoder", "Just", "Nothing", "gte", "TypedDataValueField", "ZERO_ADDRESS", "BuildEIP712ContextTask", "api", "contextModule", "parser", "data", "domainHash", "typesRecord", "EIP712Domain", "rest", "messageHash", "parsed", "types", "domain", "message", "clearSignContext", "version", "verifyingContract", "chainId", "fieldsValues", "v", "filters", "deviceState"]
4
+ "sourcesContent": ["import {\n type ClearSignContextSuccess,\n type ClearSignContextType,\n type ContextModule,\n type TypedDataClearSignContextSuccess,\n} from \"@ledgerhq/context-module\";\nimport {\n DeviceSessionStateType,\n type InternalApi,\n} from \"@ledgerhq/device-management-kit\";\nimport { TypedDataEncoder, type TypedDataField } from \"ethers\";\nimport { Just, type Maybe, Nothing } from \"purify-ts\";\nimport { gte } from \"semver\";\n\nimport { type TypedData } from \"@api/model/TypedData\";\nimport {\n GetWeb3CheckTask,\n type GetWeb3CheckTaskArgs,\n} from \"@internal/app-binder/task/GetWeb3CheckTask\";\nimport { type ProvideEIP712ContextTaskArgs } from \"@internal/app-binder/task/ProvideEIP712ContextTask\";\nimport { TypedDataValueField } from \"@internal/typed-data/model/Types\";\nimport { type TypedDataParserService } from \"@internal/typed-data/service/TypedDataParserService\";\n\nexport const ZERO_ADDRESS = \"0x0000000000000000000000000000000000000000\";\n\nexport class BuildEIP712ContextTask {\n constructor(\n private api: InternalApi,\n private contextModule: ContextModule,\n private parser: TypedDataParserService,\n private data: TypedData,\n private derivationPath: string,\n private getWeb3ChecksFactory = (\n api: InternalApi,\n args: GetWeb3CheckTaskArgs,\n ) => new GetWeb3CheckTask(api, args),\n ) {}\n\n async run(): Promise<ProvideEIP712ContextTaskArgs> {\n // Run the web3checks if needed\n const web3Check: ClearSignContextSuccess<ClearSignContextType.WEB3_CHECK> | null =\n (\n await this.getWeb3ChecksFactory(this.api, {\n contextModule: this.contextModule,\n derivationPath: this.derivationPath,\n data: this.data,\n }).run()\n ).web3Check;\n\n // Legacy blind signing context\n const domainHash = TypedDataEncoder.hashDomain(this.data.domain);\n\n if (!this.data.types[this.data.primaryType]) {\n throw new Error(\n `Primary type \"${this.data.primaryType}\" is not defined in the types.`,\n );\n }\n\n const typesRecord: Record<string, TypedDataField[]> = this.data.types;\n const { EIP712Domain, ...rest } = typesRecord;\n const messageHash = TypedDataEncoder.hashStruct(\n this.data.primaryType,\n rest,\n this.data.message,\n );\n\n // Clear signing context\n // Parse the message types and values\n const parsed = this.parser.parse(this.data);\n if (parsed.isLeft()) {\n throw parsed.extract();\n }\n const { types, domain, message } = parsed.unsafeCoerce();\n\n // Get clear signing context, if any\n let clearSignContext: Maybe<TypedDataClearSignContextSuccess> = Nothing;\n const version = this.getClearSignVersion();\n if (version.isJust()) {\n const verifyingContract =\n this.data.domain.verifyingContract?.toLowerCase() || ZERO_ADDRESS;\n const chainId = this.data.domain.chainId || 0;\n const fieldsValues = message\n .filter((v) => v.value instanceof TypedDataValueField)\n .map((v) => ({\n path: v.path,\n value: (v.value as TypedDataValueField).data,\n }));\n const filters = await this.contextModule.getTypedDataFilters({\n verifyingContract,\n chainId,\n version: version.extract(),\n schema: this.data.types,\n fieldsValues,\n });\n if (filters.type === \"success\") {\n clearSignContext = Just(filters);\n }\n }\n\n // Return the args for provide context task\n const provideTaskArgs: ProvideEIP712ContextTaskArgs = {\n web3Check,\n types,\n domain,\n message,\n clearSignContext,\n domainHash,\n messageHash,\n };\n return provideTaskArgs;\n }\n\n private getClearSignVersion(): Maybe<\"v1\" | \"v2\"> {\n const deviceState = this.api.getDeviceSessionState();\n if (deviceState.sessionStateType === DeviceSessionStateType.Connected) {\n return Nothing;\n }\n if (deviceState.currentApp.name !== \"Ethereum\") {\n return Nothing;\n }\n // EIP712 v2 (amount & datetime filters) supported since 1.11.0:\n // https://github.com/LedgerHQ/app-ethereum/blob/develop/doc/ethapp.adoc#1110-1\n // But some issues were still present until 1.12.0 among which:\n // * V2 descriptor with missing token not supported by the app\n // * Empty arrays with filters not correctly handled\n // * Trusted name filters not yet released\n // Therefore it's safer and easier to use V1 filters before 1.12.0:\n // https://github.com/LedgerHQ/app-ethereum/blob/develop/doc/ethapp.adoc#1120\n const shouldUseV2Filters = gte(deviceState.currentApp.version, \"1.12.0\");\n return shouldUseV2Filters ? Just(\"v2\") : Just(\"v1\");\n }\n}\n"],
5
+ "mappings": "AAMA,OACE,0BAAAA,MAEK,kCACP,OAAS,oBAAAC,MAA6C,SACtD,OAAS,QAAAC,EAAkB,WAAAC,MAAe,YAC1C,OAAS,OAAAC,MAAW,SAGpB,OACE,oBAAAC,MAEK,6CAEP,OAAS,uBAAAC,MAA2B,mCAG7B,MAAMC,EAAe,6CAErB,MAAMC,CAAuB,CAClC,YACUC,EACAC,EACAC,EACAC,EACAC,EACAC,EAAuB,CAC7BL,EACAM,IACG,IAAIV,EAAiBI,EAAKM,CAAI,EACnC,CATQ,SAAAN,EACA,mBAAAC,EACA,YAAAC,EACA,UAAAC,EACA,oBAAAC,EACA,0BAAAC,CAIP,CAEH,MAAM,KAA6C,CAEjD,MAAME,GAEF,MAAM,KAAK,qBAAqB,KAAK,IAAK,CACxC,cAAe,KAAK,cACpB,eAAgB,KAAK,eACrB,KAAM,KAAK,IACb,CAAC,EAAE,IAAI,GACP,UAGEC,EAAahB,EAAiB,WAAW,KAAK,KAAK,MAAM,EAE/D,GAAI,CAAC,KAAK,KAAK,MAAM,KAAK,KAAK,WAAW,EACxC,MAAM,IAAI,MACR,iBAAiB,KAAK,KAAK,WAAW,gCACxC,EAGF,MAAMiB,EAAgD,KAAK,KAAK,MAC1D,CAAE,aAAAC,EAAc,GAAGC,CAAK,EAAIF,EAC5BG,EAAcpB,EAAiB,WACnC,KAAK,KAAK,YACVmB,EACA,KAAK,KAAK,OACZ,EAIME,EAAS,KAAK,OAAO,MAAM,KAAK,IAAI,EAC1C,GAAIA,EAAO,OAAO,EAChB,MAAMA,EAAO,QAAQ,EAEvB,KAAM,CAAE,MAAAC,EAAO,OAAAC,EAAQ,QAAAC,CAAQ,EAAIH,EAAO,aAAa,EAGvD,IAAII,EAA4DvB,EAChE,MAAMwB,EAAU,KAAK,oBAAoB,EACzC,GAAIA,EAAQ,OAAO,EAAG,CACpB,MAAMC,EACJ,KAAK,KAAK,OAAO,mBAAmB,YAAY,GAAKrB,EACjDsB,EAAU,KAAK,KAAK,OAAO,SAAW,EACtCC,EAAeL,EAClB,OAAQM,GAAMA,EAAE,iBAAiBzB,CAAmB,EACpD,IAAKyB,IAAO,CACX,KAAMA,EAAE,KACR,MAAQA,EAAE,MAA8B,IAC1C,EAAE,EACEC,EAAU,MAAM,KAAK,cAAc,oBAAoB,CAC3D,kBAAAJ,EACA,QAAAC,EACA,QAASF,EAAQ,QAAQ,EACzB,OAAQ,KAAK,KAAK,MAClB,aAAAG,CACF,CAAC,EACGE,EAAQ,OAAS,YACnBN,EAAmBxB,EAAK8B,CAAO,EAEnC,CAYA,MATsD,CACpD,UAAAhB,EACA,MAAAO,EACA,OAAAC,EACA,QAAAC,EACA,iBAAAC,EACA,WAAAT,EACA,YAAAI,CACF,CAEF,CAEQ,qBAA0C,CAChD,MAAMY,EAAc,KAAK,IAAI,sBAAsB,EACnD,OAAIA,EAAY,mBAAqBjC,EAAuB,UACnDG,EAEL8B,EAAY,WAAW,OAAS,WAC3B9B,EAUkBC,EAAI6B,EAAY,WAAW,QAAS,QAAQ,EAC3C/B,EAAK,IAAI,EAAIA,EAAK,IAAI,CACpD,CACF",
6
+ "names": ["DeviceSessionStateType", "TypedDataEncoder", "Just", "Nothing", "gte", "GetWeb3CheckTask", "TypedDataValueField", "ZERO_ADDRESS", "BuildEIP712ContextTask", "api", "contextModule", "parser", "data", "derivationPath", "getWeb3ChecksFactory", "args", "web3Check", "domainHash", "typesRecord", "EIP712Domain", "rest", "messageHash", "parsed", "types", "domain", "message", "clearSignContext", "version", "verifyingContract", "chainId", "fieldsValues", "v", "filters", "deviceState"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{DeviceModelId as m,DeviceSessionStateType as f,DeviceStatus as y}from"@ledgerhq/device-management-kit";import{Just as l,Left as S,Nothing as b,Right as u}from"purify-ts";import{makeDeviceActionInternalApiMock as v}from"../../app-binder/device-action/__test-utils__/makeInternalApi";import{PrimitiveType as d,StructType as T,TypedDataValueField as x,TypedDataValueRoot as h}from"../../typed-data/model/Types";import{BuildEIP712ContextTask as p}from"./BuildEIP712ContextTask";describe("BuildEIP712ContextTask",()=>{const i=v(),t={getContext:vi.fn(),getContexts:vi.fn(),getTypedDataFilters:vi.fn()},e={parse:vi.fn()},s={domain:{name:"Permit2",chainId:137,verifyingContract:"0x000000000022d473030f116ddee9f6b43ac78ba3"},primaryType:"PermitSingle",message:{details:{token:"0x7ceb23fd6bc0add59e62ac25578270cff1b9f619",amount:"69420000000000000000",expiration:"1718184249",nonce:"0"},spender:"0xec7be89e9d109e7e3fec59c222cf297125fefda2",sigDeadline:"1715594049"},types:{PermitSingle:[{name:"details",type:"PermitDetails"},{name:"spender",type:"address"},{name:"sigDeadline",type:"uint256"}],PermitDetails:[{name:"token",type:"address"},{name:"amount",type:"uint"},{name:"expiration",type:"uint"},{name:"nonce",type:"uint"}]}},r={PermitSingle:{details:new T("PermitDetails"),spender:new d("address","address",b),sigDeadline:new d("uint256","uint",l(32))},PermitDetails:{token:new d("address","address",b),amount:new d("uint160","uint",l(20)),expiration:new d("uint48","uint",l(6)),nonce:new d("uint48","uint",l(6))}},o=[{path:"",type:"",value:new h("EIP712Domain")},{path:"chainId",type:"uint256",value:new x(Uint8Array.from([137]))}],c=[{path:"",type:"",value:new h("PermitSingle")},{path:"details.amount",type:"uint160",value:new x(Uint8Array.from([18]))},{path:"details.expiration",type:"uint48",value:new x(Uint8Array.from([19]))}],g={type:"success",messageInfo:{displayName:"Permit2",filtersCount:1,signature:"3045022100e3c597d13d28a87a88b0239404c668373cf5063362f2a81d09eed4582941dfe802207669aabb504fd5b95b2734057f6b8bbf51f14a69a5f9bdf658a5952cefbf44d3"},tokens:{},filters:{"details.amount":{displayName:"Amount allowance",path:"details.amount",signature:"304402201a46e6b4ef89eaf9fcf4945d053bfc5616a826400fd758312fbbe976bafc07ec022025a9b408722baf983ee053f90179c75b0c55bb0668f437d55493e36069bbd5a3",tokenIndex:255,type:"amount"}}};beforeEach(()=>{vi.resetAllMocks()}),it("Build context with clear signing context not supported by the device",async()=>{const a=new p(i,t,e,s);e.parse.mockReturnValueOnce(u({types:r,domain:o,message:c})),i.getDeviceSessionState.mockReturnValueOnce({sessionStateType:f.ReadyWithoutSecureChannel,deviceStatus:y.CONNECTED,installedApps:[],currentApp:{name:"Bitcoin",version:"1.0"},deviceModelId:m.FLEX});const n=await a.run();expect(n).toStrictEqual({types:r,domain:o,message:c,clearSignContext:b,domainHash:"0xf033048cb2764f596bc4d98e089fa38bb84b4be3d5da2e77f9bfac0e4d6c68ca",messageHash:"0x1087495b5e10337738059920fe1de8216235299745e8c97e21b409009a4c362a"})}),it("Build context with no clear signing context",async()=>{const a=new p(i,t,e,s);e.parse.mockReturnValueOnce(u({types:r,domain:o,message:c})),i.getDeviceSessionState.mockReturnValueOnce({sessionStateType:f.ReadyWithoutSecureChannel,deviceStatus:y.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:m.FLEX}),t.getTypedDataFilters.mockResolvedValueOnce({type:"error",error:new Error("no filter")});const n=await a.run();expect(n).toStrictEqual({types:r,domain:o,message:c,clearSignContext:b,domainHash:"0xf033048cb2764f596bc4d98e089fa38bb84b4be3d5da2e77f9bfac0e4d6c68ca",messageHash:"0x1087495b5e10337738059920fe1de8216235299745e8c97e21b409009a4c362a"})}),it("Build context with clear signing context",async()=>{const a=new p(i,t,e,s);e.parse.mockReturnValueOnce(u({types:r,domain:o,message:c})),i.getDeviceSessionState.mockReturnValueOnce({sessionStateType:f.ReadyWithoutSecureChannel,deviceStatus:y.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:m.FLEX}),t.getTypedDataFilters.mockResolvedValueOnce(g);const n=await a.run();expect(n).toStrictEqual({types:r,domain:o,message:c,clearSignContext:l(g),domainHash:"0xf033048cb2764f596bc4d98e089fa38bb84b4be3d5da2e77f9bfac0e4d6c68ca",messageHash:"0x1087495b5e10337738059920fe1de8216235299745e8c97e21b409009a4c362a"}),expect(e.parse).toHaveBeenCalledWith(s),expect(t.getTypedDataFilters).toHaveBeenCalledWith({verifyingContract:"0x000000000022d473030f116ddee9f6b43ac78ba3",chainId:137,version:"v2",schema:s.types,fieldsValues:[{path:"details.amount",value:Uint8Array.from([18])},{path:"details.expiration",value:Uint8Array.from([19])}]})}),it("Build context with clear signing context V1",async()=>{const a=new p(i,t,e,s);e.parse.mockReturnValueOnce(u({types:r,domain:o,message:c})),i.getDeviceSessionState.mockReturnValueOnce({sessionStateType:f.ReadyWithoutSecureChannel,deviceStatus:y.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.11.0"},deviceModelId:m.FLEX}),t.getTypedDataFilters.mockResolvedValueOnce(g),await a.run(),expect(t.getTypedDataFilters).toHaveBeenCalledWith({verifyingContract:"0x000000000022d473030f116ddee9f6b43ac78ba3",chainId:137,version:"v1",schema:s.types,fieldsValues:[{path:"details.amount",value:Uint8Array.from([18])},{path:"details.expiration",value:Uint8Array.from([19])}]})}),it("Should throw error if no primary type",async()=>{const a=new p(i,t,e,{...s,primaryType:""});e.parse.mockReturnValueOnce(u({types:r,domain:o,message:c}));try{await a.run()}catch(n){expect(n).toBeInstanceOf(Error),expect(n.message).toBe('Primary type "" is not defined in the types.')}}),it("Should throw an error if parsing fails",async()=>{const a=new p(i,t,e,s);e.parse.mockReturnValueOnce(S(new Error("Parsing error")));try{await a.run()}catch(n){expect(n).toBeInstanceOf(Error),expect(n.message).toBe("Parsing error")}})});
1
+ import{DeviceModelId as y,DeviceSessionStateType as b,DeviceStatus as g}from"@ledgerhq/device-management-kit";import{Just as u,Left as v,Nothing as h,Right as p}from"purify-ts";import{makeDeviceActionInternalApiMock as k}from"../../app-binder/device-action/__test-utils__/makeInternalApi";import{PrimitiveType as m,StructType as w,TypedDataValueField as x,TypedDataValueRoot as S}from"../../typed-data/model/Types";import{BuildEIP712ContextTask as l}from"./BuildEIP712ContextTask";describe("BuildEIP712ContextTask",()=>{const n=k(),t={getContext:vi.fn(),getContexts:vi.fn(),getTypedDataFilters:vi.fn(),getWeb3Checks:vi.fn()},e={parse:vi.fn()},c=vi.fn(),s={domain:{name:"Permit2",chainId:137,verifyingContract:"0x000000000022d473030f116ddee9f6b43ac78ba3"},primaryType:"PermitSingle",message:{details:{token:"0x7ceb23fd6bc0add59e62ac25578270cff1b9f619",amount:"69420000000000000000",expiration:"1718184249",nonce:"0"},spender:"0xec7be89e9d109e7e3fec59c222cf297125fefda2",sigDeadline:"1715594049"},types:{PermitSingle:[{name:"details",type:"PermitDetails"},{name:"spender",type:"address"},{name:"sigDeadline",type:"uint256"}],PermitDetails:[{name:"token",type:"address"},{name:"amount",type:"uint"},{name:"expiration",type:"uint"},{name:"nonce",type:"uint"}]}},o={PermitSingle:{details:new w("PermitDetails"),spender:new m("address","address",h),sigDeadline:new m("uint256","uint",u(32))},PermitDetails:{token:new m("address","address",h),amount:new m("uint160","uint",u(20)),expiration:new m("uint48","uint",u(6)),nonce:new m("uint48","uint",u(6))}},r=[{path:"",type:"",value:new S("EIP712Domain")},{path:"chainId",type:"uint256",value:new x(Uint8Array.from([137]))}],d=[{path:"",type:"",value:new S("PermitSingle")},{path:"details.amount",type:"uint160",value:new x(Uint8Array.from([18]))},{path:"details.expiration",type:"uint48",value:new x(Uint8Array.from([19]))}],f={type:"success",messageInfo:{displayName:"Permit2",filtersCount:1,signature:"3045022100e3c597d13d28a87a88b0239404c668373cf5063362f2a81d09eed4582941dfe802207669aabb504fd5b95b2734057f6b8bbf51f14a69a5f9bdf658a5952cefbf44d3"},tokens:{},filters:{"details.amount":{displayName:"Amount allowance",path:"details.amount",signature:"304402201a46e6b4ef89eaf9fcf4945d053bfc5616a826400fd758312fbbe976bafc07ec022025a9b408722baf983ee053f90179c75b0c55bb0668f437d55493e36069bbd5a3",tokenIndex:255,type:"amount"}}};beforeEach(()=>{vi.resetAllMocks(),c.mockReturnValue({run:async()=>({web3Check:null})})}),it("Build context with clear signing context not supported by the device",async()=>{const a=new l(n,t,e,s,"44'/60'/0'/0/0",c);e.parse.mockReturnValueOnce(p({types:o,domain:r,message:d})),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:b.ReadyWithoutSecureChannel,deviceStatus:g.CONNECTED,installedApps:[],currentApp:{name:"Bitcoin",version:"1.0"},deviceModelId:y.FLEX,isSecureConnectionAllowed:!1});const i=await a.run();expect(i).toStrictEqual({web3Check:null,types:o,domain:r,message:d,clearSignContext:h,domainHash:"0xf033048cb2764f596bc4d98e089fa38bb84b4be3d5da2e77f9bfac0e4d6c68ca",messageHash:"0x1087495b5e10337738059920fe1de8216235299745e8c97e21b409009a4c362a"})}),it("Build context with no clear signing context",async()=>{const a=new l(n,t,e,s,"44'/60'/0'/0/0",c);e.parse.mockReturnValueOnce(p({types:o,domain:r,message:d})),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:b.ReadyWithoutSecureChannel,deviceStatus:g.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:y.FLEX,isSecureConnectionAllowed:!1}),t.getTypedDataFilters.mockResolvedValueOnce({type:"error",error:new Error("no filter")});const i=await a.run();expect(i).toStrictEqual({web3Check:null,types:o,domain:r,message:d,clearSignContext:h,domainHash:"0xf033048cb2764f596bc4d98e089fa38bb84b4be3d5da2e77f9bfac0e4d6c68ca",messageHash:"0x1087495b5e10337738059920fe1de8216235299745e8c97e21b409009a4c362a"})}),it("Build context with clear signing context",async()=>{const a=new l(n,t,e,s,"44'/60'/0'/0/0",c);e.parse.mockReturnValueOnce(p({types:o,domain:r,message:d})),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:b.ReadyWithoutSecureChannel,deviceStatus:g.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:y.FLEX,isSecureConnectionAllowed:!1}),t.getTypedDataFilters.mockResolvedValueOnce(f);const i=await a.run();expect(i).toStrictEqual({web3Check:null,types:o,domain:r,message:d,clearSignContext:u(f),domainHash:"0xf033048cb2764f596bc4d98e089fa38bb84b4be3d5da2e77f9bfac0e4d6c68ca",messageHash:"0x1087495b5e10337738059920fe1de8216235299745e8c97e21b409009a4c362a"}),expect(e.parse).toHaveBeenCalledWith(s),expect(t.getTypedDataFilters).toHaveBeenCalledWith({verifyingContract:"0x000000000022d473030f116ddee9f6b43ac78ba3",chainId:137,version:"v2",schema:s.types,fieldsValues:[{path:"details.amount",value:Uint8Array.from([18])},{path:"details.expiration",value:Uint8Array.from([19])}]})}),it("Build context with clear signing context and web3Check",async()=>{const a="web3Check",i=new l(n,t,e,s,"44'/60'/0'/0/0",c);c.mockReturnValueOnce({run:async()=>({web3Check:a})}),e.parse.mockReturnValueOnce(p({types:o,domain:r,message:d})),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:b.ReadyWithoutSecureChannel,deviceStatus:g.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:y.FLEX,isSecureConnectionAllowed:!1}),t.getTypedDataFilters.mockResolvedValueOnce(f);const C=await i.run();expect(C).toStrictEqual({web3Check:a,types:o,domain:r,message:d,clearSignContext:u(f),domainHash:"0xf033048cb2764f596bc4d98e089fa38bb84b4be3d5da2e77f9bfac0e4d6c68ca",messageHash:"0x1087495b5e10337738059920fe1de8216235299745e8c97e21b409009a4c362a"}),expect(c).toHaveBeenCalledWith(n,{contextModule:t,derivationPath:"44'/60'/0'/0/0",data:s})}),it("Build context with clear signing context V1",async()=>{const a=new l(n,t,e,s,"44'/60'/0'/0/0",c);e.parse.mockReturnValueOnce(p({types:o,domain:r,message:d})),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:b.ReadyWithoutSecureChannel,deviceStatus:g.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.11.0"},deviceModelId:y.FLEX,isSecureConnectionAllowed:!1}),t.getTypedDataFilters.mockResolvedValueOnce(f),await a.run(),expect(t.getTypedDataFilters).toHaveBeenCalledWith({verifyingContract:"0x000000000022d473030f116ddee9f6b43ac78ba3",chainId:137,version:"v1",schema:s.types,fieldsValues:[{path:"details.amount",value:Uint8Array.from([18])},{path:"details.expiration",value:Uint8Array.from([19])}]})}),it("Should throw error if no primary type",async()=>{const a=new l(n,t,e,{...s,primaryType:""},"44'/60'/0'/0/0",c);e.parse.mockReturnValueOnce(p({types:o,domain:r,message:d}));try{await a.run()}catch(i){expect(i).toBeInstanceOf(Error),expect(i.message).toBe('Primary type "" is not defined in the types.')}}),it("Should throw an error if parsing fails",async()=>{const a=new l(n,t,e,s,"44'/60'/0'/0/0",c);e.parse.mockReturnValueOnce(v(new Error("Parsing error")));try{await a.run()}catch(i){expect(i).toBeInstanceOf(Error),expect(i.message).toBe("Parsing error")}})});
2
2
  //# sourceMappingURL=BuildEIP712ContextTask.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/task/BuildEIP712ContextTask.test.ts"],
4
- "sourcesContent": ["import { type TypedDataClearSignContextSuccess } from \"@ledgerhq/context-module\";\nimport {\n DeviceModelId,\n DeviceSessionStateType,\n DeviceStatus,\n} from \"@ledgerhq/device-management-kit\";\nimport { Just, Left, Nothing, Right } from \"purify-ts\";\n\nimport { makeDeviceActionInternalApiMock } from \"@internal/app-binder/device-action/__test-utils__/makeInternalApi\";\nimport {\n PrimitiveType,\n StructType,\n TypedDataValueField,\n TypedDataValueRoot,\n} from \"@internal/typed-data/model/Types\";\n\nimport { BuildEIP712ContextTask } from \"./BuildEIP712ContextTask\";\n\ndescribe(\"BuildEIP712ContextTask\", () => {\n const apiMock = makeDeviceActionInternalApiMock();\n const contextMouleMock = {\n getContext: vi.fn(),\n getContexts: vi.fn(),\n getTypedDataFilters: vi.fn(),\n };\n const parserMock = {\n parse: vi.fn(),\n };\n\n const TEST_DATA = {\n domain: {\n name: \"Permit2\",\n chainId: 137,\n verifyingContract: \"0x000000000022d473030f116ddee9f6b43ac78ba3\",\n },\n primaryType: \"PermitSingle\",\n message: {\n details: {\n token: \"0x7ceb23fd6bc0add59e62ac25578270cff1b9f619\",\n amount: \"69420000000000000000\",\n expiration: \"1718184249\",\n nonce: \"0\",\n },\n spender: \"0xec7be89e9d109e7e3fec59c222cf297125fefda2\",\n sigDeadline: \"1715594049\",\n },\n types: {\n PermitSingle: [\n {\n name: \"details\",\n type: \"PermitDetails\",\n },\n {\n name: \"spender\",\n type: \"address\",\n },\n {\n name: \"sigDeadline\",\n type: \"uint256\",\n },\n ],\n PermitDetails: [\n { name: \"token\", type: \"address\" },\n { name: \"amount\", type: \"uint\" },\n { name: \"expiration\", type: \"uint\" },\n { name: \"nonce\", type: \"uint\" },\n ],\n },\n };\n\n const TEST_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 PermitDetails: {\n token: new PrimitiveType(\"address\", \"address\", Nothing),\n amount: new PrimitiveType(\"uint160\", \"uint\", Just(20)),\n expiration: new PrimitiveType(\"uint48\", \"uint\", Just(6)),\n nonce: new PrimitiveType(\"uint48\", \"uint\", Just(6)),\n },\n };\n const TEST_DOMAIN_VALUES = [\n {\n path: \"\",\n type: \"\",\n value: new TypedDataValueRoot(\"EIP712Domain\"),\n },\n {\n path: \"chainId\",\n type: \"uint256\",\n value: new TypedDataValueField(Uint8Array.from([137])),\n },\n ];\n const TEST_MESSAGE_VALUES = [\n {\n path: \"\",\n type: \"\",\n value: new TypedDataValueRoot(\"PermitSingle\"),\n },\n {\n path: \"details.amount\",\n type: \"uint160\",\n value: new TypedDataValueField(Uint8Array.from([0x12])),\n },\n {\n path: \"details.expiration\",\n type: \"uint48\",\n value: new TypedDataValueField(Uint8Array.from([0x13])),\n },\n ];\n const TEST_CLEAR_SIGN_CONTEXT: TypedDataClearSignContextSuccess = {\n type: \"success\",\n messageInfo: {\n displayName: \"Permit2\",\n filtersCount: 1,\n signature:\n \"3045022100e3c597d13d28a87a88b0239404c668373cf5063362f2a81d09eed4582941dfe802207669aabb504fd5b95b2734057f6b8bbf51f14a69a5f9bdf658a5952cefbf44d3\",\n },\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 beforeEach(() => {\n vi.resetAllMocks();\n });\n\n it(\"Build context with clear signing context not supported by the device\", async () => {\n // GIVEN\n const task = new BuildEIP712ContextTask(\n apiMock,\n contextMouleMock,\n parserMock,\n TEST_DATA,\n );\n parserMock.parse.mockReturnValueOnce(\n Right({\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n }),\n );\n apiMock.getDeviceSessionState.mockReturnValueOnce({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Bitcoin\", version: \"1.0\" },\n deviceModelId: DeviceModelId.FLEX,\n });\n // WHEN\n const builtContext = await task.run();\n // THEN\n expect(builtContext).toStrictEqual({\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n clearSignContext: Nothing,\n domainHash:\n \"0xf033048cb2764f596bc4d98e089fa38bb84b4be3d5da2e77f9bfac0e4d6c68ca\",\n messageHash:\n \"0x1087495b5e10337738059920fe1de8216235299745e8c97e21b409009a4c362a\",\n });\n });\n\n it(\"Build context with no clear signing context\", async () => {\n // GIVEN\n const task = new BuildEIP712ContextTask(\n apiMock,\n contextMouleMock,\n parserMock,\n TEST_DATA,\n );\n parserMock.parse.mockReturnValueOnce(\n Right({\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n }),\n );\n apiMock.getDeviceSessionState.mockReturnValueOnce({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version: \"1.12.0\" },\n deviceModelId: DeviceModelId.FLEX,\n });\n contextMouleMock.getTypedDataFilters.mockResolvedValueOnce({\n type: \"error\",\n error: new Error(\"no filter\"),\n });\n // WHEN\n const builtContext = await task.run();\n // THEN\n expect(builtContext).toStrictEqual({\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n clearSignContext: Nothing,\n domainHash:\n \"0xf033048cb2764f596bc4d98e089fa38bb84b4be3d5da2e77f9bfac0e4d6c68ca\",\n messageHash:\n \"0x1087495b5e10337738059920fe1de8216235299745e8c97e21b409009a4c362a\",\n });\n });\n\n it(\"Build context with clear signing context\", async () => {\n // GIVEN\n const task = new BuildEIP712ContextTask(\n apiMock,\n contextMouleMock,\n parserMock,\n TEST_DATA,\n );\n parserMock.parse.mockReturnValueOnce(\n Right({\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n }),\n );\n apiMock.getDeviceSessionState.mockReturnValueOnce({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version: \"1.12.0\" },\n deviceModelId: DeviceModelId.FLEX,\n });\n contextMouleMock.getTypedDataFilters.mockResolvedValueOnce(\n TEST_CLEAR_SIGN_CONTEXT,\n );\n // WHEN\n const builtContext = await task.run();\n // THEN\n expect(builtContext).toStrictEqual({\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n clearSignContext: Just(TEST_CLEAR_SIGN_CONTEXT),\n domainHash:\n \"0xf033048cb2764f596bc4d98e089fa38bb84b4be3d5da2e77f9bfac0e4d6c68ca\",\n messageHash:\n \"0x1087495b5e10337738059920fe1de8216235299745e8c97e21b409009a4c362a\",\n });\n expect(parserMock.parse).toHaveBeenCalledWith(TEST_DATA);\n expect(contextMouleMock.getTypedDataFilters).toHaveBeenCalledWith({\n verifyingContract: \"0x000000000022d473030f116ddee9f6b43ac78ba3\",\n chainId: 137,\n version: \"v2\",\n schema: TEST_DATA[\"types\"],\n fieldsValues: [\n {\n path: \"details.amount\",\n value: Uint8Array.from([0x12]),\n },\n {\n path: \"details.expiration\",\n value: Uint8Array.from([0x13]),\n },\n ],\n });\n });\n\n it(\"Build context with clear signing context V1\", async () => {\n // GIVEN\n const task = new BuildEIP712ContextTask(\n apiMock,\n contextMouleMock,\n parserMock,\n TEST_DATA,\n );\n parserMock.parse.mockReturnValueOnce(\n Right({\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n }),\n );\n apiMock.getDeviceSessionState.mockReturnValueOnce({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version: \"1.11.0\" },\n deviceModelId: DeviceModelId.FLEX,\n });\n contextMouleMock.getTypedDataFilters.mockResolvedValueOnce(\n TEST_CLEAR_SIGN_CONTEXT,\n );\n // WHEN\n await task.run();\n // THEN\n expect(contextMouleMock.getTypedDataFilters).toHaveBeenCalledWith({\n verifyingContract: \"0x000000000022d473030f116ddee9f6b43ac78ba3\",\n chainId: 137,\n version: \"v1\",\n schema: TEST_DATA[\"types\"],\n fieldsValues: [\n {\n path: \"details.amount\",\n value: Uint8Array.from([0x12]),\n },\n {\n path: \"details.expiration\",\n value: Uint8Array.from([0x13]),\n },\n ],\n });\n });\n\n it(\"Should throw error if no primary type\", async () => {\n // GIVEN\n const task = new BuildEIP712ContextTask(\n apiMock,\n contextMouleMock,\n parserMock,\n {\n ...TEST_DATA,\n primaryType: \"\",\n },\n );\n parserMock.parse.mockReturnValueOnce(\n Right({\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n }),\n );\n // WHEN\n try {\n await task.run();\n } catch (e) {\n // THEN\n expect(e).toBeInstanceOf(Error);\n // @ts-expect-error\n expect(e.message).toBe('Primary type \"\" is not defined in the types.');\n }\n });\n\n it(\"Should throw an error if parsing fails\", async () => {\n // GIVEN\n const task = new BuildEIP712ContextTask(\n apiMock,\n contextMouleMock,\n parserMock,\n TEST_DATA,\n );\n parserMock.parse.mockReturnValueOnce(Left(new Error(\"Parsing error\")));\n // WHEN\n try {\n await task.run();\n } catch (e) {\n // THEN\n expect(e).toBeInstanceOf(Error);\n // @ts-expect-error\n expect(e.message).toBe(\"Parsing error\");\n }\n });\n});\n"],
5
- "mappings": "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",
6
- "names": ["DeviceModelId", "DeviceSessionStateType", "DeviceStatus", "Just", "Left", "Nothing", "Right", "makeDeviceActionInternalApiMock", "PrimitiveType", "StructType", "TypedDataValueField", "TypedDataValueRoot", "BuildEIP712ContextTask", "apiMock", "contextMouleMock", "parserMock", "TEST_DATA", "TEST_TYPES", "TEST_DOMAIN_VALUES", "TEST_MESSAGE_VALUES", "TEST_CLEAR_SIGN_CONTEXT", "task", "builtContext", "e"]
4
+ "sourcesContent": ["import type {\n ClearSignContextSuccess,\n ClearSignContextType,\n TypedDataClearSignContextSuccess,\n} from \"@ledgerhq/context-module\";\nimport {\n DeviceModelId,\n DeviceSessionStateType,\n DeviceStatus,\n} from \"@ledgerhq/device-management-kit\";\nimport { Just, Left, Nothing, Right } from \"purify-ts\";\n\nimport { makeDeviceActionInternalApiMock } from \"@internal/app-binder/device-action/__test-utils__/makeInternalApi\";\nimport {\n PrimitiveType,\n StructType,\n TypedDataValueField,\n TypedDataValueRoot,\n} from \"@internal/typed-data/model/Types\";\n\nimport { BuildEIP712ContextTask } from \"./BuildEIP712ContextTask\";\n\ndescribe(\"BuildEIP712ContextTask\", () => {\n const apiMock = makeDeviceActionInternalApiMock();\n const contextMouleMock = {\n getContext: vi.fn(),\n getContexts: vi.fn(),\n getTypedDataFilters: vi.fn(),\n getWeb3Checks: vi.fn(),\n };\n const parserMock = {\n parse: vi.fn(),\n };\n const getWeb3ChecksFactoryMock = vi.fn();\n\n const TEST_DATA = {\n domain: {\n name: \"Permit2\",\n chainId: 137,\n verifyingContract: \"0x000000000022d473030f116ddee9f6b43ac78ba3\",\n },\n primaryType: \"PermitSingle\",\n message: {\n details: {\n token: \"0x7ceb23fd6bc0add59e62ac25578270cff1b9f619\",\n amount: \"69420000000000000000\",\n expiration: \"1718184249\",\n nonce: \"0\",\n },\n spender: \"0xec7be89e9d109e7e3fec59c222cf297125fefda2\",\n sigDeadline: \"1715594049\",\n },\n types: {\n PermitSingle: [\n {\n name: \"details\",\n type: \"PermitDetails\",\n },\n {\n name: \"spender\",\n type: \"address\",\n },\n {\n name: \"sigDeadline\",\n type: \"uint256\",\n },\n ],\n PermitDetails: [\n { name: \"token\", type: \"address\" },\n { name: \"amount\", type: \"uint\" },\n { name: \"expiration\", type: \"uint\" },\n { name: \"nonce\", type: \"uint\" },\n ],\n },\n };\n\n const TEST_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 PermitDetails: {\n token: new PrimitiveType(\"address\", \"address\", Nothing),\n amount: new PrimitiveType(\"uint160\", \"uint\", Just(20)),\n expiration: new PrimitiveType(\"uint48\", \"uint\", Just(6)),\n nonce: new PrimitiveType(\"uint48\", \"uint\", Just(6)),\n },\n };\n const TEST_DOMAIN_VALUES = [\n {\n path: \"\",\n type: \"\",\n value: new TypedDataValueRoot(\"EIP712Domain\"),\n },\n {\n path: \"chainId\",\n type: \"uint256\",\n value: new TypedDataValueField(Uint8Array.from([137])),\n },\n ];\n const TEST_MESSAGE_VALUES = [\n {\n path: \"\",\n type: \"\",\n value: new TypedDataValueRoot(\"PermitSingle\"),\n },\n {\n path: \"details.amount\",\n type: \"uint160\",\n value: new TypedDataValueField(Uint8Array.from([0x12])),\n },\n {\n path: \"details.expiration\",\n type: \"uint48\",\n value: new TypedDataValueField(Uint8Array.from([0x13])),\n },\n ];\n const TEST_CLEAR_SIGN_CONTEXT: TypedDataClearSignContextSuccess = {\n type: \"success\",\n messageInfo: {\n displayName: \"Permit2\",\n filtersCount: 1,\n signature:\n \"3045022100e3c597d13d28a87a88b0239404c668373cf5063362f2a81d09eed4582941dfe802207669aabb504fd5b95b2734057f6b8bbf51f14a69a5f9bdf658a5952cefbf44d3\",\n },\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 beforeEach(() => {\n vi.resetAllMocks();\n getWeb3ChecksFactoryMock.mockReturnValue({\n run: async () => ({ web3Check: null }),\n });\n });\n\n it(\"Build context with clear signing context not supported by the device\", async () => {\n // GIVEN\n const task = new BuildEIP712ContextTask(\n apiMock,\n contextMouleMock,\n parserMock,\n TEST_DATA,\n \"44'/60'/0'/0/0\",\n getWeb3ChecksFactoryMock,\n );\n parserMock.parse.mockReturnValueOnce(\n Right({\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n }),\n );\n apiMock.getDeviceSessionState.mockReturnValueOnce({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Bitcoin\", version: \"1.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n });\n // WHEN\n const builtContext = await task.run();\n // THEN\n expect(builtContext).toStrictEqual({\n web3Check: null,\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n clearSignContext: Nothing,\n domainHash:\n \"0xf033048cb2764f596bc4d98e089fa38bb84b4be3d5da2e77f9bfac0e4d6c68ca\",\n messageHash:\n \"0x1087495b5e10337738059920fe1de8216235299745e8c97e21b409009a4c362a\",\n });\n });\n\n it(\"Build context with no clear signing context\", async () => {\n // GIVEN\n const task = new BuildEIP712ContextTask(\n apiMock,\n contextMouleMock,\n parserMock,\n TEST_DATA,\n \"44'/60'/0'/0/0\",\n getWeb3ChecksFactoryMock,\n );\n parserMock.parse.mockReturnValueOnce(\n Right({\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n }),\n );\n apiMock.getDeviceSessionState.mockReturnValueOnce({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version: \"1.12.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n });\n contextMouleMock.getTypedDataFilters.mockResolvedValueOnce({\n type: \"error\",\n error: new Error(\"no filter\"),\n });\n // WHEN\n const builtContext = await task.run();\n // THEN\n expect(builtContext).toStrictEqual({\n web3Check: null,\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n clearSignContext: Nothing,\n domainHash:\n \"0xf033048cb2764f596bc4d98e089fa38bb84b4be3d5da2e77f9bfac0e4d6c68ca\",\n messageHash:\n \"0x1087495b5e10337738059920fe1de8216235299745e8c97e21b409009a4c362a\",\n });\n });\n\n it(\"Build context with clear signing context\", async () => {\n // GIVEN\n const task = new BuildEIP712ContextTask(\n apiMock,\n contextMouleMock,\n parserMock,\n TEST_DATA,\n \"44'/60'/0'/0/0\",\n getWeb3ChecksFactoryMock,\n );\n parserMock.parse.mockReturnValueOnce(\n Right({\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n }),\n );\n apiMock.getDeviceSessionState.mockReturnValueOnce({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version: \"1.12.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n });\n contextMouleMock.getTypedDataFilters.mockResolvedValueOnce(\n TEST_CLEAR_SIGN_CONTEXT,\n );\n // WHEN\n const builtContext = await task.run();\n // THEN\n expect(builtContext).toStrictEqual({\n web3Check: null,\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n clearSignContext: Just(TEST_CLEAR_SIGN_CONTEXT),\n domainHash:\n \"0xf033048cb2764f596bc4d98e089fa38bb84b4be3d5da2e77f9bfac0e4d6c68ca\",\n messageHash:\n \"0x1087495b5e10337738059920fe1de8216235299745e8c97e21b409009a4c362a\",\n });\n expect(parserMock.parse).toHaveBeenCalledWith(TEST_DATA);\n expect(contextMouleMock.getTypedDataFilters).toHaveBeenCalledWith({\n verifyingContract: \"0x000000000022d473030f116ddee9f6b43ac78ba3\",\n chainId: 137,\n version: \"v2\",\n schema: TEST_DATA[\"types\"],\n fieldsValues: [\n {\n path: \"details.amount\",\n value: Uint8Array.from([0x12]),\n },\n {\n path: \"details.expiration\",\n value: Uint8Array.from([0x13]),\n },\n ],\n });\n });\n\n it(\"Build context with clear signing context and web3Check\", async () => {\n // GIVEN\n const expectedWeb3Check =\n \"web3Check\" as unknown as ClearSignContextSuccess<ClearSignContextType.WEB3_CHECK>;\n const task = new BuildEIP712ContextTask(\n apiMock,\n contextMouleMock,\n parserMock,\n TEST_DATA,\n \"44'/60'/0'/0/0\",\n getWeb3ChecksFactoryMock,\n );\n getWeb3ChecksFactoryMock.mockReturnValueOnce({\n run: async () => ({ web3Check: expectedWeb3Check }),\n });\n parserMock.parse.mockReturnValueOnce(\n Right({\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n }),\n );\n apiMock.getDeviceSessionState.mockReturnValueOnce({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version: \"1.12.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n });\n contextMouleMock.getTypedDataFilters.mockResolvedValueOnce(\n TEST_CLEAR_SIGN_CONTEXT,\n );\n // WHEN\n const builtContext = await task.run();\n // THEN\n expect(builtContext).toStrictEqual({\n web3Check: expectedWeb3Check,\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n clearSignContext: Just(TEST_CLEAR_SIGN_CONTEXT),\n domainHash:\n \"0xf033048cb2764f596bc4d98e089fa38bb84b4be3d5da2e77f9bfac0e4d6c68ca\",\n messageHash:\n \"0x1087495b5e10337738059920fe1de8216235299745e8c97e21b409009a4c362a\",\n });\n expect(getWeb3ChecksFactoryMock).toHaveBeenCalledWith(apiMock, {\n contextModule: contextMouleMock,\n derivationPath: \"44'/60'/0'/0/0\",\n data: TEST_DATA,\n });\n });\n\n it(\"Build context with clear signing context V1\", async () => {\n // GIVEN\n const task = new BuildEIP712ContextTask(\n apiMock,\n contextMouleMock,\n parserMock,\n TEST_DATA,\n \"44'/60'/0'/0/0\",\n getWeb3ChecksFactoryMock,\n );\n parserMock.parse.mockReturnValueOnce(\n Right({\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n }),\n );\n apiMock.getDeviceSessionState.mockReturnValueOnce({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version: \"1.11.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n });\n contextMouleMock.getTypedDataFilters.mockResolvedValueOnce(\n TEST_CLEAR_SIGN_CONTEXT,\n );\n // WHEN\n await task.run();\n // THEN\n expect(contextMouleMock.getTypedDataFilters).toHaveBeenCalledWith({\n verifyingContract: \"0x000000000022d473030f116ddee9f6b43ac78ba3\",\n chainId: 137,\n version: \"v1\",\n schema: TEST_DATA[\"types\"],\n fieldsValues: [\n {\n path: \"details.amount\",\n value: Uint8Array.from([0x12]),\n },\n {\n path: \"details.expiration\",\n value: Uint8Array.from([0x13]),\n },\n ],\n });\n });\n\n it(\"Should throw error if no primary type\", async () => {\n // GIVEN\n const task = new BuildEIP712ContextTask(\n apiMock,\n contextMouleMock,\n parserMock,\n {\n ...TEST_DATA,\n primaryType: \"\",\n },\n \"44'/60'/0'/0/0\",\n getWeb3ChecksFactoryMock,\n );\n parserMock.parse.mockReturnValueOnce(\n Right({\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n }),\n );\n // WHEN\n try {\n await task.run();\n } catch (e) {\n // THEN\n expect(e).toBeInstanceOf(Error);\n // @ts-expect-error\n expect(e.message).toBe('Primary type \"\" is not defined in the types.');\n }\n });\n\n it(\"Should throw an error if parsing fails\", async () => {\n // GIVEN\n const task = new BuildEIP712ContextTask(\n apiMock,\n contextMouleMock,\n parserMock,\n TEST_DATA,\n \"44'/60'/0'/0/0\",\n getWeb3ChecksFactoryMock,\n );\n parserMock.parse.mockReturnValueOnce(Left(new Error(\"Parsing error\")));\n // WHEN\n try {\n await task.run();\n } catch (e) {\n // THEN\n expect(e).toBeInstanceOf(Error);\n // @ts-expect-error\n expect(e.message).toBe(\"Parsing error\");\n }\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["DeviceModelId", "DeviceSessionStateType", "DeviceStatus", "Just", "Left", "Nothing", "Right", "makeDeviceActionInternalApiMock", "PrimitiveType", "StructType", "TypedDataValueField", "TypedDataValueRoot", "BuildEIP712ContextTask", "apiMock", "contextMouleMock", "parserMock", "getWeb3ChecksFactoryMock", "TEST_DATA", "TEST_TYPES", "TEST_DOMAIN_VALUES", "TEST_MESSAGE_VALUES", "TEST_CLEAR_SIGN_CONTEXT", "task", "builtContext", "expectedWeb3Check", "e"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{ClearSignContextType as t}from"@ledgerhq/context-module";import{DeviceModelId as p,DeviceSessionStateType as d,DeviceStatus as u,hexaStringToBuffer as x}from"@ledgerhq/device-management-kit";import{Transaction as m}from"ethers";import{Left as R,Right as T}from"purify-ts";import{ETHEREUM_PLUGINS as h}from"../../app-binder/constant/plugins";import{makeDeviceActionInternalApiMock as E}from"../../app-binder/device-action/__test-utils__/makeInternalApi";import{BuildTransactionContextTask as y}from"./BuildTransactionContextTask";describe("BuildTransactionContextTask",()=>{const r={getContext:vi.fn(),getContexts:vi.fn(),getTypedDataFilters:vi.fn()},c={mapTransactionToSubset:vi.fn()},C={domain:"domain-name.eth"},S=x(m.from({chainId:1n,nonce:0,data:"0x"}).unsignedSerialized),i={keyUsageNumber:1,payload:new Uint8Array([1,2,3])};let l;const n=E();beforeEach(()=>{vi.resetAllMocks(),l={contextModule:r,mapper:c,transaction:S,options:C,challenge:"challenge"}}),it("should build the transaction context without clear sign contexts",async()=>{const a=new Uint8Array([1,2,3]),e=[],o={subset:{chainId:1,to:void 0,data:"0x"},serializedTransaction:a,type:0};c.mapTransactionToSubset.mockReturnValueOnce(T(o)),r.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:d.ReadyWithoutSecureChannel,deviceStatus:u.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:p.FLEX});const s=await new y(n,l).run();expect(s).toEqual({clearSignContexts:e,serializedTransaction:a,chainId:1,transactionType:0})}),it("should build the transaction context with clear sign contexts",async()=>{const a=new Uint8Array([1,2,3]),e=[{type:t.TOKEN,payload:"payload-1"},{type:t.NFT,payload:"payload-2"}],o={subset:{chainId:1,to:void 0,data:"0x"},serializedTransaction:a,type:2};c.mapTransactionToSubset.mockReturnValueOnce(T(o)),r.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:d.ReadyWithoutSecureChannel,deviceStatus:u.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:p.FLEX});const s=await new y(n,l).run();expect(s).toEqual({clearSignContexts:e,serializedTransaction:a,chainId:1,transactionType:2})}),it("should build the transaction context with generic-parser context",async()=>{const a=new Uint8Array([1,2,3]),e=[{type:t.TRANSACTION_INFO,payload:"payload-1",certificate:i},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-2"},{type:t.ENUM,payload:"payload-3",id:1,value:2,certificate:i},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-4"}],o={subset:{chainId:1,to:void 0,data:"0x"},serializedTransaction:a,type:2};c.mapTransactionToSubset.mockReturnValueOnce(T(o)),r.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:d.ReadyWithoutSecureChannel,deviceStatus:u.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.15.0"},deviceModelId:p.FLEX});const s=await new y(n,l).run();expect(s).toEqual({clearSignContexts:{transactionInfo:"payload-1",transactionInfoCertificate:i,transactionFields:[e[1],e[3]],transactionEnums:[e[2]]},serializedTransaction:a,chainId:1,transactionType:2})}),it("should build the transaction context with generic-parser context and a plugin instead of Ethereum app",async()=>{const a=new Uint8Array([1,2,3]),e=[{type:t.TRANSACTION_INFO,payload:"payload-1",certificate:i},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-2"},{type:t.ENUM,payload:"payload-3",id:1,value:2,certificate:i},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-4"}],o={subset:{chainId:1,to:void 0,data:"0x"},serializedTransaction:a,type:2};c.mapTransactionToSubset.mockReturnValueOnce(T(o)),r.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:d.ReadyWithoutSecureChannel,deviceStatus:u.CONNECTED,installedApps:[],currentApp:{name:h[0],version:"1.15.0"},deviceModelId:p.FLEX});const s=await new y(n,l).run();expect(s).toEqual({clearSignContexts:{transactionInfo:"payload-1",transactionInfoCertificate:i,transactionFields:[e[1],e[3]],transactionEnums:[e[2]]},serializedTransaction:a,chainId:1,transactionType:2})}),it("should call the mapper with the transaction",async()=>{const a=new Uint8Array([1,2,3]),e=[],o={subset:{chainId:1,to:void 0,data:"0x"},serializedTransaction:a,type:0};c.mapTransactionToSubset.mockReturnValueOnce(T(o)),r.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:d.ReadyWithoutSecureChannel,deviceStatus:u.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:p.FLEX}),await new y(n,l).run(),expect(c.mapTransactionToSubset).toHaveBeenCalledWith(S)}),it("should call the context module with the correct parameters",async()=>{const a=new Uint8Array([1,2,3]),e=[],o={subset:{chainId:1,to:void 0,data:"0x"},serializedTransaction:a,type:0};c.mapTransactionToSubset.mockReturnValueOnce(T(o)),r.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:d.ReadyWithoutSecureChannel,deviceStatus:u.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:p.FLEX}),await new y(n,l).run(),expect(r.getContexts).toHaveBeenCalledWith({deviceModelId:p.FLEX,challenge:"challenge",domain:"domain-name.eth",...o.subset})}),it("should throw an error if the mapper returns an error",async()=>{const a=new Error("error");c.mapTransactionToSubset.mockReturnValueOnce(R(a)),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:d.ReadyWithoutSecureChannel,deviceStatus:u.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:p.FLEX});const e=new y(n,l);await expect(e.run()).rejects.toThrow(a)}),it("should exclude error contexts from the result",async()=>{const a=new Uint8Array([1,2,3]),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"}],o={subset:{chainId:1,to:void 0,data:"0x"},serializedTransaction:a,type:0};c.mapTransactionToSubset.mockReturnValueOnce(T(o)),r.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:d.ReadyWithoutSecureChannel,deviceStatus:u.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:p.FLEX});const s=await new y(n,l).run();expect(s).toEqual({clearSignContexts:[e[1],e[3]],serializedTransaction:a,chainId:1,transactionType:0})}),it("should exclude generic-parser contexts from the result on old apps",async()=>{const a=new Uint8Array([1,2,3]),e=[{type:t.TRANSACTION_INFO,payload:"transaction_info",certificate:i},{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:i}],o={subset:{chainId:1,to:void 0,data:"0x"},serializedTransaction:a,type:0};c.mapTransactionToSubset.mockReturnValueOnce(T(o)),r.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:d.ReadyWithoutSecureChannel,deviceStatus:u.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:p.FLEX});const s=await new y(n,l).run();expect(s).toEqual({clearSignContexts:[e[1],e[3]],serializedTransaction:a,chainId:1,transactionType:0})}),it("should exclude generic-parser contexts from the result if no transaction_info was found",async()=>{const a=new Uint8Array([1,2,3]),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"}],o={subset:{chainId:1,to:void 0,data:"0x"},serializedTransaction:a,type:0};c.mapTransactionToSubset.mockReturnValueOnce(T(o)),r.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:d.ReadyWithoutSecureChannel,deviceStatus:u.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.14.0"},deviceModelId:p.FLEX});const s=await new y(n,l).run();expect(s).toEqual({clearSignContexts:[e[1],e[3]],serializedTransaction:a,chainId:1,transactionType:0})}),it("should exclude legacy contexts from the result for generic-parser transactions",async()=>{const a=new Uint8Array([1,2,3]),e=[{type:t.TOKEN,payload:"payload-1"},{type:t.TRANSACTION_INFO,payload:"payload-2",certificate:i},{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:i}],o={subset:{chainId:1,to:void 0,data:"0x"},serializedTransaction:a,type:2};c.mapTransactionToSubset.mockReturnValueOnce(T(o)),r.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:d.ReadyWithoutSecureChannel,deviceStatus:u.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.15.0"},deviceModelId:p.FLEX});const s=await new y(n,l).run();expect(s).toEqual({clearSignContexts:{transactionInfo:"payload-2",transactionInfoCertificate:i,transactionFields:[e[3]],transactionEnums:[e[4]]},serializedTransaction:a,chainId:1,transactionType:2})}),it("should exclude generic-parser contexts with a nano s device",async()=>{const a=new Uint8Array([1,2,3]),e=[{type:t.TOKEN,payload:"payload-1"},{type:t.TRANSACTION_INFO,payload:"payload-2",certificate:i},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-3"},{type:t.ENUM,payload:"payload-4",id:1,value:2,certificate:i}],o={subset:{chainId:1,to:void 0,data:"0x"},serializedTransaction:a,type:2};c.mapTransactionToSubset.mockReturnValueOnce(T(o)),r.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:d.ReadyWithoutSecureChannel,deviceStatus:u.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.14.0"},deviceModelId:p.NANO_S});const s=await new y(n,{...l,challenge:null}).run();expect(s).toEqual({clearSignContexts:[e[0]],serializedTransaction:a,chainId:1,transactionType:2})}),it("should exclude generic-parser contexts with an old app version",async()=>{const a=new Uint8Array([1,2,3]),e=[{type:t.TOKEN,payload:"payload-1"},{type:t.TRANSACTION_INFO,payload:"payload-2",certificate:i},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-3"},{type:t.ENUM,payload:"payload-4",id:1,value:2,certificate:i}],o={subset:{chainId:1,to:void 0,data:"0x"},serializedTransaction:a,type:2};c.mapTransactionToSubset.mockReturnValueOnce(T(o)),r.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:d.ReadyWithoutSecureChannel,deviceStatus:u.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:p.FLEX});const s=await new y(n,{...l,challenge:null}).run();expect(s).toEqual({clearSignContexts:[e[0]],serializedTransaction:a,chainId:1,transactionType:2})}),it("should exclude generic-parser contexts with a non ready device",async()=>{const a=new Uint8Array([1,2,3]),e=[{type:t.TOKEN,payload:"payload-1"},{type:t.TRANSACTION_INFO,payload:"payload-2",certificate:i},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-3"},{type:t.ENUM,payload:"payload-4",id:1,value:2,certificate:i}],o={subset:{chainId:1,to:void 0,data:"0x"},serializedTransaction:a,type:2};c.mapTransactionToSubset.mockReturnValueOnce(T(o)),r.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:d.Connected,deviceStatus:u.NOT_CONNECTED,deviceModelId:p.FLEX});const s=await new y(n,{...l,challenge:null}).run();expect(s).toEqual({clearSignContexts:[e[0]],serializedTransaction:a,chainId:1,transactionType:2})}),it("should throw an error if the app is not ethereum compatible",async()=>{const a=new Uint8Array([1,2,3]),e=[{type:t.TRANSACTION_INFO,payload:"payload-1",certificate:i},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-2"},{type:t.ENUM,payload:"payload-3",id:1,value:2,certificate:i}],o={subset:{chainId:1,to:void 0,data:"0x"},serializedTransaction:a,type:2};c.mapTransactionToSubset.mockReturnValueOnce(T(o)),r.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:d.ReadyWithoutSecureChannel,deviceStatus:u.CONNECTED,installedApps:[],currentApp:{name:"Not Ethereum Compatible",version:"1.14.0"},deviceModelId:p.FLEX});const s=new y(n,l);await expect(s.run()).rejects.toThrow("Unsupported app")}),it("should return an error if the transaction info certificate is missing",async()=>{const a=new Uint8Array([1,2,3]),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}],o={subset:{chainId:1,to:void 0,data:"0x"},serializedTransaction:a,type:2};c.mapTransactionToSubset.mockReturnValueOnce(T(o)),r.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:d.ReadyWithoutSecureChannel,deviceStatus:u.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.14.0"},deviceModelId:p.FLEX});const s=new y(n,l);await expect(s.run()).rejects.toThrow("Transaction info certificate is missing")})});
1
+ import{ClearSignContextType as t}from"@ledgerhq/context-module";import{DeviceModelId as p,DeviceSessionStateType as d,DeviceStatus as u,hexaStringToBuffer as x}from"@ledgerhq/device-management-kit";import{Transaction as m}from"ethers";import{Left as R,Right as T}from"purify-ts";import{ETHEREUM_PLUGINS as h}from"../../app-binder/constant/plugins";import{makeDeviceActionInternalApiMock as E}from"../../app-binder/device-action/__test-utils__/makeInternalApi";import{BuildTransactionContextTask as y}from"./BuildTransactionContextTask";describe("BuildTransactionContextTask",()=>{const r={getContext:vi.fn(),getContexts:vi.fn(),getTypedDataFilters:vi.fn(),getWeb3Checks:vi.fn()},c={mapTransactionToSubset:vi.fn()},C={domain:"domain-name.eth"},S=x(m.from({chainId:1n,nonce:0,data:"0x"}).unsignedSerialized),i={keyUsageNumber:1,payload:new Uint8Array([1,2,3])};let l;const n=E();beforeEach(()=>{vi.resetAllMocks(),l={contextModule:r,mapper:c,transaction:S,options:C,challenge:"challenge"}}),it("should build the transaction context without clear sign contexts",async()=>{const a=new Uint8Array([1,2,3]),e=[],o={subset:{chainId:1,to:void 0,data:"0x"},serializedTransaction:a,type:0};c.mapTransactionToSubset.mockReturnValueOnce(T(o)),r.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:d.ReadyWithoutSecureChannel,deviceStatus:u.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:p.FLEX,isSecureConnectionAllowed:!1});const s=await new y(n,l).run();expect(s).toEqual({clearSignContexts:e,serializedTransaction:a,chainId:1,transactionType:0})}),it("should build the transaction context with clear sign contexts",async()=>{const a=new Uint8Array([1,2,3]),e=[{type:t.TOKEN,payload:"payload-1"},{type:t.NFT,payload:"payload-2"}],o={subset:{chainId:1,to:void 0,data:"0x"},serializedTransaction:a,type:2};c.mapTransactionToSubset.mockReturnValueOnce(T(o)),r.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:d.ReadyWithoutSecureChannel,deviceStatus:u.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:p.FLEX,isSecureConnectionAllowed:!1});const s=await new y(n,l).run();expect(s).toEqual({clearSignContexts:e,serializedTransaction:a,chainId:1,transactionType:2})}),it("should build the transaction context with generic-parser context",async()=>{const a=new Uint8Array([1,2,3]),e=[{type:t.TRANSACTION_INFO,payload:"payload-1",certificate:i},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-2"},{type:t.ENUM,payload:"payload-3",id:1,value:2,certificate:i},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-4"}],o={subset:{chainId:1,to:void 0,data:"0x"},serializedTransaction:a,type:2};c.mapTransactionToSubset.mockReturnValueOnce(T(o)),r.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:d.ReadyWithoutSecureChannel,deviceStatus:u.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.15.0"},deviceModelId:p.FLEX,isSecureConnectionAllowed:!1});const s=await new y(n,l).run();expect(s).toEqual({clearSignContexts:{transactionInfo:"payload-1",transactionInfoCertificate:i,transactionFields:[e[1],e[3]],transactionEnums:[e[2]]},serializedTransaction:a,chainId:1,transactionType:2})}),it("should build the transaction context with generic-parser context and a plugin instead of Ethereum app",async()=>{const a=new Uint8Array([1,2,3]),e=[{type:t.TRANSACTION_INFO,payload:"payload-1",certificate:i},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-2"},{type:t.ENUM,payload:"payload-3",id:1,value:2,certificate:i},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-4"}],o={subset:{chainId:1,to:void 0,data:"0x"},serializedTransaction:a,type:2};c.mapTransactionToSubset.mockReturnValueOnce(T(o)),r.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:d.ReadyWithoutSecureChannel,deviceStatus:u.CONNECTED,installedApps:[],currentApp:{name:h[0],version:"1.15.0"},deviceModelId:p.FLEX,isSecureConnectionAllowed:!1});const s=await new y(n,l).run();expect(s).toEqual({clearSignContexts:{transactionInfo:"payload-1",transactionInfoCertificate:i,transactionFields:[e[1],e[3]],transactionEnums:[e[2]]},serializedTransaction:a,chainId:1,transactionType:2})}),it("should call the mapper with the transaction",async()=>{const a=new Uint8Array([1,2,3]),e=[],o={subset:{chainId:1,to:void 0,data:"0x"},serializedTransaction:a,type:0};c.mapTransactionToSubset.mockReturnValueOnce(T(o)),r.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:d.ReadyWithoutSecureChannel,deviceStatus:u.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:p.FLEX,isSecureConnectionAllowed:!1}),await new y(n,l).run(),expect(c.mapTransactionToSubset).toHaveBeenCalledWith(S)}),it("should call the context module with the correct parameters",async()=>{const a=new Uint8Array([1,2,3]),e=[],o={subset:{chainId:1,to:void 0,data:"0x"},serializedTransaction:a,type:0};c.mapTransactionToSubset.mockReturnValueOnce(T(o)),r.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:d.ReadyWithoutSecureChannel,deviceStatus:u.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:p.FLEX,isSecureConnectionAllowed:!1}),await new y(n,l).run(),expect(r.getContexts).toHaveBeenCalledWith({deviceModelId:p.FLEX,challenge:"challenge",domain:"domain-name.eth",...o.subset})}),it("should throw an error if the mapper returns an error",async()=>{const a=new Error("error");c.mapTransactionToSubset.mockReturnValueOnce(R(a)),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:d.ReadyWithoutSecureChannel,deviceStatus:u.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:p.FLEX,isSecureConnectionAllowed:!1});const e=new y(n,l);await expect(e.run()).rejects.toThrow(a)}),it("should exclude error contexts from the result",async()=>{const a=new Uint8Array([1,2,3]),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"}],o={subset:{chainId:1,to:void 0,data:"0x"},serializedTransaction:a,type:0};c.mapTransactionToSubset.mockReturnValueOnce(T(o)),r.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:d.ReadyWithoutSecureChannel,deviceStatus:u.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:p.FLEX,isSecureConnectionAllowed:!1});const s=await new y(n,l).run();expect(s).toEqual({clearSignContexts:[e[1],e[3]],serializedTransaction:a,chainId:1,transactionType:0})}),it("should exclude generic-parser contexts from the result on old apps",async()=>{const a=new Uint8Array([1,2,3]),e=[{type:t.TRANSACTION_INFO,payload:"transaction_info",certificate:i},{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:i}],o={subset:{chainId:1,to:void 0,data:"0x"},serializedTransaction:a,type:0};c.mapTransactionToSubset.mockReturnValueOnce(T(o)),r.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:d.ReadyWithoutSecureChannel,deviceStatus:u.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:p.FLEX,isSecureConnectionAllowed:!1});const s=await new y(n,l).run();expect(s).toEqual({clearSignContexts:[e[1],e[3]],serializedTransaction:a,chainId:1,transactionType:0})}),it("should exclude generic-parser contexts from the result if no transaction_info was found",async()=>{const a=new Uint8Array([1,2,3]),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"}],o={subset:{chainId:1,to:void 0,data:"0x"},serializedTransaction:a,type:0};c.mapTransactionToSubset.mockReturnValueOnce(T(o)),r.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:d.ReadyWithoutSecureChannel,deviceStatus:u.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.14.0"},deviceModelId:p.FLEX,isSecureConnectionAllowed:!1});const s=await new y(n,l).run();expect(s).toEqual({clearSignContexts:[e[1],e[3]],serializedTransaction:a,chainId:1,transactionType:0})}),it("should exclude legacy contexts from the result for generic-parser transactions",async()=>{const a=new Uint8Array([1,2,3]),e=[{type:t.TOKEN,payload:"payload-1"},{type:t.TRANSACTION_INFO,payload:"payload-2",certificate:i},{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:i}],o={subset:{chainId:1,to:void 0,data:"0x"},serializedTransaction:a,type:2};c.mapTransactionToSubset.mockReturnValueOnce(T(o)),r.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:d.ReadyWithoutSecureChannel,deviceStatus:u.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.15.0"},deviceModelId:p.FLEX,isSecureConnectionAllowed:!1});const s=await new y(n,l).run();expect(s).toEqual({clearSignContexts:{transactionInfo:"payload-2",transactionInfoCertificate:i,transactionFields:[e[3]],transactionEnums:[e[4]]},serializedTransaction:a,chainId:1,transactionType:2})}),it("should exclude generic-parser contexts with a nano s device",async()=>{const a=new Uint8Array([1,2,3]),e=[{type:t.TOKEN,payload:"payload-1"},{type:t.TRANSACTION_INFO,payload:"payload-2",certificate:i},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-3"},{type:t.ENUM,payload:"payload-4",id:1,value:2,certificate:i}],o={subset:{chainId:1,to:void 0,data:"0x"},serializedTransaction:a,type:2};c.mapTransactionToSubset.mockReturnValueOnce(T(o)),r.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:d.ReadyWithoutSecureChannel,deviceStatus:u.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.14.0"},deviceModelId:p.NANO_S,isSecureConnectionAllowed:!1});const s=await new y(n,{...l,challenge:null}).run();expect(s).toEqual({clearSignContexts:[e[0]],serializedTransaction:a,chainId:1,transactionType:2})}),it("should exclude generic-parser contexts with an old app version",async()=>{const a=new Uint8Array([1,2,3]),e=[{type:t.TOKEN,payload:"payload-1"},{type:t.TRANSACTION_INFO,payload:"payload-2",certificate:i},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-3"},{type:t.ENUM,payload:"payload-4",id:1,value:2,certificate:i}],o={subset:{chainId:1,to:void 0,data:"0x"},serializedTransaction:a,type:2};c.mapTransactionToSubset.mockReturnValueOnce(T(o)),r.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:d.ReadyWithoutSecureChannel,deviceStatus:u.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.12.0"},deviceModelId:p.FLEX,isSecureConnectionAllowed:!1});const s=await new y(n,{...l,challenge:null}).run();expect(s).toEqual({clearSignContexts:[e[0]],serializedTransaction:a,chainId:1,transactionType:2})}),it("should exclude generic-parser contexts with a non ready device",async()=>{const a=new Uint8Array([1,2,3]),e=[{type:t.TOKEN,payload:"payload-1"},{type:t.TRANSACTION_INFO,payload:"payload-2",certificate:i},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-3"},{type:t.ENUM,payload:"payload-4",id:1,value:2,certificate:i}],o={subset:{chainId:1,to:void 0,data:"0x"},serializedTransaction:a,type:2};c.mapTransactionToSubset.mockReturnValueOnce(T(o)),r.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:d.Connected,deviceStatus:u.NOT_CONNECTED,deviceModelId:p.FLEX});const s=await new y(n,{...l,challenge:null}).run();expect(s).toEqual({clearSignContexts:[e[0]],serializedTransaction:a,chainId:1,transactionType:2})}),it("should throw an error if the app is not ethereum compatible",async()=>{const a=new Uint8Array([1,2,3]),e=[{type:t.TRANSACTION_INFO,payload:"payload-1",certificate:i},{type:t.TRANSACTION_FIELD_DESCRIPTION,payload:"payload-2"},{type:t.ENUM,payload:"payload-3",id:1,value:2,certificate:i}],o={subset:{chainId:1,to:void 0,data:"0x"},serializedTransaction:a,type:2};c.mapTransactionToSubset.mockReturnValueOnce(T(o)),r.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:d.ReadyWithoutSecureChannel,deviceStatus:u.CONNECTED,installedApps:[],currentApp:{name:"Not Ethereum Compatible",version:"1.14.0"},deviceModelId:p.FLEX,isSecureConnectionAllowed:!1});const s=new y(n,l);await expect(s.run()).rejects.toThrow("Unsupported app")}),it("should return an error if the transaction info certificate is missing",async()=>{const a=new Uint8Array([1,2,3]),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}],o={subset:{chainId:1,to:void 0,data:"0x"},serializedTransaction:a,type:2};c.mapTransactionToSubset.mockReturnValueOnce(T(o)),r.getContexts.mockResolvedValueOnce(e),n.getDeviceSessionState.mockReturnValueOnce({sessionStateType:d.ReadyWithoutSecureChannel,deviceStatus:u.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.14.0"},deviceModelId:p.FLEX,isSecureConnectionAllowed:!1});const s=new y(n,l);await expect(s.run()).rejects.toThrow("Transaction info certificate is missing")})});
2
2
  //# sourceMappingURL=BuildTransactionContextTask.test.js.map