@ledgerhq/context-module 2.3.0 → 2.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (169) hide show
  1. package/lib/cjs/package.json +2 -2
  2. package/lib/cjs/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.js +1 -1
  3. package/lib/cjs/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.js.map +3 -3
  4. package/lib/cjs/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.test.js +1 -1
  5. package/lib/cjs/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.test.js.map +3 -3
  6. package/lib/cjs/src/modules/solana/alt-resolution/data/AltResolutionDataSource.js +1 -1
  7. package/lib/cjs/src/modules/solana/alt-resolution/data/AltResolutionDataSource.js.map +1 -1
  8. package/lib/cjs/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.js +1 -1
  9. package/lib/cjs/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.js.map +2 -2
  10. package/lib/cjs/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.js +1 -1
  11. package/lib/cjs/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.js.map +2 -2
  12. package/lib/cjs/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.js +1 -1
  13. package/lib/cjs/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.js.map +2 -2
  14. package/lib/cjs/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.test.js +1 -1
  15. package/lib/cjs/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.test.js.map +3 -3
  16. package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoDto.js +1 -1
  17. package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoDto.js.map +2 -2
  18. package/lib/cjs/src/modules/solana/lifi/domain/LifiContextLoader.js +1 -1
  19. package/lib/cjs/src/modules/solana/lifi/domain/LifiContextLoader.js.map +3 -3
  20. package/lib/cjs/src/modules/solana/lifi/domain/LifiContextLoader.test.js +1 -1
  21. package/lib/cjs/src/modules/solana/lifi/domain/LifiContextLoader.test.js.map +3 -3
  22. package/lib/cjs/src/modules/solana/model/SolanaContextTypes.js.map +1 -1
  23. package/lib/cjs/src/modules/solana/model/SolanaPayloads.js +1 -1
  24. package/lib/cjs/src/modules/solana/model/SolanaPayloads.js.map +2 -2
  25. package/lib/cjs/src/modules/solana/model/SolanaTransactionContext.js +1 -1
  26. package/lib/cjs/src/modules/solana/model/SolanaTransactionContext.js.map +1 -1
  27. package/lib/cjs/src/modules/solana/owner-info/data/HttpOwnerInfoDataSource.js +1 -1
  28. package/lib/cjs/src/modules/solana/owner-info/data/HttpOwnerInfoDataSource.js.map +2 -2
  29. package/lib/cjs/src/modules/solana/owner-info/data/HttpOwnerInfoDataSource.test.js +1 -1
  30. package/lib/cjs/src/modules/solana/owner-info/data/HttpOwnerInfoDataSource.test.js.map +2 -2
  31. package/lib/cjs/src/modules/solana/token/data/HttpMintToIdDataSource.js +2 -0
  32. package/lib/cjs/src/modules/solana/token/data/HttpMintToIdDataSource.js.map +7 -0
  33. package/lib/cjs/src/modules/solana/token/data/HttpMintToIdDataSource.test.js +2 -0
  34. package/lib/cjs/src/modules/solana/token/data/HttpMintToIdDataSource.test.js.map +7 -0
  35. package/lib/cjs/src/modules/solana/token/data/MintToIdDataSource.js +2 -0
  36. package/lib/cjs/src/modules/solana/token/data/MintToIdDataSource.js.map +7 -0
  37. package/lib/cjs/src/modules/solana/token/di/tokenModuleFactory.js +1 -1
  38. package/lib/cjs/src/modules/solana/token/di/tokenModuleFactory.js.map +3 -3
  39. package/lib/cjs/src/modules/solana/token/di/tokenTypes.js +1 -1
  40. package/lib/cjs/src/modules/solana/token/di/tokenTypes.js.map +2 -2
  41. package/lib/cjs/src/modules/solana/token/domain/TokenContextLoader.js +1 -1
  42. package/lib/cjs/src/modules/solana/token/domain/TokenContextLoader.js.map +3 -3
  43. package/lib/cjs/src/modules/solana/token/domain/TokenContextLoader.test.js +1 -1
  44. package/lib/cjs/src/modules/solana/token/domain/TokenContextLoader.test.js.map +3 -3
  45. package/lib/cjs/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.js +1 -1
  46. package/lib/cjs/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.js.map +2 -2
  47. package/lib/cjs/src/modules/solana/token-account-state/data/TokenAccountStateDataSource.js +1 -1
  48. package/lib/cjs/src/modules/solana/token-account-state/data/TokenAccountStateDataSource.js.map +1 -1
  49. package/lib/cjs/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.js +1 -1
  50. package/lib/cjs/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.js.map +2 -2
  51. package/lib/cjs/src/modules/solana/token-info/data/HttpTokenInfoDataSource.js +1 -1
  52. package/lib/cjs/src/modules/solana/token-info/data/HttpTokenInfoDataSource.js.map +3 -3
  53. package/lib/cjs/src/modules/solana/token-info/data/HttpTokenInfoDataSource.test.js +1 -1
  54. package/lib/cjs/src/modules/solana/token-info/data/HttpTokenInfoDataSource.test.js.map +2 -2
  55. package/lib/cjs/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.js +1 -1
  56. package/lib/cjs/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.js.map +3 -3
  57. package/lib/cjs/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.test.js +1 -1
  58. package/lib/cjs/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.test.js.map +2 -2
  59. package/lib/cjs/src/modules/solana/trusted-name/data/TrustedNameDataSource.js +1 -1
  60. package/lib/cjs/src/modules/solana/trusted-name/data/TrustedNameDataSource.js.map +1 -1
  61. package/lib/cjs/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.js +1 -1
  62. package/lib/cjs/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.js.map +2 -2
  63. package/lib/cjs/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.test.js +1 -1
  64. package/lib/cjs/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.test.js.map +2 -2
  65. package/lib/cjs/src/shared/utils/deviceModelIdCodec.js +1 -1
  66. package/lib/cjs/src/shared/utils/deviceModelIdCodec.js.map +2 -2
  67. package/lib/cjs/src/shared/utils/deviceModelIdCodec.test.js +1 -1
  68. package/lib/cjs/src/shared/utils/deviceModelIdCodec.test.js.map +2 -2
  69. package/lib/esm/package.json +2 -2
  70. package/lib/esm/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.js +1 -1
  71. package/lib/esm/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.js.map +3 -3
  72. package/lib/esm/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.test.js +1 -1
  73. package/lib/esm/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.test.js.map +3 -3
  74. package/lib/esm/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.js +1 -1
  75. package/lib/esm/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.js.map +2 -2
  76. package/lib/esm/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.js +1 -1
  77. package/lib/esm/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.js.map +2 -2
  78. package/lib/esm/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.js +1 -1
  79. package/lib/esm/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.js.map +2 -2
  80. package/lib/esm/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.test.js +1 -1
  81. package/lib/esm/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.test.js.map +3 -3
  82. package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoDto.js +1 -1
  83. package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoDto.js.map +2 -2
  84. package/lib/esm/src/modules/solana/lifi/domain/LifiContextLoader.js +1 -1
  85. package/lib/esm/src/modules/solana/lifi/domain/LifiContextLoader.js.map +3 -3
  86. package/lib/esm/src/modules/solana/lifi/domain/LifiContextLoader.test.js +1 -1
  87. package/lib/esm/src/modules/solana/lifi/domain/LifiContextLoader.test.js.map +3 -3
  88. package/lib/esm/src/modules/solana/model/SolanaPayloads.js.map +2 -2
  89. package/lib/esm/src/modules/solana/owner-info/data/HttpOwnerInfoDataSource.js +1 -1
  90. package/lib/esm/src/modules/solana/owner-info/data/HttpOwnerInfoDataSource.js.map +2 -2
  91. package/lib/esm/src/modules/solana/owner-info/data/HttpOwnerInfoDataSource.test.js +1 -1
  92. package/lib/esm/src/modules/solana/owner-info/data/HttpOwnerInfoDataSource.test.js.map +2 -2
  93. package/lib/esm/src/modules/solana/token/data/HttpMintToIdDataSource.js +2 -0
  94. package/lib/esm/src/modules/solana/token/data/HttpMintToIdDataSource.js.map +7 -0
  95. package/lib/esm/src/modules/solana/token/data/HttpMintToIdDataSource.test.js +2 -0
  96. package/lib/esm/src/modules/solana/token/data/HttpMintToIdDataSource.test.js.map +7 -0
  97. package/lib/esm/src/modules/solana/token/data/MintToIdDataSource.js +1 -0
  98. package/lib/esm/src/modules/solana/token/data/MintToIdDataSource.js.map +7 -0
  99. package/lib/esm/src/modules/solana/token/di/tokenModuleFactory.js +1 -1
  100. package/lib/esm/src/modules/solana/token/di/tokenModuleFactory.js.map +3 -3
  101. package/lib/esm/src/modules/solana/token/di/tokenTypes.js +1 -1
  102. package/lib/esm/src/modules/solana/token/di/tokenTypes.js.map +2 -2
  103. package/lib/esm/src/modules/solana/token/domain/TokenContextLoader.js +1 -1
  104. package/lib/esm/src/modules/solana/token/domain/TokenContextLoader.js.map +3 -3
  105. package/lib/esm/src/modules/solana/token/domain/TokenContextLoader.test.js +1 -1
  106. package/lib/esm/src/modules/solana/token/domain/TokenContextLoader.test.js.map +3 -3
  107. package/lib/esm/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.js +1 -1
  108. package/lib/esm/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.js.map +2 -2
  109. package/lib/esm/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.js +1 -1
  110. package/lib/esm/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.js.map +3 -3
  111. package/lib/esm/src/modules/solana/token-info/data/HttpTokenInfoDataSource.js +1 -1
  112. package/lib/esm/src/modules/solana/token-info/data/HttpTokenInfoDataSource.js.map +3 -3
  113. package/lib/esm/src/modules/solana/token-info/data/HttpTokenInfoDataSource.test.js +1 -1
  114. package/lib/esm/src/modules/solana/token-info/data/HttpTokenInfoDataSource.test.js.map +2 -2
  115. package/lib/esm/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.js +1 -1
  116. package/lib/esm/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.js.map +3 -3
  117. package/lib/esm/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.test.js +1 -1
  118. package/lib/esm/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.test.js.map +2 -2
  119. package/lib/esm/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.js +1 -1
  120. package/lib/esm/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.js.map +2 -2
  121. package/lib/esm/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.test.js +1 -1
  122. package/lib/esm/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.test.js.map +2 -2
  123. package/lib/esm/src/shared/utils/deviceModelIdCodec.js +1 -1
  124. package/lib/esm/src/shared/utils/deviceModelIdCodec.js.map +2 -2
  125. package/lib/esm/src/shared/utils/deviceModelIdCodec.test.js +1 -1
  126. package/lib/esm/src/shared/utils/deviceModelIdCodec.test.js.map +2 -2
  127. package/lib/types/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.d.ts +0 -12
  128. package/lib/types/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.d.ts.map +1 -1
  129. package/lib/types/src/modules/solana/alt-resolution/data/AltResolutionDataSource.d.ts +1 -0
  130. package/lib/types/src/modules/solana/alt-resolution/data/AltResolutionDataSource.d.ts.map +1 -1
  131. package/lib/types/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.d.ts.map +1 -1
  132. package/lib/types/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.d.ts.map +1 -1
  133. package/lib/types/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.d.ts.map +1 -1
  134. package/lib/types/src/modules/solana/instruction-info/data/InstructionInfoDto.d.ts +2 -2
  135. package/lib/types/src/modules/solana/instruction-info/data/InstructionInfoDto.d.ts.map +1 -1
  136. package/lib/types/src/modules/solana/lifi/domain/LifiContextLoader.d.ts.map +1 -1
  137. package/lib/types/src/modules/solana/model/SolanaContextTypes.d.ts +5 -1
  138. package/lib/types/src/modules/solana/model/SolanaContextTypes.d.ts.map +1 -1
  139. package/lib/types/src/modules/solana/model/SolanaPayloads.d.ts +5 -1
  140. package/lib/types/src/modules/solana/model/SolanaPayloads.d.ts.map +1 -1
  141. package/lib/types/src/modules/solana/model/SolanaTransactionContext.d.ts +1 -0
  142. package/lib/types/src/modules/solana/model/SolanaTransactionContext.d.ts.map +1 -1
  143. package/lib/types/src/modules/solana/owner-info/data/HttpOwnerInfoDataSource.d.ts.map +1 -1
  144. package/lib/types/src/modules/solana/token/data/HttpMintToIdDataSource.d.ts +11 -0
  145. package/lib/types/src/modules/solana/token/data/HttpMintToIdDataSource.d.ts.map +1 -0
  146. package/lib/types/src/modules/solana/token/data/HttpMintToIdDataSource.test.d.ts +2 -0
  147. package/lib/types/src/modules/solana/token/data/HttpMintToIdDataSource.test.d.ts.map +1 -0
  148. package/lib/types/src/modules/solana/token/data/MintToIdDataSource.d.ts +8 -0
  149. package/lib/types/src/modules/solana/token/data/MintToIdDataSource.d.ts.map +1 -0
  150. package/lib/types/src/modules/solana/token/di/tokenModuleFactory.d.ts.map +1 -1
  151. package/lib/types/src/modules/solana/token/di/tokenTypes.d.ts +1 -0
  152. package/lib/types/src/modules/solana/token/di/tokenTypes.d.ts.map +1 -1
  153. package/lib/types/src/modules/solana/token/domain/TokenContextLoader.d.ts +3 -1
  154. package/lib/types/src/modules/solana/token/domain/TokenContextLoader.d.ts.map +1 -1
  155. package/lib/types/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.d.ts.map +1 -1
  156. package/lib/types/src/modules/solana/token-account-state/data/TokenAccountStateDataSource.d.ts +1 -0
  157. package/lib/types/src/modules/solana/token-account-state/data/TokenAccountStateDataSource.d.ts.map +1 -1
  158. package/lib/types/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.d.ts.map +1 -1
  159. package/lib/types/src/modules/solana/token-info/data/HttpTokenInfoDataSource.d.ts.map +1 -1
  160. package/lib/types/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.d.ts +1 -1
  161. package/lib/types/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.d.ts.map +1 -1
  162. package/lib/types/src/modules/solana/trusted-name/data/TrustedNameDataSource.d.ts +1 -0
  163. package/lib/types/src/modules/solana/trusted-name/data/TrustedNameDataSource.d.ts.map +1 -1
  164. package/lib/types/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.d.ts +1 -0
  165. package/lib/types/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.d.ts.map +1 -1
  166. package/lib/types/src/shared/utils/deviceModelIdCodec.d.ts +2 -2
  167. package/lib/types/src/shared/utils/deviceModelIdCodec.d.ts.map +1 -1
  168. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  169. package/package.json +4 -4
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.test.ts"],
4
- "sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { type DmkNetworkClient } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { type ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\nimport { SolanaTransactionScanChainId } from \"@/modules/solana/model/SolanaTransactionScanChainId\";\n\nimport { HttpSolanaTrustedNameDataSource } from \"./HttpTrustedNameDataSource\";\nimport { type SolanaTrustedNameDataSource } from \"./TrustedNameDataSource\";\n\ndescribe(\"HttpSolanaTrustedNameDataSource\", () => {\n let datasource: SolanaTrustedNameDataSource;\n let httpMock: { get: ReturnType<typeof vi.fn> };\n const address = \"vitalik.sol\";\n const challenge = \"deadbeef\";\n\n const makeConfig = (mode: \"prod\" | \"test\" = \"prod\") =>\n ({\n metadataServiceDomain: { url: \"https://nft.api.ledger.com\" },\n cal: { mode },\n }) as ContextModuleServiceConfig;\n\n const makeDatasource = (mode: \"prod\" | \"test\" = \"prod\") =>\n new HttpSolanaTrustedNameDataSource(\n makeConfig(mode),\n httpMock as unknown as DmkNetworkClient,\n );\n\n const objectResponse = (\n signatures: { prod?: string; test?: string },\n data = \"ff00\",\n ) => ({\n descriptorType: \"name\",\n descriptorVersion: \"2\",\n signedDescriptor: { data, signatures },\n keyId: \"cal_trusted_name\",\n keyUsage: \"trusted_name\",\n });\n\n beforeEach(() => {\n vi.clearAllMocks();\n httpMock = { get: vi.fn() };\n datasource = makeDatasource();\n });\n\n it(\"calls the names endpoint with network, sources and challenge (no types)\", async () => {\n httpMock.get.mockResolvedValue(objectResponse({ prod: \"aabb\" }));\n\n await datasource.getTrustedName({\n address,\n network: String(SolanaTransactionScanChainId.MAINNET),\n challenge,\n sources: [\"crypto_asset_list\"],\n });\n\n expect(httpMock.get).toHaveBeenCalledWith(\n `https://nft.api.ledger.com/v2/names/solana/${SolanaTransactionScanChainId.MAINNET}/reverse/${address}`,\n {\n params: {\n sources: \"crypto_asset_list\",\n challenge,\n },\n },\n );\n });\n\n it(\"appends the prod signature TLV and decodes into a Uint8Array\", async () => {\n httpMock.get.mockResolvedValue(\n objectResponse({ prod: \"aabb\", test: \"cc\" }),\n );\n\n const result = await datasource.getTrustedName({\n address,\n network: String(SolanaTransactionScanChainId.MAINNET),\n challenge,\n sources: [\"crypto_asset_list\"],\n });\n\n // data(ff00) + SIGNATURE_TAG(15) + len(02) + sig(aabb)\n expect(result).toEqual(\n Right({\n address,\n descriptor: new Uint8Array([0xff, 0x00, 0x15, 0x02, 0xaa, 0xbb]),\n keyId: \"cal_trusted_name\",\n keyUsage: \"trusted_name\",\n }),\n );\n });\n\n it(\"selects the test signature when cal.mode is test\", async () => {\n datasource = makeDatasource(\"test\");\n httpMock.get.mockResolvedValue(\n objectResponse({ prod: \"aabb\", test: \"cc\" }),\n );\n\n const result = await datasource.getTrustedName({\n address,\n network: String(SolanaTransactionScanChainId.MAINNET),\n challenge,\n sources: [\"crypto_asset_list\"],\n });\n\n // data(ff00) + SIGNATURE_TAG(15) + len(01) + sig(cc)\n expect(result).toEqual(\n Right({\n address,\n descriptor: new Uint8Array([0xff, 0x00, 0x15, 0x01, 0xcc]),\n keyId: \"cal_trusted_name\",\n keyUsage: \"trusted_name\",\n }),\n );\n });\n\n it(\"returns Left when the signature for the active mode is missing\", async () => {\n datasource = makeDatasource(\"prod\");\n httpMock.get.mockResolvedValue(objectResponse({ test: \"cc\" }));\n\n const result = await datasource.getTrustedName({\n address,\n network: String(SolanaTransactionScanChainId.MAINNET),\n challenge,\n sources: [\"crypto_asset_list\"],\n });\n\n expect(result.isLeft()).toBe(true);\n expect((result.extract() as Error).message).toMatch(\n new RegExp(\n String.raw`\\[ContextModule\\] HttpSolanaTrustedNameDataSource: missing prod signature for ${address}`,\n ),\n );\n });\n\n it(\"returns Left on malformed response (hex-string signedDescriptor)\", async () => {\n httpMock.get.mockResolvedValue({\n signedDescriptor: \"01020304\",\n keyId: \"k\",\n keyUsage: \"u\",\n } as any);\n\n const result = await datasource.getTrustedName({\n address,\n network: String(SolanaTransactionScanChainId.MAINNET),\n challenge,\n sources: [],\n });\n\n expect(result.isLeft()).toBe(true);\n expect((result.extract() as Error).message).toMatch(\n new RegExp(\n String.raw`\\[ContextModule\\] HttpSolanaTrustedNameDataSource: malformed response for ${address}:`,\n ),\n );\n });\n\n it(\"returns Left when HTTP client throws\", async () => {\n httpMock.get.mockRejectedValue(new Error(\"net\"));\n\n const result = await datasource.getTrustedName({\n address,\n network: String(SolanaTransactionScanChainId.MAINNET),\n challenge,\n sources: [],\n });\n\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] HttpSolanaTrustedNameDataSource: Failed to fetch trusted name: net\",\n ),\n ),\n );\n });\n});\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { type DmkNetworkClient } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { type ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\nimport { SolanaTransactionScanChainId } from \"@/modules/solana/model/SolanaTransactionScanChainId\";\n\nimport { HttpSolanaTrustedNameDataSource } from \"./HttpTrustedNameDataSource\";\nimport { type SolanaTrustedNameDataSource } from \"./TrustedNameDataSource\";\n\ndescribe(\"HttpSolanaTrustedNameDataSource\", () => {\n let datasource: SolanaTrustedNameDataSource;\n let httpMock: { get: ReturnType<typeof vi.fn> };\n const address = \"vitalik.sol\";\n const challenge = \"deadbeef\";\n\n const makeConfig = (mode: \"prod\" | \"test\" = \"prod\") =>\n ({\n metadataServiceDomain: { url: \"https://nft.api.ledger.com\" },\n cal: { mode },\n }) as ContextModuleServiceConfig;\n\n const makeDatasource = (mode: \"prod\" | \"test\" = \"prod\") =>\n new HttpSolanaTrustedNameDataSource(\n makeConfig(mode),\n httpMock as unknown as DmkNetworkClient,\n );\n\n const objectResponse = (\n signatures: { prod?: string; test?: string },\n data = \"ff00\",\n ) => ({\n descriptorType: \"name\",\n descriptorVersion: \"2\",\n signedDescriptor: { data, signatures },\n keyId: \"cal_trusted_name\",\n keyUsage: \"trusted_name\",\n });\n\n beforeEach(() => {\n vi.clearAllMocks();\n httpMock = { get: vi.fn() };\n datasource = makeDatasource();\n });\n\n it(\"calls the names endpoint with network, types, sources and challenge\", async () => {\n httpMock.get.mockResolvedValue(objectResponse({ prod: \"aabb\" }));\n\n await datasource.getTrustedName({\n address,\n network: String(SolanaTransactionScanChainId.MAINNET),\n challenge,\n types: [\"token\", \"smart_contract\"],\n sources: [\"crypto_asset_list\"],\n });\n\n expect(httpMock.get).toHaveBeenCalledWith(\n `https://nft.api.ledger.com/v2/names/solana/${SolanaTransactionScanChainId.MAINNET}/reverse/${address}`,\n {\n params: {\n types: \"token,smart_contract\",\n sources: \"crypto_asset_list\",\n challenge,\n },\n },\n );\n });\n\n it(\"appends the prod signature TLV and decodes into a Uint8Array\", async () => {\n httpMock.get.mockResolvedValue(\n objectResponse({ prod: \"aabb\", test: \"cc\" }),\n );\n\n const result = await datasource.getTrustedName({\n address,\n network: String(SolanaTransactionScanChainId.MAINNET),\n challenge,\n types: [\"token\", \"smart_contract\"],\n sources: [\"crypto_asset_list\"],\n });\n\n // data(ff00) + SIGNATURE_TAG(15) + len(02) + sig(aabb)\n expect(result).toEqual(\n Right({\n address,\n descriptor: new Uint8Array([0xff, 0x00, 0x15, 0x02, 0xaa, 0xbb]),\n keyId: \"cal_trusted_name\",\n keyUsage: \"trusted_name\",\n }),\n );\n });\n\n it(\"selects the test signature when cal.mode is test\", async () => {\n datasource = makeDatasource(\"test\");\n httpMock.get.mockResolvedValue(\n objectResponse({ prod: \"aabb\", test: \"cc\" }),\n );\n\n const result = await datasource.getTrustedName({\n address,\n network: String(SolanaTransactionScanChainId.MAINNET),\n challenge,\n types: [\"token\", \"smart_contract\"],\n sources: [\"crypto_asset_list\"],\n });\n\n // data(ff00) + SIGNATURE_TAG(15) + len(01) + sig(cc)\n expect(result).toEqual(\n Right({\n address,\n descriptor: new Uint8Array([0xff, 0x00, 0x15, 0x01, 0xcc]),\n keyId: \"cal_trusted_name\",\n keyUsage: \"trusted_name\",\n }),\n );\n });\n\n it(\"returns Left when the signature for the active mode is missing\", async () => {\n datasource = makeDatasource(\"prod\");\n httpMock.get.mockResolvedValue(objectResponse({ test: \"cc\" }));\n\n const result = await datasource.getTrustedName({\n address,\n network: String(SolanaTransactionScanChainId.MAINNET),\n challenge,\n types: [\"token\", \"smart_contract\"],\n sources: [\"crypto_asset_list\"],\n });\n\n expect(result.isLeft()).toBe(true);\n expect((result.extract() as Error).message).toMatch(\n new RegExp(\n String.raw`\\[ContextModule\\] HttpSolanaTrustedNameDataSource: missing prod signature for ${address}`,\n ),\n );\n });\n\n it(\"returns Left on malformed response (hex-string signedDescriptor)\", async () => {\n httpMock.get.mockResolvedValue({\n signedDescriptor: \"01020304\",\n keyId: \"k\",\n keyUsage: \"u\",\n } as any);\n\n const result = await datasource.getTrustedName({\n address,\n network: String(SolanaTransactionScanChainId.MAINNET),\n challenge,\n types: [],\n sources: [],\n });\n\n expect(result.isLeft()).toBe(true);\n expect((result.extract() as Error).message).toMatch(\n new RegExp(\n String.raw`\\[ContextModule\\] HttpSolanaTrustedNameDataSource: malformed response for ${address}:`,\n ),\n );\n });\n\n it(\"returns Left when HTTP client throws\", async () => {\n httpMock.get.mockRejectedValue(new Error(\"net\"));\n\n const result = await datasource.getTrustedName({\n address,\n network: String(SolanaTransactionScanChainId.MAINNET),\n challenge,\n types: [],\n sources: [],\n });\n\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] HttpSolanaTrustedNameDataSource: Failed to fetch trusted name: net\",\n ),\n ),\n );\n });\n});\n"],
5
+ "mappings": "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",
6
6
  "names": ["import_purify_ts", "import_vitest", "import_SolanaTransactionScanChainId", "import_HttpTrustedNameDataSource", "datasource", "httpMock", "address", "challenge", "makeConfig", "mode", "makeDatasource", "objectResponse", "signatures", "data", "result"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var s=Object.defineProperty;var o=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var m=(r,e,n,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of i(e))!d.call(r,t)&&t!==n&&s(r,t,{get:()=>e[t],enumerable:!(a=o(e,t))||a.enumerable});return r};var g=r=>m(s({},"__esModule",{value:!0}),r);var u={};module.exports=g(u);
