@ledgerhq/context-module 1.11.1 → 1.13.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 (200) hide show
  1. package/lib/cjs/package.json +1 -1
  2. package/lib/cjs/src/ContextModuleBuilder.js +1 -1
  3. package/lib/cjs/src/ContextModuleBuilder.js.map +3 -3
  4. package/lib/cjs/src/ContextModuleBuilder.test.js +1 -1
  5. package/lib/cjs/src/ContextModuleBuilder.test.js.map +3 -3
  6. package/lib/cjs/src/DefaultContextModule.test.js +1 -1
  7. package/lib/cjs/src/DefaultContextModule.test.js.map +3 -3
  8. package/lib/cjs/src/calldata/domain/CalldataContextLoader.js +1 -1
  9. package/lib/cjs/src/calldata/domain/CalldataContextLoader.js.map +3 -3
  10. package/lib/cjs/src/calldata/domain/CalldataContextLoader.test.js +1 -1
  11. package/lib/cjs/src/calldata/domain/CalldataContextLoader.test.js.map +3 -3
  12. package/lib/cjs/src/config/di/configTypes.js +1 -1
  13. package/lib/cjs/src/config/di/configTypes.js.map +2 -2
  14. package/lib/cjs/src/config/model/ContextModuleBuildArgs.js +1 -1
  15. package/lib/cjs/src/config/model/ContextModuleBuildArgs.js.map +1 -1
  16. package/lib/cjs/src/config/model/ContextModuleConfig.js +1 -1
  17. package/lib/cjs/src/config/model/ContextModuleConfig.js.map +1 -1
  18. package/lib/cjs/src/di.js +1 -1
  19. package/lib/cjs/src/di.js.map +3 -3
  20. package/lib/cjs/src/dynamic-network/domain/DynamicNetworkContextLoader.js +1 -1
  21. package/lib/cjs/src/dynamic-network/domain/DynamicNetworkContextLoader.js.map +3 -3
  22. package/lib/cjs/src/dynamic-network/domain/DynamicNetworkContextLoader.test.js +1 -1
  23. package/lib/cjs/src/dynamic-network/domain/DynamicNetworkContextLoader.test.js.map +3 -3
  24. package/lib/cjs/src/external-plugin/domain/ExternalPluginContextLoader.js +1 -1
  25. package/lib/cjs/src/external-plugin/domain/ExternalPluginContextLoader.js.map +3 -3
  26. package/lib/cjs/src/external-plugin/domain/ExternalPluginContextLoader.test.js +1 -1
  27. package/lib/cjs/src/external-plugin/domain/ExternalPluginContextLoader.test.js.map +3 -3
  28. package/lib/cjs/src/nft/domain/NftContextLoader.js +1 -1
  29. package/lib/cjs/src/nft/domain/NftContextLoader.js.map +3 -3
  30. package/lib/cjs/src/nft/domain/NftContextLoader.test.js +1 -1
  31. package/lib/cjs/src/nft/domain/NftContextLoader.test.js.map +3 -3
  32. package/lib/cjs/src/shared/model/TypedDataClearSignContext.js +1 -1
  33. package/lib/cjs/src/shared/model/TypedDataClearSignContext.js.map +2 -2
  34. package/lib/cjs/src/solana/domain/DefaultSolanaContextLoader.js +1 -1
  35. package/lib/cjs/src/solana/domain/DefaultSolanaContextLoader.js.map +3 -3
  36. package/lib/cjs/src/solana/domain/DefaultSolanaContextLoader.test.js +1 -1
  37. package/lib/cjs/src/solana/domain/DefaultSolanaContextLoader.test.js.map +3 -3
  38. package/lib/cjs/src/solanaLifi/domain/SolanaLifiContextLoader.js +1 -1
  39. package/lib/cjs/src/solanaLifi/domain/SolanaLifiContextLoader.js.map +3 -3
  40. package/lib/cjs/src/solanaLifi/domain/SolanaLifiContextLoader.test.js +1 -1
  41. package/lib/cjs/src/solanaLifi/domain/SolanaLifiContextLoader.test.js.map +3 -3
  42. package/lib/cjs/src/solanaToken/domain/SolanaTokenContextLoader.js +1 -1
  43. package/lib/cjs/src/solanaToken/domain/SolanaTokenContextLoader.js.map +3 -3
  44. package/lib/cjs/src/solanaToken/domain/SolanaTokenContextLoader.test.js +1 -1
  45. package/lib/cjs/src/solanaToken/domain/SolanaTokenContextLoader.test.js.map +3 -3
  46. package/lib/cjs/src/token/domain/TokenContextFieldLoader.js +1 -1
  47. package/lib/cjs/src/token/domain/TokenContextFieldLoader.js.map +3 -3
  48. package/lib/cjs/src/token/domain/TokenContextFieldLoader.test.js +1 -1
  49. package/lib/cjs/src/token/domain/TokenContextFieldLoader.test.js.map +3 -3
  50. package/lib/cjs/src/token/domain/TokenContextLoader.js +1 -1
  51. package/lib/cjs/src/token/domain/TokenContextLoader.js.map +3 -3
  52. package/lib/cjs/src/token/domain/TokenContextLoader.test.js +1 -1
  53. package/lib/cjs/src/token/domain/TokenContextLoader.test.js.map +3 -3
  54. package/lib/cjs/src/transaction-check/domain/TransactionCheckContextLoader.js +1 -1
  55. package/lib/cjs/src/transaction-check/domain/TransactionCheckContextLoader.js.map +3 -3
  56. package/lib/cjs/src/transaction-check/domain/TransactionCheckContextLoader.test.js +1 -1
  57. package/lib/cjs/src/transaction-check/domain/TransactionCheckContextLoader.test.js.map +3 -3
  58. package/lib/cjs/src/transaction-check/domain/TypedDataCheckContextLoader.js +1 -1
  59. package/lib/cjs/src/transaction-check/domain/TypedDataCheckContextLoader.js.map +3 -3
  60. package/lib/cjs/src/transaction-check/domain/TypedDataCheckContextLoader.test.js +1 -1
  61. package/lib/cjs/src/transaction-check/domain/TypedDataCheckContextLoader.test.js.map +3 -3
  62. package/lib/cjs/src/trusted-name/di/trustedNameModuleFactory.js +1 -1
  63. package/lib/cjs/src/trusted-name/di/trustedNameModuleFactory.js.map +3 -3
  64. package/lib/cjs/src/trusted-name/domain/TrustedNameContextLoader.js +1 -1
  65. package/lib/cjs/src/trusted-name/domain/TrustedNameContextLoader.js.map +3 -3
  66. package/lib/cjs/src/trusted-name/domain/TrustedNameContextLoader.test.js +1 -1
  67. package/lib/cjs/src/trusted-name/domain/TrustedNameContextLoader.test.js.map +3 -3
  68. package/lib/cjs/src/typed-data/data/FiltersDto.js.map +1 -1
  69. package/lib/cjs/src/typed-data/data/HttpTypedDataDataSource.js +1 -1
  70. package/lib/cjs/src/typed-data/data/HttpTypedDataDataSource.js.map +2 -2
  71. package/lib/cjs/src/typed-data/data/HttpTypedDataDataSource.test.js +1 -1
  72. package/lib/cjs/src/typed-data/data/HttpTypedDataDataSource.test.js.map +2 -2
  73. package/lib/cjs/src/typed-data/domain/DefaultTypedDataContextLoader.js +1 -1
  74. package/lib/cjs/src/typed-data/domain/DefaultTypedDataContextLoader.js.map +3 -3
  75. package/lib/cjs/src/typed-data/domain/DefaultTypedDataContextLoader.test.js +1 -1
  76. package/lib/cjs/src/typed-data/domain/DefaultTypedDataContextLoader.test.js.map +3 -3
  77. package/lib/cjs/src/uniswap/domain/UniswapContextLoader.js +1 -1
  78. package/lib/cjs/src/uniswap/domain/UniswapContextLoader.js.map +3 -3
  79. package/lib/cjs/src/uniswap/domain/UniswapContextLoader.test.js +1 -1
  80. package/lib/cjs/src/uniswap/domain/UniswapContextLoader.test.js.map +3 -3
  81. package/lib/esm/package.json +1 -1
  82. package/lib/esm/src/ContextModuleBuilder.js +1 -1
  83. package/lib/esm/src/ContextModuleBuilder.js.map +3 -3
  84. package/lib/esm/src/ContextModuleBuilder.test.js +1 -1
  85. package/lib/esm/src/ContextModuleBuilder.test.js.map +3 -3
  86. package/lib/esm/src/DefaultContextModule.test.js +1 -1
  87. package/lib/esm/src/DefaultContextModule.test.js.map +3 -3
  88. package/lib/esm/src/calldata/domain/CalldataContextLoader.js +1 -1
  89. package/lib/esm/src/calldata/domain/CalldataContextLoader.js.map +3 -3
  90. package/lib/esm/src/calldata/domain/CalldataContextLoader.test.js +1 -1
  91. package/lib/esm/src/calldata/domain/CalldataContextLoader.test.js.map +3 -3
  92. package/lib/esm/src/config/di/configTypes.js +1 -1
  93. package/lib/esm/src/config/di/configTypes.js.map +2 -2
  94. package/lib/esm/src/di.js +1 -1
  95. package/lib/esm/src/di.js.map +3 -3
  96. package/lib/esm/src/dynamic-network/domain/DynamicNetworkContextLoader.js +1 -1
  97. package/lib/esm/src/dynamic-network/domain/DynamicNetworkContextLoader.js.map +3 -3
  98. package/lib/esm/src/dynamic-network/domain/DynamicNetworkContextLoader.test.js +1 -1
  99. package/lib/esm/src/dynamic-network/domain/DynamicNetworkContextLoader.test.js.map +3 -3
  100. package/lib/esm/src/external-plugin/domain/ExternalPluginContextLoader.js +1 -1
  101. package/lib/esm/src/external-plugin/domain/ExternalPluginContextLoader.js.map +3 -3
  102. package/lib/esm/src/external-plugin/domain/ExternalPluginContextLoader.test.js +1 -1
  103. package/lib/esm/src/external-plugin/domain/ExternalPluginContextLoader.test.js.map +3 -3
  104. package/lib/esm/src/nft/domain/NftContextLoader.js +1 -1
  105. package/lib/esm/src/nft/domain/NftContextLoader.js.map +3 -3
  106. package/lib/esm/src/nft/domain/NftContextLoader.test.js +1 -1
  107. package/lib/esm/src/nft/domain/NftContextLoader.test.js.map +3 -3
  108. package/lib/esm/src/shared/model/TypedDataClearSignContext.js.map +2 -2
  109. package/lib/esm/src/solana/domain/DefaultSolanaContextLoader.js +1 -1
  110. package/lib/esm/src/solana/domain/DefaultSolanaContextLoader.js.map +3 -3
  111. package/lib/esm/src/solana/domain/DefaultSolanaContextLoader.test.js +1 -1
  112. package/lib/esm/src/solana/domain/DefaultSolanaContextLoader.test.js.map +3 -3
  113. package/lib/esm/src/solanaLifi/domain/SolanaLifiContextLoader.js +1 -1
  114. package/lib/esm/src/solanaLifi/domain/SolanaLifiContextLoader.js.map +3 -3
  115. package/lib/esm/src/solanaLifi/domain/SolanaLifiContextLoader.test.js +1 -1
  116. package/lib/esm/src/solanaLifi/domain/SolanaLifiContextLoader.test.js.map +3 -3
  117. package/lib/esm/src/solanaToken/domain/SolanaTokenContextLoader.js +1 -1
  118. package/lib/esm/src/solanaToken/domain/SolanaTokenContextLoader.js.map +3 -3
  119. package/lib/esm/src/solanaToken/domain/SolanaTokenContextLoader.test.js +1 -1
  120. package/lib/esm/src/solanaToken/domain/SolanaTokenContextLoader.test.js.map +3 -3
  121. package/lib/esm/src/token/domain/TokenContextFieldLoader.js +1 -1
  122. package/lib/esm/src/token/domain/TokenContextFieldLoader.js.map +3 -3
  123. package/lib/esm/src/token/domain/TokenContextFieldLoader.test.js +1 -1
  124. package/lib/esm/src/token/domain/TokenContextFieldLoader.test.js.map +3 -3
  125. package/lib/esm/src/token/domain/TokenContextLoader.js +1 -1
  126. package/lib/esm/src/token/domain/TokenContextLoader.js.map +3 -3
  127. package/lib/esm/src/token/domain/TokenContextLoader.test.js +1 -1
  128. package/lib/esm/src/token/domain/TokenContextLoader.test.js.map +3 -3
  129. package/lib/esm/src/transaction-check/domain/TransactionCheckContextLoader.js +1 -1
  130. package/lib/esm/src/transaction-check/domain/TransactionCheckContextLoader.js.map +3 -3
  131. package/lib/esm/src/transaction-check/domain/TransactionCheckContextLoader.test.js +1 -1
  132. package/lib/esm/src/transaction-check/domain/TransactionCheckContextLoader.test.js.map +3 -3
  133. package/lib/esm/src/transaction-check/domain/TypedDataCheckContextLoader.js +1 -1
  134. package/lib/esm/src/transaction-check/domain/TypedDataCheckContextLoader.js.map +3 -3
  135. package/lib/esm/src/transaction-check/domain/TypedDataCheckContextLoader.test.js +1 -1
  136. package/lib/esm/src/transaction-check/domain/TypedDataCheckContextLoader.test.js.map +3 -3
  137. package/lib/esm/src/trusted-name/di/trustedNameModuleFactory.js +1 -1
  138. package/lib/esm/src/trusted-name/di/trustedNameModuleFactory.js.map +3 -3
  139. package/lib/esm/src/trusted-name/domain/TrustedNameContextLoader.js +1 -1
  140. package/lib/esm/src/trusted-name/domain/TrustedNameContextLoader.js.map +3 -3
  141. package/lib/esm/src/trusted-name/domain/TrustedNameContextLoader.test.js +1 -1
  142. package/lib/esm/src/trusted-name/domain/TrustedNameContextLoader.test.js.map +3 -3
  143. package/lib/esm/src/typed-data/data/HttpTypedDataDataSource.js +1 -1
  144. package/lib/esm/src/typed-data/data/HttpTypedDataDataSource.js.map +2 -2
  145. package/lib/esm/src/typed-data/data/HttpTypedDataDataSource.test.js +1 -1
  146. package/lib/esm/src/typed-data/data/HttpTypedDataDataSource.test.js.map +2 -2
  147. package/lib/esm/src/typed-data/domain/DefaultTypedDataContextLoader.js +1 -1
  148. package/lib/esm/src/typed-data/domain/DefaultTypedDataContextLoader.js.map +3 -3
  149. package/lib/esm/src/typed-data/domain/DefaultTypedDataContextLoader.test.js +1 -1
  150. package/lib/esm/src/typed-data/domain/DefaultTypedDataContextLoader.test.js.map +3 -3
  151. package/lib/esm/src/uniswap/domain/UniswapContextLoader.js +1 -1
  152. package/lib/esm/src/uniswap/domain/UniswapContextLoader.js.map +3 -3
  153. package/lib/esm/src/uniswap/domain/UniswapContextLoader.test.js +1 -1
  154. package/lib/esm/src/uniswap/domain/UniswapContextLoader.test.js.map +3 -3
  155. package/lib/types/src/ContextModuleBuilder.d.ts +18 -3
  156. package/lib/types/src/ContextModuleBuilder.d.ts.map +1 -1
  157. package/lib/types/src/calldata/domain/CalldataContextLoader.d.ts +3 -2
  158. package/lib/types/src/calldata/domain/CalldataContextLoader.d.ts.map +1 -1
  159. package/lib/types/src/config/di/configTypes.d.ts +1 -0
  160. package/lib/types/src/config/di/configTypes.d.ts.map +1 -1
  161. package/lib/types/src/config/model/ContextModuleBuildArgs.d.ts +2 -0
  162. package/lib/types/src/config/model/ContextModuleBuildArgs.d.ts.map +1 -1
  163. package/lib/types/src/config/model/ContextModuleConfig.d.ts +4 -0
  164. package/lib/types/src/config/model/ContextModuleConfig.d.ts.map +1 -1
  165. package/lib/types/src/di.d.ts.map +1 -1
  166. package/lib/types/src/dynamic-network/domain/DynamicNetworkContextLoader.d.ts +3 -2
  167. package/lib/types/src/dynamic-network/domain/DynamicNetworkContextLoader.d.ts.map +1 -1
  168. package/lib/types/src/external-plugin/domain/ExternalPluginContextLoader.d.ts +3 -2
  169. package/lib/types/src/external-plugin/domain/ExternalPluginContextLoader.d.ts.map +1 -1
  170. package/lib/types/src/nft/domain/NftContextLoader.d.ts +3 -2
  171. package/lib/types/src/nft/domain/NftContextLoader.d.ts.map +1 -1
  172. package/lib/types/src/shared/model/TypedDataClearSignContext.d.ts +2 -0
  173. package/lib/types/src/shared/model/TypedDataClearSignContext.d.ts.map +1 -1
  174. package/lib/types/src/solana/domain/DefaultSolanaContextLoader.d.ts +3 -1
  175. package/lib/types/src/solana/domain/DefaultSolanaContextLoader.d.ts.map +1 -1
  176. package/lib/types/src/solanaLifi/domain/SolanaLifiContextLoader.d.ts +3 -1
  177. package/lib/types/src/solanaLifi/domain/SolanaLifiContextLoader.d.ts.map +1 -1
  178. package/lib/types/src/solanaToken/domain/SolanaTokenContextLoader.d.ts +3 -2
  179. package/lib/types/src/solanaToken/domain/SolanaTokenContextLoader.d.ts.map +1 -1
  180. package/lib/types/src/token/domain/TokenContextFieldLoader.d.ts +5 -1
  181. package/lib/types/src/token/domain/TokenContextFieldLoader.d.ts.map +1 -1
  182. package/lib/types/src/token/domain/TokenContextLoader.d.ts +3 -2
  183. package/lib/types/src/token/domain/TokenContextLoader.d.ts.map +1 -1
  184. package/lib/types/src/transaction-check/domain/TransactionCheckContextLoader.d.ts +3 -2
  185. package/lib/types/src/transaction-check/domain/TransactionCheckContextLoader.d.ts.map +1 -1
  186. package/lib/types/src/transaction-check/domain/TypedDataCheckContextLoader.d.ts +3 -2
  187. package/lib/types/src/transaction-check/domain/TypedDataCheckContextLoader.d.ts.map +1 -1
  188. package/lib/types/src/trusted-name/di/trustedNameModuleFactory.d.ts +2 -1
  189. package/lib/types/src/trusted-name/di/trustedNameModuleFactory.d.ts.map +1 -1
  190. package/lib/types/src/trusted-name/domain/TrustedNameContextLoader.d.ts +3 -2
  191. package/lib/types/src/trusted-name/domain/TrustedNameContextLoader.d.ts.map +1 -1
  192. package/lib/types/src/typed-data/data/FiltersDto.d.ts +0 -4
  193. package/lib/types/src/typed-data/data/FiltersDto.d.ts.map +1 -1
  194. package/lib/types/src/typed-data/data/HttpTypedDataDataSource.test.d.ts.map +1 -1
  195. package/lib/types/src/typed-data/domain/DefaultTypedDataContextLoader.d.ts +3 -1
  196. package/lib/types/src/typed-data/domain/DefaultTypedDataContextLoader.d.ts.map +1 -1
  197. package/lib/types/src/uniswap/domain/UniswapContextLoader.d.ts +3 -2
  198. package/lib/types/src/uniswap/domain/UniswapContextLoader.d.ts.map +1 -1
  199. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  200. package/package.json +3 -3
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/transaction-check/domain/TransactionCheckContextLoader.ts"],
4
- "sourcesContent": ["import {\n bufferToHexaString,\n DeviceModelId,\n isHexaString,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\n\nimport { pkiTypes } from \"@/pki/di/pkiTypes\";\nimport { type PkiCertificateLoader } from \"@/pki/domain/PkiCertificateLoader\";\nimport { KeyUsage } from \"@/pki/model/KeyUsage\";\nimport { ContextLoader } from \"@/shared/domain/ContextLoader\";\nimport {\n ClearSignContext,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\nimport { type TransactionCheckDataSource } from \"@/transaction-check/data/TransactionCheckDataSource\";\nimport { transactionCheckTypes } from \"@/transaction-check/di/transactionCheckTypes\";\n\nexport type TransactionCheckContextInput = {\n from: string;\n chainId: number;\n transaction: Uint8Array;\n deviceModelId: DeviceModelId;\n};\n\nconst SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.TRANSACTION_CHECK,\n];\n\n@injectable()\nexport class TransactionCheckContextLoader\n implements ContextLoader<TransactionCheckContextInput>\n{\n constructor(\n @inject(transactionCheckTypes.TransactionCheckDataSource)\n private transactionCheckDataSource: TransactionCheckDataSource,\n @inject(pkiTypes.PkiCertificateLoader)\n private certificateLoader: PkiCertificateLoader,\n ) {}\n\n canHandle(\n input: unknown,\n expectedType: ClearSignContextType[],\n ): input is TransactionCheckContextInput {\n const result =\n typeof input === \"object\" &&\n input !== null &&\n \"from\" in input &&\n input.from !== undefined &&\n isHexaString(input.from) &&\n \"chainId\" in input &&\n input.chainId !== undefined &&\n typeof input.chainId === \"number\" &&\n \"transaction\" in input &&\n input.transaction !== undefined &&\n \"deviceModelId\" in input &&\n input.deviceModelId !== undefined &&\n input.deviceModelId !== DeviceModelId.NANO_S &&\n typeof input.chainId === \"number\" &&\n isHexaString(input.from) &&\n input.from !== \"0x\" &&\n SUPPORTED_TYPES.every((type) => expectedType.includes(type));\n return result;\n }\n\n async load(ctx: TransactionCheckContextInput): Promise<ClearSignContext[]> {\n const { from, chainId, transaction } = ctx;\n\n const rawTx = bufferToHexaString(transaction);\n\n if (!from || !rawTx) {\n return [];\n }\n\n const txCheck = await this.transactionCheckDataSource.getTransactionCheck({\n chainId,\n rawTx,\n from,\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.TRANSACTION_CHECK,\n payload: data.descriptor,\n certificate,\n };\n },\n });\n\n return [context];\n }\n}\n"],
5
- "mappings": "iOAAA,OACE,sBAAAA,EACA,iBAAAC,EACA,gBAAAC,MACK,kCACP,OAAS,UAAAC,EAAQ,cAAAC,MAAkB,YAEnC,OAAS,YAAAC,MAAgB,oBAEzB,OAAS,YAAAC,MAAgB,uBAEzB,OAEE,wBAAAC,MACK,kCAEP,OAAS,yBAAAC,MAA6B,+CAStC,MAAMC,EAA0C,CAC9CC,EAAqB,iBACvB,EAGO,IAAMC,EAAN,KAEP,CACE,YAEUC,EAEAC,EACR,CAHQ,gCAAAD,EAEA,uBAAAC,CACP,CAEH,UACEC,EACAC,EACuC,CAmBvC,OAjBE,OAAOD,GAAU,UACjBA,IAAU,MACV,SAAUA,GACVA,EAAM,OAAS,QACfE,EAAaF,EAAM,IAAI,GACvB,YAAaA,GACbA,EAAM,UAAY,QAClB,OAAOA,EAAM,SAAY,UACzB,gBAAiBA,GACjBA,EAAM,cAAgB,QACtB,kBAAmBA,GACnBA,EAAM,gBAAkB,QACxBA,EAAM,gBAAkBG,EAAc,QACtC,OAAOH,EAAM,SAAY,UACzBE,EAAaF,EAAM,IAAI,GACvBA,EAAM,OAAS,MACfL,EAAgB,MAAOS,GAASH,EAAa,SAASG,CAAI,CAAC,CAE/D,CAEA,MAAM,KAAKC,EAAgE,CACzE,KAAM,CAAE,KAAAC,EAAM,QAAAC,EAAS,YAAAC,CAAY,EAAIH,EAEjCI,EAAQC,EAAmBF,CAAW,EAE5C,MAAI,CAACF,GAAQ,CAACG,EACL,CAAC,EA8BH,CArBS,MANA,MAAM,KAAK,2BAA2B,oBAAoB,CACxE,QAAAF,EACA,MAAAE,EACA,KAAAH,CACF,CAAC,GAE6B,OAAkC,CAC9D,KAAOK,GACL,QAAQ,QAAQ,CACd,KAAMf,EAAqB,MAC3B,MAAAe,CACF,CAAC,EACH,MAAO,MAAOC,GAAS,CACrB,MAAMC,EAAc,MAAM,KAAK,kBAAkB,gBAAgB,CAC/D,MAAOD,EAAK,YACZ,SAAUE,EAAS,mBACnB,aAAcT,EAAI,aACpB,CAAC,EAED,MAAO,CACL,KAAMT,EAAqB,kBAC3B,QAASgB,EAAK,WACd,YAAAC,CACF,CACF,CACF,CAAC,CAEc,CACjB,CACF,EAzEahB,EAANkB,EAAA,CADNC,EAAW,EAKPC,EAAA,EAAAC,EAAOC,EAAsB,0BAA0B,GAEvDF,EAAA,EAAAC,EAAOE,EAAS,oBAAoB,IAN5BvB",
6
- "names": ["bufferToHexaString", "DeviceModelId", "isHexaString", "inject", "injectable", "pkiTypes", "KeyUsage", "ClearSignContextType", "transactionCheckTypes", "SUPPORTED_TYPES", "ClearSignContextType", "TransactionCheckContextLoader", "transactionCheckDataSource", "certificateLoader", "input", "expectedType", "isHexaString", "DeviceModelId", "type", "ctx", "from", "chainId", "transaction", "rawTx", "bufferToHexaString", "error", "data", "certificate", "KeyUsage", "__decorateClass", "injectable", "__decorateParam", "inject", "transactionCheckTypes", "pkiTypes"]
4
+ "sourcesContent": ["import {\n bufferToHexaString,\n DeviceModelId,\n isHexaString,\n LoggerPublisherService,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { pkiTypes } from \"@/pki/di/pkiTypes\";\nimport { type PkiCertificateLoader } from \"@/pki/domain/PkiCertificateLoader\";\nimport { KeyUsage } from \"@/pki/model/KeyUsage\";\nimport { ContextLoader } from \"@/shared/domain/ContextLoader\";\nimport {\n ClearSignContext,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\nimport { type TransactionCheckDataSource } from \"@/transaction-check/data/TransactionCheckDataSource\";\nimport { transactionCheckTypes } from \"@/transaction-check/di/transactionCheckTypes\";\n\nexport type TransactionCheckContextInput = {\n from: string;\n chainId: number;\n transaction: Uint8Array;\n deviceModelId: DeviceModelId;\n};\n\nconst SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.TRANSACTION_CHECK,\n];\n\n@injectable()\nexport class TransactionCheckContextLoader\n implements ContextLoader<TransactionCheckContextInput>\n{\n private logger: LoggerPublisherService;\n\n constructor(\n @inject(transactionCheckTypes.TransactionCheckDataSource)\n private transactionCheckDataSource: TransactionCheckDataSource,\n @inject(pkiTypes.PkiCertificateLoader)\n private certificateLoader: PkiCertificateLoader,\n @inject(configTypes.ContextModuleLoggerFactory)\n loggerFactory: (tag: string) => LoggerPublisherService,\n ) {\n this.logger = loggerFactory(\"TransactionCheckContextLoader\");\n }\n\n canHandle(\n input: unknown,\n expectedType: ClearSignContextType[],\n ): input is TransactionCheckContextInput {\n const result =\n typeof input === \"object\" &&\n input !== null &&\n \"from\" in input &&\n input.from !== undefined &&\n isHexaString(input.from) &&\n \"chainId\" in input &&\n input.chainId !== undefined &&\n typeof input.chainId === \"number\" &&\n \"transaction\" in input &&\n input.transaction !== undefined &&\n \"deviceModelId\" in input &&\n input.deviceModelId !== undefined &&\n input.deviceModelId !== DeviceModelId.NANO_S &&\n typeof input.chainId === \"number\" &&\n isHexaString(input.from) &&\n input.from !== \"0x\" &&\n SUPPORTED_TYPES.every((type) => expectedType.includes(type));\n return result;\n }\n\n async load(ctx: TransactionCheckContextInput): Promise<ClearSignContext[]> {\n const { from, chainId, transaction } = ctx;\n\n const rawTx = bufferToHexaString(transaction);\n\n if (!from || !rawTx) {\n this.logger.debug(\"load result\", { data: { result: [] } });\n return [];\n }\n\n const txCheck = await this.transactionCheckDataSource.getTransactionCheck({\n chainId,\n rawTx,\n from,\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.TRANSACTION_CHECK,\n payload: 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": "iOAAA,OACE,sBAAAA,EACA,iBAAAC,EACA,gBAAAC,MAEK,kCACP,OAAS,UAAAC,EAAQ,cAAAC,MAAkB,YAEnC,OAAS,eAAAC,MAAmB,0BAC5B,OAAS,YAAAC,MAAgB,oBAEzB,OAAS,YAAAC,MAAgB,uBAEzB,OAEE,wBAAAC,MACK,kCAEP,OAAS,yBAAAC,MAA6B,+CAStC,MAAMC,EAA0C,CAC9CC,EAAqB,iBACvB,EAGO,IAAMC,EAAN,KAEP,CAGE,YAEUC,EAEAC,EAERC,EACA,CALQ,gCAAAF,EAEA,uBAAAC,EAIR,KAAK,OAASC,EAAc,+BAA+B,CAC7D,CAXQ,OAaR,UACEC,EACAC,EACuC,CAmBvC,OAjBE,OAAOD,GAAU,UACjBA,IAAU,MACV,SAAUA,GACVA,EAAM,OAAS,QACfE,EAAaF,EAAM,IAAI,GACvB,YAAaA,GACbA,EAAM,UAAY,QAClB,OAAOA,EAAM,SAAY,UACzB,gBAAiBA,GACjBA,EAAM,cAAgB,QACtB,kBAAmBA,GACnBA,EAAM,gBAAkB,QACxBA,EAAM,gBAAkBG,EAAc,QACtC,OAAOH,EAAM,SAAY,UACzBE,EAAaF,EAAM,IAAI,GACvBA,EAAM,OAAS,MACfN,EAAgB,MAAOU,GAASH,EAAa,SAASG,CAAI,CAAC,CAE/D,CAEA,MAAM,KAAKC,EAAgE,CACzE,KAAM,CAAE,KAAAC,EAAM,QAAAC,EAAS,YAAAC,CAAY,EAAIH,EAEjCI,EAAQC,EAAmBF,CAAW,EAE5C,GAAI,CAACF,GAAQ,CAACG,EACZ,YAAK,OAAO,MAAM,cAAe,CAAE,KAAM,CAAE,OAAQ,CAAC,CAAE,CAAE,CAAC,EAClD,CAAC,EA8BV,MAAME,EAAS,CArBC,MANA,MAAM,KAAK,2BAA2B,oBAAoB,CACxE,QAAAJ,EACA,MAAAE,EACA,KAAAH,CACF,CAAC,GAE6B,OAAkC,CAC9D,KAAOM,GACL,QAAQ,QAAQ,CACd,KAAMjB,EAAqB,MAC3B,MAAAiB,CACF,CAAC,EACH,MAAO,MAAOC,GAAS,CACrB,MAAMC,EAAc,MAAM,KAAK,kBAAkB,gBAAgB,CAC/D,MAAOD,EAAK,YACZ,SAAUE,EAAS,mBACnB,aAAcV,EAAI,aACpB,CAAC,EAED,MAAO,CACL,KAAMV,EAAqB,kBAC3B,QAASkB,EAAK,WACd,YAAAC,CACF,CACF,CACF,CAAC,CAEsB,EACvB,YAAK,OAAO,MAAM,cAAe,CAAE,KAAM,CAAE,OAAAH,CAAO,CAAE,CAAC,EAC9CA,CACT,CACF,EAlFaf,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": ["bufferToHexaString", "DeviceModelId", "isHexaString", "inject", "injectable", "configTypes", "pkiTypes", "KeyUsage", "ClearSignContextType", "transactionCheckTypes", "SUPPORTED_TYPES", "ClearSignContextType", "TransactionCheckContextLoader", "transactionCheckDataSource", "certificateLoader", "loggerFactory", "input", "expectedType", "isHexaString", "DeviceModelId", "type", "ctx", "from", "chainId", "transaction", "rawTx", "bufferToHexaString", "result", "error", "data", "certificate", "KeyUsage", "__decorateClass", "injectable", "__decorateParam", "inject", "transactionCheckTypes", "pkiTypes", "configTypes"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{DeviceModelId as d}from"@ledgerhq/device-management-kit";import{Left as u,Right as l}from"purify-ts";import{KeyUsage as f}from"../../pki/model/KeyUsage";import{ClearSignContextType as s}from"../../shared/model/ClearSignContext";import{TransactionCheckContextLoader as p}from"../../transaction-check/domain/TransactionCheckContextLoader";describe("TransactionCheckContextLoader",()=>{const i={getTransactionCheck:vi.fn()},c={loadCertificate:vi.fn()},a=new p(i,c),r=[s.TRANSACTION_CHECK];beforeEach(()=>{vi.resetAllMocks()}),describe("canHandle function",()=>{const e={from:"0x1234567890123456789012345678901234567890",chainId:1,transaction:new Uint8Array([1,2,3]),deviceModelId:d.FLEX};it("should return true for valid input",()=>{expect(a.canHandle(e,r)).toBe(!0)}),it("should return false for invalid expected type",()=>{expect(a.canHandle(e,[s.TOKEN])).toBe(!1)}),it.each([[null,"null input"],[void 0,"undefined input"],[{},"empty object"],["string","string input"],[123,"number input"]])("should return false for %s",(n,t)=>{expect(a.canHandle(n,r)).toBe(!1)}),it.each([[{...e,from:void 0},"missing from"],[{...e,chainId:void 0},"missing chainId"],[{...e,transaction:void 0},"missing transaction"],[{...e,deviceModelId:void 0},"missing deviceModelId"]])("should return false for %s",(n,t)=>{expect(a.canHandle(n,r)).toBe(!1)}),it.each([[{...e,from:"invalid-hex"},"invalid from hex"],[{...e,from:"0x"},"empty from hex"],[{...e,from:"not-hex"},"non-hex from"]])("should return false for %s",(n,t)=>{expect(a.canHandle(n,r)).toBe(!1)}),it("should return false for NANO_S device model",()=>{const n={...e,deviceModelId:d.NANO_S};expect(a.canHandle(n,r)).toBe(!1)}),it("should return false for non-number chainId",()=>{const n={...e,chainId:"not-a-number"};expect(a.canHandle(n,r)).toBe(!1)})}),describe("load function",()=>{const e={from:"0x1234567890123456789012345678901234567890",chainId:1,transaction:new Uint8Array([1,2,3]),deviceModelId:d.FLEX},n={descriptor:"cert-descriptor",signature:"cert-signature",keyUsageNumber:0,payload:new Uint8Array};it("should return empty array when from is empty",async()=>{const t={...e,from:""},o=await a.load(t);expect(o).toEqual([])}),it("should return error context when transaction check fails",async()=>{const t=new Error("Transaction check failed");vi.spyOn(i,"getTransactionCheck").mockResolvedValue(u(t));const o=await a.load(e);expect(o).toEqual([{type:s.ERROR,error:t}])}),it("should return transaction check context when successful",async()=>{const t={publicKeyId:"test-key-id",descriptor:"test-descriptor"};vi.spyOn(i,"getTransactionCheck").mockResolvedValue(l(t)),vi.spyOn(c,"loadCertificate").mockResolvedValue(n);const o=await a.load(e);expect(i.getTransactionCheck).toHaveBeenCalledWith({chainId:e.chainId,rawTx:"0x010203",from:e.from}),expect(c.loadCertificate).toHaveBeenCalledWith({keyId:t.publicKeyId,keyUsage:f.TxSimulationSigner,targetDevice:e.deviceModelId}),expect(o).toEqual([{type:s.TRANSACTION_CHECK,payload:t.descriptor,certificate:n}])}),it("should handle certificate loading failure",async()=>{const t={publicKeyId:"test-key-id",descriptor:"test-descriptor"},o=new Error("Certificate loading failed");vi.spyOn(i,"getTransactionCheck").mockResolvedValue(l(t)),vi.spyOn(c,"loadCertificate").mockRejectedValue(o),await expect(a.load(e)).rejects.toThrow(o)}),it("should convert transaction buffer to hex string correctly",async()=>{const t={publicKeyId:"test-key-id",descriptor:"test-descriptor"};vi.spyOn(i,"getTransactionCheck").mockResolvedValue(l(t)),vi.spyOn(c,"loadCertificate").mockResolvedValue(n),await a.load(e),expect(i.getTransactionCheck).toHaveBeenCalledWith({chainId:e.chainId,rawTx:"0x010203",from:e.from})})})});
1
+ import{DeviceModelId as d}from"@ledgerhq/device-management-kit";import{Left as u,Right as l}from"purify-ts";import{KeyUsage as f}from"../../pki/model/KeyUsage";import{ClearSignContextType as s}from"../../shared/model/ClearSignContext";import{TransactionCheckContextLoader as p}from"../../transaction-check/domain/TransactionCheckContextLoader";const h=()=>({debug:vi.fn(),info:vi.fn(),warn:vi.fn(),error:vi.fn(),subscribers:[]});describe("TransactionCheckContextLoader",()=>{const i={getTransactionCheck:vi.fn()},c={loadCertificate:vi.fn()},a=new p(i,c,h),r=[s.TRANSACTION_CHECK];beforeEach(()=>{vi.resetAllMocks()}),describe("canHandle function",()=>{const e={from:"0x1234567890123456789012345678901234567890",chainId:1,transaction:new Uint8Array([1,2,3]),deviceModelId:d.FLEX};it("should return true for valid input",()=>{expect(a.canHandle(e,r)).toBe(!0)}),it("should return false for invalid expected type",()=>{expect(a.canHandle(e,[s.TOKEN])).toBe(!1)}),it.each([[null,"null input"],[void 0,"undefined input"],[{},"empty object"],["string","string input"],[123,"number input"]])("should return false for %s",(n,t)=>{expect(a.canHandle(n,r)).toBe(!1)}),it.each([[{...e,from:void 0},"missing from"],[{...e,chainId:void 0},"missing chainId"],[{...e,transaction:void 0},"missing transaction"],[{...e,deviceModelId:void 0},"missing deviceModelId"]])("should return false for %s",(n,t)=>{expect(a.canHandle(n,r)).toBe(!1)}),it.each([[{...e,from:"invalid-hex"},"invalid from hex"],[{...e,from:"0x"},"empty from hex"],[{...e,from:"not-hex"},"non-hex from"]])("should return false for %s",(n,t)=>{expect(a.canHandle(n,r)).toBe(!1)}),it("should return false for NANO_S device model",()=>{const n={...e,deviceModelId:d.NANO_S};expect(a.canHandle(n,r)).toBe(!1)}),it("should return false for non-number chainId",()=>{const n={...e,chainId:"not-a-number"};expect(a.canHandle(n,r)).toBe(!1)})}),describe("load function",()=>{const e={from:"0x1234567890123456789012345678901234567890",chainId:1,transaction:new Uint8Array([1,2,3]),deviceModelId:d.FLEX},n={descriptor:"cert-descriptor",signature:"cert-signature",keyUsageNumber:0,payload:new Uint8Array};it("should return empty array when from is empty",async()=>{const t={...e,from:""},o=await a.load(t);expect(o).toEqual([])}),it("should return error context when transaction check fails",async()=>{const t=new Error("Transaction check failed");vi.spyOn(i,"getTransactionCheck").mockResolvedValue(u(t));const o=await a.load(e);expect(o).toEqual([{type:s.ERROR,error:t}])}),it("should return transaction check context when successful",async()=>{const t={publicKeyId:"test-key-id",descriptor:"test-descriptor"};vi.spyOn(i,"getTransactionCheck").mockResolvedValue(l(t)),vi.spyOn(c,"loadCertificate").mockResolvedValue(n);const o=await a.load(e);expect(i.getTransactionCheck).toHaveBeenCalledWith({chainId:e.chainId,rawTx:"0x010203",from:e.from}),expect(c.loadCertificate).toHaveBeenCalledWith({keyId:t.publicKeyId,keyUsage:f.TxSimulationSigner,targetDevice:e.deviceModelId}),expect(o).toEqual([{type:s.TRANSACTION_CHECK,payload:t.descriptor,certificate:n}])}),it("should handle certificate loading failure",async()=>{const t={publicKeyId:"test-key-id",descriptor:"test-descriptor"},o=new Error("Certificate loading failed");vi.spyOn(i,"getTransactionCheck").mockResolvedValue(l(t)),vi.spyOn(c,"loadCertificate").mockRejectedValue(o),await expect(a.load(e)).rejects.toThrow(o)}),it("should convert transaction buffer to hex string correctly",async()=>{const t={publicKeyId:"test-key-id",descriptor:"test-descriptor"};vi.spyOn(i,"getTransactionCheck").mockResolvedValue(l(t)),vi.spyOn(c,"loadCertificate").mockResolvedValue(n),await a.load(e),expect(i.getTransactionCheck).toHaveBeenCalledWith({chainId:e.chainId,rawTx:"0x010203",from:e.from})})})});
2
2
  //# sourceMappingURL=TransactionCheckContextLoader.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/transaction-check/domain/TransactionCheckContextLoader.test.ts"],
4
- "sourcesContent": ["import { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\n\nimport type { PkiCertificateLoader } from \"@/pki/domain/PkiCertificateLoader\";\nimport { KeyUsage } from \"@/pki/model/KeyUsage\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\nimport { type TransactionCheckDataSource } from \"@/transaction-check/data/TransactionCheckDataSource\";\nimport {\n type TransactionCheckContextInput,\n TransactionCheckContextLoader,\n} from \"@/transaction-check/domain/TransactionCheckContextLoader\";\n\ndescribe(\"TransactionCheckContextLoader\", () => {\n const mockTransactionCheckDataSource: TransactionCheckDataSource = {\n getTransactionCheck: vi.fn(),\n };\n const mockCertificateLoader: PkiCertificateLoader = {\n loadCertificate: vi.fn(),\n };\n const loader = new TransactionCheckContextLoader(\n mockTransactionCheckDataSource,\n mockCertificateLoader,\n );\n\n const SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.TRANSACTION_CHECK,\n ];\n\n beforeEach(() => {\n vi.resetAllMocks();\n });\n\n describe(\"canHandle function\", () => {\n const validInput: TransactionCheckContextInput = {\n from: \"0x1234567890123456789012345678901234567890\",\n chainId: 1,\n transaction: new Uint8Array([1, 2, 3]),\n deviceModelId: DeviceModelId.FLEX,\n };\n\n it(\"should return true for valid input\", () => {\n expect(loader.canHandle(validInput, SUPPORTED_TYPES)).toBe(true);\n });\n\n it(\"should return false for invalid expected type\", () => {\n expect(loader.canHandle(validInput, [ClearSignContextType.TOKEN])).toBe(\n false,\n );\n });\n\n it.each([\n [null, \"null input\"],\n [undefined, \"undefined input\"],\n [{}, \"empty object\"],\n [\"string\", \"string input\"],\n [123, \"number input\"],\n ])(\"should return false for %s\", (input, _description) => {\n expect(loader.canHandle(input, SUPPORTED_TYPES)).toBe(false);\n });\n\n it.each([\n [{ ...validInput, from: undefined }, \"missing from\"],\n [{ ...validInput, chainId: undefined }, \"missing chainId\"],\n [{ ...validInput, transaction: undefined }, \"missing transaction\"],\n [{ ...validInput, deviceModelId: undefined }, \"missing deviceModelId\"],\n ])(\"should return false for %s\", (input, _description) => {\n expect(loader.canHandle(input, SUPPORTED_TYPES)).toBe(false);\n });\n\n it.each([\n [{ ...validInput, from: \"invalid-hex\" }, \"invalid from hex\"],\n [{ ...validInput, from: \"0x\" }, \"empty from hex\"],\n [{ ...validInput, from: \"not-hex\" }, \"non-hex from\"],\n ])(\"should return false for %s\", (input, _description) => {\n expect(loader.canHandle(input, SUPPORTED_TYPES)).toBe(false);\n });\n\n it(\"should return false for NANO_S device model\", () => {\n const inputWithNanoS = {\n ...validInput,\n deviceModelId: DeviceModelId.NANO_S,\n };\n expect(loader.canHandle(inputWithNanoS, SUPPORTED_TYPES)).toBe(false);\n });\n\n it(\"should return false for non-number chainId\", () => {\n const inputWithInvalidChainId = {\n ...validInput,\n chainId: \"not-a-number\" as unknown as number,\n };\n expect(loader.canHandle(inputWithInvalidChainId, SUPPORTED_TYPES)).toBe(\n false,\n );\n });\n });\n\n describe(\"load function\", () => {\n const validInput: TransactionCheckContextInput = {\n from: \"0x1234567890123456789012345678901234567890\",\n chainId: 1,\n transaction: new Uint8Array([1, 2, 3]),\n deviceModelId: DeviceModelId.FLEX,\n };\n\n const mockCertificate = {\n descriptor: \"cert-descriptor\",\n signature: \"cert-signature\",\n keyUsageNumber: 0,\n payload: new Uint8Array(),\n };\n\n it(\"should return empty array when from is empty\", async () => {\n const inputWithEmptyFrom = { ...validInput, from: \"\" };\n const result = await loader.load(inputWithEmptyFrom);\n expect(result).toEqual([]);\n });\n\n it(\"should return error context when transaction check fails\", async () => {\n const error = new Error(\"Transaction check failed\");\n vi.spyOn(\n mockTransactionCheckDataSource,\n \"getTransactionCheck\",\n ).mockResolvedValue(Left(error));\n\n const result = await loader.load(validInput);\n\n expect(result).toEqual([\n {\n type: ClearSignContextType.ERROR,\n error,\n },\n ]);\n });\n\n it(\"should return transaction check context when successful\", async () => {\n const transactionCheckData = {\n publicKeyId: \"test-key-id\",\n descriptor: \"test-descriptor\",\n };\n vi.spyOn(\n mockTransactionCheckDataSource,\n \"getTransactionCheck\",\n ).mockResolvedValue(Right(transactionCheckData));\n vi.spyOn(mockCertificateLoader, \"loadCertificate\").mockResolvedValue(\n mockCertificate,\n );\n\n const result = await loader.load(validInput);\n\n expect(\n mockTransactionCheckDataSource.getTransactionCheck,\n ).toHaveBeenCalledWith({\n chainId: validInput.chainId,\n rawTx: \"0x010203\",\n from: validInput.from,\n });\n\n expect(mockCertificateLoader.loadCertificate).toHaveBeenCalledWith({\n keyId: transactionCheckData.publicKeyId,\n keyUsage: KeyUsage.TxSimulationSigner,\n targetDevice: validInput.deviceModelId,\n });\n\n expect(result).toEqual([\n {\n type: ClearSignContextType.TRANSACTION_CHECK,\n payload: transactionCheckData.descriptor,\n certificate: mockCertificate,\n },\n ]);\n });\n\n it(\"should handle certificate loading failure\", async () => {\n const transactionCheckData = {\n publicKeyId: \"test-key-id\",\n descriptor: \"test-descriptor\",\n };\n const certificateError = new Error(\"Certificate loading failed\");\n\n vi.spyOn(\n mockTransactionCheckDataSource,\n \"getTransactionCheck\",\n ).mockResolvedValue(Right(transactionCheckData));\n vi.spyOn(mockCertificateLoader, \"loadCertificate\").mockRejectedValue(\n certificateError,\n );\n\n await expect(loader.load(validInput)).rejects.toThrow(certificateError);\n });\n\n it(\"should convert transaction buffer to hex string correctly\", async () => {\n const transactionCheckData = {\n publicKeyId: \"test-key-id\",\n descriptor: \"test-descriptor\",\n };\n vi.spyOn(\n mockTransactionCheckDataSource,\n \"getTransactionCheck\",\n ).mockResolvedValue(Right(transactionCheckData));\n vi.spyOn(mockCertificateLoader, \"loadCertificate\").mockResolvedValue(\n mockCertificate,\n );\n\n await loader.load(validInput);\n\n expect(\n mockTransactionCheckDataSource.getTransactionCheck,\n ).toHaveBeenCalledWith({\n chainId: validInput.chainId,\n rawTx: \"0x010203\", // Uint8Array([1, 2, 3]) converted to hex\n from: validInput.from,\n });\n });\n });\n});\n"],
5
- "mappings": "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",
6
- "names": ["DeviceModelId", "Left", "Right", "KeyUsage", "ClearSignContextType", "TransactionCheckContextLoader", "mockTransactionCheckDataSource", "mockCertificateLoader", "loader", "SUPPORTED_TYPES", "validInput", "input", "_description", "inputWithNanoS", "inputWithInvalidChainId", "mockCertificate", "inputWithEmptyFrom", "result", "error", "transactionCheckData", "certificateError"]
4
+ "sourcesContent": ["import { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\n\nimport type { PkiCertificateLoader } from \"@/pki/domain/PkiCertificateLoader\";\nimport { KeyUsage } from \"@/pki/model/KeyUsage\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\nimport { type TransactionCheckDataSource } from \"@/transaction-check/data/TransactionCheckDataSource\";\nimport {\n type TransactionCheckContextInput,\n TransactionCheckContextLoader,\n} from \"@/transaction-check/domain/TransactionCheckContextLoader\";\n\nconst mockLoggerFactory = () => ({\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n});\n\ndescribe(\"TransactionCheckContextLoader\", () => {\n const mockTransactionCheckDataSource: TransactionCheckDataSource = {\n getTransactionCheck: vi.fn(),\n };\n const mockCertificateLoader: PkiCertificateLoader = {\n loadCertificate: vi.fn(),\n };\n const loader = new TransactionCheckContextLoader(\n mockTransactionCheckDataSource,\n mockCertificateLoader,\n mockLoggerFactory,\n );\n\n const SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.TRANSACTION_CHECK,\n ];\n\n beforeEach(() => {\n vi.resetAllMocks();\n });\n\n describe(\"canHandle function\", () => {\n const validInput: TransactionCheckContextInput = {\n from: \"0x1234567890123456789012345678901234567890\",\n chainId: 1,\n transaction: new Uint8Array([1, 2, 3]),\n deviceModelId: DeviceModelId.FLEX,\n };\n\n it(\"should return true for valid input\", () => {\n expect(loader.canHandle(validInput, SUPPORTED_TYPES)).toBe(true);\n });\n\n it(\"should return false for invalid expected type\", () => {\n expect(loader.canHandle(validInput, [ClearSignContextType.TOKEN])).toBe(\n false,\n );\n });\n\n it.each([\n [null, \"null input\"],\n [undefined, \"undefined input\"],\n [{}, \"empty object\"],\n [\"string\", \"string input\"],\n [123, \"number input\"],\n ])(\"should return false for %s\", (input, _description) => {\n expect(loader.canHandle(input, SUPPORTED_TYPES)).toBe(false);\n });\n\n it.each([\n [{ ...validInput, from: undefined }, \"missing from\"],\n [{ ...validInput, chainId: undefined }, \"missing chainId\"],\n [{ ...validInput, transaction: undefined }, \"missing transaction\"],\n [{ ...validInput, deviceModelId: undefined }, \"missing deviceModelId\"],\n ])(\"should return false for %s\", (input, _description) => {\n expect(loader.canHandle(input, SUPPORTED_TYPES)).toBe(false);\n });\n\n it.each([\n [{ ...validInput, from: \"invalid-hex\" }, \"invalid from hex\"],\n [{ ...validInput, from: \"0x\" }, \"empty from hex\"],\n [{ ...validInput, from: \"not-hex\" }, \"non-hex from\"],\n ])(\"should return false for %s\", (input, _description) => {\n expect(loader.canHandle(input, SUPPORTED_TYPES)).toBe(false);\n });\n\n it(\"should return false for NANO_S device model\", () => {\n const inputWithNanoS = {\n ...validInput,\n deviceModelId: DeviceModelId.NANO_S,\n };\n expect(loader.canHandle(inputWithNanoS, SUPPORTED_TYPES)).toBe(false);\n });\n\n it(\"should return false for non-number chainId\", () => {\n const inputWithInvalidChainId = {\n ...validInput,\n chainId: \"not-a-number\" as unknown as number,\n };\n expect(loader.canHandle(inputWithInvalidChainId, SUPPORTED_TYPES)).toBe(\n false,\n );\n });\n });\n\n describe(\"load function\", () => {\n const validInput: TransactionCheckContextInput = {\n from: \"0x1234567890123456789012345678901234567890\",\n chainId: 1,\n transaction: new Uint8Array([1, 2, 3]),\n deviceModelId: DeviceModelId.FLEX,\n };\n\n const mockCertificate = {\n descriptor: \"cert-descriptor\",\n signature: \"cert-signature\",\n keyUsageNumber: 0,\n payload: new Uint8Array(),\n };\n\n it(\"should return empty array when from is empty\", async () => {\n const inputWithEmptyFrom = { ...validInput, from: \"\" };\n const result = await loader.load(inputWithEmptyFrom);\n expect(result).toEqual([]);\n });\n\n it(\"should return error context when transaction check fails\", async () => {\n const error = new Error(\"Transaction check failed\");\n vi.spyOn(\n mockTransactionCheckDataSource,\n \"getTransactionCheck\",\n ).mockResolvedValue(Left(error));\n\n const result = await loader.load(validInput);\n\n expect(result).toEqual([\n {\n type: ClearSignContextType.ERROR,\n error,\n },\n ]);\n });\n\n it(\"should return transaction check context when successful\", async () => {\n const transactionCheckData = {\n publicKeyId: \"test-key-id\",\n descriptor: \"test-descriptor\",\n };\n vi.spyOn(\n mockTransactionCheckDataSource,\n \"getTransactionCheck\",\n ).mockResolvedValue(Right(transactionCheckData));\n vi.spyOn(mockCertificateLoader, \"loadCertificate\").mockResolvedValue(\n mockCertificate,\n );\n\n const result = await loader.load(validInput);\n\n expect(\n mockTransactionCheckDataSource.getTransactionCheck,\n ).toHaveBeenCalledWith({\n chainId: validInput.chainId,\n rawTx: \"0x010203\",\n from: validInput.from,\n });\n\n expect(mockCertificateLoader.loadCertificate).toHaveBeenCalledWith({\n keyId: transactionCheckData.publicKeyId,\n keyUsage: KeyUsage.TxSimulationSigner,\n targetDevice: validInput.deviceModelId,\n });\n\n expect(result).toEqual([\n {\n type: ClearSignContextType.TRANSACTION_CHECK,\n payload: transactionCheckData.descriptor,\n certificate: mockCertificate,\n },\n ]);\n });\n\n it(\"should handle certificate loading failure\", async () => {\n const transactionCheckData = {\n publicKeyId: \"test-key-id\",\n descriptor: \"test-descriptor\",\n };\n const certificateError = new Error(\"Certificate loading failed\");\n\n vi.spyOn(\n mockTransactionCheckDataSource,\n \"getTransactionCheck\",\n ).mockResolvedValue(Right(transactionCheckData));\n vi.spyOn(mockCertificateLoader, \"loadCertificate\").mockRejectedValue(\n certificateError,\n );\n\n await expect(loader.load(validInput)).rejects.toThrow(certificateError);\n });\n\n it(\"should convert transaction buffer to hex string correctly\", async () => {\n const transactionCheckData = {\n publicKeyId: \"test-key-id\",\n descriptor: \"test-descriptor\",\n };\n vi.spyOn(\n mockTransactionCheckDataSource,\n \"getTransactionCheck\",\n ).mockResolvedValue(Right(transactionCheckData));\n vi.spyOn(mockCertificateLoader, \"loadCertificate\").mockResolvedValue(\n mockCertificate,\n );\n\n await loader.load(validInput);\n\n expect(\n mockTransactionCheckDataSource.getTransactionCheck,\n ).toHaveBeenCalledWith({\n chainId: validInput.chainId,\n rawTx: \"0x010203\", // Uint8Array([1, 2, 3]) converted to hex\n from: validInput.from,\n });\n });\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["DeviceModelId", "Left", "Right", "KeyUsage", "ClearSignContextType", "TransactionCheckContextLoader", "mockLoggerFactory", "mockTransactionCheckDataSource", "mockCertificateLoader", "loader", "SUPPORTED_TYPES", "validInput", "input", "_description", "inputWithNanoS", "inputWithInvalidChainId", "mockCertificate", "inputWithEmptyFrom", "result", "error", "transactionCheckData", "certificateError"]
7
7
  }
@@ -1,2 +1,2 @@
1
- var f=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var p=(i,e,t,a)=>{for(var o=a>1?void 0:a?y(e,t):e,c=i.length-1,r;c>=0;c--)(r=i[c])&&(o=(a?r(e,t,o):r(o))||o);return a&&o&&f(e,t,o),o},n=(i,e)=>(t,a)=>e(t,a,i);import{DeviceModelId as l,isHexaString as S}from"@ledgerhq/device-management-kit";import{inject as m,injectable as T}from"inversify";import{pkiTypes as D}from"../../pki/di/pkiTypes";import{KeyUsage as k}from"../../pki/model/KeyUsage";import{ClearSignContextType as C}from"../../shared/model/ClearSignContext";import{transactionCheckTypes as x}from"../../transaction-check/di/transactionCheckTypes";const I=[C.TRANSACTION_CHECK];let d=class{constructor(e,t){this.typedDataCheckDataSource=e;this.certificateLoader=t}canHandle(e,t){return typeof e=="object"&&e!==null&&"from"in e&&e.from!==void 0&&S(e.from)&&e.from!=="0x"&&"data"in e&&typeof e.data=="object"&&"deviceModelId"in e&&e.deviceModelId!==void 0&&e.deviceModelId!==l.NANO_S&&I.every(o=>t.includes(o))}async load(e){const{from:t,data:a}=e;return!t||!a?[]:[await(await this.typedDataCheckDataSource.getTypedDataCheck({data:a,from:t})).caseOf({Left:r=>Promise.resolve({type:C.ERROR,error:r}),Right:async r=>{const s=await this.certificateLoader.loadCertificate({keyId:r.publicKeyId,keyUsage:k.TxSimulationSigner,targetDevice:e.deviceModelId});return{type:C.TRANSACTION_CHECK,payload:r.descriptor,certificate:s}}})]}};d=p([T(),n(0,m(x.TypedDataCheckDataSource)),n(1,m(D.PkiCertificateLoader))],d);export{d as TypedDataCheckContextLoader};
1
+ var m=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var C=(i,e,r,t)=>{for(var o=t>1?void 0:t?y(e,r):e,c=i.length-1,a;c>=0;c--)(a=i[c])&&(o=(t?a(e,r,o):a(o))||o);return t&&o&&m(e,r,o),o},n=(i,e)=>(r,t)=>e(r,t,i);import{DeviceModelId as f,isHexaString as u}from"@ledgerhq/device-management-kit";import{inject as l,injectable as S}from"inversify";import{configTypes as T}from"../../config/di/configTypes";import{pkiTypes as h}from"../../pki/di/pkiTypes";import{KeyUsage as x}from"../../pki/model/KeyUsage";import{ClearSignContextType as p}from"../../shared/model/ClearSignContext";import{transactionCheckTypes as D}from"../../transaction-check/di/transactionCheckTypes";const k=[p.TRANSACTION_CHECK];let s=class{constructor(e,r,t){this.typedDataCheckDataSource=e;this.certificateLoader=r;this.logger=t("TypedDataCheckContextLoader")}logger;canHandle(e,r){return typeof e=="object"&&e!==null&&"from"in e&&e.from!==void 0&&u(e.from)&&e.from!=="0x"&&"data"in e&&typeof e.data=="object"&&"deviceModelId"in e&&e.deviceModelId!==void 0&&e.deviceModelId!==f.NANO_S&&k.every(o=>r.includes(o))}async load(e){const{from:r,data:t}=e;if(!r||!t)return this.logger.debug("load result",{data:{result:[]}}),[];const a=[await(await this.typedDataCheckDataSource.getTypedDataCheck({data:t,from:r})).caseOf({Left:d=>Promise.resolve({type:p.ERROR,error:d}),Right:async d=>{const g=await this.certificateLoader.loadCertificate({keyId:d.publicKeyId,keyUsage:x.TxSimulationSigner,targetDevice:e.deviceModelId});return{type:p.TRANSACTION_CHECK,payload:d.descriptor,certificate:g}}})];return this.logger.debug("load result",{data:{result:a}}),a}};s=C([S(),n(0,l(D.TypedDataCheckDataSource)),n(1,l(h.PkiCertificateLoader)),n(2,l(T.ContextModuleLoggerFactory))],s);export{s as TypedDataCheckContextLoader};
2
2
  //# sourceMappingURL=TypedDataCheckContextLoader.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/transaction-check/domain/TypedDataCheckContextLoader.ts"],
4
- "sourcesContent": ["import { DeviceModelId, isHexaString } from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\n\nimport { pkiTypes } from \"@/pki/di/pkiTypes\";\nimport { type PkiCertificateLoader } from \"@/pki/domain/PkiCertificateLoader\";\nimport { KeyUsage } from \"@/pki/model/KeyUsage\";\nimport { ContextLoader } from \"@/shared/domain/ContextLoader\";\nimport {\n ClearSignContext,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\nimport {\n TypedData,\n type TypedDataCheckDataSource,\n} from \"@/transaction-check/data/TypedDataCheckDataSource\";\nimport { transactionCheckTypes } from \"@/transaction-check/di/transactionCheckTypes\";\n\nexport type TypedDataCheckContextInput = {\n from: string;\n data: TypedData;\n deviceModelId: DeviceModelId;\n};\n\nconst SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.TRANSACTION_CHECK,\n];\n\n@injectable()\nexport class TypedDataCheckContextLoader\n implements ContextLoader<TypedDataCheckContextInput>\n{\n constructor(\n @inject(transactionCheckTypes.TypedDataCheckDataSource)\n private typedDataCheckDataSource: TypedDataCheckDataSource,\n @inject(pkiTypes.PkiCertificateLoader)\n private certificateLoader: PkiCertificateLoader,\n ) {}\n\n canHandle(\n input: unknown,\n expectedType: ClearSignContextType[],\n ): input is TypedDataCheckContextInput {\n const result =\n typeof input === \"object\" &&\n input !== null &&\n \"from\" in input &&\n input.from !== undefined &&\n isHexaString(input.from) &&\n input.from !== \"0x\" &&\n \"data\" in input &&\n typeof input.data === \"object\" &&\n \"deviceModelId\" in input &&\n input.deviceModelId !== undefined &&\n input.deviceModelId !== DeviceModelId.NANO_S &&\n SUPPORTED_TYPES.every((type) => expectedType.includes(type));\n\n return result;\n }\n\n async load(ctx: TypedDataCheckContextInput): Promise<ClearSignContext[]> {\n const { from, data } = ctx;\n\n if (!from || !data) {\n return [];\n }\n\n const txCheck = await this.typedDataCheckDataSource.getTypedDataCheck({\n data,\n from,\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 (result) => {\n const certificate = await this.certificateLoader.loadCertificate({\n keyId: result.publicKeyId,\n keyUsage: KeyUsage.TxSimulationSigner,\n targetDevice: ctx.deviceModelId,\n });\n\n return {\n type: ClearSignContextType.TRANSACTION_CHECK,\n payload: result.descriptor,\n certificate,\n };\n },\n });\n\n return [context];\n }\n}\n"],
5
- "mappings": "iOAAA,OAAS,iBAAAA,EAAe,gBAAAC,MAAoB,kCAC5C,OAAS,UAAAC,EAAQ,cAAAC,MAAkB,YAEnC,OAAS,YAAAC,MAAgB,oBAEzB,OAAS,YAAAC,MAAgB,uBAEzB,OAEE,wBAAAC,MACK,kCAKP,OAAS,yBAAAC,MAA6B,+CAQtC,MAAMC,EAA0C,CAC9CC,EAAqB,iBACvB,EAGO,IAAMC,EAAN,KAEP,CACE,YAEUC,EAEAC,EACR,CAHQ,8BAAAD,EAEA,uBAAAC,CACP,CAEH,UACEC,EACAC,EACqC,CAerC,OAbE,OAAOD,GAAU,UACjBA,IAAU,MACV,SAAUA,GACVA,EAAM,OAAS,QACfE,EAAaF,EAAM,IAAI,GACvBA,EAAM,OAAS,MACf,SAAUA,GACV,OAAOA,EAAM,MAAS,UACtB,kBAAmBA,GACnBA,EAAM,gBAAkB,QACxBA,EAAM,gBAAkBG,EAAc,QACtCR,EAAgB,MAAOS,GAASH,EAAa,SAASG,CAAI,CAAC,CAG/D,CAEA,MAAM,KAAKC,EAA8D,CACvE,KAAM,CAAE,KAAAC,EAAM,KAAAC,CAAK,EAAIF,EAEvB,MAAI,CAACC,GAAQ,CAACC,EACL,CAAC,EA6BH,CArBS,MALA,MAAM,KAAK,yBAAyB,kBAAkB,CACpE,KAAAA,EACA,KAAAD,CACF,CAAC,GAE6B,OAAkC,CAC9D,KAAOE,GACL,QAAQ,QAAQ,CACd,KAAMZ,EAAqB,MAC3B,MAAAY,CACF,CAAC,EACH,MAAO,MAAOC,GAAW,CACvB,MAAMC,EAAc,MAAM,KAAK,kBAAkB,gBAAgB,CAC/D,MAAOD,EAAO,YACd,SAAUE,EAAS,mBACnB,aAAcN,EAAI,aACpB,CAAC,EAED,MAAO,CACL,KAAMT,EAAqB,kBAC3B,QAASa,EAAO,WAChB,YAAAC,CACF,CACF,CACF,CAAC,CAEc,CACjB,CACF,EAlEab,EAANe,EAAA,CADNC,EAAW,EAKPC,EAAA,EAAAC,EAAOC,EAAsB,wBAAwB,GAErDF,EAAA,EAAAC,EAAOE,EAAS,oBAAoB,IAN5BpB",
6
- "names": ["DeviceModelId", "isHexaString", "inject", "injectable", "pkiTypes", "KeyUsage", "ClearSignContextType", "transactionCheckTypes", "SUPPORTED_TYPES", "ClearSignContextType", "TypedDataCheckContextLoader", "typedDataCheckDataSource", "certificateLoader", "input", "expectedType", "isHexaString", "DeviceModelId", "type", "ctx", "from", "data", "error", "result", "certificate", "KeyUsage", "__decorateClass", "injectable", "__decorateParam", "inject", "transactionCheckTypes", "pkiTypes"]
4
+ "sourcesContent": ["import {\n DeviceModelId,\n isHexaString,\n LoggerPublisherService,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { pkiTypes } from \"@/pki/di/pkiTypes\";\nimport { type PkiCertificateLoader } from \"@/pki/domain/PkiCertificateLoader\";\nimport { KeyUsage } from \"@/pki/model/KeyUsage\";\nimport { ContextLoader } from \"@/shared/domain/ContextLoader\";\nimport {\n ClearSignContext,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\nimport {\n TypedData,\n type TypedDataCheckDataSource,\n} from \"@/transaction-check/data/TypedDataCheckDataSource\";\nimport { transactionCheckTypes } from \"@/transaction-check/di/transactionCheckTypes\";\n\nexport type TypedDataCheckContextInput = {\n from: string;\n data: TypedData;\n deviceModelId: DeviceModelId;\n};\n\nconst SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.TRANSACTION_CHECK,\n];\n\n@injectable()\nexport class TypedDataCheckContextLoader\n implements ContextLoader<TypedDataCheckContextInput>\n{\n private logger: LoggerPublisherService;\n\n constructor(\n @inject(transactionCheckTypes.TypedDataCheckDataSource)\n private typedDataCheckDataSource: TypedDataCheckDataSource,\n @inject(pkiTypes.PkiCertificateLoader)\n private certificateLoader: PkiCertificateLoader,\n @inject(configTypes.ContextModuleLoggerFactory)\n loggerFactory: (tag: string) => LoggerPublisherService,\n ) {\n this.logger = loggerFactory(\"TypedDataCheckContextLoader\");\n }\n\n canHandle(\n input: unknown,\n expectedType: ClearSignContextType[],\n ): input is TypedDataCheckContextInput {\n const result =\n typeof input === \"object\" &&\n input !== null &&\n \"from\" in input &&\n input.from !== undefined &&\n isHexaString(input.from) &&\n input.from !== \"0x\" &&\n \"data\" in input &&\n typeof input.data === \"object\" &&\n \"deviceModelId\" in input &&\n input.deviceModelId !== undefined &&\n input.deviceModelId !== DeviceModelId.NANO_S &&\n SUPPORTED_TYPES.every((type) => expectedType.includes(type));\n\n return result;\n }\n\n async load(ctx: TypedDataCheckContextInput): Promise<ClearSignContext[]> {\n const { from, data } = ctx;\n\n if (!from || !data) {\n this.logger.debug(\"load result\", { data: { result: [] } });\n return [];\n }\n\n const txCheck = await this.typedDataCheckDataSource.getTypedDataCheck({\n data,\n from,\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 (checkResult) => {\n const certificate = await this.certificateLoader.loadCertificate({\n keyId: checkResult.publicKeyId,\n keyUsage: KeyUsage.TxSimulationSigner,\n targetDevice: ctx.deviceModelId,\n });\n\n return {\n type: ClearSignContextType.TRANSACTION_CHECK,\n payload: checkResult.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": "iOAAA,OACE,iBAAAA,EACA,gBAAAC,MAEK,kCACP,OAAS,UAAAC,EAAQ,cAAAC,MAAkB,YAEnC,OAAS,eAAAC,MAAmB,0BAC5B,OAAS,YAAAC,MAAgB,oBAEzB,OAAS,YAAAC,MAAgB,uBAEzB,OAEE,wBAAAC,MACK,kCAKP,OAAS,yBAAAC,MAA6B,+CAQtC,MAAMC,EAA0C,CAC9CC,EAAqB,iBACvB,EAGO,IAAMC,EAAN,KAEP,CAGE,YAEUC,EAEAC,EAERC,EACA,CALQ,8BAAAF,EAEA,uBAAAC,EAIR,KAAK,OAASC,EAAc,6BAA6B,CAC3D,CAXQ,OAaR,UACEC,EACAC,EACqC,CAerC,OAbE,OAAOD,GAAU,UACjBA,IAAU,MACV,SAAUA,GACVA,EAAM,OAAS,QACfE,EAAaF,EAAM,IAAI,GACvBA,EAAM,OAAS,MACf,SAAUA,GACV,OAAOA,EAAM,MAAS,UACtB,kBAAmBA,GACnBA,EAAM,gBAAkB,QACxBA,EAAM,gBAAkBG,EAAc,QACtCT,EAAgB,MAAOU,GAASH,EAAa,SAASG,CAAI,CAAC,CAG/D,CAEA,MAAM,KAAKC,EAA8D,CACvE,KAAM,CAAE,KAAAC,EAAM,KAAAC,CAAK,EAAIF,EAEvB,GAAI,CAACC,GAAQ,CAACC,EACZ,YAAK,OAAO,MAAM,cAAe,CAAE,KAAM,CAAE,OAAQ,CAAC,CAAE,CAAE,CAAC,EAClD,CAAC,EA6BV,MAAMC,EAAS,CArBC,MALA,MAAM,KAAK,yBAAyB,kBAAkB,CACpE,KAAAD,EACA,KAAAD,CACF,CAAC,GAE6B,OAAkC,CAC9D,KAAOG,GACL,QAAQ,QAAQ,CACd,KAAMd,EAAqB,MAC3B,MAAAc,CACF,CAAC,EACH,MAAO,MAAOC,GAAgB,CAC5B,MAAMC,EAAc,MAAM,KAAK,kBAAkB,gBAAgB,CAC/D,MAAOD,EAAY,YACnB,SAAUE,EAAS,mBACnB,aAAcP,EAAI,aACpB,CAAC,EAED,MAAO,CACL,KAAMV,EAAqB,kBAC3B,QAASe,EAAY,WACrB,YAAAC,CACF,CACF,CACF,CAAC,CAEsB,EACvB,YAAK,OAAO,MAAM,cAAe,CAAE,KAAM,CAAE,OAAAH,CAAO,CAAE,CAAC,EAC9CA,CACT,CACF,EA3EaZ,EAANiB,EAAA,CADNC,EAAW,EAOPC,EAAA,EAAAC,EAAOC,EAAsB,wBAAwB,GAErDF,EAAA,EAAAC,EAAOE,EAAS,oBAAoB,GAEpCH,EAAA,EAAAC,EAAOG,EAAY,0BAA0B,IAVrCvB",
6
+ "names": ["DeviceModelId", "isHexaString", "inject", "injectable", "configTypes", "pkiTypes", "KeyUsage", "ClearSignContextType", "transactionCheckTypes", "SUPPORTED_TYPES", "ClearSignContextType", "TypedDataCheckContextLoader", "typedDataCheckDataSource", "certificateLoader", "loggerFactory", "input", "expectedType", "isHexaString", "DeviceModelId", "type", "ctx", "from", "data", "result", "error", "checkResult", "certificate", "KeyUsage", "__decorateClass", "injectable", "__decorateParam", "inject", "transactionCheckTypes", "pkiTypes", "configTypes"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{DeviceModelId as l}from"@ledgerhq/device-management-kit";import{Left as y,Right as p}from"purify-ts";import{KeyUsage as m}from"../../pki/model/KeyUsage";import{ClearSignContextType as c}from"../../shared/model/ClearSignContext";import{TypedDataCheckContextLoader as u}from"../../transaction-check/domain/TypedDataCheckContextLoader";describe("TypedDataCheckContextLoader",()=>{const o={getTypedDataCheck:vi.fn()},d={loadCertificate:vi.fn()},n=new u(o,d),r=[c.TRANSACTION_CHECK];beforeEach(()=>{vi.resetAllMocks()}),describe("canHandle function",()=>{const e={from:"0x1234567890123456789012345678901234567890",data:{domain:{name:"Test Domain",version:"1",chainId:1,verifyingContract:"0x1234567890123456789012345678901234567890"},types:{EIP712Domain:[{name:"name",type:"string"},{name:"version",type:"string"},{name:"chainId",type:"uint256"},{name:"verifyingContract",type:"address"}],Person:[{name:"name",type:"string"},{name:"wallet",type:"address"}]},primaryType:"Person",message:{name:"Alice",wallet:"0x1234567890123456789012345678901234567890"}},deviceModelId:l.FLEX};it("should return true for valid input",()=>{expect(n.canHandle(e,r)).toBe(!0)}),it("should return false for invalid expected type",()=>{expect(n.canHandle(e,[c.TOKEN])).toBe(!1)}),it.each([[null,"null input"],[void 0,"undefined input"],[{},"empty object"],["string","string input"],[123,"number input"]])("should return false for %s",(a,t)=>{expect(n.canHandle(a,r)).toBe(!1)}),it.each([[{...e,from:void 0},"missing from"],[{...e,data:void 0},"missing data"],[{...e,deviceModelId:void 0},"missing deviceModelId"]])("should return false for %s",(a,t)=>{expect(n.canHandle(a,r)).toBe(!1)}),it.each([[{...e,from:"invalid-hex"},"invalid from hex"],[{...e,from:"0x"},"empty from hex"],[{...e,from:"not-hex"},"non-hex from"]])("should return false for %s",(a,t)=>{expect(n.canHandle(a,r)).toBe(!1)}),it("should return false for NANO_S device model",()=>{const a={...e,deviceModelId:l.NANO_S};expect(n.canHandle(a,r)).toBe(!1)}),it("should return false for non-object data",()=>{const a={...e,data:"not-an-object"};expect(n.canHandle(a,r)).toBe(!1)})}),describe("load function",()=>{const s={domain:{name:"Test Domain",version:"1",chainId:1,verifyingContract:"0x1234567890123456789012345678901234567890"},types:{EIP712Domain:[{name:"name",type:"string"},{name:"version",type:"string"},{name:"chainId",type:"uint256"},{name:"verifyingContract",type:"address"}],Person:[{name:"name",type:"string"},{name:"wallet",type:"address"}]},primaryType:"Person",message:{name:"Alice",wallet:"0x1234567890123456789012345678901234567890"}},e={from:"0x1234567890123456789012345678901234567890",data:s,deviceModelId:l.FLEX},a={descriptor:"cert-descriptor",signature:"cert-signature",keyUsageNumber:0,payload:new Uint8Array};it("should return empty array when from is empty",async()=>{const t={...e,from:""},i=await n.load(t);expect(i).toEqual([])}),it("should return error context when typed data check fails",async()=>{const t=new Error("Typed data check failed");vi.spyOn(o,"getTypedDataCheck").mockResolvedValue(y(t));const i=await n.load(e);expect(i).toEqual([{type:c.ERROR,error:t}])}),it("should return transaction check context when successful",async()=>{const t={publicKeyId:"test-key-id",descriptor:"test-descriptor"};vi.spyOn(o,"getTypedDataCheck").mockResolvedValue(p(t)),vi.spyOn(d,"loadCertificate").mockResolvedValue(a);const i=await n.load(e);expect(o.getTypedDataCheck).toHaveBeenCalledWith({data:e.data,from:e.from}),expect(d.loadCertificate).toHaveBeenCalledWith({keyId:t.publicKeyId,keyUsage:m.TxSimulationSigner,targetDevice:e.deviceModelId}),expect(i).toEqual([{type:c.TRANSACTION_CHECK,payload:t.descriptor,certificate:a}])}),it("should handle certificate loading failure",async()=>{const t={publicKeyId:"test-key-id",descriptor:"test-descriptor"},i=new Error("Certificate loading failed");vi.spyOn(o,"getTypedDataCheck").mockResolvedValue(p(t)),vi.spyOn(d,"loadCertificate").mockRejectedValue(i),await expect(n.load(e)).rejects.toThrow(i)}),it("should call typed data check with correct parameters",async()=>{const t={publicKeyId:"test-key-id",descriptor:"test-descriptor"};vi.spyOn(o,"getTypedDataCheck").mockResolvedValue(p(t)),vi.spyOn(d,"loadCertificate").mockResolvedValue(a),await n.load(e),expect(o.getTypedDataCheck).toHaveBeenCalledWith({data:s,from:e.from})})})});
1
+ import{DeviceModelId as l}from"@ledgerhq/device-management-kit";import{Left as y,Right as p}from"purify-ts";import{KeyUsage as m}from"../../pki/model/KeyUsage";import{ClearSignContextType as c}from"../../shared/model/ClearSignContext";import{TypedDataCheckContextLoader as f}from"../../transaction-check/domain/TypedDataCheckContextLoader";const u=()=>({debug:vi.fn(),info:vi.fn(),warn:vi.fn(),error:vi.fn(),subscribers:[]});describe("TypedDataCheckContextLoader",()=>{const o={getTypedDataCheck:vi.fn()},d={loadCertificate:vi.fn()},n=new f(o,d,u),r=[c.TRANSACTION_CHECK];beforeEach(()=>{vi.resetAllMocks()}),describe("canHandle function",()=>{const e={from:"0x1234567890123456789012345678901234567890",data:{domain:{name:"Test Domain",version:"1",chainId:1,verifyingContract:"0x1234567890123456789012345678901234567890"},types:{EIP712Domain:[{name:"name",type:"string"},{name:"version",type:"string"},{name:"chainId",type:"uint256"},{name:"verifyingContract",type:"address"}],Person:[{name:"name",type:"string"},{name:"wallet",type:"address"}]},primaryType:"Person",message:{name:"Alice",wallet:"0x1234567890123456789012345678901234567890"}},deviceModelId:l.FLEX};it("should return true for valid input",()=>{expect(n.canHandle(e,r)).toBe(!0)}),it("should return false for invalid expected type",()=>{expect(n.canHandle(e,[c.TOKEN])).toBe(!1)}),it.each([[null,"null input"],[void 0,"undefined input"],[{},"empty object"],["string","string input"],[123,"number input"]])("should return false for %s",(a,t)=>{expect(n.canHandle(a,r)).toBe(!1)}),it.each([[{...e,from:void 0},"missing from"],[{...e,data:void 0},"missing data"],[{...e,deviceModelId:void 0},"missing deviceModelId"]])("should return false for %s",(a,t)=>{expect(n.canHandle(a,r)).toBe(!1)}),it.each([[{...e,from:"invalid-hex"},"invalid from hex"],[{...e,from:"0x"},"empty from hex"],[{...e,from:"not-hex"},"non-hex from"]])("should return false for %s",(a,t)=>{expect(n.canHandle(a,r)).toBe(!1)}),it("should return false for NANO_S device model",()=>{const a={...e,deviceModelId:l.NANO_S};expect(n.canHandle(a,r)).toBe(!1)}),it("should return false for non-object data",()=>{const a={...e,data:"not-an-object"};expect(n.canHandle(a,r)).toBe(!1)})}),describe("load function",()=>{const s={domain:{name:"Test Domain",version:"1",chainId:1,verifyingContract:"0x1234567890123456789012345678901234567890"},types:{EIP712Domain:[{name:"name",type:"string"},{name:"version",type:"string"},{name:"chainId",type:"uint256"},{name:"verifyingContract",type:"address"}],Person:[{name:"name",type:"string"},{name:"wallet",type:"address"}]},primaryType:"Person",message:{name:"Alice",wallet:"0x1234567890123456789012345678901234567890"}},e={from:"0x1234567890123456789012345678901234567890",data:s,deviceModelId:l.FLEX},a={descriptor:"cert-descriptor",signature:"cert-signature",keyUsageNumber:0,payload:new Uint8Array};it("should return empty array when from is empty",async()=>{const t={...e,from:""},i=await n.load(t);expect(i).toEqual([])}),it("should return error context when typed data check fails",async()=>{const t=new Error("Typed data check failed");vi.spyOn(o,"getTypedDataCheck").mockResolvedValue(y(t));const i=await n.load(e);expect(i).toEqual([{type:c.ERROR,error:t}])}),it("should return transaction check context when successful",async()=>{const t={publicKeyId:"test-key-id",descriptor:"test-descriptor"};vi.spyOn(o,"getTypedDataCheck").mockResolvedValue(p(t)),vi.spyOn(d,"loadCertificate").mockResolvedValue(a);const i=await n.load(e);expect(o.getTypedDataCheck).toHaveBeenCalledWith({data:e.data,from:e.from}),expect(d.loadCertificate).toHaveBeenCalledWith({keyId:t.publicKeyId,keyUsage:m.TxSimulationSigner,targetDevice:e.deviceModelId}),expect(i).toEqual([{type:c.TRANSACTION_CHECK,payload:t.descriptor,certificate:a}])}),it("should handle certificate loading failure",async()=>{const t={publicKeyId:"test-key-id",descriptor:"test-descriptor"},i=new Error("Certificate loading failed");vi.spyOn(o,"getTypedDataCheck").mockResolvedValue(p(t)),vi.spyOn(d,"loadCertificate").mockRejectedValue(i),await expect(n.load(e)).rejects.toThrow(i)}),it("should call typed data check with correct parameters",async()=>{const t={publicKeyId:"test-key-id",descriptor:"test-descriptor"};vi.spyOn(o,"getTypedDataCheck").mockResolvedValue(p(t)),vi.spyOn(d,"loadCertificate").mockResolvedValue(a),await n.load(e),expect(o.getTypedDataCheck).toHaveBeenCalledWith({data:s,from:e.from})})})});
2
2
  //# sourceMappingURL=TypedDataCheckContextLoader.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/transaction-check/domain/TypedDataCheckContextLoader.test.ts"],
4
- "sourcesContent": ["import { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\n\nimport type { PkiCertificateLoader } from \"@/pki/domain/PkiCertificateLoader\";\nimport { KeyUsage } from \"@/pki/model/KeyUsage\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\nimport {\n type TypedData,\n type TypedDataCheckDataSource,\n} from \"@/transaction-check/data/TypedDataCheckDataSource\";\nimport {\n type TypedDataCheckContextInput,\n TypedDataCheckContextLoader,\n} from \"@/transaction-check/domain/TypedDataCheckContextLoader\";\n\ndescribe(\"TypedDataCheckContextLoader\", () => {\n const mockTypedDataCheckDataSource: TypedDataCheckDataSource = {\n getTypedDataCheck: vi.fn(),\n };\n const mockCertificateLoader: PkiCertificateLoader = {\n loadCertificate: vi.fn(),\n };\n const loader = new TypedDataCheckContextLoader(\n mockTypedDataCheckDataSource,\n mockCertificateLoader,\n );\n\n const SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.TRANSACTION_CHECK,\n ];\n\n beforeEach(() => {\n vi.resetAllMocks();\n });\n\n describe(\"canHandle function\", () => {\n const validTypedData: TypedData = {\n domain: {\n name: \"Test Domain\",\n version: \"1\",\n chainId: 1,\n verifyingContract: \"0x1234567890123456789012345678901234567890\",\n },\n types: {\n EIP712Domain: [\n { name: \"name\", type: \"string\" },\n { name: \"version\", type: \"string\" },\n { name: \"chainId\", type: \"uint256\" },\n { name: \"verifyingContract\", type: \"address\" },\n ],\n Person: [\n { name: \"name\", type: \"string\" },\n { name: \"wallet\", type: \"address\" },\n ],\n },\n primaryType: \"Person\",\n message: {\n name: \"Alice\",\n wallet: \"0x1234567890123456789012345678901234567890\",\n },\n };\n\n const validInput: TypedDataCheckContextInput = {\n from: \"0x1234567890123456789012345678901234567890\",\n data: validTypedData,\n deviceModelId: DeviceModelId.FLEX,\n };\n\n it(\"should return true for valid input\", () => {\n expect(loader.canHandle(validInput, SUPPORTED_TYPES)).toBe(true);\n });\n\n it(\"should return false for invalid expected type\", () => {\n expect(loader.canHandle(validInput, [ClearSignContextType.TOKEN])).toBe(\n false,\n );\n });\n\n it.each([\n [null, \"null input\"],\n [undefined, \"undefined input\"],\n [{}, \"empty object\"],\n [\"string\", \"string input\"],\n [123, \"number input\"],\n ])(\"should return false for %s\", (input, _description) => {\n expect(loader.canHandle(input, SUPPORTED_TYPES)).toBe(false);\n });\n\n it.each([\n [{ ...validInput, from: undefined }, \"missing from\"],\n [{ ...validInput, data: undefined }, \"missing data\"],\n [{ ...validInput, deviceModelId: undefined }, \"missing deviceModelId\"],\n ])(\"should return false for %s\", (input, _description) => {\n expect(loader.canHandle(input, SUPPORTED_TYPES)).toBe(false);\n });\n\n it.each([\n [{ ...validInput, from: \"invalid-hex\" }, \"invalid from hex\"],\n [{ ...validInput, from: \"0x\" }, \"empty from hex\"],\n [{ ...validInput, from: \"not-hex\" }, \"non-hex from\"],\n ])(\"should return false for %s\", (input, _description) => {\n expect(loader.canHandle(input, SUPPORTED_TYPES)).toBe(false);\n });\n\n it(\"should return false for NANO_S device model\", () => {\n const inputWithNanoS = {\n ...validInput,\n deviceModelId: DeviceModelId.NANO_S,\n };\n expect(loader.canHandle(inputWithNanoS, SUPPORTED_TYPES)).toBe(false);\n });\n\n it(\"should return false for non-object data\", () => {\n const inputWithInvalidData = {\n ...validInput,\n data: \"not-an-object\" as unknown as TypedData,\n };\n expect(loader.canHandle(inputWithInvalidData, SUPPORTED_TYPES)).toBe(\n false,\n );\n });\n });\n\n describe(\"load function\", () => {\n const validTypedData: TypedData = {\n domain: {\n name: \"Test Domain\",\n version: \"1\",\n chainId: 1,\n verifyingContract: \"0x1234567890123456789012345678901234567890\",\n },\n types: {\n EIP712Domain: [\n { name: \"name\", type: \"string\" },\n { name: \"version\", type: \"string\" },\n { name: \"chainId\", type: \"uint256\" },\n { name: \"verifyingContract\", type: \"address\" },\n ],\n Person: [\n { name: \"name\", type: \"string\" },\n { name: \"wallet\", type: \"address\" },\n ],\n },\n primaryType: \"Person\",\n message: {\n name: \"Alice\",\n wallet: \"0x1234567890123456789012345678901234567890\",\n },\n };\n\n const validInput: TypedDataCheckContextInput = {\n from: \"0x1234567890123456789012345678901234567890\",\n data: validTypedData,\n deviceModelId: DeviceModelId.FLEX,\n };\n\n const mockCertificate = {\n descriptor: \"cert-descriptor\",\n signature: \"cert-signature\",\n keyUsageNumber: 0,\n payload: new Uint8Array(),\n };\n\n it(\"should return empty array when from is empty\", async () => {\n const inputWithEmptyFrom = { ...validInput, from: \"\" };\n const result = await loader.load(inputWithEmptyFrom);\n expect(result).toEqual([]);\n });\n\n it(\"should return error context when typed data check fails\", async () => {\n const error = new Error(\"Typed data check failed\");\n vi.spyOn(\n mockTypedDataCheckDataSource,\n \"getTypedDataCheck\",\n ).mockResolvedValue(Left(error));\n\n const result = await loader.load(validInput);\n\n expect(result).toEqual([\n {\n type: ClearSignContextType.ERROR,\n error,\n },\n ]);\n });\n\n it(\"should return transaction check context when successful\", async () => {\n const typedDataCheckData = {\n publicKeyId: \"test-key-id\",\n descriptor: \"test-descriptor\",\n };\n vi.spyOn(\n mockTypedDataCheckDataSource,\n \"getTypedDataCheck\",\n ).mockResolvedValue(Right(typedDataCheckData));\n vi.spyOn(mockCertificateLoader, \"loadCertificate\").mockResolvedValue(\n mockCertificate,\n );\n\n const result = await loader.load(validInput);\n\n expect(\n mockTypedDataCheckDataSource.getTypedDataCheck,\n ).toHaveBeenCalledWith({\n data: validInput.data,\n from: validInput.from,\n });\n\n expect(mockCertificateLoader.loadCertificate).toHaveBeenCalledWith({\n keyId: typedDataCheckData.publicKeyId,\n keyUsage: KeyUsage.TxSimulationSigner,\n targetDevice: validInput.deviceModelId,\n });\n\n expect(result).toEqual([\n {\n type: ClearSignContextType.TRANSACTION_CHECK,\n payload: typedDataCheckData.descriptor,\n certificate: mockCertificate,\n },\n ]);\n });\n\n it(\"should handle certificate loading failure\", async () => {\n const typedDataCheckData = {\n publicKeyId: \"test-key-id\",\n descriptor: \"test-descriptor\",\n };\n const certificateError = new Error(\"Certificate loading failed\");\n\n vi.spyOn(\n mockTypedDataCheckDataSource,\n \"getTypedDataCheck\",\n ).mockResolvedValue(Right(typedDataCheckData));\n vi.spyOn(mockCertificateLoader, \"loadCertificate\").mockRejectedValue(\n certificateError,\n );\n\n await expect(loader.load(validInput)).rejects.toThrow(certificateError);\n });\n\n it(\"should call typed data check with correct parameters\", async () => {\n const typedDataCheckData = {\n publicKeyId: \"test-key-id\",\n descriptor: \"test-descriptor\",\n };\n vi.spyOn(\n mockTypedDataCheckDataSource,\n \"getTypedDataCheck\",\n ).mockResolvedValue(Right(typedDataCheckData));\n vi.spyOn(mockCertificateLoader, \"loadCertificate\").mockResolvedValue(\n mockCertificate,\n );\n\n await loader.load(validInput);\n\n expect(\n mockTypedDataCheckDataSource.getTypedDataCheck,\n ).toHaveBeenCalledWith({\n data: validTypedData,\n from: validInput.from,\n });\n });\n });\n});\n"],
5
- "mappings": "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",
6
- "names": ["DeviceModelId", "Left", "Right", "KeyUsage", "ClearSignContextType", "TypedDataCheckContextLoader", "mockTypedDataCheckDataSource", "mockCertificateLoader", "loader", "SUPPORTED_TYPES", "validInput", "input", "_description", "inputWithNanoS", "inputWithInvalidData", "validTypedData", "mockCertificate", "inputWithEmptyFrom", "result", "error", "typedDataCheckData", "certificateError"]
4
+ "sourcesContent": ["import { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\n\nimport type { PkiCertificateLoader } from \"@/pki/domain/PkiCertificateLoader\";\nimport { KeyUsage } from \"@/pki/model/KeyUsage\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\nimport {\n type TypedData,\n type TypedDataCheckDataSource,\n} from \"@/transaction-check/data/TypedDataCheckDataSource\";\nimport {\n type TypedDataCheckContextInput,\n TypedDataCheckContextLoader,\n} from \"@/transaction-check/domain/TypedDataCheckContextLoader\";\n\nconst mockLoggerFactory = () => ({\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n});\n\ndescribe(\"TypedDataCheckContextLoader\", () => {\n const mockTypedDataCheckDataSource: TypedDataCheckDataSource = {\n getTypedDataCheck: vi.fn(),\n };\n const mockCertificateLoader: PkiCertificateLoader = {\n loadCertificate: vi.fn(),\n };\n const loader = new TypedDataCheckContextLoader(\n mockTypedDataCheckDataSource,\n mockCertificateLoader,\n mockLoggerFactory,\n );\n\n const SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.TRANSACTION_CHECK,\n ];\n\n beforeEach(() => {\n vi.resetAllMocks();\n });\n\n describe(\"canHandle function\", () => {\n const validTypedData: TypedData = {\n domain: {\n name: \"Test Domain\",\n version: \"1\",\n chainId: 1,\n verifyingContract: \"0x1234567890123456789012345678901234567890\",\n },\n types: {\n EIP712Domain: [\n { name: \"name\", type: \"string\" },\n { name: \"version\", type: \"string\" },\n { name: \"chainId\", type: \"uint256\" },\n { name: \"verifyingContract\", type: \"address\" },\n ],\n Person: [\n { name: \"name\", type: \"string\" },\n { name: \"wallet\", type: \"address\" },\n ],\n },\n primaryType: \"Person\",\n message: {\n name: \"Alice\",\n wallet: \"0x1234567890123456789012345678901234567890\",\n },\n };\n\n const validInput: TypedDataCheckContextInput = {\n from: \"0x1234567890123456789012345678901234567890\",\n data: validTypedData,\n deviceModelId: DeviceModelId.FLEX,\n };\n\n it(\"should return true for valid input\", () => {\n expect(loader.canHandle(validInput, SUPPORTED_TYPES)).toBe(true);\n });\n\n it(\"should return false for invalid expected type\", () => {\n expect(loader.canHandle(validInput, [ClearSignContextType.TOKEN])).toBe(\n false,\n );\n });\n\n it.each([\n [null, \"null input\"],\n [undefined, \"undefined input\"],\n [{}, \"empty object\"],\n [\"string\", \"string input\"],\n [123, \"number input\"],\n ])(\"should return false for %s\", (input, _description) => {\n expect(loader.canHandle(input, SUPPORTED_TYPES)).toBe(false);\n });\n\n it.each([\n [{ ...validInput, from: undefined }, \"missing from\"],\n [{ ...validInput, data: undefined }, \"missing data\"],\n [{ ...validInput, deviceModelId: undefined }, \"missing deviceModelId\"],\n ])(\"should return false for %s\", (input, _description) => {\n expect(loader.canHandle(input, SUPPORTED_TYPES)).toBe(false);\n });\n\n it.each([\n [{ ...validInput, from: \"invalid-hex\" }, \"invalid from hex\"],\n [{ ...validInput, from: \"0x\" }, \"empty from hex\"],\n [{ ...validInput, from: \"not-hex\" }, \"non-hex from\"],\n ])(\"should return false for %s\", (input, _description) => {\n expect(loader.canHandle(input, SUPPORTED_TYPES)).toBe(false);\n });\n\n it(\"should return false for NANO_S device model\", () => {\n const inputWithNanoS = {\n ...validInput,\n deviceModelId: DeviceModelId.NANO_S,\n };\n expect(loader.canHandle(inputWithNanoS, SUPPORTED_TYPES)).toBe(false);\n });\n\n it(\"should return false for non-object data\", () => {\n const inputWithInvalidData = {\n ...validInput,\n data: \"not-an-object\" as unknown as TypedData,\n };\n expect(loader.canHandle(inputWithInvalidData, SUPPORTED_TYPES)).toBe(\n false,\n );\n });\n });\n\n describe(\"load function\", () => {\n const validTypedData: TypedData = {\n domain: {\n name: \"Test Domain\",\n version: \"1\",\n chainId: 1,\n verifyingContract: \"0x1234567890123456789012345678901234567890\",\n },\n types: {\n EIP712Domain: [\n { name: \"name\", type: \"string\" },\n { name: \"version\", type: \"string\" },\n { name: \"chainId\", type: \"uint256\" },\n { name: \"verifyingContract\", type: \"address\" },\n ],\n Person: [\n { name: \"name\", type: \"string\" },\n { name: \"wallet\", type: \"address\" },\n ],\n },\n primaryType: \"Person\",\n message: {\n name: \"Alice\",\n wallet: \"0x1234567890123456789012345678901234567890\",\n },\n };\n\n const validInput: TypedDataCheckContextInput = {\n from: \"0x1234567890123456789012345678901234567890\",\n data: validTypedData,\n deviceModelId: DeviceModelId.FLEX,\n };\n\n const mockCertificate = {\n descriptor: \"cert-descriptor\",\n signature: \"cert-signature\",\n keyUsageNumber: 0,\n payload: new Uint8Array(),\n };\n\n it(\"should return empty array when from is empty\", async () => {\n const inputWithEmptyFrom = { ...validInput, from: \"\" };\n const result = await loader.load(inputWithEmptyFrom);\n expect(result).toEqual([]);\n });\n\n it(\"should return error context when typed data check fails\", async () => {\n const error = new Error(\"Typed data check failed\");\n vi.spyOn(\n mockTypedDataCheckDataSource,\n \"getTypedDataCheck\",\n ).mockResolvedValue(Left(error));\n\n const result = await loader.load(validInput);\n\n expect(result).toEqual([\n {\n type: ClearSignContextType.ERROR,\n error,\n },\n ]);\n });\n\n it(\"should return transaction check context when successful\", async () => {\n const typedDataCheckData = {\n publicKeyId: \"test-key-id\",\n descriptor: \"test-descriptor\",\n };\n vi.spyOn(\n mockTypedDataCheckDataSource,\n \"getTypedDataCheck\",\n ).mockResolvedValue(Right(typedDataCheckData));\n vi.spyOn(mockCertificateLoader, \"loadCertificate\").mockResolvedValue(\n mockCertificate,\n );\n\n const result = await loader.load(validInput);\n\n expect(\n mockTypedDataCheckDataSource.getTypedDataCheck,\n ).toHaveBeenCalledWith({\n data: validInput.data,\n from: validInput.from,\n });\n\n expect(mockCertificateLoader.loadCertificate).toHaveBeenCalledWith({\n keyId: typedDataCheckData.publicKeyId,\n keyUsage: KeyUsage.TxSimulationSigner,\n targetDevice: validInput.deviceModelId,\n });\n\n expect(result).toEqual([\n {\n type: ClearSignContextType.TRANSACTION_CHECK,\n payload: typedDataCheckData.descriptor,\n certificate: mockCertificate,\n },\n ]);\n });\n\n it(\"should handle certificate loading failure\", async () => {\n const typedDataCheckData = {\n publicKeyId: \"test-key-id\",\n descriptor: \"test-descriptor\",\n };\n const certificateError = new Error(\"Certificate loading failed\");\n\n vi.spyOn(\n mockTypedDataCheckDataSource,\n \"getTypedDataCheck\",\n ).mockResolvedValue(Right(typedDataCheckData));\n vi.spyOn(mockCertificateLoader, \"loadCertificate\").mockRejectedValue(\n certificateError,\n );\n\n await expect(loader.load(validInput)).rejects.toThrow(certificateError);\n });\n\n it(\"should call typed data check with correct parameters\", async () => {\n const typedDataCheckData = {\n publicKeyId: \"test-key-id\",\n descriptor: \"test-descriptor\",\n };\n vi.spyOn(\n mockTypedDataCheckDataSource,\n \"getTypedDataCheck\",\n ).mockResolvedValue(Right(typedDataCheckData));\n vi.spyOn(mockCertificateLoader, \"loadCertificate\").mockResolvedValue(\n mockCertificate,\n );\n\n await loader.load(validInput);\n\n expect(\n mockTypedDataCheckDataSource.getTypedDataCheck,\n ).toHaveBeenCalledWith({\n data: validTypedData,\n from: validInput.from,\n });\n });\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["DeviceModelId", "Left", "Right", "KeyUsage", "ClearSignContextType", "TypedDataCheckContextLoader", "mockLoggerFactory", "mockTypedDataCheckDataSource", "mockCertificateLoader", "loader", "SUPPORTED_TYPES", "validInput", "input", "_description", "inputWithNanoS", "inputWithInvalidData", "validTypedData", "mockCertificate", "inputWithEmptyFrom", "result", "error", "typedDataCheckData", "certificateError"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{ContainerModule as o}from"inversify";import{HttpTrustedNameDataSource as r}from"../../trusted-name/data/HttpTrustedNameDataSource";import{trustedNameTypes as t}from"../../trusted-name/di/trustedNameTypes";import{TrustedNameContextFieldLoader as a}from"../../trusted-name/domain/TrustedNameContextFieldLoader";import{TrustedNameContextLoader as m}from"../../trusted-name/domain/TrustedNameContextLoader";const T=()=>new o(({bind:e})=>{e(t.TrustedNameDataSource).to(r),e(t.TrustedNameContextLoader).to(m),e(t.TrustedNameContextFieldLoader).to(a)});export{T as trustedNameModuleFactory};
1
+ import{ContainerModule as r}from"inversify";import{HttpTrustedNameDataSource as a}from"../../trusted-name/data/HttpTrustedNameDataSource";import{trustedNameTypes as t}from"../../trusted-name/di/trustedNameTypes";import{TrustedNameContextFieldLoader as m}from"../../trusted-name/domain/TrustedNameContextFieldLoader";import{TrustedNameContextLoader as u}from"../../trusted-name/domain/TrustedNameContextLoader";const C=o=>new r(({bind:e})=>{o?.customTrustedNameDataSource?e(t.TrustedNameDataSource).toConstantValue(o.customTrustedNameDataSource):e(t.TrustedNameDataSource).to(a),e(t.TrustedNameContextLoader).to(u),e(t.TrustedNameContextFieldLoader).to(m)});export{C as trustedNameModuleFactory};
2
2
  //# sourceMappingURL=trustedNameModuleFactory.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/trusted-name/di/trustedNameModuleFactory.ts"],
4
- "sourcesContent": ["import { ContainerModule } from \"inversify\";\n\nimport { HttpTrustedNameDataSource } from \"@/trusted-name/data/HttpTrustedNameDataSource\";\nimport { trustedNameTypes } from \"@/trusted-name/di/trustedNameTypes\";\nimport { TrustedNameContextFieldLoader } from \"@/trusted-name/domain/TrustedNameContextFieldLoader\";\nimport { TrustedNameContextLoader } from \"@/trusted-name/domain/TrustedNameContextLoader\";\n\nexport const trustedNameModuleFactory = () =>\n new ContainerModule(({ bind }) => {\n bind(trustedNameTypes.TrustedNameDataSource).to(HttpTrustedNameDataSource);\n bind(trustedNameTypes.TrustedNameContextLoader).to(\n TrustedNameContextLoader,\n );\n bind(trustedNameTypes.TrustedNameContextFieldLoader).to(\n TrustedNameContextFieldLoader,\n );\n });\n"],
5
- "mappings": "AAAA,OAAS,mBAAAA,MAAuB,YAEhC,OAAS,6BAAAC,MAAiC,gDAC1C,OAAS,oBAAAC,MAAwB,qCACjC,OAAS,iCAAAC,MAAqC,sDAC9C,OAAS,4BAAAC,MAAgC,iDAElC,MAAMC,EAA2B,IACtC,IAAIL,EAAgB,CAAC,CAAE,KAAAM,CAAK,IAAM,CAChCA,EAAKJ,EAAiB,qBAAqB,EAAE,GAAGD,CAAyB,EACzEK,EAAKJ,EAAiB,wBAAwB,EAAE,GAC9CE,CACF,EACAE,EAAKJ,EAAiB,6BAA6B,EAAE,GACnDC,CACF,CACF,CAAC",
6
- "names": ["ContainerModule", "HttpTrustedNameDataSource", "trustedNameTypes", "TrustedNameContextFieldLoader", "TrustedNameContextLoader", "trustedNameModuleFactory", "bind"]
4
+ "sourcesContent": ["import { ContainerModule } from \"inversify\";\n\nimport { type ContextModuleConfig } from \"@/config/model/ContextModuleConfig\";\nimport { HttpTrustedNameDataSource } from \"@/trusted-name/data/HttpTrustedNameDataSource\";\nimport { trustedNameTypes } from \"@/trusted-name/di/trustedNameTypes\";\nimport { TrustedNameContextFieldLoader } from \"@/trusted-name/domain/TrustedNameContextFieldLoader\";\nimport { TrustedNameContextLoader } from \"@/trusted-name/domain/TrustedNameContextLoader\";\n\nexport const trustedNameModuleFactory = (config?: ContextModuleConfig) =>\n new ContainerModule(({ bind }) => {\n if (config?.customTrustedNameDataSource) {\n bind(trustedNameTypes.TrustedNameDataSource).toConstantValue(\n config.customTrustedNameDataSource,\n );\n } else {\n bind(trustedNameTypes.TrustedNameDataSource).to(\n HttpTrustedNameDataSource,\n );\n }\n bind(trustedNameTypes.TrustedNameContextLoader).to(\n TrustedNameContextLoader,\n );\n bind(trustedNameTypes.TrustedNameContextFieldLoader).to(\n TrustedNameContextFieldLoader,\n );\n });\n"],
5
+ "mappings": "AAAA,OAAS,mBAAAA,MAAuB,YAGhC,OAAS,6BAAAC,MAAiC,gDAC1C,OAAS,oBAAAC,MAAwB,qCACjC,OAAS,iCAAAC,MAAqC,sDAC9C,OAAS,4BAAAC,MAAgC,iDAElC,MAAMC,EAA4BC,GACvC,IAAIN,EAAgB,CAAC,CAAE,KAAAO,CAAK,IAAM,CAC5BD,GAAQ,4BACVC,EAAKL,EAAiB,qBAAqB,EAAE,gBAC3CI,EAAO,2BACT,EAEAC,EAAKL,EAAiB,qBAAqB,EAAE,GAC3CD,CACF,EAEFM,EAAKL,EAAiB,wBAAwB,EAAE,GAC9CE,CACF,EACAG,EAAKL,EAAiB,6BAA6B,EAAE,GACnDC,CACF,CACF,CAAC",
6
+ "names": ["ContainerModule", "HttpTrustedNameDataSource", "trustedNameTypes", "TrustedNameContextFieldLoader", "TrustedNameContextLoader", "trustedNameModuleFactory", "config", "bind"]
7
7
  }
@@ -1,2 +1,2 @@
1
- var y=Object.defineProperty;var C=Object.getOwnPropertyDescriptor;var m=(o,e,a,t)=>{for(var r=t>1?void 0:t?C(e,a):e,i=o.length-1,n;i>=0;i--)(n=o[i])&&(r=(t?n(e,a,r):n(r))||r);return t&&r&&y(e,a,r),r},l=(o,e)=>(a,t)=>e(a,t,o);import{inject as p,injectable as h}from"inversify";import{pkiTypes as S}from"../../pki/di/pkiTypes";import{ClearSignContextType as c}from"../../shared/model/ClearSignContext";import{trustedNameTypes as T}from"../../trusted-name/di/trustedNameTypes";const I=[c.TRUSTED_NAME];let d=class{constructor(e,a){this.certificateLoader=a;this._dataSource=e}_dataSource;canHandle(e,a){return typeof e=="object"&&e!==null&&"chainId"in e&&"domain"in e&&"challenge"in e&&"deviceModelId"in e&&e.deviceModelId!==void 0&&typeof e.chainId=="number"&&typeof e.domain=="string"&&e.domain.length>0&&typeof e.challenge=="string"&&e.challenge.length>0&&I.every(t=>a.includes(t))}async load(e){const{chainId:a,domain:t,challenge:r,deviceModelId:i}=e;return this.isDomainValid(t)?[await(await this._dataSource.getDomainNamePayload({chainId:a,domain:t,challenge:r})).caseOf({Left:s=>Promise.resolve({type:c.ERROR,error:s}),Right:async({data:s,keyId:g,keyUsage:u})=>{const f=await this.certificateLoader.loadCertificate({keyId:g,keyUsage:u,targetDevice:i});return{type:c.TRUSTED_NAME,payload:s,certificate:f}}})]:[{type:c.ERROR,error:new Error("[ContextModule] TrustedNameLoader: invalid domain")}]}isDomainValid(e){const a=e.length>0&&Number(e.length)<30,t=new RegExp("^[a-zA-Z0-9\\-\\_\\.]+$").test(e);return a&&t}};d=m([h(),l(0,p(T.TrustedNameDataSource)),l(1,p(S.PkiCertificateLoader))],d);export{d as TrustedNameContextLoader};
1
+ var y=Object.defineProperty;var C=Object.getOwnPropertyDescriptor;var u=(i,e,r,t)=>{for(var a=t>1?void 0:t?C(e,r):e,n=i.length-1,s;n>=0;n--)(s=i[n])&&(a=(t?s(e,r,a):s(a))||a);return t&&a&&y(e,r,a),a},d=(i,e)=>(r,t)=>e(r,t,i);import{inject as g,injectable as S}from"inversify";import{configTypes as T}from"../../config/di/configTypes";import{pkiTypes as v}from"../../pki/di/pkiTypes";import{ClearSignContextType as c}from"../../shared/model/ClearSignContext";import{trustedNameTypes as x}from"../../trusted-name/di/trustedNameTypes";const I=[c.TRUSTED_NAME];let l=class{constructor(e,r,t){this.certificateLoader=r;this._dataSource=e,this.logger=t("TrustedNameContextLoader")}_dataSource;logger;canHandle(e,r){return typeof e=="object"&&e!==null&&"chainId"in e&&"domain"in e&&"challenge"in e&&"deviceModelId"in e&&e.deviceModelId!==void 0&&typeof e.chainId=="number"&&typeof e.domain=="string"&&e.domain.length>0&&typeof e.challenge=="string"&&e.challenge.length>0&&I.every(t=>r.includes(t))}async load(e){const{chainId:r,domain:t,challenge:a,deviceModelId:n}=e;if(!this.isDomainValid(t)){const o=[{type:c.ERROR,error:new Error("[ContextModule] TrustedNameLoader: invalid domain")}];return this.logger.debug("load result",{data:{result:o}}),o}const m=[await(await this._dataSource.getDomainNamePayload({chainId:r,domain:t,challenge:a})).caseOf({Left:o=>Promise.resolve({type:c.ERROR,error:o}),Right:async({data:o,keyId:p,keyUsage:h})=>{const f=await this.certificateLoader.loadCertificate({keyId:p,keyUsage:h,targetDevice:n});return{type:c.TRUSTED_NAME,payload:o,certificate:f}}})];return this.logger.debug("load result",{data:{result:m}}),m}isDomainValid(e){const r=e.length>0&&Number(e.length)<30,t=new RegExp("^[a-zA-Z0-9\\-\\_\\.]+$").test(e);return r&&t}};l=u([S(),d(0,g(x.TrustedNameDataSource)),d(1,g(v.PkiCertificateLoader)),d(2,g(T.ContextModuleLoggerFactory))],l);export{l as TrustedNameContextLoader};
2
2
  //# sourceMappingURL=TrustedNameContextLoader.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/trusted-name/domain/TrustedNameContextLoader.ts"],
4
- "sourcesContent": ["import { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\n\nimport { pkiTypes } from \"@/pki/di/pkiTypes\";\nimport { type PkiCertificateLoader } from \"@/pki/domain/PkiCertificateLoader\";\nimport { ContextLoader } from \"@/shared/domain/ContextLoader\";\nimport {\n ClearSignContext,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\nimport type { TrustedNameDataSource } from \"@/trusted-name/data/TrustedNameDataSource\";\nimport { trustedNameTypes } from \"@/trusted-name/di/trustedNameTypes\";\n\nexport type TrustedNameContextInput = {\n chainId: number;\n domain: string;\n challenge: string;\n deviceModelId: DeviceModelId;\n};\n\nconst SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.TRUSTED_NAME,\n];\n\n@injectable()\nexport class TrustedNameContextLoader\n implements ContextLoader<TrustedNameContextInput>\n{\n private _dataSource: TrustedNameDataSource;\n\n constructor(\n @inject(trustedNameTypes.TrustedNameDataSource)\n dataSource: TrustedNameDataSource,\n @inject(pkiTypes.PkiCertificateLoader)\n private certificateLoader: PkiCertificateLoader,\n ) {\n this._dataSource = dataSource;\n }\n\n canHandle(\n input: unknown,\n expectedTypes: ClearSignContextType[],\n ): input is TrustedNameContextInput {\n return (\n typeof input === \"object\" &&\n input !== null &&\n \"chainId\" in input &&\n \"domain\" in input &&\n \"challenge\" in input &&\n \"deviceModelId\" in input &&\n input.deviceModelId !== undefined &&\n typeof input.chainId === \"number\" &&\n typeof input.domain === \"string\" &&\n input.domain.length > 0 &&\n typeof input.challenge === \"string\" &&\n input.challenge.length > 0 &&\n SUPPORTED_TYPES.every((type) => expectedTypes.includes(type))\n );\n }\n\n async load(input: TrustedNameContextInput): Promise<ClearSignContext[]> {\n const { chainId, domain, challenge, deviceModelId } = input;\n\n if (!this.isDomainValid(domain)) {\n return [\n {\n type: ClearSignContextType.ERROR,\n error: new Error(\"[ContextModule] TrustedNameLoader: invalid domain\"),\n },\n ];\n }\n\n const payload = await this._dataSource.getDomainNamePayload({\n chainId,\n domain,\n challenge,\n });\n const response = await payload.caseOf({\n Left: (error): Promise<ClearSignContext> =>\n Promise.resolve({\n type: ClearSignContextType.ERROR,\n error: error,\n }),\n Right: async ({ data, keyId, keyUsage }): Promise<ClearSignContext> => {\n const certificate = await this.certificateLoader.loadCertificate({\n keyId,\n keyUsage,\n targetDevice: deviceModelId,\n });\n return {\n type: ClearSignContextType.TRUSTED_NAME,\n payload: data,\n certificate,\n };\n },\n });\n\n return [response];\n }\n\n private isDomainValid(domain: string) {\n const lengthIsValid = domain.length > 0 && Number(domain.length) < 30;\n const containsOnlyValidChars = new RegExp(\"^[a-zA-Z0-9\\\\-\\\\_\\\\.]+$\").test(\n domain,\n );\n\n return lengthIsValid && containsOnlyValidChars;\n }\n}\n"],
5
- "mappings": "iOACA,OAAS,UAAAA,EAAQ,cAAAC,MAAkB,YAEnC,OAAS,YAAAC,MAAgB,oBAGzB,OAEE,wBAAAC,MACK,kCAEP,OAAS,oBAAAC,MAAwB,qCASjC,MAAMC,EAA0C,CAC9CC,EAAqB,YACvB,EAGO,IAAMC,EAAN,KAEP,CAGE,YAEEC,EAEQC,EACR,CADQ,uBAAAA,EAER,KAAK,YAAcD,CACrB,CATQ,YAWR,UACEE,EACAC,EACkC,CAClC,OACE,OAAOD,GAAU,UACjBA,IAAU,MACV,YAAaA,GACb,WAAYA,GACZ,cAAeA,GACf,kBAAmBA,GACnBA,EAAM,gBAAkB,QACxB,OAAOA,EAAM,SAAY,UACzB,OAAOA,EAAM,QAAW,UACxBA,EAAM,OAAO,OAAS,GACtB,OAAOA,EAAM,WAAc,UAC3BA,EAAM,UAAU,OAAS,GACzBL,EAAgB,MAAOO,GAASD,EAAc,SAASC,CAAI,CAAC,CAEhE,CAEA,MAAM,KAAKF,EAA6D,CACtE,KAAM,CAAE,QAAAG,EAAS,OAAAC,EAAQ,UAAAC,EAAW,cAAAC,CAAc,EAAIN,EAEtD,OAAK,KAAK,cAAcI,CAAM,EAkCvB,CApBU,MALD,MAAM,KAAK,YAAY,qBAAqB,CAC1D,QAAAD,EACA,OAAAC,EACA,UAAAC,CACF,CAAC,GAC8B,OAAO,CACpC,KAAOE,GACL,QAAQ,QAAQ,CACd,KAAMX,EAAqB,MAC3B,MAAOW,CACT,CAAC,EACH,MAAO,MAAO,CAAE,KAAAC,EAAM,MAAAC,EAAO,SAAAC,CAAS,IAAiC,CACrE,MAAMC,EAAc,MAAM,KAAK,kBAAkB,gBAAgB,CAC/D,MAAAF,EACA,SAAAC,EACA,aAAcJ,CAChB,CAAC,EACD,MAAO,CACL,KAAMV,EAAqB,aAC3B,QAASY,EACT,YAAAG,CACF,CACF,CACF,CAAC,CAEe,EAjCP,CACL,CACE,KAAMf,EAAqB,MAC3B,MAAO,IAAI,MAAM,mDAAmD,CACtE,CACF,CA6BJ,CAEQ,cAAcQ,EAAgB,CACpC,MAAMQ,EAAgBR,EAAO,OAAS,GAAK,OAAOA,EAAO,MAAM,EAAI,GAC7DS,EAAyB,IAAI,OAAO,yBAAyB,EAAE,KACnET,CACF,EAEA,OAAOQ,GAAiBC,CAC1B,CACF,EAnFahB,EAANiB,EAAA,CADNC,EAAW,EAOPC,EAAA,EAAAC,EAAOC,EAAiB,qBAAqB,GAE7CF,EAAA,EAAAC,EAAOE,EAAS,oBAAoB,IAR5BtB",
6
- "names": ["inject", "injectable", "pkiTypes", "ClearSignContextType", "trustedNameTypes", "SUPPORTED_TYPES", "ClearSignContextType", "TrustedNameContextLoader", "dataSource", "certificateLoader", "input", "expectedTypes", "type", "chainId", "domain", "challenge", "deviceModelId", "error", "data", "keyId", "keyUsage", "certificate", "lengthIsValid", "containsOnlyValidChars", "__decorateClass", "injectable", "__decorateParam", "inject", "trustedNameTypes", "pkiTypes"]
4
+ "sourcesContent": ["import {\n DeviceModelId,\n LoggerPublisherService,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { pkiTypes } from \"@/pki/di/pkiTypes\";\nimport { type PkiCertificateLoader } from \"@/pki/domain/PkiCertificateLoader\";\nimport { ContextLoader } from \"@/shared/domain/ContextLoader\";\nimport {\n ClearSignContext,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\nimport type { TrustedNameDataSource } from \"@/trusted-name/data/TrustedNameDataSource\";\nimport { trustedNameTypes } from \"@/trusted-name/di/trustedNameTypes\";\n\nexport type TrustedNameContextInput = {\n chainId: number;\n domain: string;\n challenge: string;\n deviceModelId: DeviceModelId;\n};\n\nconst SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.TRUSTED_NAME,\n];\n\n@injectable()\nexport class TrustedNameContextLoader\n implements ContextLoader<TrustedNameContextInput>\n{\n private _dataSource: TrustedNameDataSource;\n private logger: LoggerPublisherService;\n\n constructor(\n @inject(trustedNameTypes.TrustedNameDataSource)\n dataSource: TrustedNameDataSource,\n @inject(pkiTypes.PkiCertificateLoader)\n private certificateLoader: PkiCertificateLoader,\n @inject(configTypes.ContextModuleLoggerFactory)\n loggerFactory: (tag: string) => LoggerPublisherService,\n ) {\n this._dataSource = dataSource;\n this.logger = loggerFactory(\"TrustedNameContextLoader\");\n }\n\n canHandle(\n input: unknown,\n expectedTypes: ClearSignContextType[],\n ): input is TrustedNameContextInput {\n return (\n typeof input === \"object\" &&\n input !== null &&\n \"chainId\" in input &&\n \"domain\" in input &&\n \"challenge\" in input &&\n \"deviceModelId\" in input &&\n input.deviceModelId !== undefined &&\n typeof input.chainId === \"number\" &&\n typeof input.domain === \"string\" &&\n input.domain.length > 0 &&\n typeof input.challenge === \"string\" &&\n input.challenge.length > 0 &&\n SUPPORTED_TYPES.every((type) => expectedTypes.includes(type))\n );\n }\n\n async load(input: TrustedNameContextInput): Promise<ClearSignContext[]> {\n const { chainId, domain, challenge, deviceModelId } = input;\n\n if (!this.isDomainValid(domain)) {\n const result = [\n {\n type: ClearSignContextType.ERROR as const,\n error: new Error(\"[ContextModule] TrustedNameLoader: invalid domain\"),\n },\n ];\n this.logger.debug(\"load result\", { data: { result } });\n return result;\n }\n\n const payload = await this._dataSource.getDomainNamePayload({\n chainId,\n domain,\n challenge,\n });\n const response = await payload.caseOf({\n Left: (error): Promise<ClearSignContext> =>\n Promise.resolve({\n type: ClearSignContextType.ERROR,\n error: error,\n }),\n Right: async ({ data, keyId, keyUsage }): Promise<ClearSignContext> => {\n const certificate = await this.certificateLoader.loadCertificate({\n keyId,\n keyUsage,\n targetDevice: deviceModelId,\n });\n return {\n type: ClearSignContextType.TRUSTED_NAME,\n payload: data,\n certificate,\n };\n },\n });\n\n const result = [response];\n this.logger.debug(\"load result\", { data: { result } });\n return result;\n }\n\n private isDomainValid(domain: string) {\n const lengthIsValid = domain.length > 0 && Number(domain.length) < 30;\n const containsOnlyValidChars = new RegExp(\"^[a-zA-Z0-9\\\\-\\\\_\\\\.]+$\").test(\n domain,\n );\n\n return lengthIsValid && containsOnlyValidChars;\n }\n}\n"],
5
+ "mappings": "iOAIA,OAAS,UAAAA,EAAQ,cAAAC,MAAkB,YAEnC,OAAS,eAAAC,MAAmB,0BAC5B,OAAS,YAAAC,MAAgB,oBAGzB,OAEE,wBAAAC,MACK,kCAEP,OAAS,oBAAAC,MAAwB,qCASjC,MAAMC,EAA0C,CAC9CC,EAAqB,YACvB,EAGO,IAAMC,EAAN,KAEP,CAIE,YAEEC,EAEQC,EAERC,EACA,CAHQ,uBAAAD,EAIR,KAAK,YAAcD,EACnB,KAAK,OAASE,EAAc,0BAA0B,CACxD,CAbQ,YACA,OAcR,UACEC,EACAC,EACkC,CAClC,OACE,OAAOD,GAAU,UACjBA,IAAU,MACV,YAAaA,GACb,WAAYA,GACZ,cAAeA,GACf,kBAAmBA,GACnBA,EAAM,gBAAkB,QACxB,OAAOA,EAAM,SAAY,UACzB,OAAOA,EAAM,QAAW,UACxBA,EAAM,OAAO,OAAS,GACtB,OAAOA,EAAM,WAAc,UAC3BA,EAAM,UAAU,OAAS,GACzBN,EAAgB,MAAOQ,GAASD,EAAc,SAASC,CAAI,CAAC,CAEhE,CAEA,MAAM,KAAKF,EAA6D,CACtE,KAAM,CAAE,QAAAG,EAAS,OAAAC,EAAQ,UAAAC,EAAW,cAAAC,CAAc,EAAIN,EAEtD,GAAI,CAAC,KAAK,cAAcI,CAAM,EAAG,CAC/B,MAAMG,EAAS,CACb,CACE,KAAMZ,EAAqB,MAC3B,MAAO,IAAI,MAAM,mDAAmD,CACtE,CACF,EACA,YAAK,OAAO,MAAM,cAAe,CAAE,KAAM,CAAE,OAAAY,CAAO,CAAE,CAAC,EAC9CA,CACT,CA2BA,MAAMA,EAAS,CApBE,MALD,MAAM,KAAK,YAAY,qBAAqB,CAC1D,QAAAJ,EACA,OAAAC,EACA,UAAAC,CACF,CAAC,GAC8B,OAAO,CACpC,KAAOG,GACL,QAAQ,QAAQ,CACd,KAAMb,EAAqB,MAC3B,MAAOa,CACT,CAAC,EACH,MAAO,MAAO,CAAE,KAAAC,EAAM,MAAAC,EAAO,SAAAC,CAAS,IAAiC,CACrE,MAAMC,EAAc,MAAM,KAAK,kBAAkB,gBAAgB,CAC/D,MAAAF,EACA,SAAAC,EACA,aAAcL,CAChB,CAAC,EACD,MAAO,CACL,KAAMX,EAAqB,aAC3B,QAASc,EACT,YAAAG,CACF,CACF,CACF,CAAC,CAEuB,EACxB,YAAK,OAAO,MAAM,cAAe,CAAE,KAAM,CAAE,OAAAL,CAAO,CAAE,CAAC,EAC9CA,CACT,CAEQ,cAAcH,EAAgB,CACpC,MAAMS,EAAgBT,EAAO,OAAS,GAAK,OAAOA,EAAO,MAAM,EAAI,GAC7DU,EAAyB,IAAI,OAAO,yBAAyB,EAAE,KACnEV,CACF,EAEA,OAAOS,GAAiBC,CAC1B,CACF,EA3FalB,EAANmB,EAAA,CADNC,EAAW,EAQPC,EAAA,EAAAC,EAAOC,EAAiB,qBAAqB,GAE7CF,EAAA,EAAAC,EAAOE,EAAS,oBAAoB,GAEpCH,EAAA,EAAAC,EAAOG,EAAY,0BAA0B,IAXrCzB",
6
+ "names": ["inject", "injectable", "configTypes", "pkiTypes", "ClearSignContextType", "trustedNameTypes", "SUPPORTED_TYPES", "ClearSignContextType", "TrustedNameContextLoader", "dataSource", "certificateLoader", "loggerFactory", "input", "expectedTypes", "type", "chainId", "domain", "challenge", "deviceModelId", "result", "error", "data", "keyId", "keyUsage", "certificate", "lengthIsValid", "containsOnlyValidChars", "__decorateClass", "injectable", "__decorateParam", "inject", "trustedNameTypes", "pkiTypes", "configTypes"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{DeviceModelId as o}from"@ledgerhq/device-management-kit";import{Left as c,Right as s}from"purify-ts";import{ClearSignContextType as n}from"../../shared/model/ClearSignContext";import{TrustedNameContextLoader as u}from"../../trusted-name/domain/TrustedNameContextLoader";describe("TrustedNameContextLoader",()=>{const d={getDomainNamePayload:vi.fn(),getTrustedNamePayload:vi.fn()},i={loadCertificate:vi.fn()},a=new u(d,i),l={keyUsageNumber:1,payload:new Uint8Array([1,2,3,4])};beforeEach(()=>{vi.restoreAllMocks(),vi.spyOn(d,"getDomainNamePayload").mockResolvedValue(s({data:"payload",keyId:"testKeyId",keyUsage:"testKeyUsage"}))}),describe("canHandle function",()=>{const e={chainId:1,domain:"hello.eth",challenge:"challenge",deviceModelId:o.STAX};it("should return true for valid input",()=>{expect(a.canHandle(e,[n.TRUSTED_NAME])).toBe(!0)}),it("should return false for invalid expected type",()=>{expect(a.canHandle(e,[n.TOKEN])).toBe(!1)}),it.each([[null,"null input"],[void 0,"undefined input"],[{},"empty object"],["string","string input"],[123,"number input"]])("should return false for %s",(t,r)=>{expect(a.canHandle(t,[n.TRUSTED_NAME])).toBe(!1)}),it.each([[{...e,chainId:void 0},"missing chainId"],[{...e,domain:void 0},"missing domain"],[{...e,challenge:void 0},"missing challenge"],[{...e,deviceModelId:void 0},"missing device model"]])("should return false for %s",(t,r)=>{expect(a.canHandle(t,[n.TRUSTED_NAME])).toBe(!1)}),it.each([[{...e,domain:""},"empty domain"],[{...e,challenge:""},"empty challenge"],[{...e,chainId:"1"},"string chainId"],[{...e,chainId:null},"null chainId"],[{...e,domain:123},"numeric domain"],[{...e,challenge:123},"numeric challenge"]])("should return false for %s",(t,r)=>{expect(a.canHandle(t,[n.TRUSTED_NAME])).toBe(!1)})}),describe("load function",()=>{it("should return an error when domain > max length",async()=>{const e={chainId:1,domain:"maxlength-maxlength-maxlength-maxlength-maxlength-maxlength",challenge:"challenge",deviceModelId:o.STAX},t=await a.load(e);expect(i.loadCertificate).not.toHaveBeenCalled(),expect(t).toEqual([{type:n.ERROR,error:new Error("[ContextModule] TrustedNameLoader: invalid domain")}])}),it("should return an error when domain is not valid",async()=>{const e={chainId:1,domain:"hello\u{1F44B}",challenge:"challenge",deviceModelId:o.STAX},t=await a.load(e);expect(i.loadCertificate).not.toHaveBeenCalled(),expect(t).toEqual([{type:n.ERROR,error:new Error("[ContextModule] TrustedNameLoader: invalid domain")}])}),it("should return a payload",async()=>{vi.spyOn(i,"loadCertificate").mockResolvedValue(l);const e={chainId:1,domain:"hello.eth",challenge:"challenge",deviceModelId:o.STAX},t=await a.load(e);expect(i.loadCertificate).toHaveBeenCalledWith({keyId:"testKeyId",keyUsage:"testKeyUsage",targetDevice:o.STAX}),expect(t).toEqual([{type:n.TRUSTED_NAME,payload:"payload",certificate:l}])}),it("should return an error when unable to fetch the datasource",async()=>{const e={chainId:1,domain:"hello.eth",challenge:"challenge",deviceModelId:o.STAX};vi.spyOn(d,"getDomainNamePayload").mockResolvedValue(c(new Error("error")));const t=await a.load(e);expect(t).toEqual([{type:n.ERROR,error:new Error("error")}])})})});
1
+ import{DeviceModelId as o}from"@ledgerhq/device-management-kit";import{Left as c,Right as s}from"purify-ts";import{ClearSignContextType as n}from"../../shared/model/ClearSignContext";import{TrustedNameContextLoader as u}from"../../trusted-name/domain/TrustedNameContextLoader";const m=()=>({debug:vi.fn(),info:vi.fn(),warn:vi.fn(),error:vi.fn(),subscribers:[]});describe("TrustedNameContextLoader",()=>{const r={getDomainNamePayload:vi.fn(),getTrustedNamePayload:vi.fn()},i={loadCertificate:vi.fn()},a=new u(r,i,m),d={keyUsageNumber:1,payload:new Uint8Array([1,2,3,4])};beforeEach(()=>{vi.restoreAllMocks(),vi.spyOn(r,"getDomainNamePayload").mockResolvedValue(s({data:"payload",keyId:"testKeyId",keyUsage:"testKeyUsage"}))}),describe("canHandle function",()=>{const e={chainId:1,domain:"hello.eth",challenge:"challenge",deviceModelId:o.STAX};it("should return true for valid input",()=>{expect(a.canHandle(e,[n.TRUSTED_NAME])).toBe(!0)}),it("should return false for invalid expected type",()=>{expect(a.canHandle(e,[n.TOKEN])).toBe(!1)}),it.each([[null,"null input"],[void 0,"undefined input"],[{},"empty object"],["string","string input"],[123,"number input"]])("should return false for %s",(t,l)=>{expect(a.canHandle(t,[n.TRUSTED_NAME])).toBe(!1)}),it.each([[{...e,chainId:void 0},"missing chainId"],[{...e,domain:void 0},"missing domain"],[{...e,challenge:void 0},"missing challenge"],[{...e,deviceModelId:void 0},"missing device model"]])("should return false for %s",(t,l)=>{expect(a.canHandle(t,[n.TRUSTED_NAME])).toBe(!1)}),it.each([[{...e,domain:""},"empty domain"],[{...e,challenge:""},"empty challenge"],[{...e,chainId:"1"},"string chainId"],[{...e,chainId:null},"null chainId"],[{...e,domain:123},"numeric domain"],[{...e,challenge:123},"numeric challenge"]])("should return false for %s",(t,l)=>{expect(a.canHandle(t,[n.TRUSTED_NAME])).toBe(!1)})}),describe("load function",()=>{it("should return an error when domain > max length",async()=>{const e={chainId:1,domain:"maxlength-maxlength-maxlength-maxlength-maxlength-maxlength",challenge:"challenge",deviceModelId:o.STAX},t=await a.load(e);expect(i.loadCertificate).not.toHaveBeenCalled(),expect(t).toEqual([{type:n.ERROR,error:new Error("[ContextModule] TrustedNameLoader: invalid domain")}])}),it("should return an error when domain is not valid",async()=>{const e={chainId:1,domain:"hello\u{1F44B}",challenge:"challenge",deviceModelId:o.STAX},t=await a.load(e);expect(i.loadCertificate).not.toHaveBeenCalled(),expect(t).toEqual([{type:n.ERROR,error:new Error("[ContextModule] TrustedNameLoader: invalid domain")}])}),it("should return a payload",async()=>{vi.spyOn(i,"loadCertificate").mockResolvedValue(d);const e={chainId:1,domain:"hello.eth",challenge:"challenge",deviceModelId:o.STAX},t=await a.load(e);expect(i.loadCertificate).toHaveBeenCalledWith({keyId:"testKeyId",keyUsage:"testKeyUsage",targetDevice:o.STAX}),expect(t).toEqual([{type:n.TRUSTED_NAME,payload:"payload",certificate:d}])}),it("should return an error when unable to fetch the datasource",async()=>{const e={chainId:1,domain:"hello.eth",challenge:"challenge",deviceModelId:o.STAX};vi.spyOn(r,"getDomainNamePayload").mockResolvedValue(c(new Error("error")));const t=await a.load(e);expect(t).toEqual([{type:n.ERROR,error:new Error("error")}])})})});
2
2
  //# sourceMappingURL=TrustedNameContextLoader.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/trusted-name/domain/TrustedNameContextLoader.test.ts"],
4
- "sourcesContent": ["import { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\n\nimport { type PkiCertificateLoader } from \"@/pki/domain/PkiCertificateLoader\";\nimport { type PkiCertificate } from \"@/pki/model/PkiCertificate\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\nimport { type TrustedNameDataSource } from \"@/trusted-name/data/TrustedNameDataSource\";\nimport {\n type TrustedNameContextInput,\n TrustedNameContextLoader,\n} from \"@/trusted-name/domain/TrustedNameContextLoader\";\n\ndescribe(\"TrustedNameContextLoader\", () => {\n const mockTrustedNameDataSource: TrustedNameDataSource = {\n getDomainNamePayload: vi.fn(),\n getTrustedNamePayload: vi.fn(),\n };\n const mockCertificateLoader: PkiCertificateLoader = {\n loadCertificate: vi.fn(),\n };\n const loader = new TrustedNameContextLoader(\n mockTrustedNameDataSource,\n mockCertificateLoader,\n );\n\n const mockCertificate: PkiCertificate = {\n keyUsageNumber: 1,\n payload: new Uint8Array([1, 2, 3, 4]),\n };\n\n beforeEach(() => {\n vi.restoreAllMocks();\n vi.spyOn(\n mockTrustedNameDataSource,\n \"getDomainNamePayload\",\n ).mockResolvedValue(\n Right({\n data: \"payload\",\n keyId: \"testKeyId\",\n keyUsage: \"testKeyUsage\",\n }),\n );\n });\n\n describe(\"canHandle function\", () => {\n const validInput: TrustedNameContextInput = {\n chainId: 1,\n domain: \"hello.eth\",\n challenge: \"challenge\",\n deviceModelId: DeviceModelId.STAX,\n };\n\n it(\"should return true for valid input\", () => {\n expect(\n loader.canHandle(validInput, [ClearSignContextType.TRUSTED_NAME]),\n ).toBe(true);\n });\n\n it(\"should return false for invalid expected type\", () => {\n expect(loader.canHandle(validInput, [ClearSignContextType.TOKEN])).toBe(\n false,\n );\n });\n\n it.each([\n [null, \"null input\"],\n [undefined, \"undefined input\"],\n [{}, \"empty object\"],\n [\"string\", \"string input\"],\n [123, \"number input\"],\n ])(\"should return false for %s\", (input, _description) => {\n expect(loader.canHandle(input, [ClearSignContextType.TRUSTED_NAME])).toBe(\n false,\n );\n });\n\n it.each([\n [{ ...validInput, chainId: undefined }, \"missing chainId\"],\n [{ ...validInput, domain: undefined }, \"missing domain\"],\n [{ ...validInput, challenge: undefined }, \"missing challenge\"],\n [{ ...validInput, deviceModelId: undefined }, \"missing device model\"],\n ])(\"should return false for %s\", (input, _description) => {\n expect(loader.canHandle(input, [ClearSignContextType.TRUSTED_NAME])).toBe(\n false,\n );\n });\n\n it.each([\n [{ ...validInput, domain: \"\" }, \"empty domain\"],\n [{ ...validInput, challenge: \"\" }, \"empty challenge\"],\n [{ ...validInput, chainId: \"1\" }, \"string chainId\"],\n [{ ...validInput, chainId: null }, \"null chainId\"],\n [{ ...validInput, domain: 123 }, \"numeric domain\"],\n [{ ...validInput, challenge: 123 }, \"numeric challenge\"],\n ])(\"should return false for %s\", (input, _description) => {\n expect(loader.canHandle(input, [ClearSignContextType.TRUSTED_NAME])).toBe(\n false,\n );\n });\n });\n\n describe(\"load function\", () => {\n it(\"should return an error when domain > max length\", async () => {\n const input: TrustedNameContextInput = {\n chainId: 1,\n domain: \"maxlength-maxlength-maxlength-maxlength-maxlength-maxlength\",\n challenge: \"challenge\",\n deviceModelId: DeviceModelId.STAX,\n };\n\n const result = await loader.load(input);\n\n expect(mockCertificateLoader.loadCertificate).not.toHaveBeenCalled();\n expect(result).toEqual([\n {\n type: ClearSignContextType.ERROR,\n error: new Error(\"[ContextModule] TrustedNameLoader: invalid domain\"),\n },\n ]);\n });\n\n it(\"should return an error when domain is not valid\", async () => {\n const input: TrustedNameContextInput = {\n chainId: 1,\n domain: \"hello\uD83D\uDC4B\",\n challenge: \"challenge\",\n deviceModelId: DeviceModelId.STAX,\n };\n\n const result = await loader.load(input);\n\n expect(mockCertificateLoader.loadCertificate).not.toHaveBeenCalled();\n expect(result).toEqual([\n {\n type: ClearSignContextType.ERROR,\n error: new Error(\"[ContextModule] TrustedNameLoader: invalid domain\"),\n },\n ]);\n });\n\n it(\"should return a payload\", async () => {\n vi.spyOn(mockCertificateLoader, \"loadCertificate\").mockResolvedValue(\n mockCertificate,\n );\n const input: TrustedNameContextInput = {\n chainId: 1,\n domain: \"hello.eth\",\n challenge: \"challenge\",\n deviceModelId: DeviceModelId.STAX,\n };\n\n const result = await loader.load(input);\n\n expect(mockCertificateLoader.loadCertificate).toHaveBeenCalledWith({\n keyId: \"testKeyId\",\n keyUsage: \"testKeyUsage\",\n targetDevice: DeviceModelId.STAX,\n });\n expect(result).toEqual([\n {\n type: ClearSignContextType.TRUSTED_NAME,\n payload: \"payload\",\n certificate: mockCertificate,\n },\n ]);\n });\n\n it(\"should return an error when unable to fetch the datasource\", async () => {\n // GIVEN\n const input: TrustedNameContextInput = {\n chainId: 1,\n domain: \"hello.eth\",\n challenge: \"challenge\",\n deviceModelId: DeviceModelId.STAX,\n };\n\n // WHEN\n vi.spyOn(\n mockTrustedNameDataSource,\n \"getDomainNamePayload\",\n ).mockResolvedValue(Left(new Error(\"error\")));\n const result = await loader.load(input);\n\n // THEN\n expect(result).toEqual([\n { type: ClearSignContextType.ERROR, error: new Error(\"error\") },\n ]);\n });\n });\n});\n"],
5
- "mappings": "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",
6
- "names": ["DeviceModelId", "Left", "Right", "ClearSignContextType", "TrustedNameContextLoader", "mockTrustedNameDataSource", "mockCertificateLoader", "loader", "mockCertificate", "validInput", "input", "_description", "result"]
4
+ "sourcesContent": ["import { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\n\nimport { type PkiCertificateLoader } from \"@/pki/domain/PkiCertificateLoader\";\nimport { type PkiCertificate } from \"@/pki/model/PkiCertificate\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\nimport { type TrustedNameDataSource } from \"@/trusted-name/data/TrustedNameDataSource\";\nimport {\n type TrustedNameContextInput,\n TrustedNameContextLoader,\n} from \"@/trusted-name/domain/TrustedNameContextLoader\";\n\nconst mockLoggerFactory = () => ({\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n});\n\ndescribe(\"TrustedNameContextLoader\", () => {\n const mockTrustedNameDataSource: TrustedNameDataSource = {\n getDomainNamePayload: vi.fn(),\n getTrustedNamePayload: vi.fn(),\n };\n const mockCertificateLoader: PkiCertificateLoader = {\n loadCertificate: vi.fn(),\n };\n const loader = new TrustedNameContextLoader(\n mockTrustedNameDataSource,\n mockCertificateLoader,\n mockLoggerFactory,\n );\n\n const mockCertificate: PkiCertificate = {\n keyUsageNumber: 1,\n payload: new Uint8Array([1, 2, 3, 4]),\n };\n\n beforeEach(() => {\n vi.restoreAllMocks();\n vi.spyOn(\n mockTrustedNameDataSource,\n \"getDomainNamePayload\",\n ).mockResolvedValue(\n Right({\n data: \"payload\",\n keyId: \"testKeyId\",\n keyUsage: \"testKeyUsage\",\n }),\n );\n });\n\n describe(\"canHandle function\", () => {\n const validInput: TrustedNameContextInput = {\n chainId: 1,\n domain: \"hello.eth\",\n challenge: \"challenge\",\n deviceModelId: DeviceModelId.STAX,\n };\n\n it(\"should return true for valid input\", () => {\n expect(\n loader.canHandle(validInput, [ClearSignContextType.TRUSTED_NAME]),\n ).toBe(true);\n });\n\n it(\"should return false for invalid expected type\", () => {\n expect(loader.canHandle(validInput, [ClearSignContextType.TOKEN])).toBe(\n false,\n );\n });\n\n it.each([\n [null, \"null input\"],\n [undefined, \"undefined input\"],\n [{}, \"empty object\"],\n [\"string\", \"string input\"],\n [123, \"number input\"],\n ])(\"should return false for %s\", (input, _description) => {\n expect(loader.canHandle(input, [ClearSignContextType.TRUSTED_NAME])).toBe(\n false,\n );\n });\n\n it.each([\n [{ ...validInput, chainId: undefined }, \"missing chainId\"],\n [{ ...validInput, domain: undefined }, \"missing domain\"],\n [{ ...validInput, challenge: undefined }, \"missing challenge\"],\n [{ ...validInput, deviceModelId: undefined }, \"missing device model\"],\n ])(\"should return false for %s\", (input, _description) => {\n expect(loader.canHandle(input, [ClearSignContextType.TRUSTED_NAME])).toBe(\n false,\n );\n });\n\n it.each([\n [{ ...validInput, domain: \"\" }, \"empty domain\"],\n [{ ...validInput, challenge: \"\" }, \"empty challenge\"],\n [{ ...validInput, chainId: \"1\" }, \"string chainId\"],\n [{ ...validInput, chainId: null }, \"null chainId\"],\n [{ ...validInput, domain: 123 }, \"numeric domain\"],\n [{ ...validInput, challenge: 123 }, \"numeric challenge\"],\n ])(\"should return false for %s\", (input, _description) => {\n expect(loader.canHandle(input, [ClearSignContextType.TRUSTED_NAME])).toBe(\n false,\n );\n });\n });\n\n describe(\"load function\", () => {\n it(\"should return an error when domain > max length\", async () => {\n const input: TrustedNameContextInput = {\n chainId: 1,\n domain: \"maxlength-maxlength-maxlength-maxlength-maxlength-maxlength\",\n challenge: \"challenge\",\n deviceModelId: DeviceModelId.STAX,\n };\n\n const result = await loader.load(input);\n\n expect(mockCertificateLoader.loadCertificate).not.toHaveBeenCalled();\n expect(result).toEqual([\n {\n type: ClearSignContextType.ERROR,\n error: new Error(\"[ContextModule] TrustedNameLoader: invalid domain\"),\n },\n ]);\n });\n\n it(\"should return an error when domain is not valid\", async () => {\n const input: TrustedNameContextInput = {\n chainId: 1,\n domain: \"hello\uD83D\uDC4B\",\n challenge: \"challenge\",\n deviceModelId: DeviceModelId.STAX,\n };\n\n const result = await loader.load(input);\n\n expect(mockCertificateLoader.loadCertificate).not.toHaveBeenCalled();\n expect(result).toEqual([\n {\n type: ClearSignContextType.ERROR,\n error: new Error(\"[ContextModule] TrustedNameLoader: invalid domain\"),\n },\n ]);\n });\n\n it(\"should return a payload\", async () => {\n vi.spyOn(mockCertificateLoader, \"loadCertificate\").mockResolvedValue(\n mockCertificate,\n );\n const input: TrustedNameContextInput = {\n chainId: 1,\n domain: \"hello.eth\",\n challenge: \"challenge\",\n deviceModelId: DeviceModelId.STAX,\n };\n\n const result = await loader.load(input);\n\n expect(mockCertificateLoader.loadCertificate).toHaveBeenCalledWith({\n keyId: \"testKeyId\",\n keyUsage: \"testKeyUsage\",\n targetDevice: DeviceModelId.STAX,\n });\n expect(result).toEqual([\n {\n type: ClearSignContextType.TRUSTED_NAME,\n payload: \"payload\",\n certificate: mockCertificate,\n },\n ]);\n });\n\n it(\"should return an error when unable to fetch the datasource\", async () => {\n // GIVEN\n const input: TrustedNameContextInput = {\n chainId: 1,\n domain: \"hello.eth\",\n challenge: \"challenge\",\n deviceModelId: DeviceModelId.STAX,\n };\n\n // WHEN\n vi.spyOn(\n mockTrustedNameDataSource,\n \"getDomainNamePayload\",\n ).mockResolvedValue(Left(new Error(\"error\")));\n const result = await loader.load(input);\n\n // THEN\n expect(result).toEqual([\n { type: ClearSignContextType.ERROR, error: new Error(\"error\") },\n ]);\n });\n });\n});\n"],
5
+ "mappings": "AAAA,OAAS,iBAAAA,MAAqB,kCAC9B,OAAS,QAAAC,EAAM,SAAAC,MAAa,YAI5B,OAAS,wBAAAC,MAA4B,kCAErC,OAEE,4BAAAC,MACK,iDAEP,MAAMC,EAAoB,KAAO,CAC/B,MAAO,GAAG,GAAG,EACb,KAAM,GAAG,GAAG,EACZ,KAAM,GAAG,GAAG,EACZ,MAAO,GAAG,GAAG,EACb,YAAa,CAAC,CAChB,GAEA,SAAS,2BAA4B,IAAM,CACzC,MAAMC,EAAmD,CACvD,qBAAsB,GAAG,GAAG,EAC5B,sBAAuB,GAAG,GAAG,CAC/B,EACMC,EAA8C,CAClD,gBAAiB,GAAG,GAAG,CACzB,EACMC,EAAS,IAAIJ,EACjBE,EACAC,EACAF,CACF,EAEMI,EAAkC,CACtC,eAAgB,EAChB,QAAS,IAAI,WAAW,CAAC,EAAG,EAAG,EAAG,CAAC,CAAC,CACtC,EAEA,WAAW,IAAM,CACf,GAAG,gBAAgB,EACnB,GAAG,MACDH,EACA,sBACF,EAAE,kBACAJ,EAAM,CACJ,KAAM,UACN,MAAO,YACP,SAAU,cACZ,CAAC,CACH,CACF,CAAC,EAED,SAAS,qBAAsB,IAAM,CACnC,MAAMQ,EAAsC,CAC1C,QAAS,EACT,OAAQ,YACR,UAAW,YACX,cAAeV,EAAc,IAC/B,EAEA,GAAG,qCAAsC,IAAM,CAC7C,OACEQ,EAAO,UAAUE,EAAY,CAACP,EAAqB,YAAY,CAAC,CAClE,EAAE,KAAK,EAAI,CACb,CAAC,EAED,GAAG,gDAAiD,IAAM,CACxD,OAAOK,EAAO,UAAUE,EAAY,CAACP,EAAqB,KAAK,CAAC,CAAC,EAAE,KACjE,EACF,CACF,CAAC,EAED,GAAG,KAAK,CACN,CAAC,KAAM,YAAY,EACnB,CAAC,OAAW,iBAAiB,EAC7B,CAAC,CAAC,EAAG,cAAc,EACnB,CAAC,SAAU,cAAc,EACzB,CAAC,IAAK,cAAc,CACtB,CAAC,EAAE,6BAA8B,CAACQ,EAAOC,IAAiB,CACxD,OAAOJ,EAAO,UAAUG,EAAO,CAACR,EAAqB,YAAY,CAAC,CAAC,EAAE,KACnE,EACF,CACF,CAAC,EAED,GAAG,KAAK,CACN,CAAC,CAAE,GAAGO,EAAY,QAAS,MAAU,EAAG,iBAAiB,EACzD,CAAC,CAAE,GAAGA,EAAY,OAAQ,MAAU,EAAG,gBAAgB,EACvD,CAAC,CAAE,GAAGA,EAAY,UAAW,MAAU,EAAG,mBAAmB,EAC7D,CAAC,CAAE,GAAGA,EAAY,cAAe,MAAU,EAAG,sBAAsB,CACtE,CAAC,EAAE,6BAA8B,CAACC,EAAOC,IAAiB,CACxD,OAAOJ,EAAO,UAAUG,EAAO,CAACR,EAAqB,YAAY,CAAC,CAAC,EAAE,KACnE,EACF,CACF,CAAC,EAED,GAAG,KAAK,CACN,CAAC,CAAE,GAAGO,EAAY,OAAQ,EAAG,EAAG,cAAc,EAC9C,CAAC,CAAE,GAAGA,EAAY,UAAW,EAAG,EAAG,iBAAiB,EACpD,CAAC,CAAE,GAAGA,EAAY,QAAS,GAAI,EAAG,gBAAgB,EAClD,CAAC,CAAE,GAAGA,EAAY,QAAS,IAAK,EAAG,cAAc,EACjD,CAAC,CAAE,GAAGA,EAAY,OAAQ,GAAI,EAAG,gBAAgB,EACjD,CAAC,CAAE,GAAGA,EAAY,UAAW,GAAI,EAAG,mBAAmB,CACzD,CAAC,EAAE,6BAA8B,CAACC,EAAOC,IAAiB,CACxD,OAAOJ,EAAO,UAAUG,EAAO,CAACR,EAAqB,YAAY,CAAC,CAAC,EAAE,KACnE,EACF,CACF,CAAC,CACH,CAAC,EAED,SAAS,gBAAiB,IAAM,CAC9B,GAAG,kDAAmD,SAAY,CAChE,MAAMQ,EAAiC,CACrC,QAAS,EACT,OAAQ,8DACR,UAAW,YACX,cAAeX,EAAc,IAC/B,EAEMa,EAAS,MAAML,EAAO,KAAKG,CAAK,EAEtC,OAAOJ,EAAsB,eAAe,EAAE,IAAI,iBAAiB,EACnE,OAAOM,CAAM,EAAE,QAAQ,CACrB,CACE,KAAMV,EAAqB,MAC3B,MAAO,IAAI,MAAM,mDAAmD,CACtE,CACF,CAAC,CACH,CAAC,EAED,GAAG,kDAAmD,SAAY,CAChE,MAAMQ,EAAiC,CACrC,QAAS,EACT,OAAQ,iBACR,UAAW,YACX,cAAeX,EAAc,IAC/B,EAEMa,EAAS,MAAML,EAAO,KAAKG,CAAK,EAEtC,OAAOJ,EAAsB,eAAe,EAAE,IAAI,iBAAiB,EACnE,OAAOM,CAAM,EAAE,QAAQ,CACrB,CACE,KAAMV,EAAqB,MAC3B,MAAO,IAAI,MAAM,mDAAmD,CACtE,CACF,CAAC,CACH,CAAC,EAED,GAAG,0BAA2B,SAAY,CACxC,GAAG,MAAMI,EAAuB,iBAAiB,EAAE,kBACjDE,CACF,EACA,MAAME,EAAiC,CACrC,QAAS,EACT,OAAQ,YACR,UAAW,YACX,cAAeX,EAAc,IAC/B,EAEMa,EAAS,MAAML,EAAO,KAAKG,CAAK,EAEtC,OAAOJ,EAAsB,eAAe,EAAE,qBAAqB,CACjE,MAAO,YACP,SAAU,eACV,aAAcP,EAAc,IAC9B,CAAC,EACD,OAAOa,CAAM,EAAE,QAAQ,CACrB,CACE,KAAMV,EAAqB,aAC3B,QAAS,UACT,YAAaM,CACf,CACF,CAAC,CACH,CAAC,EAED,GAAG,6DAA8D,SAAY,CAE3E,MAAME,EAAiC,CACrC,QAAS,EACT,OAAQ,YACR,UAAW,YACX,cAAeX,EAAc,IAC/B,EAGA,GAAG,MACDM,EACA,sBACF,EAAE,kBAAkBL,EAAK,IAAI,MAAM,OAAO,CAAC,CAAC,EAC5C,MAAMY,EAAS,MAAML,EAAO,KAAKG,CAAK,EAGtC,OAAOE,CAAM,EAAE,QAAQ,CACrB,CAAE,KAAMV,EAAqB,MAAO,MAAO,IAAI,MAAM,OAAO,CAAE,CAChE,CAAC,CACH,CAAC,CACH,CAAC,CACH,CAAC",
6
+ "names": ["DeviceModelId", "Left", "Right", "ClearSignContextType", "TrustedNameContextLoader", "mockLoggerFactory", "mockTrustedNameDataSource", "mockCertificateLoader", "loader", "mockCertificate", "validInput", "input", "_description", "result"]
7
7
  }
@@ -1,2 +1,2 @@
1
- var _=Object.defineProperty;var h=Object.getOwnPropertyDescriptor;var m=(c,e,n,i)=>{for(var o=i>1?void 0:i?h(e,n):e,r=c.length-1,s;r>=0;r--)(s=c[r])&&(o=(i?s(e,n,o):s(o))||o);return i&&o&&_(e,n,o),o},g=(c,e)=>(n,i)=>e(n,i,c);import C from"axios";import I from"crypto-js/sha224";import{inject as F,injectable as x}from"inversify";import{Left as p,Right as M}from"purify-ts";import{configTypes as D}from"../../config/di/configTypes";import{LEDGER_CLIENT_VERSION_HEADER as T,LEDGER_ORIGIN_TOKEN_HEADER as b}from"../../shared/constant/HttpHeaders";import{TypedDataCalldataParamPresence as u}from"../../shared/model/TypedDataClearSignContext";import v from"../../../package.json";let d=class{constructor(e){this.config=e}async getTypedDataFilters({chainId:e,address:n,schema:i,version:o}){let r;try{const s=await C.request({method:"GET",url:`${this.config.cal.url}/dapps`,params:{contracts:n,chain_id:e,output:"descriptors_eip712",descriptors_eip712_version:o,descriptors_eip712:"<set>",ref:`branch:${this.config.cal.branch}`},headers:{[T]:`context-module/${v.version}`,[b]:this.config.originToken}}),a=I(JSON.stringify(this.sortTypes(i)).replace(" ","")).toString();n=n.toLowerCase();const f=s.data?.[0]?.descriptors_eip712?.[n]?.[a];if(!f)return p(new Error(`[ContextModule] HttpTypedDataDataSource: no typed data filters for address ${n} on chain ${e} for schema ${a}`));if(!f.schema||!Array.isArray(f.instructions))return p(new Error(`[ContextModule] HttpTypedDataDataSource: no message info for address ${n} on chain ${e} for schema ${a}`));const l=[],y={};for(const t of f.instructions)if(this.isInstructionContractInfo(t,this.config.cal.mode))r={displayName:t.display_name,signature:t.signatures[this.config.cal.mode],filtersCount:t.field_mappers_count};else if(o==="v1"&&this.isInstructionFieldV1(t,this.config.cal.mode))l.push({type:"raw",displayName:t.display_name,path:t.field_path,signature:t.signatures[this.config.cal.mode]});else if(this.isInstructionFieldV2(t,this.config.cal.mode))l.push({type:t.format,displayName:t.display_name,path:t.field_path,signature:t.signatures[this.config.cal.mode]});else if(this.isInstructionFieldV2WithCoinRef(t,this.config.cal.mode))l.push({type:t.format,displayName:t.display_name,path:t.field_path,signature:t.signatures[this.config.cal.mode],tokenIndex:t.coin_ref});else if(this.isInstructionFieldV2WithName(t,this.config.cal.mode))l.push({type:t.format,displayName:t.display_name,path:t.field_path,signature:t.signatures[this.config.cal.mode],types:t.name_types,sources:t.name_sources,typesAndSourcesPayload:this.formatTrustedNameTypesAndSources(t)});else if(this.isInstructionCalldataInfo(t,this.config.cal.mode))y[t.calldata_index]={displayName:t.display_name,calldataIndex:t.calldata_index,valueFlag:t.value_filter_flag,calleeFlag:this.convertCalldataPresenceFlag(t.callee_filter_flag),amountFlag:t.amount_filter_flag,spenderFlag:this.convertCalldataPresenceFlag(t.spender_filter_flag),chainIdFlag:t.chain_id_filter_flag,selectorFlag:t.selector_filter_flag,signature:t.signatures[this.config.cal.mode]};else if(this.isInstructionFieldV2Calldata(t,this.config.cal.mode))l.push({type:t.format,displayName:t.display_name,path:t.field_path,signature:t.signatures[this.config.cal.mode],calldataIndex:t.calldata_index});else return p(new Error(`[ContextModule] HttpTypedDataDataSource: invalid typed data field for address ${n} on chain ${e} for schema ${a}`));return r?M({messageInfo:r,filters:l,calldatasInfos:y}):p(new Error(`[ContextModule] HttpTypedDataDataSource: no message info for address ${n} on chain ${e} for schema ${a}`))}catch{return p(new Error("[ContextModule] HttpTypedDataDataSource: Failed to fetch typed data informations"))}}convertCalldataPresenceFlag(e){switch(e){case"none":return u.None;case"present":return u.Present;case"verifying_contract":return u.VerifyingContract;default:{const n=e;throw new Error(`Unhandled flag: ${n}`)}}}formatTrustedNameTypesAndSources(e){const n=e.name_types.length,i=e.name_sources.length,o=e.descriptor.slice((n+i)*2*-1,i*2*-1),r=e.descriptor.slice(i*2*-1),s=n.toString(16).padStart(2,"0"),a=i.toString(16).padStart(2,"0");return s+o+a+r}isInstructionFieldV1(e,n){return typeof e=="object"&&typeof e.display_name=="string"&&typeof e.field_path=="string"&&typeof e.signatures=="object"&&typeof e.signatures[n]=="string"}isInstructionFieldV2(e,n){return typeof e=="object"&&typeof e.display_name=="string"&&typeof e.field_path=="string"&&typeof e.signatures=="object"&&typeof e.signatures[n]=="string"&&typeof e.format=="string"&&["raw","datetime"].includes(e.format)&&e.coin_ref===void 0}isInstructionFieldV2WithCoinRef(e,n){return typeof e=="object"&&typeof e.display_name=="string"&&typeof e.field_path=="string"&&typeof e.signatures=="object"&&typeof e.signatures[n]=="string"&&typeof e.format=="string"&&["token","amount"].includes(e.format)&&typeof e.coin_ref=="number"}isInstructionFieldV2WithName(e,n){return typeof e=="object"&&typeof e.display_name=="string"&&typeof e.field_path=="string"&&typeof e.signatures=="object"&&typeof e.signatures[n]=="string"&&typeof e.format=="string"&&e.format==="trusted-name"&&e.coin_ref===void 0&&Array.isArray(e.name_types)&&Array.isArray(e.name_sources)&&e.name_types.every(i=>typeof i=="string")&&e.name_sources.every(i=>typeof i=="string")}isInstructionContractInfo(e,n){return typeof e=="object"&&typeof e.display_name=="string"&&typeof e.field_mappers_count=="number"&&typeof e.signatures=="object"&&typeof e.signatures[n]=="string"&&e.field_path===void 0}isInstructionCalldataInfo(e,n){return typeof e=="object"&&typeof e.type=="string"&&e.type==="calldata"&&typeof e.display_name=="string"&&typeof e.calldata_index=="number"&&typeof e.value_filter_flag=="boolean"&&typeof e.chain_id_filter_flag=="boolean"&&typeof e.selector_filter_flag=="boolean"&&typeof e.amount_filter_flag=="boolean"&&["none","present","verifying_contract"].includes(e.callee_filter_flag)&&["none","present","verifying_contract"].includes(e.spender_filter_flag)&&typeof e.signatures=="object"&&typeof e.signatures[n]=="string"}isInstructionFieldV2Calldata(e,n){return typeof e=="object"&&typeof e.display_name=="string"&&typeof e.field_path=="string"&&typeof e.signatures=="object"&&typeof e.signatures[n]=="string"&&typeof e.format=="string"&&["calldata-value","calldata-callee","calldata-chain-id","calldata-selector","calldata-amount","calldata-spender"].includes(e.format)&&typeof e.calldata_index=="number"}sortTypes(e){return Object.fromEntries(Object.entries(e).sort(([n],[i])=>n.localeCompare(i)).map(([n,i])=>[n,i.map(o=>({name:o.name,type:o.type}))]))}};d=m([x(),g(0,F(D.Config))],d);export{d as HttpTypedDataDataSource};
1
+ var _=Object.defineProperty;var h=Object.getOwnPropertyDescriptor;var m=(c,e,n,i)=>{for(var o=i>1?void 0:i?h(e,n):e,r=c.length-1,s;r>=0;r--)(s=c[r])&&(o=(i?s(e,n,o):s(o))||o);return i&&o&&_(e,n,o),o},g=(c,e)=>(n,i)=>e(n,i,c);import C from"axios";import I from"crypto-js/sha224";import{inject as F,injectable as x}from"inversify";import{Left as p,Right as M}from"purify-ts";import{configTypes as D}from"../../config/di/configTypes";import{LEDGER_CLIENT_VERSION_HEADER as T,LEDGER_ORIGIN_TOKEN_HEADER as b}from"../../shared/constant/HttpHeaders";import{TypedDataCalldataParamPresence as u}from"../../shared/model/TypedDataClearSignContext";import v from"../../../package.json";let f=class{constructor(e){this.config=e}async getTypedDataFilters({chainId:e,address:n,schema:i,version:o}){let r;try{const s=await C.request({method:"GET",url:`${this.config.cal.url}/dapps`,params:{contracts:n,chain_id:e,output:"descriptors_eip712",descriptors_eip712_version:o,descriptors_eip712:"<set>",ref:`branch:${this.config.cal.branch}`},headers:{[T]:`context-module/${v.version}`,[b]:this.config.originToken}}),a=I(JSON.stringify(this.sortTypes(i)).replace(" ","")).toString();n=n.toLowerCase();const d=s.data?.[0]?.descriptors_eip712?.[n]?.[a];if(!d)return p(new Error(`[ContextModule] HttpTypedDataDataSource: no typed data filters for address ${n} on chain ${e} for schema ${a}`));if(!Array.isArray(d.instructions))return p(new Error(`[ContextModule] HttpTypedDataDataSource: no message info for address ${n} on chain ${e} for schema ${a}`));const l=[],y={};for(const t of d.instructions)if(this.isInstructionContractInfo(t,this.config.cal.mode))r={displayName:t.display_name,signature:t.signatures[this.config.cal.mode],filtersCount:t.field_mappers_count};else if(o==="v1"&&this.isInstructionFieldV1(t,this.config.cal.mode))l.push({type:"raw",displayName:t.display_name,path:t.field_path,signature:t.signatures[this.config.cal.mode]});else if(this.isInstructionFieldV2(t,this.config.cal.mode))l.push({type:t.format,displayName:t.display_name,path:t.field_path,signature:t.signatures[this.config.cal.mode]});else if(this.isInstructionFieldV2WithCoinRef(t,this.config.cal.mode))l.push({type:t.format,displayName:t.display_name,path:t.field_path,signature:t.signatures[this.config.cal.mode],tokenIndex:t.coin_ref});else if(this.isInstructionFieldV2WithName(t,this.config.cal.mode))l.push({type:t.format,displayName:t.display_name,path:t.field_path,signature:t.signatures[this.config.cal.mode],types:t.name_types,sources:t.name_sources,typesAndSourcesPayload:this.formatTrustedNameTypesAndSources(t)});else if(this.isInstructionCalldataInfo(t,this.config.cal.mode))y[t.calldata_index]={displayName:t.display_name,calldataIndex:t.calldata_index,valueFlag:t.value_filter_flag,calleeFlag:this.convertCalldataPresenceFlag(t.callee_filter_flag),amountFlag:t.amount_filter_flag,spenderFlag:this.convertCalldataPresenceFlag(t.spender_filter_flag),chainIdFlag:t.chain_id_filter_flag,selectorFlag:t.selector_filter_flag,signature:t.signatures[this.config.cal.mode]};else if(this.isInstructionFieldV2Calldata(t,this.config.cal.mode))l.push({type:t.format,displayName:t.display_name,path:t.field_path,signature:t.signatures[this.config.cal.mode],calldataIndex:t.calldata_index});else return p(new Error(`[ContextModule] HttpTypedDataDataSource: invalid typed data field for address ${n} on chain ${e} for schema ${a}`));return r?M({messageInfo:r,filters:l,calldatasInfos:y}):p(new Error(`[ContextModule] HttpTypedDataDataSource: no message info for address ${n} on chain ${e} for schema ${a}`))}catch{return p(new Error("[ContextModule] HttpTypedDataDataSource: Failed to fetch typed data informations"))}}convertCalldataPresenceFlag(e){switch(e){case"none":return u.None;case"present":return u.Present;case"verifying_contract":return u.VerifyingContract;default:{const n=e;throw new Error(`Unhandled flag: ${n}`)}}}formatTrustedNameTypesAndSources(e){const n=e.name_types.length,i=e.name_sources.length,o=e.descriptor.slice((n+i)*2*-1,i*2*-1),r=e.descriptor.slice(i*2*-1),s=n.toString(16).padStart(2,"0"),a=i.toString(16).padStart(2,"0");return s+o+a+r}isInstructionFieldV1(e,n){return typeof e=="object"&&typeof e.display_name=="string"&&typeof e.field_path=="string"&&typeof e.signatures=="object"&&typeof e.signatures[n]=="string"}isInstructionFieldV2(e,n){return typeof e=="object"&&typeof e.display_name=="string"&&typeof e.field_path=="string"&&typeof e.signatures=="object"&&typeof e.signatures[n]=="string"&&typeof e.format=="string"&&["raw","datetime"].includes(e.format)&&e.coin_ref===void 0}isInstructionFieldV2WithCoinRef(e,n){return typeof e=="object"&&typeof e.display_name=="string"&&typeof e.field_path=="string"&&typeof e.signatures=="object"&&typeof e.signatures[n]=="string"&&typeof e.format=="string"&&["token","amount"].includes(e.format)&&typeof e.coin_ref=="number"}isInstructionFieldV2WithName(e,n){return typeof e=="object"&&typeof e.display_name=="string"&&typeof e.field_path=="string"&&typeof e.signatures=="object"&&typeof e.signatures[n]=="string"&&typeof e.format=="string"&&e.format==="trusted-name"&&e.coin_ref===void 0&&Array.isArray(e.name_types)&&Array.isArray(e.name_sources)&&e.name_types.every(i=>typeof i=="string")&&e.name_sources.every(i=>typeof i=="string")}isInstructionContractInfo(e,n){return typeof e=="object"&&typeof e.display_name=="string"&&typeof e.field_mappers_count=="number"&&typeof e.signatures=="object"&&typeof e.signatures[n]=="string"&&e.field_path===void 0}isInstructionCalldataInfo(e,n){return typeof e=="object"&&typeof e.type=="string"&&e.type==="calldata"&&typeof e.display_name=="string"&&typeof e.calldata_index=="number"&&typeof e.value_filter_flag=="boolean"&&typeof e.chain_id_filter_flag=="boolean"&&typeof e.selector_filter_flag=="boolean"&&typeof e.amount_filter_flag=="boolean"&&["none","present","verifying_contract"].includes(e.callee_filter_flag)&&["none","present","verifying_contract"].includes(e.spender_filter_flag)&&typeof e.signatures=="object"&&typeof e.signatures[n]=="string"}isInstructionFieldV2Calldata(e,n){return typeof e=="object"&&typeof e.display_name=="string"&&typeof e.field_path=="string"&&typeof e.signatures=="object"&&typeof e.signatures[n]=="string"&&typeof e.format=="string"&&["calldata-value","calldata-callee","calldata-chain-id","calldata-selector","calldata-amount","calldata-spender"].includes(e.format)&&typeof e.calldata_index=="number"}sortTypes(e){return Object.fromEntries(Object.entries(e).sort(([n],[i])=>n.localeCompare(i)).map(([n,i])=>[n,i.map(o=>({name:o.name,type:o.type}))]))}};f=m([x(),g(0,F(D.Config))],f);export{f as HttpTypedDataDataSource};
2
2
  //# sourceMappingURL=HttpTypedDataDataSource.js.map