@ledgerhq/device-signer-kit-ethereum 1.9.0 → 1.9.1

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 (102) hide show
  1. package/lib/cjs/api/app-binder/SignTransactionDeviceActionTypes.js +1 -1
  2. package/lib/cjs/api/app-binder/SignTransactionDeviceActionTypes.js.map +2 -2
  3. package/lib/cjs/api/app-binder/SignTypedDataDeviceActionTypes.js +1 -1
  4. package/lib/cjs/api/app-binder/SignTypedDataDeviceActionTypes.js.map +2 -2
  5. package/lib/cjs/internal/app-binder/EthAppBinder.test.js +1 -1
  6. package/lib/cjs/internal/app-binder/EthAppBinder.test.js.map +2 -2
  7. package/lib/cjs/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.js +1 -1
  8. package/lib/cjs/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.js.map +3 -3
  9. package/lib/cjs/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.test.js +1 -1
  10. package/lib/cjs/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.test.js.map +3 -3
  11. package/lib/cjs/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.js +1 -1
  12. package/lib/cjs/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.js.map +3 -3
  13. package/lib/cjs/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.test.js +1 -1
  14. package/lib/cjs/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.test.js.map +3 -3
  15. package/lib/cjs/internal/app-binder/task/BuildBaseContexts.js +1 -1
  16. package/lib/cjs/internal/app-binder/task/BuildBaseContexts.js.map +3 -3
  17. package/lib/cjs/internal/app-binder/task/BuildBaseContexts.test.js +1 -1
  18. package/lib/cjs/internal/app-binder/task/BuildBaseContexts.test.js.map +3 -3
  19. package/lib/cjs/internal/app-binder/task/BuildEIP712ContextTask.js +1 -1
  20. package/lib/cjs/internal/app-binder/task/BuildEIP712ContextTask.js.map +3 -3
  21. package/lib/cjs/internal/app-binder/task/BuildEIP712ContextTask.test.js +1 -1
  22. package/lib/cjs/internal/app-binder/task/BuildEIP712ContextTask.test.js.map +3 -3
  23. package/lib/cjs/internal/app-binder/task/BuildSafeAddressContextTask.test.js +1 -1
  24. package/lib/cjs/internal/app-binder/task/BuildSafeAddressContextTask.test.js.map +2 -2
  25. package/lib/cjs/internal/app-binder/task/BuildSubcontextsTask.js +1 -1
  26. package/lib/cjs/internal/app-binder/task/BuildSubcontextsTask.js.map +2 -2
  27. package/lib/cjs/internal/app-binder/task/BuildSubcontextsTask.test.js +1 -1
  28. package/lib/cjs/internal/app-binder/task/BuildSubcontextsTask.test.js.map +2 -2
  29. package/lib/cjs/internal/app-binder/task/ProvideContextTask.js +1 -1
  30. package/lib/cjs/internal/app-binder/task/ProvideContextTask.js.map +2 -2
  31. package/lib/cjs/internal/app-binder/task/ProvideContextTask.test.js +1 -1
  32. package/lib/cjs/internal/app-binder/task/ProvideContextTask.test.js.map +2 -2
  33. package/lib/cjs/internal/app-binder/task/ProvideEIP712ContextTask.js +1 -1
  34. package/lib/cjs/internal/app-binder/task/ProvideEIP712ContextTask.js.map +3 -3
  35. package/lib/cjs/internal/app-binder/task/ProvideEIP712ContextTask.test.js +1 -1
  36. package/lib/cjs/internal/app-binder/task/ProvideEIP712ContextTask.test.js.map +3 -3
  37. package/lib/cjs/package.json +1 -1
  38. package/lib/esm/api/app-binder/SignTransactionDeviceActionTypes.js +1 -1
  39. package/lib/esm/api/app-binder/SignTransactionDeviceActionTypes.js.map +2 -2
  40. package/lib/esm/api/app-binder/SignTypedDataDeviceActionTypes.js +1 -1
  41. package/lib/esm/api/app-binder/SignTypedDataDeviceActionTypes.js.map +2 -2
  42. package/lib/esm/internal/app-binder/EthAppBinder.test.js +1 -1
  43. package/lib/esm/internal/app-binder/EthAppBinder.test.js.map +2 -2
  44. package/lib/esm/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.js +1 -1
  45. package/lib/esm/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.js.map +3 -3
  46. package/lib/esm/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.test.js +1 -1
  47. package/lib/esm/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.test.js.map +3 -3
  48. package/lib/esm/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.js +1 -1
  49. package/lib/esm/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.js.map +3 -3
  50. package/lib/esm/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.test.js +1 -1
  51. package/lib/esm/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.test.js.map +3 -3
  52. package/lib/esm/internal/app-binder/task/BuildBaseContexts.js +1 -1
  53. package/lib/esm/internal/app-binder/task/BuildBaseContexts.js.map +3 -3
  54. package/lib/esm/internal/app-binder/task/BuildBaseContexts.test.js +1 -1
  55. package/lib/esm/internal/app-binder/task/BuildBaseContexts.test.js.map +3 -3
  56. package/lib/esm/internal/app-binder/task/BuildEIP712ContextTask.js +1 -1
  57. package/lib/esm/internal/app-binder/task/BuildEIP712ContextTask.js.map +3 -3
  58. package/lib/esm/internal/app-binder/task/BuildEIP712ContextTask.test.js +1 -1
  59. package/lib/esm/internal/app-binder/task/BuildEIP712ContextTask.test.js.map +3 -3
  60. package/lib/esm/internal/app-binder/task/BuildSafeAddressContextTask.test.js +1 -1
  61. package/lib/esm/internal/app-binder/task/BuildSafeAddressContextTask.test.js.map +2 -2
  62. package/lib/esm/internal/app-binder/task/BuildSubcontextsTask.js +1 -1
  63. package/lib/esm/internal/app-binder/task/BuildSubcontextsTask.js.map +2 -2
  64. package/lib/esm/internal/app-binder/task/BuildSubcontextsTask.test.js +1 -1
  65. package/lib/esm/internal/app-binder/task/BuildSubcontextsTask.test.js.map +2 -2
  66. package/lib/esm/internal/app-binder/task/ProvideContextTask.js +1 -1
  67. package/lib/esm/internal/app-binder/task/ProvideContextTask.js.map +2 -2
  68. package/lib/esm/internal/app-binder/task/ProvideContextTask.test.js +1 -1
  69. package/lib/esm/internal/app-binder/task/ProvideContextTask.test.js.map +2 -2
  70. package/lib/esm/internal/app-binder/task/ProvideEIP712ContextTask.js +1 -1
  71. package/lib/esm/internal/app-binder/task/ProvideEIP712ContextTask.js.map +3 -3
  72. package/lib/esm/internal/app-binder/task/ProvideEIP712ContextTask.test.js +1 -1
  73. package/lib/esm/internal/app-binder/task/ProvideEIP712ContextTask.test.js.map +3 -3
  74. package/lib/esm/package.json +1 -1
  75. package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts +1 -0
  76. package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts.map +1 -1
  77. package/lib/types/api/app-binder/SignTypedDataDeviceActionTypes.d.ts +2 -0
  78. package/lib/types/api/app-binder/SignTypedDataDeviceActionTypes.d.ts.map +1 -1
  79. package/lib/types/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.d.ts +4 -0
  80. package/lib/types/internal/app-binder/device-action/SignTransaction/SignTransactionDeviceAction.d.ts.map +1 -1
  81. package/lib/types/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.d.ts +5 -0
  82. package/lib/types/internal/app-binder/device-action/SignTypedData/SignTypedDataDeviceAction.d.ts.map +1 -1
  83. package/lib/types/internal/app-binder/task/BuildBaseContexts.d.ts +1 -5
  84. package/lib/types/internal/app-binder/task/BuildBaseContexts.d.ts.map +1 -1
  85. package/lib/types/internal/app-binder/task/BuildEIP712ContextTask.d.ts +3 -3
  86. package/lib/types/internal/app-binder/task/BuildEIP712ContextTask.d.ts.map +1 -1
  87. package/lib/types/internal/app-binder/task/ProvideEIP712ContextTask.d.ts +2 -2
  88. package/lib/types/internal/app-binder/task/ProvideEIP712ContextTask.d.ts.map +1 -1
  89. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  90. package/package.json +6 -6
  91. package/lib/cjs/internal/app-binder/task/GetWeb3CheckTask.js +0 -2
  92. package/lib/cjs/internal/app-binder/task/GetWeb3CheckTask.js.map +0 -7
  93. package/lib/cjs/internal/app-binder/task/GetWeb3CheckTask.test.js +0 -2
  94. package/lib/cjs/internal/app-binder/task/GetWeb3CheckTask.test.js.map +0 -7
  95. package/lib/esm/internal/app-binder/task/GetWeb3CheckTask.js +0 -2
  96. package/lib/esm/internal/app-binder/task/GetWeb3CheckTask.js.map +0 -7
  97. package/lib/esm/internal/app-binder/task/GetWeb3CheckTask.test.js +0 -2
  98. package/lib/esm/internal/app-binder/task/GetWeb3CheckTask.test.js.map +0 -7
  99. package/lib/types/internal/app-binder/task/GetWeb3CheckTask.d.ts +0 -29
  100. package/lib/types/internal/app-binder/task/GetWeb3CheckTask.d.ts.map +0 -1
  101. package/lib/types/internal/app-binder/task/GetWeb3CheckTask.test.d.ts +0 -2
  102. package/lib/types/internal/app-binder/task/GetWeb3CheckTask.test.d.ts.map +0 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/task/BuildSafeAddressContextTask.test.ts"],