1
+ "use strict";var s=Object.defineProperty;var o=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var d=Object.prototype.hasOwnProperty;var m=(r,e,n,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of i(e))!d.call(r,t)&&t!==n&&s(r,t,{get:()=>e[t],enumerable:!(a=o(e,t))||a.enumerable});return r};var g=r=>m(s({},"__esModule",{value:!0}),r);var p={};module.exports=g(p);
2
2
  //# sourceMappingURL=TrustedNameDataSource.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/modules/solana/trusted-name/data/TrustedNameDataSource.ts"],
4
- "sourcesContent": ["import { type Either } from \"purify-ts\";\n\nexport type GetSolanaTrustedNameParams = {\n address: string;\n network: string;\n challenge: string;\n sources: string[];\n};\n\nexport type SolanaTrustedNameResult = {\n address: string;\n // Raw signed TLV bytes decoded from the backend response.\n descriptor: Uint8Array;\n keyId: string;\n keyUsage: string;\n};\n\nexport interface SolanaTrustedNameDataSource {\n getTrustedName(\n params: GetSolanaTrustedNameParams,\n ): Promise<Either<Error, SolanaTrustedNameResult>>;\n}\n"],
4
+ "sourcesContent": ["import { type Either } from \"purify-ts\";\n\nexport type GetSolanaTrustedNameParams = {\n address: string;\n network: string;\n challenge: string;\n types: string[];\n sources: string[];\n};\n\nexport type SolanaTrustedNameResult = {\n address: string;\n // Raw signed TLV bytes decoded from the backend response.\n descriptor: Uint8Array;\n keyId: string;\n keyUsage: string;\n};\n\nexport interface SolanaTrustedNameDataSource {\n getTrustedName(\n params: GetSolanaTrustedNameParams,\n ): Promise<Either<Error, SolanaTrustedNameResult>>;\n}\n"],
5
5
  "mappings": "+WAAA,IAAAA,EAAA,kBAAAC,EAAAD",
6
6
  "names": ["TrustedNameDataSource_exports", "__toCommonJS"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var l=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var I=Object.getOwnPropertyNames;var E=Object.prototype.hasOwnProperty;var v=(a,e)=>{for(var o in e)l(a,o,{get:e[o],enumerable:!0})},x=(a,e,o,r)=>{if(e&&typeof e=="object"||typeof e=="function")for(let t of I(e))!E.call(a,t)&&t!==o&&l(a,t,{get:()=>e[t],enumerable:!(r=u(e,t))||r.enumerable});return a};var L=a=>x(l({},"__esModule",{value:!0}),a),T=(a,e,o,r)=>{for(var t=r>1?void 0:r?u(e,o):e,i=a.length-1,g;i>=0;i--)(g=a[i])&&(t=(r?g(e,o,t):g(t))||t);return r&&t&&l(e,o,t),t},p=(a,e)=>(o,r)=>e(o,r,a);var k={};v(k,{SolanaTrustedNameContextLoader:()=>d});module.exports=L(k);var s=require("inversify"),n=require("purify-ts"),f=require("../../../../config/di/configTypes"),C=require("../../../../modules/multichain/pki/di/pkiTypes"),c=require("../../../../modules/solana/model/SolanaTransactionScanChainId"),N=require("../../../../modules/solana/trusted-name/di/trustedNameTypes"),m=require("../../../../shared/model/ClearSignContext"),y=require("../../../../shared/utils/challengeBoundLoader"),h=require("../../../../shared/utils/deviceModelIdCodec");const M=[m.ClearSignContextType.SOLANA_TRUSTED_NAME],D={"solana-mainnet":c.SolanaTransactionScanChainId.MAINNET,"solana-devnet":c.SolanaTransactionScanChainId.DEVNET,"solana-testnet":c.SolanaTransactionScanChainId.TESTNET},S=c.SolanaTransactionScanChainId.MAINNET,A=n.Codec.interface({address:n.string,challenge:n.string,sources:(0,n.array)(n.string)}),R=n.Codec.interface({deviceModelId:h.deviceModelIdCodec,network:(0,n.optional)(n.string),requests:(0,n.array)(A)});let d=class{constructor(e,o,r){this.dataSource=e;this.certificateLoader=o;this.logger=r("SolanaTrustedNameContextLoader")}logger;canHandle(e,o){return M.every(r=>o.includes(r))?R.decode(e).caseOf({Left:()=>!1,Right:({requests:r})=>r.length>0&&r.every(t=>t.address.length>0&&t.challenge.length>0)}):!1}async load(e){const o=e.network?D[e.network]??S:S,r=String(o);return(0,y.loadChallengeBoundContexts)({requests:e.requests,deviceModelId:e.deviceModelId,certificateLoader:this.certificateLoader,logger:this.logger,label:"TRUSTED_NAME",fetch:t=>this.dataSource.getTrustedName({address:t.address,challenge:t.challenge,sources:t.sources,network:r}),toContext:(t,i)=>({type:m.ClearSignContextType.SOLANA_TRUSTED_NAME,payload:t.descriptor,certificate:i}),describe:t=>({address:t.address})})}};d=T([(0,s.injectable)(),p(0,(0,s.inject)(N.solanaTrustedNameTypes.SolanaTrustedNameDataSource)),p(1,(0,s.inject)(C.pkiTypes.PkiCertificateLoader)),p(2,(0,s.inject)(f.configTypes.ContextModuleLoggerFactory))],d);0&&(module.exports={SolanaTrustedNameContextLoader});
1
+ "use strict";var l=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var I=Object.getOwnPropertyNames;var E=Object.prototype.hasOwnProperty;var v=(n,t)=>{for(var o in t)l(n,o,{get:t[o],enumerable:!0})},x=(n,t,o,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let e of I(t))!E.call(n,e)&&e!==o&&l(n,e,{get:()=>t[e],enumerable:!(r=u(t,e))||r.enumerable});return n};var L=n=>x(l({},"__esModule",{value:!0}),n),T=(n,t,o,r)=>{for(var e=r>1?void 0:r?u(t,o):t,i=n.length-1,g;i>=0;i--)(g=n[i])&&(e=(r?g(t,o,e):g(e))||e);return r&&e&&l(t,o,e),e},p=(n,t)=>(o,r)=>t(o,r,n);var k={};v(k,{SolanaTrustedNameContextLoader:()=>d});module.exports=L(k);var s=require("inversify"),a=require("purify-ts"),f=require("../../../../config/di/configTypes"),y=require("../../../../modules/multichain/pki/di/pkiTypes"),c=require("../../../../modules/solana/model/SolanaTransactionScanChainId"),C=require("../../../../modules/solana/trusted-name/di/trustedNameTypes"),m=require("../../../../shared/model/ClearSignContext"),N=require("../../../../shared/utils/challengeBoundLoader"),h=require("../../../../shared/utils/deviceModelIdCodec");const M=[m.ClearSignContextType.SOLANA_TRUSTED_NAME],D={"solana-mainnet":c.SolanaTransactionScanChainId.MAINNET,"solana-devnet":c.SolanaTransactionScanChainId.DEVNET,"solana-testnet":c.SolanaTransactionScanChainId.TESTNET},S=c.SolanaTransactionScanChainId.MAINNET,A=a.Codec.interface({address:a.string,challenge:a.string,types:(0,a.array)(a.string),sources:(0,a.array)(a.string)}),R=a.Codec.interface({deviceModelId:h.deviceModelIdCodec,network:(0,a.optional)(a.string),requests:(0,a.array)(A)});let d=class{constructor(t,o,r){this.dataSource=t;this.certificateLoader=o;this.logger=r("SolanaTrustedNameContextLoader")}logger;canHandle(t,o){return M.every(r=>o.includes(r))?R.decode(t).caseOf({Left:()=>!1,Right:({requests:r})=>r.length>0&&r.every(e=>e.address.length>0&&e.challenge.length>0)}):!1}async load(t){const o=t.network?D[t.network]??S:S,r=String(o);return(0,N.loadChallengeBoundContexts)({requests:t.requests,deviceModelId:t.deviceModelId,certificateLoader:this.certificateLoader,logger:this.logger,label:"TRUSTED_NAME",fetch:e=>this.dataSource.getTrustedName({address:e.address,challenge:e.challenge,types:e.types,sources:e.sources,network:r}),toContext:(e,i)=>({type:m.ClearSignContextType.SOLANA_TRUSTED_NAME,payload:e.descriptor,certificate:i}),describe:e=>({address:e.address})})}};d=T([(0,s.injectable)(),p(0,(0,s.inject)(C.solanaTrustedNameTypes.SolanaTrustedNameDataSource)),p(1,(0,s.inject)(y.pkiTypes.PkiCertificateLoader)),p(2,(0,s.inject)(f.configTypes.ContextModuleLoggerFactory))],d);0&&(module.exports={SolanaTrustedNameContextLoader});
2
2
  //# sourceMappingURL=TrustedNameContextLoader.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/modules/solana/trusted-name/domain/TrustedNameContextLoader.ts"],
