@ledgerhq/device-signer-kit-ethereum 1.9.4 → 1.9.5

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 (22) hide show
  1. package/lib/cjs/internal/app-binder/task/BuildSubcontextsTask.js +1 -1
  2. package/lib/cjs/internal/app-binder/task/BuildSubcontextsTask.js.map +2 -2
  3. package/lib/cjs/internal/app-binder/task/BuildSubcontextsTask.test.js +1 -1
  4. package/lib/cjs/internal/app-binder/task/BuildSubcontextsTask.test.js.map +2 -2
  5. package/lib/cjs/internal/app-binder/task/ProvideEIP712ContextTask.js +1 -1
  6. package/lib/cjs/internal/app-binder/task/ProvideEIP712ContextTask.js.map +3 -3
  7. package/lib/cjs/internal/app-binder/task/ProvideEIP712ContextTask.test.js +1 -1
  8. package/lib/cjs/internal/app-binder/task/ProvideEIP712ContextTask.test.js.map +3 -3
  9. package/lib/cjs/package.json +3 -3
  10. package/lib/esm/internal/app-binder/task/BuildSubcontextsTask.js +1 -1
  11. package/lib/esm/internal/app-binder/task/BuildSubcontextsTask.js.map +2 -2
  12. package/lib/esm/internal/app-binder/task/BuildSubcontextsTask.test.js +1 -1
  13. package/lib/esm/internal/app-binder/task/BuildSubcontextsTask.test.js.map +2 -2
  14. package/lib/esm/internal/app-binder/task/ProvideEIP712ContextTask.js +1 -1
  15. package/lib/esm/internal/app-binder/task/ProvideEIP712ContextTask.js.map +3 -3
  16. package/lib/esm/internal/app-binder/task/ProvideEIP712ContextTask.test.js +1 -1
  17. package/lib/esm/internal/app-binder/task/ProvideEIP712ContextTask.test.js.map +3 -3
  18. package/lib/esm/package.json +3 -3
  19. package/lib/types/internal/app-binder/task/BuildSubcontextsTask.d.ts.map +1 -1
  20. package/lib/types/internal/app-binder/task/ProvideEIP712ContextTask.d.ts.map +1 -1
  21. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  22. package/package.json +8 -8
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/task/ProvideEIP712ContextTask.test.ts"],
4
- "sourcesContent": ["import {\n type ClearSignContextSuccess,\n ClearSignContextType,\n TypedDataCalldataParamPresence,\n type TypedDataClearSignContextSuccess,\n} from \"@ledgerhq/context-module\";\nimport {\n CommandResultFactory,\n DeviceModelId,\n hexaStringToBuffer,\n UnknownDeviceExchangeError,\n} from \"@ledgerhq/device-management-kit\";\nimport { Just, Nothing } from \"purify-ts\";\n\nimport { ProvideProxyInfoCommand } from \"@internal/app-binder/command/ProvideProxyInfoCommand\";\nimport { ProvideTokenInformationCommand } from \"@internal/app-binder/command/ProvideTokenInformationCommand\";\nimport {\n CalldataParamPresence,\n Eip712FilterType,\n SendEIP712FilteringCommand,\n} from \"@internal/app-binder/command/SendEIP712FilteringCommand\";\nimport {\n SendEIP712StructDefinitionCommand,\n StructDefinitionCommand,\n} from \"@internal/app-binder/command/SendEIP712StructDefinitionCommand\";\nimport {\n SendEIP712StructImplemCommand,\n StructImplemType,\n} from \"@internal/app-binder/command/SendEIP712StructImplemCommand\";\nimport { makeDeviceActionInternalApiMock } from \"@internal/app-binder/device-action/__test-utils__/makeInternalApi\";\nimport {\n type FieldType,\n PrimitiveType,\n StructType,\n TypedDataValueArray,\n TypedDataValueField,\n TypedDataValueRoot,\n} from \"@internal/typed-data/model/Types\";\n\nimport {\n ProvideEIP712ContextTask,\n type ProvideEIP712ContextTaskArgs,\n} from \"./ProvideEIP712ContextTask\";\n\ndescribe(\"ProvideEIP712ContextTask\", () => {\n const apiMock = makeDeviceActionInternalApiMock();\n const provideContextFactoryMock = vi.fn();\n const contextModuleMock = {\n getFieldContext: vi.fn(),\n getContexts: vi.fn(),\n getTypedDataFilters: vi.fn(),\n getSolanaContext: vi.fn(),\n };\n\n const TEST_TYPES = {\n EIP712Domain: {\n name: new PrimitiveType(\"string\", \"string\", Nothing),\n chainId: new PrimitiveType(\"uint256\", \"uint\", Just(32)),\n verifyingContract: new PrimitiveType(\"address\", \"address\", Nothing),\n },\n PermitSingle: {\n details: new StructType(\"PermitDetails\"),\n spender: new PrimitiveType(\"address\", \"address\", Nothing),\n sigDeadline: new PrimitiveType(\"uint256\", \"uint\", Just(32)),\n },\n PermitDetails: {\n token: new PrimitiveType(\"address\", \"address\", Nothing),\n amount: new PrimitiveType(\"uint160\", \"uint\", Just(20)),\n expiration: new PrimitiveType(\"uint48\", \"uint\", Just(6)),\n nonce: new PrimitiveType(\"uint48\", \"uint\", Just(6)),\n },\n };\n const TEST_DOMAIN_VALUES = [\n {\n path: \"\",\n type: \"\",\n value: new TypedDataValueRoot(\"EIP712Domain\"),\n },\n {\n path: \"name\",\n type: \"string\",\n value: new TypedDataValueField(new TextEncoder().encode(\"Permit2\")),\n },\n {\n path: \"chainId\",\n type: \"uint256\",\n value: new TypedDataValueField(Uint8Array.from([137])),\n },\n {\n path: \"verifyingContract\",\n type: \"address\",\n value: new TypedDataValueField(\n hexaStringToBuffer(\"0x000000000022d473030f116ddee9f6b43ac78ba3\")!,\n ),\n },\n ];\n const TEST_MESSAGE_VALUES = [\n {\n path: \"\",\n type: \"\",\n value: new TypedDataValueRoot(\"PermitSingle\"),\n },\n {\n path: \"details.token\",\n type: \"address\",\n value: new TypedDataValueField(\n hexaStringToBuffer(\"0x7ceb23fd6bc0add59e62ac25578270cff1b9f619\")!,\n ),\n },\n {\n path: \"details.amount\",\n type: \"uint160\",\n value: new TypedDataValueField(Uint8Array.from([0x12])),\n },\n {\n path: \"details.expiration\",\n type: \"uint48\",\n value: new TypedDataValueField(Uint8Array.from([0x12])),\n },\n {\n path: \"details.nonce\",\n type: \"uint48\",\n value: new TypedDataValueField(Uint8Array.from([0x00])),\n },\n {\n path: \"spender\",\n type: \"address\",\n value: new TypedDataValueField(\n hexaStringToBuffer(\"0xec7be89e9d109e7e3fec59c222cf297125fefda2\")!,\n ),\n },\n {\n path: \"sigDeadline\",\n type: \"uint256\",\n value: new TypedDataValueField(Uint8Array.from([0x12])),\n },\n ];\n const TEST_CLEAR_SIGN_CONTEXT: TypedDataClearSignContextSuccess = {\n type: \"success\",\n messageInfo: {\n displayName: \"Permit2\",\n filtersCount: 4,\n signature:\n \"3045022100e3c597d13d28a87a88b0239404c668373cf5063362f2a81d09eed4582941dfe802207669aabb504fd5b95b2734057f6b8bbf51f14a69a5f9bdf658a5952cefbf44d3\",\n },\n trustedNamesAddresses: {},\n calldatas: {},\n proxy: undefined,\n tokens: {\n 0: \"payload-0x7ceb23fd6bc0add59e62ac25578270cff1b9f619\",\n 255: \"payload-0x000000000022d473030f116ddee9f6b43ac78ba3\",\n },\n filters: {\n \"details.amount\": {\n displayName: \"Amount allowance\",\n path: \"details.amount\",\n signature:\n \"304402201a46e6b4ef89eaf9fcf4945d053bfc5616a826400fd758312fbbe976bafc07ec022025a9b408722baf983ee053f90179c75b0c55bb0668f437d55493e36069bbd5a3\",\n tokenIndex: 255,\n type: \"amount\",\n },\n \"details.expiration\": {\n displayName: \"Approval expire\",\n path: \"details.expiration\",\n signature:\n \"3044022056b3381e4540629ad73bc434ec49d80523234b82f62340fbb77157fb0eb21a680220459fe9cf6ca309f9c7dfc6d4711fea1848dba661563c57f77b3c2dc480b3a63b\",\n type: \"datetime\",\n },\n \"details.token\": {\n displayName: \"Amount allowance\",\n path: \"details.token\",\n signature:\n \"3044022075103b38995e031d1ebbfe38ac6603bec32854b5146a664e49b4cc4f460c1da6022029f4b0fd1f3b7995ffff1627d4b57f27888a2dcc9b3a4e85c37c67571092c733\",\n tokenIndex: 0,\n type: \"token\",\n },\n spender: {\n displayName: \"Approve to spender\",\n path: \"spender\",\n signature:\n \"3044022033e5713d9cb9bc375b56a9fb53b736c81ea3c4ac5cfb2d3ca7f8b8f0558fe2430220543ca4fef6d6f725f29e343f167fe9dd582aa856ecb5797259050eb990a1befb\",\n type: \"raw\",\n },\n },\n };\n\n const ADDRESS = new PrimitiveType(\"address\", \"address\", Nothing);\n const STRING = new PrimitiveType(\"string\", \"string\", Nothing);\n const UINT256 = new PrimitiveType(\"uint256\", \"uint\", Just(32));\n const UINT160 = new PrimitiveType(\"uint160\", \"uint\", Just(20));\n const UINT48 = new PrimitiveType(\"uint48\", \"uint\", Just(6));\n const CUSTOM = (name: string) => new StructType(name);\n\n const sendStructDefName = (name: string) =>\n new SendEIP712StructDefinitionCommand({\n command: StructDefinitionCommand.Name,\n name,\n });\n const sendStructDefField = (name: string, type: FieldType) =>\n new SendEIP712StructDefinitionCommand({\n command: StructDefinitionCommand.Field,\n name,\n type,\n });\n const sendStructImplRoot = (value: string) =>\n new SendEIP712StructImplemCommand({\n type: StructImplemType.ROOT,\n value,\n });\n const sendStructImplArray = (value: number) =>\n new SendEIP712StructImplemCommand({\n type: StructImplemType.ARRAY,\n value,\n });\n const sendStructImplField = (data: Uint8Array) =>\n new SendEIP712StructImplemCommand({\n type: StructImplemType.FIELD,\n value: {\n data,\n isLastChunk: true,\n },\n });\n\n beforeEach(() => {\n vi.resetAllMocks();\n provideContextFactoryMock.mockReturnValue({\n run: async () => undefined,\n });\n });\n\n it(\"Send context with no clear signing context\", async () => {\n // GIVEN\n const args: ProvideEIP712ContextTaskArgs = {\n deviceModelId: DeviceModelId.STAX,\n derivationPath: \"44'/60'/0'/0/0\",\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n clearSignContext: Nothing,\n calldatasContexts: {},\n };\n // WHEN\n apiMock.sendCommand.mockResolvedValue(\n CommandResultFactory({ data: undefined }),\n );\n await new ProvideEIP712ContextTask(\n apiMock,\n contextModuleMock,\n args,\n provideContextFactoryMock,\n ).run();\n\n // THEN\n expect(apiMock.sendCommand.mock.calls).toHaveLength(24);\n // Send Struct definitions\n expect(apiMock.sendCommand.mock.calls[0]![0]).toStrictEqual(\n sendStructDefName(\"EIP712Domain\"),\n );\n expect(apiMock.sendCommand.mock.calls[1]![0]).toStrictEqual(\n sendStructDefField(\"name\", STRING),\n );\n expect(apiMock.sendCommand.mock.calls[2]![0]).toStrictEqual(\n sendStructDefField(\"chainId\", UINT256),\n );\n expect(apiMock.sendCommand.mock.calls[3]![0]).toStrictEqual(\n sendStructDefField(\"verifyingContract\", ADDRESS),\n );\n expect(apiMock.sendCommand.mock.calls[4]![0]).toStrictEqual(\n sendStructDefName(\"PermitDetails\"),\n );\n expect(apiMock.sendCommand.mock.calls[5]![0]).toStrictEqual(\n sendStructDefField(\"token\", ADDRESS),\n );\n expect(apiMock.sendCommand.mock.calls[6]![0]).toStrictEqual(\n sendStructDefField(\"amount\", UINT160),\n );\n expect(apiMock.sendCommand.mock.calls[7]![0]).toStrictEqual(\n sendStructDefField(\"expiration\", UINT48),\n );\n expect(apiMock.sendCommand.mock.calls[8]![0]).toStrictEqual(\n sendStructDefField(\"nonce\", UINT48),\n );\n expect(apiMock.sendCommand.mock.calls[9]![0]).toStrictEqual(\n sendStructDefName(\"PermitSingle\"),\n );\n expect(apiMock.sendCommand.mock.calls[10]![0]).toStrictEqual(\n sendStructDefField(\"details\", CUSTOM(\"PermitDetails\")),\n );\n expect(apiMock.sendCommand.mock.calls[11]![0]).toStrictEqual(\n sendStructDefField(\"spender\", ADDRESS),\n );\n expect(apiMock.sendCommand.mock.calls[12]![0]).toStrictEqual(\n sendStructDefField(\"sigDeadline\", UINT256),\n );\n // Send the domain values\n expect(apiMock.sendCommand.mock.calls[13]![0]).toStrictEqual(\n sendStructImplRoot(\"EIP712Domain\"),\n );\n expect(apiMock.sendCommand.mock.calls[14]![0]).toStrictEqual(\n sendStructImplField(\n Uint8Array.from([0x00, 0x07, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x74, 0x32]),\n ),\n );\n expect(apiMock.sendCommand.mock.calls[15]![0]).toStrictEqual(\n sendStructImplField(Uint8Array.from([0x00, 0x01, 0x89])),\n );\n expect(apiMock.sendCommand.mock.calls[16]![0]).toStrictEqual(\n sendStructImplField(\n Uint8Array.from([\n 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0xd4, 0x73, 0x03,\n 0x0f, 0x11, 0x6d, 0xde, 0xe9, 0xf6, 0xb4, 0x3a, 0xc7, 0x8b, 0xa3,\n ]),\n ),\n );\n // Send the message values\n expect(apiMock.sendCommand.mock.calls[17]![0]).toStrictEqual(\n sendStructImplRoot(\"PermitSingle\"),\n );\n expect(apiMock.sendCommand.mock.calls[18]![0]).toStrictEqual(\n sendStructImplField(\n Uint8Array.from([\n 0x00, 0x14, 0x7c, 0xeb, 0x23, 0xfd, 0x6b, 0xc0, 0xad, 0xd5, 0x9e,\n 0x62, 0xac, 0x25, 0x57, 0x82, 0x70, 0xcf, 0xf1, 0xb9, 0xf6, 0x19,\n ]),\n ),\n );\n expect(apiMock.sendCommand.mock.calls[19]![0]).toStrictEqual(\n sendStructImplField(Uint8Array.from([0x00, 0x01, 0x12])),\n );\n expect(apiMock.sendCommand.mock.calls[20]![0]).toStrictEqual(\n sendStructImplField(Uint8Array.from([0x00, 0x01, 0x12])),\n );\n expect(apiMock.sendCommand.mock.calls[21]![0]).toStrictEqual(\n sendStructImplField(Uint8Array.from([0x00, 0x01, 0x00])),\n );\n expect(apiMock.sendCommand.mock.calls[22]![0]).toStrictEqual(\n sendStructImplField(\n Uint8Array.from([\n 0x00, 0x14, 0xec, 0x7b, 0xe8, 0x9e, 0x9d, 0x10, 0x9e, 0x7e, 0x3f,\n 0xec, 0x59, 0xc2, 0x22, 0xcf, 0x29, 0x71, 0x25, 0xfe, 0xfd, 0xa2,\n ]),\n ),\n );\n expect(apiMock.sendCommand.mock.calls[23]![0]).toStrictEqual(\n sendStructImplField(Uint8Array.from([0x00, 0x01, 0x12])),\n );\n });\n\n it(\"Send context with transaction check\", async () => {\n // GIVEN\n const args: ProvideEIP712ContextTaskArgs = {\n deviceModelId: DeviceModelId.STAX,\n derivationPath: \"44'/60'/0'/0/0\",\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n clearSignContext: Nothing,\n calldatasContexts: {},\n transactionChecks: {\n type: ClearSignContextType.TRANSACTION_CHECK,\n payload: \"transactionCheck\",\n certificate: {\n keyUsageNumber: 1,\n payload: new Uint8Array([0x01, 0x02, 0x03]),\n },\n },\n };\n // WHEN\n apiMock.sendCommand.mockResolvedValue(\n CommandResultFactory({ data: undefined }),\n );\n await new ProvideEIP712ContextTask(\n apiMock,\n contextModuleMock,\n args,\n provideContextFactoryMock,\n ).run();\n\n // THEN\n expect(apiMock.sendCommand.mock.calls).toHaveLength(25);\n });\n\n it(\"Send context with clear signing\", async () => {\n // GIVEN\n const args: ProvideEIP712ContextTaskArgs = {\n deviceModelId: DeviceModelId.STAX,\n derivationPath: \"44'/60'/0'/0/0\",\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n clearSignContext: Just(TEST_CLEAR_SIGN_CONTEXT),\n calldatasContexts: {},\n };\n apiMock.sendCommand\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: { tokenIndex: 4 } })) // First token provided\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: { tokenIndex: 5 } })); // Second token provided\n // WHEN\n apiMock.sendCommand.mockResolvedValue(\n CommandResultFactory({ data: undefined }),\n );\n await new ProvideEIP712ContextTask(\n apiMock,\n contextModuleMock,\n args,\n provideContextFactoryMock,\n ).run();\n\n // THEN\n expect(apiMock.sendCommand.mock.calls).toHaveLength(32);\n // Send Struct definitions\n expect(apiMock.sendCommand.mock.calls[0]![0]).toStrictEqual(\n sendStructDefName(\"EIP712Domain\"),\n );\n expect(apiMock.sendCommand.mock.calls[1]![0]).toStrictEqual(\n sendStructDefField(\"name\", STRING),\n );\n expect(apiMock.sendCommand.mock.calls[2]![0]).toStrictEqual(\n sendStructDefField(\"chainId\", UINT256),\n );\n expect(apiMock.sendCommand.mock.calls[3]![0]).toStrictEqual(\n sendStructDefField(\"verifyingContract\", ADDRESS),\n );\n expect(apiMock.sendCommand.mock.calls[4]![0]).toStrictEqual(\n sendStructDefName(\"PermitDetails\"),\n );\n expect(apiMock.sendCommand.mock.calls[5]![0]).toStrictEqual(\n sendStructDefField(\"token\", ADDRESS),\n );\n expect(apiMock.sendCommand.mock.calls[6]![0]).toStrictEqual(\n sendStructDefField(\"amount\", UINT160),\n );\n expect(apiMock.sendCommand.mock.calls[7]![0]).toStrictEqual(\n sendStructDefField(\"expiration\", UINT48),\n );\n expect(apiMock.sendCommand.mock.calls[8]![0]).toStrictEqual(\n sendStructDefField(\"nonce\", UINT48),\n );\n expect(apiMock.sendCommand.mock.calls[9]![0]).toStrictEqual(\n sendStructDefName(\"PermitSingle\"),\n );\n expect(apiMock.sendCommand.mock.calls[10]![0]).toStrictEqual(\n sendStructDefField(\"details\", CUSTOM(\"PermitDetails\")),\n );\n expect(apiMock.sendCommand.mock.calls[11]![0]).toStrictEqual(\n sendStructDefField(\"spender\", ADDRESS),\n );\n expect(apiMock.sendCommand.mock.calls[12]![0]).toStrictEqual(\n sendStructDefField(\"sigDeadline\", UINT256),\n );\n // Activate the filtering\n expect(apiMock.sendCommand.mock.calls[13]![0]).toStrictEqual(\n new SendEIP712FilteringCommand({ type: Eip712FilterType.Activation }),\n );\n // Send the domain values\n expect(apiMock.sendCommand.mock.calls[14]![0]).toStrictEqual(\n sendStructImplRoot(\"EIP712Domain\"),\n );\n expect(apiMock.sendCommand.mock.calls[15]![0]).toStrictEqual(\n sendStructImplField(\n Uint8Array.from([0x00, 0x07, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x74, 0x32]),\n ),\n );\n expect(apiMock.sendCommand.mock.calls[16]![0]).toStrictEqual(\n sendStructImplField(Uint8Array.from([0x00, 0x01, 0x89])),\n );\n expect(apiMock.sendCommand.mock.calls[17]![0]).toStrictEqual(\n sendStructImplField(\n Uint8Array.from([\n 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0xd4, 0x73, 0x03,\n 0x0f, 0x11, 0x6d, 0xde, 0xe9, 0xf6, 0xb4, 0x3a, 0xc7, 0x8b, 0xa3,\n ]),\n ),\n );\n // Send the message information filter\n expect(apiMock.sendCommand.mock.calls[18]![0]).toStrictEqual(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.MessageInfo,\n displayName: \"Permit2\",\n filtersCount: 4,\n signature:\n \"3045022100e3c597d13d28a87a88b0239404c668373cf5063362f2a81d09eed4582941dfe802207669aabb504fd5b95b2734057f6b8bbf51f14a69a5f9bdf658a5952cefbf44d3\",\n }),\n );\n // Send the message values with corresponding filters\n expect(apiMock.sendCommand.mock.calls[19]![0]).toStrictEqual(\n sendStructImplRoot(\"PermitSingle\"),\n );\n expect(apiMock.sendCommand.mock.calls[20]![0]).toStrictEqual(\n new ProvideTokenInformationCommand({\n payload: \"payload-0x7ceb23fd6bc0add59e62ac25578270cff1b9f619\",\n }),\n );\n expect(apiMock.sendCommand.mock.calls[21]![0]).toStrictEqual(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.Token,\n discarded: false,\n tokenIndex: 4,\n signature:\n \"3044022075103b38995e031d1ebbfe38ac6603bec32854b5146a664e49b4cc4f460c1da6022029f4b0fd1f3b7995ffff1627d4b57f27888a2dcc9b3a4e85c37c67571092c733\",\n }),\n );\n expect(apiMock.sendCommand.mock.calls[22]![0]).toStrictEqual(\n sendStructImplField(\n Uint8Array.from([\n 0x00, 0x14, 0x7c, 0xeb, 0x23, 0xfd, 0x6b, 0xc0, 0xad, 0xd5, 0x9e,\n 0x62, 0xac, 0x25, 0x57, 0x82, 0x70, 0xcf, 0xf1, 0xb9, 0xf6, 0x19,\n ]),\n ),\n );\n expect(apiMock.sendCommand.mock.calls[23]![0]).toStrictEqual(\n new ProvideTokenInformationCommand({\n payload: \"payload-0x000000000022d473030f116ddee9f6b43ac78ba3\",\n }),\n );\n expect(apiMock.sendCommand.mock.calls[24]![0]).toStrictEqual(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.Amount,\n discarded: false,\n displayName: \"Amount allowance\",\n tokenIndex: 255,\n signature:\n \"304402201a46e6b4ef89eaf9fcf4945d053bfc5616a826400fd758312fbbe976bafc07ec022025a9b408722baf983ee053f90179c75b0c55bb0668f437d55493e36069bbd5a3\",\n }),\n );\n expect(apiMock.sendCommand.mock.calls[25]![0]).toStrictEqual(\n sendStructImplField(Uint8Array.from([0x00, 0x01, 0x12])),\n );\n expect(apiMock.sendCommand.mock.calls[26]![0]).toStrictEqual(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.Datetime,\n discarded: false,\n displayName: \"Approval expire\",\n signature:\n \"3044022056b3381e4540629ad73bc434ec49d80523234b82f62340fbb77157fb0eb21a680220459fe9cf6ca309f9c7dfc6d4711fea1848dba661563c57f77b3c2dc480b3a63b\",\n }),\n );\n expect(apiMock.sendCommand.mock.calls[27]![0]).toStrictEqual(\n sendStructImplField(Uint8Array.from([0x00, 0x01, 0x12])),\n );\n expect(apiMock.sendCommand.mock.calls[28]![0]).toStrictEqual(\n sendStructImplField(Uint8Array.from([0x00, 0x01, 0x00])),\n );\n expect(apiMock.sendCommand.mock.calls[29]![0]).toStrictEqual(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.Raw,\n discarded: false,\n displayName: \"Approve to spender\",\n signature:\n \"3044022033e5713d9cb9bc375b56a9fb53b736c81ea3c4ac5cfb2d3ca7f8b8f0558fe2430220543ca4fef6d6f725f29e343f167fe9dd582aa856ecb5797259050eb990a1befb\",\n }),\n );\n expect(apiMock.sendCommand.mock.calls[30]![0]).toStrictEqual(\n sendStructImplField(\n Uint8Array.from([\n 0x00, 0x14, 0xec, 0x7b, 0xe8, 0x9e, 0x9d, 0x10, 0x9e, 0x7e, 0x3f,\n 0xec, 0x59, 0xc2, 0x22, 0xcf, 0x29, 0x71, 0x25, 0xfe, 0xfd, 0xa2,\n ]),\n ),\n );\n expect(apiMock.sendCommand.mock.calls[31]![0]).toStrictEqual(\n sendStructImplField(Uint8Array.from([0x00, 0x01, 0x12])),\n );\n });\n\n it(\"Both tokens unavailable\", async () => {\n // GIVEN\n const args: ProvideEIP712ContextTaskArgs = {\n deviceModelId: DeviceModelId.STAX,\n derivationPath: \"44'/60'/0'/0/0\",\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n clearSignContext: Just({\n type: \"success\",\n messageInfo: TEST_CLEAR_SIGN_CONTEXT.messageInfo,\n filters: TEST_CLEAR_SIGN_CONTEXT.filters,\n trustedNamesAddresses: {},\n calldatas: {},\n proxy: undefined,\n tokens: {},\n }),\n calldatasContexts: {},\n };\n\n // WHEN\n apiMock.sendCommand.mockResolvedValue(\n CommandResultFactory({ data: undefined }),\n );\n await new ProvideEIP712ContextTask(\n apiMock,\n contextModuleMock,\n args,\n provideContextFactoryMock,\n ).run();\n\n // THEN\n expect(apiMock.sendCommand).not.toHaveBeenCalledWith(\n new ProvideTokenInformationCommand({\n payload: \"payload-0x7ceb23fd6bc0add59e62ac25578270cff1b9f619\",\n }),\n );\n expect(apiMock.sendCommand).not.toHaveBeenCalledWith(\n new ProvideTokenInformationCommand({\n payload: \"payload-0x000000000022d473030f116ddee9f6b43ac78ba3\",\n }),\n );\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.Token,\n discarded: false,\n tokenIndex: 0,\n signature:\n \"3044022075103b38995e031d1ebbfe38ac6603bec32854b5146a664e49b4cc4f460c1da6022029f4b0fd1f3b7995ffff1627d4b57f27888a2dcc9b3a4e85c37c67571092c733\",\n }),\n );\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.Amount,\n discarded: false,\n displayName: \"Amount allowance\",\n tokenIndex: 1,\n signature:\n \"304402201a46e6b4ef89eaf9fcf4945d053bfc5616a826400fd758312fbbe976bafc07ec022025a9b408722baf983ee053f90179c75b0c55bb0668f437d55493e36069bbd5a3\",\n }),\n );\n });\n\n it(\"Provide calldata filters\", async () => {\n // GIVEN\n const args: ProvideEIP712ContextTaskArgs = {\n deviceModelId: DeviceModelId.STAX,\n derivationPath: \"44'/60'/0'/0/0\",\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n clearSignContext: Just({\n type: \"success\",\n messageInfo: TEST_CLEAR_SIGN_CONTEXT.messageInfo,\n filters: {\n \"details.amount\": {\n displayName: \"Value\",\n path: \"details.amount\",\n signature:\n \"304402201a46e6b4ef89eaf9fcf4945d053bfc5616a826400fd758312fbbe976bafc07ec022025a9b408722baf983ee053f90179c75b0c55bb0668f437d55493e36069bbd5a3\",\n calldataIndex: 0,\n type: \"calldata-value\",\n },\n \"details.expiration\": {\n displayName: \"Callee\",\n path: \"details.expiration\",\n signature:\n \"304502201a46e6b4ef89eaf9fcf4945d053bfc5616a826400fd758312fbbe976bafc07ec022025a9b408722baf983ee053f90179c75b0c55bb0668f437d55493e36069bbd5a3\",\n calldataIndex: 0,\n type: \"calldata-callee\",\n },\n spender: {\n displayName: \"Spender\",\n path: \"spender\",\n signature:\n \"304602201a46e6b4ef89eaf9fcf4945d053bfc5616a826400fd758312fbbe976bafc07ec022025a9b408722baf983ee053f90179c75b0c55bb0668f437d55493e36069bbd5a3\",\n calldataIndex: 0,\n type: \"calldata-spender\",\n },\n \"details.token\": {\n displayName: \"Chain ID\",\n path: \"details.token\",\n signature:\n \"304702201a46e6b4ef89eaf9fcf4945d053bfc5616a826400fd758312fbbe976bafc07ec022025a9b408722baf983ee053f90179c75b0c55bb0668f437d55493e36069bbd5a3\",\n calldataIndex: 0,\n type: \"calldata-chain-id\",\n },\n \"details.nonce\": {\n displayName: \"Chain ID\",\n path: \"details.nonce\",\n signature:\n \"304802201a46e6b4ef89eaf9fcf4945d053bfc5616a826400fd758312fbbe976bafc07ec022025a9b408722baf983ee053f90179c75b0c55bb0668f437d55493e36069bbd5a3\",\n calldataIndex: 1,\n type: \"calldata-selector\",\n },\n sigDeadline: {\n displayName: \"Amount\",\n path: \"sigDeadline\",\n signature:\n \"304902201a46e6b4ef89eaf9fcf4945d053bfc5616a826400fd758312fbbe976bafc07ec022025a9b408722baf983ee053f90179c75b0c55bb0668f437d55493e36069bbd5a3\",\n calldataIndex: 1,\n type: \"calldata-amount\",\n },\n },\n trustedNamesAddresses: {},\n calldatas: {\n 0: {\n filter: {\n calldataIndex: 0,\n displayName: \"Transaction\",\n valueFlag: true,\n calleeFlag: TypedDataCalldataParamPresence.Present,\n chainIdFlag: false,\n selectorFlag: false,\n amountFlag: true,\n spenderFlag: TypedDataCalldataParamPresence.VerifyingContract,\n signature:\n \"3045022100d8496ab69152efeef6a923a3ebd225334ad65dcb985814994243be7bc09bf27e02206314835816908dd6d51d3cbb0f9465d91d7ddc9104b34dd6c4247f65c551836e\",\n },\n subset: {\n chainId: 0x1234,\n data: \"0x6a76120200000000000000000000000023f8abfc2824c397ccb3da89ae772984107ddb99\",\n from: \"0x8ceb23fd6bc0add59e62ac25578270cff1b9f619\",\n selector: \"0x778899aa\",\n to: \"0x7ceb23fd6bc0add59e62ac25578270cff1b9f619\",\n value: 4200000000000000n,\n },\n },\n 1: {\n filter: {\n calldataIndex: 1,\n displayName: \"Transaction\",\n valueFlag: true,\n calleeFlag: TypedDataCalldataParamPresence.Present,\n chainIdFlag: false,\n selectorFlag: false,\n amountFlag: true,\n spenderFlag: TypedDataCalldataParamPresence.VerifyingContract,\n signature:\n \"3045932100d8496ab69152efeef6a923a3ebd225334ad65dcb985814994243be7bc09bf27e02206314835816908dd6d51d3cbb0f9465d91d7ddc9104b34dd6c4247f65c551836e\",\n },\n subset: {\n chainId: 0x1235,\n data: \"0x6a76120200000000000000000000000023f8abfc2824c397ccb3da89ae772984107ddb99\",\n from: \"0x8ceb23fd6bc0add59e62ac25578270cff1b9f619\",\n selector: \"0x778899aa\",\n to: \"0x7ceb23fd6bc0add59e62ac25578270cff1b9f619\",\n value: 4300000000000000n,\n },\n },\n },\n proxy: undefined,\n tokens: {},\n }),\n calldatasContexts: {\n 0: [],\n },\n };\n\n // WHEN\n apiMock.sendCommand.mockResolvedValue(\n CommandResultFactory({ data: undefined }),\n );\n await new ProvideEIP712ContextTask(\n apiMock,\n contextModuleMock,\n args,\n provideContextFactoryMock,\n ).run();\n\n // THEN\n expect(provideContextFactoryMock).toHaveBeenCalledTimes(1);\n expect(provideContextFactoryMock).toHaveBeenCalledWith({\n contexts: [],\n derivationPath: \"44'/60'/0'/0/0\",\n });\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.CalldataInfo,\n discarded: false,\n calldataIndex: 0,\n valueFlag: true,\n calleeFlag: CalldataParamPresence.Present,\n chainIdFlag: false,\n selectorFlag: false,\n amountFlag: true,\n spenderFlag: CalldataParamPresence.VerifyingContract,\n signature:\n \"3045022100d8496ab69152efeef6a923a3ebd225334ad65dcb985814994243be7bc09bf27e02206314835816908dd6d51d3cbb0f9465d91d7ddc9104b34dd6c4247f65c551836e\",\n }),\n );\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.CalldataValue,\n discarded: false,\n calldataIndex: 0,\n signature:\n \"304402201a46e6b4ef89eaf9fcf4945d053bfc5616a826400fd758312fbbe976bafc07ec022025a9b408722baf983ee053f90179c75b0c55bb0668f437d55493e36069bbd5a3\",\n }),\n );\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.CalldataCallee,\n discarded: false,\n calldataIndex: 0,\n signature:\n \"304502201a46e6b4ef89eaf9fcf4945d053bfc5616a826400fd758312fbbe976bafc07ec022025a9b408722baf983ee053f90179c75b0c55bb0668f437d55493e36069bbd5a3\",\n }),\n );\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.CalldataSpender,\n discarded: false,\n calldataIndex: 0,\n signature:\n \"304602201a46e6b4ef89eaf9fcf4945d053bfc5616a826400fd758312fbbe976bafc07ec022025a9b408722baf983ee053f90179c75b0c55bb0668f437d55493e36069bbd5a3\",\n }),\n );\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.CalldataChainId,\n discarded: false,\n calldataIndex: 0,\n signature:\n \"304702201a46e6b4ef89eaf9fcf4945d053bfc5616a826400fd758312fbbe976bafc07ec022025a9b408722baf983ee053f90179c75b0c55bb0668f437d55493e36069bbd5a3\",\n }),\n );\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.CalldataInfo,\n discarded: false,\n calldataIndex: 1,\n valueFlag: true,\n calleeFlag: CalldataParamPresence.Present,\n chainIdFlag: false,\n selectorFlag: false,\n amountFlag: true,\n spenderFlag: CalldataParamPresence.VerifyingContract,\n signature:\n \"3045932100d8496ab69152efeef6a923a3ebd225334ad65dcb985814994243be7bc09bf27e02206314835816908dd6d51d3cbb0f9465d91d7ddc9104b34dd6c4247f65c551836e\",\n }),\n );\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.CalldataSelector,\n discarded: false,\n calldataIndex: 1,\n signature:\n \"304802201a46e6b4ef89eaf9fcf4945d053bfc5616a826400fd758312fbbe976bafc07ec022025a9b408722baf983ee053f90179c75b0c55bb0668f437d55493e36069bbd5a3\",\n }),\n );\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.CalldataAmount,\n discarded: false,\n calldataIndex: 1,\n signature:\n \"304902201a46e6b4ef89eaf9fcf4945d053bfc5616a826400fd758312fbbe976bafc07ec022025a9b408722baf983ee053f90179c75b0c55bb0668f437d55493e36069bbd5a3\",\n }),\n );\n });\n\n it(\"First token unavailable\", async () => {\n // GIVEN\n const args: ProvideEIP712ContextTaskArgs = {\n deviceModelId: DeviceModelId.STAX,\n derivationPath: \"44'/60'/0'/0/0\",\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n clearSignContext: Just({\n type: \"success\",\n messageInfo: TEST_CLEAR_SIGN_CONTEXT.messageInfo,\n filters: TEST_CLEAR_SIGN_CONTEXT.filters,\n trustedNamesAddresses: {},\n calldatas: {},\n proxy: undefined,\n tokens: { 255: \"payload-0x000000000022d473030f116ddee9f6b43ac78ba3\" },\n }),\n calldatasContexts: {},\n };\n\n // WHEN\n apiMock.sendCommand.mockResolvedValue(\n CommandResultFactory({ data: { tokenIndex: 4 } }),\n );\n await new ProvideEIP712ContextTask(\n apiMock,\n contextModuleMock,\n args,\n provideContextFactoryMock,\n ).run();\n\n // THEN\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.Token,\n discarded: false,\n tokenIndex: 0,\n signature:\n \"3044022075103b38995e031d1ebbfe38ac6603bec32854b5146a664e49b4cc4f460c1da6022029f4b0fd1f3b7995ffff1627d4b57f27888a2dcc9b3a4e85c37c67571092c733\",\n }),\n );\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.Amount,\n discarded: false,\n displayName: \"Amount allowance\",\n tokenIndex: 255,\n signature:\n \"304402201a46e6b4ef89eaf9fcf4945d053bfc5616a826400fd758312fbbe976bafc07ec022025a9b408722baf983ee053f90179c75b0c55bb0668f437d55493e36069bbd5a3\",\n }),\n );\n });\n\n it(\"Second token unavailable\", async () => {\n // GIVEN\n const args: ProvideEIP712ContextTaskArgs = {\n deviceModelId: DeviceModelId.STAX,\n derivationPath: \"44'/60'/0'/0/0\",\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n clearSignContext: Just({\n type: \"success\",\n messageInfo: TEST_CLEAR_SIGN_CONTEXT.messageInfo,\n filters: TEST_CLEAR_SIGN_CONTEXT.filters,\n trustedNamesAddresses: {},\n calldatas: {},\n proxy: undefined,\n tokens: { 0: \"payload-0x7ceb23fd6bc0add59e62ac25578270cff1b9f619\" },\n }),\n calldatasContexts: {},\n };\n\n // WHEN\n apiMock.sendCommand.mockResolvedValue(\n CommandResultFactory({ data: { tokenIndex: 4 } }),\n );\n await new ProvideEIP712ContextTask(\n apiMock,\n contextModuleMock,\n args,\n provideContextFactoryMock,\n ).run();\n\n // THEN\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.Token,\n discarded: false,\n tokenIndex: 4,\n signature:\n \"3044022075103b38995e031d1ebbfe38ac6603bec32854b5146a664e49b4cc4f460c1da6022029f4b0fd1f3b7995ffff1627d4b57f27888a2dcc9b3a4e85c37c67571092c733\",\n }),\n );\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.Amount,\n discarded: false,\n displayName: \"Amount allowance\",\n tokenIndex: 0,\n signature:\n \"304402201a46e6b4ef89eaf9fcf4945d053bfc5616a826400fd758312fbbe976bafc07ec022025a9b408722baf983ee053f90179c75b0c55bb0668f437d55493e36069bbd5a3\",\n }),\n );\n });\n\n it(\"Provide proxy\", async () => {\n // GIVEN\n const proxy: ClearSignContextSuccess<ClearSignContextType.PROXY_INFO> = {\n type: ClearSignContextType.PROXY_INFO,\n payload: \"0x010203\",\n };\n const clearSignContext: TypedDataClearSignContextSuccess = {\n ...TEST_CLEAR_SIGN_CONTEXT,\n proxy,\n };\n const args: ProvideEIP712ContextTaskArgs = {\n deviceModelId: DeviceModelId.STAX,\n derivationPath: \"44'/60'/0'/0/0\",\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n clearSignContext: Just(clearSignContext),\n calldatasContexts: {},\n };\n\n // WHEN\n apiMock.sendCommand.mockResolvedValue(\n CommandResultFactory({ data: { tokenIndex: 4 } }),\n );\n await new ProvideEIP712ContextTask(\n apiMock,\n contextModuleMock,\n args,\n provideContextFactoryMock,\n ).run();\n\n // THEN\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n new ProvideProxyInfoCommand({\n data: hexaStringToBuffer(\"0x0003010203\")!,\n isFirstChunk: true,\n }),\n );\n });\n\n it(\"Error when providing tokens\", async () => {\n // GIVEN\n const args: ProvideEIP712ContextTaskArgs = {\n deviceModelId: DeviceModelId.STAX,\n derivationPath: \"44'/60'/0'/0/0\",\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n clearSignContext: Just(TEST_CLEAR_SIGN_CONTEXT),\n calldatasContexts: {},\n };\n apiMock.sendCommand.mockResolvedValueOnce(\n CommandResultFactory({\n error: new UnknownDeviceExchangeError(\"error\"),\n }),\n );\n // WHEN\n const promise = new ProvideEIP712ContextTask(\n apiMock,\n contextModuleMock,\n args,\n provideContextFactoryMock,\n ).run();\n\n // THEN\n await expect(promise).resolves.toStrictEqual(\n CommandResultFactory({\n error: new UnknownDeviceExchangeError(\"error\"),\n }),\n );\n });\n\n it(\"Error when sending struct definitions\", async () => {\n // GIVEN\n const args: ProvideEIP712ContextTaskArgs = {\n deviceModelId: DeviceModelId.STAX,\n derivationPath: \"44'/60'/0'/0/0\",\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n clearSignContext: Just(TEST_CLEAR_SIGN_CONTEXT),\n calldatasContexts: {},\n };\n apiMock.sendCommand\n .mockResolvedValueOnce(CommandResultFactory({ data: { tokenIndex: 4 } }))\n .mockResolvedValueOnce(CommandResultFactory({ data: { tokenIndex: 5 } }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(\n CommandResultFactory({\n error: new UnknownDeviceExchangeError(\"error\"),\n }),\n );\n // WHEN\n const promise = new ProvideEIP712ContextTask(\n apiMock,\n contextModuleMock,\n args,\n provideContextFactoryMock,\n ).run();\n\n // THEN\n await expect(promise).resolves.toStrictEqual(\n CommandResultFactory({ error: new UnknownDeviceExchangeError(\"error\") }),\n );\n });\n\n it(\"Error when sending struct implementations\", async () => {\n // GIVEN\n const args: ProvideEIP712ContextTaskArgs = {\n deviceModelId: DeviceModelId.STAX,\n derivationPath: \"44'/60'/0'/0/0\",\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n clearSignContext: Nothing,\n calldatasContexts: {},\n };\n // WHEN\n apiMock.sendCommand\n // Struct definitions\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n // Struct implementations\n .mockResolvedValueOnce(\n CommandResultFactory({\n error: new UnknownDeviceExchangeError(\"error\"),\n }),\n )\n .mockResolvedValue(CommandResultFactory({ data: undefined }));\n const promise = new ProvideEIP712ContextTask(\n apiMock,\n contextModuleMock,\n args,\n provideContextFactoryMock,\n ).run();\n\n // THEN\n await expect(promise).resolves.toStrictEqual(\n CommandResultFactory({ error: new UnknownDeviceExchangeError(\"error\") }),\n );\n });\n\n it(\"Send struct array\", async () => {\n // GIVEN\n const args: ProvideEIP712ContextTaskArgs = {\n deviceModelId: DeviceModelId.STAX,\n derivationPath: \"44'/60'/0'/0/0\",\n types: {},\n domain: [],\n message: [\n // Array containing an element\n {\n path: \"spenders\",\n type: \"address[]\",\n value: new TypedDataValueArray(1),\n },\n {\n path: \"spenders.[]\",\n type: \"address\",\n value: new TypedDataValueField(\n hexaStringToBuffer(\"0x7ceb23fd6bc0add59e62ac25578270cff1b9f619\")!,\n ),\n },\n // Empty array\n {\n path: \"beneficiaries\",\n type: \"address[]\",\n value: new TypedDataValueArray(0),\n },\n ],\n clearSignContext: Just({\n type: \"success\",\n messageInfo: {\n displayName: \"Permit2\",\n filtersCount: 2,\n signature: \"sig\",\n },\n trustedNamesAddresses: {},\n calldatas: {},\n proxy: undefined,\n tokens: {},\n filters: {\n \"spenders.[]\": {\n displayName: \"Spender\",\n path: \"spenders.[]\",\n signature: \"sig\",\n type: \"raw\",\n },\n \"beneficiaries.[]\": {\n displayName: \"Beneficiary\",\n path: \"beneficiaries.[]\",\n signature: \"sig\",\n type: \"raw\",\n },\n },\n }),\n calldatasContexts: {},\n };\n // WHEN\n apiMock.sendCommand.mockResolvedValue(\n CommandResultFactory({ data: undefined }),\n );\n await new ProvideEIP712ContextTask(\n apiMock,\n contextModuleMock,\n args,\n provideContextFactoryMock,\n ).run();\n\n // THEN\n // Activate the filtering\n expect(apiMock.sendCommand.mock.calls[0]![0]).toStrictEqual(\n new SendEIP712FilteringCommand({ type: Eip712FilterType.Activation }),\n );\n // Send the message information filter\n expect(apiMock.sendCommand.mock.calls[1]![0]).toStrictEqual(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.MessageInfo,\n displayName: \"Permit2\",\n filtersCount: 2,\n signature: \"sig\",\n }),\n );\n // Send first array containing 1 element\n expect(apiMock.sendCommand.mock.calls[2]![0]).toStrictEqual(\n sendStructImplArray(1),\n );\n expect(apiMock.sendCommand.mock.calls[3]![0]).toStrictEqual(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.Raw,\n discarded: false,\n displayName: \"Spender\",\n signature: \"sig\",\n }),\n );\n expect(apiMock.sendCommand.mock.calls[4]![0]).toStrictEqual(\n sendStructImplField(\n Uint8Array.from([\n 0x00, 0x14, 0x7c, 0xeb, 0x23, 0xfd, 0x6b, 0xc0, 0xad, 0xd5, 0x9e,\n 0x62, 0xac, 0x25, 0x57, 0x82, 0x70, 0xcf, 0xf1, 0xb9, 0xf6, 0x19,\n ]),\n ),\n );\n // Send second empty array, with discarded filter\n expect(apiMock.sendCommand.mock.calls[5]![0]).toStrictEqual(\n sendStructImplArray(0),\n );\n expect(apiMock.sendCommand.mock.calls[6]![0]).toStrictEqual(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.DiscardedPath,\n path: \"beneficiaries.[]\",\n }),\n );\n expect(apiMock.sendCommand.mock.calls[7]![0]).toStrictEqual(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.Raw,\n discarded: true,\n displayName: \"Beneficiary\",\n signature: \"sig\",\n }),\n );\n });\n});\n"],
5
- "mappings": "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",
6
- "names": ["import_context_module", "import_device_management_kit", "import_purify_ts", "import_ProvideProxyInfoCommand", "import_ProvideTokenInformationCommand", "import_SendEIP712FilteringCommand", "import_SendEIP712StructDefinitionCommand", "import_SendEIP712StructImplemCommand", "import_makeInternalApi", "import_Types", "import_ProvideEIP712ContextTask", "apiMock", "provideContextFactoryMock", "contextModuleMock", "TEST_TYPES", "TEST_DOMAIN_VALUES", "TEST_MESSAGE_VALUES", "TEST_CLEAR_SIGN_CONTEXT", "ADDRESS", "STRING", "UINT256", "UINT160", "UINT48", "CUSTOM", "name", "sendStructDefName", "sendStructDefField", "type", "sendStructImplRoot", "value", "sendStructImplArray", "sendStructImplField", "data", "args", "proxy", "clearSignContext", "promise"]
4
+ "sourcesContent": ["import {\n type ClearSignContextSuccess,\n ClearSignContextType,\n TypedDataCalldataParamPresence,\n type TypedDataClearSignContextSuccess,\n} from \"@ledgerhq/context-module\";\nimport {\n CommandResultFactory,\n DeviceModelId,\n hexaStringToBuffer,\n LoadCertificateCommand,\n UnknownDeviceExchangeError,\n} from \"@ledgerhq/device-management-kit\";\nimport { Just, Nothing } from \"purify-ts\";\n\nimport { ProvideProxyInfoCommand } from \"@internal/app-binder/command/ProvideProxyInfoCommand\";\nimport { ProvideTokenInformationCommand } from \"@internal/app-binder/command/ProvideTokenInformationCommand\";\nimport {\n CalldataParamPresence,\n Eip712FilterType,\n SendEIP712FilteringCommand,\n} from \"@internal/app-binder/command/SendEIP712FilteringCommand\";\nimport {\n SendEIP712StructDefinitionCommand,\n StructDefinitionCommand,\n} from \"@internal/app-binder/command/SendEIP712StructDefinitionCommand\";\nimport {\n SendEIP712StructImplemCommand,\n StructImplemType,\n} from \"@internal/app-binder/command/SendEIP712StructImplemCommand\";\nimport { makeDeviceActionInternalApiMock } from \"@internal/app-binder/device-action/__test-utils__/makeInternalApi\";\nimport {\n type FieldType,\n PrimitiveType,\n StructType,\n TypedDataValueArray,\n TypedDataValueField,\n TypedDataValueRoot,\n} from \"@internal/typed-data/model/Types\";\n\nimport {\n ProvideEIP712ContextTask,\n type ProvideEIP712ContextTaskArgs,\n} from \"./ProvideEIP712ContextTask\";\n\ndescribe(\"ProvideEIP712ContextTask\", () => {\n const apiMock = makeDeviceActionInternalApiMock();\n const provideContextFactoryMock = vi.fn();\n const contextModuleMock = {\n getFieldContext: vi.fn(),\n getContexts: vi.fn(),\n getTypedDataFilters: vi.fn(),\n getSolanaContext: vi.fn(),\n };\n\n const TEST_TYPES = {\n EIP712Domain: {\n name: new PrimitiveType(\"string\", \"string\", Nothing),\n chainId: new PrimitiveType(\"uint256\", \"uint\", Just(32)),\n verifyingContract: new PrimitiveType(\"address\", \"address\", Nothing),\n },\n PermitSingle: {\n details: new StructType(\"PermitDetails\"),\n spender: new PrimitiveType(\"address\", \"address\", Nothing),\n sigDeadline: new PrimitiveType(\"uint256\", \"uint\", Just(32)),\n },\n PermitDetails: {\n token: new PrimitiveType(\"address\", \"address\", Nothing),\n amount: new PrimitiveType(\"uint160\", \"uint\", Just(20)),\n expiration: new PrimitiveType(\"uint48\", \"uint\", Just(6)),\n nonce: new PrimitiveType(\"uint48\", \"uint\", Just(6)),\n },\n };\n const TEST_DOMAIN_VALUES = [\n {\n path: \"\",\n type: \"\",\n value: new TypedDataValueRoot(\"EIP712Domain\"),\n },\n {\n path: \"name\",\n type: \"string\",\n value: new TypedDataValueField(new TextEncoder().encode(\"Permit2\")),\n },\n {\n path: \"chainId\",\n type: \"uint256\",\n value: new TypedDataValueField(Uint8Array.from([137])),\n },\n {\n path: \"verifyingContract\",\n type: \"address\",\n value: new TypedDataValueField(\n hexaStringToBuffer(\"0x000000000022d473030f116ddee9f6b43ac78ba3\")!,\n ),\n },\n ];\n const TEST_MESSAGE_VALUES = [\n {\n path: \"\",\n type: \"\",\n value: new TypedDataValueRoot(\"PermitSingle\"),\n },\n {\n path: \"details.token\",\n type: \"address\",\n value: new TypedDataValueField(\n hexaStringToBuffer(\"0x7ceb23fd6bc0add59e62ac25578270cff1b9f619\")!,\n ),\n },\n {\n path: \"details.amount\",\n type: \"uint160\",\n value: new TypedDataValueField(Uint8Array.from([0x12])),\n },\n {\n path: \"details.expiration\",\n type: \"uint48\",\n value: new TypedDataValueField(Uint8Array.from([0x12])),\n },\n {\n path: \"details.nonce\",\n type: \"uint48\",\n value: new TypedDataValueField(Uint8Array.from([0x00])),\n },\n {\n path: \"spender\",\n type: \"address\",\n value: new TypedDataValueField(\n hexaStringToBuffer(\"0xec7be89e9d109e7e3fec59c222cf297125fefda2\")!,\n ),\n },\n {\n path: \"sigDeadline\",\n type: \"uint256\",\n value: new TypedDataValueField(Uint8Array.from([0x12])),\n },\n ];\n const TEST_CLEAR_SIGN_CONTEXT: TypedDataClearSignContextSuccess = {\n type: \"success\",\n messageInfo: {\n displayName: \"Permit2\",\n filtersCount: 4,\n signature:\n \"3045022100e3c597d13d28a87a88b0239404c668373cf5063362f2a81d09eed4582941dfe802207669aabb504fd5b95b2734057f6b8bbf51f14a69a5f9bdf658a5952cefbf44d3\",\n },\n trustedNamesAddresses: {},\n calldatas: {},\n proxy: undefined,\n tokens: {\n 0: \"payload-0x7ceb23fd6bc0add59e62ac25578270cff1b9f619\",\n 255: \"payload-0x000000000022d473030f116ddee9f6b43ac78ba3\",\n },\n filters: {\n \"details.amount\": {\n displayName: \"Amount allowance\",\n path: \"details.amount\",\n signature:\n \"304402201a46e6b4ef89eaf9fcf4945d053bfc5616a826400fd758312fbbe976bafc07ec022025a9b408722baf983ee053f90179c75b0c55bb0668f437d55493e36069bbd5a3\",\n tokenIndex: 255,\n type: \"amount\",\n },\n \"details.expiration\": {\n displayName: \"Approval expire\",\n path: \"details.expiration\",\n signature:\n \"3044022056b3381e4540629ad73bc434ec49d80523234b82f62340fbb77157fb0eb21a680220459fe9cf6ca309f9c7dfc6d4711fea1848dba661563c57f77b3c2dc480b3a63b\",\n type: \"datetime\",\n },\n \"details.token\": {\n displayName: \"Amount allowance\",\n path: \"details.token\",\n signature:\n \"3044022075103b38995e031d1ebbfe38ac6603bec32854b5146a664e49b4cc4f460c1da6022029f4b0fd1f3b7995ffff1627d4b57f27888a2dcc9b3a4e85c37c67571092c733\",\n tokenIndex: 0,\n type: \"token\",\n },\n spender: {\n displayName: \"Approve to spender\",\n path: \"spender\",\n signature:\n \"3044022033e5713d9cb9bc375b56a9fb53b736c81ea3c4ac5cfb2d3ca7f8b8f0558fe2430220543ca4fef6d6f725f29e343f167fe9dd582aa856ecb5797259050eb990a1befb\",\n type: \"raw\",\n },\n },\n };\n\n const ADDRESS = new PrimitiveType(\"address\", \"address\", Nothing);\n const STRING = new PrimitiveType(\"string\", \"string\", Nothing);\n const UINT256 = new PrimitiveType(\"uint256\", \"uint\", Just(32));\n const UINT160 = new PrimitiveType(\"uint160\", \"uint\", Just(20));\n const UINT48 = new PrimitiveType(\"uint48\", \"uint\", Just(6));\n const CUSTOM = (name: string) => new StructType(name);\n\n const sendStructDefName = (name: string) =>\n new SendEIP712StructDefinitionCommand({\n command: StructDefinitionCommand.Name,\n name,\n });\n const sendStructDefField = (name: string, type: FieldType) =>\n new SendEIP712StructDefinitionCommand({\n command: StructDefinitionCommand.Field,\n name,\n type,\n });\n const sendStructImplRoot = (value: string) =>\n new SendEIP712StructImplemCommand({\n type: StructImplemType.ROOT,\n value,\n });\n const sendStructImplArray = (value: number) =>\n new SendEIP712StructImplemCommand({\n type: StructImplemType.ARRAY,\n value,\n });\n const sendStructImplField = (data: Uint8Array) =>\n new SendEIP712StructImplemCommand({\n type: StructImplemType.FIELD,\n value: {\n data,\n isLastChunk: true,\n },\n });\n\n beforeEach(() => {\n vi.resetAllMocks();\n provideContextFactoryMock.mockReturnValue({\n run: async () => undefined,\n });\n });\n\n it(\"Send context with no clear signing context\", async () => {\n // GIVEN\n const args: ProvideEIP712ContextTaskArgs = {\n deviceModelId: DeviceModelId.STAX,\n derivationPath: \"44'/60'/0'/0/0\",\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n clearSignContext: Nothing,\n calldatasContexts: {},\n };\n // WHEN\n apiMock.sendCommand.mockResolvedValue(\n CommandResultFactory({ data: undefined }),\n );\n await new ProvideEIP712ContextTask(\n apiMock,\n contextModuleMock,\n args,\n provideContextFactoryMock,\n ).run();\n\n // THEN\n expect(apiMock.sendCommand.mock.calls).toHaveLength(24);\n // Send Struct definitions\n expect(apiMock.sendCommand.mock.calls[0]![0]).toStrictEqual(\n sendStructDefName(\"EIP712Domain\"),\n );\n expect(apiMock.sendCommand.mock.calls[1]![0]).toStrictEqual(\n sendStructDefField(\"name\", STRING),\n );\n expect(apiMock.sendCommand.mock.calls[2]![0]).toStrictEqual(\n sendStructDefField(\"chainId\", UINT256),\n );\n expect(apiMock.sendCommand.mock.calls[3]![0]).toStrictEqual(\n sendStructDefField(\"verifyingContract\", ADDRESS),\n );\n expect(apiMock.sendCommand.mock.calls[4]![0]).toStrictEqual(\n sendStructDefName(\"PermitDetails\"),\n );\n expect(apiMock.sendCommand.mock.calls[5]![0]).toStrictEqual(\n sendStructDefField(\"token\", ADDRESS),\n );\n expect(apiMock.sendCommand.mock.calls[6]![0]).toStrictEqual(\n sendStructDefField(\"amount\", UINT160),\n );\n expect(apiMock.sendCommand.mock.calls[7]![0]).toStrictEqual(\n sendStructDefField(\"expiration\", UINT48),\n );\n expect(apiMock.sendCommand.mock.calls[8]![0]).toStrictEqual(\n sendStructDefField(\"nonce\", UINT48),\n );\n expect(apiMock.sendCommand.mock.calls[9]![0]).toStrictEqual(\n sendStructDefName(\"PermitSingle\"),\n );\n expect(apiMock.sendCommand.mock.calls[10]![0]).toStrictEqual(\n sendStructDefField(\"details\", CUSTOM(\"PermitDetails\")),\n );\n expect(apiMock.sendCommand.mock.calls[11]![0]).toStrictEqual(\n sendStructDefField(\"spender\", ADDRESS),\n );\n expect(apiMock.sendCommand.mock.calls[12]![0]).toStrictEqual(\n sendStructDefField(\"sigDeadline\", UINT256),\n );\n // Send the domain values\n expect(apiMock.sendCommand.mock.calls[13]![0]).toStrictEqual(\n sendStructImplRoot(\"EIP712Domain\"),\n );\n expect(apiMock.sendCommand.mock.calls[14]![0]).toStrictEqual(\n sendStructImplField(\n Uint8Array.from([0x00, 0x07, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x74, 0x32]),\n ),\n );\n expect(apiMock.sendCommand.mock.calls[15]![0]).toStrictEqual(\n sendStructImplField(Uint8Array.from([0x00, 0x01, 0x89])),\n );\n expect(apiMock.sendCommand.mock.calls[16]![0]).toStrictEqual(\n sendStructImplField(\n Uint8Array.from([\n 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0xd4, 0x73, 0x03,\n 0x0f, 0x11, 0x6d, 0xde, 0xe9, 0xf6, 0xb4, 0x3a, 0xc7, 0x8b, 0xa3,\n ]),\n ),\n );\n // Send the message values\n expect(apiMock.sendCommand.mock.calls[17]![0]).toStrictEqual(\n sendStructImplRoot(\"PermitSingle\"),\n );\n expect(apiMock.sendCommand.mock.calls[18]![0]).toStrictEqual(\n sendStructImplField(\n Uint8Array.from([\n 0x00, 0x14, 0x7c, 0xeb, 0x23, 0xfd, 0x6b, 0xc0, 0xad, 0xd5, 0x9e,\n 0x62, 0xac, 0x25, 0x57, 0x82, 0x70, 0xcf, 0xf1, 0xb9, 0xf6, 0x19,\n ]),\n ),\n );\n expect(apiMock.sendCommand.mock.calls[19]![0]).toStrictEqual(\n sendStructImplField(Uint8Array.from([0x00, 0x01, 0x12])),\n );\n expect(apiMock.sendCommand.mock.calls[20]![0]).toStrictEqual(\n sendStructImplField(Uint8Array.from([0x00, 0x01, 0x12])),\n );\n expect(apiMock.sendCommand.mock.calls[21]![0]).toStrictEqual(\n sendStructImplField(Uint8Array.from([0x00, 0x01, 0x00])),\n );\n expect(apiMock.sendCommand.mock.calls[22]![0]).toStrictEqual(\n sendStructImplField(\n Uint8Array.from([\n 0x00, 0x14, 0xec, 0x7b, 0xe8, 0x9e, 0x9d, 0x10, 0x9e, 0x7e, 0x3f,\n 0xec, 0x59, 0xc2, 0x22, 0xcf, 0x29, 0x71, 0x25, 0xfe, 0xfd, 0xa2,\n ]),\n ),\n );\n expect(apiMock.sendCommand.mock.calls[23]![0]).toStrictEqual(\n sendStructImplField(Uint8Array.from([0x00, 0x01, 0x12])),\n );\n });\n\n it(\"Send context with transaction check\", async () => {\n // GIVEN\n const args: ProvideEIP712ContextTaskArgs = {\n deviceModelId: DeviceModelId.STAX,\n derivationPath: \"44'/60'/0'/0/0\",\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n clearSignContext: Nothing,\n calldatasContexts: {},\n transactionChecks: {\n type: ClearSignContextType.TRANSACTION_CHECK,\n payload: \"transactionCheck\",\n certificate: {\n keyUsageNumber: 1,\n payload: new Uint8Array([0x01, 0x02, 0x03]),\n },\n },\n };\n // WHEN\n apiMock.sendCommand.mockResolvedValue(\n CommandResultFactory({ data: undefined }),\n );\n await new ProvideEIP712ContextTask(\n apiMock,\n contextModuleMock,\n args,\n provideContextFactoryMock,\n ).run();\n\n // THEN\n expect(apiMock.sendCommand.mock.calls).toHaveLength(25);\n });\n\n it(\"Send context with clear signing\", async () => {\n // GIVEN\n const args: ProvideEIP712ContextTaskArgs = {\n deviceModelId: DeviceModelId.STAX,\n derivationPath: \"44'/60'/0'/0/0\",\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n clearSignContext: Just(TEST_CLEAR_SIGN_CONTEXT),\n calldatasContexts: {},\n };\n apiMock.sendCommand\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: { tokenIndex: 4 } })) // First token provided\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: { tokenIndex: 5 } })); // Second token provided\n // WHEN\n apiMock.sendCommand.mockResolvedValue(\n CommandResultFactory({ data: undefined }),\n );\n await new ProvideEIP712ContextTask(\n apiMock,\n contextModuleMock,\n args,\n provideContextFactoryMock,\n ).run();\n\n // THEN\n expect(apiMock.sendCommand.mock.calls).toHaveLength(32);\n // Send Struct definitions\n expect(apiMock.sendCommand.mock.calls[0]![0]).toStrictEqual(\n sendStructDefName(\"EIP712Domain\"),\n );\n expect(apiMock.sendCommand.mock.calls[1]![0]).toStrictEqual(\n sendStructDefField(\"name\", STRING),\n );\n expect(apiMock.sendCommand.mock.calls[2]![0]).toStrictEqual(\n sendStructDefField(\"chainId\", UINT256),\n );\n expect(apiMock.sendCommand.mock.calls[3]![0]).toStrictEqual(\n sendStructDefField(\"verifyingContract\", ADDRESS),\n );\n expect(apiMock.sendCommand.mock.calls[4]![0]).toStrictEqual(\n sendStructDefName(\"PermitDetails\"),\n );\n expect(apiMock.sendCommand.mock.calls[5]![0]).toStrictEqual(\n sendStructDefField(\"token\", ADDRESS),\n );\n expect(apiMock.sendCommand.mock.calls[6]![0]).toStrictEqual(\n sendStructDefField(\"amount\", UINT160),\n );\n expect(apiMock.sendCommand.mock.calls[7]![0]).toStrictEqual(\n sendStructDefField(\"expiration\", UINT48),\n );\n expect(apiMock.sendCommand.mock.calls[8]![0]).toStrictEqual(\n sendStructDefField(\"nonce\", UINT48),\n );\n expect(apiMock.sendCommand.mock.calls[9]![0]).toStrictEqual(\n sendStructDefName(\"PermitSingle\"),\n );\n expect(apiMock.sendCommand.mock.calls[10]![0]).toStrictEqual(\n sendStructDefField(\"details\", CUSTOM(\"PermitDetails\")),\n );\n expect(apiMock.sendCommand.mock.calls[11]![0]).toStrictEqual(\n sendStructDefField(\"spender\", ADDRESS),\n );\n expect(apiMock.sendCommand.mock.calls[12]![0]).toStrictEqual(\n sendStructDefField(\"sigDeadline\", UINT256),\n );\n // Activate the filtering\n expect(apiMock.sendCommand.mock.calls[13]![0]).toStrictEqual(\n new SendEIP712FilteringCommand({ type: Eip712FilterType.Activation }),\n );\n // Send the domain values\n expect(apiMock.sendCommand.mock.calls[14]![0]).toStrictEqual(\n sendStructImplRoot(\"EIP712Domain\"),\n );\n expect(apiMock.sendCommand.mock.calls[15]![0]).toStrictEqual(\n sendStructImplField(\n Uint8Array.from([0x00, 0x07, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x74, 0x32]),\n ),\n );\n expect(apiMock.sendCommand.mock.calls[16]![0]).toStrictEqual(\n sendStructImplField(Uint8Array.from([0x00, 0x01, 0x89])),\n );\n expect(apiMock.sendCommand.mock.calls[17]![0]).toStrictEqual(\n sendStructImplField(\n Uint8Array.from([\n 0x00, 0x14, 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0xd4, 0x73, 0x03,\n 0x0f, 0x11, 0x6d, 0xde, 0xe9, 0xf6, 0xb4, 0x3a, 0xc7, 0x8b, 0xa3,\n ]),\n ),\n );\n // Send the message information filter\n expect(apiMock.sendCommand.mock.calls[18]![0]).toStrictEqual(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.MessageInfo,\n displayName: \"Permit2\",\n filtersCount: 4,\n signature:\n \"3045022100e3c597d13d28a87a88b0239404c668373cf5063362f2a81d09eed4582941dfe802207669aabb504fd5b95b2734057f6b8bbf51f14a69a5f9bdf658a5952cefbf44d3\",\n }),\n );\n // Send the message values with corresponding filters\n expect(apiMock.sendCommand.mock.calls[19]![0]).toStrictEqual(\n sendStructImplRoot(\"PermitSingle\"),\n );\n expect(apiMock.sendCommand.mock.calls[20]![0]).toStrictEqual(\n new ProvideTokenInformationCommand({\n payload: \"payload-0x7ceb23fd6bc0add59e62ac25578270cff1b9f619\",\n }),\n );\n expect(apiMock.sendCommand.mock.calls[21]![0]).toStrictEqual(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.Token,\n discarded: false,\n tokenIndex: 4,\n signature:\n \"3044022075103b38995e031d1ebbfe38ac6603bec32854b5146a664e49b4cc4f460c1da6022029f4b0fd1f3b7995ffff1627d4b57f27888a2dcc9b3a4e85c37c67571092c733\",\n }),\n );\n expect(apiMock.sendCommand.mock.calls[22]![0]).toStrictEqual(\n sendStructImplField(\n Uint8Array.from([\n 0x00, 0x14, 0x7c, 0xeb, 0x23, 0xfd, 0x6b, 0xc0, 0xad, 0xd5, 0x9e,\n 0x62, 0xac, 0x25, 0x57, 0x82, 0x70, 0xcf, 0xf1, 0xb9, 0xf6, 0x19,\n ]),\n ),\n );\n expect(apiMock.sendCommand.mock.calls[23]![0]).toStrictEqual(\n new ProvideTokenInformationCommand({\n payload: \"payload-0x000000000022d473030f116ddee9f6b43ac78ba3\",\n }),\n );\n expect(apiMock.sendCommand.mock.calls[24]![0]).toStrictEqual(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.Amount,\n discarded: false,\n displayName: \"Amount allowance\",\n tokenIndex: 255,\n signature:\n \"304402201a46e6b4ef89eaf9fcf4945d053bfc5616a826400fd758312fbbe976bafc07ec022025a9b408722baf983ee053f90179c75b0c55bb0668f437d55493e36069bbd5a3\",\n }),\n );\n expect(apiMock.sendCommand.mock.calls[25]![0]).toStrictEqual(\n sendStructImplField(Uint8Array.from([0x00, 0x01, 0x12])),\n );\n expect(apiMock.sendCommand.mock.calls[26]![0]).toStrictEqual(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.Datetime,\n discarded: false,\n displayName: \"Approval expire\",\n signature:\n \"3044022056b3381e4540629ad73bc434ec49d80523234b82f62340fbb77157fb0eb21a680220459fe9cf6ca309f9c7dfc6d4711fea1848dba661563c57f77b3c2dc480b3a63b\",\n }),\n );\n expect(apiMock.sendCommand.mock.calls[27]![0]).toStrictEqual(\n sendStructImplField(Uint8Array.from([0x00, 0x01, 0x12])),\n );\n expect(apiMock.sendCommand.mock.calls[28]![0]).toStrictEqual(\n sendStructImplField(Uint8Array.from([0x00, 0x01, 0x00])),\n );\n expect(apiMock.sendCommand.mock.calls[29]![0]).toStrictEqual(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.Raw,\n discarded: false,\n displayName: \"Approve to spender\",\n signature:\n \"3044022033e5713d9cb9bc375b56a9fb53b736c81ea3c4ac5cfb2d3ca7f8b8f0558fe2430220543ca4fef6d6f725f29e343f167fe9dd582aa856ecb5797259050eb990a1befb\",\n }),\n );\n expect(apiMock.sendCommand.mock.calls[30]![0]).toStrictEqual(\n sendStructImplField(\n Uint8Array.from([\n 0x00, 0x14, 0xec, 0x7b, 0xe8, 0x9e, 0x9d, 0x10, 0x9e, 0x7e, 0x3f,\n 0xec, 0x59, 0xc2, 0x22, 0xcf, 0x29, 0x71, 0x25, 0xfe, 0xfd, 0xa2,\n ]),\n ),\n );\n expect(apiMock.sendCommand.mock.calls[31]![0]).toStrictEqual(\n sendStructImplField(Uint8Array.from([0x00, 0x01, 0x12])),\n );\n });\n\n it(\"Both tokens unavailable\", async () => {\n // GIVEN\n const args: ProvideEIP712ContextTaskArgs = {\n deviceModelId: DeviceModelId.STAX,\n derivationPath: \"44'/60'/0'/0/0\",\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n clearSignContext: Just({\n type: \"success\",\n messageInfo: TEST_CLEAR_SIGN_CONTEXT.messageInfo,\n filters: TEST_CLEAR_SIGN_CONTEXT.filters,\n trustedNamesAddresses: {},\n calldatas: {},\n proxy: undefined,\n tokens: {},\n }),\n calldatasContexts: {},\n };\n\n // WHEN\n apiMock.sendCommand.mockResolvedValue(\n CommandResultFactory({ data: undefined }),\n );\n await new ProvideEIP712ContextTask(\n apiMock,\n contextModuleMock,\n args,\n provideContextFactoryMock,\n ).run();\n\n // THEN\n expect(apiMock.sendCommand).not.toHaveBeenCalledWith(\n new ProvideTokenInformationCommand({\n payload: \"payload-0x7ceb23fd6bc0add59e62ac25578270cff1b9f619\",\n }),\n );\n expect(apiMock.sendCommand).not.toHaveBeenCalledWith(\n new ProvideTokenInformationCommand({\n payload: \"payload-0x000000000022d473030f116ddee9f6b43ac78ba3\",\n }),\n );\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.Token,\n discarded: false,\n tokenIndex: 0,\n signature:\n \"3044022075103b38995e031d1ebbfe38ac6603bec32854b5146a664e49b4cc4f460c1da6022029f4b0fd1f3b7995ffff1627d4b57f27888a2dcc9b3a4e85c37c67571092c733\",\n }),\n );\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.Amount,\n discarded: false,\n displayName: \"Amount allowance\",\n tokenIndex: 1,\n signature:\n \"304402201a46e6b4ef89eaf9fcf4945d053bfc5616a826400fd758312fbbe976bafc07ec022025a9b408722baf983ee053f90179c75b0c55bb0668f437d55493e36069bbd5a3\",\n }),\n );\n });\n\n it(\"Provide calldata filters\", async () => {\n // GIVEN\n const args: ProvideEIP712ContextTaskArgs = {\n deviceModelId: DeviceModelId.STAX,\n derivationPath: \"44'/60'/0'/0/0\",\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n clearSignContext: Just({\n type: \"success\",\n messageInfo: TEST_CLEAR_SIGN_CONTEXT.messageInfo,\n filters: {\n \"details.amount\": {\n displayName: \"Value\",\n path: \"details.amount\",\n signature:\n \"304402201a46e6b4ef89eaf9fcf4945d053bfc5616a826400fd758312fbbe976bafc07ec022025a9b408722baf983ee053f90179c75b0c55bb0668f437d55493e36069bbd5a3\",\n calldataIndex: 0,\n type: \"calldata-value\",\n },\n \"details.expiration\": {\n displayName: \"Callee\",\n path: \"details.expiration\",\n signature:\n \"304502201a46e6b4ef89eaf9fcf4945d053bfc5616a826400fd758312fbbe976bafc07ec022025a9b408722baf983ee053f90179c75b0c55bb0668f437d55493e36069bbd5a3\",\n calldataIndex: 0,\n type: \"calldata-callee\",\n },\n spender: {\n displayName: \"Spender\",\n path: \"spender\",\n signature:\n \"304602201a46e6b4ef89eaf9fcf4945d053bfc5616a826400fd758312fbbe976bafc07ec022025a9b408722baf983ee053f90179c75b0c55bb0668f437d55493e36069bbd5a3\",\n calldataIndex: 0,\n type: \"calldata-spender\",\n },\n \"details.token\": {\n displayName: \"Chain ID\",\n path: \"details.token\",\n signature:\n \"304702201a46e6b4ef89eaf9fcf4945d053bfc5616a826400fd758312fbbe976bafc07ec022025a9b408722baf983ee053f90179c75b0c55bb0668f437d55493e36069bbd5a3\",\n calldataIndex: 0,\n type: \"calldata-chain-id\",\n },\n \"details.nonce\": {\n displayName: \"Chain ID\",\n path: \"details.nonce\",\n signature:\n \"304802201a46e6b4ef89eaf9fcf4945d053bfc5616a826400fd758312fbbe976bafc07ec022025a9b408722baf983ee053f90179c75b0c55bb0668f437d55493e36069bbd5a3\",\n calldataIndex: 1,\n type: \"calldata-selector\",\n },\n sigDeadline: {\n displayName: \"Amount\",\n path: \"sigDeadline\",\n signature:\n \"304902201a46e6b4ef89eaf9fcf4945d053bfc5616a826400fd758312fbbe976bafc07ec022025a9b408722baf983ee053f90179c75b0c55bb0668f437d55493e36069bbd5a3\",\n calldataIndex: 1,\n type: \"calldata-amount\",\n },\n },\n trustedNamesAddresses: {},\n calldatas: {\n 0: {\n filter: {\n calldataIndex: 0,\n displayName: \"Transaction\",\n valueFlag: true,\n calleeFlag: TypedDataCalldataParamPresence.Present,\n chainIdFlag: false,\n selectorFlag: false,\n amountFlag: true,\n spenderFlag: TypedDataCalldataParamPresence.VerifyingContract,\n signature:\n \"3045022100d8496ab69152efeef6a923a3ebd225334ad65dcb985814994243be7bc09bf27e02206314835816908dd6d51d3cbb0f9465d91d7ddc9104b34dd6c4247f65c551836e\",\n },\n subset: {\n chainId: 0x1234,\n data: \"0x6a76120200000000000000000000000023f8abfc2824c397ccb3da89ae772984107ddb99\",\n from: \"0x8ceb23fd6bc0add59e62ac25578270cff1b9f619\",\n selector: \"0x778899aa\",\n to: \"0x7ceb23fd6bc0add59e62ac25578270cff1b9f619\",\n value: 4200000000000000n,\n },\n },\n 1: {\n filter: {\n calldataIndex: 1,\n displayName: \"Transaction\",\n valueFlag: true,\n calleeFlag: TypedDataCalldataParamPresence.Present,\n chainIdFlag: false,\n selectorFlag: false,\n amountFlag: true,\n spenderFlag: TypedDataCalldataParamPresence.VerifyingContract,\n signature:\n \"3045932100d8496ab69152efeef6a923a3ebd225334ad65dcb985814994243be7bc09bf27e02206314835816908dd6d51d3cbb0f9465d91d7ddc9104b34dd6c4247f65c551836e\",\n },\n subset: {\n chainId: 0x1235,\n data: \"0x6a76120200000000000000000000000023f8abfc2824c397ccb3da89ae772984107ddb99\",\n from: \"0x8ceb23fd6bc0add59e62ac25578270cff1b9f619\",\n selector: \"0x778899aa\",\n to: \"0x7ceb23fd6bc0add59e62ac25578270cff1b9f619\",\n value: 4300000000000000n,\n },\n },\n },\n proxy: undefined,\n tokens: {},\n }),\n calldatasContexts: {\n 0: [],\n },\n };\n\n // WHEN\n apiMock.sendCommand.mockResolvedValue(\n CommandResultFactory({ data: undefined }),\n );\n await new ProvideEIP712ContextTask(\n apiMock,\n contextModuleMock,\n args,\n provideContextFactoryMock,\n ).run();\n\n // THEN\n expect(provideContextFactoryMock).toHaveBeenCalledTimes(1);\n expect(provideContextFactoryMock).toHaveBeenCalledWith({\n contexts: [],\n derivationPath: \"44'/60'/0'/0/0\",\n });\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.CalldataInfo,\n discarded: false,\n calldataIndex: 0,\n valueFlag: true,\n calleeFlag: CalldataParamPresence.Present,\n chainIdFlag: false,\n selectorFlag: false,\n amountFlag: true,\n spenderFlag: CalldataParamPresence.VerifyingContract,\n signature:\n \"3045022100d8496ab69152efeef6a923a3ebd225334ad65dcb985814994243be7bc09bf27e02206314835816908dd6d51d3cbb0f9465d91d7ddc9104b34dd6c4247f65c551836e\",\n }),\n );\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.CalldataValue,\n discarded: false,\n calldataIndex: 0,\n signature:\n \"304402201a46e6b4ef89eaf9fcf4945d053bfc5616a826400fd758312fbbe976bafc07ec022025a9b408722baf983ee053f90179c75b0c55bb0668f437d55493e36069bbd5a3\",\n }),\n );\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.CalldataCallee,\n discarded: false,\n calldataIndex: 0,\n signature:\n \"304502201a46e6b4ef89eaf9fcf4945d053bfc5616a826400fd758312fbbe976bafc07ec022025a9b408722baf983ee053f90179c75b0c55bb0668f437d55493e36069bbd5a3\",\n }),\n );\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.CalldataSpender,\n discarded: false,\n calldataIndex: 0,\n signature:\n \"304602201a46e6b4ef89eaf9fcf4945d053bfc5616a826400fd758312fbbe976bafc07ec022025a9b408722baf983ee053f90179c75b0c55bb0668f437d55493e36069bbd5a3\",\n }),\n );\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.CalldataChainId,\n discarded: false,\n calldataIndex: 0,\n signature:\n \"304702201a46e6b4ef89eaf9fcf4945d053bfc5616a826400fd758312fbbe976bafc07ec022025a9b408722baf983ee053f90179c75b0c55bb0668f437d55493e36069bbd5a3\",\n }),\n );\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.CalldataInfo,\n discarded: false,\n calldataIndex: 1,\n valueFlag: true,\n calleeFlag: CalldataParamPresence.Present,\n chainIdFlag: false,\n selectorFlag: false,\n amountFlag: true,\n spenderFlag: CalldataParamPresence.VerifyingContract,\n signature:\n \"3045932100d8496ab69152efeef6a923a3ebd225334ad65dcb985814994243be7bc09bf27e02206314835816908dd6d51d3cbb0f9465d91d7ddc9104b34dd6c4247f65c551836e\",\n }),\n );\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.CalldataSelector,\n discarded: false,\n calldataIndex: 1,\n signature:\n \"304802201a46e6b4ef89eaf9fcf4945d053bfc5616a826400fd758312fbbe976bafc07ec022025a9b408722baf983ee053f90179c75b0c55bb0668f437d55493e36069bbd5a3\",\n }),\n );\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.CalldataAmount,\n discarded: false,\n calldataIndex: 1,\n signature:\n \"304902201a46e6b4ef89eaf9fcf4945d053bfc5616a826400fd758312fbbe976bafc07ec022025a9b408722baf983ee053f90179c75b0c55bb0668f437d55493e36069bbd5a3\",\n }),\n );\n });\n\n it(\"First token unavailable\", async () => {\n // GIVEN\n const args: ProvideEIP712ContextTaskArgs = {\n deviceModelId: DeviceModelId.STAX,\n derivationPath: \"44'/60'/0'/0/0\",\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n clearSignContext: Just({\n type: \"success\",\n messageInfo: TEST_CLEAR_SIGN_CONTEXT.messageInfo,\n filters: TEST_CLEAR_SIGN_CONTEXT.filters,\n trustedNamesAddresses: {},\n calldatas: {},\n proxy: undefined,\n tokens: { 255: \"payload-0x000000000022d473030f116ddee9f6b43ac78ba3\" },\n }),\n calldatasContexts: {},\n };\n\n // WHEN\n apiMock.sendCommand.mockResolvedValue(\n CommandResultFactory({ data: { tokenIndex: 4 } }),\n );\n await new ProvideEIP712ContextTask(\n apiMock,\n contextModuleMock,\n args,\n provideContextFactoryMock,\n ).run();\n\n // THEN\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.Token,\n discarded: false,\n tokenIndex: 0,\n signature:\n \"3044022075103b38995e031d1ebbfe38ac6603bec32854b5146a664e49b4cc4f460c1da6022029f4b0fd1f3b7995ffff1627d4b57f27888a2dcc9b3a4e85c37c67571092c733\",\n }),\n );\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.Amount,\n discarded: false,\n displayName: \"Amount allowance\",\n tokenIndex: 255,\n signature:\n \"304402201a46e6b4ef89eaf9fcf4945d053bfc5616a826400fd758312fbbe976bafc07ec022025a9b408722baf983ee053f90179c75b0c55bb0668f437d55493e36069bbd5a3\",\n }),\n );\n });\n\n it(\"Second token unavailable\", async () => {\n // GIVEN\n const args: ProvideEIP712ContextTaskArgs = {\n deviceModelId: DeviceModelId.STAX,\n derivationPath: \"44'/60'/0'/0/0\",\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n clearSignContext: Just({\n type: \"success\",\n messageInfo: TEST_CLEAR_SIGN_CONTEXT.messageInfo,\n filters: TEST_CLEAR_SIGN_CONTEXT.filters,\n trustedNamesAddresses: {},\n calldatas: {},\n proxy: undefined,\n tokens: { 0: \"payload-0x7ceb23fd6bc0add59e62ac25578270cff1b9f619\" },\n }),\n calldatasContexts: {},\n };\n\n // WHEN\n apiMock.sendCommand.mockResolvedValue(\n CommandResultFactory({ data: { tokenIndex: 4 } }),\n );\n await new ProvideEIP712ContextTask(\n apiMock,\n contextModuleMock,\n args,\n provideContextFactoryMock,\n ).run();\n\n // THEN\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.Token,\n discarded: false,\n tokenIndex: 4,\n signature:\n \"3044022075103b38995e031d1ebbfe38ac6603bec32854b5146a664e49b4cc4f460c1da6022029f4b0fd1f3b7995ffff1627d4b57f27888a2dcc9b3a4e85c37c67571092c733\",\n }),\n );\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.Amount,\n discarded: false,\n displayName: \"Amount allowance\",\n tokenIndex: 0,\n signature:\n \"304402201a46e6b4ef89eaf9fcf4945d053bfc5616a826400fd758312fbbe976bafc07ec022025a9b408722baf983ee053f90179c75b0c55bb0668f437d55493e36069bbd5a3\",\n }),\n );\n });\n\n it(\"Provide proxy\", async () => {\n // GIVEN\n const proxy: ClearSignContextSuccess<ClearSignContextType.PROXY_INFO> = {\n type: ClearSignContextType.PROXY_INFO,\n payload: \"0x010203\",\n };\n const clearSignContext: TypedDataClearSignContextSuccess = {\n ...TEST_CLEAR_SIGN_CONTEXT,\n proxy,\n };\n const args: ProvideEIP712ContextTaskArgs = {\n deviceModelId: DeviceModelId.STAX,\n derivationPath: \"44'/60'/0'/0/0\",\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n clearSignContext: Just(clearSignContext),\n calldatasContexts: {},\n };\n\n // WHEN\n apiMock.sendCommand.mockResolvedValue(\n CommandResultFactory({ data: { tokenIndex: 4 } }),\n );\n await new ProvideEIP712ContextTask(\n apiMock,\n contextModuleMock,\n args,\n provideContextFactoryMock,\n ).run();\n\n // THEN\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n new ProvideProxyInfoCommand({\n data: hexaStringToBuffer(\"0x0003010203\")!,\n isFirstChunk: true,\n }),\n );\n });\n\n it(\"Send certificate from clearSignContext\", async () => {\n // GIVEN\n const certificatePayload = new Uint8Array([0x01, 0x02, 0x03, 0x04, 0x05]);\n const keyUsage = 2;\n const clearSignContext: TypedDataClearSignContextSuccess = {\n ...TEST_CLEAR_SIGN_CONTEXT,\n certificate: {\n keyUsageNumber: keyUsage,\n payload: certificatePayload,\n },\n };\n const args: ProvideEIP712ContextTaskArgs = {\n deviceModelId: DeviceModelId.STAX,\n derivationPath: \"44'/60'/0'/0/0\",\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n clearSignContext: Just(clearSignContext),\n calldatasContexts: {},\n };\n\n // WHEN\n apiMock.sendCommand.mockResolvedValue(\n CommandResultFactory({ data: { tokenIndex: 4 } }),\n );\n await new ProvideEIP712ContextTask(\n apiMock,\n contextModuleMock,\n args,\n provideContextFactoryMock,\n ).run();\n\n // THEN\n // Verify LoadCertificateCommand was called with correct parameters\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n new LoadCertificateCommand({\n keyUsage: keyUsage,\n certificate: certificatePayload,\n }),\n );\n\n // Verify the certificate was loaded before struct definitions (should be first call)\n const calls = apiMock.sendCommand.mock.calls;\n const certificateCallIndex = calls.findIndex(\n (call) => call[0] instanceof LoadCertificateCommand,\n );\n expect(certificateCallIndex).toBeGreaterThanOrEqual(0);\n\n // Verify it was called before struct definitions\n const firstStructDefCallIndex = calls.findIndex(\n (call) => call[0] instanceof SendEIP712StructDefinitionCommand,\n );\n expect(certificateCallIndex).toBeLessThan(firstStructDefCallIndex);\n });\n\n it(\"Do not send certificate when not provided in clearSignContext\", async () => {\n // GIVEN\n const args: ProvideEIP712ContextTaskArgs = {\n deviceModelId: DeviceModelId.STAX,\n derivationPath: \"44'/60'/0'/0/0\",\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n clearSignContext: Just(TEST_CLEAR_SIGN_CONTEXT), // No certificate in this context\n calldatasContexts: {},\n };\n\n // WHEN\n apiMock.sendCommand.mockResolvedValue(\n CommandResultFactory({ data: { tokenIndex: 4 } }),\n );\n await new ProvideEIP712ContextTask(\n apiMock,\n contextModuleMock,\n args,\n provideContextFactoryMock,\n ).run();\n\n // THEN\n // Verify LoadCertificateCommand was not called\n const calls = apiMock.sendCommand.mock.calls;\n const certificateCallIndex = calls.findIndex(\n (call) => call[0] instanceof LoadCertificateCommand,\n );\n expect(certificateCallIndex).toBe(-1);\n });\n\n it(\"Error when providing tokens\", async () => {\n // GIVEN\n const args: ProvideEIP712ContextTaskArgs = {\n deviceModelId: DeviceModelId.STAX,\n derivationPath: \"44'/60'/0'/0/0\",\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n clearSignContext: Just(TEST_CLEAR_SIGN_CONTEXT),\n calldatasContexts: {},\n };\n apiMock.sendCommand.mockResolvedValueOnce(\n CommandResultFactory({\n error: new UnknownDeviceExchangeError(\"error\"),\n }),\n );\n // WHEN\n const promise = new ProvideEIP712ContextTask(\n apiMock,\n contextModuleMock,\n args,\n provideContextFactoryMock,\n ).run();\n\n // THEN\n await expect(promise).resolves.toStrictEqual(\n CommandResultFactory({\n error: new UnknownDeviceExchangeError(\"error\"),\n }),\n );\n });\n\n it(\"Error when sending struct definitions\", async () => {\n // GIVEN\n const args: ProvideEIP712ContextTaskArgs = {\n deviceModelId: DeviceModelId.STAX,\n derivationPath: \"44'/60'/0'/0/0\",\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n clearSignContext: Just(TEST_CLEAR_SIGN_CONTEXT),\n calldatasContexts: {},\n };\n apiMock.sendCommand\n .mockResolvedValueOnce(CommandResultFactory({ data: { tokenIndex: 4 } }))\n .mockResolvedValueOnce(CommandResultFactory({ data: { tokenIndex: 5 } }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(\n CommandResultFactory({\n error: new UnknownDeviceExchangeError(\"error\"),\n }),\n );\n // WHEN\n const promise = new ProvideEIP712ContextTask(\n apiMock,\n contextModuleMock,\n args,\n provideContextFactoryMock,\n ).run();\n\n // THEN\n await expect(promise).resolves.toStrictEqual(\n CommandResultFactory({ error: new UnknownDeviceExchangeError(\"error\") }),\n );\n });\n\n it(\"Error when sending struct implementations\", async () => {\n // GIVEN\n const args: ProvideEIP712ContextTaskArgs = {\n deviceModelId: DeviceModelId.STAX,\n derivationPath: \"44'/60'/0'/0/0\",\n types: TEST_TYPES,\n domain: TEST_DOMAIN_VALUES,\n message: TEST_MESSAGE_VALUES,\n clearSignContext: Nothing,\n calldatasContexts: {},\n };\n // WHEN\n apiMock.sendCommand\n // Struct definitions\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n .mockResolvedValueOnce(CommandResultFactory({ data: undefined }))\n // Struct implementations\n .mockResolvedValueOnce(\n CommandResultFactory({\n error: new UnknownDeviceExchangeError(\"error\"),\n }),\n )\n .mockResolvedValue(CommandResultFactory({ data: undefined }));\n const promise = new ProvideEIP712ContextTask(\n apiMock,\n contextModuleMock,\n args,\n provideContextFactoryMock,\n ).run();\n\n // THEN\n await expect(promise).resolves.toStrictEqual(\n CommandResultFactory({ error: new UnknownDeviceExchangeError(\"error\") }),\n );\n });\n\n it(\"Send struct array\", async () => {\n // GIVEN\n const args: ProvideEIP712ContextTaskArgs = {\n deviceModelId: DeviceModelId.STAX,\n derivationPath: \"44'/60'/0'/0/0\",\n types: {},\n domain: [],\n message: [\n // Array containing an element\n {\n path: \"spenders\",\n type: \"address[]\",\n value: new TypedDataValueArray(1),\n },\n {\n path: \"spenders.[]\",\n type: \"address\",\n value: new TypedDataValueField(\n hexaStringToBuffer(\"0x7ceb23fd6bc0add59e62ac25578270cff1b9f619\")!,\n ),\n },\n // Empty array\n {\n path: \"beneficiaries\",\n type: \"address[]\",\n value: new TypedDataValueArray(0),\n },\n ],\n clearSignContext: Just({\n type: \"success\",\n messageInfo: {\n displayName: \"Permit2\",\n filtersCount: 2,\n signature: \"sig\",\n },\n trustedNamesAddresses: {},\n calldatas: {},\n proxy: undefined,\n tokens: {},\n filters: {\n \"spenders.[]\": {\n displayName: \"Spender\",\n path: \"spenders.[]\",\n signature: \"sig\",\n type: \"raw\",\n },\n \"beneficiaries.[]\": {\n displayName: \"Beneficiary\",\n path: \"beneficiaries.[]\",\n signature: \"sig\",\n type: \"raw\",\n },\n },\n }),\n calldatasContexts: {},\n };\n // WHEN\n apiMock.sendCommand.mockResolvedValue(\n CommandResultFactory({ data: undefined }),\n );\n await new ProvideEIP712ContextTask(\n apiMock,\n contextModuleMock,\n args,\n provideContextFactoryMock,\n ).run();\n\n // THEN\n // Activate the filtering\n expect(apiMock.sendCommand.mock.calls[0]![0]).toStrictEqual(\n new SendEIP712FilteringCommand({ type: Eip712FilterType.Activation }),\n );\n // Send the message information filter\n expect(apiMock.sendCommand.mock.calls[1]![0]).toStrictEqual(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.MessageInfo,\n displayName: \"Permit2\",\n filtersCount: 2,\n signature: \"sig\",\n }),\n );\n // Send first array containing 1 element\n expect(apiMock.sendCommand.mock.calls[2]![0]).toStrictEqual(\n sendStructImplArray(1),\n );\n expect(apiMock.sendCommand.mock.calls[3]![0]).toStrictEqual(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.Raw,\n discarded: false,\n displayName: \"Spender\",\n signature: \"sig\",\n }),\n );\n expect(apiMock.sendCommand.mock.calls[4]![0]).toStrictEqual(\n sendStructImplField(\n Uint8Array.from([\n 0x00, 0x14, 0x7c, 0xeb, 0x23, 0xfd, 0x6b, 0xc0, 0xad, 0xd5, 0x9e,\n 0x62, 0xac, 0x25, 0x57, 0x82, 0x70, 0xcf, 0xf1, 0xb9, 0xf6, 0x19,\n ]),\n ),\n );\n // Send second empty array, with discarded filter\n expect(apiMock.sendCommand.mock.calls[5]![0]).toStrictEqual(\n sendStructImplArray(0),\n );\n expect(apiMock.sendCommand.mock.calls[6]![0]).toStrictEqual(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.DiscardedPath,\n path: \"beneficiaries.[]\",\n }),\n );\n expect(apiMock.sendCommand.mock.calls[7]![0]).toStrictEqual(\n new SendEIP712FilteringCommand({\n type: Eip712FilterType.Raw,\n discarded: true,\n displayName: \"Beneficiary\",\n signature: \"sig\",\n }),\n );\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["import_context_module", "import_device_management_kit", "import_purify_ts", "import_ProvideProxyInfoCommand", "import_ProvideTokenInformationCommand", "import_SendEIP712FilteringCommand", "import_SendEIP712StructDefinitionCommand", "import_SendEIP712StructImplemCommand", "import_makeInternalApi", "import_Types", "import_ProvideEIP712ContextTask", "apiMock", "provideContextFactoryMock", "contextModuleMock", "TEST_TYPES", "TEST_DOMAIN_VALUES", "TEST_MESSAGE_VALUES", "TEST_CLEAR_SIGN_CONTEXT", "ADDRESS", "STRING", "UINT256", "UINT160", "UINT48", "CUSTOM", "name", "sendStructDefName", "sendStructDefField", "type", "sendStructImplRoot", "value", "sendStructImplArray", "sendStructImplField", "data", "args", "proxy", "clearSignContext", "certificatePayload", "keyUsage", "calls", "certificateCallIndex", "call", "firstStructDefCallIndex", "promise"]
7
7
  }