4
- "sourcesContent": ["import {\n type ClearSignContext,\n type ClearSignContextSuccess,\n ClearSignContextType,\n type ContextModule,\n} from \"@ledgerhq/context-module\";\nimport {\n CommandResultFactory,\n DeviceModelId,\n type UnknownDeviceExchangeError,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { makeDeviceActionInternalApiMock } from \"@internal/app-binder/device-action/__test-utils__/makeInternalApi\";\n\nimport {\n BuildSafeAddressContextTask,\n type BuildSafeAddressContextTaskArgs,\n} from \"./BuildSafeAddressContextTask\";\n\ndescribe(\"BuildSafeAddressContextTask\", () => {\n const apiMock = makeDeviceActionInternalApiMock();\n const contextModuleMock: ContextModule = {\n getContexts: vi.fn(),\n getFieldContext: vi.fn(),\n getTypedDataFilters: vi.fn(),\n getWeb3Checks: vi.fn(),\n getSolanaContext: vi.fn(),\n };\n\n const TEST_CHALLENGE = \"0x12345678\";\n const TEST_SAFE_ADDRESS = \"0x1234567890123456789012345678901234567890\";\n const TEST_CHAIN_ID = 1;\n\n const successChallengeResult = CommandResultFactory({\n data: { challenge: TEST_CHALLENGE },\n });\n\n const errorResult = CommandResultFactory({\n data: undefined,\n error: {} as UnknownDeviceExchangeError,\n });\n\n const validSafeContext: ClearSignContextSuccess<ClearSignContextType.SAFE> = {\n type: ClearSignContextType.SAFE,\n payload: \"safe_payload\",\n };\n\n const validSignerContext: ClearSignContextSuccess<ClearSignContextType.SIGNER> =\n {\n type: ClearSignContextType.SIGNER,\n payload: \"signer_payload\",\n };\n\n beforeEach(() => {\n vi.resetAllMocks();\n });\n\n describe(\"run\", () => {\n it(\"should successfully build safe address contexts with valid SAFE and SIGNER contexts\", async () => {\n // GIVEN\n const args: BuildSafeAddressContextTaskArgs = {\n contextModule: contextModuleMock,\n safeContractAddress: TEST_SAFE_ADDRESS,\n options: { chainId: TEST_CHAIN_ID },\n deviceModelId: DeviceModelId.FLEX,\n };\n apiMock.sendCommand.mockResolvedValue(successChallengeResult);\n contextModuleMock.getContexts = vi\n .fn()\n .mockResolvedValue([validSafeContext, validSignerContext]);\n\n // WHEN\n const task = new BuildSafeAddressContextTask(apiMock, args);\n const result = await task.run();\n\n // THEN\n expect(result).toEqual({\n clearSignContexts: [validSafeContext, validSignerContext],\n });\n expect(apiMock.sendCommand).toHaveBeenCalledTimes(1);\n expect(contextModuleMock.getContexts).toHaveBeenCalledWith(\n {\n safeContractAddress: TEST_SAFE_ADDRESS,\n chainId: TEST_CHAIN_ID,\n deviceModelId: DeviceModelId.FLEX,\n challenge: TEST_CHALLENGE,\n },\n [ClearSignContextType.SAFE, ClearSignContextType.SIGNER],\n );\n });\n\n it(\"should include certificates when provided in contexts\", async () => {\n // GIVEN\n const safeContextWithCert: ClearSignContextSuccess<ClearSignContextType.SAFE> =\n {\n type: ClearSignContextType.SAFE,\n payload: \"safe_payload\",\n certificate: {\n keyUsageNumber: 1,\n payload: new Uint8Array([1, 2, 3]),\n },\n };\n const signerContextWithCert: ClearSignContextSuccess<ClearSignContextType.SIGNER> =\n {\n type: ClearSignContextType.SIGNER,\n payload: \"signer_payload\",\n certificate: {\n keyUsageNumber: 2,\n payload: new Uint8Array([4, 5, 6]),\n },\n };\n const args: BuildSafeAddressContextTaskArgs = {\n contextModule: contextModuleMock,\n safeContractAddress: TEST_SAFE_ADDRESS,\n options: { chainId: TEST_CHAIN_ID },\n deviceModelId: DeviceModelId.FLEX,\n };\n apiMock.sendCommand.mockResolvedValue(successChallengeResult);\n contextModuleMock.getContexts = vi\n .fn()\n .mockResolvedValue([safeContextWithCert, signerContextWithCert]);\n\n // WHEN\n const task = new BuildSafeAddressContextTask(apiMock, args);\n const result = await task.run();\n\n // THEN\n expect(result).toEqual({\n clearSignContexts: [safeContextWithCert, signerContextWithCert],\n });\n });\n });\n\n describe(\"error handling\", () => {\n it(\"should throw error when GetChallengeCommand fails\", async () => {\n // GIVEN\n const args: BuildSafeAddressContextTaskArgs = {\n contextModule: contextModuleMock,\n safeContractAddress: TEST_SAFE_ADDRESS,\n options: { chainId: TEST_CHAIN_ID },\n deviceModelId: DeviceModelId.FLEX,\n };\n apiMock.sendCommand.mockResolvedValue(errorResult);\n\n // WHEN\n const task = new BuildSafeAddressContextTask(apiMock, args);\n\n // THEN\n await expect(task.run()).rejects.toThrow(\"Failed to get challenge\");\n });\n\n it(\"should throw error when context contains ERROR type\", async () => {\n // GIVEN\n const errorContext: ClearSignContext = {\n type: ClearSignContextType.ERROR,\n error: new Error(\"Context error\"),\n };\n const args: BuildSafeAddressContextTaskArgs = {\n contextModule: contextModuleMock,\n safeContractAddress: TEST_SAFE_ADDRESS,\n options: { chainId: TEST_CHAIN_ID },\n deviceModelId: DeviceModelId.FLEX,\n };\n apiMock.sendCommand.mockResolvedValue(successChallengeResult);\n contextModuleMock.getContexts = vi\n .fn()\n .mockResolvedValue([errorContext, validSignerContext]);\n\n // WHEN\n const task = new BuildSafeAddressContextTask(apiMock, args);\n\n // THEN\n await expect(task.run()).rejects.toThrow(\"Context error\");\n });\n\n it(\"should throw error when only one context is returned\", async () => {\n // GIVEN\n const args: BuildSafeAddressContextTaskArgs = {\n contextModule: contextModuleMock,\n safeContractAddress: TEST_SAFE_ADDRESS,\n options: { chainId: TEST_CHAIN_ID },\n deviceModelId: DeviceModelId.FLEX,\n };\n apiMock.sendCommand.mockResolvedValue(successChallengeResult);\n contextModuleMock.getContexts = vi\n .fn()\n .mockResolvedValue([validSafeContext]);\n\n // WHEN\n const task = new BuildSafeAddressContextTask(apiMock, args);\n\n // THEN\n await expect(task.run()).rejects.toThrow(\"Invalid safe address contexts\");\n });\n\n it(\"should throw error when no contexts are returned\", async () => {\n // GIVEN\n const args: BuildSafeAddressContextTaskArgs = {\n contextModule: contextModuleMock,\n safeContractAddress: TEST_SAFE_ADDRESS,\n options: { chainId: TEST_CHAIN_ID },\n deviceModelId: DeviceModelId.FLEX,\n };\n apiMock.sendCommand.mockResolvedValue(successChallengeResult);\n contextModuleMock.getContexts = vi.fn().mockResolvedValue([]);\n\n // WHEN\n const task = new BuildSafeAddressContextTask(apiMock, args);\n\n // THEN\n await expect(task.run()).rejects.toThrow(\"Invalid safe address contexts\");\n });\n\n it(\"should throw error when more than two contexts are returned\", async () => {\n // GIVEN\n const extraContext: ClearSignContextSuccess<ClearSignContextType.TOKEN> =\n {\n type: ClearSignContextType.TOKEN,\n payload: \"extra_payload\",\n };\n const args: BuildSafeAddressContextTaskArgs = {\n contextModule: contextModuleMock,\n safeContractAddress: TEST_SAFE_ADDRESS,\n options: { chainId: TEST_CHAIN_ID },\n deviceModelId: DeviceModelId.FLEX,\n };\n apiMock.sendCommand.mockResolvedValue(successChallengeResult);\n contextModuleMock.getContexts = vi\n .fn()\n .mockResolvedValue([\n validSafeContext,\n validSignerContext,\n extraContext,\n ]);\n\n // WHEN\n const task = new BuildSafeAddressContextTask(apiMock, args);\n\n // THEN\n await expect(task.run()).rejects.toThrow(\"Invalid safe address contexts\");\n });\n\n it(\"should throw error when SAFE context is missing\", async () => {\n // GIVEN\n const args: BuildSafeAddressContextTaskArgs = {\n contextModule: contextModuleMock,\n safeContractAddress: TEST_SAFE_ADDRESS,\n options: { chainId: TEST_CHAIN_ID },\n deviceModelId: DeviceModelId.FLEX,\n };\n apiMock.sendCommand.mockResolvedValue(successChallengeResult);\n contextModuleMock.getContexts = vi\n .fn()\n .mockResolvedValue([validSignerContext, validSignerContext]);\n\n // WHEN\n const task = new BuildSafeAddressContextTask(apiMock, args);\n\n // THEN\n await expect(task.run()).rejects.toThrow(\"Invalid safe address contexts\");\n });\n\n it(\"should throw error when SIGNER context is missing\", async () => {\n // GIVEN\n const args: BuildSafeAddressContextTaskArgs = {\n contextModule: contextModuleMock,\n safeContractAddress: TEST_SAFE_ADDRESS,\n options: { chainId: TEST_CHAIN_ID },\n deviceModelId: DeviceModelId.FLEX,\n };\n apiMock.sendCommand.mockResolvedValue(successChallengeResult);\n contextModuleMock.getContexts = vi\n .fn()\n .mockResolvedValue([validSafeContext, validSafeContext]);\n\n // WHEN\n const task = new BuildSafeAddressContextTask(apiMock, args);\n\n // THEN\n await expect(task.run()).rejects.toThrow(\"Invalid safe address contexts\");\n });\n\n it(\"should throw error when contexts are of wrong types\", async () => {\n // GIVEN\n const wrongContext1: ClearSignContextSuccess<ClearSignContextType.TOKEN> =\n {\n type: ClearSignContextType.TOKEN,\n payload: \"token_payload\",\n };\n const wrongContext2: ClearSignContextSuccess<ClearSignContextType.NFT> = {\n type: ClearSignContextType.NFT,\n payload: \"nft_payload\",\n };\n const args: BuildSafeAddressContextTaskArgs = {\n contextModule: contextModuleMock,\n safeContractAddress: TEST_SAFE_ADDRESS,\n options: { chainId: TEST_CHAIN_ID },\n deviceModelId: DeviceModelId.FLEX,\n };\n apiMock.sendCommand.mockResolvedValue(successChallengeResult);\n contextModuleMock.getContexts = vi\n .fn()\n .mockResolvedValue([wrongContext1, wrongContext2]);\n\n // WHEN\n const task = new BuildSafeAddressContextTask(apiMock, args);\n\n // THEN\n await expect(task.run()).rejects.toThrow(\"Invalid safe address contexts\");\n });\n\n it(\"should throw error with multiple ERROR contexts\", async () => {\n // GIVEN\n const errorContext1: ClearSignContext = {\n type: ClearSignContextType.ERROR,\n error: new Error(\"First error\"),\n };\n const errorContext2: ClearSignContext = {\n type: ClearSignContextType.ERROR,\n error: new Error(\"Second error\"),\n };\n const args: BuildSafeAddressContextTaskArgs = {\n contextModule: contextModuleMock,\n safeContractAddress: TEST_SAFE_ADDRESS,\n options: { chainId: TEST_CHAIN_ID },\n deviceModelId: DeviceModelId.FLEX,\n };\n apiMock.sendCommand.mockResolvedValue(successChallengeResult);\n contextModuleMock.getContexts = vi\n .fn()\n .mockResolvedValue([errorContext1, errorContext2]);\n\n // WHEN\n const task = new BuildSafeAddressContextTask(apiMock, args);\n\n // THEN\n await expect(task.run()).rejects.toThrow(\"First error\");\n });\n });\n\n describe(\"device model variants\", () => {\n it.each([\n [DeviceModelId.NANO_S, \"Nano S\"],\n [DeviceModelId.NANO_SP, \"Nano S Plus\"],\n [DeviceModelId.NANO_X, \"Nano X\"],\n [DeviceModelId.FLEX, \"Flex\"],\n [DeviceModelId.STAX, \"Stax\"],\n ])(\n \"should successfully build contexts for %s device\",\n async (deviceModelId, _deviceName) => {\n // GIVEN\n const args: BuildSafeAddressContextTaskArgs = {\n contextModule: contextModuleMock,\n safeContractAddress: TEST_SAFE_ADDRESS,\n options: { chainId: TEST_CHAIN_ID },\n deviceModelId,\n };\n apiMock.sendCommand.mockResolvedValue(successChallengeResult);\n contextModuleMock.getContexts = vi\n .fn()\n .mockResolvedValue([validSafeContext, validSignerContext]);\n\n // WHEN\n const task = new BuildSafeAddressContextTask(apiMock, args);\n const result = await task.run();\n\n // THEN\n expect(result).toEqual({\n clearSignContexts: [validSafeContext, validSignerContext],\n });\n expect(contextModuleMock.getContexts).toHaveBeenCalledWith(\n expect.objectContaining({\n deviceModelId,\n }),\n [ClearSignContextType.SAFE, ClearSignContextType.SIGNER],\n );\n },\n );\n });\n\n describe(\"challenge handling\", () => {\n it(\"should pass the correct challenge to contextModule\", async () => {\n // GIVEN\n const customChallenge = \"0xabcdef12\";\n const args: BuildSafeAddressContextTaskArgs = {\n contextModule: contextModuleMock,\n safeContractAddress: TEST_SAFE_ADDRESS,\n options: { chainId: TEST_CHAIN_ID },\n deviceModelId: DeviceModelId.FLEX,\n };\n apiMock.sendCommand.mockResolvedValue(\n CommandResultFactory({\n data: { challenge: customChallenge },\n }),\n );\n contextModuleMock.getContexts = vi\n .fn()\n .mockResolvedValue([validSafeContext, validSignerContext]);\n\n // WHEN\n const task = new BuildSafeAddressContextTask(apiMock, args);\n await task.run();\n\n // THEN\n expect(contextModuleMock.getContexts).toHaveBeenCalledWith(\n expect.objectContaining({\n challenge: customChallenge,\n }),\n [ClearSignContextType.SAFE, ClearSignContextType.SIGNER],\n );\n });\n });\n});\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {\n type ClearSignContext,\n type ClearSignContextSuccess,\n ClearSignContextType,\n type ContextModule,\n} from \"@ledgerhq/context-module\";\nimport {\n CommandResultFactory,\n DeviceModelId,\n type UnknownDeviceExchangeError,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { makeDeviceActionInternalApiMock } from \"@internal/app-binder/device-action/__test-utils__/makeInternalApi\";\n\nimport {\n BuildSafeAddressContextTask,\n type BuildSafeAddressContextTaskArgs,\n} from \"./BuildSafeAddressContextTask\";\n\ndescribe(\"BuildSafeAddressContextTask\", () => {\n const apiMock = makeDeviceActionInternalApiMock();\n const contextModuleMock = {\n getContexts: vi.fn(),\n };\n\n const TEST_CHALLENGE = \"0x12345678\";\n const TEST_SAFE_ADDRESS = \"0x1234567890123456789012345678901234567890\";\n const TEST_CHAIN_ID = 1;\n\n const successChallengeResult = CommandResultFactory({\n data: { challenge: TEST_CHALLENGE },\n });\n\n const errorResult = CommandResultFactory({\n data: undefined,\n error: {} as UnknownDeviceExchangeError,\n });\n\n const validSafeContext: ClearSignContextSuccess<ClearSignContextType.SAFE> = {\n type: ClearSignContextType.SAFE,\n payload: \"safe_payload\",\n };\n\n const validSignerContext: ClearSignContextSuccess<ClearSignContextType.SIGNER> =\n {\n type: ClearSignContextType.SIGNER,\n payload: \"signer_payload\",\n };\n\n beforeEach(() => {\n vi.resetAllMocks();\n });\n\n describe(\"run\", () => {\n it(\"should successfully build safe address contexts with valid SAFE and SIGNER contexts\", async () => {\n // GIVEN\n const args: BuildSafeAddressContextTaskArgs = {\n contextModule: contextModuleMock as unknown as ContextModule,\n safeContractAddress: TEST_SAFE_ADDRESS,\n options: { chainId: TEST_CHAIN_ID },\n deviceModelId: DeviceModelId.FLEX,\n };\n apiMock.sendCommand.mockResolvedValue(successChallengeResult);\n contextModuleMock.getContexts = vi\n .fn()\n .mockResolvedValue([validSafeContext, validSignerContext]);\n\n // WHEN\n const task = new BuildSafeAddressContextTask(apiMock, args);\n const result = await task.run();\n\n // THEN\n expect(result).toEqual({\n clearSignContexts: [validSafeContext, validSignerContext],\n });\n expect(apiMock.sendCommand).toHaveBeenCalledTimes(1);\n expect(contextModuleMock.getContexts).toHaveBeenCalledWith(\n {\n safeContractAddress: TEST_SAFE_ADDRESS,\n chainId: TEST_CHAIN_ID,\n deviceModelId: DeviceModelId.FLEX,\n challenge: TEST_CHALLENGE,\n },\n [ClearSignContextType.SAFE, ClearSignContextType.SIGNER],\n );\n });\n\n it(\"should include certificates when provided in contexts\", async () => {\n // GIVEN\n const safeContextWithCert: ClearSignContextSuccess<ClearSignContextType.SAFE> =\n {\n type: ClearSignContextType.SAFE,\n payload: \"safe_payload\",\n certificate: {\n keyUsageNumber: 1,\n payload: new Uint8Array([1, 2, 3]),\n },\n };\n const signerContextWithCert: ClearSignContextSuccess<ClearSignContextType.SIGNER> =\n {\n type: ClearSignContextType.SIGNER,\n payload: \"signer_payload\",\n certificate: {\n keyUsageNumber: 2,\n payload: new Uint8Array([4, 5, 6]),\n },\n };\n const args: BuildSafeAddressContextTaskArgs = {\n contextModule: contextModuleMock as unknown as ContextModule,\n safeContractAddress: TEST_SAFE_ADDRESS,\n options: { chainId: TEST_CHAIN_ID },\n deviceModelId: DeviceModelId.FLEX,\n };\n apiMock.sendCommand.mockResolvedValue(successChallengeResult);\n contextModuleMock.getContexts = vi\n .fn()\n .mockResolvedValue([safeContextWithCert, signerContextWithCert]);\n\n // WHEN\n const task = new BuildSafeAddressContextTask(apiMock, args);\n const result = await task.run();\n\n // THEN\n expect(result).toEqual({\n clearSignContexts: [safeContextWithCert, signerContextWithCert],\n });\n });\n });\n\n describe(\"error handling\", () => {\n it(\"should throw error when GetChallengeCommand fails\", async () => {\n // GIVEN\n const args: BuildSafeAddressContextTaskArgs = {\n contextModule: contextModuleMock as unknown as ContextModule,\n safeContractAddress: TEST_SAFE_ADDRESS,\n options: { chainId: TEST_CHAIN_ID },\n deviceModelId: DeviceModelId.FLEX,\n };\n apiMock.sendCommand.mockResolvedValue(errorResult);\n\n // WHEN\n const task = new BuildSafeAddressContextTask(apiMock, args);\n\n // THEN\n await expect(task.run()).rejects.toThrow(\"Failed to get challenge\");\n });\n\n it(\"should throw error when context contains ERROR type\", async () => {\n // GIVEN\n const errorContext: ClearSignContext = {\n type: ClearSignContextType.ERROR,\n error: new Error(\"Context error\"),\n };\n const args: BuildSafeAddressContextTaskArgs = {\n contextModule: contextModuleMock as unknown as ContextModule,\n safeContractAddress: TEST_SAFE_ADDRESS,\n options: { chainId: TEST_CHAIN_ID },\n deviceModelId: DeviceModelId.FLEX,\n };\n apiMock.sendCommand.mockResolvedValue(successChallengeResult);\n contextModuleMock.getContexts = vi\n .fn()\n .mockResolvedValue([errorContext, validSignerContext]);\n\n // WHEN\n const task = new BuildSafeAddressContextTask(apiMock, args);\n\n // THEN\n await expect(task.run()).rejects.toThrow(\"Context error\");\n });\n\n it(\"should throw error when only one context is returned\", async () => {\n // GIVEN\n const args: BuildSafeAddressContextTaskArgs = {\n contextModule: contextModuleMock as unknown as ContextModule,\n safeContractAddress: TEST_SAFE_ADDRESS,\n options: { chainId: TEST_CHAIN_ID },\n deviceModelId: DeviceModelId.FLEX,\n };\n apiMock.sendCommand.mockResolvedValue(successChallengeResult);\n contextModuleMock.getContexts = vi\n .fn()\n .mockResolvedValue([validSafeContext]);\n\n // WHEN\n const task = new BuildSafeAddressContextTask(apiMock, args);\n\n // THEN\n await expect(task.run()).rejects.toThrow(\"Invalid safe address contexts\");\n });\n\n it(\"should throw error when no contexts are returned\", async () => {\n // GIVEN\n const args: BuildSafeAddressContextTaskArgs = {\n contextModule: contextModuleMock as unknown as ContextModule,\n safeContractAddress: TEST_SAFE_ADDRESS,\n options: { chainId: TEST_CHAIN_ID },\n deviceModelId: DeviceModelId.FLEX,\n };\n apiMock.sendCommand.mockResolvedValue(successChallengeResult);\n contextModuleMock.getContexts = vi.fn().mockResolvedValue([]);\n\n // WHEN\n const task = new BuildSafeAddressContextTask(apiMock, args);\n\n // THEN\n await expect(task.run()).rejects.toThrow(\"Invalid safe address contexts\");\n });\n\n it(\"should throw error when more than two contexts are returned\", async () => {\n // GIVEN\n const extraContext: ClearSignContextSuccess<ClearSignContextType.TOKEN> =\n {\n type: ClearSignContextType.TOKEN,\n payload: \"extra_payload\",\n };\n const args: BuildSafeAddressContextTaskArgs = {\n contextModule: contextModuleMock as unknown as ContextModule,\n safeContractAddress: TEST_SAFE_ADDRESS,\n options: { chainId: TEST_CHAIN_ID },\n deviceModelId: DeviceModelId.FLEX,\n };\n apiMock.sendCommand.mockResolvedValue(successChallengeResult);\n contextModuleMock.getContexts = vi\n .fn()\n .mockResolvedValue([\n validSafeContext,\n validSignerContext,\n extraContext,\n ]);\n\n // WHEN\n const task = new BuildSafeAddressContextTask(apiMock, args);\n\n // THEN\n await expect(task.run()).rejects.toThrow(\"Invalid safe address contexts\");\n });\n\n it(\"should throw error when SAFE context is missing\", async () => {\n // GIVEN\n const args: BuildSafeAddressContextTaskArgs = {\n contextModule: contextModuleMock as unknown as ContextModule,\n safeContractAddress: TEST_SAFE_ADDRESS,\n options: { chainId: TEST_CHAIN_ID },\n deviceModelId: DeviceModelId.FLEX,\n };\n apiMock.sendCommand.mockResolvedValue(successChallengeResult);\n contextModuleMock.getContexts = vi\n .fn()\n .mockResolvedValue([validSignerContext, validSignerContext]);\n\n // WHEN\n const task = new BuildSafeAddressContextTask(apiMock, args);\n\n // THEN\n await expect(task.run()).rejects.toThrow(\"Invalid safe address contexts\");\n });\n\n it(\"should throw error when SIGNER context is missing\", async () => {\n // GIVEN\n const args: BuildSafeAddressContextTaskArgs = {\n contextModule: contextModuleMock as unknown as ContextModule,\n safeContractAddress: TEST_SAFE_ADDRESS,\n options: { chainId: TEST_CHAIN_ID },\n deviceModelId: DeviceModelId.FLEX,\n };\n apiMock.sendCommand.mockResolvedValue(successChallengeResult);\n contextModuleMock.getContexts = vi\n .fn()\n .mockResolvedValue([validSafeContext, validSafeContext]);\n\n // WHEN\n const task = new BuildSafeAddressContextTask(apiMock, args);\n\n // THEN\n await expect(task.run()).rejects.toThrow(\"Invalid safe address contexts\");\n });\n\n it(\"should throw error when contexts are of wrong types\", async () => {\n // GIVEN\n const wrongContext1: ClearSignContextSuccess<ClearSignContextType.TOKEN> =\n {\n type: ClearSignContextType.TOKEN,\n payload: \"token_payload\",\n };\n const wrongContext2: ClearSignContextSuccess<ClearSignContextType.NFT> = {\n type: ClearSignContextType.NFT,\n payload: \"nft_payload\",\n };\n const args: BuildSafeAddressContextTaskArgs = {\n contextModule: contextModuleMock as unknown as ContextModule,\n safeContractAddress: TEST_SAFE_ADDRESS,\n options: { chainId: TEST_CHAIN_ID },\n deviceModelId: DeviceModelId.FLEX,\n };\n apiMock.sendCommand.mockResolvedValue(successChallengeResult);\n contextModuleMock.getContexts = vi\n .fn()\n .mockResolvedValue([wrongContext1, wrongContext2]);\n\n // WHEN\n const task = new BuildSafeAddressContextTask(apiMock, args);\n\n // THEN\n await expect(task.run()).rejects.toThrow(\"Invalid safe address contexts\");\n });\n\n it(\"should throw error with multiple ERROR contexts\", async () => {\n // GIVEN\n const errorContext1: ClearSignContext = {\n type: ClearSignContextType.ERROR,\n error: new Error(\"First error\"),\n };\n const errorContext2: ClearSignContext = {\n type: ClearSignContextType.ERROR,\n error: new Error(\"Second error\"),\n };\n const args: BuildSafeAddressContextTaskArgs = {\n contextModule: contextModuleMock as unknown as ContextModule,\n safeContractAddress: TEST_SAFE_ADDRESS,\n options: { chainId: TEST_CHAIN_ID },\n deviceModelId: DeviceModelId.FLEX,\n };\n apiMock.sendCommand.mockResolvedValue(successChallengeResult);\n contextModuleMock.getContexts = vi\n .fn()\n .mockResolvedValue([errorContext1, errorContext2]);\n\n // WHEN\n const task = new BuildSafeAddressContextTask(apiMock, args);\n\n // THEN\n await expect(task.run()).rejects.toThrow(\"First error\");\n });\n });\n\n describe(\"device model variants\", () => {\n it.each([\n [DeviceModelId.NANO_S, \"Nano S\"],\n [DeviceModelId.NANO_SP, \"Nano S Plus\"],\n [DeviceModelId.NANO_X, \"Nano X\"],\n [DeviceModelId.FLEX, \"Flex\"],\n [DeviceModelId.STAX, \"Stax\"],\n ])(\n \"should successfully build contexts for %s device\",\n async (deviceModelId, _deviceName) => {\n // GIVEN\n const args: BuildSafeAddressContextTaskArgs = {\n contextModule: contextModuleMock as unknown as ContextModule,\n safeContractAddress: TEST_SAFE_ADDRESS,\n options: { chainId: TEST_CHAIN_ID },\n deviceModelId,\n };\n apiMock.sendCommand.mockResolvedValue(successChallengeResult);\n contextModuleMock.getContexts = vi\n .fn()\n .mockResolvedValue([validSafeContext, validSignerContext]);\n\n // WHEN\n const task = new BuildSafeAddressContextTask(apiMock, args);\n const result = await task.run();\n\n // THEN\n expect(result).toEqual({\n clearSignContexts: [validSafeContext, validSignerContext],\n });\n expect(contextModuleMock.getContexts).toHaveBeenCalledWith(\n expect.objectContaining({\n deviceModelId,\n }),\n [ClearSignContextType.SAFE, ClearSignContextType.SIGNER],\n );\n },\n );\n });\n\n describe(\"challenge handling\", () => {\n it(\"should pass the correct challenge to contextModule\", async () => {\n // GIVEN\n const customChallenge = \"0xabcdef12\";\n const args: BuildSafeAddressContextTaskArgs = {\n contextModule: contextModuleMock as unknown as ContextModule,\n safeContractAddress: TEST_SAFE_ADDRESS,\n options: { chainId: TEST_CHAIN_ID },\n deviceModelId: DeviceModelId.FLEX,\n };\n apiMock.sendCommand.mockResolvedValue(\n CommandResultFactory({\n data: { challenge: customChallenge },\n }),\n );\n contextModuleMock.getContexts = vi\n .fn()\n .mockResolvedValue([validSafeContext, validSignerContext]);\n\n // WHEN\n const task = new BuildSafeAddressContextTask(apiMock, args);\n await task.run();\n\n // THEN\n expect(contextModuleMock.getContexts).toHaveBeenCalledWith(\n expect.objectContaining({\n challenge: customChallenge,\n }),\n [ClearSignContextType.SAFE, ClearSignContextType.SIGNER],\n );\n });\n });\n});\n"],
5
+ "mappings": "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",
6
6
  "names": ["ClearSignContextType", "CommandResultFactory", "DeviceModelId", "makeDeviceActionInternalApiMock", "BuildSafeAddressContextTask", "apiMock", "contextModuleMock", "TEST_CHALLENGE", "TEST_SAFE_ADDRESS", "TEST_CHAIN_ID", "successChallengeResult", "errorResult", "validSafeContext", "validSignerContext", "args", "result", "safeContextWithCert", "signerContextWithCert", "task", "errorContext", "extraContext", "wrongContext1", "wrongContext2", "errorContext1", "errorContext2", "deviceModelId", "_deviceName", "customChallenge"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{ClearSignContextReferenceType as r,ClearSignContextType as t}from"@ledgerhq/context-module";import{bufferToHexaString as i,isSuccessCommandResult as d}from"@ledgerhq/device-management-kit";import{GetChallengeCommand as x}from"../../app-binder/command/GetChallengeCommand";class h{constructor(e,n){this.api=e;this.args=n}run(){const e=this.args.context,n=e.type;switch(n){case t.TRANSACTION_INFO:case t.WEB3_CHECK:case t.PLUGIN:case t.EXTERNAL_PLUGIN:case t.DYNAMIC_NETWORK:case t.DYNAMIC_NETWORK_ICON:case t.ENUM:case t.TRUSTED_NAME:case t.TOKEN:case t.NFT:case t.SAFE:case t.SIGNER:return{subcontextCallbacks:[]};case t.TRANSACTION_FIELD_DESCRIPTION:return{subcontextCallbacks:e.reference?this._getSubcontextsFromReference(e.reference):[]};case t.PROXY_INFO:return{subcontextCallbacks:this._getSubcontextFromProxy(e)};default:{const a=n;throw new Error(`Uncovered type: ${a}`)}}}_getSubcontextsFromReference(e){const n=e.type;switch(n){case r.TOKEN:case r.NFT:return this._getSubcontextsFromTokenOrNftReference(e);case r.ENUM:return this._getSubcontextsFromEnumReference(e);case r.TRUSTED_NAME:return this._getSubcontextsFromTrustedNameReference(e);case r.CALLDATA:return[];default:{const a=n;throw new Error(`Uncovered reference type: ${a}`)}}}_getSubcontextsFromTokenOrNftReference(e){if(e.value!==void 0){const a={chainId:this.args.subset.chainId,address:e.value},s=e.type===r.TOKEN?t.TOKEN:t.NFT;return[()=>this.args.contextModule.getFieldContext(a,s)]}const n=[];if(e.valuePath!==void 0){const a=this.args.transactionParser.extractValue(this.args.subset,e.valuePath).orDefault([]);for(const s of a){const o=i(s.slice(Math.max(0,s.length-20))),c=e.type===r.TOKEN?t.TOKEN:t.NFT;n.push(()=>this.args.contextModule.getFieldContext({chainId:this.args.subset.chainId,address:o},c))}}return n}_getSubcontextsFromEnumReference(e){const n=[];if(!e.valuePath)return n;const a=this.args.transactionParser.extractValue(this.args.subset,e.valuePath).orDefault([]);for(const s of a){const o=s[s.length-1];if(o===void 0)continue;const u=this.args.contextOptional.filter(l=>l.type===t.ENUM).find(l=>l.value===o&&l.id===e.id);u&&n.push(()=>Promise.resolve(u))}return n}_getSubcontextsFromTrustedNameReference(e){const n=[];if(!e.valuePath)return n;const a=this.args.transactionParser.extractValue(this.args.subset,e.valuePath).orDefault([]);for(const s of a)n.push(async()=>{const o=i(s.slice(Math.max(0,s.length-20))),c=await this.api.sendCommand(new x);return d(c)?await this.args.contextModule.getFieldContext({chainId:this.args.subset.chainId,address:o,challenge:c.data.challenge,types:e.types,sources:e.sources,deviceModelId:this.args.deviceModelId},t.TRUSTED_NAME):{type:t.ERROR,error:new Error("Failed to get challenge")}});return n}_getSubcontextFromProxy(e){return[async()=>{const n=await this.api.sendCommand(new x);return d(n)?this.args.subset.to===void 0?{type:t.ERROR,error:new Error("Failed to get proxy address")}:await this.args.contextModule.getFieldContext({chainId:this.args.subset.chainId,proxyAddress:this.args.subset.to,calldata:this.args.subset.data,deviceModelId:this.args.deviceModelId,challenge:n.data.challenge},t.PROXY_INFO):{type:t.ERROR,error:new Error("Failed to get challenge")}}]}}export{h as BuildSubcontextsTask};
1
+ import{ClearSignContextReferenceType as r,ClearSignContextType as t}from"@ledgerhq/context-module";import{bufferToHexaString as i,isSuccessCommandResult as d}from"@ledgerhq/device-management-kit";import{GetChallengeCommand as x}from"../../app-binder/command/GetChallengeCommand";class h{constructor(e,n){this.api=e;this.args=n}run(){const e=this.args.context,n=e.type;switch(n){case t.TRANSACTION_CHECK:case t.TRANSACTION_INFO:case t.PLUGIN:case t.EXTERNAL_PLUGIN:case t.DYNAMIC_NETWORK:case t.DYNAMIC_NETWORK_ICON:case t.ENUM:case t.TRUSTED_NAME:case t.TOKEN:case t.NFT:case t.SAFE:case t.SIGNER:return{subcontextCallbacks:[]};case t.TRANSACTION_FIELD_DESCRIPTION:return{subcontextCallbacks:e.reference?this._getSubcontextsFromReference(e.reference):[]};case t.PROXY_INFO:return{subcontextCallbacks:this._getSubcontextFromProxy(e)};default:{const a=n;throw new Error(`Uncovered type: ${a}`)}}}_getSubcontextsFromReference(e){const n=e.type;switch(n){case r.TOKEN:case r.NFT:return this._getSubcontextsFromTokenOrNftReference(e);case r.ENUM:return this._getSubcontextsFromEnumReference(e);case r.TRUSTED_NAME:return this._getSubcontextsFromTrustedNameReference(e);case r.CALLDATA:return[];default:{const a=n;throw new Error(`Uncovered reference type: ${a}`)}}}_getSubcontextsFromTokenOrNftReference(e){if(e.value!==void 0){const a={chainId:this.args.subset.chainId,address:e.value},s=e.type===r.TOKEN?t.TOKEN:t.NFT;return[()=>this.args.contextModule.getFieldContext(a,s)]}const n=[];if(e.valuePath!==void 0){const a=this.args.transactionParser.extractValue(this.args.subset,e.valuePath).orDefault([]);for(const s of a){const o=i(s.slice(Math.max(0,s.length-20))),c=e.type===r.TOKEN?t.TOKEN:t.NFT;n.push(()=>this.args.contextModule.getFieldContext({chainId:this.args.subset.chainId,address:o},c))}}return n}_getSubcontextsFromEnumReference(e){const n=[];if(!e.valuePath)return n;const a=this.args.transactionParser.extractValue(this.args.subset,e.valuePath).orDefault([]);for(const s of a){const o=s[s.length-1];if(o===void 0)continue;const u=this.args.contextOptional.filter(l=>l.type===t.ENUM).find(l=>l.value===o&&l.id===e.id);u&&n.push(()=>Promise.resolve(u))}return n}_getSubcontextsFromTrustedNameReference(e){const n=[];if(!e.valuePath)return n;const a=this.args.transactionParser.extractValue(this.args.subset,e.valuePath).orDefault([]);for(const s of a)n.push(async()=>{const o=i(s.slice(Math.max(0,s.length-20))),c=await this.api.sendCommand(new x);return d(c)?await this.args.contextModule.getFieldContext({chainId:this.args.subset.chainId,address:o,challenge:c.data.challenge,types:e.types,sources:e.sources,deviceModelId:this.args.deviceModelId},t.TRUSTED_NAME):{type:t.ERROR,error:new Error("Failed to get challenge")}});return n}_getSubcontextFromProxy(e){return[async()=>{const n=await this.api.sendCommand(new x);return d(n)?this.args.subset.to===void 0?{type:t.ERROR,error:new Error("Failed to get proxy address")}:await this.args.contextModule.getFieldContext({chainId:this.args.subset.chainId,proxyAddress:this.args.subset.to,calldata:this.args.subset.data,deviceModelId:this.args.deviceModelId,challenge:n.data.challenge},t.PROXY_INFO):{type:t.ERROR,error:new Error("Failed to get challenge")}}]}}export{h as BuildSubcontextsTask};
2
2
  //# sourceMappingURL=BuildSubcontextsTask.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/task/BuildSubcontextsTask.ts"],
4
- "sourcesContent": ["import {\n type ClearSignContext,\n type ClearSignContextReference,\n ClearSignContextReferenceType,\n type ClearSignContextSuccess,\n ClearSignContextType,\n type ContextModule,\n type TransactionSubset,\n} from \"@ledgerhq/context-module\";\nimport {\n bufferToHexaString,\n type DeviceModelId,\n type InternalApi,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { GetChallengeCommand } from \"@internal/app-binder/command/GetChallengeCommand\";\nimport { type TransactionParserService } from \"@internal/transaction/service/parser/TransactionParserService\";\n\nexport type BuildSubcontextsTaskArgs = {\n readonly context: ClearSignContextSuccess;\n readonly contextOptional: ClearSignContextSuccess[];\n readonly transactionParser: TransactionParserService;\n readonly subset: TransactionSubset;\n readonly deviceModelId: DeviceModelId;\n readonly contextModule: ContextModule;\n};\n\ntype SubcontextCallback = () => Promise<ClearSignContext>;\n\nexport type BuildSubcontextsTaskResult = {\n subcontextCallbacks: SubcontextCallback[];\n};\n\nexport class BuildSubcontextsTask {\n constructor(\n private readonly api: InternalApi,\n private readonly args: BuildSubcontextsTaskArgs,\n ) {}\n\n run(): BuildSubcontextsTaskResult {\n const context = this.args.context;\n const type = context.type;\n\n switch (type) {\n case ClearSignContextType.TRANSACTION_INFO:\n case ClearSignContextType.WEB3_CHECK:\n case ClearSignContextType.PLUGIN:\n case ClearSignContextType.EXTERNAL_PLUGIN:\n case ClearSignContextType.DYNAMIC_NETWORK:\n case ClearSignContextType.DYNAMIC_NETWORK_ICON:\n case ClearSignContextType.ENUM:\n case ClearSignContextType.TRUSTED_NAME:\n case ClearSignContextType.TOKEN:\n case ClearSignContextType.NFT:\n case ClearSignContextType.SAFE:\n case ClearSignContextType.SIGNER:\n return {\n subcontextCallbacks: [],\n };\n case ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION:\n return {\n subcontextCallbacks: context.reference\n ? this._getSubcontextsFromReference(context.reference)\n : [],\n };\n case ClearSignContextType.PROXY_INFO:\n return {\n subcontextCallbacks: this._getSubcontextFromProxy(context),\n };\n default: {\n const uncoveredType: never = type;\n throw new Error(`Uncovered type: ${uncoveredType}`);\n }\n }\n }\n\n private _getSubcontextsFromReference(\n reference: ClearSignContextReference,\n ): SubcontextCallback[] {\n const referenceType = reference.type;\n\n switch (referenceType) {\n case ClearSignContextReferenceType.TOKEN:\n case ClearSignContextReferenceType.NFT:\n return this._getSubcontextsFromTokenOrNftReference(reference);\n case ClearSignContextReferenceType.ENUM:\n return this._getSubcontextsFromEnumReference(reference);\n case ClearSignContextReferenceType.TRUSTED_NAME:\n return this._getSubcontextsFromTrustedNameReference(reference);\n case ClearSignContextReferenceType.CALLDATA:\n // calldata reference is handled by the BuildFullContextsTask and ParseNestedTransactionTask\n return [];\n default: {\n const uncoveredReferenceType: never = referenceType;\n throw new Error(`Uncovered reference type: ${uncoveredReferenceType}`);\n }\n }\n }\n\n private _getSubcontextsFromTokenOrNftReference(\n reference: ClearSignContextReference<\n ClearSignContextReferenceType.TOKEN | ClearSignContextReferenceType.NFT\n >,\n ): SubcontextCallback[] {\n // if the reference is a string, it means it is a direct address\n // and we don't need to extract the value from the transaction\n // as it is already provided in the reference\n if (reference.value !== undefined) {\n const transactionFieldContext = {\n chainId: this.args.subset.chainId,\n address: reference.value,\n };\n\n const expectedType =\n reference.type === ClearSignContextReferenceType.TOKEN\n ? ClearSignContextType.TOKEN\n : ClearSignContextType.NFT;\n\n return [\n () =>\n this.args.contextModule.getFieldContext(\n transactionFieldContext,\n expectedType,\n ),\n ];\n }\n\n const subcontextCallbacks: SubcontextCallback[] = [];\n\n // if the reference is a path, it means we need to extract the value\n // from the transaction and provide it to the device\n if (reference.valuePath !== undefined) {\n const referenceValues = this.args.transactionParser\n .extractValue(this.args.subset, reference.valuePath)\n .orDefault([]);\n\n for (const value of referenceValues) {\n const address = bufferToHexaString(\n value.slice(Math.max(0, value.length - 20)),\n );\n\n const expectedType =\n reference.type === ClearSignContextReferenceType.TOKEN\n ? ClearSignContextType.TOKEN\n : ClearSignContextType.NFT;\n\n subcontextCallbacks.push(() =>\n this.args.contextModule.getFieldContext(\n {\n chainId: this.args.subset.chainId,\n address,\n },\n expectedType,\n ),\n );\n }\n }\n\n return subcontextCallbacks;\n }\n\n private _getSubcontextsFromEnumReference(\n reference: ClearSignContextReference<ClearSignContextReferenceType.ENUM>,\n ): SubcontextCallback[] {\n const subcontextCallbacks: SubcontextCallback[] = [];\n\n if (!reference.valuePath) {\n return subcontextCallbacks;\n }\n\n const referenceValues = this.args.transactionParser\n .extractValue(this.args.subset, reference.valuePath)\n .orDefault([]);\n\n for (const value of referenceValues) {\n const enumValue = value[value.length - 1];\n if (enumValue === undefined) {\n continue;\n }\n\n const enumsContext = this.args.contextOptional.filter(\n (c) => c.type === ClearSignContextType.ENUM,\n );\n\n const subcontext = enumsContext.find(\n (enumContext) =>\n enumContext.value === enumValue && enumContext.id === reference.id,\n );\n\n if (subcontext) {\n subcontextCallbacks.push(() => Promise.resolve(subcontext));\n }\n }\n return subcontextCallbacks;\n }\n\n private _getSubcontextsFromTrustedNameReference(\n reference: ClearSignContextReference<ClearSignContextReferenceType.TRUSTED_NAME>,\n ): SubcontextCallback[] {\n const subcontextCallbacks: SubcontextCallback[] = [];\n\n if (!reference.valuePath) {\n return subcontextCallbacks;\n }\n\n const referenceValues = this.args.transactionParser\n .extractValue(this.args.subset, reference.valuePath)\n .orDefault([]);\n\n for (const value of referenceValues) {\n {\n subcontextCallbacks.push(async () => {\n const address = bufferToHexaString(\n value.slice(Math.max(0, value.length - 20)),\n );\n\n const getChallengeResult = await this.api.sendCommand(\n new GetChallengeCommand(),\n );\n if (!isSuccessCommandResult(getChallengeResult)) {\n return {\n type: ClearSignContextType.ERROR,\n error: new Error(\"Failed to get challenge\"),\n };\n }\n\n const subcontext = await this.args.contextModule.getFieldContext(\n {\n chainId: this.args.subset.chainId,\n address,\n challenge: getChallengeResult.data.challenge,\n types: reference.types,\n sources: reference.sources,\n deviceModelId: this.args.deviceModelId,\n },\n ClearSignContextType.TRUSTED_NAME,\n );\n\n return subcontext;\n });\n }\n }\n\n return subcontextCallbacks;\n }\n\n private _getSubcontextFromProxy(\n _context: ClearSignContextSuccess<ClearSignContextType.PROXY_INFO>,\n ): SubcontextCallback[] {\n return [\n async () => {\n const getChallengeResult = await this.api.sendCommand(\n new GetChallengeCommand(),\n );\n if (!isSuccessCommandResult(getChallengeResult)) {\n return {\n type: ClearSignContextType.ERROR,\n error: new Error(\"Failed to get challenge\"),\n };\n }\n\n if (this.args.subset.to === undefined) {\n return {\n type: ClearSignContextType.ERROR,\n error: new Error(\"Failed to get proxy address\"),\n };\n }\n\n const subcontext = await this.args.contextModule.getFieldContext(\n {\n chainId: this.args.subset.chainId,\n proxyAddress: this.args.subset.to,\n calldata: this.args.subset.data,\n deviceModelId: this.args.deviceModelId,\n challenge: getChallengeResult.data.challenge,\n },\n ClearSignContextType.PROXY_INFO,\n );\n\n return subcontext;\n },\n ];\n }\n}\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {\n type ClearSignContext,\n type ClearSignContextReference,\n ClearSignContextReferenceType,\n type ClearSignContextSuccess,\n ClearSignContextType,\n type ContextModule,\n type TransactionSubset,\n} from \"@ledgerhq/context-module\";\nimport {\n bufferToHexaString,\n type DeviceModelId,\n type InternalApi,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { GetChallengeCommand } from \"@internal/app-binder/command/GetChallengeCommand\";\nimport { type TransactionParserService } from \"@internal/transaction/service/parser/TransactionParserService\";\n\nexport type BuildSubcontextsTaskArgs = {\n readonly context: ClearSignContextSuccess;\n readonly contextOptional: ClearSignContextSuccess[];\n readonly transactionParser: TransactionParserService;\n readonly subset: TransactionSubset;\n readonly deviceModelId: DeviceModelId;\n readonly contextModule: ContextModule;\n};\n\ntype SubcontextCallback = () => Promise<ClearSignContext>;\n\nexport type BuildSubcontextsTaskResult = {\n subcontextCallbacks: SubcontextCallback[];\n};\n\nexport class BuildSubcontextsTask {\n constructor(\n private readonly api: InternalApi,\n private readonly args: BuildSubcontextsTaskArgs,\n ) {}\n\n run(): BuildSubcontextsTaskResult {\n const context = this.args.context;\n const type = context.type;\n\n switch (type) {\n case ClearSignContextType.TRANSACTION_CHECK:\n case ClearSignContextType.TRANSACTION_INFO:\n case ClearSignContextType.PLUGIN:\n case ClearSignContextType.EXTERNAL_PLUGIN:\n case ClearSignContextType.DYNAMIC_NETWORK:\n case ClearSignContextType.DYNAMIC_NETWORK_ICON:\n case ClearSignContextType.ENUM:\n case ClearSignContextType.TRUSTED_NAME:\n case ClearSignContextType.TOKEN:\n case ClearSignContextType.NFT:\n case ClearSignContextType.SAFE:\n case ClearSignContextType.SIGNER:\n return {\n subcontextCallbacks: [],\n };\n case ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION:\n return {\n subcontextCallbacks: context.reference\n ? this._getSubcontextsFromReference(context.reference)\n : [],\n };\n case ClearSignContextType.PROXY_INFO:\n return {\n subcontextCallbacks: this._getSubcontextFromProxy(context),\n };\n default: {\n const uncoveredType: never = type;\n throw new Error(`Uncovered type: ${uncoveredType}`);\n }\n }\n }\n\n private _getSubcontextsFromReference(\n reference: ClearSignContextReference,\n ): SubcontextCallback[] {\n const referenceType = reference.type;\n\n switch (referenceType) {\n case ClearSignContextReferenceType.TOKEN:\n case ClearSignContextReferenceType.NFT:\n return this._getSubcontextsFromTokenOrNftReference(reference);\n case ClearSignContextReferenceType.ENUM:\n return this._getSubcontextsFromEnumReference(reference);\n case ClearSignContextReferenceType.TRUSTED_NAME:\n return this._getSubcontextsFromTrustedNameReference(reference);\n case ClearSignContextReferenceType.CALLDATA:\n // calldata reference is handled by the BuildFullContextsTask and ParseNestedTransactionTask\n return [];\n default: {\n const uncoveredReferenceType: never = referenceType;\n throw new Error(`Uncovered reference type: ${uncoveredReferenceType}`);\n }\n }\n }\n\n private _getSubcontextsFromTokenOrNftReference(\n reference: ClearSignContextReference<\n ClearSignContextReferenceType.TOKEN | ClearSignContextReferenceType.NFT\n >,\n ): SubcontextCallback[] {\n // if the reference is a string, it means it is a direct address\n // and we don't need to extract the value from the transaction\n // as it is already provided in the reference\n if (reference.value !== undefined) {\n const transactionFieldContext = {\n chainId: this.args.subset.chainId,\n address: reference.value,\n };\n\n const expectedType =\n reference.type === ClearSignContextReferenceType.TOKEN\n ? ClearSignContextType.TOKEN\n : ClearSignContextType.NFT;\n\n return [\n () =>\n this.args.contextModule.getFieldContext(\n transactionFieldContext,\n expectedType,\n ),\n ];\n }\n\n const subcontextCallbacks: SubcontextCallback[] = [];\n\n // if the reference is a path, it means we need to extract the value\n // from the transaction and provide it to the device\n if (reference.valuePath !== undefined) {\n const referenceValues = this.args.transactionParser\n .extractValue(this.args.subset, reference.valuePath)\n .orDefault([]);\n\n for (const value of referenceValues) {\n const address = bufferToHexaString(\n value.slice(Math.max(0, value.length - 20)),\n );\n\n const expectedType =\n reference.type === ClearSignContextReferenceType.TOKEN\n ? ClearSignContextType.TOKEN\n : ClearSignContextType.NFT;\n\n subcontextCallbacks.push(() =>\n this.args.contextModule.getFieldContext(\n {\n chainId: this.args.subset.chainId,\n address,\n },\n expectedType,\n ),\n );\n }\n }\n\n return subcontextCallbacks;\n }\n\n private _getSubcontextsFromEnumReference(\n reference: ClearSignContextReference<ClearSignContextReferenceType.ENUM>,\n ): SubcontextCallback[] {\n const subcontextCallbacks: SubcontextCallback[] = [];\n\n if (!reference.valuePath) {\n return subcontextCallbacks;\n }\n\n const referenceValues = this.args.transactionParser\n .extractValue(this.args.subset, reference.valuePath)\n .orDefault([]);\n\n for (const value of referenceValues) {\n const enumValue = value[value.length - 1];\n if (enumValue === undefined) {\n continue;\n }\n\n const enumsContext = this.args.contextOptional.filter(\n (c) => c.type === ClearSignContextType.ENUM,\n );\n\n const subcontext = enumsContext.find(\n (enumContext) =>\n enumContext.value === enumValue && enumContext.id === reference.id,\n );\n\n if (subcontext) {\n subcontextCallbacks.push(() => Promise.resolve(subcontext));\n }\n }\n return subcontextCallbacks;\n }\n\n private _getSubcontextsFromTrustedNameReference(\n reference: ClearSignContextReference<ClearSignContextReferenceType.TRUSTED_NAME>,\n ): SubcontextCallback[] {\n const subcontextCallbacks: SubcontextCallback[] = [];\n\n if (!reference.valuePath) {\n return subcontextCallbacks;\n }\n\n const referenceValues = this.args.transactionParser\n .extractValue(this.args.subset, reference.valuePath)\n .orDefault([]);\n\n for (const value of referenceValues) {\n {\n subcontextCallbacks.push(async () => {\n const address = bufferToHexaString(\n value.slice(Math.max(0, value.length - 20)),\n );\n\n const getChallengeResult = await this.api.sendCommand(\n new GetChallengeCommand(),\n );\n if (!isSuccessCommandResult(getChallengeResult)) {\n return {\n type: ClearSignContextType.ERROR,\n error: new Error(\"Failed to get challenge\"),\n };\n }\n\n const subcontext = await this.args.contextModule.getFieldContext(\n {\n chainId: this.args.subset.chainId,\n address,\n challenge: getChallengeResult.data.challenge,\n types: reference.types,\n sources: reference.sources,\n deviceModelId: this.args.deviceModelId,\n },\n ClearSignContextType.TRUSTED_NAME,\n );\n\n return subcontext;\n });\n }\n }\n\n return subcontextCallbacks;\n }\n\n private _getSubcontextFromProxy(\n _context: ClearSignContextSuccess<ClearSignContextType.PROXY_INFO>,\n ): SubcontextCallback[] {\n return [\n async () => {\n const getChallengeResult = await this.api.sendCommand(\n new GetChallengeCommand(),\n );\n if (!isSuccessCommandResult(getChallengeResult)) {\n return {\n type: ClearSignContextType.ERROR,\n error: new Error(\"Failed to get challenge\"),\n };\n }\n\n if (this.args.subset.to === undefined) {\n return {\n type: ClearSignContextType.ERROR,\n error: new Error(\"Failed to get proxy address\"),\n };\n }\n\n const subcontext = await this.args.contextModule.getFieldContext(\n {\n chainId: this.args.subset.chainId,\n proxyAddress: this.args.subset.to,\n calldata: this.args.subset.data,\n deviceModelId: this.args.deviceModelId,\n challenge: getChallengeResult.data.challenge,\n },\n ClearSignContextType.PROXY_INFO,\n );\n\n return subcontext;\n },\n ];\n }\n}\n"],
5
+ "mappings": "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",
6
6
  "names": ["ClearSignContextReferenceType", "ClearSignContextType", "bufferToHexaString", "isSuccessCommandResult", "GetChallengeCommand", "BuildSubcontextsTask", "api", "args", "context", "type", "uncoveredType", "reference", "referenceType", "uncoveredReferenceType", "transactionFieldContext", "expectedType", "subcontextCallbacks", "referenceValues", "value", "address", "enumValue", "subcontext", "c", "enumContext", "getChallengeResult", "_context"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{ClearSignContextReferenceType as d,ClearSignContextType as e}from"@ledgerhq/context-module";import{CommandResultFactory as h,DeviceModelId as b,UnknownDeviceExchangeError as E}from"@ledgerhq/device-management-kit";import{Left as S,Right as y}from"purify-ts";import{GetChallengeCommand as N}from"../../app-binder/command/GetChallengeCommand";import{makeDeviceActionInternalApiMock as R}from"../../app-binder/device-action/__test-utils__/makeInternalApi";import{BuildSubcontextsTask as r}from"./BuildSubcontextsTask";describe("BuildSubcontextsTask",()=>{const x={getFieldContext:vi.fn()},p={extractValue:vi.fn()},o=R();let l;beforeEach(()=>{vi.resetAllMocks(),l={context:{type:e.TRANSACTION_INFO,payload:"test payload"},contextOptional:[],transactionParser:p,subset:{chainId:1,data:"0x",selector:"0x",to:"0x",value:BigInt(0)},contextModule:x,deviceModelId:b.STAX}}),describe("when context type is a simple type",()=>{const c=[e.TRANSACTION_INFO,e.WEB3_CHECK,e.PLUGIN,e.EXTERNAL_PLUGIN,e.DYNAMIC_NETWORK,e.DYNAMIC_NETWORK_ICON,e.ENUM,e.TRUSTED_NAME,e.TOKEN,e.NFT];it.each(c)("should return context with empty subcontextCallbacks for %s",t=>{const n={...l,context:{type:t,payload:"test payload"}},s=new r(o,n).run();expect(s.subcontextCallbacks).toHaveLength(0)})}),describe("when context has a direct value reference",()=>{it("should create a callback to get context with the direct value",async()=>{const c={type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"test payload",reference:{type:d.TOKEN,value:"0x1234567890123456789012345678901234567890"}},t={...l,context:c},a={chainId:1,address:"0x1234567890123456789012345678901234567890"},n=new r(o,t).run();expect(n.subcontextCallbacks).toHaveLength(1);const s=n.subcontextCallbacks[0];await s(),expect(x.getFieldContext).toHaveBeenCalledWith(a,e.TOKEN)}),it("should handle undefined value in reference",()=>{const c={type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"test payload",reference:void 0},t={...l,context:c},a=new r(o,t).run();expect(a.subcontextCallbacks).toHaveLength(0)})}),describe("when context has a valuePath reference",()=>{beforeEach(()=>{o.sendCommand.mockResolvedValue(h({data:{challenge:"test-challenge"}}))}),describe("when extractValue returns Left (error)",()=>{it("should return context with empty subcontextCallbacks",()=>{const c={type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"test payload",reference:{type:d.TOKEN,valuePath:[{type:"SLICE",start:0,end:20}]}},t={...l,context:c};p.extractValue.mockReturnValue(S(new Error("Extraction failed")));const a=new r(o,t).run();expect(a.subcontextCallbacks).toHaveLength(0)})}),describe("when extractValue returns Right with values",()=>{describe("for ENUM type",()=>{it("should create callbacks for matching enum contexts",async()=>{const c={type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"test payload",reference:{type:d.ENUM,id:1,valuePath:[{type:"TUPLE",offset:0}]}},t={type:e.ENUM,id:1,value:1,payload:"enum context 1"},a={type:e.ENUM,id:1,value:2,payload:"enum context 2"},n={type:e.ENUM,id:2,value:2,payload:"enum context 3"},s={...l,context:c,contextOptional:[t,a,n]},u=[new Uint8Array([1,2])];p.extractValue.mockReturnValue(y(u));const i=new r(o,s).run();expect(i.subcontextCallbacks).toHaveLength(1);const C=i.subcontextCallbacks[0],g=await C();expect(g).toEqual(a)}),it("should create callbacks for matching enum contexts with two values",async()=>{const c={type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"test payload",reference:{type:d.ENUM,id:1,valuePath:[{type:"TUPLE",offset:0}]}},t={type:e.ENUM,id:1,value:1,payload:"enum context 1"},a={type:e.ENUM,id:1,value:2,payload:"enum context 2"},n={type:e.ENUM,id:2,value:2,payload:"enum context 3"},s={...l,context:c,contextOptional:[t,a,n]},u=[new Uint8Array([1,2]),new Uint8Array([3,2,1])];p.extractValue.mockReturnValue(y(u));const i=new r(o,s).run();expect(i.subcontextCallbacks).toHaveLength(2);const C=i.subcontextCallbacks[0],g=i.subcontextCallbacks[1],T=await C(),k=await g();expect(T).toEqual(a),expect(k).toEqual(t)}),it("should skip when enum value is undefined",()=>{const c={type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"test payload",reference:{type:d.ENUM,id:1,valuePath:[{type:"TUPLE",offset:0}]}},t={...l,context:c},a=[new Uint8Array([])];p.extractValue.mockReturnValue(y(a));const n=new r(o,t).run();expect(n.subcontextCallbacks).toHaveLength(0)}),it("should create callback with enum id 0",async()=>{const c={type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"test payload",reference:{type:d.ENUM,id:0,valuePath:[{type:"TUPLE",offset:0}]}},t={type:e.ENUM,id:0,value:0,payload:"enum context 1"},a={type:e.ENUM,id:1,value:1,payload:"enum context 2"},n={...l,context:c,contextOptional:[t,a]},s=[new Uint8Array([1,0])];p.extractValue.mockReturnValue(y(s));const u=new r(o,n).run();expect(u.subcontextCallbacks).toHaveLength(1);const i=u.subcontextCallbacks[0],C=await i();expect(C).toEqual(t)}),it("should skip when no matching enum context found",()=>{const c={type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"test payload",reference:{type:d.ENUM,id:1,valuePath:[{type:"TUPLE",offset:0}]}},t={type:e.ENUM,id:2,value:2,payload:"enum context"},a={...l,context:c,contextOptional:[t]},n=[new Uint8Array([1,2])];p.extractValue.mockReturnValue(y(n));const s=new r(o,a).run();expect(s.subcontextCallbacks).toHaveLength(0)})}),describe("for TOKEN type",()=>{it("should create callbacks to get token context",async()=>{const c={type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"test payload",reference:{type:d.TOKEN,valuePath:[{type:"TUPLE",offset:0}]}},t={...l,context:c},a=[new Uint8Array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22])];p.extractValue.mockReturnValue(y(a)),x.getFieldContext.mockResolvedValue({type:e.TOKEN,payload:"token result"});const n=new r(o,t).run();expect(n.subcontextCallbacks).toHaveLength(1);const s=n.subcontextCallbacks[0],u=await s();expect(u).toEqual({type:e.TOKEN,payload:"token result"}),expect(x.getFieldContext).toHaveBeenCalledWith({chainId:1,address:"0x030405060708090a0b0c0d0e0f10111213141516"},e.TOKEN)}),it("should create callbacks to get token as constant",async()=>{const c={type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"test payload",reference:{type:d.TOKEN,value:"0x030405060708090a0b0c0d0e0f10111213141516"}},t={...l,context:c};x.getFieldContext.mockResolvedValue({type:e.TOKEN,payload:"token result"});const a=new r(o,t).run();expect(a.subcontextCallbacks).toHaveLength(1);const n=a.subcontextCallbacks[0],s=await n();expect(s).toEqual({type:e.TOKEN,payload:"token result"}),expect(x.getFieldContext).toHaveBeenCalledWith({chainId:1,address:"0x030405060708090a0b0c0d0e0f10111213141516"},e.TOKEN)})}),describe("for NFT type",()=>{it("should create callbacks to get NFT context",async()=>{const c={type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"test payload",reference:{type:d.NFT,valuePath:[{type:"TUPLE",offset:0}]}},t={...l,context:c},a=[new Uint8Array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22])];p.extractValue.mockReturnValue(y(a)),x.getFieldContext.mockResolvedValue({type:e.NFT,payload:"nft result"});const n=new r(o,t).run();expect(n.subcontextCallbacks).toHaveLength(1);const s=n.subcontextCallbacks[0],u=await s();expect(u).toEqual({type:e.NFT,payload:"nft result"}),expect(x.getFieldContext).toHaveBeenCalledWith({chainId:1,address:"0x030405060708090a0b0c0d0e0f10111213141516"},e.NFT)}),it("should create callbacks to get NFT as constant",async()=>{const c={type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"test payload",reference:{type:d.NFT,value:"0x030405060708090a0b0c0d0e0f10111213141516"}},t={...l,context:c};x.getFieldContext.mockResolvedValue({type:e.NFT,payload:"nft result"});const a=new r(o,t).run();expect(a.subcontextCallbacks).toHaveLength(1);const n=a.subcontextCallbacks[0],s=await n();expect(s).toEqual({type:e.NFT,payload:"nft result"}),expect(x.getFieldContext).toHaveBeenCalledWith({chainId:1,address:"0x030405060708090a0b0c0d0e0f10111213141516"},e.NFT)})}),describe("for TRUSTED_NAME type",()=>{it("should create callbacks to get trusted name context with challenge",async()=>{const c={type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"test payload",reference:{type:d.TRUSTED_NAME,valuePath:[{type:"TUPLE",offset:0}],types:["type1","type2"],sources:["source1","source2"]}},t={...l,context:c},a=[new Uint8Array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22])];p.extractValue.mockReturnValue(y(a)),x.getFieldContext.mockResolvedValue({type:e.TRUSTED_NAME,payload:"trusted name result"});const n=new r(o,t).run();expect(n.subcontextCallbacks).toHaveLength(1);const s=n.subcontextCallbacks[0],u=await s();expect(u).toEqual({type:e.TRUSTED_NAME,payload:"trusted name result"}),expect(o.sendCommand).toHaveBeenCalledWith(expect.any(N)),expect(x.getFieldContext).toHaveBeenCalledWith({chainId:1,address:"0x030405060708090a0b0c0d0e0f10111213141516",challenge:"test-challenge",types:["type1","type2"],sources:["source1","source2"],deviceModelId:b.STAX},e.TRUSTED_NAME)}),it("should handle challenge command failure",async()=>{const c={type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"test payload",reference:{type:d.TRUSTED_NAME,valuePath:[{type:"TUPLE",offset:0}],types:["type1"],sources:["source1"]}},t={...l,context:c},a=[new Uint8Array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22])];p.extractValue.mockReturnValue(y(a));const n=new E("Failed");o.sendCommand.mockResolvedValueOnce(h({error:n}));const s=new r(o,t).run();expect(s.subcontextCallbacks).toHaveLength(1);const u=s.subcontextCallbacks[0],i=await u();expect(i).toEqual({error:new Error("Failed to get challenge"),type:e.ERROR})})}),describe("for multiple values",()=>{it("should create callbacks for each extracted value",async()=>{const c={type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"test payload",reference:{type:d.TOKEN,valuePath:[{type:"TUPLE",offset:0}]}},t={...l,context:c},a=[new Uint8Array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22]),new Uint8Array([33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54])];p.extractValue.mockReturnValue(y(a)),x.getFieldContext.mockResolvedValueOnce({type:e.TOKEN,payload:"token result 1"}),x.getFieldContext.mockResolvedValueOnce({type:e.TOKEN,payload:"token result 2"});const n=new r(o,t).run();expect(n.subcontextCallbacks).toHaveLength(2);const s=n.subcontextCallbacks[0],u=n.subcontextCallbacks[1],i=await s(),C=await u();expect(i).toEqual({type:e.TOKEN,payload:"token result 1"}),expect(C).toEqual({type:e.TOKEN,payload:"token result 2"}),expect(x.getFieldContext).toHaveBeenCalledTimes(2),expect(x.getFieldContext).toHaveBeenNthCalledWith(1,{chainId:1,address:"0x030405060708090a0b0c0d0e0f10111213141516"},e.TOKEN),expect(x.getFieldContext).toHaveBeenNthCalledWith(2,{chainId:1,address:"0x232425262728292a2b2c2d2e2f30313233343536"},e.TOKEN)})})})}),describe("when context has no reference",()=>{it("should return context with empty subcontextCallbacks",()=>{const c={type:e.TOKEN,payload:"test payload"},t={...l,context:c},a=new r(o,t).run();expect(a.subcontextCallbacks).toHaveLength(0)})}),describe("when context has reference but no valuePath",()=>{it("should return context with empty subcontextCallbacks",()=>{const c={type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"test payload",reference:{type:d.TOKEN,valuePath:void 0}},t={...l,context:c},a=new r(o,t).run();expect(a.subcontextCallbacks).toHaveLength(0)})}),describe("error handling",()=>{it("should throw error for uncovered context type",()=>{const t={...l,context:{type:"UNKNOWN_TYPE",payload:"test payload"}};expect(()=>new r(o,t).run()).toThrow("Uncovered type: UNKNOWN_TYPE")}),it("should throw error for uncovered reference type",()=>{const c={type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"test payload",reference:{type:"UNKNOWN_REFERENCE_TYPE"}},t={...l,context:c};expect(()=>new r(o,t).run()).toThrow("Uncovered reference type: UNKNOWN_REFERENCE_TYPE")})}),describe("CALLDATA reference type",()=>{it("should return empty subcontextCallbacks for CALLDATA reference",()=>{const c={type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"test payload",reference:{type:d.CALLDATA,callee:[{type:"TUPLE",offset:0}],valuePath:[{type:"TUPLE",offset:0}]}},t={...l,context:c},a=new r(o,t).run();expect(a.subcontextCallbacks).toHaveLength(0)})}),describe("references without valuePath",()=>{it("should return empty subcontextCallbacks for ENUM reference without valuePath",()=>{const c={type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"test payload",reference:{type:d.ENUM,id:1,valuePath:void 0}},t={...l,context:c},a=new r(o,t).run();expect(a.subcontextCallbacks).toHaveLength(0)}),it("should return empty subcontextCallbacks for TRUSTED_NAME reference without valuePath",()=>{const c={type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"test payload",reference:{type:d.TRUSTED_NAME,types:["type1"],sources:["source1"],valuePath:void 0}},t={...l,context:c},a=new r(o,t).run();expect(a.subcontextCallbacks).toHaveLength(0)})}),describe("PROXY_INFO context type",()=>{beforeEach(()=>{o.sendCommand.mockResolvedValue(h({data:{challenge:"test-challenge"}}))}),it("should create callback to get proxy delegate call context",async()=>{const c={type:e.PROXY_INFO,payload:"proxy payload"},t={...l,context:c,subset:{...l.subset,to:"0x1234567890123456789012345678901234567890",data:"0xabcdef"}};x.getFieldContext.mockResolvedValue({type:e.PROXY_INFO,payload:"proxy result"});const a=new r(o,t).run();expect(a.subcontextCallbacks).toHaveLength(1);const n=a.subcontextCallbacks[0],s=await n();expect(s).toEqual({type:e.PROXY_INFO,payload:"proxy result"}),expect(o.sendCommand).toHaveBeenCalledWith(expect.any(N)),expect(x.getFieldContext).toHaveBeenCalledWith({chainId:1,proxyAddress:"0x1234567890123456789012345678901234567890",calldata:"0xabcdef",deviceModelId:b.STAX,challenge:"test-challenge"},e.PROXY_INFO)}),it("should handle challenge command failure",async()=>{const c={type:e.PROXY_INFO,payload:"proxy payload"},t={...l,context:c,subset:{...l.subset,to:"0x1234567890123456789012345678901234567890",data:"0xabcdef"}},a=new E("Failed");o.sendCommand.mockResolvedValueOnce(h({error:a}));const n=new r(o,t).run();expect(n.subcontextCallbacks).toHaveLength(1);const s=n.subcontextCallbacks[0],u=await s();expect(u).toEqual({error:new Error("Failed to get challenge"),type:e.ERROR}),expect(o.sendCommand).toHaveBeenCalledWith(expect.any(N)),expect(x.getFieldContext).not.toHaveBeenCalled()}),it("should handle missing proxy address",async()=>{const c={type:e.PROXY_INFO,payload:"proxy payload"},t={...l,context:c,subset:{...l.subset,to:void 0,data:"0xabcdef"}},a=new r(o,t).run();expect(a.subcontextCallbacks).toHaveLength(1);const n=a.subcontextCallbacks[0],s=await n();expect(s).toEqual({error:new Error("Failed to get proxy address"),type:e.ERROR}),expect(o.sendCommand).toHaveBeenCalledWith(expect.any(N)),expect(x.getFieldContext).not.toHaveBeenCalled()}),it("should use correct device model id in context",async()=>{const c={type:e.PROXY_INFO,payload:"proxy payload"},t={...l,context:c,deviceModelId:b.NANO_SP,subset:{...l.subset,to:"0x1234567890123456789012345678901234567890",data:"0xabcdef"}};x.getFieldContext.mockResolvedValue({type:e.PROXY_INFO,payload:"proxy result"});const a=new r(o,t).run();expect(a.subcontextCallbacks).toHaveLength(1);const n=a.subcontextCallbacks[0];await n(),expect(x.getFieldContext).toHaveBeenCalledWith({chainId:1,proxyAddress:"0x1234567890123456789012345678901234567890",calldata:"0xabcdef",deviceModelId:b.NANO_SP,challenge:"test-challenge"},e.PROXY_INFO)})}),describe("edge cases",()=>{it("should handle value array shorter than 20 bytes for address extraction",async()=>{const c={type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"test payload",reference:{type:d.TOKEN,valuePath:[{type:"TUPLE",offset:0}]}},t={...l,context:c},a=[new Uint8Array([1,2,3])];p.extractValue.mockReturnValue(y(a)),x.getFieldContext.mockResolvedValue({type:e.ERROR,message:"Invalid address"});const n=new r(o,t).run();expect(n.subcontextCallbacks).toHaveLength(1);const s=n.subcontextCallbacks[0],u=await s();expect(u).toEqual({type:e.ERROR,message:"Invalid address"}),expect(x.getFieldContext).toHaveBeenCalledWith({chainId:1,address:"0x010203"},e.TOKEN)}),it("should handle empty value array",async()=>{const c={type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"test payload",reference:{type:d.TOKEN,valuePath:[{type:"TUPLE",offset:0}]}},t={...l,context:c},a=[new Uint8Array([])];p.extractValue.mockReturnValue(y(a)),x.getFieldContext.mockResolvedValue({type:e.TOKEN,payload:"token result"});const n=new r(o,t).run();expect(n.subcontextCallbacks).toHaveLength(1);const s=n.subcontextCallbacks[0],u=await s();expect(u).toEqual({type:e.TOKEN,payload:"token result"}),expect(x.getFieldContext).toHaveBeenCalledWith({chainId:1,address:"0x"},e.TOKEN)})})});