4
- "sourcesContent": ["import {\n type DeviceModelId,\n type LoggerPublisherService,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { array, Codec, optional, string } from \"purify-ts\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { pkiTypes } from \"@/modules/multichain/pki/di/pkiTypes\";\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport { SolanaTransactionScanChainId } from \"@/modules/solana/model/SolanaTransactionScanChainId\";\nimport { type SolanaTrustedNameDataSource } from \"@/modules/solana/trusted-name/data/TrustedNameDataSource\";\nimport { solanaTrustedNameTypes } from \"@/modules/solana/trusted-name/di/trustedNameTypes\";\nimport { type ContextLoader } from \"@/shared/domain/ContextLoader\";\nimport {\n type ClearSignContext,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\nimport { loadChallengeBoundContexts } from \"@/shared/utils/challengeBoundLoader\";\nimport { deviceModelIdCodec } from \"@/shared/utils/deviceModelIdCodec\";\n\nconst SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.SOLANA_TRUSTED_NAME,\n];\n\nconst CHAIN_ID_BY_NETWORK: Record<string, SolanaTransactionScanChainId> = {\n \"solana-mainnet\": SolanaTransactionScanChainId.MAINNET,\n \"solana-devnet\": SolanaTransactionScanChainId.DEVNET,\n \"solana-testnet\": SolanaTransactionScanChainId.TESTNET,\n};\n\nconst NETWORK_DEFAULT = SolanaTransactionScanChainId.MAINNET;\n\n/**\n * One trusted-name request, resolved to a Uint8Array TLV descriptor. The\n * caller must obtain a fresh challenge immediately before each fetch.\n */\nexport type SolanaTrustedNameRequest = {\n address: string;\n challenge: string;\n sources: string[];\n};\n\nexport type SolanaTrustedNameContextInput = {\n deviceModelId: DeviceModelId;\n network?: string; // \"mainnet\" | \"devnet\" | \"testnet\"; defaults to mainnet\n requests: SolanaTrustedNameRequest[];\n};\n\nconst trustedNameRequestCodec = Codec.interface({\n address: string,\n challenge: string,\n sources: array(string),\n});\n\nconst solanaTrustedNameInputCodec = Codec.interface({\n deviceModelId: deviceModelIdCodec,\n network: optional(string),\n requests: array(trustedNameRequestCodec),\n});\n\n@injectable()\nexport class SolanaTrustedNameContextLoader\n implements ContextLoader<SolanaTrustedNameContextInput>\n{\n private readonly logger: LoggerPublisherService;\n\n constructor(\n @inject(solanaTrustedNameTypes.SolanaTrustedNameDataSource)\n private readonly dataSource: SolanaTrustedNameDataSource,\n @inject(pkiTypes.PkiCertificateLoader)\n private readonly certificateLoader: PkiCertificateLoader,\n @inject(configTypes.ContextModuleLoggerFactory)\n loggerFactory: (tag: string) => LoggerPublisherService,\n ) {\n this.logger = loggerFactory(\"SolanaTrustedNameContextLoader\");\n }\n\n public canHandle(\n input: unknown,\n expectedTypes: ClearSignContextType[],\n ): input is SolanaTrustedNameContextInput {\n if (!SUPPORTED_TYPES.every((t) => expectedTypes.includes(t))) return false;\n return solanaTrustedNameInputCodec.decode(input).caseOf({\n Left: () => false,\n Right: ({ requests }) =>\n requests.length > 0 &&\n requests.every((r) => r.address.length > 0 && r.challenge.length > 0),\n });\n }\n\n public async load(\n input: SolanaTrustedNameContextInput,\n ): Promise<ClearSignContext[]> {\n const chainId = input.network\n ? (CHAIN_ID_BY_NETWORK[input.network] ?? NETWORK_DEFAULT)\n : NETWORK_DEFAULT;\n const network = String(chainId);\n\n return loadChallengeBoundContexts({\n requests: input.requests,\n deviceModelId: input.deviceModelId,\n certificateLoader: this.certificateLoader,\n logger: this.logger,\n label: \"TRUSTED_NAME\",\n fetch: (request) =>\n this.dataSource.getTrustedName({\n address: request.address,\n challenge: request.challenge,\n sources: request.sources,\n network,\n }),\n toContext: (value, certificate) => ({\n type: ClearSignContextType.SOLANA_TRUSTED_NAME,\n payload: value.descriptor,\n certificate,\n }),\n describe: (request) => ({ address: request.address }),\n });\n }\n}\n"],
5
- "mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,oCAAAE,IAAA,eAAAC,EAAAH,GAIA,IAAAI,EAAmC,qBACnCC,EAA+C,qBAE/CC,EAA4B,mCAC5BC,EAAyB,gDAEzBC,EAA6C,+DAE7CC,EAAuC,6DAEvCC,EAGO,2CACPC,EAA2C,+CAC3CC,EAAmC,6CAEnC,MAAMC,EAA0C,CAC9C,uBAAqB,mBACvB,EAEMC,EAAoE,CACxE,iBAAkB,+BAA6B,QAC/C,gBAAiB,+BAA6B,OAC9C,iBAAkB,+BAA6B,OACjD,EAEMC,EAAkB,+BAA6B,QAkB/CC,EAA0B,QAAM,UAAU,CAC9C,QAAS,SACT,UAAW,SACX,WAAS,SAAM,QAAM,CACvB,CAAC,EAEKC,EAA8B,QAAM,UAAU,CAClD,cAAe,qBACf,WAAS,YAAS,QAAM,EACxB,YAAU,SAAMD,CAAuB,CACzC,CAAC,EAGM,IAAME,EAAN,KAEP,CAGE,YAEmBC,EAEAC,EAEjBC,EACA,CALiB,gBAAAF,EAEA,uBAAAC,EAIjB,KAAK,OAASC,EAAc,gCAAgC,CAC9D,CAXiB,OAaV,UACLC,EACAC,EACwC,CACxC,OAAKV,EAAgB,MAAOW,GAAMD,EAAc,SAASC,CAAC,CAAC,EACpDP,EAA4B,OAAOK,CAAK,EAAE,OAAO,CACtD,KAAM,IAAM,GACZ,MAAO,CAAC,CAAE,SAAAG,CAAS,IACjBA,EAAS,OAAS,GAClBA,EAAS,MAAOC,GAAMA,EAAE,QAAQ,OAAS,GAAKA,EAAE,UAAU,OAAS,CAAC,CACxE,CAAC,EANoE,EAOvE,CAEA,MAAa,KACXJ,EAC6B,CAC7B,MAAMK,EAAUL,EAAM,QACjBR,EAAoBQ,EAAM,OAAO,GAAKP,EACvCA,EACEa,EAAU,OAAOD,CAAO,EAE9B,SAAO,8BAA2B,CAChC,SAAUL,EAAM,SAChB,cAAeA,EAAM,cACrB,kBAAmB,KAAK,kBACxB,OAAQ,KAAK,OACb,MAAO,eACP,MAAQO,GACN,KAAK,WAAW,eAAe,CAC7B,QAASA,EAAQ,QACjB,UAAWA,EAAQ,UACnB,QAASA,EAAQ,QACjB,QAAAD,CACF,CAAC,EACH,UAAW,CAACE,EAAOC,KAAiB,CAClC,KAAM,uBAAqB,oBAC3B,QAASD,EAAM,WACf,YAAAC,CACF,GACA,SAAWF,IAAa,CAAE,QAASA,EAAQ,OAAQ,EACrD,CAAC,CACH,CACF,EA1DaX,EAANc,EAAA,IADN,cAAW,EAOPC,EAAA,eAAO,yBAAuB,2BAA2B,GAEzDA,EAAA,eAAO,WAAS,oBAAoB,GAEpCA,EAAA,eAAO,cAAY,0BAA0B,IAVrCf",
4
+ "sourcesContent": ["import {\n type DeviceModelId,\n type LoggerPublisherService,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { array, Codec, optional, string } from \"purify-ts\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { pkiTypes } from \"@/modules/multichain/pki/di/pkiTypes\";\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport { SolanaTransactionScanChainId } from \"@/modules/solana/model/SolanaTransactionScanChainId\";\nimport { type SolanaTrustedNameDataSource } from \"@/modules/solana/trusted-name/data/TrustedNameDataSource\";\nimport { solanaTrustedNameTypes } from \"@/modules/solana/trusted-name/di/trustedNameTypes\";\nimport { type ContextLoader } from \"@/shared/domain/ContextLoader\";\nimport {\n type ClearSignContext,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\nimport { loadChallengeBoundContexts } from \"@/shared/utils/challengeBoundLoader\";\nimport { deviceModelIdCodec } from \"@/shared/utils/deviceModelIdCodec\";\n\nconst SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.SOLANA_TRUSTED_NAME,\n];\n\nconst CHAIN_ID_BY_NETWORK: Record<string, SolanaTransactionScanChainId> = {\n \"solana-mainnet\": SolanaTransactionScanChainId.MAINNET,\n \"solana-devnet\": SolanaTransactionScanChainId.DEVNET,\n \"solana-testnet\": SolanaTransactionScanChainId.TESTNET,\n};\n\nconst NETWORK_DEFAULT = SolanaTransactionScanChainId.MAINNET;\n\n/**\n * One trusted-name request, resolved to a Uint8Array TLV descriptor. The\n * caller must obtain a fresh challenge immediately before each fetch.\n */\nexport type SolanaTrustedNameRequest = {\n address: string;\n challenge: string;\n types: string[];\n sources: string[];\n};\n\nexport type SolanaTrustedNameContextInput = {\n deviceModelId: DeviceModelId;\n network?: string; // \"mainnet\" | \"devnet\" | \"testnet\"; defaults to mainnet\n requests: SolanaTrustedNameRequest[];\n};\n\nconst trustedNameRequestCodec = Codec.interface({\n address: string,\n challenge: string,\n types: array(string),\n sources: array(string),\n});\n\nconst solanaTrustedNameInputCodec = Codec.interface({\n deviceModelId: deviceModelIdCodec,\n network: optional(string),\n requests: array(trustedNameRequestCodec),\n});\n\n@injectable()\nexport class SolanaTrustedNameContextLoader\n implements ContextLoader<SolanaTrustedNameContextInput>\n{\n private readonly logger: LoggerPublisherService;\n\n constructor(\n @inject(solanaTrustedNameTypes.SolanaTrustedNameDataSource)\n private readonly dataSource: SolanaTrustedNameDataSource,\n @inject(pkiTypes.PkiCertificateLoader)\n private readonly certificateLoader: PkiCertificateLoader,\n @inject(configTypes.ContextModuleLoggerFactory)\n loggerFactory: (tag: string) => LoggerPublisherService,\n ) {\n this.logger = loggerFactory(\"SolanaTrustedNameContextLoader\");\n }\n\n public canHandle(\n input: unknown,\n expectedTypes: ClearSignContextType[],\n ): input is SolanaTrustedNameContextInput {\n if (!SUPPORTED_TYPES.every((t) => expectedTypes.includes(t))) return false;\n return solanaTrustedNameInputCodec.decode(input).caseOf({\n Left: () => false,\n Right: ({ requests }) =>\n requests.length > 0 &&\n requests.every((r) => r.address.length > 0 && r.challenge.length > 0),\n });\n }\n\n public async load(\n input: SolanaTrustedNameContextInput,\n ): Promise<ClearSignContext[]> {\n const chainId = input.network\n ? (CHAIN_ID_BY_NETWORK[input.network] ?? NETWORK_DEFAULT)\n : NETWORK_DEFAULT;\n const network = String(chainId);\n\n return loadChallengeBoundContexts({\n requests: input.requests,\n deviceModelId: input.deviceModelId,\n certificateLoader: this.certificateLoader,\n logger: this.logger,\n label: \"TRUSTED_NAME\",\n fetch: (request) =>\n this.dataSource.getTrustedName({\n address: request.address,\n challenge: request.challenge,\n types: request.types,\n sources: request.sources,\n network,\n }),\n toContext: (value, certificate) => ({\n type: ClearSignContextType.SOLANA_TRUSTED_NAME,\n payload: value.descriptor,\n certificate,\n }),\n describe: (request) => ({ address: request.address }),\n });\n }\n}\n"],
5
+ "mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,oCAAAE,IAAA,eAAAC,EAAAH,GAIA,IAAAI,EAAmC,qBACnCC,EAA+C,qBAE/CC,EAA4B,mCAC5BC,EAAyB,gDAEzBC,EAA6C,+DAE7CC,EAAuC,6DAEvCC,EAGO,2CACPC,EAA2C,+CAC3CC,EAAmC,6CAEnC,MAAMC,EAA0C,CAC9C,uBAAqB,mBACvB,EAEMC,EAAoE,CACxE,iBAAkB,+BAA6B,QAC/C,gBAAiB,+BAA6B,OAC9C,iBAAkB,+BAA6B,OACjD,EAEMC,EAAkB,+BAA6B,QAmB/CC,EAA0B,QAAM,UAAU,CAC9C,QAAS,SACT,UAAW,SACX,SAAO,SAAM,QAAM,EACnB,WAAS,SAAM,QAAM,CACvB,CAAC,EAEKC,EAA8B,QAAM,UAAU,CAClD,cAAe,qBACf,WAAS,YAAS,QAAM,EACxB,YAAU,SAAMD,CAAuB,CACzC,CAAC,EAGM,IAAME,EAAN,KAEP,CAGE,YAEmBC,EAEAC,EAEjBC,EACA,CALiB,gBAAAF,EAEA,uBAAAC,EAIjB,KAAK,OAASC,EAAc,gCAAgC,CAC9D,CAXiB,OAaV,UACLC,EACAC,EACwC,CACxC,OAAKV,EAAgB,MAAOW,GAAMD,EAAc,SAASC,CAAC,CAAC,EACpDP,EAA4B,OAAOK,CAAK,EAAE,OAAO,CACtD,KAAM,IAAM,GACZ,MAAO,CAAC,CAAE,SAAAG,CAAS,IACjBA,EAAS,OAAS,GAClBA,EAAS,MAAOC,GAAMA,EAAE,QAAQ,OAAS,GAAKA,EAAE,UAAU,OAAS,CAAC,CACxE,CAAC,EANoE,EAOvE,CAEA,MAAa,KACXJ,EAC6B,CAC7B,MAAMK,EAAUL,EAAM,QACjBR,EAAoBQ,EAAM,OAAO,GAAKP,EACvCA,EACEa,EAAU,OAAOD,CAAO,EAE9B,SAAO,8BAA2B,CAChC,SAAUL,EAAM,SAChB,cAAeA,EAAM,cACrB,kBAAmB,KAAK,kBACxB,OAAQ,KAAK,OACb,MAAO,eACP,MAAQO,GACN,KAAK,WAAW,eAAe,CAC7B,QAASA,EAAQ,QACjB,UAAWA,EAAQ,UACnB,MAAOA,EAAQ,MACf,QAASA,EAAQ,QACjB,QAAAD,CACF,CAAC,EACH,UAAW,CAACE,EAAOC,KAAiB,CAClC,KAAM,uBAAqB,oBAC3B,QAASD,EAAM,WACf,YAAAC,CACF,GACA,SAAWF,IAAa,CAAE,QAASA,EAAQ,OAAQ,EACrD,CAAC,CACH,CACF,EA3DaX,EAANc,EAAA,IADN,cAAW,EAOPC,EAAA,eAAO,yBAAuB,2BAA2B,GAEzDA,EAAA,eAAO,WAAS,oBAAoB,GAEpCA,EAAA,eAAO,cAAY,0BAA0B,IAVrCf",
6
6
  "names": ["TrustedNameContextLoader_exports", "__export", "SolanaTrustedNameContextLoader", "__toCommonJS", "import_inversify", "import_purify_ts", "import_configTypes", "import_pkiTypes", "import_SolanaTransactionScanChainId", "import_trustedNameTypes", "import_ClearSignContext", "import_challengeBoundLoader", "import_deviceModelIdCodec", "SUPPORTED_TYPES", "CHAIN_ID_BY_NETWORK", "NETWORK_DEFAULT", "trustedNameRequestCodec", "solanaTrustedNameInputCodec", "SolanaTrustedNameContextLoader", "dataSource", "certificateLoader", "loggerFactory", "input", "expectedTypes", "t", "requests", "r", "chainId", "network", "request", "value", "certificate", "__decorateClass", "__decorateParam"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var c=require("@ledgerhq/device-management-kit"),o=require("purify-ts"),e=require("vitest"),m=require("../../../../modules/solana/model/SolanaTransactionScanChainId"),r=require("../../../../shared/model/ClearSignContext"),y=require("./TrustedNameContextLoader");const A=()=>({debug:e.vi.fn(),info:e.vi.fn(),warn:e.vi.fn(),error:e.vi.fn(),subscribers:[]}),l={keyUsageNumber:4,payload:new Uint8Array([7])},t="Addr11111111111111111111111111111111111111",u="Addr22222222222222222222222222222222222222";(0,e.describe)("SolanaTrustedNameContextLoader",()=>{let d,i;(0,e.beforeEach)(()=>{e.vi.restoreAllMocks(),d={getTrustedName:e.vi.fn()},i={loadCertificate:e.vi.fn().mockResolvedValue(l)}});const n=()=>new y.SolanaTrustedNameContextLoader(d,i,A);(0,e.describe)("canHandle",()=>{(0,e.it)("returns true when SOLANA_TRUSTED_NAME is requested with valid requests",()=>{(0,e.expect)(n().canHandle({deviceModelId:c.DeviceModelId.NANO_X,requests:[{address:t,challenge:"c",sources:["sns"]}]},[r.ClearSignContextType.SOLANA_TRUSTED_NAME])).toBe(!0)}),(0,e.it)("returns false when SOLANA_TRUSTED_NAME is not requested",()=>{(0,e.expect)(n().canHandle({requests:[{address:t,challenge:"c",sources:["sns"]}]},[r.ClearSignContextType.SOLANA_TOKEN])).toBe(!1)}),(0,e.it)("returns false on malformed input",()=>{const a=n(),s=[r.ClearSignContextType.SOLANA_TRUSTED_NAME];(0,e.expect)(a.canHandle({requests:[]},s)).toBe(!1),(0,e.expect)(a.canHandle({requests:[{address:"",challenge:"c",sources:[]}]},s)).toBe(!1),(0,e.expect)(a.canHandle({requests:[{address:t,challenge:"",sources:[]}]},s)).toBe(!1)})}),(0,e.describe)("load",()=>{(0,e.it)("emits one SOLANA_TRUSTED_NAME per request with Uint8Array payload",async()=>{e.vi.spyOn(d,"getTrustedName").mockImplementation(async({address:s})=>(0,o.Right)({address:s,descriptor:new Uint8Array([s===t?170:187]),keyId:"name_key",keyUsage:"trusted_name"}));const a=await n().load({deviceModelId:c.DeviceModelId.NANO_X,requests:[{address:t,challenge:"c1",sources:["sns"]},{address:u,challenge:"c2",sources:["cal"]}]});(0,e.expect)(a).toHaveLength(2),(0,e.expect)(a[0]).toMatchObject({type:r.ClearSignContextType.SOLANA_TRUSTED_NAME,payload:new Uint8Array([170]),certificate:l}),(0,e.expect)(a[1]).toMatchObject({type:r.ClearSignContextType.SOLANA_TRUSTED_NAME,payload:new Uint8Array([187])})}),(0,e.it)("emits an ERROR per failing request and keeps the others",async()=>{e.vi.spyOn(d,"getTrustedName").mockImplementation(async({address:s})=>s===t?(0,o.Right)({address:s,descriptor:new Uint8Array([170]),keyId:"k",keyUsage:"u"}):(0,o.Left)(new Error("upstream-404")));const a=await n().load({deviceModelId:c.DeviceModelId.NANO_X,requests:[{address:t,challenge:"c1",sources:[]},{address:u,challenge:"c2",sources:[]}]});(0,e.expect)(a[0]?.type).toBe(r.ClearSignContextType.SOLANA_TRUSTED_NAME),(0,e.expect)(a[1]?.type).toBe(r.ClearSignContextType.ERROR)}),(0,e.it)("forwards default chain id 900 when input.network is omitted",async()=>{const a=e.vi.spyOn(d,"getTrustedName").mockResolvedValue((0,o.Right)({address:t,descriptor:new Uint8Array([1]),keyId:"k",keyUsage:"u"}));await n().load({deviceModelId:c.DeviceModelId.NANO_X,requests:[{address:t,challenge:"c",sources:[]}]}),(0,e.expect)(a).toHaveBeenCalledWith(e.expect.objectContaining({network:String(m.SolanaTransactionScanChainId.MAINNET)}))}),(0,e.it)("maps a cluster name to its numeric chain id",async()=>{const a=e.vi.spyOn(d,"getTrustedName").mockResolvedValue((0,o.Right)({address:t,descriptor:new Uint8Array([1]),keyId:"k",keyUsage:"u"}));await n().load({deviceModelId:c.DeviceModelId.NANO_X,network:"solana-devnet",requests:[{address:t,challenge:"c",sources:[]}]}),(0,e.expect)(a).toHaveBeenCalledWith(e.expect.objectContaining({network:"901"}))})})});
1
+ "use strict";var d=require("@ledgerhq/device-management-kit"),o=require("purify-ts"),e=require("vitest"),y=require("../../../../modules/solana/model/SolanaTransactionScanChainId"),r=require("../../../../shared/model/ClearSignContext"),m=require("./TrustedNameContextLoader");const p=()=>({debug:e.vi.fn(),info:e.vi.fn(),warn:e.vi.fn(),error:e.vi.fn(),subscribers:[]}),l={keyUsageNumber:4,payload:new Uint8Array([7])},a="Addr11111111111111111111111111111111111111",u="Addr22222222222222222222222222222222222222";(0,e.describe)("SolanaTrustedNameContextLoader",()=>{let c,i;(0,e.beforeEach)(()=>{e.vi.restoreAllMocks(),c={getTrustedName:e.vi.fn()},i={loadCertificate:e.vi.fn().mockResolvedValue(l)}});const n=()=>new m.SolanaTrustedNameContextLoader(c,i,p);(0,e.describe)("canHandle",()=>{(0,e.it)("returns true when SOLANA_TRUSTED_NAME is requested with valid requests",()=>{(0,e.expect)(n().canHandle({deviceModelId:d.DeviceModelId.NANO_X,requests:[{address:a,challenge:"c",types:["token","smart_contract"],sources:["sns"]}]},[r.ClearSignContextType.SOLANA_TRUSTED_NAME])).toBe(!0)}),(0,e.it)("returns false when SOLANA_TRUSTED_NAME is not requested",()=>{(0,e.expect)(n().canHandle({requests:[{address:a,challenge:"c",types:["token","smart_contract"],sources:["sns"]}]},[r.ClearSignContextType.SOLANA_TOKEN])).toBe(!1)}),(0,e.it)("returns false on malformed input",()=>{const t=n(),s=[r.ClearSignContextType.SOLANA_TRUSTED_NAME];(0,e.expect)(t.canHandle({requests:[]},s)).toBe(!1),(0,e.expect)(t.canHandle({requests:[{address:"",challenge:"c",types:[],sources:[]}]},s)).toBe(!1),(0,e.expect)(t.canHandle({requests:[{address:a,challenge:"",types:[],sources:[]}]},s)).toBe(!1)})}),(0,e.describe)("load",()=>{(0,e.it)("emits one SOLANA_TRUSTED_NAME per request with Uint8Array payload",async()=>{e.vi.spyOn(c,"getTrustedName").mockImplementation(async({address:s})=>(0,o.Right)({address:s,descriptor:new Uint8Array([s===a?170:187]),keyId:"name_key",keyUsage:"trusted_name"}));const t=await n().load({deviceModelId:d.DeviceModelId.NANO_X,requests:[{address:a,challenge:"c1",types:["token","smart_contract"],sources:["sns"]},{address:u,challenge:"c2",types:["token","smart_contract"],sources:["cal"]}]});(0,e.expect)(t).toHaveLength(2),(0,e.expect)(t[0]).toMatchObject({type:r.ClearSignContextType.SOLANA_TRUSTED_NAME,payload:new Uint8Array([170]),certificate:l}),(0,e.expect)(t[1]).toMatchObject({type:r.ClearSignContextType.SOLANA_TRUSTED_NAME,payload:new Uint8Array([187])})}),(0,e.it)("emits an ERROR per failing request and keeps the others",async()=>{e.vi.spyOn(c,"getTrustedName").mockImplementation(async({address:s})=>s===a?(0,o.Right)({address:s,descriptor:new Uint8Array([170]),keyId:"k",keyUsage:"u"}):(0,o.Left)(new Error("upstream-404")));const t=await n().load({deviceModelId:d.DeviceModelId.NANO_X,requests:[{address:a,challenge:"c1",types:[],sources:[]},{address:u,challenge:"c2",types:[],sources:[]}]});(0,e.expect)(t[0]?.type).toBe(r.ClearSignContextType.SOLANA_TRUSTED_NAME),(0,e.expect)(t[1]?.type).toBe(r.ClearSignContextType.ERROR)}),(0,e.it)("forwards default chain id 900 when input.network is omitted",async()=>{const t=e.vi.spyOn(c,"getTrustedName").mockResolvedValue((0,o.Right)({address:a,descriptor:new Uint8Array([1]),keyId:"k",keyUsage:"u"}));await n().load({deviceModelId:d.DeviceModelId.NANO_X,requests:[{address:a,challenge:"c",types:[],sources:[]}]}),(0,e.expect)(t).toHaveBeenCalledWith(e.expect.objectContaining({network:String(y.SolanaTransactionScanChainId.MAINNET)}))}),(0,e.it)("maps a cluster name to its numeric chain id",async()=>{const t=e.vi.spyOn(c,"getTrustedName").mockResolvedValue((0,o.Right)({address:a,descriptor:new Uint8Array([1]),keyId:"k",keyUsage:"u"}));await n().load({deviceModelId:d.DeviceModelId.NANO_X,network:"solana-devnet",requests:[{address:a,challenge:"c",types:[],sources:[]}]}),(0,e.expect)(t).toHaveBeenCalledWith(e.expect.objectContaining({network:"901"}))})})});
2
2
  //# sourceMappingURL=TrustedNameContextLoader.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/modules/solana/trusted-name/domain/TrustedNameContextLoader.test.ts"],
4
- "sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport { SolanaTransactionScanChainId } from \"@/modules/solana/model/SolanaTransactionScanChainId\";\nimport { type SolanaTrustedNameDataSource } from \"@/modules/solana/trusted-name/data/TrustedNameDataSource\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\n\nimport { SolanaTrustedNameContextLoader } from \"./TrustedNameContextLoader\";\n\nconst mockLoggerFactory = () => ({\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n});\n\nconst mockCertificate = { keyUsageNumber: 4, payload: new Uint8Array([7]) };\nconst ADDR_A = \"Addr11111111111111111111111111111111111111\";\nconst ADDR_B = \"Addr22222222222222222222222222222222222222\";\n\ndescribe(\"SolanaTrustedNameContextLoader\", () => {\n let dataSource: SolanaTrustedNameDataSource;\n let certificateLoader: PkiCertificateLoader;\n\n beforeEach(() => {\n vi.restoreAllMocks();\n dataSource = {\n getTrustedName: vi.fn(),\n };\n certificateLoader = {\n loadCertificate: vi.fn().mockResolvedValue(mockCertificate),\n };\n });\n\n const makeLoader = () =>\n new SolanaTrustedNameContextLoader(\n dataSource,\n certificateLoader,\n mockLoggerFactory,\n );\n\n describe(\"canHandle\", () => {\n it(\"returns true when SOLANA_TRUSTED_NAME is requested with valid requests\", () => {\n expect(\n makeLoader().canHandle(\n {\n deviceModelId: DeviceModelId.NANO_X,\n requests: [\n {\n address: ADDR_A,\n challenge: \"c\",\n sources: [\"sns\"],\n },\n ],\n },\n [ClearSignContextType.SOLANA_TRUSTED_NAME],\n ),\n ).toBe(true);\n });\n\n it(\"returns false when SOLANA_TRUSTED_NAME is not requested\", () => {\n expect(\n makeLoader().canHandle(\n {\n requests: [\n {\n address: ADDR_A,\n challenge: \"c\",\n sources: [\"sns\"],\n },\n ],\n } as any,\n [ClearSignContextType.SOLANA_TOKEN],\n ),\n ).toBe(false);\n });\n\n it(\"returns false on malformed input\", () => {\n const loader = makeLoader();\n const types = [ClearSignContextType.SOLANA_TRUSTED_NAME];\n expect(loader.canHandle({ requests: [] } as any, types)).toBe(false);\n expect(\n loader.canHandle(\n {\n requests: [{ address: \"\", challenge: \"c\", sources: [] }],\n } as any,\n types,\n ),\n ).toBe(false);\n expect(\n loader.canHandle(\n {\n requests: [{ address: ADDR_A, challenge: \"\", sources: [] }],\n } as any,\n types,\n ),\n ).toBe(false);\n });\n });\n\n describe(\"load\", () => {\n it(\"emits one SOLANA_TRUSTED_NAME per request with Uint8Array payload\", async () => {\n vi.spyOn(dataSource, \"getTrustedName\").mockImplementation(\n async ({ address }) =>\n Right({\n address,\n descriptor: new Uint8Array([address === ADDR_A ? 0xaa : 0xbb]),\n keyId: \"name_key\",\n keyUsage: \"trusted_name\",\n }),\n );\n\n const result = await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n requests: [\n {\n address: ADDR_A,\n challenge: \"c1\",\n sources: [\"sns\"],\n },\n {\n address: ADDR_B,\n challenge: \"c2\",\n sources: [\"cal\"],\n },\n ],\n });\n\n expect(result).toHaveLength(2);\n expect(result[0]).toMatchObject({\n type: ClearSignContextType.SOLANA_TRUSTED_NAME,\n payload: new Uint8Array([0xaa]),\n certificate: mockCertificate,\n });\n expect(result[1]).toMatchObject({\n type: ClearSignContextType.SOLANA_TRUSTED_NAME,\n payload: new Uint8Array([0xbb]),\n });\n });\n\n it(\"emits an ERROR per failing request and keeps the others\", async () => {\n vi.spyOn(dataSource, \"getTrustedName\").mockImplementation(\n async ({ address }) => {\n if (address === ADDR_A) {\n return Right({\n address,\n descriptor: new Uint8Array([0xaa]),\n keyId: \"k\",\n keyUsage: \"u\",\n });\n }\n return Left(new Error(\"upstream-404\"));\n },\n );\n\n const out = await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n requests: [\n { address: ADDR_A, challenge: \"c1\", sources: [] },\n { address: ADDR_B, challenge: \"c2\", sources: [] },\n ],\n });\n\n expect(out[0]?.type).toBe(ClearSignContextType.SOLANA_TRUSTED_NAME);\n expect(out[1]?.type).toBe(ClearSignContextType.ERROR);\n });\n\n it(\"forwards default chain id 900 when input.network is omitted\", async () => {\n const spy = vi.spyOn(dataSource, \"getTrustedName\").mockResolvedValue(\n Right({\n address: ADDR_A,\n descriptor: new Uint8Array([1]),\n keyId: \"k\",\n keyUsage: \"u\",\n }),\n );\n\n await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n requests: [{ address: ADDR_A, challenge: \"c\", sources: [] }],\n });\n\n expect(spy).toHaveBeenCalledWith(\n expect.objectContaining({\n network: String(SolanaTransactionScanChainId.MAINNET),\n }),\n );\n });\n\n it(\"maps a cluster name to its numeric chain id\", async () => {\n const spy = vi.spyOn(dataSource, \"getTrustedName\").mockResolvedValue(\n Right({\n address: ADDR_A,\n descriptor: new Uint8Array([1]),\n keyId: \"k\",\n keyUsage: \"u\",\n }),\n );\n\n await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n network: \"solana-devnet\",\n requests: [{ address: ADDR_A, challenge: \"c\", sources: [] }],\n });\n\n expect(spy).toHaveBeenCalledWith(\n expect.objectContaining({ network: \"901\" }),\n );\n });\n });\n});\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport { SolanaTransactionScanChainId } from \"@/modules/solana/model/SolanaTransactionScanChainId\";\nimport { type SolanaTrustedNameDataSource } from \"@/modules/solana/trusted-name/data/TrustedNameDataSource\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\n\nimport { SolanaTrustedNameContextLoader } from \"./TrustedNameContextLoader\";\n\nconst mockLoggerFactory = () => ({\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n});\n\nconst mockCertificate = { keyUsageNumber: 4, payload: new Uint8Array([7]) };\nconst ADDR_A = \"Addr11111111111111111111111111111111111111\";\nconst ADDR_B = \"Addr22222222222222222222222222222222222222\";\n\ndescribe(\"SolanaTrustedNameContextLoader\", () => {\n let dataSource: SolanaTrustedNameDataSource;\n let certificateLoader: PkiCertificateLoader;\n\n beforeEach(() => {\n vi.restoreAllMocks();\n dataSource = {\n getTrustedName: vi.fn(),\n };\n certificateLoader = {\n loadCertificate: vi.fn().mockResolvedValue(mockCertificate),\n };\n });\n\n const makeLoader = () =>\n new SolanaTrustedNameContextLoader(\n dataSource,\n certificateLoader,\n mockLoggerFactory,\n );\n\n describe(\"canHandle\", () => {\n it(\"returns true when SOLANA_TRUSTED_NAME is requested with valid requests\", () => {\n expect(\n makeLoader().canHandle(\n {\n deviceModelId: DeviceModelId.NANO_X,\n requests: [\n {\n address: ADDR_A,\n challenge: \"c\",\n types: [\"token\", \"smart_contract\"],\n sources: [\"sns\"],\n },\n ],\n },\n [ClearSignContextType.SOLANA_TRUSTED_NAME],\n ),\n ).toBe(true);\n });\n\n it(\"returns false when SOLANA_TRUSTED_NAME is not requested\", () => {\n expect(\n makeLoader().canHandle(\n {\n requests: [\n {\n address: ADDR_A,\n challenge: \"c\",\n types: [\"token\", \"smart_contract\"],\n sources: [\"sns\"],\n },\n ],\n } as any,\n [ClearSignContextType.SOLANA_TOKEN],\n ),\n ).toBe(false);\n });\n\n it(\"returns false on malformed input\", () => {\n const loader = makeLoader();\n const types = [ClearSignContextType.SOLANA_TRUSTED_NAME];\n expect(loader.canHandle({ requests: [] } as any, types)).toBe(false);\n expect(\n loader.canHandle(\n {\n requests: [{ address: \"\", challenge: \"c\", types: [], sources: [] }],\n } as any,\n types,\n ),\n ).toBe(false);\n expect(\n loader.canHandle(\n {\n requests: [\n { address: ADDR_A, challenge: \"\", types: [], sources: [] },\n ],\n } as any,\n types,\n ),\n ).toBe(false);\n });\n });\n\n describe(\"load\", () => {\n it(\"emits one SOLANA_TRUSTED_NAME per request with Uint8Array payload\", async () => {\n vi.spyOn(dataSource, \"getTrustedName\").mockImplementation(\n async ({ address }) =>\n Right({\n address,\n descriptor: new Uint8Array([address === ADDR_A ? 0xaa : 0xbb]),\n keyId: \"name_key\",\n keyUsage: \"trusted_name\",\n }),\n );\n\n const result = await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n requests: [\n {\n address: ADDR_A,\n challenge: \"c1\",\n types: [\"token\", \"smart_contract\"],\n sources: [\"sns\"],\n },\n {\n address: ADDR_B,\n challenge: \"c2\",\n types: [\"token\", \"smart_contract\"],\n sources: [\"cal\"],\n },\n ],\n });\n\n expect(result).toHaveLength(2);\n expect(result[0]).toMatchObject({\n type: ClearSignContextType.SOLANA_TRUSTED_NAME,\n payload: new Uint8Array([0xaa]),\n certificate: mockCertificate,\n });\n expect(result[1]).toMatchObject({\n type: ClearSignContextType.SOLANA_TRUSTED_NAME,\n payload: new Uint8Array([0xbb]),\n });\n });\n\n it(\"emits an ERROR per failing request and keeps the others\", async () => {\n vi.spyOn(dataSource, \"getTrustedName\").mockImplementation(\n async ({ address }) => {\n if (address === ADDR_A) {\n return Right({\n address,\n descriptor: new Uint8Array([0xaa]),\n keyId: \"k\",\n keyUsage: \"u\",\n });\n }\n return Left(new Error(\"upstream-404\"));\n },\n );\n\n const out = await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n requests: [\n { address: ADDR_A, challenge: \"c1\", types: [], sources: [] },\n { address: ADDR_B, challenge: \"c2\", types: [], sources: [] },\n ],\n });\n\n expect(out[0]?.type).toBe(ClearSignContextType.SOLANA_TRUSTED_NAME);\n expect(out[1]?.type).toBe(ClearSignContextType.ERROR);\n });\n\n it(\"forwards default chain id 900 when input.network is omitted\", async () => {\n const spy = vi.spyOn(dataSource, \"getTrustedName\").mockResolvedValue(\n Right({\n address: ADDR_A,\n descriptor: new Uint8Array([1]),\n keyId: \"k\",\n keyUsage: \"u\",\n }),\n );\n\n await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n requests: [{ address: ADDR_A, challenge: \"c\", types: [], sources: [] }],\n });\n\n expect(spy).toHaveBeenCalledWith(\n expect.objectContaining({\n network: String(SolanaTransactionScanChainId.MAINNET),\n }),\n );\n });\n\n it(\"maps a cluster name to its numeric chain id\", async () => {\n const spy = vi.spyOn(dataSource, \"getTrustedName\").mockResolvedValue(\n Right({\n address: ADDR_A,\n descriptor: new Uint8Array([1]),\n keyId: \"k\",\n keyUsage: \"u\",\n }),\n );\n\n await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n network: \"solana-devnet\",\n requests: [{ address: ADDR_A, challenge: \"c\", types: [], sources: [] }],\n });\n\n expect(spy).toHaveBeenCalledWith(\n expect.objectContaining({ network: \"901\" }),\n );\n });\n });\n});\n"],
5
+ "mappings": "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",
6
6
  "names": ["import_device_management_kit", "import_purify_ts", "import_vitest", "import_SolanaTransactionScanChainId", "import_ClearSignContext", "import_TrustedNameContextLoader", "mockLoggerFactory", "mockCertificate", "ADDR_A", "ADDR_B", "dataSource", "certificateLoader", "makeLoader", "loader", "types", "address", "result", "out", "spy"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var i=Object.defineProperty;var N=Object.getOwnPropertyDescriptor;var f=Object.getOwnPropertyNames;var l=Object.prototype.hasOwnProperty;var p=(o,e)=>{for(var t in e)i(o,t,{get:e[t],enumerable:!0})},A=(o,e,t,m)=>{if(e&&typeof e=="object"||typeof e=="function")for(let c of f(e))!l.call(o,c)&&c!==t&&i(o,c,{get:()=>e[c],enumerable:!(m=N(e,c))||m.enumerable});return o};var O=o=>A(i({},"__esModule",{value:!0}),o);var n={};p(n,{deviceModelIdCodec:()=>X});module.exports=O(n);var r=require("@ledgerhq/device-management-kit"),d=require("purify-ts");const X=(0,d.oneOf)([(0,d.exactly)(r.DeviceModelId.NANO_X),(0,d.exactly)(r.DeviceModelId.NANO_SP),(0,d.exactly)(r.DeviceModelId.STAX),(0,d.exactly)(r.DeviceModelId.FLEX)]);0&&(module.exports={deviceModelIdCodec});
1
+ "use strict";var i=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var N=Object.getOwnPropertyNames;var X=Object.prototype.hasOwnProperty;var f=(d,e)=>{for(var t in e)i(d,t,{get:e[t],enumerable:!0})},l=(d,e,t,m)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of N(e))!X.call(d,r)&&r!==t&&i(d,r,{get:()=>e[r],enumerable:!(m=A(e,r))||m.enumerable});return d};var p=d=>l(i({},"__esModule",{value:!0}),d);var n={};f(n,{deviceModelIdCodec:()=>O});module.exports=p(n);var c=require("@ledgerhq/device-management-kit"),o=require("purify-ts");const O=(0,o.oneOf)([(0,o.exactly)(c.DeviceModelId.NANO_X),(0,o.exactly)(c.DeviceModelId.NANO_SP),(0,o.exactly)(c.DeviceModelId.STAX),(0,o.exactly)(c.DeviceModelId.FLEX),(0,o.exactly)(c.DeviceModelId.APEX)]);0&&(module.exports={deviceModelIdCodec});
2
2
  //# sourceMappingURL=deviceModelIdCodec.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/shared/utils/deviceModelIdCodec.ts"],