@@ -38,8 +38,8 @@
38
38
  "license": "Apache-2.0",
39
39
  "name": "@ledgerhq/device-signer-kit-ethereum",
40
40
  "peerDependencies": {
41
- "@ledgerhq/context-module": "workspace:^",
42
- "@ledgerhq/device-management-kit": "workspace:^"
41
+ "@ledgerhq/context-module": "^1.12.0",
42
+ "@ledgerhq/device-management-kit": "^1.0.0"
43
43
  },
44
44
  "private": false,
45
45
  "repository": {
@@ -62,5 +62,5 @@
62
62
  "watch:builds": "pnpm ldmk-tool watch --entryPoints src/index.ts,src/**/*.ts --tsconfig tsconfig.prod.json",
63
63
  "watch:types": "concurrently \"tsc --watch -p tsconfig.prod.json\" \"tsc-alias --watch -p tsconfig.prod.json\""
64
64
  },
65
- "version": "1.9.4"
65
+ "version": "1.9.5"
66
66
  }
@@ -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_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};
1
+ import{ClearSignContextReferenceType as r,ClearSignContextType as t}from"@ledgerhq/context-module";import{bufferToHexaString as u,isSuccessCommandResult as d}from"@ledgerhq/device-management-kit";import{GetChallengeCommand as x}from"../../app-binder/command/GetChallengeCommand";class p{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,deviceModelId:this.args.deviceModelId},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=u(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,deviceModelId:this.args.deviceModelId},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 i=this.args.contextOptional.filter(l=>l.type===t.ENUM).find(l=>l.value===o&&l.id===e.id);i&&n.push(()=>Promise.resolve(i))}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=u(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{p 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_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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",
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 deviceModelId: this.args.deviceModelId,\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 deviceModelId: this.args.deviceModelId,\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.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)})})});
1
+ import{ClearSignContextReferenceType as d,ClearSignContextType as e}from"@ledgerhq/context-module";import{CommandResultFactory as h,DeviceModelId as i,UnknownDeviceExchangeError as g}from"@ledgerhq/device-management-kit";import{Left as k,Right as C}from"purify-ts";import{GetChallengeCommand as N}from"../../app-binder/command/GetChallengeCommand";import{makeDeviceActionInternalApiMock as I}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=I();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:i.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",deviceModelId:i.STAX},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(k(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(C(u));const y=new r(o,s).run();expect(y.subcontextCallbacks).toHaveLength(1);const b=y.subcontextCallbacks[0],T=await b();expect(T).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(C(u));const y=new r(o,s).run();expect(y.subcontextCallbacks).toHaveLength(2);const b=y.subcontextCallbacks[0],T=y.subcontextCallbacks[1],E=await b(),S=await T();expect(E).toEqual(a),expect(S).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(C(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(C(s));const u=new r(o,n).run();expect(u.subcontextCallbacks).toHaveLength(1);const y=u.subcontextCallbacks[0],b=await y();expect(b).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(C(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(C(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",deviceModelId:i.STAX},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",deviceModelId:i.STAX},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(C(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",deviceModelId:i.STAX},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",deviceModelId:i.STAX},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(C(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:i.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(C(a));const n=new g("Failed");o.sendCommand.mockResolvedValueOnce(h({error:n}));const s=new r(o,t).run();expect(s.subcontextCallbacks).toHaveLength(1);const u=s.subcontextCallbacks[0],y=await u();expect(y).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(C(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],y=await s(),b=await u();expect(y).toEqual({type:e.TOKEN,payload:"token result 1"}),expect(b).toEqual({type:e.TOKEN,payload:"token result 2"}),expect(x.getFieldContext).toHaveBeenCalledTimes(2),expect(x.getFieldContext).toHaveBeenNthCalledWith(1,{chainId:1,address:"0x030405060708090a0b0c0d0e0f10111213141516",deviceModelId:i.STAX},e.TOKEN),expect(x.getFieldContext).toHaveBeenNthCalledWith(2,{chainId:1,address:"0x232425262728292a2b2c2d2e2f30313233343536",deviceModelId:i.STAX},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:i.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 g("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:i.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:i.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(C(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",deviceModelId:i.STAX},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(C(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",deviceModelId:i.STAX},e.TOKEN)})})});
2
2
  //# sourceMappingURL=BuildSubcontextsTask.test.js.map