1
+ import{ClearSignContextReferenceType as d,ClearSignContextType as e}from"@ledgerhq/context-module";import{CommandResultFactory as h,DeviceModelId as b,UnknownDeviceExchangeError as E}from"@ledgerhq/device-management-kit";import{Left as S,Right as y}from"purify-ts";import{GetChallengeCommand as N}from"../../app-binder/command/GetChallengeCommand";import{makeDeviceActionInternalApiMock as R}from"../../app-binder/device-action/__test-utils__/makeInternalApi";import{BuildSubcontextsTask as r}from"./BuildSubcontextsTask";describe("BuildSubcontextsTask",()=>{const x={getFieldContext:vi.fn()},p={extractValue:vi.fn()},o=R();let l;beforeEach(()=>{vi.resetAllMocks(),l={context:{type:e.TRANSACTION_INFO,payload:"test payload"},contextOptional:[],transactionParser:p,subset:{chainId:1,data:"0x",selector:"0x",to:"0x",value:BigInt(0)},contextModule:x,deviceModelId:b.STAX}}),describe("when context type is a simple type",()=>{const c=[e.TRANSACTION_INFO,e.TRANSACTION_CHECK,e.PLUGIN,e.EXTERNAL_PLUGIN,e.DYNAMIC_NETWORK,e.DYNAMIC_NETWORK_ICON,e.ENUM,e.TRUSTED_NAME,e.TOKEN,e.NFT];it.each(c)("should return context with empty subcontextCallbacks for %s",t=>{const n={...l,context:{type:t,payload:"test payload"}},s=new r(o,n).run();expect(s.subcontextCallbacks).toHaveLength(0)})}),describe("when context has a direct value reference",()=>{it("should create a callback to get context with the direct value",async()=>{const c={type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"test payload",reference:{type:d.TOKEN,value:"0x1234567890123456789012345678901234567890"}},t={...l,context:c},a={chainId:1,address:"0x1234567890123456789012345678901234567890"},n=new r(o,t).run();expect(n.subcontextCallbacks).toHaveLength(1);const s=n.subcontextCallbacks[0];await s(),expect(x.getFieldContext).toHaveBeenCalledWith(a,e.TOKEN)}),it("should handle undefined value in reference",()=>{const c={type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"test payload",reference:void 0},t={...l,context:c},a=new r(o,t).run();expect(a.subcontextCallbacks).toHaveLength(0)})}),describe("when context has a valuePath reference",()=>{beforeEach(()=>{o.sendCommand.mockResolvedValue(h({data:{challenge:"test-challenge"}}))}),describe("when extractValue returns Left (error)",()=>{it("should return context with empty subcontextCallbacks",()=>{const c={type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"test payload",reference:{type:d.TOKEN,valuePath:[{type:"SLICE",start:0,end:20}]}},t={...l,context:c};p.extractValue.mockReturnValue(S(new Error("Extraction failed")));const a=new r(o,t).run();expect(a.subcontextCallbacks).toHaveLength(0)})}),describe("when extractValue returns Right with values",()=>{describe("for ENUM type",()=>{it("should create callbacks for matching enum contexts",async()=>{const c={type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"test payload",reference:{type:d.ENUM,id:1,valuePath:[{type:"TUPLE",offset:0}]}},t={type:e.ENUM,id:1,value:1,payload:"enum context 1"},a={type:e.ENUM,id:1,value:2,payload:"enum context 2"},n={type:e.ENUM,id:2,value:2,payload:"enum context 3"},s={...l,context:c,contextOptional:[t,a,n]},u=[new Uint8Array([1,2])];p.extractValue.mockReturnValue(y(u));const i=new r(o,s).run();expect(i.subcontextCallbacks).toHaveLength(1);const C=i.subcontextCallbacks[0],g=await C();expect(g).toEqual(a)}),it("should create callbacks for matching enum contexts with two values",async()=>{const c={type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"test payload",reference:{type:d.ENUM,id:1,valuePath:[{type:"TUPLE",offset:0}]}},t={type:e.ENUM,id:1,value:1,payload:"enum context 1"},a={type:e.ENUM,id:1,value:2,payload:"enum context 2"},n={type:e.ENUM,id:2,value:2,payload:"enum context 3"},s={...l,context:c,contextOptional:[t,a,n]},u=[new Uint8Array([1,2]),new Uint8Array([3,2,1])];p.extractValue.mockReturnValue(y(u));const i=new r(o,s).run();expect(i.subcontextCallbacks).toHaveLength(2);const C=i.subcontextCallbacks[0],g=i.subcontextCallbacks[1],T=await C(),k=await g();expect(T).toEqual(a),expect(k).toEqual(t)}),it("should skip when enum value is undefined",()=>{const c={type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"test payload",reference:{type:d.ENUM,id:1,valuePath:[{type:"TUPLE",offset:0}]}},t={...l,context:c},a=[new Uint8Array([])];p.extractValue.mockReturnValue(y(a));const n=new r(o,t).run();expect(n.subcontextCallbacks).toHaveLength(0)}),it("should create callback with enum id 0",async()=>{const c={type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"test payload",reference:{type:d.ENUM,id:0,valuePath:[{type:"TUPLE",offset:0}]}},t={type:e.ENUM,id:0,value:0,payload:"enum context 1"},a={type:e.ENUM,id:1,value:1,payload:"enum context 2"},n={...l,context:c,contextOptional:[t,a]},s=[new Uint8Array([1,0])];p.extractValue.mockReturnValue(y(s));const u=new r(o,n).run();expect(u.subcontextCallbacks).toHaveLength(1);const i=u.subcontextCallbacks[0],C=await i();expect(C).toEqual(t)}),it("should skip when no matching enum context found",()=>{const c={type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"test payload",reference:{type:d.ENUM,id:1,valuePath:[{type:"TUPLE",offset:0}]}},t={type:e.ENUM,id:2,value:2,payload:"enum context"},a={...l,context:c,contextOptional:[t]},n=[new Uint8Array([1,2])];p.extractValue.mockReturnValue(y(n));const s=new r(o,a).run();expect(s.subcontextCallbacks).toHaveLength(0)})}),describe("for TOKEN type",()=>{it("should create callbacks to get token context",async()=>{const c={type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"test payload",reference:{type:d.TOKEN,valuePath:[{type:"TUPLE",offset:0}]}},t={...l,context:c},a=[new Uint8Array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22])];p.extractValue.mockReturnValue(y(a)),x.getFieldContext.mockResolvedValue({type:e.TOKEN,payload:"token result"});const n=new r(o,t).run();expect(n.subcontextCallbacks).toHaveLength(1);const s=n.subcontextCallbacks[0],u=await s();expect(u).toEqual({type:e.TOKEN,payload:"token result"}),expect(x.getFieldContext).toHaveBeenCalledWith({chainId:1,address:"0x030405060708090a0b0c0d0e0f10111213141516"},e.TOKEN)}),it("should create callbacks to get token as constant",async()=>{const c={type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"test payload",reference:{type:d.TOKEN,value:"0x030405060708090a0b0c0d0e0f10111213141516"}},t={...l,context:c};x.getFieldContext.mockResolvedValue({type:e.TOKEN,payload:"token result"});const a=new r(o,t).run();expect(a.subcontextCallbacks).toHaveLength(1);const n=a.subcontextCallbacks[0],s=await n();expect(s).toEqual({type:e.TOKEN,payload:"token result"}),expect(x.getFieldContext).toHaveBeenCalledWith({chainId:1,address:"0x030405060708090a0b0c0d0e0f10111213141516"},e.TOKEN)})}),describe("for NFT type",()=>{it("should create callbacks to get NFT context",async()=>{const c={type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"test payload",reference:{type:d.NFT,valuePath:[{type:"TUPLE",offset:0}]}},t={...l,context:c},a=[new Uint8Array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22])];p.extractValue.mockReturnValue(y(a)),x.getFieldContext.mockResolvedValue({type:e.NFT,payload:"nft result"});const n=new r(o,t).run();expect(n.subcontextCallbacks).toHaveLength(1);const s=n.subcontextCallbacks[0],u=await s();expect(u).toEqual({type:e.NFT,payload:"nft result"}),expect(x.getFieldContext).toHaveBeenCalledWith({chainId:1,address:"0x030405060708090a0b0c0d0e0f10111213141516"},e.NFT)}),it("should create callbacks to get NFT as constant",async()=>{const c={type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"test payload",reference:{type:d.NFT,value:"0x030405060708090a0b0c0d0e0f10111213141516"}},t={...l,context:c};x.getFieldContext.mockResolvedValue({type:e.NFT,payload:"nft result"});const a=new r(o,t).run();expect(a.subcontextCallbacks).toHaveLength(1);const n=a.subcontextCallbacks[0],s=await n();expect(s).toEqual({type:e.NFT,payload:"nft result"}),expect(x.getFieldContext).toHaveBeenCalledWith({chainId:1,address:"0x030405060708090a0b0c0d0e0f10111213141516"},e.NFT)})}),describe("for TRUSTED_NAME type",()=>{it("should create callbacks to get trusted name context with challenge",async()=>{const c={type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"test payload",reference:{type:d.TRUSTED_NAME,valuePath:[{type:"TUPLE",offset:0}],types:["type1","type2"],sources:["source1","source2"]}},t={...l,context:c},a=[new Uint8Array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22])];p.extractValue.mockReturnValue(y(a)),x.getFieldContext.mockResolvedValue({type:e.TRUSTED_NAME,payload:"trusted name result"});const n=new r(o,t).run();expect(n.subcontextCallbacks).toHaveLength(1);const s=n.subcontextCallbacks[0],u=await s();expect(u).toEqual({type:e.TRUSTED_NAME,payload:"trusted name result"}),expect(o.sendCommand).toHaveBeenCalledWith(expect.any(N)),expect(x.getFieldContext).toHaveBeenCalledWith({chainId:1,address:"0x030405060708090a0b0c0d0e0f10111213141516",challenge:"test-challenge",types:["type1","type2"],sources:["source1","source2"],deviceModelId:b.STAX},e.TRUSTED_NAME)}),it("should handle challenge command failure",async()=>{const c={type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"test payload",reference:{type:d.TRUSTED_NAME,valuePath:[{type:"TUPLE",offset:0}],types:["type1"],sources:["source1"]}},t={...l,context:c},a=[new Uint8Array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22])];p.extractValue.mockReturnValue(y(a));const n=new E("Failed");o.sendCommand.mockResolvedValueOnce(h({error:n}));const s=new r(o,t).run();expect(s.subcontextCallbacks).toHaveLength(1);const u=s.subcontextCallbacks[0],i=await u();expect(i).toEqual({error:new Error("Failed to get challenge"),type:e.ERROR})})}),describe("for multiple values",()=>{it("should create callbacks for each extracted value",async()=>{const c={type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"test payload",reference:{type:d.TOKEN,valuePath:[{type:"TUPLE",offset:0}]}},t={...l,context:c},a=[new Uint8Array([1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22]),new Uint8Array([33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54])];p.extractValue.mockReturnValue(y(a)),x.getFieldContext.mockResolvedValueOnce({type:e.TOKEN,payload:"token result 1"}),x.getFieldContext.mockResolvedValueOnce({type:e.TOKEN,payload:"token result 2"});const n=new r(o,t).run();expect(n.subcontextCallbacks).toHaveLength(2);const s=n.subcontextCallbacks[0],u=n.subcontextCallbacks[1],i=await s(),C=await u();expect(i).toEqual({type:e.TOKEN,payload:"token result 1"}),expect(C).toEqual({type:e.TOKEN,payload:"token result 2"}),expect(x.getFieldContext).toHaveBeenCalledTimes(2),expect(x.getFieldContext).toHaveBeenNthCalledWith(1,{chainId:1,address:"0x030405060708090a0b0c0d0e0f10111213141516"},e.TOKEN),expect(x.getFieldContext).toHaveBeenNthCalledWith(2,{chainId:1,address:"0x232425262728292a2b2c2d2e2f30313233343536"},e.TOKEN)})})})}),describe("when context has no reference",()=>{it("should return context with empty subcontextCallbacks",()=>{const c={type:e.TOKEN,payload:"test payload"},t={...l,context:c},a=new r(o,t).run();expect(a.subcontextCallbacks).toHaveLength(0)})}),describe("when context has reference but no valuePath",()=>{it("should return context with empty subcontextCallbacks",()=>{const c={type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"test payload",reference:{type:d.TOKEN,valuePath:void 0}},t={...l,context:c},a=new r(o,t).run();expect(a.subcontextCallbacks).toHaveLength(0)})}),describe("error handling",()=>{it("should throw error for uncovered context type",()=>{const t={...l,context:{type:"UNKNOWN_TYPE",payload:"test payload"}};expect(()=>new r(o,t).run()).toThrow("Uncovered type: UNKNOWN_TYPE")}),it("should throw error for uncovered reference type",()=>{const c={type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"test payload",reference:{type:"UNKNOWN_REFERENCE_TYPE"}},t={...l,context:c};expect(()=>new r(o,t).run()).toThrow("Uncovered reference type: UNKNOWN_REFERENCE_TYPE")})}),describe("CALLDATA reference type",()=>{it("should return empty subcontextCallbacks for CALLDATA reference",()=>{const c={type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"test payload",reference:{type:d.CALLDATA,callee:[{type:"TUPLE",offset:0}],valuePath:[{type:"TUPLE",offset:0}]}},t={...l,context:c},a=new r(o,t).run();expect(a.subcontextCallbacks).toHaveLength(0)})}),describe("references without valuePath",()=>{it("should return empty subcontextCallbacks for ENUM reference without valuePath",()=>{const c={type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"test payload",reference:{type:d.ENUM,id:1,valuePath:void 0}},t={...l,context:c},a=new r(o,t).run();expect(a.subcontextCallbacks).toHaveLength(0)}),it("should return empty subcontextCallbacks for TRUSTED_NAME reference without valuePath",()=>{const c={type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"test payload",reference:{type:d.TRUSTED_NAME,types:["type1"],sources:["source1"],valuePath:void 0}},t={...l,context:c},a=new r(o,t).run();expect(a.subcontextCallbacks).toHaveLength(0)})}),describe("PROXY_INFO context type",()=>{beforeEach(()=>{o.sendCommand.mockResolvedValue(h({data:{challenge:"test-challenge"}}))}),it("should create callback to get proxy delegate call context",async()=>{const c={type:e.PROXY_INFO,payload:"proxy payload"},t={...l,context:c,subset:{...l.subset,to:"0x1234567890123456789012345678901234567890",data:"0xabcdef"}};x.getFieldContext.mockResolvedValue({type:e.PROXY_INFO,payload:"proxy result"});const a=new r(o,t).run();expect(a.subcontextCallbacks).toHaveLength(1);const n=a.subcontextCallbacks[0],s=await n();expect(s).toEqual({type:e.PROXY_INFO,payload:"proxy result"}),expect(o.sendCommand).toHaveBeenCalledWith(expect.any(N)),expect(x.getFieldContext).toHaveBeenCalledWith({chainId:1,proxyAddress:"0x1234567890123456789012345678901234567890",calldata:"0xabcdef",deviceModelId:b.STAX,challenge:"test-challenge"},e.PROXY_INFO)}),it("should handle challenge command failure",async()=>{const c={type:e.PROXY_INFO,payload:"proxy payload"},t={...l,context:c,subset:{...l.subset,to:"0x1234567890123456789012345678901234567890",data:"0xabcdef"}},a=new E("Failed");o.sendCommand.mockResolvedValueOnce(h({error:a}));const n=new r(o,t).run();expect(n.subcontextCallbacks).toHaveLength(1);const s=n.subcontextCallbacks[0],u=await s();expect(u).toEqual({error:new Error("Failed to get challenge"),type:e.ERROR}),expect(o.sendCommand).toHaveBeenCalledWith(expect.any(N)),expect(x.getFieldContext).not.toHaveBeenCalled()}),it("should handle missing proxy address",async()=>{const c={type:e.PROXY_INFO,payload:"proxy payload"},t={...l,context:c,subset:{...l.subset,to:void 0,data:"0xabcdef"}},a=new r(o,t).run();expect(a.subcontextCallbacks).toHaveLength(1);const n=a.subcontextCallbacks[0],s=await n();expect(s).toEqual({error:new Error("Failed to get proxy address"),type:e.ERROR}),expect(o.sendCommand).toHaveBeenCalledWith(expect.any(N)),expect(x.getFieldContext).not.toHaveBeenCalled()}),it("should use correct device model id in context",async()=>{const c={type:e.PROXY_INFO,payload:"proxy payload"},t={...l,context:c,deviceModelId:b.NANO_SP,subset:{...l.subset,to:"0x1234567890123456789012345678901234567890",data:"0xabcdef"}};x.getFieldContext.mockResolvedValue({type:e.PROXY_INFO,payload:"proxy result"});const a=new r(o,t).run();expect(a.subcontextCallbacks).toHaveLength(1);const n=a.subcontextCallbacks[0];await n(),expect(x.getFieldContext).toHaveBeenCalledWith({chainId:1,proxyAddress:"0x1234567890123456789012345678901234567890",calldata:"0xabcdef",deviceModelId:b.NANO_SP,challenge:"test-challenge"},e.PROXY_INFO)})}),describe("edge cases",()=>{it("should handle value array shorter than 20 bytes for address extraction",async()=>{const c={type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"test payload",reference:{type:d.TOKEN,valuePath:[{type:"TUPLE",offset:0}]}},t={...l,context:c},a=[new Uint8Array([1,2,3])];p.extractValue.mockReturnValue(y(a)),x.getFieldContext.mockResolvedValue({type:e.ERROR,message:"Invalid address"});const n=new r(o,t).run();expect(n.subcontextCallbacks).toHaveLength(1);const s=n.subcontextCallbacks[0],u=await s();expect(u).toEqual({type:e.ERROR,message:"Invalid address"}),expect(x.getFieldContext).toHaveBeenCalledWith({chainId:1,address:"0x010203"},e.TOKEN)}),it("should handle empty value array",async()=>{const c={type:e.TRANSACTION_FIELD_DESCRIPTION,payload:"test payload",reference:{type:d.TOKEN,valuePath:[{type:"TUPLE",offset:0}]}},t={...l,context:c},a=[new Uint8Array([])];p.extractValue.mockReturnValue(y(a)),x.getFieldContext.mockResolvedValue({type:e.TOKEN,payload:"token result"});const n=new r(o,t).run();expect(n.subcontextCallbacks).toHaveLength(1);const s=n.subcontextCallbacks[0],u=await s();expect(u).toEqual({type:e.TOKEN,payload:"token result"}),expect(x.getFieldContext).toHaveBeenCalledWith({chainId:1,address:"0x"},e.TOKEN)})})});
2
2
  //# sourceMappingURL=BuildSubcontextsTask.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/task/BuildSubcontextsTask.test.ts"],