4
- "sourcesContent": ["import { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { exactly, oneOf } from \"purify-ts\";\n\n/**\n * Set of device models supported by the clear-signing and transaction-check\n * flows. Excludes `NANO_S` and `APEX`.\n */\nexport const deviceModelIdCodec = oneOf([\n exactly(DeviceModelId.NANO_X),\n exactly(DeviceModelId.NANO_SP),\n exactly(DeviceModelId.STAX),\n exactly(DeviceModelId.FLEX),\n]);\n"],
5
- "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,wBAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAA8B,2CAC9BC,EAA+B,qBAMxB,MAAMH,KAAqB,SAAM,IACtC,WAAQ,gBAAc,MAAM,KAC5B,WAAQ,gBAAc,OAAO,KAC7B,WAAQ,gBAAc,IAAI,KAC1B,WAAQ,gBAAc,IAAI,CAC5B,CAAC",
4
+ "sourcesContent": ["import { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { exactly, oneOf } from \"purify-ts\";\n\n/**\n * Set of device models supported by the clear-signing and transaction-check\n * flows. Excludes `NANO_S`.\n */\nexport const deviceModelIdCodec = oneOf([\n exactly(DeviceModelId.NANO_X),\n exactly(DeviceModelId.NANO_SP),\n exactly(DeviceModelId.STAX),\n exactly(DeviceModelId.FLEX),\n exactly(DeviceModelId.APEX),\n]);\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,wBAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAA8B,2CAC9BC,EAA+B,qBAMxB,MAAMH,KAAqB,SAAM,IACtC,WAAQ,gBAAc,MAAM,KAC5B,WAAQ,gBAAc,OAAO,KAC7B,WAAQ,gBAAc,IAAI,KAC1B,WAAQ,gBAAc,IAAI,KAC1B,WAAQ,gBAAc,IAAI,CAC5B,CAAC",
6
6
  "names": ["deviceModelIdCodec_exports", "__export", "deviceModelIdCodec", "__toCommonJS", "import_device_management_kit", "import_purify_ts"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var e=require("@ledgerhq/device-management-kit"),t=require("purify-ts"),d=require("./deviceModelIdCodec");describe("deviceModelIdCodec",()=>{it.each([e.DeviceModelId.NANO_X,e.DeviceModelId.NANO_SP,e.DeviceModelId.STAX,e.DeviceModelId.FLEX])("decodes %s as Right",o=>{expect(d.deviceModelIdCodec.decode(o)).toEqual((0,t.Right)(o))}),it("rejects NANO_S (unsupported for clear-signing)",()=>{expect(d.deviceModelIdCodec.decode(e.DeviceModelId.NANO_S).isLeft()).toBe(!0)}),it.each([null,void 0,"","ledger",42,{},[]])("rejects non-model values: %s",o=>{expect(d.deviceModelIdCodec.decode(o).isLeft()).toBe(!0)}),it("encodes a model as itself",()=>{expect(d.deviceModelIdCodec.encode(e.DeviceModelId.NANO_X)).toBe(e.DeviceModelId.NANO_X)})});
1
+ "use strict";var e=require("@ledgerhq/device-management-kit"),t=require("purify-ts"),d=require("./deviceModelIdCodec");describe("deviceModelIdCodec",()=>{it.each([e.DeviceModelId.NANO_X,e.DeviceModelId.NANO_SP,e.DeviceModelId.STAX,e.DeviceModelId.FLEX,e.DeviceModelId.APEX])("decodes %s as Right",o=>{expect(d.deviceModelIdCodec.decode(o)).toEqual((0,t.Right)(o))}),it("rejects NANO_S (unsupported for clear-signing)",()=>{expect(d.deviceModelIdCodec.decode(e.DeviceModelId.NANO_S).isLeft()).toBe(!0)}),it.each([null,void 0,"","ledger",42,{},[]])("rejects non-model values: %s",o=>{expect(d.deviceModelIdCodec.decode(o).isLeft()).toBe(!0)}),it("encodes a model as itself",()=>{expect(d.deviceModelIdCodec.encode(e.DeviceModelId.NANO_X)).toBe(e.DeviceModelId.NANO_X)})});
2
2
  //# sourceMappingURL=deviceModelIdCodec.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/shared/utils/deviceModelIdCodec.test.ts"],
4
- "sourcesContent": ["import { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { Right } from \"purify-ts\";\n\nimport { deviceModelIdCodec } from \"./deviceModelIdCodec\";\n\ndescribe(\"deviceModelIdCodec\", () => {\n it.each([\n DeviceModelId.NANO_X,\n DeviceModelId.NANO_SP,\n DeviceModelId.STAX,\n DeviceModelId.FLEX,\n ])(\"decodes %s as Right\", (model) => {\n expect(deviceModelIdCodec.decode(model)).toEqual(Right(model));\n });\n\n it(\"rejects NANO_S (unsupported for clear-signing)\", () => {\n expect(deviceModelIdCodec.decode(DeviceModelId.NANO_S).isLeft()).toBe(true);\n });\n\n it.each([null, undefined, \"\", \"ledger\", 42, {}, []])(\n \"rejects non-model values: %s\",\n (value) => {\n expect(deviceModelIdCodec.decode(value).isLeft()).toBe(true);\n },\n );\n\n it(\"encodes a model as itself\", () => {\n expect(deviceModelIdCodec.encode(DeviceModelId.NANO_X)).toBe(\n DeviceModelId.NANO_X,\n );\n });\n});\n"],
5
- "mappings": "aAAA,IAAAA,EAA8B,2CAC9BC,EAAsB,qBAEtBC,EAAmC,gCAEnC,SAAS,qBAAsB,IAAM,CACnC,GAAG,KAAK,CACN,gBAAc,OACd,gBAAc,QACd,gBAAc,KACd,gBAAc,IAChB,CAAC,EAAE,sBAAwBC,GAAU,CACnC,OAAO,qBAAmB,OAAOA,CAAK,CAAC,EAAE,WAAQ,SAAMA,CAAK,CAAC,CAC/D,CAAC,EAED,GAAG,iDAAkD,IAAM,CACzD,OAAO,qBAAmB,OAAO,gBAAc,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAI,CAC5E,CAAC,EAED,GAAG,KAAK,CAAC,KAAM,OAAW,GAAI,SAAU,GAAI,CAAC,EAAG,CAAC,CAAC,CAAC,EACjD,+BACCC,GAAU,CACT,OAAO,qBAAmB,OAAOA,CAAK,EAAE,OAAO,CAAC,EAAE,KAAK,EAAI,CAC7D,CACF,EAEA,GAAG,4BAA6B,IAAM,CACpC,OAAO,qBAAmB,OAAO,gBAAc,MAAM,CAAC,EAAE,KACtD,gBAAc,MAChB,CACF,CAAC,CACH,CAAC",
4
+ "sourcesContent": ["import { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { Right } from \"purify-ts\";\n\nimport { deviceModelIdCodec } from \"./deviceModelIdCodec\";\n\ndescribe(\"deviceModelIdCodec\", () => {\n it.each([\n DeviceModelId.NANO_X,\n DeviceModelId.NANO_SP,\n DeviceModelId.STAX,\n DeviceModelId.FLEX,\n DeviceModelId.APEX,\n ])(\"decodes %s as Right\", (model) => {\n expect(deviceModelIdCodec.decode(model)).toEqual(Right(model));\n });\n\n it(\"rejects NANO_S (unsupported for clear-signing)\", () => {\n expect(deviceModelIdCodec.decode(DeviceModelId.NANO_S).isLeft()).toBe(true);\n });\n\n it.each([null, undefined, \"\", \"ledger\", 42, {}, []])(\n \"rejects non-model values: %s\",\n (value) => {\n expect(deviceModelIdCodec.decode(value).isLeft()).toBe(true);\n },\n );\n\n it(\"encodes a model as itself\", () => {\n expect(deviceModelIdCodec.encode(DeviceModelId.NANO_X)).toBe(\n DeviceModelId.NANO_X,\n );\n });\n});\n"],
5
+ "mappings": "aAAA,IAAAA,EAA8B,2CAC9BC,EAAsB,qBAEtBC,EAAmC,gCAEnC,SAAS,qBAAsB,IAAM,CACnC,GAAG,KAAK,CACN,gBAAc,OACd,gBAAc,QACd,gBAAc,KACd,gBAAc,KACd,gBAAc,IAChB,CAAC,EAAE,sBAAwBC,GAAU,CACnC,OAAO,qBAAmB,OAAOA,CAAK,CAAC,EAAE,WAAQ,SAAMA,CAAK,CAAC,CAC/D,CAAC,EAED,GAAG,iDAAkD,IAAM,CACzD,OAAO,qBAAmB,OAAO,gBAAc,MAAM,EAAE,OAAO,CAAC,EAAE,KAAK,EAAI,CAC5E,CAAC,EAED,GAAG,KAAK,CAAC,KAAM,OAAW,GAAI,SAAU,GAAI,CAAC,EAAG,CAAC,CAAC,CAAC,EACjD,+BACCC,GAAU,CACT,OAAO,qBAAmB,OAAOA,CAAK,EAAE,OAAO,CAAC,EAAE,KAAK,EAAI,CAC7D,CACF,EAEA,GAAG,4BAA6B,IAAM,CACpC,OAAO,qBAAmB,OAAO,gBAAc,MAAM,CAAC,EAAE,KACtD,gBAAc,MAChB,CACF,CAAC,CACH,CAAC",
6
6
  "names": ["import_device_management_kit", "import_purify_ts", "import_deviceModelIdCodec", "model", "value"]
7
7
  }
@@ -35,7 +35,7 @@
35
35
  "license": "Apache-2.0",
36
36
  "name": "@ledgerhq/context-module",
37
37
  "peerDependencies": {
38
- "@ledgerhq/device-management-kit": "^1.7.1"
38
+ "@ledgerhq/device-management-kit": "workspace:^"
39
39
  },
40
40
  "private": false,
41
41
  "repository": {
@@ -58,5 +58,5 @@
58
58
  "watch:builds": "pnpm ldmk-tool watch --entryPoints index.ts,src/**/*.ts --tsconfig tsconfig.prod.json",
59
59
  "watch:types": "concurrently \"tsc --watch -p tsconfig.prod.json\" \"tsc-alias --watch -p tsconfig.prod.json\""
60
60
  },
61
- "version": "2.3.0"
61
+ "version": "2.4.0"
62
62
  }
@@ -1,2 +1,2 @@
1
- var g=Object.defineProperty;var f=Object.getOwnPropertyDescriptor;var h=(i,t,r,e)=>{for(var n=e>1?void 0:e?f(t,r):t,o=i.length-1,c;o>=0;o--)(c=i[o])&&(n=(e?c(t,r,n):c(n))||n);return e&&n&&g(t,r,n),n},d=(i,t)=>(r,e)=>t(r,e,i);import{inject as C,injectable as y}from"inversify";import{Codec as S,number as T,string as A}from"purify-ts";import{configTypes as k}from"../../../../config/di/configTypes";import{pkiTypes as x}from"../../../../modules/multichain/pki/di/pkiTypes";import{KeyUsage as E}from"../../../../modules/multichain/pki/model/KeyUsage";import{transactionCheckTypes as R}from"../../../../modules/multichain/transaction-check/di/transactionCheckTypes";import{TransactionCheckPaths as I}from"../../../../modules/multichain/transaction-check/utils/constants";import{ClearSignContextType as u}from"../../../../shared/model/ClearSignContext";import{DefaultBs58Encoder as L}from"../../../../shared/utils/bs58Encoder";import{deviceModelIdCodec as N}from"../../../../shared/utils/deviceModelIdCodec";import{uint8ArrayCodec as O}from"../../../../shared/utils/uint8ArrayCodec";const _=[u.SOLANA_TRANSACTION_CHECK],v=64,m=64,w=128,b=128,M=127,P=7,U=S.interface({deviceModelId:N,transactionCheck:S.interface({from:A,transactionBytes:O,chain:T})});let l=class{constructor(t,r,e,n=L){this.transactionCheckDataSource=t;this.certificateLoader=r;this.bs58Encoder=n;this.logger=e("SolanaTransactionCheckLoader")}logger;canHandle(t,r){return _.every(e=>r.includes(e))?U.decode(t).caseOf({Left:()=>!1,Right:({transactionCheck:{from:e,transactionBytes:n}})=>e.length>0&&n.length>0}):!1}async load(t){const{from:r,transactionBytes:e,chain:n}=t.transactionCheck;let o;try{o=this.bs58Encoder.encode(this.wrapMessageAsTransaction(e))}catch(a){const s=[{type:u.ERROR,error:a instanceof Error?a:new Error(String(a))}];return this.logger.debug("load result",{data:{result:s}}),s}const p=[await(await this.transactionCheckDataSource.check({path:I.SOLANA_TRANSACTION,body:{tx:{from:r,raw:o},chain:n}})).caseOf({Left:a=>Promise.resolve({type:u.ERROR,error:a}),Right:async a=>{const s=await this.certificateLoader.loadCertificate({keyId:a.publicKeyId,keyUsage:E.TxSimulationSigner,targetDevice:t.deviceModelId});return{type:u.SOLANA_TRANSACTION_CHECK,payload:{descriptor:a.descriptor},certificate:s}}})];return this.logger.debug("load result",{data:{result:p}}),p}wrapMessageAsTransaction(t){const r=this.readNumRequiredSignatures(t),e=this.encodeShortVec(r),n=r*v,o=new Uint8Array(e.length+n+t.length);return o.set(e,0),o.set(t,e.length+n),o}readNumRequiredSignatures(t){const r=t[0];if(r===void 0)throw new Error("[ContextModule] SolanaTransactionCheckLoader: empty transaction bytes");const n=(r&w)!==0?1:0,o=t[n];if(o===void 0)throw new Error("[ContextModule] SolanaTransactionCheckLoader: malformed message header");if(o>m)throw new Error(`[ContextModule] SolanaTransactionCheckLoader: numRequiredSignatures (${o}) exceeds SOLANA_MAX_SIGNATURES (${m})`);return o}encodeShortVec(t){const r=[];let e=t;for(;;){const n=e&M;if(e>>>=P,e===0){r.push(n);break}r.push(n|b)}return Uint8Array.from(r)}};l=h([y(),d(0,C(R.TransactionCheckDataSource)),d(1,C(x.PkiCertificateLoader)),d(2,C(k.ContextModuleLoggerFactory))],l);export{l as SolanaTransactionCheckLoader};
1
+ var g=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var m=(a,t,o,e)=>{for(var r=e>1?void 0:e?y(t,o):t,n=a.length-1,i;n>=0;n--)(i=a[n])&&(r=(e?i(t,o,r):i(r))||r);return e&&r&&g(t,o,r),r},s=(a,t)=>(o,e)=>t(o,e,a);import{inject as d,injectable as u}from"inversify";import{Codec as h,number as k,string as S}from"purify-ts";import{configTypes as T}from"../../../../config/di/configTypes";import{pkiTypes as x}from"../../../../modules/multichain/pki/di/pkiTypes";import{KeyUsage as v}from"../../../../modules/multichain/pki/model/KeyUsage";import{transactionCheckTypes as I}from"../../../../modules/multichain/transaction-check/di/transactionCheckTypes";import{TransactionCheckPaths as A}from"../../../../modules/multichain/transaction-check/utils/constants";import{ClearSignContextType as p}from"../../../../shared/model/ClearSignContext";import{DefaultBs58Encoder as L}from"../../../../shared/utils/bs58Encoder";import{deviceModelIdCodec as P}from"../../../../shared/utils/deviceModelIdCodec";import{uint8ArrayCodec as b}from"../../../../shared/utils/uint8ArrayCodec";const R=[p.SOLANA_TRANSACTION_CHECK],D=h.interface({deviceModelId:P,transactionCheck:h.interface({from:S,transactionBytes:b,chain:k})});let C=class{constructor(t,o,e,r=L){this.transactionCheckDataSource=t;this.certificateLoader=o;this.bs58Encoder=r;this.logger=e("SolanaTransactionCheckLoader")}logger;canHandle(t,o){return R.every(e=>o.includes(e))?D.decode(t).caseOf({Left:()=>!1,Right:({transactionCheck:{from:e,transactionBytes:r}})=>e.length>0&&r.length>0}):!1}async load(t){const{from:o,transactionBytes:e,chain:r}=t.transactionCheck,n=this.bs58Encoder.encode(e),l=[await(await this.transactionCheckDataSource.check({path:A.SOLANA_TRANSACTION,body:{tx:{from:o,raw:n},chain:r}})).caseOf({Left:c=>Promise.resolve({type:p.ERROR,error:c}),Right:async c=>{const f=await this.certificateLoader.loadCertificate({keyId:c.publicKeyId,keyUsage:v.TxSimulationSigner,targetDevice:t.deviceModelId});return{type:p.SOLANA_TRANSACTION_CHECK,payload:{descriptor:c.descriptor},certificate:f}}})];return this.logger.debug("load result",{data:{result:l}}),l}};C=m([u(),s(0,d(I.TransactionCheckDataSource)),s(1,d(x.PkiCertificateLoader)),s(2,d(T.ContextModuleLoggerFactory))],C);export{C as SolanaTransactionCheckLoader};
2
2
  //# sourceMappingURL=SolanaTransactionCheckLoader.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.ts"],