4
- "sourcesContent": ["import {\n type ClearSignContextReference,\n ClearSignContextReferenceType,\n type ClearSignContextSuccess,\n ClearSignContextType,\n type ContextModule,\n type GenericPath,\n} from \"@ledgerhq/context-module\";\nimport {\n CommandResultFactory,\n DeviceModelId,\n UnknownDeviceExchangeError,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\n\nimport { GetChallengeCommand } from \"@internal/app-binder/command/GetChallengeCommand\";\nimport { makeDeviceActionInternalApiMock } from \"@internal/app-binder/device-action/__test-utils__/makeInternalApi\";\nimport { type TransactionParserService } from \"@internal/transaction/service/parser/TransactionParserService\";\n\nimport {\n BuildSubcontextsTask,\n type BuildSubcontextsTaskArgs,\n} from \"./BuildSubcontextsTask\";\n\ndescribe(\"BuildSubcontextsTask\", () => {\n const contextModuleMock = {\n getFieldContext: vi.fn(),\n };\n const transactionParserMock = {\n extractValue: vi.fn(),\n };\n const apiMock = makeDeviceActionInternalApiMock();\n\n let defaultArgs: BuildSubcontextsTaskArgs;\n\n beforeEach(() => {\n vi.resetAllMocks();\n defaultArgs = {\n context: {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"test payload\",\n },\n contextOptional: [],\n transactionParser:\n transactionParserMock as unknown as TransactionParserService,\n subset: {\n chainId: 1,\n data: \"0x\",\n selector: \"0x\",\n to: \"0x\",\n value: BigInt(0),\n },\n contextModule: contextModuleMock as unknown as ContextModule,\n deviceModelId: DeviceModelId.STAX,\n };\n });\n\n describe(\"when context type is a simple type\", () => {\n const simpleTypes: ClearSignContextSuccess[\"type\"][] = [\n ClearSignContextType.TRANSACTION_INFO,\n ClearSignContextType.WEB3_CHECK,\n ClearSignContextType.PLUGIN,\n ClearSignContextType.EXTERNAL_PLUGIN,\n ClearSignContextType.DYNAMIC_NETWORK,\n ClearSignContextType.DYNAMIC_NETWORK_ICON,\n ClearSignContextType.ENUM,\n ClearSignContextType.TRUSTED_NAME,\n ClearSignContextType.TOKEN,\n ClearSignContextType.NFT,\n ];\n\n it.each(simpleTypes)(\n \"should return context with empty subcontextCallbacks for %s\",\n (type) => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type,\n payload: \"test payload\",\n } as ClearSignContextSuccess;\n const args = { ...defaultArgs, context };\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(0);\n },\n );\n });\n\n describe(\"when context has a direct value reference\", () => {\n it(\"should create a callback to get context with the direct value\", async () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextReferenceType.TOKEN,\n value: \"0x1234567890123456789012345678901234567890\",\n },\n };\n const args = { ...defaultArgs, context };\n const expectedContext = {\n chainId: 1,\n address: \"0x1234567890123456789012345678901234567890\",\n };\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(1);\n\n // Verify the callback calls getContext with correct parameters\n const callback = result.subcontextCallbacks[0]!;\n await callback();\n expect(contextModuleMock.getFieldContext).toHaveBeenCalledWith(\n expectedContext,\n ClearSignContextType.TOKEN,\n );\n });\n\n it(\"should handle undefined value in reference\", () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"test payload\",\n reference: undefined as unknown as ClearSignContextReference,\n };\n const args = { ...defaultArgs, context };\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(0);\n });\n });\n\n describe(\"when context has a valuePath reference\", () => {\n beforeEach(() => {\n apiMock.sendCommand.mockResolvedValue(\n CommandResultFactory({ data: { challenge: \"test-challenge\" } }),\n );\n });\n\n describe(\"when extractValue returns Left (error)\", () => {\n it(\"should return context with empty subcontextCallbacks\", () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextReferenceType.TOKEN,\n valuePath: [{ type: \"SLICE\", start: 0, end: 20 }],\n },\n };\n const args = { ...defaultArgs, context };\n transactionParserMock.extractValue.mockReturnValue(\n Left(new Error(\"Extraction failed\")),\n );\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(0);\n });\n });\n\n describe(\"when extractValue returns Right with values\", () => {\n describe(\"for ENUM type\", () => {\n it(\"should create callbacks for matching enum contexts\", async () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextReferenceType.ENUM,\n id: 1,\n valuePath: [{ type: \"TUPLE\", offset: 0 }],\n },\n };\n // enum with the same id but different value\n const enumContext1: ClearSignContextSuccess = {\n type: ClearSignContextType.ENUM,\n id: 1,\n value: 1,\n payload: \"enum context 1\",\n };\n // enum to select, id and value match\n const enumContext2: ClearSignContextSuccess = {\n type: ClearSignContextType.ENUM,\n id: 1,\n value: 2,\n payload: \"enum context 2\",\n };\n // other enum context with different id\n const enumContext3: ClearSignContextSuccess = {\n type: ClearSignContextType.ENUM,\n id: 2,\n value: 2,\n payload: \"enum context 3\",\n };\n const args = {\n ...defaultArgs,\n context,\n contextOptional: [enumContext1, enumContext2, enumContext3],\n };\n const extractedValues = [new Uint8Array([0x01, 0x02])]; // Last byte is 2\n transactionParserMock.extractValue.mockReturnValue(\n Right(extractedValues),\n );\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(1);\n const callback = result.subcontextCallbacks[0]!;\n const callbackResult = await callback();\n expect(callbackResult).toEqual(enumContext2);\n });\n\n it(\"should create callbacks for matching enum contexts with two values\", async () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextReferenceType.ENUM,\n id: 1,\n valuePath: [{ type: \"TUPLE\", offset: 0 }],\n },\n };\n // enum to select, id and value match\n const enumContext1: ClearSignContextSuccess = {\n type: ClearSignContextType.ENUM,\n id: 1,\n value: 1,\n payload: \"enum context 1\",\n };\n // enum to select, id and value match\n const enumContext2: ClearSignContextSuccess = {\n type: ClearSignContextType.ENUM,\n id: 1,\n value: 2,\n payload: \"enum context 2\",\n };\n // other enum context with different id\n const enumContext3: ClearSignContextSuccess = {\n type: ClearSignContextType.ENUM,\n id: 2,\n value: 2,\n payload: \"enum context 3\",\n };\n const args = {\n ...defaultArgs,\n context,\n contextOptional: [enumContext1, enumContext2, enumContext3],\n };\n const extractedValues = [\n new Uint8Array([0x01, 0x02]),\n new Uint8Array([0x03, 0x02, 0x01]),\n ]; // Last byte is 2\n transactionParserMock.extractValue.mockReturnValue(\n Right(extractedValues),\n );\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(2);\n const callback1 = result.subcontextCallbacks[0]!;\n const callback2 = result.subcontextCallbacks[1]!;\n const callbackResult1 = await callback1();\n const callbackResult2 = await callback2();\n expect(callbackResult1).toEqual(enumContext2);\n expect(callbackResult2).toEqual(enumContext1);\n });\n\n it(\"should skip when enum value is undefined\", () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextReferenceType.ENUM,\n id: 1,\n valuePath: [{ type: \"TUPLE\", offset: 0 }],\n },\n };\n const args = { ...defaultArgs, context };\n const extractedValues = [new Uint8Array([])]; // Empty array\n transactionParserMock.extractValue.mockReturnValue(\n Right(extractedValues),\n );\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(0);\n });\n\n it(\"should create callback with enum id 0\", async () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextReferenceType.ENUM,\n id: 0,\n valuePath: [{ type: \"TUPLE\", offset: 0 }],\n },\n };\n const enumContext1: ClearSignContextSuccess = {\n type: ClearSignContextType.ENUM,\n id: 0,\n value: 0,\n payload: \"enum context 1\",\n };\n const enumContext2: ClearSignContextSuccess = {\n type: ClearSignContextType.ENUM,\n id: 1,\n value: 1,\n payload: \"enum context 2\",\n };\n const args = {\n ...defaultArgs,\n context,\n contextOptional: [enumContext1, enumContext2],\n };\n const extractedValues = [new Uint8Array([0x01, 0x00])];\n transactionParserMock.extractValue.mockReturnValue(\n Right(extractedValues),\n );\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(1);\n const callback = result.subcontextCallbacks[0]!;\n const callbackResult = await callback();\n expect(callbackResult).toEqual(enumContext1);\n });\n\n it(\"should skip when no matching enum context found\", () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextReferenceType.ENUM,\n id: 1,\n valuePath: [{ type: \"TUPLE\", offset: 0 }],\n },\n };\n const enumContext: ClearSignContextSuccess = {\n type: ClearSignContextType.ENUM,\n id: 2, // Different ID\n value: 2,\n payload: \"enum context\",\n };\n const args = {\n ...defaultArgs,\n context,\n contextOptional: [enumContext],\n };\n const extractedValues = [new Uint8Array([0x01, 0x02])];\n transactionParserMock.extractValue.mockReturnValue(\n Right(extractedValues),\n );\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(0);\n });\n });\n\n describe(\"for TOKEN type\", () => {\n it(\"should create callbacks to get token context\", async () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextReferenceType.TOKEN,\n valuePath: [{ type: \"TUPLE\", offset: 0 }],\n },\n };\n const args = { ...defaultArgs, context };\n const extractedValues = [\n new Uint8Array([\n 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,\n 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,\n ]),\n ];\n transactionParserMock.extractValue.mockReturnValue(\n Right(extractedValues),\n );\n contextModuleMock.getFieldContext.mockResolvedValue({\n type: ClearSignContextType.TOKEN,\n payload: \"token result\",\n });\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(1);\n const callback = result.subcontextCallbacks[0]!;\n const callbackResult = await callback();\n expect(callbackResult).toEqual({\n type: ClearSignContextType.TOKEN,\n payload: \"token result\",\n });\n expect(contextModuleMock.getFieldContext).toHaveBeenCalledWith(\n {\n chainId: 1,\n address: \"0x030405060708090a0b0c0d0e0f10111213141516\",\n },\n ClearSignContextType.TOKEN,\n );\n });\n\n it(\"should create callbacks to get token as constant\", async () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextReferenceType.TOKEN,\n value: \"0x030405060708090a0b0c0d0e0f10111213141516\",\n },\n };\n const args = { ...defaultArgs, context };\n contextModuleMock.getFieldContext.mockResolvedValue({\n type: ClearSignContextType.TOKEN,\n payload: \"token result\",\n });\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(1);\n const callback = result.subcontextCallbacks[0]!;\n const callbackResult = await callback();\n expect(callbackResult).toEqual({\n type: ClearSignContextType.TOKEN,\n payload: \"token result\",\n });\n expect(contextModuleMock.getFieldContext).toHaveBeenCalledWith(\n {\n chainId: 1,\n address: \"0x030405060708090a0b0c0d0e0f10111213141516\",\n },\n ClearSignContextType.TOKEN,\n );\n });\n });\n\n describe(\"for NFT type\", () => {\n it(\"should create callbacks to get NFT context\", async () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextReferenceType.NFT,\n valuePath: [{ type: \"TUPLE\", offset: 0 }],\n },\n };\n const args = { ...defaultArgs, context };\n const extractedValues = [\n new Uint8Array([\n 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,\n 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,\n ]),\n ];\n transactionParserMock.extractValue.mockReturnValue(\n Right(extractedValues),\n );\n contextModuleMock.getFieldContext.mockResolvedValue({\n type: ClearSignContextType.NFT,\n payload: \"nft result\",\n });\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(1);\n const callback = result.subcontextCallbacks[0]!;\n const callbackResult = await callback();\n expect(callbackResult).toEqual({\n type: ClearSignContextType.NFT,\n payload: \"nft result\",\n });\n expect(contextModuleMock.getFieldContext).toHaveBeenCalledWith(\n {\n chainId: 1,\n address: \"0x030405060708090a0b0c0d0e0f10111213141516\",\n },\n ClearSignContextType.NFT,\n );\n });\n\n it(\"should create callbacks to get NFT as constant\", async () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextReferenceType.NFT,\n value: \"0x030405060708090a0b0c0d0e0f10111213141516\",\n },\n };\n const args = { ...defaultArgs, context };\n contextModuleMock.getFieldContext.mockResolvedValue({\n type: ClearSignContextType.NFT,\n payload: \"nft result\",\n });\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(1);\n const callback = result.subcontextCallbacks[0]!;\n const callbackResult = await callback();\n expect(callbackResult).toEqual({\n type: ClearSignContextType.NFT,\n payload: \"nft result\",\n });\n expect(contextModuleMock.getFieldContext).toHaveBeenCalledWith(\n {\n chainId: 1,\n address: \"0x030405060708090a0b0c0d0e0f10111213141516\",\n },\n ClearSignContextType.NFT,\n );\n });\n });\n\n describe(\"for TRUSTED_NAME type\", () => {\n it(\"should create callbacks to get trusted name context with challenge\", async () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextReferenceType.TRUSTED_NAME,\n valuePath: [{ type: \"TUPLE\", offset: 0 }],\n types: [\"type1\", \"type2\"],\n sources: [\"source1\", \"source2\"],\n },\n };\n const args = { ...defaultArgs, context };\n const extractedValues = [\n new Uint8Array([\n 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,\n 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,\n ]),\n ];\n transactionParserMock.extractValue.mockReturnValue(\n Right(extractedValues),\n );\n contextModuleMock.getFieldContext.mockResolvedValue({\n type: ClearSignContextType.TRUSTED_NAME,\n payload: \"trusted name result\",\n });\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(1);\n const callback = result.subcontextCallbacks[0]!;\n const callbackResult = await callback();\n expect(callbackResult).toEqual({\n type: ClearSignContextType.TRUSTED_NAME,\n payload: \"trusted name result\",\n });\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n expect.any(GetChallengeCommand),\n );\n expect(contextModuleMock.getFieldContext).toHaveBeenCalledWith(\n {\n chainId: 1,\n address: \"0x030405060708090a0b0c0d0e0f10111213141516\",\n challenge: \"test-challenge\",\n types: [\"type1\", \"type2\"],\n sources: [\"source1\", \"source2\"],\n deviceModelId: DeviceModelId.STAX,\n },\n ClearSignContextType.TRUSTED_NAME,\n );\n });\n\n it(\"should handle challenge command failure\", async () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextReferenceType.TRUSTED_NAME,\n valuePath: [{ type: \"TUPLE\", offset: 0 }],\n types: [\"type1\"],\n sources: [\"source1\"],\n },\n };\n const args = { ...defaultArgs, context };\n const extractedValues = [\n new Uint8Array([\n 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,\n 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,\n ]),\n ];\n transactionParserMock.extractValue.mockReturnValue(\n Right(extractedValues),\n );\n const error = new UnknownDeviceExchangeError(\"Failed\");\n apiMock.sendCommand.mockResolvedValueOnce(\n CommandResultFactory({\n error,\n }),\n );\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(1);\n const callback = result.subcontextCallbacks[0]!;\n const callbackResult = await callback();\n expect(callbackResult).toEqual({\n error: new Error(\"Failed to get challenge\"),\n type: ClearSignContextType.ERROR,\n });\n });\n });\n\n describe(\"for multiple values\", () => {\n it(\"should create callbacks for each extracted value\", async () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextReferenceType.TOKEN,\n valuePath: [{ type: \"TUPLE\", offset: 0 }],\n },\n };\n const args = { ...defaultArgs, context };\n const extractedValues = [\n new Uint8Array([\n 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,\n 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,\n ]),\n new Uint8Array([\n 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b,\n 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36,\n ]),\n ];\n transactionParserMock.extractValue.mockReturnValue(\n Right(extractedValues),\n );\n contextModuleMock.getFieldContext.mockResolvedValueOnce({\n type: ClearSignContextType.TOKEN,\n payload: \"token result 1\",\n });\n contextModuleMock.getFieldContext.mockResolvedValueOnce({\n type: ClearSignContextType.TOKEN,\n payload: \"token result 2\",\n });\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(2);\n const callback1 = result.subcontextCallbacks[0]!;\n const callback2 = result.subcontextCallbacks[1]!;\n const callbackResult1 = await callback1();\n const callbackResult2 = await callback2();\n expect(callbackResult1).toEqual({\n type: ClearSignContextType.TOKEN,\n payload: \"token result 1\",\n });\n expect(callbackResult2).toEqual({\n type: ClearSignContextType.TOKEN,\n payload: \"token result 2\",\n });\n expect(contextModuleMock.getFieldContext).toHaveBeenCalledTimes(2);\n expect(contextModuleMock.getFieldContext).toHaveBeenNthCalledWith(\n 1,\n {\n chainId: 1,\n address: \"0x030405060708090a0b0c0d0e0f10111213141516\",\n },\n ClearSignContextType.TOKEN,\n );\n expect(contextModuleMock.getFieldContext).toHaveBeenNthCalledWith(\n 2,\n {\n chainId: 1,\n address: \"0x232425262728292a2b2c2d2e2f30313233343536\",\n },\n ClearSignContextType.TOKEN,\n );\n });\n });\n });\n });\n\n describe(\"when context has no reference\", () => {\n it(\"should return context with empty subcontextCallbacks\", () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TOKEN,\n payload: \"test payload\",\n };\n const args = { ...defaultArgs, context };\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(0);\n });\n });\n\n describe(\"when context has reference but no valuePath\", () => {\n it(\"should return context with empty subcontextCallbacks\", () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextReferenceType.TOKEN,\n valuePath: undefined as unknown as GenericPath,\n },\n };\n const args = { ...defaultArgs, context };\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(0);\n });\n });\n\n describe(\"error handling\", () => {\n it(\"should throw error for uncovered context type\", () => {\n // GIVEN\n const context = {\n type: \"UNKNOWN_TYPE\" as ClearSignContextSuccess[\"type\"],\n payload: \"test payload\",\n } as ClearSignContextSuccess;\n const args = { ...defaultArgs, context };\n\n // WHEN / THEN\n expect(() => new BuildSubcontextsTask(apiMock, args).run()).toThrow(\n \"Uncovered type: UNKNOWN_TYPE\",\n );\n });\n\n it(\"should throw error for uncovered reference type\", () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"test payload\",\n reference: {\n type: \"UNKNOWN_REFERENCE_TYPE\" as ClearSignContextReference[\"type\"],\n } as ClearSignContextReference,\n };\n const args = { ...defaultArgs, context };\n\n // WHEN / THEN\n expect(() => new BuildSubcontextsTask(apiMock, args).run()).toThrow(\n \"Uncovered reference type: UNKNOWN_REFERENCE_TYPE\",\n );\n });\n });\n\n describe(\"CALLDATA reference type\", () => {\n it(\"should return empty subcontextCallbacks for CALLDATA reference\", () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextReferenceType.CALLDATA,\n callee: [{ type: \"TUPLE\", offset: 0 }],\n valuePath: [{ type: \"TUPLE\", offset: 0 }],\n },\n };\n const args = { ...defaultArgs, context };\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(0);\n });\n });\n\n describe(\"references without valuePath\", () => {\n it(\"should return empty subcontextCallbacks for ENUM reference without valuePath\", () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextReferenceType.ENUM,\n id: 1,\n valuePath: undefined as unknown as GenericPath,\n },\n };\n const args = { ...defaultArgs, context };\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(0);\n });\n\n it(\"should return empty subcontextCallbacks for TRUSTED_NAME reference without valuePath\", () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextReferenceType.TRUSTED_NAME,\n types: [\"type1\"],\n sources: [\"source1\"],\n valuePath: undefined as unknown as GenericPath,\n },\n };\n const args = { ...defaultArgs, context };\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(0);\n });\n });\n\n describe(\"PROXY_INFO context type\", () => {\n beforeEach(() => {\n apiMock.sendCommand.mockResolvedValue(\n CommandResultFactory({ data: { challenge: \"test-challenge\" } }),\n );\n });\n\n it(\"should create callback to get proxy delegate call context\", async () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.PROXY_INFO,\n payload: \"proxy payload\",\n };\n const args = {\n ...defaultArgs,\n context,\n subset: {\n ...defaultArgs.subset,\n to: \"0x1234567890123456789012345678901234567890\",\n data: \"0xabcdef\",\n },\n };\n contextModuleMock.getFieldContext.mockResolvedValue({\n type: ClearSignContextType.PROXY_INFO,\n payload: \"proxy result\",\n });\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(1);\n const callback = result.subcontextCallbacks[0]!;\n const callbackResult = await callback();\n\n expect(callbackResult).toEqual({\n type: ClearSignContextType.PROXY_INFO,\n payload: \"proxy result\",\n });\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n expect.any(GetChallengeCommand),\n );\n expect(contextModuleMock.getFieldContext).toHaveBeenCalledWith(\n {\n chainId: 1,\n proxyAddress: \"0x1234567890123456789012345678901234567890\",\n calldata: \"0xabcdef\",\n deviceModelId: DeviceModelId.STAX,\n challenge: \"test-challenge\",\n },\n ClearSignContextType.PROXY_INFO,\n );\n });\n\n it(\"should handle challenge command failure\", async () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.PROXY_INFO,\n payload: \"proxy payload\",\n };\n const args = {\n ...defaultArgs,\n context,\n subset: {\n ...defaultArgs.subset,\n to: \"0x1234567890123456789012345678901234567890\",\n data: \"0xabcdef\",\n },\n };\n const error = new UnknownDeviceExchangeError(\"Failed\");\n apiMock.sendCommand.mockResolvedValueOnce(\n CommandResultFactory({\n error,\n }),\n );\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(1);\n const callback = result.subcontextCallbacks[0]!;\n const callbackResult = await callback();\n\n expect(callbackResult).toEqual({\n error: new Error(\"Failed to get challenge\"),\n type: ClearSignContextType.ERROR,\n });\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n expect.any(GetChallengeCommand),\n );\n expect(contextModuleMock.getFieldContext).not.toHaveBeenCalled();\n });\n\n it(\"should handle missing proxy address\", async () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.PROXY_INFO,\n payload: \"proxy payload\",\n };\n const args = {\n ...defaultArgs,\n context,\n subset: {\n ...defaultArgs.subset,\n to: undefined,\n data: \"0xabcdef\",\n },\n };\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(1);\n const callback = result.subcontextCallbacks[0]!;\n const callbackResult = await callback();\n\n expect(callbackResult).toEqual({\n error: new Error(\"Failed to get proxy address\"),\n type: ClearSignContextType.ERROR,\n });\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n expect.any(GetChallengeCommand),\n );\n expect(contextModuleMock.getFieldContext).not.toHaveBeenCalled();\n });\n\n it(\"should use correct device model id in context\", async () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.PROXY_INFO,\n payload: \"proxy payload\",\n };\n const args = {\n ...defaultArgs,\n context,\n deviceModelId: DeviceModelId.NANO_SP,\n subset: {\n ...defaultArgs.subset,\n to: \"0x1234567890123456789012345678901234567890\",\n data: \"0xabcdef\",\n },\n };\n contextModuleMock.getFieldContext.mockResolvedValue({\n type: ClearSignContextType.PROXY_INFO,\n payload: \"proxy result\",\n });\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(1);\n const callback = result.subcontextCallbacks[0]!;\n await callback();\n\n expect(contextModuleMock.getFieldContext).toHaveBeenCalledWith(\n {\n chainId: 1,\n proxyAddress: \"0x1234567890123456789012345678901234567890\",\n calldata: \"0xabcdef\",\n deviceModelId: DeviceModelId.NANO_SP,\n challenge: \"test-challenge\",\n },\n ClearSignContextType.PROXY_INFO,\n );\n });\n });\n\n describe(\"edge cases\", () => {\n it(\"should handle value array shorter than 20 bytes for address extraction\", async () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextReferenceType.TOKEN,\n valuePath: [{ type: \"TUPLE\", offset: 0 }],\n },\n };\n const args = { ...defaultArgs, context };\n const extractedValues = [new Uint8Array([0x01, 0x02, 0x03])]; // Only 3 bytes\n transactionParserMock.extractValue.mockReturnValue(\n Right(extractedValues),\n );\n contextModuleMock.getFieldContext.mockResolvedValue({\n type: ClearSignContextType.ERROR,\n message: \"Invalid address\",\n });\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(1);\n const callback = result.subcontextCallbacks[0]!;\n const callbackResult = await callback();\n expect(callbackResult).toEqual({\n type: ClearSignContextType.ERROR,\n message: \"Invalid address\",\n });\n expect(contextModuleMock.getFieldContext).toHaveBeenCalledWith(\n {\n chainId: 1,\n address: \"0x010203\",\n },\n ClearSignContextType.TOKEN,\n );\n });\n\n it(\"should handle empty value array\", async () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextReferenceType.TOKEN,\n valuePath: [{ type: \"TUPLE\", offset: 0 }],\n },\n };\n const args = { ...defaultArgs, context };\n const extractedValues = [new Uint8Array([])]; // Empty array\n transactionParserMock.extractValue.mockReturnValue(\n Right(extractedValues),\n );\n contextModuleMock.getFieldContext.mockResolvedValue({\n type: ClearSignContextType.TOKEN,\n payload: \"token result\",\n });\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(1);\n\n // Verify the callback calls getContext with empty address\n const callback = result.subcontextCallbacks[0]!;\n const callbackResult = await callback();\n expect(callbackResult).toEqual({\n type: ClearSignContextType.TOKEN,\n payload: \"token result\",\n });\n expect(contextModuleMock.getFieldContext).toHaveBeenCalledWith(\n {\n chainId: 1,\n address: \"0x\",\n },\n ClearSignContextType.TOKEN,\n );\n });\n });\n});\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["import {\n type ClearSignContextReference,\n ClearSignContextReferenceType,\n type ClearSignContextSuccess,\n ClearSignContextType,\n type ContextModule,\n type GenericPath,\n} from \"@ledgerhq/context-module\";\nimport {\n CommandResultFactory,\n DeviceModelId,\n UnknownDeviceExchangeError,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\n\nimport { GetChallengeCommand } from \"@internal/app-binder/command/GetChallengeCommand\";\nimport { makeDeviceActionInternalApiMock } from \"@internal/app-binder/device-action/__test-utils__/makeInternalApi\";\nimport { type TransactionParserService } from \"@internal/transaction/service/parser/TransactionParserService\";\n\nimport {\n BuildSubcontextsTask,\n type BuildSubcontextsTaskArgs,\n} from \"./BuildSubcontextsTask\";\n\ndescribe(\"BuildSubcontextsTask\", () => {\n const contextModuleMock = {\n getFieldContext: vi.fn(),\n };\n const transactionParserMock = {\n extractValue: vi.fn(),\n };\n const apiMock = makeDeviceActionInternalApiMock();\n\n let defaultArgs: BuildSubcontextsTaskArgs;\n\n beforeEach(() => {\n vi.resetAllMocks();\n defaultArgs = {\n context: {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"test payload\",\n },\n contextOptional: [],\n transactionParser:\n transactionParserMock as unknown as TransactionParserService,\n subset: {\n chainId: 1,\n data: \"0x\",\n selector: \"0x\",\n to: \"0x\",\n value: BigInt(0),\n },\n contextModule: contextModuleMock as unknown as ContextModule,\n deviceModelId: DeviceModelId.STAX,\n };\n });\n\n describe(\"when context type is a simple type\", () => {\n const simpleTypes: ClearSignContextSuccess[\"type\"][] = [\n ClearSignContextType.TRANSACTION_INFO,\n ClearSignContextType.TRANSACTION_CHECK,\n ClearSignContextType.PLUGIN,\n ClearSignContextType.EXTERNAL_PLUGIN,\n ClearSignContextType.DYNAMIC_NETWORK,\n ClearSignContextType.DYNAMIC_NETWORK_ICON,\n ClearSignContextType.ENUM,\n ClearSignContextType.TRUSTED_NAME,\n ClearSignContextType.TOKEN,\n ClearSignContextType.NFT,\n ];\n\n it.each(simpleTypes)(\n \"should return context with empty subcontextCallbacks for %s\",\n (type) => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type,\n payload: \"test payload\",\n } as ClearSignContextSuccess;\n const args = { ...defaultArgs, context };\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(0);\n },\n );\n });\n\n describe(\"when context has a direct value reference\", () => {\n it(\"should create a callback to get context with the direct value\", async () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextReferenceType.TOKEN,\n value: \"0x1234567890123456789012345678901234567890\",\n },\n };\n const args = { ...defaultArgs, context };\n const expectedContext = {\n chainId: 1,\n address: \"0x1234567890123456789012345678901234567890\",\n };\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(1);\n\n // Verify the callback calls getContext with correct parameters\n const callback = result.subcontextCallbacks[0]!;\n await callback();\n expect(contextModuleMock.getFieldContext).toHaveBeenCalledWith(\n expectedContext,\n ClearSignContextType.TOKEN,\n );\n });\n\n it(\"should handle undefined value in reference\", () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"test payload\",\n reference: undefined as unknown as ClearSignContextReference,\n };\n const args = { ...defaultArgs, context };\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(0);\n });\n });\n\n describe(\"when context has a valuePath reference\", () => {\n beforeEach(() => {\n apiMock.sendCommand.mockResolvedValue(\n CommandResultFactory({ data: { challenge: \"test-challenge\" } }),\n );\n });\n\n describe(\"when extractValue returns Left (error)\", () => {\n it(\"should return context with empty subcontextCallbacks\", () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextReferenceType.TOKEN,\n valuePath: [{ type: \"SLICE\", start: 0, end: 20 }],\n },\n };\n const args = { ...defaultArgs, context };\n transactionParserMock.extractValue.mockReturnValue(\n Left(new Error(\"Extraction failed\")),\n );\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(0);\n });\n });\n\n describe(\"when extractValue returns Right with values\", () => {\n describe(\"for ENUM type\", () => {\n it(\"should create callbacks for matching enum contexts\", async () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextReferenceType.ENUM,\n id: 1,\n valuePath: [{ type: \"TUPLE\", offset: 0 }],\n },\n };\n // enum with the same id but different value\n const enumContext1: ClearSignContextSuccess = {\n type: ClearSignContextType.ENUM,\n id: 1,\n value: 1,\n payload: \"enum context 1\",\n };\n // enum to select, id and value match\n const enumContext2: ClearSignContextSuccess = {\n type: ClearSignContextType.ENUM,\n id: 1,\n value: 2,\n payload: \"enum context 2\",\n };\n // other enum context with different id\n const enumContext3: ClearSignContextSuccess = {\n type: ClearSignContextType.ENUM,\n id: 2,\n value: 2,\n payload: \"enum context 3\",\n };\n const args = {\n ...defaultArgs,\n context,\n contextOptional: [enumContext1, enumContext2, enumContext3],\n };\n const extractedValues = [new Uint8Array([0x01, 0x02])]; // Last byte is 2\n transactionParserMock.extractValue.mockReturnValue(\n Right(extractedValues),\n );\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(1);\n const callback = result.subcontextCallbacks[0]!;\n const callbackResult = await callback();\n expect(callbackResult).toEqual(enumContext2);\n });\n\n it(\"should create callbacks for matching enum contexts with two values\", async () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextReferenceType.ENUM,\n id: 1,\n valuePath: [{ type: \"TUPLE\", offset: 0 }],\n },\n };\n // enum to select, id and value match\n const enumContext1: ClearSignContextSuccess = {\n type: ClearSignContextType.ENUM,\n id: 1,\n value: 1,\n payload: \"enum context 1\",\n };\n // enum to select, id and value match\n const enumContext2: ClearSignContextSuccess = {\n type: ClearSignContextType.ENUM,\n id: 1,\n value: 2,\n payload: \"enum context 2\",\n };\n // other enum context with different id\n const enumContext3: ClearSignContextSuccess = {\n type: ClearSignContextType.ENUM,\n id: 2,\n value: 2,\n payload: \"enum context 3\",\n };\n const args = {\n ...defaultArgs,\n context,\n contextOptional: [enumContext1, enumContext2, enumContext3],\n };\n const extractedValues = [\n new Uint8Array([0x01, 0x02]),\n new Uint8Array([0x03, 0x02, 0x01]),\n ]; // Last byte is 2\n transactionParserMock.extractValue.mockReturnValue(\n Right(extractedValues),\n );\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(2);\n const callback1 = result.subcontextCallbacks[0]!;\n const callback2 = result.subcontextCallbacks[1]!;\n const callbackResult1 = await callback1();\n const callbackResult2 = await callback2();\n expect(callbackResult1).toEqual(enumContext2);\n expect(callbackResult2).toEqual(enumContext1);\n });\n\n it(\"should skip when enum value is undefined\", () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextReferenceType.ENUM,\n id: 1,\n valuePath: [{ type: \"TUPLE\", offset: 0 }],\n },\n };\n const args = { ...defaultArgs, context };\n const extractedValues = [new Uint8Array([])]; // Empty array\n transactionParserMock.extractValue.mockReturnValue(\n Right(extractedValues),\n );\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(0);\n });\n\n it(\"should create callback with enum id 0\", async () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextReferenceType.ENUM,\n id: 0,\n valuePath: [{ type: \"TUPLE\", offset: 0 }],\n },\n };\n const enumContext1: ClearSignContextSuccess = {\n type: ClearSignContextType.ENUM,\n id: 0,\n value: 0,\n payload: \"enum context 1\",\n };\n const enumContext2: ClearSignContextSuccess = {\n type: ClearSignContextType.ENUM,\n id: 1,\n value: 1,\n payload: \"enum context 2\",\n };\n const args = {\n ...defaultArgs,\n context,\n contextOptional: [enumContext1, enumContext2],\n };\n const extractedValues = [new Uint8Array([0x01, 0x00])];\n transactionParserMock.extractValue.mockReturnValue(\n Right(extractedValues),\n );\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(1);\n const callback = result.subcontextCallbacks[0]!;\n const callbackResult = await callback();\n expect(callbackResult).toEqual(enumContext1);\n });\n\n it(\"should skip when no matching enum context found\", () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextReferenceType.ENUM,\n id: 1,\n valuePath: [{ type: \"TUPLE\", offset: 0 }],\n },\n };\n const enumContext: ClearSignContextSuccess = {\n type: ClearSignContextType.ENUM,\n id: 2, // Different ID\n value: 2,\n payload: \"enum context\",\n };\n const args = {\n ...defaultArgs,\n context,\n contextOptional: [enumContext],\n };\n const extractedValues = [new Uint8Array([0x01, 0x02])];\n transactionParserMock.extractValue.mockReturnValue(\n Right(extractedValues),\n );\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(0);\n });\n });\n\n describe(\"for TOKEN type\", () => {\n it(\"should create callbacks to get token context\", async () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextReferenceType.TOKEN,\n valuePath: [{ type: \"TUPLE\", offset: 0 }],\n },\n };\n const args = { ...defaultArgs, context };\n const extractedValues = [\n new Uint8Array([\n 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,\n 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,\n ]),\n ];\n transactionParserMock.extractValue.mockReturnValue(\n Right(extractedValues),\n );\n contextModuleMock.getFieldContext.mockResolvedValue({\n type: ClearSignContextType.TOKEN,\n payload: \"token result\",\n });\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(1);\n const callback = result.subcontextCallbacks[0]!;\n const callbackResult = await callback();\n expect(callbackResult).toEqual({\n type: ClearSignContextType.TOKEN,\n payload: \"token result\",\n });\n expect(contextModuleMock.getFieldContext).toHaveBeenCalledWith(\n {\n chainId: 1,\n address: \"0x030405060708090a0b0c0d0e0f10111213141516\",\n },\n ClearSignContextType.TOKEN,\n );\n });\n\n it(\"should create callbacks to get token as constant\", async () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextReferenceType.TOKEN,\n value: \"0x030405060708090a0b0c0d0e0f10111213141516\",\n },\n };\n const args = { ...defaultArgs, context };\n contextModuleMock.getFieldContext.mockResolvedValue({\n type: ClearSignContextType.TOKEN,\n payload: \"token result\",\n });\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(1);\n const callback = result.subcontextCallbacks[0]!;\n const callbackResult = await callback();\n expect(callbackResult).toEqual({\n type: ClearSignContextType.TOKEN,\n payload: \"token result\",\n });\n expect(contextModuleMock.getFieldContext).toHaveBeenCalledWith(\n {\n chainId: 1,\n address: \"0x030405060708090a0b0c0d0e0f10111213141516\",\n },\n ClearSignContextType.TOKEN,\n );\n });\n });\n\n describe(\"for NFT type\", () => {\n it(\"should create callbacks to get NFT context\", async () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextReferenceType.NFT,\n valuePath: [{ type: \"TUPLE\", offset: 0 }],\n },\n };\n const args = { ...defaultArgs, context };\n const extractedValues = [\n new Uint8Array([\n 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,\n 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,\n ]),\n ];\n transactionParserMock.extractValue.mockReturnValue(\n Right(extractedValues),\n );\n contextModuleMock.getFieldContext.mockResolvedValue({\n type: ClearSignContextType.NFT,\n payload: \"nft result\",\n });\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(1);\n const callback = result.subcontextCallbacks[0]!;\n const callbackResult = await callback();\n expect(callbackResult).toEqual({\n type: ClearSignContextType.NFT,\n payload: \"nft result\",\n });\n expect(contextModuleMock.getFieldContext).toHaveBeenCalledWith(\n {\n chainId: 1,\n address: \"0x030405060708090a0b0c0d0e0f10111213141516\",\n },\n ClearSignContextType.NFT,\n );\n });\n\n it(\"should create callbacks to get NFT as constant\", async () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextReferenceType.NFT,\n value: \"0x030405060708090a0b0c0d0e0f10111213141516\",\n },\n };\n const args = { ...defaultArgs, context };\n contextModuleMock.getFieldContext.mockResolvedValue({\n type: ClearSignContextType.NFT,\n payload: \"nft result\",\n });\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(1);\n const callback = result.subcontextCallbacks[0]!;\n const callbackResult = await callback();\n expect(callbackResult).toEqual({\n type: ClearSignContextType.NFT,\n payload: \"nft result\",\n });\n expect(contextModuleMock.getFieldContext).toHaveBeenCalledWith(\n {\n chainId: 1,\n address: \"0x030405060708090a0b0c0d0e0f10111213141516\",\n },\n ClearSignContextType.NFT,\n );\n });\n });\n\n describe(\"for TRUSTED_NAME type\", () => {\n it(\"should create callbacks to get trusted name context with challenge\", async () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextReferenceType.TRUSTED_NAME,\n valuePath: [{ type: \"TUPLE\", offset: 0 }],\n types: [\"type1\", \"type2\"],\n sources: [\"source1\", \"source2\"],\n },\n };\n const args = { ...defaultArgs, context };\n const extractedValues = [\n new Uint8Array([\n 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,\n 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,\n ]),\n ];\n transactionParserMock.extractValue.mockReturnValue(\n Right(extractedValues),\n );\n contextModuleMock.getFieldContext.mockResolvedValue({\n type: ClearSignContextType.TRUSTED_NAME,\n payload: \"trusted name result\",\n });\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(1);\n const callback = result.subcontextCallbacks[0]!;\n const callbackResult = await callback();\n expect(callbackResult).toEqual({\n type: ClearSignContextType.TRUSTED_NAME,\n payload: \"trusted name result\",\n });\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n expect.any(GetChallengeCommand),\n );\n expect(contextModuleMock.getFieldContext).toHaveBeenCalledWith(\n {\n chainId: 1,\n address: \"0x030405060708090a0b0c0d0e0f10111213141516\",\n challenge: \"test-challenge\",\n types: [\"type1\", \"type2\"],\n sources: [\"source1\", \"source2\"],\n deviceModelId: DeviceModelId.STAX,\n },\n ClearSignContextType.TRUSTED_NAME,\n );\n });\n\n it(\"should handle challenge command failure\", async () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextReferenceType.TRUSTED_NAME,\n valuePath: [{ type: \"TUPLE\", offset: 0 }],\n types: [\"type1\"],\n sources: [\"source1\"],\n },\n };\n const args = { ...defaultArgs, context };\n const extractedValues = [\n new Uint8Array([\n 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,\n 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,\n ]),\n ];\n transactionParserMock.extractValue.mockReturnValue(\n Right(extractedValues),\n );\n const error = new UnknownDeviceExchangeError(\"Failed\");\n apiMock.sendCommand.mockResolvedValueOnce(\n CommandResultFactory({\n error,\n }),\n );\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(1);\n const callback = result.subcontextCallbacks[0]!;\n const callbackResult = await callback();\n expect(callbackResult).toEqual({\n error: new Error(\"Failed to get challenge\"),\n type: ClearSignContextType.ERROR,\n });\n });\n });\n\n describe(\"for multiple values\", () => {\n it(\"should create callbacks for each extracted value\", async () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextReferenceType.TOKEN,\n valuePath: [{ type: \"TUPLE\", offset: 0 }],\n },\n };\n const args = { ...defaultArgs, context };\n const extractedValues = [\n new Uint8Array([\n 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,\n 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,\n ]),\n new Uint8Array([\n 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b,\n 0x2c, 0x2d, 0x2e, 0x2f, 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36,\n ]),\n ];\n transactionParserMock.extractValue.mockReturnValue(\n Right(extractedValues),\n );\n contextModuleMock.getFieldContext.mockResolvedValueOnce({\n type: ClearSignContextType.TOKEN,\n payload: \"token result 1\",\n });\n contextModuleMock.getFieldContext.mockResolvedValueOnce({\n type: ClearSignContextType.TOKEN,\n payload: \"token result 2\",\n });\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(2);\n const callback1 = result.subcontextCallbacks[0]!;\n const callback2 = result.subcontextCallbacks[1]!;\n const callbackResult1 = await callback1();\n const callbackResult2 = await callback2();\n expect(callbackResult1).toEqual({\n type: ClearSignContextType.TOKEN,\n payload: \"token result 1\",\n });\n expect(callbackResult2).toEqual({\n type: ClearSignContextType.TOKEN,\n payload: \"token result 2\",\n });\n expect(contextModuleMock.getFieldContext).toHaveBeenCalledTimes(2);\n expect(contextModuleMock.getFieldContext).toHaveBeenNthCalledWith(\n 1,\n {\n chainId: 1,\n address: \"0x030405060708090a0b0c0d0e0f10111213141516\",\n },\n ClearSignContextType.TOKEN,\n );\n expect(contextModuleMock.getFieldContext).toHaveBeenNthCalledWith(\n 2,\n {\n chainId: 1,\n address: \"0x232425262728292a2b2c2d2e2f30313233343536\",\n },\n ClearSignContextType.TOKEN,\n );\n });\n });\n });\n });\n\n describe(\"when context has no reference\", () => {\n it(\"should return context with empty subcontextCallbacks\", () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TOKEN,\n payload: \"test payload\",\n };\n const args = { ...defaultArgs, context };\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(0);\n });\n });\n\n describe(\"when context has reference but no valuePath\", () => {\n it(\"should return context with empty subcontextCallbacks\", () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextReferenceType.TOKEN,\n valuePath: undefined as unknown as GenericPath,\n },\n };\n const args = { ...defaultArgs, context };\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(0);\n });\n });\n\n describe(\"error handling\", () => {\n it(\"should throw error for uncovered context type\", () => {\n // GIVEN\n const context = {\n type: \"UNKNOWN_TYPE\" as ClearSignContextSuccess[\"type\"],\n payload: \"test payload\",\n } as ClearSignContextSuccess;\n const args = { ...defaultArgs, context };\n\n // WHEN / THEN\n expect(() => new BuildSubcontextsTask(apiMock, args).run()).toThrow(\n \"Uncovered type: UNKNOWN_TYPE\",\n );\n });\n\n it(\"should throw error for uncovered reference type\", () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"test payload\",\n reference: {\n type: \"UNKNOWN_REFERENCE_TYPE\" as ClearSignContextReference[\"type\"],\n } as ClearSignContextReference,\n };\n const args = { ...defaultArgs, context };\n\n // WHEN / THEN\n expect(() => new BuildSubcontextsTask(apiMock, args).run()).toThrow(\n \"Uncovered reference type: UNKNOWN_REFERENCE_TYPE\",\n );\n });\n });\n\n describe(\"CALLDATA reference type\", () => {\n it(\"should return empty subcontextCallbacks for CALLDATA reference\", () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextReferenceType.CALLDATA,\n callee: [{ type: \"TUPLE\", offset: 0 }],\n valuePath: [{ type: \"TUPLE\", offset: 0 }],\n },\n };\n const args = { ...defaultArgs, context };\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(0);\n });\n });\n\n describe(\"references without valuePath\", () => {\n it(\"should return empty subcontextCallbacks for ENUM reference without valuePath\", () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextReferenceType.ENUM,\n id: 1,\n valuePath: undefined as unknown as GenericPath,\n },\n };\n const args = { ...defaultArgs, context };\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(0);\n });\n\n it(\"should return empty subcontextCallbacks for TRUSTED_NAME reference without valuePath\", () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextReferenceType.TRUSTED_NAME,\n types: [\"type1\"],\n sources: [\"source1\"],\n valuePath: undefined as unknown as GenericPath,\n },\n };\n const args = { ...defaultArgs, context };\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(0);\n });\n });\n\n describe(\"PROXY_INFO context type\", () => {\n beforeEach(() => {\n apiMock.sendCommand.mockResolvedValue(\n CommandResultFactory({ data: { challenge: \"test-challenge\" } }),\n );\n });\n\n it(\"should create callback to get proxy delegate call context\", async () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.PROXY_INFO,\n payload: \"proxy payload\",\n };\n const args = {\n ...defaultArgs,\n context,\n subset: {\n ...defaultArgs.subset,\n to: \"0x1234567890123456789012345678901234567890\",\n data: \"0xabcdef\",\n },\n };\n contextModuleMock.getFieldContext.mockResolvedValue({\n type: ClearSignContextType.PROXY_INFO,\n payload: \"proxy result\",\n });\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(1);\n const callback = result.subcontextCallbacks[0]!;\n const callbackResult = await callback();\n\n expect(callbackResult).toEqual({\n type: ClearSignContextType.PROXY_INFO,\n payload: \"proxy result\",\n });\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n expect.any(GetChallengeCommand),\n );\n expect(contextModuleMock.getFieldContext).toHaveBeenCalledWith(\n {\n chainId: 1,\n proxyAddress: \"0x1234567890123456789012345678901234567890\",\n calldata: \"0xabcdef\",\n deviceModelId: DeviceModelId.STAX,\n challenge: \"test-challenge\",\n },\n ClearSignContextType.PROXY_INFO,\n );\n });\n\n it(\"should handle challenge command failure\", async () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.PROXY_INFO,\n payload: \"proxy payload\",\n };\n const args = {\n ...defaultArgs,\n context,\n subset: {\n ...defaultArgs.subset,\n to: \"0x1234567890123456789012345678901234567890\",\n data: \"0xabcdef\",\n },\n };\n const error = new UnknownDeviceExchangeError(\"Failed\");\n apiMock.sendCommand.mockResolvedValueOnce(\n CommandResultFactory({\n error,\n }),\n );\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(1);\n const callback = result.subcontextCallbacks[0]!;\n const callbackResult = await callback();\n\n expect(callbackResult).toEqual({\n error: new Error(\"Failed to get challenge\"),\n type: ClearSignContextType.ERROR,\n });\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n expect.any(GetChallengeCommand),\n );\n expect(contextModuleMock.getFieldContext).not.toHaveBeenCalled();\n });\n\n it(\"should handle missing proxy address\", async () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.PROXY_INFO,\n payload: \"proxy payload\",\n };\n const args = {\n ...defaultArgs,\n context,\n subset: {\n ...defaultArgs.subset,\n to: undefined,\n data: \"0xabcdef\",\n },\n };\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(1);\n const callback = result.subcontextCallbacks[0]!;\n const callbackResult = await callback();\n\n expect(callbackResult).toEqual({\n error: new Error(\"Failed to get proxy address\"),\n type: ClearSignContextType.ERROR,\n });\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n expect.any(GetChallengeCommand),\n );\n expect(contextModuleMock.getFieldContext).not.toHaveBeenCalled();\n });\n\n it(\"should use correct device model id in context\", async () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.PROXY_INFO,\n payload: \"proxy payload\",\n };\n const args = {\n ...defaultArgs,\n context,\n deviceModelId: DeviceModelId.NANO_SP,\n subset: {\n ...defaultArgs.subset,\n to: \"0x1234567890123456789012345678901234567890\",\n data: \"0xabcdef\",\n },\n };\n contextModuleMock.getFieldContext.mockResolvedValue({\n type: ClearSignContextType.PROXY_INFO,\n payload: \"proxy result\",\n });\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(1);\n const callback = result.subcontextCallbacks[0]!;\n await callback();\n\n expect(contextModuleMock.getFieldContext).toHaveBeenCalledWith(\n {\n chainId: 1,\n proxyAddress: \"0x1234567890123456789012345678901234567890\",\n calldata: \"0xabcdef\",\n deviceModelId: DeviceModelId.NANO_SP,\n challenge: \"test-challenge\",\n },\n ClearSignContextType.PROXY_INFO,\n );\n });\n });\n\n describe(\"edge cases\", () => {\n it(\"should handle value array shorter than 20 bytes for address extraction\", async () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextReferenceType.TOKEN,\n valuePath: [{ type: \"TUPLE\", offset: 0 }],\n },\n };\n const args = { ...defaultArgs, context };\n const extractedValues = [new Uint8Array([0x01, 0x02, 0x03])]; // Only 3 bytes\n transactionParserMock.extractValue.mockReturnValue(\n Right(extractedValues),\n );\n contextModuleMock.getFieldContext.mockResolvedValue({\n type: ClearSignContextType.ERROR,\n message: \"Invalid address\",\n });\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(1);\n const callback = result.subcontextCallbacks[0]!;\n const callbackResult = await callback();\n expect(callbackResult).toEqual({\n type: ClearSignContextType.ERROR,\n message: \"Invalid address\",\n });\n expect(contextModuleMock.getFieldContext).toHaveBeenCalledWith(\n {\n chainId: 1,\n address: \"0x010203\",\n },\n ClearSignContextType.TOKEN,\n );\n });\n\n it(\"should handle empty value array\", async () => {\n // GIVEN\n const context: ClearSignContextSuccess = {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"test payload\",\n reference: {\n type: ClearSignContextReferenceType.TOKEN,\n valuePath: [{ type: \"TUPLE\", offset: 0 }],\n },\n };\n const args = { ...defaultArgs, context };\n const extractedValues = [new Uint8Array([])]; // Empty array\n transactionParserMock.extractValue.mockReturnValue(\n Right(extractedValues),\n );\n contextModuleMock.getFieldContext.mockResolvedValue({\n type: ClearSignContextType.TOKEN,\n payload: \"token result\",\n });\n\n // WHEN\n const result = new BuildSubcontextsTask(apiMock, args).run();\n\n // THEN\n expect(result.subcontextCallbacks).toHaveLength(1);\n\n // Verify the callback calls getContext with empty address\n const callback = result.subcontextCallbacks[0]!;\n const callbackResult = await callback();\n expect(callbackResult).toEqual({\n type: ClearSignContextType.TOKEN,\n payload: \"token result\",\n });\n expect(contextModuleMock.getFieldContext).toHaveBeenCalledWith(\n {\n chainId: 1,\n address: \"0x\",\n },\n ClearSignContextType.TOKEN,\n );\n });\n });\n});\n"],
5
+ "mappings": "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",
6
6
  "names": ["ClearSignContextReferenceType", "ClearSignContextType", "CommandResultFactory", "DeviceModelId", "UnknownDeviceExchangeError", "Left", "Right", "GetChallengeCommand", "makeDeviceActionInternalApiMock", "BuildSubcontextsTask", "contextModuleMock", "transactionParserMock", "apiMock", "defaultArgs", "simpleTypes", "type", "args", "result", "context", "expectedContext", "callback", "enumContext1", "enumContext2", "enumContext3", "extractedValues", "callbackResult", "callback1", "callback2", "callbackResult1", "callbackResult2", "enumContext", "error"]
7
7
  }