4
- "sourcesContent": ["import {\n type DeviceModelId,\n LoggerPublisherService,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { Codec, number, string } from \"purify-ts\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { pkiTypes } from \"@/modules/multichain/pki/di/pkiTypes\";\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport { KeyUsage } from \"@/modules/multichain/pki/model/KeyUsage\";\nimport { type TransactionCheckDataSource } from \"@/modules/multichain/transaction-check/data/TransactionCheckDataSource\";\nimport { transactionCheckTypes } from \"@/modules/multichain/transaction-check/di/transactionCheckTypes\";\nimport { type TransactionCheckLoader } from \"@/modules/multichain/transaction-check/loaders/TransactionCheckLoader\";\nimport { TransactionCheckPaths } from \"@/modules/multichain/transaction-check/utils/constants\";\nimport {\n ClearSignContext,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\nimport {\n type Bs58Encoder,\n DefaultBs58Encoder,\n} from \"@/shared/utils/bs58Encoder\";\nimport { deviceModelIdCodec } from \"@/shared/utils/deviceModelIdCodec\";\nimport { uint8ArrayCodec } from \"@/shared/utils/uint8ArrayCodec\";\n\nexport type SolanaTransactionCheckRequest = {\n from: string;\n transactionBytes: Uint8Array;\n chain: number;\n};\n\nexport type SolanaTransactionCheckContextInput = {\n deviceModelId: DeviceModelId;\n transactionCheck: SolanaTransactionCheckRequest;\n};\n\nconst SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.SOLANA_TRANSACTION_CHECK,\n];\n\nconst SOLANA_SIGNATURE_LENGTH = 64;\nconst SOLANA_MAX_SIGNATURES = 64;\nconst VERSIONED_MESSAGE_PREFIX_MASK = 0x80;\nconst SHORTVEC_CONTINUATION_BIT = 0x80;\nconst SHORTVEC_DATA_MASK = 0x7f;\nconst SHORTVEC_DATA_BITS = 7;\n\nconst solanaTransactionCheckInputCodec = Codec.interface({\n deviceModelId: deviceModelIdCodec,\n transactionCheck: Codec.interface({\n from: string,\n transactionBytes: uint8ArrayCodec,\n chain: number,\n }),\n});\n\n@injectable()\nexport class SolanaTransactionCheckLoader\n implements TransactionCheckLoader<SolanaTransactionCheckContextInput>\n{\n private readonly logger: LoggerPublisherService;\n\n constructor(\n @inject(transactionCheckTypes.TransactionCheckDataSource)\n private readonly transactionCheckDataSource: TransactionCheckDataSource,\n @inject(pkiTypes.PkiCertificateLoader)\n private readonly certificateLoader: PkiCertificateLoader,\n @inject(configTypes.ContextModuleLoggerFactory)\n loggerFactory: (tag: string) => LoggerPublisherService,\n private readonly bs58Encoder: Bs58Encoder = DefaultBs58Encoder,\n ) {\n this.logger = loggerFactory(\"SolanaTransactionCheckLoader\");\n }\n\n canHandle(\n input: unknown,\n expectedType: ClearSignContextType[],\n ): input is SolanaTransactionCheckContextInput {\n if (!SUPPORTED_TYPES.every((type) => expectedType.includes(type)))\n return false;\n return solanaTransactionCheckInputCodec.decode(input).caseOf({\n Left: () => false,\n Right: ({ transactionCheck: { from, transactionBytes } }) =>\n from.length > 0 && transactionBytes.length > 0,\n });\n }\n\n async load(\n ctx: SolanaTransactionCheckContextInput,\n ): Promise<ClearSignContext[]> {\n const { from, transactionBytes, chain } = ctx.transactionCheck;\n\n let rawTx: string;\n try {\n rawTx = this.bs58Encoder.encode(\n this.wrapMessageAsTransaction(transactionBytes),\n );\n } catch (error) {\n const result: ClearSignContext[] = [\n {\n type: ClearSignContextType.ERROR,\n error: error instanceof Error ? error : new Error(String(error)),\n },\n ];\n this.logger.debug(\"load result\", { data: { result } });\n return result;\n }\n\n const txCheck = await this.transactionCheckDataSource.check({\n path: TransactionCheckPaths.SOLANA_TRANSACTION,\n body: { tx: { from, raw: rawTx }, chain },\n });\n\n const context = await txCheck.caseOf<Promise<ClearSignContext>>({\n Left: (error) =>\n Promise.resolve({\n type: ClearSignContextType.ERROR,\n error,\n }),\n Right: async (data) => {\n const certificate = await this.certificateLoader.loadCertificate({\n keyId: data.publicKeyId,\n keyUsage: KeyUsage.TxSimulationSigner,\n targetDevice: ctx.deviceModelId,\n });\n\n return {\n type: ClearSignContextType.SOLANA_TRANSACTION_CHECK,\n payload: { descriptor: data.descriptor },\n certificate,\n };\n },\n });\n\n const result = [context];\n this.logger.debug(\"load result\", { data: { result } });\n return result;\n }\n\n /**\n * Wrap a serialized Solana Message into a serialized Transaction expected\n * by the web3checks endpoint, by prepending a compact-u16 signature count\n * and the matching number of zero-filled signature placeholders.\n *\n * Supports legacy and versioned messages: versioned messages start with a\n * version prefix byte (high bit set), shifting `numRequiredSignatures` by\n * one position.\n */\n private wrapMessageAsTransaction(message: Uint8Array): Uint8Array {\n const numRequiredSignatures = this.readNumRequiredSignatures(message);\n const sigCount = this.encodeShortVec(numRequiredSignatures);\n const placeholdersLength = numRequiredSignatures * SOLANA_SIGNATURE_LENGTH;\n\n const wrapped = new Uint8Array(\n sigCount.length + placeholdersLength + message.length,\n );\n wrapped.set(sigCount, 0);\n wrapped.set(message, sigCount.length + placeholdersLength);\n return wrapped;\n }\n\n private readNumRequiredSignatures(message: Uint8Array): number {\n const firstByte = message[0];\n if (firstByte === undefined) {\n throw new Error(\n \"[ContextModule] SolanaTransactionCheckLoader: empty transaction bytes\",\n );\n }\n const isVersioned = (firstByte & VERSIONED_MESSAGE_PREFIX_MASK) !== 0;\n const headerOffset = isVersioned ? 1 : 0;\n const numRequiredSignatures = message[headerOffset];\n if (numRequiredSignatures === undefined) {\n throw new Error(\n \"[ContextModule] SolanaTransactionCheckLoader: malformed message header\",\n );\n }\n if (numRequiredSignatures > SOLANA_MAX_SIGNATURES) {\n throw new Error(\n `[ContextModule] SolanaTransactionCheckLoader: numRequiredSignatures (${numRequiredSignatures}) exceeds SOLANA_MAX_SIGNATURES (${SOLANA_MAX_SIGNATURES})`,\n );\n }\n return numRequiredSignatures;\n }\n\n private encodeShortVec(value: number): Uint8Array {\n const bytes: number[] = [];\n let remaining = value;\n while (true) {\n const lowBits = remaining & SHORTVEC_DATA_MASK;\n remaining >>>= SHORTVEC_DATA_BITS;\n if (remaining === 0) {\n bytes.push(lowBits);\n break;\n }\n bytes.push(lowBits | SHORTVEC_CONTINUATION_BIT);\n }\n return Uint8Array.from(bytes);\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["inject", "injectable", "Codec", "number", "string", "configTypes", "pkiTypes", "KeyUsage", "transactionCheckTypes", "TransactionCheckPaths", "ClearSignContextType", "DefaultBs58Encoder", "deviceModelIdCodec", "uint8ArrayCodec", "SUPPORTED_TYPES", "ClearSignContextType", "SOLANA_SIGNATURE_LENGTH", "SOLANA_MAX_SIGNATURES", "VERSIONED_MESSAGE_PREFIX_MASK", "SHORTVEC_CONTINUATION_BIT", "SHORTVEC_DATA_MASK", "SHORTVEC_DATA_BITS", "solanaTransactionCheckInputCodec", "Codec", "deviceModelIdCodec", "string", "uint8ArrayCodec", "number", "SolanaTransactionCheckLoader", "transactionCheckDataSource", "certificateLoader", "loggerFactory", "bs58Encoder", "DefaultBs58Encoder", "input", "expectedType", "type", "from", "transactionBytes", "ctx", "chain", "rawTx", "error", "result", "TransactionCheckPaths", "data", "certificate", "KeyUsage", "message", "numRequiredSignatures", "sigCount", "placeholdersLength", "wrapped", "firstByte", "headerOffset", "value", "bytes", "remaining", "lowBits", "__decorateClass", "injectable", "__decorateParam", "inject", "transactionCheckTypes", "pkiTypes", "configTypes"]
4
+ "sourcesContent": ["import {\n type DeviceModelId,\n LoggerPublisherService,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { Codec, number, string } from \"purify-ts\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { pkiTypes } from \"@/modules/multichain/pki/di/pkiTypes\";\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport { KeyUsage } from \"@/modules/multichain/pki/model/KeyUsage\";\nimport { type TransactionCheckDataSource } from \"@/modules/multichain/transaction-check/data/TransactionCheckDataSource\";\nimport { transactionCheckTypes } from \"@/modules/multichain/transaction-check/di/transactionCheckTypes\";\nimport { type TransactionCheckLoader } from \"@/modules/multichain/transaction-check/loaders/TransactionCheckLoader\";\nimport { TransactionCheckPaths } from \"@/modules/multichain/transaction-check/utils/constants\";\nimport {\n ClearSignContext,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\nimport {\n type Bs58Encoder,\n DefaultBs58Encoder,\n} from \"@/shared/utils/bs58Encoder\";\nimport { deviceModelIdCodec } from \"@/shared/utils/deviceModelIdCodec\";\nimport { uint8ArrayCodec } from \"@/shared/utils/uint8ArrayCodec\";\n\nexport type SolanaTransactionCheckRequest = {\n from: string;\n transactionBytes: Uint8Array;\n chain: number;\n};\n\nexport type SolanaTransactionCheckContextInput = {\n deviceModelId: DeviceModelId;\n transactionCheck: SolanaTransactionCheckRequest;\n};\n\nconst SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.SOLANA_TRANSACTION_CHECK,\n];\n\nconst solanaTransactionCheckInputCodec = Codec.interface({\n deviceModelId: deviceModelIdCodec,\n transactionCheck: Codec.interface({\n from: string,\n transactionBytes: uint8ArrayCodec,\n chain: number,\n }),\n});\n\n@injectable()\nexport class SolanaTransactionCheckLoader\n implements TransactionCheckLoader<SolanaTransactionCheckContextInput>\n{\n private readonly logger: LoggerPublisherService;\n\n constructor(\n @inject(transactionCheckTypes.TransactionCheckDataSource)\n private readonly transactionCheckDataSource: TransactionCheckDataSource,\n @inject(pkiTypes.PkiCertificateLoader)\n private readonly certificateLoader: PkiCertificateLoader,\n @inject(configTypes.ContextModuleLoggerFactory)\n loggerFactory: (tag: string) => LoggerPublisherService,\n private readonly bs58Encoder: Bs58Encoder = DefaultBs58Encoder,\n ) {\n this.logger = loggerFactory(\"SolanaTransactionCheckLoader\");\n }\n\n canHandle(\n input: unknown,\n expectedType: ClearSignContextType[],\n ): input is SolanaTransactionCheckContextInput {\n if (!SUPPORTED_TYPES.every((type) => expectedType.includes(type)))\n return false;\n return solanaTransactionCheckInputCodec.decode(input).caseOf({\n Left: () => false,\n Right: ({ transactionCheck: { from, transactionBytes } }) =>\n from.length > 0 && transactionBytes.length > 0,\n });\n }\n\n async load(\n ctx: SolanaTransactionCheckContextInput,\n ): Promise<ClearSignContext[]> {\n const { from, transactionBytes, chain } = ctx.transactionCheck;\n\n const rawTx = this.bs58Encoder.encode(transactionBytes);\n\n const txCheck = await this.transactionCheckDataSource.check({\n path: TransactionCheckPaths.SOLANA_TRANSACTION,\n body: { tx: { from, raw: rawTx }, chain },\n });\n\n const context = await txCheck.caseOf<Promise<ClearSignContext>>({\n Left: (error) =>\n Promise.resolve({\n type: ClearSignContextType.ERROR,\n error,\n }),\n Right: async (data) => {\n const certificate = await this.certificateLoader.loadCertificate({\n keyId: data.publicKeyId,\n keyUsage: KeyUsage.TxSimulationSigner,\n targetDevice: ctx.deviceModelId,\n });\n\n return {\n type: ClearSignContextType.SOLANA_TRANSACTION_CHECK,\n payload: { descriptor: data.descriptor },\n certificate,\n };\n },\n });\n\n const result = [context];\n this.logger.debug(\"load result\", { data: { result } });\n return result;\n }\n}\n"],
5
+ "mappings": "iOAIA,OAAS,UAAAA,EAAQ,cAAAC,MAAkB,YACnC,OAAS,SAAAC,EAAO,UAAAC,EAAQ,UAAAC,MAAc,YAEtC,OAAS,eAAAC,MAAmB,0BAC5B,OAAS,YAAAC,MAAgB,uCAEzB,OAAS,YAAAC,MAAgB,0CAEzB,OAAS,yBAAAC,MAA6B,kEAEtC,OAAS,yBAAAC,MAA6B,yDACtC,OAEE,wBAAAC,MACK,kCACP,OAEE,sBAAAC,MACK,6BACP,OAAS,sBAAAC,MAA0B,oCACnC,OAAS,mBAAAC,MAAuB,iCAahC,MAAMC,EAA0C,CAC9CC,EAAqB,wBACvB,EAEMC,EAAmCC,EAAM,UAAU,CACvD,cAAeC,EACf,iBAAkBD,EAAM,UAAU,CAChC,KAAME,EACN,iBAAkBC,EAClB,MAAOC,CACT,CAAC,CACH,CAAC,EAGM,IAAMC,EAAN,KAEP,CAGE,YAEmBC,EAEAC,EAEjBC,EACiBC,EAA2BC,EAC5C,CANiB,gCAAAJ,EAEA,uBAAAC,EAGA,iBAAAE,EAEjB,KAAK,OAASD,EAAc,8BAA8B,CAC5D,CAZiB,OAcjB,UACEG,EACAC,EAC6C,CAC7C,OAAKf,EAAgB,MAAOgB,GAASD,EAAa,SAASC,CAAI,CAAC,EAEzDd,EAAiC,OAAOY,CAAK,EAAE,OAAO,CAC3D,KAAM,IAAM,GACZ,MAAO,CAAC,CAAE,iBAAkB,CAAE,KAAAG,EAAM,iBAAAC,CAAiB,CAAE,IACrDD,EAAK,OAAS,GAAKC,EAAiB,OAAS,CACjD,CAAC,EALQ,EAMX,CAEA,MAAM,KACJC,EAC6B,CAC7B,KAAM,CAAE,KAAAF,EAAM,iBAAAC,EAAkB,MAAAE,CAAM,EAAID,EAAI,iBAExCE,EAAQ,KAAK,YAAY,OAAOH,CAAgB,EA4BhDI,EAAS,CArBC,MALA,MAAM,KAAK,2BAA2B,MAAM,CAC1D,KAAMC,EAAsB,mBAC5B,KAAM,CAAE,GAAI,CAAE,KAAAN,EAAM,IAAKI,CAAM,EAAG,MAAAD,CAAM,CAC1C,CAAC,GAE6B,OAAkC,CAC9D,KAAOI,GACL,QAAQ,QAAQ,CACd,KAAMvB,EAAqB,MAC3B,MAAAuB,CACF,CAAC,EACH,MAAO,MAAOC,GAAS,CACrB,MAAMC,EAAc,MAAM,KAAK,kBAAkB,gBAAgB,CAC/D,MAAOD,EAAK,YACZ,SAAUE,EAAS,mBACnB,aAAcR,EAAI,aACpB,CAAC,EAED,MAAO,CACL,KAAMlB,EAAqB,yBAC3B,QAAS,CAAE,WAAYwB,EAAK,UAAW,EACvC,YAAAC,CACF,CACF,CACF,CAAC,CAEsB,EACvB,YAAK,OAAO,MAAM,cAAe,CAAE,KAAM,CAAE,OAAAJ,CAAO,CAAE,CAAC,EAC9CA,CACT,CACF,EAnEad,EAANoB,EAAA,CADNC,EAAW,EAOPC,EAAA,EAAAC,EAAOC,EAAsB,0BAA0B,GAEvDF,EAAA,EAAAC,EAAOE,EAAS,oBAAoB,GAEpCH,EAAA,EAAAC,EAAOG,EAAY,0BAA0B,IAVrC1B",
6
+ "names": ["inject", "injectable", "Codec", "number", "string", "configTypes", "pkiTypes", "KeyUsage", "transactionCheckTypes", "TransactionCheckPaths", "ClearSignContextType", "DefaultBs58Encoder", "deviceModelIdCodec", "uint8ArrayCodec", "SUPPORTED_TYPES", "ClearSignContextType", "solanaTransactionCheckInputCodec", "Codec", "deviceModelIdCodec", "string", "uint8ArrayCodec", "number", "SolanaTransactionCheckLoader", "transactionCheckDataSource", "certificateLoader", "loggerFactory", "bs58Encoder", "DefaultBs58Encoder", "input", "expectedType", "type", "from", "transactionBytes", "ctx", "chain", "rawTx", "result", "TransactionCheckPaths", "error", "data", "certificate", "KeyUsage", "__decorateClass", "injectable", "__decorateParam", "inject", "transactionCheckTypes", "pkiTypes", "configTypes"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{DeviceModelId as o}from"@ledgerhq/device-management-kit";import d from"bs58";import{Left as A,Right as l}from"purify-ts";import{TransactionCheckPaths as p}from"../../../../modules/multichain/transaction-check/utils/constants";import{SolanaTransactionScanChainId as i}from"../../../../modules/solana/model/SolanaTransactionScanChainId";import{ClearSignContextType as n}from"../../../../shared/model/ClearSignContext";import{SolanaTransactionCheckLoader as f}from"./SolanaTransactionCheckLoader";const N={debug:vi.fn(),info:vi.fn(),warn:vi.fn(),error:vi.fn(),subscribers:[]},y=()=>N,s={loadCertificate:vi.fn()};let r,a;beforeEach(()=>{vi.resetAllMocks(),r={check:vi.fn()},a=new f(r,s,y)});describe("SolanaTransactionCheckLoader",()=>{describe("canHandle",()=>{const e={deviceModelId:o.NANO_X,transactionCheck:{from:"signer",transactionBytes:new Uint8Array([1,0,3,222]),chain:1}};it("returns true for a valid Solana transaction-check input",()=>{expect(a.canHandle(e,[n.SOLANA_TRANSACTION_CHECK])).toBe(!0)}),it("returns false when expected types do not include SOLANA_TRANSACTION_CHECK",()=>{expect(a.canHandle(e,[n.SOLANA_TOKEN])).toBe(!1)}),it("returns false when transactionBytes is not a Uint8Array",()=>{expect(a.canHandle({...e,transactionCheck:{...e.transactionCheck,transactionBytes:"0xdead"}},[n.SOLANA_TRANSACTION_CHECK])).toBe(!1)}),it("returns false when transactionBytes is empty",()=>{expect(a.canHandle({...e,transactionCheck:{...e.transactionCheck,transactionBytes:new Uint8Array}},[n.SOLANA_TRANSACTION_CHECK])).toBe(!1)}),it("returns false when from is empty",()=>{expect(a.canHandle({...e,transactionCheck:{...e.transactionCheck,from:""}},[n.SOLANA_TRANSACTION_CHECK])).toBe(!1)}),it("returns false for unsupported device models (NANO_S)",()=>{expect(a.canHandle({...e,deviceModelId:o.NANO_S},[n.SOLANA_TRANSACTION_CHECK])).toBe(!1)})}),describe("load \u2014 wire format",()=>{beforeEach(()=>{r.check.mockResolvedValue(l({publicKeyId:"pk",descriptor:"aabb"})),s.loadCertificate.mockResolvedValue({payload:new Uint8Array([204]),keyUsageNumber:14})}),it("wraps a legacy message with zero-filled signature placeholders before bs58-encoding",async()=>{const e=new Uint8Array([2,0,3,170,187,204]),t=new Uint8Array(1+2*64+e.length);t[0]=2,t.set(e,1+2*64),await a.load({deviceModelId:o.NANO_X,transactionCheck:{from:"signer",transactionBytes:e,chain:i.MAINNET}});const c=r.check.mock.calls[0][0];expect(c.path).toBe(p.SOLANA_TRANSACTION),expect(c.body.tx.from).toBe("signer"),expect(c.body.chain).toBe(i.MAINNET),expect(Array.from(d.decode(c.body.tx.raw))).toEqual(Array.from(t)),expect(c.body.tx.raw).toBe(d.encode(t))}),it("wraps a versioned (v0) message with signature placeholders",async()=>{const e=new Uint8Array([128,1,0,3,222,173]),t=new Uint8Array(1+1*64+e.length);t[0]=1,t.set(e,1+1*64),await a.load({deviceModelId:o.NANO_X,transactionCheck:{from:"signer",transactionBytes:e,chain:i.MAINNET}});const c=r.check.mock.calls[0][0].body.tx.raw;expect(Array.from(d.decode(c))).toEqual(Array.from(t))})}),describe("load \u2014 result mapping",()=>{it("returns a SOLANA_TRANSACTION_CHECK context with descriptor and certificate on success",async()=>{r.check.mockResolvedValue(l({publicKeyId:"pk-1",descriptor:"deadbeef"}));const e={payload:new Uint8Array([153]),keyUsageNumber:14};s.loadCertificate.mockResolvedValue(e);const[t]=await a.load({deviceModelId:o.NANO_X,transactionCheck:{from:"signer",transactionBytes:new Uint8Array([1,0,3,170]),chain:i.MAINNET}});expect(t).toEqual({type:n.SOLANA_TRANSACTION_CHECK,payload:{descriptor:"deadbeef"},certificate:e})}),it("returns an ERROR context when the data source returns Left",async()=>{const e=new Error("network fail");r.check.mockResolvedValue(A(e));const[t]=await a.load({deviceModelId:o.NANO_X,transactionCheck:{from:"signer",transactionBytes:new Uint8Array([1,0,3,170]),chain:i.MAINNET}});expect(t).toEqual({type:n.ERROR,error:e}),expect(s.loadCertificate).not.toHaveBeenCalled()}),it("returns an ERROR context when numRequiredSignatures exceeds the 64-signature limit",async()=>{const e=new Uint8Array([65,0,3,170]),[t]=await a.load({deviceModelId:o.NANO_X,transactionCheck:{from:"signer",transactionBytes:e,chain:i.MAINNET}});expect(t).toMatchObject({type:n.ERROR,error:expect.objectContaining({message:expect.stringContaining("exceeds SOLANA_MAX_SIGNATURES")})}),expect(r.check).not.toHaveBeenCalled()})})});
1
+ import{DeviceModelId as c}from"@ledgerhq/device-management-kit";import d from"bs58";import{Left as l,Right as s}from"purify-ts";import{TransactionCheckPaths as A}from"../../../../modules/multichain/transaction-check/utils/constants";import{SolanaTransactionScanChainId as r}from"../../../../modules/solana/model/SolanaTransactionScanChainId";import{ClearSignContextType as n}from"../../../../shared/model/ClearSignContext";import{SolanaTransactionCheckLoader as f}from"./SolanaTransactionCheckLoader";const p={debug:vi.fn(),info:vi.fn(),warn:vi.fn(),error:vi.fn(),subscribers:[]},C=()=>p,i={loadCertificate:vi.fn()};let o,a;beforeEach(()=>{vi.resetAllMocks(),o={check:vi.fn()},a=new f(o,i,C)});describe("SolanaTransactionCheckLoader",()=>{describe("canHandle",()=>{const e={deviceModelId:c.NANO_X,transactionCheck:{from:"signer",transactionBytes:new Uint8Array([1,0,3,222]),chain:1}};it("returns true for a valid Solana transaction-check input",()=>{expect(a.canHandle(e,[n.SOLANA_TRANSACTION_CHECK])).toBe(!0)}),it("returns false when expected types do not include SOLANA_TRANSACTION_CHECK",()=>{expect(a.canHandle(e,[n.SOLANA_TOKEN])).toBe(!1)}),it("returns false when transactionBytes is not a Uint8Array",()=>{expect(a.canHandle({...e,transactionCheck:{...e.transactionCheck,transactionBytes:"0xdead"}},[n.SOLANA_TRANSACTION_CHECK])).toBe(!1)}),it("returns false when transactionBytes is empty",()=>{expect(a.canHandle({...e,transactionCheck:{...e.transactionCheck,transactionBytes:new Uint8Array}},[n.SOLANA_TRANSACTION_CHECK])).toBe(!1)}),it("returns false when from is empty",()=>{expect(a.canHandle({...e,transactionCheck:{...e.transactionCheck,from:""}},[n.SOLANA_TRANSACTION_CHECK])).toBe(!1)}),it("returns false for unsupported device models (NANO_S)",()=>{expect(a.canHandle({...e,deviceModelId:c.NANO_S},[n.SOLANA_TRANSACTION_CHECK])).toBe(!1)})}),describe("load \u2014 wire format",()=>{beforeEach(()=>{o.check.mockResolvedValue(s({publicKeyId:"pk",descriptor:"aabb"})),i.loadCertificate.mockResolvedValue({payload:new Uint8Array([204]),keyUsageNumber:14})}),it("bs58-encodes transactionBytes and passes it to the data source",async()=>{const e=new Uint8Array([170,187,204,221]);await a.load({deviceModelId:c.NANO_X,transactionCheck:{from:"signer",transactionBytes:e,chain:r.MAINNET}});const t=o.check.mock.calls[0][0];expect(t.path).toBe(A.SOLANA_TRANSACTION),expect(t.body.tx.from).toBe("signer"),expect(t.body.chain).toBe(r.MAINNET),expect(t.body.tx.raw).toBe(d.encode(e))})}),describe("load \u2014 result mapping",()=>{it("returns a SOLANA_TRANSACTION_CHECK context with descriptor and certificate on success",async()=>{o.check.mockResolvedValue(s({publicKeyId:"pk-1",descriptor:"deadbeef"}));const e={payload:new Uint8Array([153]),keyUsageNumber:14};i.loadCertificate.mockResolvedValue(e);const[t]=await a.load({deviceModelId:c.NANO_X,transactionCheck:{from:"signer",transactionBytes:new Uint8Array([1,0,3,170]),chain:r.MAINNET}});expect(t).toEqual({type:n.SOLANA_TRANSACTION_CHECK,payload:{descriptor:"deadbeef"},certificate:e})}),it("returns an ERROR context when the data source returns Left",async()=>{const e=new Error("network fail");o.check.mockResolvedValue(l(e));const[t]=await a.load({deviceModelId:c.NANO_X,transactionCheck:{from:"signer",transactionBytes:new Uint8Array([1,0,3,170]),chain:r.MAINNET}});expect(t).toEqual({type:n.ERROR,error:e}),expect(i.loadCertificate).not.toHaveBeenCalled()})})});
2
2
  //# sourceMappingURL=SolanaTransactionCheckLoader.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.test.ts"],
4
- "sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport bs58 from \"bs58\";\nimport { Left, Right } from \"purify-ts\";\n\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport { type TransactionCheckDataSource } from \"@/modules/multichain/transaction-check/data/TransactionCheckDataSource\";\nimport { TransactionCheckPaths } from \"@/modules/multichain/transaction-check/utils/constants\";\nimport { SolanaTransactionScanChainId } from \"@/modules/solana/model/SolanaTransactionScanChainId\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\n\nimport { SolanaTransactionCheckLoader } from \"./SolanaTransactionCheckLoader\";\n\nconst loggerMock = {\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n};\nconst loggerFactory = () => loggerMock;\n\nconst certificateLoaderMock: PkiCertificateLoader = {\n loadCertificate: vi.fn(),\n};\n\nlet dataSourceMock: { check: ReturnType<typeof vi.fn> };\nlet loader: SolanaTransactionCheckLoader;\n\nbeforeEach(() => {\n vi.resetAllMocks();\n dataSourceMock = { check: vi.fn() };\n loader = new SolanaTransactionCheckLoader(\n dataSourceMock as unknown as TransactionCheckDataSource,\n certificateLoaderMock,\n loggerFactory,\n );\n});\n\ndescribe(\"SolanaTransactionCheckLoader\", () => {\n describe(\"canHandle\", () => {\n const validInput = {\n deviceModelId: DeviceModelId.NANO_X,\n transactionCheck: {\n from: \"signer\",\n transactionBytes: new Uint8Array([1, 0, 3, 0xde]),\n chain: 1,\n },\n };\n\n it(\"returns true for a valid Solana transaction-check input\", () => {\n expect(\n loader.canHandle(validInput, [\n ClearSignContextType.SOLANA_TRANSACTION_CHECK,\n ]),\n ).toBe(true);\n });\n\n it(\"returns false when expected types do not include SOLANA_TRANSACTION_CHECK\", () => {\n expect(\n loader.canHandle(validInput, [ClearSignContextType.SOLANA_TOKEN]),\n ).toBe(false);\n });\n\n it(\"returns false when transactionBytes is not a Uint8Array\", () => {\n expect(\n loader.canHandle(\n {\n ...validInput,\n transactionCheck: {\n ...validInput.transactionCheck,\n transactionBytes: \"0xdead\" as unknown as Uint8Array,\n },\n },\n [ClearSignContextType.SOLANA_TRANSACTION_CHECK],\n ),\n ).toBe(false);\n });\n\n it(\"returns false when transactionBytes is empty\", () => {\n expect(\n loader.canHandle(\n {\n ...validInput,\n transactionCheck: {\n ...validInput.transactionCheck,\n transactionBytes: new Uint8Array(),\n },\n },\n [ClearSignContextType.SOLANA_TRANSACTION_CHECK],\n ),\n ).toBe(false);\n });\n\n it(\"returns false when from is empty\", () => {\n expect(\n loader.canHandle(\n {\n ...validInput,\n transactionCheck: { ...validInput.transactionCheck, from: \"\" },\n },\n [ClearSignContextType.SOLANA_TRANSACTION_CHECK],\n ),\n ).toBe(false);\n });\n\n it(\"returns false for unsupported device models (NANO_S)\", () => {\n expect(\n loader.canHandle(\n { ...validInput, deviceModelId: DeviceModelId.NANO_S },\n [ClearSignContextType.SOLANA_TRANSACTION_CHECK],\n ),\n ).toBe(false);\n });\n });\n\n describe(\"load \u2014 wire format\", () => {\n beforeEach(() => {\n dataSourceMock.check.mockResolvedValue(\n Right({ publicKeyId: \"pk\", descriptor: \"aabb\" }),\n );\n (certificateLoaderMock.loadCertificate as any).mockResolvedValue({\n payload: new Uint8Array([0xcc]),\n keyUsageNumber: 14,\n });\n });\n\n it(\"wraps a legacy message with zero-filled signature placeholders before bs58-encoding\", async () => {\n // message[0] = 2 \u2192 numRequiredSignatures = 2 (legacy, high bit clear)\n const message = new Uint8Array([2, 0, 3, 0xaa, 0xbb, 0xcc]);\n // expected: compact-u16(2) + 2*64 zero bytes + message\n const expected = new Uint8Array(1 + 2 * 64 + message.length);\n expected[0] = 2; // compact-u16 encoding of 2\n expected.set(message, 1 + 2 * 64);\n\n await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n transactionCheck: {\n from: \"signer\",\n transactionBytes: message,\n chain: SolanaTransactionScanChainId.MAINNET,\n },\n });\n\n const sent = dataSourceMock.check.mock.calls[0]![0];\n\n expect(sent.path).toBe(TransactionCheckPaths.SOLANA_TRANSACTION);\n expect(sent.body.tx.from).toBe(\"signer\");\n expect(sent.body.chain).toBe(SolanaTransactionScanChainId.MAINNET);\n expect(Array.from(bs58.decode(sent.body.tx.raw))).toEqual(\n Array.from(expected),\n );\n expect(sent.body.tx.raw).toBe(bs58.encode(expected));\n });\n\n it(\"wraps a versioned (v0) message with signature placeholders\", async () => {\n // message[0] = 0x80 \u2192 versioned prefix; message[1] = 1 \u2192 numRequiredSignatures = 1\n const message = new Uint8Array([0x80, 1, 0, 3, 0xde, 0xad]);\n // expected: compact-u16(1) + 1*64 zero bytes + message\n const expected = new Uint8Array(1 + 1 * 64 + message.length);\n expected[0] = 1; // compact-u16 encoding of 1\n expected.set(message, 1 + 1 * 64);\n\n await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n transactionCheck: {\n from: \"signer\",\n transactionBytes: message,\n chain: SolanaTransactionScanChainId.MAINNET,\n },\n });\n\n const raw = dataSourceMock.check.mock.calls[0]![0].body.tx.raw;\n\n expect(Array.from(bs58.decode(raw))).toEqual(Array.from(expected));\n });\n });\n\n describe(\"load \u2014 result mapping\", () => {\n it(\"returns a SOLANA_TRANSACTION_CHECK context with descriptor and certificate on success\", async () => {\n dataSourceMock.check.mockResolvedValue(\n Right({ publicKeyId: \"pk-1\", descriptor: \"deadbeef\" }),\n );\n const cert = { payload: new Uint8Array([0x99]), keyUsageNumber: 14 };\n (certificateLoaderMock.loadCertificate as any).mockResolvedValue(cert);\n\n const [ctx] = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n transactionCheck: {\n from: \"signer\",\n transactionBytes: new Uint8Array([1, 0, 3, 0xaa]),\n chain: SolanaTransactionScanChainId.MAINNET,\n },\n });\n\n expect(ctx).toEqual({\n type: ClearSignContextType.SOLANA_TRANSACTION_CHECK,\n payload: { descriptor: \"deadbeef\" },\n certificate: cert,\n });\n });\n\n it(\"returns an ERROR context when the data source returns Left\", async () => {\n const error = new Error(\"network fail\");\n dataSourceMock.check.mockResolvedValue(Left(error));\n\n const [ctx] = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n transactionCheck: {\n from: \"signer\",\n transactionBytes: new Uint8Array([1, 0, 3, 0xaa]),\n chain: SolanaTransactionScanChainId.MAINNET,\n },\n });\n\n expect(ctx).toEqual({ type: ClearSignContextType.ERROR, error });\n expect(certificateLoaderMock.loadCertificate).not.toHaveBeenCalled();\n });\n\n it(\"returns an ERROR context when numRequiredSignatures exceeds the 64-signature limit\", async () => {\n // message[0] = 65 \u2192 numRequiredSignatures = 65 (legacy, high bit clear), which exceeds SOLANA_MAX_SIGNATURES\n const message = new Uint8Array([65, 0, 3, 0xaa]);\n\n const [ctx] = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n transactionCheck: {\n from: \"signer\",\n transactionBytes: message,\n chain: SolanaTransactionScanChainId.MAINNET,\n },\n });\n\n expect(ctx).toMatchObject({\n type: ClearSignContextType.ERROR,\n error: expect.objectContaining({\n message: expect.stringContaining(\"exceeds SOLANA_MAX_SIGNATURES\"),\n }),\n });\n expect(dataSourceMock.check).not.toHaveBeenCalled();\n });\n });\n});\n"],
5
- "mappings": "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",
6
- "names": ["DeviceModelId", "bs58", "Left", "Right", "TransactionCheckPaths", "SolanaTransactionScanChainId", "ClearSignContextType", "SolanaTransactionCheckLoader", "loggerMock", "loggerFactory", "certificateLoaderMock", "dataSourceMock", "loader", "validInput", "message", "expected", "sent", "raw", "cert", "ctx", "error"]
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n\nimport { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport bs58 from \"bs58\";\nimport { Left, Right } from \"purify-ts\";\n\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport { type TransactionCheckDataSource } from \"@/modules/multichain/transaction-check/data/TransactionCheckDataSource\";\nimport { TransactionCheckPaths } from \"@/modules/multichain/transaction-check/utils/constants\";\nimport { SolanaTransactionScanChainId } from \"@/modules/solana/model/SolanaTransactionScanChainId\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\n\nimport { SolanaTransactionCheckLoader } from \"./SolanaTransactionCheckLoader\";\n\nconst loggerMock = {\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n};\nconst loggerFactory = () => loggerMock;\n\nconst certificateLoaderMock: PkiCertificateLoader = {\n loadCertificate: vi.fn(),\n};\n\nlet dataSourceMock: { check: ReturnType<typeof vi.fn> };\nlet loader: SolanaTransactionCheckLoader;\n\nbeforeEach(() => {\n vi.resetAllMocks();\n dataSourceMock = { check: vi.fn() };\n loader = new SolanaTransactionCheckLoader(\n dataSourceMock as unknown as TransactionCheckDataSource,\n certificateLoaderMock,\n loggerFactory,\n );\n});\n\ndescribe(\"SolanaTransactionCheckLoader\", () => {\n describe(\"canHandle\", () => {\n const validInput = {\n deviceModelId: DeviceModelId.NANO_X,\n transactionCheck: {\n from: \"signer\",\n transactionBytes: new Uint8Array([1, 0, 3, 0xde]),\n chain: 1,\n },\n };\n\n it(\"returns true for a valid Solana transaction-check input\", () => {\n expect(\n loader.canHandle(validInput, [\n ClearSignContextType.SOLANA_TRANSACTION_CHECK,\n ]),\n ).toBe(true);\n });\n\n it(\"returns false when expected types do not include SOLANA_TRANSACTION_CHECK\", () => {\n expect(\n loader.canHandle(validInput, [ClearSignContextType.SOLANA_TOKEN]),\n ).toBe(false);\n });\n\n it(\"returns false when transactionBytes is not a Uint8Array\", () => {\n expect(\n loader.canHandle(\n {\n ...validInput,\n transactionCheck: {\n ...validInput.transactionCheck,\n transactionBytes: \"0xdead\" as unknown as Uint8Array,\n },\n },\n [ClearSignContextType.SOLANA_TRANSACTION_CHECK],\n ),\n ).toBe(false);\n });\n\n it(\"returns false when transactionBytes is empty\", () => {\n expect(\n loader.canHandle(\n {\n ...validInput,\n transactionCheck: {\n ...validInput.transactionCheck,\n transactionBytes: new Uint8Array(),\n },\n },\n [ClearSignContextType.SOLANA_TRANSACTION_CHECK],\n ),\n ).toBe(false);\n });\n\n it(\"returns false when from is empty\", () => {\n expect(\n loader.canHandle(\n {\n ...validInput,\n transactionCheck: { ...validInput.transactionCheck, from: \"\" },\n },\n [ClearSignContextType.SOLANA_TRANSACTION_CHECK],\n ),\n ).toBe(false);\n });\n\n it(\"returns false for unsupported device models (NANO_S)\", () => {\n expect(\n loader.canHandle(\n { ...validInput, deviceModelId: DeviceModelId.NANO_S },\n [ClearSignContextType.SOLANA_TRANSACTION_CHECK],\n ),\n ).toBe(false);\n });\n });\n\n describe(\"load \u2014 wire format\", () => {\n beforeEach(() => {\n dataSourceMock.check.mockResolvedValue(\n Right({ publicKeyId: \"pk\", descriptor: \"aabb\" }),\n );\n (certificateLoaderMock.loadCertificate as any).mockResolvedValue({\n payload: new Uint8Array([0xcc]),\n keyUsageNumber: 14,\n });\n });\n\n it(\"bs58-encodes transactionBytes and passes it to the data source\", async () => {\n const transactionBytes = new Uint8Array([0xaa, 0xbb, 0xcc, 0xdd]);\n\n await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n transactionCheck: {\n from: \"signer\",\n transactionBytes,\n chain: SolanaTransactionScanChainId.MAINNET,\n },\n });\n\n const sent = dataSourceMock.check.mock.calls[0]![0];\n expect(sent.path).toBe(TransactionCheckPaths.SOLANA_TRANSACTION);\n expect(sent.body.tx.from).toBe(\"signer\");\n expect(sent.body.chain).toBe(SolanaTransactionScanChainId.MAINNET);\n expect(sent.body.tx.raw).toBe(bs58.encode(transactionBytes));\n });\n });\n\n describe(\"load \u2014 result mapping\", () => {\n it(\"returns a SOLANA_TRANSACTION_CHECK context with descriptor and certificate on success\", async () => {\n dataSourceMock.check.mockResolvedValue(\n Right({ publicKeyId: \"pk-1\", descriptor: \"deadbeef\" }),\n );\n const cert = { payload: new Uint8Array([0x99]), keyUsageNumber: 14 };\n (certificateLoaderMock.loadCertificate as any).mockResolvedValue(cert);\n\n const [ctx] = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n transactionCheck: {\n from: \"signer\",\n transactionBytes: new Uint8Array([1, 0, 3, 0xaa]),\n chain: SolanaTransactionScanChainId.MAINNET,\n },\n });\n\n expect(ctx).toEqual({\n type: ClearSignContextType.SOLANA_TRANSACTION_CHECK,\n payload: { descriptor: \"deadbeef\" },\n certificate: cert,\n });\n });\n\n it(\"returns an ERROR context when the data source returns Left\", async () => {\n const error = new Error(\"network fail\");\n dataSourceMock.check.mockResolvedValue(Left(error));\n\n const [ctx] = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n transactionCheck: {\n from: \"signer\",\n transactionBytes: new Uint8Array([1, 0, 3, 0xaa]),\n chain: SolanaTransactionScanChainId.MAINNET,\n },\n });\n\n expect(ctx).toEqual({ type: ClearSignContextType.ERROR, error });\n expect(certificateLoaderMock.loadCertificate).not.toHaveBeenCalled();\n });\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["DeviceModelId", "bs58", "Left", "Right", "TransactionCheckPaths", "SolanaTransactionScanChainId", "ClearSignContextType", "SolanaTransactionCheckLoader", "loggerMock", "loggerFactory", "certificateLoaderMock", "dataSourceMock", "loader", "validInput", "transactionBytes", "sent", "cert", "ctx", "error"]
7
7
  }
@@ -1,2 +1,2 @@
1
- var g=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var c=(n,o,e,i)=>{for(var r=i>1?void 0:i?d(o,e):o,s=n.length-1,t;s>=0;s--)(t=n[s])&&(r=(i?t(o,e,r):t(r))||r);return i&&r&&g(o,e,r),r},p=(n,o)=>(e,i)=>o(e,i,n);import{inject as m,injectable as R}from"inversify";import{Left as a,Right as y}from"purify-ts";import{configTypes as D}from"../../../../config/di/configTypes";import{networkTypes as h}from"../../../../shared/network/di/networkTypes";import{HexStringUtils as C}from"../../../../shared/utils/HexStringUtils";import{signedDescriptorDtoCodec as A}from"../../../../shared/utils/signedDescriptorDto";import{u8Codec as k}from"../../../../shared/utils/uIntCodec";let u=class{constructor(o,e){this.config=o;this.http=e}async getAltResolution({altAddress:o,entryIndex:e,challenge:i}){const r=k.decode(e);if(r.isLeft())return a(new Error(`[ContextModule] HttpAltResolutionDataSource: invalid entryIndex (got ${e}): ${r.leftOrDefault("")}`));let s;try{s=await this.http.get(`${this.config.metadataServiceDomain.url}/v2/solana/alt-resolution/${o}/${e}`,{params:{challenge:i}})}catch(t){const l=t instanceof Error?t.message:String(t);return a(new Error(`[ContextModule] HttpAltResolutionDataSource: Failed to fetch ALT resolution: ${l}`))}return A.decode(s).caseOf({Left:t=>a(new Error(`[ContextModule] HttpAltResolutionDataSource: malformed response for (${o}, ${e}): ${t}`)),Right:t=>{let l;try{l=C.hexToBytes(t.signedDescriptor)}catch(f){return a(new Error(`[ContextModule] HttpAltResolutionDataSource: invalid hex in signedDescriptor for (${o}, ${e}): ${f.message}`))}return y({altAddress:o,entryIndex:e,descriptor:l,keyId:t.keyId,keyUsage:t.keyUsage})}})}};u=c([R(),p(0,m(D.Config)),p(1,m(h.NetworkClient))],u);export{u as HttpAltResolutionDataSource};
1
+ var f=Object.defineProperty;var g=Object.getOwnPropertyDescriptor;var c=(n,o,e,i)=>{for(var r=i>1?void 0:i?g(o,e):o,s=n.length-1,t;s>=0;s--)(t=n[s])&&(r=(i?t(o,e,r):t(r))||r);return i&&r&&f(o,e,r),r},p=(n,o)=>(e,i)=>o(e,i,n);import{inject as m,injectable as R}from"inversify";import{Left as a,Right as y}from"purify-ts";import{configTypes as A}from"../../../../config/di/configTypes";import{networkTypes as D}from"../../../../shared/network/di/networkTypes";import{HexStringUtils as h}from"../../../../shared/utils/HexStringUtils";import{signedDescriptorDtoCodec as C}from"../../../../shared/utils/signedDescriptorDto";import{u8Codec as k}from"../../../../shared/utils/uIntCodec";let u=class{constructor(o,e){this.config=o;this.http=e}async getAltResolution({altAddress:o,entryIndex:e,challenge:i}){const r=k.decode(e);if(r.isLeft())return a(new Error(`[ContextModule] HttpAltResolutionDataSource: invalid entryIndex (got ${e}): ${r.leftOrDefault("")}`));let s;try{s=await this.http.get(`${this.config.metadataServiceDomain.url}/v2/solana/alt-resolution/${o}/${e}`,{params:{challenge:i}})}catch(t){const l=t instanceof Error?t.message:String(t);return a(new Error(`[ContextModule] HttpAltResolutionDataSource: Failed to fetch ALT resolution: ${l}`))}return C.decode(s).caseOf({Left:t=>a(new Error(`[ContextModule] HttpAltResolutionDataSource: malformed response for (${o}, ${e}): ${t}`)),Right:t=>{let l;try{l=h.hexToBytes(t.signedDescriptor)}catch(d){return a(new Error(`[ContextModule] HttpAltResolutionDataSource: invalid hex in signedDescriptor for (${o}, ${e}): ${d.message}`))}return y({altAddress:o,entryIndex:e,descriptor:l,resolvedAddress:s.resolvedAddress,keyId:t.keyId,keyUsage:t.keyUsage})}})}};u=c([R(),p(0,m(A.Config)),p(1,m(D.NetworkClient))],u);export{u as HttpAltResolutionDataSource};
2
2
  //# sourceMappingURL=HttpAltResolutionDataSource.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.ts"],
4
- "sourcesContent": ["import { DmkNetworkClient } from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { Either, Left, Right } from \"purify-ts\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { type ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\nimport { networkTypes } from \"@/shared/network/di/networkTypes\";\nimport { HexStringUtils } from \"@/shared/utils/HexStringUtils\";\nimport { signedDescriptorDtoCodec } from \"@/shared/utils/signedDescriptorDto\";\nimport { u8Codec } from \"@/shared/utils/uIntCodec\";\n\nimport {\n type AltResolutionDataSource,\n type AltResolutionResult,\n type GetAltResolutionParams,\n} from \"./AltResolutionDataSource\";\n\ntype AltResolutionResponseDto = {\n descriptorType?: string;\n descriptorVersion?: number;\n altAddress?: string;\n entryIndex?: number;\n resolvedAddress?: string;\n signedDescriptor: string;\n keyId: string;\n keyUsage: string;\n};\n\n@injectable()\nexport class HttpAltResolutionDataSource implements AltResolutionDataSource {\n constructor(\n @inject(configTypes.Config)\n private readonly config: ContextModuleServiceConfig,\n @inject(networkTypes.NetworkClient)\n private readonly http: DmkNetworkClient,\n ) {}\n\n public async getAltResolution({\n altAddress,\n entryIndex,\n challenge,\n }: GetAltResolutionParams): Promise<Either<Error, AltResolutionResult>> {\n const entryIndexResult = u8Codec.decode(entryIndex);\n if (entryIndexResult.isLeft()) {\n return Left(\n new Error(\n `[ContextModule] HttpAltResolutionDataSource: invalid entryIndex (got ${entryIndex}): ${entryIndexResult.leftOrDefault(\"\")}`,\n ),\n );\n }\n\n let dto: AltResolutionResponseDto;\n try {\n dto = (await this.http.get(\n `${this.config.metadataServiceDomain.url}/v2/solana/alt-resolution/${altAddress}/${entryIndex}`,\n { params: { challenge } },\n )) as AltResolutionResponseDto;\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n return Left(\n new Error(\n `[ContextModule] HttpAltResolutionDataSource: Failed to fetch ALT resolution: ${reason}`,\n ),\n );\n }\n\n return signedDescriptorDtoCodec\n .decode(dto)\n .caseOf<Either<Error, AltResolutionResult>>({\n Left: (error) =>\n Left(\n new Error(\n `[ContextModule] HttpAltResolutionDataSource: malformed response for (${altAddress}, ${entryIndex}): ${error}`,\n ),\n ),\n Right: (validated) => {\n let descriptor: Uint8Array;\n try {\n descriptor = HexStringUtils.hexToBytes(validated.signedDescriptor);\n } catch (error) {\n return Left(\n new Error(\n `[ContextModule] HttpAltResolutionDataSource: invalid hex in signedDescriptor for (${altAddress}, ${entryIndex}): ${(error as Error).message}`,\n ),\n );\n }\n\n return Right({\n altAddress,\n entryIndex,\n descriptor,\n keyId: validated.keyId,\n keyUsage: validated.keyUsage,\n });\n },\n });\n }\n}\n"],
5
- "mappings": "iOACA,OAAS,UAAAA,EAAQ,cAAAC,MAAkB,YACnC,OAAiB,QAAAC,EAAM,SAAAC,MAAa,YAEpC,OAAS,eAAAC,MAAmB,0BAE5B,OAAS,gBAAAC,MAAoB,mCAC7B,OAAS,kBAAAC,MAAsB,gCAC/B,OAAS,4BAAAC,MAAgC,qCACzC,OAAS,WAAAC,MAAe,2BAoBjB,IAAMC,EAAN,KAAqE,CAC1E,YAEmBC,EAEAC,EACjB,CAHiB,YAAAD,EAEA,UAAAC,CAChB,CAEH,MAAa,iBAAiB,CAC5B,WAAAC,EACA,WAAAC,EACA,UAAAC,CACF,EAAwE,CACtE,MAAMC,EAAmBC,EAAQ,OAAOH,CAAU,EAClD,GAAIE,EAAiB,OAAO,EAC1B,OAAOE,EACL,IAAI,MACF,wEAAwEJ,CAAU,MAAME,EAAiB,cAAc,EAAE,CAAC,EAC5H,CACF,EAGF,IAAIG,EACJ,GAAI,CACFA,EAAO,MAAM,KAAK,KAAK,IACrB,GAAG,KAAK,OAAO,sBAAsB,GAAG,6BAA6BN,CAAU,IAAIC,CAAU,GAC7F,CAAE,OAAQ,CAAE,UAAAC,CAAU,CAAE,CAC1B,CACF,OAASK,EAAO,CACd,MAAMC,EAASD,aAAiB,MAAQA,EAAM,QAAU,OAAOA,CAAK,EACpE,OAAOF,EACL,IAAI,MACF,gFAAgFG,CAAM,EACxF,CACF,CACF,CAEA,OAAOC,EACJ,OAAOH,CAAG,EACV,OAA2C,CAC1C,KAAOC,GACLF,EACE,IAAI,MACF,wEAAwEL,CAAU,KAAKC,CAAU,MAAMM,CAAK,EAC9G,CACF,EACF,MAAQG,GAAc,CACpB,IAAIC,EACJ,GAAI,CACFA,EAAaC,EAAe,WAAWF,EAAU,gBAAgB,CACnE,OAASH,EAAO,CACd,OAAOF,EACL,IAAI,MACF,qFAAqFL,CAAU,KAAKC,CAAU,MAAOM,EAAgB,OAAO,EAC9I,CACF,CACF,CAEA,OAAOM,EAAM,CACX,WAAAb,EACA,WAAAC,EACA,WAAAU,EACA,MAAOD,EAAU,MACjB,SAAUA,EAAU,QACtB,CAAC,CACH,CACF,CAAC,CACL,CACF,EApEab,EAANiB,EAAA,CADNC,EAAW,EAGPC,EAAA,EAAAC,EAAOC,EAAY,MAAM,GAEzBF,EAAA,EAAAC,EAAOE,EAAa,aAAa,IAJzBtB",
4
+ "sourcesContent": ["import { DmkNetworkClient } from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { Either, Left, Right } from \"purify-ts\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { type ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\nimport { networkTypes } from \"@/shared/network/di/networkTypes\";\nimport { HexStringUtils } from \"@/shared/utils/HexStringUtils\";\nimport { signedDescriptorDtoCodec } from \"@/shared/utils/signedDescriptorDto\";\nimport { u8Codec } from \"@/shared/utils/uIntCodec\";\n\nimport {\n type AltResolutionDataSource,\n type AltResolutionResult,\n type GetAltResolutionParams,\n} from \"./AltResolutionDataSource\";\n\ntype AltResolutionResponseDto = {\n descriptorType?: string;\n descriptorVersion?: number;\n altAddress?: string;\n entryIndex?: number;\n resolvedAddress?: string;\n signedDescriptor: string;\n keyId: string;\n keyUsage: string;\n};\n\n@injectable()\nexport class HttpAltResolutionDataSource implements AltResolutionDataSource {\n constructor(\n @inject(configTypes.Config)\n private readonly config: ContextModuleServiceConfig,\n @inject(networkTypes.NetworkClient)\n private readonly http: DmkNetworkClient,\n ) {}\n\n public async getAltResolution({\n altAddress,\n entryIndex,\n challenge,\n }: GetAltResolutionParams): Promise<Either<Error, AltResolutionResult>> {\n const entryIndexResult = u8Codec.decode(entryIndex);\n if (entryIndexResult.isLeft()) {\n return Left(\n new Error(\n `[ContextModule] HttpAltResolutionDataSource: invalid entryIndex (got ${entryIndex}): ${entryIndexResult.leftOrDefault(\"\")}`,\n ),\n );\n }\n\n let dto: AltResolutionResponseDto;\n try {\n dto = (await this.http.get(\n `${this.config.metadataServiceDomain.url}/v2/solana/alt-resolution/${altAddress}/${entryIndex}`,\n { params: { challenge } },\n )) as AltResolutionResponseDto;\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n return Left(\n new Error(\n `[ContextModule] HttpAltResolutionDataSource: Failed to fetch ALT resolution: ${reason}`,\n ),\n );\n }\n\n return signedDescriptorDtoCodec\n .decode(dto)\n .caseOf<Either<Error, AltResolutionResult>>({\n Left: (error) =>\n Left(\n new Error(\n `[ContextModule] HttpAltResolutionDataSource: malformed response for (${altAddress}, ${entryIndex}): ${error}`,\n ),\n ),\n Right: (validated) => {\n let descriptor: Uint8Array;\n try {\n descriptor = HexStringUtils.hexToBytes(validated.signedDescriptor);\n } catch (error) {\n return Left(\n new Error(\n `[ContextModule] HttpAltResolutionDataSource: invalid hex in signedDescriptor for (${altAddress}, ${entryIndex}): ${(error as Error).message}`,\n ),\n );\n }\n\n return Right({\n altAddress,\n entryIndex,\n descriptor,\n resolvedAddress: dto.resolvedAddress,\n keyId: validated.keyId,\n keyUsage: validated.keyUsage,\n });\n },\n });\n }\n}\n"],
5
+ "mappings": "iOACA,OAAS,UAAAA,EAAQ,cAAAC,MAAkB,YACnC,OAAiB,QAAAC,EAAM,SAAAC,MAAa,YAEpC,OAAS,eAAAC,MAAmB,0BAE5B,OAAS,gBAAAC,MAAoB,mCAC7B,OAAS,kBAAAC,MAAsB,gCAC/B,OAAS,4BAAAC,MAAgC,qCACzC,OAAS,WAAAC,MAAe,2BAoBjB,IAAMC,EAAN,KAAqE,CAC1E,YAEmBC,EAEAC,EACjB,CAHiB,YAAAD,EAEA,UAAAC,CAChB,CAEH,MAAa,iBAAiB,CAC5B,WAAAC,EACA,WAAAC,EACA,UAAAC,CACF,EAAwE,CACtE,MAAMC,EAAmBC,EAAQ,OAAOH,CAAU,EAClD,GAAIE,EAAiB,OAAO,EAC1B,OAAOE,EACL,IAAI,MACF,wEAAwEJ,CAAU,MAAME,EAAiB,cAAc,EAAE,CAAC,EAC5H,CACF,EAGF,IAAIG,EACJ,GAAI,CACFA,EAAO,MAAM,KAAK,KAAK,IACrB,GAAG,KAAK,OAAO,sBAAsB,GAAG,6BAA6BN,CAAU,IAAIC,CAAU,GAC7F,CAAE,OAAQ,CAAE,UAAAC,CAAU,CAAE,CAC1B,CACF,OAASK,EAAO,CACd,MAAMC,EAASD,aAAiB,MAAQA,EAAM,QAAU,OAAOA,CAAK,EACpE,OAAOF,EACL,IAAI,MACF,gFAAgFG,CAAM,EACxF,CACF,CACF,CAEA,OAAOC,EACJ,OAAOH,CAAG,EACV,OAA2C,CAC1C,KAAOC,GACLF,EACE,IAAI,MACF,wEAAwEL,CAAU,KAAKC,CAAU,MAAMM,CAAK,EAC9G,CACF,EACF,MAAQG,GAAc,CACpB,IAAIC,EACJ,GAAI,CACFA,EAAaC,EAAe,WAAWF,EAAU,gBAAgB,CACnE,OAASH,EAAO,CACd,OAAOF,EACL,IAAI,MACF,qFAAqFL,CAAU,KAAKC,CAAU,MAAOM,EAAgB,OAAO,EAC9I,CACF,CACF,CAEA,OAAOM,EAAM,CACX,WAAAb,EACA,WAAAC,EACA,WAAAU,EACA,gBAAiBL,EAAI,gBACrB,MAAOI,EAAU,MACjB,SAAUA,EAAU,QACtB,CAAC,CACH,CACF,CAAC,CACL,CACF,EArEab,EAANiB,EAAA,CADNC,EAAW,EAGPC,EAAA,EAAAC,EAAOC,EAAY,MAAM,GAEzBF,EAAA,EAAAC,EAAOE,EAAa,aAAa,IAJzBtB",
6
6
  "names": ["inject", "injectable", "Left", "Right", "configTypes", "networkTypes", "HexStringUtils", "signedDescriptorDtoCodec", "u8Codec", "HttpAltResolutionDataSource", "config", "http", "altAddress", "entryIndex", "challenge", "entryIndexResult", "u8Codec", "Left", "dto", "error", "reason", "signedDescriptorDtoCodec", "validated", "descriptor", "HexStringUtils", "Right", "__decorateClass", "injectable", "__decorateParam", "inject", "configTypes", "networkTypes"]
7
7
  }
@@ -1,2 +1,2 @@
1
- var m=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var c=(l,o,e,t)=>{for(var r=t>1?void 0:t?y(o,e):o,a=l.length-1,s;a>=0;a--)(s=l[a])&&(r=(t?s(o,e,r):s(r))||r);return t&&r&&m(o,e,r),r},n=(l,o)=>(e,t)=>o(e,t,l);import{inject as d,injectable as f}from"inversify";import{array as S,Codec as u,string as p}from"purify-ts";import{configTypes as C}from"../../../../config/di/configTypes";import{pkiTypes as A}from"../../../../modules/multichain/pki/di/pkiTypes";import{altResolutionTypes as R}from"../../../../modules/solana/alt-resolution/di/altResolutionTypes";import{ClearSignContextType as g}from"../../../../shared/model/ClearSignContext";import{loadChallengeBoundContexts as x}from"../../../../shared/utils/challengeBoundLoader";import{deviceModelIdCodec as I}from"../../../../shared/utils/deviceModelIdCodec";import{u8Codec as L}from"../../../../shared/utils/uIntCodec";const h=[g.SOLANA_ALT_RESOLUTION],v=u.interface({altAddress:p,entryIndex:L,challenge:p}),T=u.interface({deviceModelId:I,requests:S(v)});let i=class{constructor(o,e,t){this.dataSource=o;this.certificateLoader=e;this.logger=t("AltResolutionContextLoader")}logger;canHandle(o,e){return h.every(t=>e.includes(t))?T.decode(o).caseOf({Left:()=>!1,Right:({requests:t})=>t.length>0&&t.every(r=>r.altAddress.length>0&&r.challenge.length>0)}):!1}async load(o){return x({requests:o.requests,deviceModelId:o.deviceModelId,certificateLoader:this.certificateLoader,logger:this.logger,label:"ALT_RESOLUTION",fetch:e=>this.dataSource.getAltResolution(e),toContext:(e,t)=>{const r={descriptor:e.descriptor};return{type:g.SOLANA_ALT_RESOLUTION,payload:r,certificate:t}},describe:e=>({altAddress:e.altAddress,entryIndex:e.entryIndex})})}};i=c([f(),n(0,d(R.AltResolutionDataSource)),n(1,d(A.PkiCertificateLoader)),n(2,d(C.ContextModuleLoggerFactory))],i);export{i as AltResolutionContextLoader};
1
+ var m=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var c=(l,o,e,t)=>{for(var r=t>1?void 0:t?y(o,e):o,a=l.length-1,s;a>=0;a--)(s=l[a])&&(r=(t?s(o,e,r):s(r))||r);return t&&r&&m(o,e,r),r},n=(l,o)=>(e,t)=>o(e,t,l);import{inject as d,injectable as f}from"inversify";import{array as S,Codec as u,string as p}from"purify-ts";import{configTypes as C}from"../../../../config/di/configTypes";import{pkiTypes as A}from"../../../../modules/multichain/pki/di/pkiTypes";import{altResolutionTypes as R}from"../../../../modules/solana/alt-resolution/di/altResolutionTypes";import{ClearSignContextType as g}from"../../../../shared/model/ClearSignContext";import{loadChallengeBoundContexts as x}from"../../../../shared/utils/challengeBoundLoader";import{deviceModelIdCodec as I}from"../../../../shared/utils/deviceModelIdCodec";import{u8Codec as L}from"../../../../shared/utils/uIntCodec";const h=[g.SOLANA_ALT_RESOLUTION],v=u.interface({altAddress:p,entryIndex:L,challenge:p}),T=u.interface({deviceModelId:I,requests:S(v)});let i=class{constructor(o,e,t){this.dataSource=o;this.certificateLoader=e;this.logger=t("AltResolutionContextLoader")}logger;canHandle(o,e){return h.every(t=>e.includes(t))?T.decode(o).caseOf({Left:()=>!1,Right:({requests:t})=>t.length>0&&t.every(r=>r.altAddress.length>0&&r.challenge.length>0)}):!1}async load(o){return x({requests:o.requests,deviceModelId:o.deviceModelId,certificateLoader:this.certificateLoader,logger:this.logger,label:"ALT_RESOLUTION",fetch:e=>this.dataSource.getAltResolution(e),toContext:(e,t)=>{const r={descriptor:e.descriptor,resolvedAddress:e.resolvedAddress};return{type:g.SOLANA_ALT_RESOLUTION,payload:r,certificate:t}},describe:e=>({altAddress:e.altAddress,entryIndex:e.entryIndex})})}};i=c([f(),n(0,d(R.AltResolutionDataSource)),n(1,d(A.PkiCertificateLoader)),n(2,d(C.ContextModuleLoggerFactory))],i);export{i as AltResolutionContextLoader};
2
2
  //# sourceMappingURL=AltResolutionContextLoader.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.ts"],
4
- "sourcesContent": ["import {\n type DeviceModelId,\n type LoggerPublisherService,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { array, Codec, string } from \"purify-ts\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { pkiTypes } from \"@/modules/multichain/pki/di/pkiTypes\";\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport { type AltResolutionDataSource } from \"@/modules/solana/alt-resolution/data/AltResolutionDataSource\";\nimport { altResolutionTypes } from \"@/modules/solana/alt-resolution/di/altResolutionTypes\";\nimport { type SolanaAltResolutionPayload } from \"@/modules/solana/model/SolanaPayloads\";\nimport { type ContextLoader } from \"@/shared/domain/ContextLoader\";\nimport {\n type ClearSignContext,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\nimport { loadChallengeBoundContexts } from \"@/shared/utils/challengeBoundLoader\";\nimport { deviceModelIdCodec } from \"@/shared/utils/deviceModelIdCodec\";\nimport { u8Codec } from \"@/shared/utils/uIntCodec\";\n\nconst SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.SOLANA_ALT_RESOLUTION,\n];\n\nexport type SolanaAltResolutionRequest = {\n altAddress: string;\n entryIndex: number;\n challenge: string;\n};\n\nexport type SolanaAltResolutionContextInput = {\n deviceModelId: DeviceModelId;\n requests: SolanaAltResolutionRequest[];\n};\n\nconst altResolutionRequestCodec = Codec.interface({\n altAddress: string,\n entryIndex: u8Codec,\n challenge: string,\n});\n\nconst solanaAltResolutionInputCodec = Codec.interface({\n deviceModelId: deviceModelIdCodec,\n requests: array(altResolutionRequestCodec),\n});\n\n@injectable()\nexport class AltResolutionContextLoader\n implements ContextLoader<SolanaAltResolutionContextInput>\n{\n private readonly logger: LoggerPublisherService;\n\n constructor(\n @inject(altResolutionTypes.AltResolutionDataSource)\n private readonly dataSource: AltResolutionDataSource,\n @inject(pkiTypes.PkiCertificateLoader)\n private readonly certificateLoader: PkiCertificateLoader,\n @inject(configTypes.ContextModuleLoggerFactory)\n loggerFactory: (tag: string) => LoggerPublisherService,\n ) {\n this.logger = loggerFactory(\"AltResolutionContextLoader\");\n }\n\n public canHandle(\n input: unknown,\n expectedTypes: ClearSignContextType[],\n ): input is SolanaAltResolutionContextInput {\n if (!SUPPORTED_TYPES.every((t) => expectedTypes.includes(t))) return false;\n return solanaAltResolutionInputCodec.decode(input).caseOf({\n Left: () => false,\n Right: ({ requests }) =>\n requests.length > 0 &&\n requests.every(\n (r) => r.altAddress.length > 0 && r.challenge.length > 0,\n ),\n });\n }\n\n public async load(\n input: SolanaAltResolutionContextInput,\n ): Promise<ClearSignContext[]> {\n return loadChallengeBoundContexts({\n requests: input.requests,\n deviceModelId: input.deviceModelId,\n certificateLoader: this.certificateLoader,\n logger: this.logger,\n label: \"ALT_RESOLUTION\",\n fetch: (request) => this.dataSource.getAltResolution(request),\n toContext: (value, certificate) => {\n const payload: SolanaAltResolutionPayload = {\n descriptor: value.descriptor,\n };\n return {\n type: ClearSignContextType.SOLANA_ALT_RESOLUTION,\n payload,\n certificate,\n };\n },\n describe: (request) => ({\n altAddress: request.altAddress,\n entryIndex: request.entryIndex,\n }),\n });\n }\n}\n"],
5
- "mappings": "iOAIA,OAAS,UAAAA,EAAQ,cAAAC,MAAkB,YACnC,OAAS,SAAAC,EAAO,SAAAC,EAAO,UAAAC,MAAc,YAErC,OAAS,eAAAC,MAAmB,0BAC5B,OAAS,YAAAC,MAAgB,uCAGzB,OAAS,sBAAAC,MAA0B,wDAGnC,OAEE,wBAAAC,MACK,kCACP,OAAS,8BAAAC,MAAkC,sCAC3C,OAAS,sBAAAC,MAA0B,oCACnC,OAAS,WAAAC,MAAe,2BAExB,MAAMC,EAA0C,CAC9CC,EAAqB,qBACvB,EAaMC,EAA4BC,EAAM,UAAU,CAChD,WAAYC,EACZ,WAAYC,EACZ,UAAWD,CACb,CAAC,EAEKE,EAAgCH,EAAM,UAAU,CACpD,cAAeI,EACf,SAAUC,EAAMN,CAAyB,CAC3C,CAAC,EAGM,IAAMO,EAAN,KAEP,CAGE,YAEmBC,EAEAC,EAEjBC,EACA,CALiB,gBAAAF,EAEA,uBAAAC,EAIjB,KAAK,OAASC,EAAc,4BAA4B,CAC1D,CAXiB,OAaV,UACLC,EACAC,EAC0C,CAC1C,OAAKd,EAAgB,MAAO,GAAMc,EAAc,SAAS,CAAC,CAAC,EACpDR,EAA8B,OAAOO,CAAK,EAAE,OAAO,CACxD,KAAM,IAAM,GACZ,MAAO,CAAC,CAAE,SAAAE,CAAS,IACjBA,EAAS,OAAS,GAClBA,EAAS,MACN,GAAM,EAAE,WAAW,OAAS,GAAK,EAAE,UAAU,OAAS,CACzD,CACJ,CAAC,EARoE,EASvE,CAEA,MAAa,KACXF,EAC6B,CAC7B,OAAOG,EAA2B,CAChC,SAAUH,EAAM,SAChB,cAAeA,EAAM,cACrB,kBAAmB,KAAK,kBACxB,OAAQ,KAAK,OACb,MAAO,iBACP,MAAQI,GAAY,KAAK,WAAW,iBAAiBA,CAAO,EAC5D,UAAW,CAACC,EAAOC,IAAgB,CACjC,MAAMC,EAAsC,CAC1C,WAAYF,EAAM,UACpB,EACA,MAAO,CACL,KAAMjB,EAAqB,sBAC3B,QAAAmB,EACA,YAAAD,CACF,CACF,EACA,SAAWF,IAAa,CACtB,WAAYA,EAAQ,WACpB,WAAYA,EAAQ,UACtB,EACF,CAAC,CACH,CACF,EAzDaR,EAANY,EAAA,CADNC,EAAW,EAOPC,EAAA,EAAAC,EAAOC,EAAmB,uBAAuB,GAEjDF,EAAA,EAAAC,EAAOE,EAAS,oBAAoB,GAEpCH,EAAA,EAAAC,EAAOG,EAAY,0BAA0B,IAVrClB",
4
+ "sourcesContent": ["import {\n type DeviceModelId,\n type LoggerPublisherService,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { array, Codec, string } from \"purify-ts\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { pkiTypes } from \"@/modules/multichain/pki/di/pkiTypes\";\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport { type AltResolutionDataSource } from \"@/modules/solana/alt-resolution/data/AltResolutionDataSource\";\nimport { altResolutionTypes } from \"@/modules/solana/alt-resolution/di/altResolutionTypes\";\nimport { type SolanaAltResolutionPayload } from \"@/modules/solana/model/SolanaPayloads\";\nimport { type ContextLoader } from \"@/shared/domain/ContextLoader\";\nimport {\n type ClearSignContext,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\nimport { loadChallengeBoundContexts } from \"@/shared/utils/challengeBoundLoader\";\nimport { deviceModelIdCodec } from \"@/shared/utils/deviceModelIdCodec\";\nimport { u8Codec } from \"@/shared/utils/uIntCodec\";\n\nconst SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.SOLANA_ALT_RESOLUTION,\n];\n\nexport type SolanaAltResolutionRequest = {\n altAddress: string;\n entryIndex: number;\n challenge: string;\n};\n\nexport type SolanaAltResolutionContextInput = {\n deviceModelId: DeviceModelId;\n requests: SolanaAltResolutionRequest[];\n};\n\nconst altResolutionRequestCodec = Codec.interface({\n altAddress: string,\n entryIndex: u8Codec,\n challenge: string,\n});\n\nconst solanaAltResolutionInputCodec = Codec.interface({\n deviceModelId: deviceModelIdCodec,\n requests: array(altResolutionRequestCodec),\n});\n\n@injectable()\nexport class AltResolutionContextLoader\n implements ContextLoader<SolanaAltResolutionContextInput>\n{\n private readonly logger: LoggerPublisherService;\n\n constructor(\n @inject(altResolutionTypes.AltResolutionDataSource)\n private readonly dataSource: AltResolutionDataSource,\n @inject(pkiTypes.PkiCertificateLoader)\n private readonly certificateLoader: PkiCertificateLoader,\n @inject(configTypes.ContextModuleLoggerFactory)\n loggerFactory: (tag: string) => LoggerPublisherService,\n ) {\n this.logger = loggerFactory(\"AltResolutionContextLoader\");\n }\n\n public canHandle(\n input: unknown,\n expectedTypes: ClearSignContextType[],\n ): input is SolanaAltResolutionContextInput {\n if (!SUPPORTED_TYPES.every((t) => expectedTypes.includes(t))) return false;\n return solanaAltResolutionInputCodec.decode(input).caseOf({\n Left: () => false,\n Right: ({ requests }) =>\n requests.length > 0 &&\n requests.every(\n (r) => r.altAddress.length > 0 && r.challenge.length > 0,\n ),\n });\n }\n\n public async load(\n input: SolanaAltResolutionContextInput,\n ): Promise<ClearSignContext[]> {\n return loadChallengeBoundContexts({\n requests: input.requests,\n deviceModelId: input.deviceModelId,\n certificateLoader: this.certificateLoader,\n logger: this.logger,\n label: \"ALT_RESOLUTION\",\n fetch: (request) => this.dataSource.getAltResolution(request),\n toContext: (value, certificate) => {\n const payload: SolanaAltResolutionPayload = {\n descriptor: value.descriptor,\n resolvedAddress: value.resolvedAddress,\n };\n return {\n type: ClearSignContextType.SOLANA_ALT_RESOLUTION,\n payload,\n certificate,\n };\n },\n describe: (request) => ({\n altAddress: request.altAddress,\n entryIndex: request.entryIndex,\n }),\n });\n }\n}\n"],
5
+ "mappings": "iOAIA,OAAS,UAAAA,EAAQ,cAAAC,MAAkB,YACnC,OAAS,SAAAC,EAAO,SAAAC,EAAO,UAAAC,MAAc,YAErC,OAAS,eAAAC,MAAmB,0BAC5B,OAAS,YAAAC,MAAgB,uCAGzB,OAAS,sBAAAC,MAA0B,wDAGnC,OAEE,wBAAAC,MACK,kCACP,OAAS,8BAAAC,MAAkC,sCAC3C,OAAS,sBAAAC,MAA0B,oCACnC,OAAS,WAAAC,MAAe,2BAExB,MAAMC,EAA0C,CAC9CC,EAAqB,qBACvB,EAaMC,EAA4BC,EAAM,UAAU,CAChD,WAAYC,EACZ,WAAYC,EACZ,UAAWD,CACb,CAAC,EAEKE,EAAgCH,EAAM,UAAU,CACpD,cAAeI,EACf,SAAUC,EAAMN,CAAyB,CAC3C,CAAC,EAGM,IAAMO,EAAN,KAEP,CAGE,YAEmBC,EAEAC,EAEjBC,EACA,CALiB,gBAAAF,EAEA,uBAAAC,EAIjB,KAAK,OAASC,EAAc,4BAA4B,CAC1D,CAXiB,OAaV,UACLC,EACAC,EAC0C,CAC1C,OAAKd,EAAgB,MAAO,GAAMc,EAAc,SAAS,CAAC,CAAC,EACpDR,EAA8B,OAAOO,CAAK,EAAE,OAAO,CACxD,KAAM,IAAM,GACZ,MAAO,CAAC,CAAE,SAAAE,CAAS,IACjBA,EAAS,OAAS,GAClBA,EAAS,MACN,GAAM,EAAE,WAAW,OAAS,GAAK,EAAE,UAAU,OAAS,CACzD,CACJ,CAAC,EARoE,EASvE,CAEA,MAAa,KACXF,EAC6B,CAC7B,OAAOG,EAA2B,CAChC,SAAUH,EAAM,SAChB,cAAeA,EAAM,cACrB,kBAAmB,KAAK,kBACxB,OAAQ,KAAK,OACb,MAAO,iBACP,MAAQI,GAAY,KAAK,WAAW,iBAAiBA,CAAO,EAC5D,UAAW,CAACC,EAAOC,IAAgB,CACjC,MAAMC,EAAsC,CAC1C,WAAYF,EAAM,WAClB,gBAAiBA,EAAM,eACzB,EACA,MAAO,CACL,KAAMjB,EAAqB,sBAC3B,QAAAmB,EACA,YAAAD,CACF,CACF,EACA,SAAWF,IAAa,CACtB,WAAYA,EAAQ,WACpB,WAAYA,EAAQ,UACtB,EACF,CAAC,CACH,CACF,EA1DaR,EAANY,EAAA,CADNC,EAAW,EAOPC,EAAA,EAAAC,EAAOC,EAAmB,uBAAuB,GAEjDF,EAAA,EAAAC,EAAOE,EAAS,oBAAoB,GAEpCH,EAAA,EAAAC,EAAOG,EAAY,0BAA0B,IAVrClB",
6
6
  "names": ["inject", "injectable", "array", "Codec", "string", "configTypes", "pkiTypes", "altResolutionTypes", "ClearSignContextType", "loadChallengeBoundContexts", "deviceModelIdCodec", "u8Codec", "SUPPORTED_TYPES", "ClearSignContextType", "altResolutionRequestCodec", "Codec", "string", "u8Codec", "solanaAltResolutionInputCodec", "deviceModelIdCodec", "array", "AltResolutionContextLoader", "dataSource", "certificateLoader", "loggerFactory", "input", "expectedTypes", "requests", "loadChallengeBoundContexts", "request", "value", "certificate", "payload", "__decorateClass", "injectable", "__decorateParam", "inject", "altResolutionTypes", "pkiTypes", "configTypes"]
7
7
  }