@ledgerhq/context-module 1.12.0 → 1.14.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 (170) 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/model/ContextModuleConfig.js +1 -1
  13. package/lib/cjs/src/config/model/ContextModuleConfig.js.map +1 -1
  14. package/lib/cjs/src/di.js +1 -1
  15. package/lib/cjs/src/di.js.map +2 -2
  16. package/lib/cjs/src/dynamic-network/data/HttpDynamicNetworkDataSource.js +1 -1
  17. package/lib/cjs/src/dynamic-network/data/HttpDynamicNetworkDataSource.js.map +3 -3
  18. package/lib/cjs/src/dynamic-network/domain/DynamicNetworkContextLoader.js +1 -1
  19. package/lib/cjs/src/dynamic-network/domain/DynamicNetworkContextLoader.js.map +3 -3
  20. package/lib/cjs/src/dynamic-network/domain/DynamicNetworkContextLoader.test.js +1 -1
  21. package/lib/cjs/src/dynamic-network/domain/DynamicNetworkContextLoader.test.js.map +3 -3
  22. package/lib/cjs/src/external-plugin/domain/ExternalPluginContextLoader.js +1 -1
  23. package/lib/cjs/src/external-plugin/domain/ExternalPluginContextLoader.js.map +3 -3
  24. package/lib/cjs/src/external-plugin/domain/ExternalPluginContextLoader.test.js +1 -1
  25. package/lib/cjs/src/external-plugin/domain/ExternalPluginContextLoader.test.js.map +3 -3
  26. package/lib/cjs/src/nft/domain/NftContextLoader.js +1 -1
  27. package/lib/cjs/src/nft/domain/NftContextLoader.js.map +3 -3
  28. package/lib/cjs/src/nft/domain/NftContextLoader.test.js +1 -1
  29. package/lib/cjs/src/nft/domain/NftContextLoader.test.js.map +3 -3
  30. package/lib/cjs/src/signing-tracker/data/SigningTrackerDataSource.js +2 -0
  31. package/lib/cjs/src/signing-tracker/data/SigningTrackerDataSource.js.map +7 -0
  32. package/lib/cjs/src/solana/domain/DefaultSolanaContextLoader.js.map +1 -1
  33. package/lib/cjs/src/solana/domain/DefaultSolanaContextLoader.test.js +1 -1
  34. package/lib/cjs/src/solana/domain/DefaultSolanaContextLoader.test.js.map +3 -3
  35. package/lib/cjs/src/solanaLifi/domain/SolanaLifiContextLoader.test.js +1 -1
  36. package/lib/cjs/src/solanaLifi/domain/SolanaLifiContextLoader.test.js.map +3 -3
  37. package/lib/cjs/src/solanaToken/domain/SolanaTokenContextLoader.test.js +1 -1
  38. package/lib/cjs/src/solanaToken/domain/SolanaTokenContextLoader.test.js.map +3 -3
  39. package/lib/cjs/src/token/domain/TokenContextLoader.js +1 -1
  40. package/lib/cjs/src/token/domain/TokenContextLoader.js.map +3 -3
  41. package/lib/cjs/src/token/domain/TokenContextLoader.test.js +1 -1
  42. package/lib/cjs/src/token/domain/TokenContextLoader.test.js.map +3 -3
  43. package/lib/cjs/src/transaction-check/domain/TransactionCheckContextLoader.js +1 -1
  44. package/lib/cjs/src/transaction-check/domain/TransactionCheckContextLoader.js.map +3 -3
  45. package/lib/cjs/src/transaction-check/domain/TransactionCheckContextLoader.test.js +1 -1
  46. package/lib/cjs/src/transaction-check/domain/TransactionCheckContextLoader.test.js.map +3 -3
  47. package/lib/cjs/src/transaction-check/domain/TypedDataCheckContextLoader.js +1 -1
  48. package/lib/cjs/src/transaction-check/domain/TypedDataCheckContextLoader.js.map +3 -3
  49. package/lib/cjs/src/transaction-check/domain/TypedDataCheckContextLoader.test.js +1 -1
  50. package/lib/cjs/src/transaction-check/domain/TypedDataCheckContextLoader.test.js.map +3 -3
  51. package/lib/cjs/src/trusted-name/di/trustedNameModuleFactory.js +1 -1
  52. package/lib/cjs/src/trusted-name/di/trustedNameModuleFactory.js.map +3 -3
  53. package/lib/cjs/src/trusted-name/domain/TrustedNameContextLoader.js +1 -1
  54. package/lib/cjs/src/trusted-name/domain/TrustedNameContextLoader.js.map +3 -3
  55. package/lib/cjs/src/trusted-name/domain/TrustedNameContextLoader.test.js +1 -1
  56. package/lib/cjs/src/trusted-name/domain/TrustedNameContextLoader.test.js.map +3 -3
  57. package/lib/cjs/src/typed-data/domain/DefaultTypedDataContextLoader.js +1 -1
  58. package/lib/cjs/src/typed-data/domain/DefaultTypedDataContextLoader.js.map +3 -3
  59. package/lib/cjs/src/typed-data/domain/DefaultTypedDataContextLoader.test.js +1 -1
  60. package/lib/cjs/src/typed-data/domain/DefaultTypedDataContextLoader.test.js.map +3 -3
  61. package/lib/cjs/src/uniswap/domain/UniswapContextLoader.js +1 -1
  62. package/lib/cjs/src/uniswap/domain/UniswapContextLoader.js.map +3 -3
  63. package/lib/cjs/src/uniswap/domain/UniswapContextLoader.test.js +1 -1
  64. package/lib/cjs/src/uniswap/domain/UniswapContextLoader.test.js.map +3 -3
  65. package/lib/esm/package.json +1 -1
  66. package/lib/esm/src/ContextModuleBuilder.js +1 -1
  67. package/lib/esm/src/ContextModuleBuilder.js.map +3 -3
  68. package/lib/esm/src/ContextModuleBuilder.test.js +1 -1
  69. package/lib/esm/src/ContextModuleBuilder.test.js.map +3 -3
  70. package/lib/esm/src/DefaultContextModule.test.js +1 -1
  71. package/lib/esm/src/DefaultContextModule.test.js.map +3 -3
  72. package/lib/esm/src/calldata/domain/CalldataContextLoader.js +1 -1
  73. package/lib/esm/src/calldata/domain/CalldataContextLoader.js.map +3 -3
  74. package/lib/esm/src/calldata/domain/CalldataContextLoader.test.js +1 -1
  75. package/lib/esm/src/calldata/domain/CalldataContextLoader.test.js.map +3 -3
  76. package/lib/esm/src/di.js +1 -1
  77. package/lib/esm/src/di.js.map +2 -2
  78. package/lib/esm/src/dynamic-network/data/HttpDynamicNetworkDataSource.js +1 -1
  79. package/lib/esm/src/dynamic-network/data/HttpDynamicNetworkDataSource.js.map +3 -3
  80. package/lib/esm/src/dynamic-network/domain/DynamicNetworkContextLoader.js +1 -1
  81. package/lib/esm/src/dynamic-network/domain/DynamicNetworkContextLoader.js.map +3 -3
  82. package/lib/esm/src/dynamic-network/domain/DynamicNetworkContextLoader.test.js +1 -1
  83. package/lib/esm/src/dynamic-network/domain/DynamicNetworkContextLoader.test.js.map +3 -3
  84. package/lib/esm/src/external-plugin/domain/ExternalPluginContextLoader.js +1 -1
  85. package/lib/esm/src/external-plugin/domain/ExternalPluginContextLoader.js.map +3 -3
  86. package/lib/esm/src/external-plugin/domain/ExternalPluginContextLoader.test.js +1 -1
  87. package/lib/esm/src/external-plugin/domain/ExternalPluginContextLoader.test.js.map +3 -3
  88. package/lib/esm/src/nft/domain/NftContextLoader.js +1 -1
  89. package/lib/esm/src/nft/domain/NftContextLoader.js.map +3 -3
  90. package/lib/esm/src/nft/domain/NftContextLoader.test.js +1 -1
  91. package/lib/esm/src/nft/domain/NftContextLoader.test.js.map +3 -3
  92. package/lib/esm/src/signing-tracker/data/SigningTrackerDataSource.js +1 -0
  93. package/lib/esm/src/signing-tracker/data/SigningTrackerDataSource.js.map +7 -0
  94. package/lib/esm/src/solana/domain/DefaultSolanaContextLoader.js.map +1 -1
  95. package/lib/esm/src/solana/domain/DefaultSolanaContextLoader.test.js +1 -1
  96. package/lib/esm/src/solana/domain/DefaultSolanaContextLoader.test.js.map +3 -3
  97. package/lib/esm/src/solanaLifi/domain/SolanaLifiContextLoader.test.js +1 -1
  98. package/lib/esm/src/solanaLifi/domain/SolanaLifiContextLoader.test.js.map +3 -3
  99. package/lib/esm/src/solanaToken/domain/SolanaTokenContextLoader.test.js +1 -1
  100. package/lib/esm/src/solanaToken/domain/SolanaTokenContextLoader.test.js.map +3 -3
  101. package/lib/esm/src/token/domain/TokenContextLoader.js +1 -1
  102. package/lib/esm/src/token/domain/TokenContextLoader.js.map +3 -3
  103. package/lib/esm/src/token/domain/TokenContextLoader.test.js +1 -1
  104. package/lib/esm/src/token/domain/TokenContextLoader.test.js.map +3 -3
  105. package/lib/esm/src/transaction-check/domain/TransactionCheckContextLoader.js +1 -1
  106. package/lib/esm/src/transaction-check/domain/TransactionCheckContextLoader.js.map +3 -3
  107. package/lib/esm/src/transaction-check/domain/TransactionCheckContextLoader.test.js +1 -1
  108. package/lib/esm/src/transaction-check/domain/TransactionCheckContextLoader.test.js.map +3 -3
  109. package/lib/esm/src/transaction-check/domain/TypedDataCheckContextLoader.js +1 -1
  110. package/lib/esm/src/transaction-check/domain/TypedDataCheckContextLoader.js.map +3 -3
  111. package/lib/esm/src/transaction-check/domain/TypedDataCheckContextLoader.test.js +1 -1
  112. package/lib/esm/src/transaction-check/domain/TypedDataCheckContextLoader.test.js.map +3 -3
  113. package/lib/esm/src/trusted-name/di/trustedNameModuleFactory.js +1 -1
  114. package/lib/esm/src/trusted-name/di/trustedNameModuleFactory.js.map +3 -3
  115. package/lib/esm/src/trusted-name/domain/TrustedNameContextLoader.js +1 -1
  116. package/lib/esm/src/trusted-name/domain/TrustedNameContextLoader.js.map +3 -3
  117. package/lib/esm/src/trusted-name/domain/TrustedNameContextLoader.test.js +1 -1
  118. package/lib/esm/src/trusted-name/domain/TrustedNameContextLoader.test.js.map +3 -3
  119. package/lib/esm/src/typed-data/domain/DefaultTypedDataContextLoader.js +1 -1
  120. package/lib/esm/src/typed-data/domain/DefaultTypedDataContextLoader.js.map +3 -3
  121. package/lib/esm/src/typed-data/domain/DefaultTypedDataContextLoader.test.js +1 -1
  122. package/lib/esm/src/typed-data/domain/DefaultTypedDataContextLoader.test.js.map +3 -3
  123. package/lib/esm/src/uniswap/domain/UniswapContextLoader.js +1 -1
  124. package/lib/esm/src/uniswap/domain/UniswapContextLoader.js.map +3 -3
  125. package/lib/esm/src/uniswap/domain/UniswapContextLoader.test.js +1 -1
  126. package/lib/esm/src/uniswap/domain/UniswapContextLoader.test.js.map +3 -3
  127. package/lib/types/src/ContextModuleBuilder.d.ts +9 -1
  128. package/lib/types/src/ContextModuleBuilder.d.ts.map +1 -1
  129. package/lib/types/src/calldata/domain/CalldataContextLoader.d.ts +3 -2
  130. package/lib/types/src/calldata/domain/CalldataContextLoader.d.ts.map +1 -1
  131. package/lib/types/src/config/model/ContextModuleConfig.d.ts +2 -0
  132. package/lib/types/src/config/model/ContextModuleConfig.d.ts.map +1 -1
  133. package/lib/types/src/di.d.ts.map +1 -1
  134. package/lib/types/src/dynamic-network/data/HttpDynamicNetworkDataSource.d.ts.map +1 -1
  135. package/lib/types/src/dynamic-network/domain/DynamicNetworkContextLoader.d.ts +3 -2
  136. package/lib/types/src/dynamic-network/domain/DynamicNetworkContextLoader.d.ts.map +1 -1
  137. package/lib/types/src/external-plugin/domain/ExternalPluginContextLoader.d.ts +3 -2
  138. package/lib/types/src/external-plugin/domain/ExternalPluginContextLoader.d.ts.map +1 -1
  139. package/lib/types/src/nft/domain/NftContextLoader.d.ts +3 -2
  140. package/lib/types/src/nft/domain/NftContextLoader.d.ts.map +1 -1
  141. package/lib/types/src/signing-tracker/data/SigningTrackerDataSource.d.ts +40 -0
  142. package/lib/types/src/signing-tracker/data/SigningTrackerDataSource.d.ts.map +1 -0
  143. package/lib/types/src/token/domain/TokenContextLoader.d.ts +3 -2
  144. package/lib/types/src/token/domain/TokenContextLoader.d.ts.map +1 -1
  145. package/lib/types/src/transaction-check/domain/TransactionCheckContextLoader.d.ts +3 -2
  146. package/lib/types/src/transaction-check/domain/TransactionCheckContextLoader.d.ts.map +1 -1
  147. package/lib/types/src/transaction-check/domain/TypedDataCheckContextLoader.d.ts +3 -2
  148. package/lib/types/src/transaction-check/domain/TypedDataCheckContextLoader.d.ts.map +1 -1
  149. package/lib/types/src/trusted-name/di/trustedNameModuleFactory.d.ts +2 -1
  150. package/lib/types/src/trusted-name/di/trustedNameModuleFactory.d.ts.map +1 -1
  151. package/lib/types/src/trusted-name/domain/TrustedNameContextLoader.d.ts +5 -6
  152. package/lib/types/src/trusted-name/domain/TrustedNameContextLoader.d.ts.map +1 -1
  153. package/lib/types/src/typed-data/domain/DefaultTypedDataContextLoader.d.ts +3 -1
  154. package/lib/types/src/typed-data/domain/DefaultTypedDataContextLoader.d.ts.map +1 -1
  155. package/lib/types/src/uniswap/domain/UniswapContextLoader.d.ts +3 -2
  156. package/lib/types/src/uniswap/domain/UniswapContextLoader.d.ts.map +1 -1
  157. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  158. package/package.json +4 -4
  159. package/lib/cjs/src/shared/utils/NullLoggerPublisherService.js +0 -2
  160. package/lib/cjs/src/shared/utils/NullLoggerPublisherService.js.map +0 -7
  161. package/lib/cjs/src/shared/utils/NullLoggerPublisherService.test.js +0 -2
  162. package/lib/cjs/src/shared/utils/NullLoggerPublisherService.test.js.map +0 -7
  163. package/lib/esm/src/shared/utils/NullLoggerPublisherService.js +0 -2
  164. package/lib/esm/src/shared/utils/NullLoggerPublisherService.js.map +0 -7
  165. package/lib/esm/src/shared/utils/NullLoggerPublisherService.test.js +0 -2
  166. package/lib/esm/src/shared/utils/NullLoggerPublisherService.test.js.map +0 -7
  167. package/lib/types/src/shared/utils/NullLoggerPublisherService.d.ts +0 -3
  168. package/lib/types/src/shared/utils/NullLoggerPublisherService.d.ts.map +0 -1
  169. package/lib/types/src/shared/utils/NullLoggerPublisherService.test.d.ts +0 -2
  170. package/lib/types/src/shared/utils/NullLoggerPublisherService.test.d.ts.map +0 -1
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/calldata/domain/CalldataContextLoader.ts"],
4
- "sourcesContent": ["import {\n DeviceModelId,\n HexaString,\n isHexaString,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { MaybeAsync } from \"purify-ts\";\n\nimport type { CalldataDescriptorDataSource } from \"@/calldata/data/CalldataDescriptorDataSource\";\nimport { calldataTypes } from \"@/calldata/di/calldataTypes\";\nimport type { ProxyDataSource } from \"@/proxy/data/ProxyDataSource\";\nimport { proxyTypes } from \"@/proxy/di/proxyTypes\";\nimport { ContextLoader } from \"@/shared/domain/ContextLoader\";\nimport {\n ClearSignContext,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\n\nexport type CalldataContextInput = {\n to: HexaString;\n data: HexaString;\n selector: HexaString;\n chainId: number;\n deviceModelId: DeviceModelId;\n};\n\ntype GetContextsParams = {\n address: string;\n chainId: number;\n data: string;\n selector: HexaString;\n deviceModelId: DeviceModelId;\n};\n\nconst SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.TRANSACTION_INFO,\n ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n ClearSignContextType.PROXY_INFO,\n ClearSignContextType.ENUM,\n];\n\n@injectable()\nexport class CalldataContextLoader\n implements ContextLoader<CalldataContextInput>\n{\n constructor(\n @inject(calldataTypes.DappCalldataDescriptorDataSource)\n private dappDataSource: CalldataDescriptorDataSource,\n @inject(calldataTypes.TokenCalldataDescriptorDataSource)\n private tokenDataSource: CalldataDescriptorDataSource,\n @inject(proxyTypes.ProxyDataSource)\n private proxyDataSource: ProxyDataSource,\n ) {}\n\n canHandle(\n input: unknown,\n expectedTypes: ClearSignContextType[],\n ): input is CalldataContextInput {\n return (\n typeof input === \"object\" &&\n input !== null &&\n \"to\" in input &&\n \"data\" in input &&\n \"selector\" in input &&\n \"chainId\" in input &&\n \"deviceModelId\" in input &&\n input.deviceModelId !== undefined &&\n input.deviceModelId !== DeviceModelId.NANO_S &&\n typeof input.chainId === \"number\" &&\n isHexaString(input.to) &&\n input.to !== \"0x\" &&\n isHexaString(input.data) &&\n isHexaString(input.selector) &&\n input.selector !== \"0x\" &&\n SUPPORTED_TYPES.every((type) => expectedTypes.includes(type))\n );\n }\n\n async load(input: CalldataContextInput): Promise<ClearSignContext[]> {\n const { to, data, selector, chainId, deviceModelId } = input;\n\n const param: GetContextsParams = {\n address: to,\n chainId,\n selector,\n deviceModelId,\n data,\n };\n\n return this._getContexts(param, this.dappDataSource)\n .alt(this._getContexts(param, this.tokenDataSource))\n .alt(this._getContextsWithProxy(param, this.dappDataSource))\n .orDefault([\n {\n type: ClearSignContextType.ERROR,\n error: new Error(\n \"[ContextModule] CalldataContextLoader: No calldata contexts found\",\n ),\n },\n ]);\n }\n\n private _getContexts(\n { address, chainId, selector, deviceModelId }: GetContextsParams,\n datasource: CalldataDescriptorDataSource,\n ): MaybeAsync<ClearSignContext[]> {\n return MaybeAsync(async ({ liftMaybe }) => {\n const result = await datasource.getCalldataDescriptors({\n deviceModelId,\n address,\n chainId,\n selector,\n });\n\n return liftMaybe(result.toMaybe().filter((ctxs) => ctxs.length > 0));\n });\n }\n\n private _getContextsWithProxy(\n { address, chainId, selector, deviceModelId, data }: GetContextsParams,\n datasource: CalldataDescriptorDataSource,\n ): MaybeAsync<ClearSignContext[]> {\n const proxyAddress = MaybeAsync(async ({ liftMaybe }) => {\n const result = await this.proxyDataSource.getProxyImplementationAddress({\n calldata: data,\n proxyAddress: address,\n chainId,\n challenge: \"\",\n });\n return liftMaybe(result.toMaybe());\n });\n\n return proxyAddress\n .map<MaybeAsync<ClearSignContext[]>>(({ implementationAddress }) => {\n const params = {\n address: implementationAddress,\n chainId,\n selector,\n deviceModelId,\n data,\n };\n return this._getContexts(params, datasource).map((contexts) => [\n // Add a proxy info context to the list of contexts\n // to specify that the proxy info should be refetched during the provide step\n {\n type: ClearSignContextType.PROXY_INFO,\n payload: \"0x\",\n },\n ...contexts,\n ]);\n })\n .join(); // join the two MaybeAsyncs\n }\n}\n"],
5
- "mappings": "iOAAA,OACE,iBAAAA,EAEA,gBAAAC,MACK,kCACP,OAAS,UAAAC,EAAQ,cAAAC,MAAkB,YACnC,OAAS,cAAAC,MAAkB,YAG3B,OAAS,iBAAAC,MAAqB,8BAE9B,OAAS,cAAAC,MAAkB,wBAE3B,OAEE,wBAAAC,MACK,kCAkBP,MAAMC,EAA0C,CAC9CC,EAAqB,iBACrBA,EAAqB,8BACrBA,EAAqB,WACrBA,EAAqB,IACvB,EAGO,IAAMC,EAAN,KAEP,CACE,YAEUC,EAEAC,EAEAC,EACR,CALQ,oBAAAF,EAEA,qBAAAC,EAEA,qBAAAC,CACP,CAEH,UACEC,EACAC,EAC+B,CAC/B,OACE,OAAOD,GAAU,UACjBA,IAAU,MACV,OAAQA,GACR,SAAUA,GACV,aAAcA,GACd,YAAaA,GACb,kBAAmBA,GACnBA,EAAM,gBAAkB,QACxBA,EAAM,gBAAkBE,EAAc,QACtC,OAAOF,EAAM,SAAY,UACzBG,EAAaH,EAAM,EAAE,GACrBA,EAAM,KAAO,MACbG,EAAaH,EAAM,IAAI,GACvBG,EAAaH,EAAM,QAAQ,GAC3BA,EAAM,WAAa,MACnBN,EAAgB,MAAOU,GAASH,EAAc,SAASG,CAAI,CAAC,CAEhE,CAEA,MAAM,KAAKJ,EAA0D,CACnE,KAAM,CAAE,GAAAK,EAAI,KAAAC,EAAM,SAAAC,EAAU,QAAAC,EAAS,cAAAC,CAAc,EAAIT,EAEjDU,EAA2B,CAC/B,QAASL,EACT,QAAAG,EACA,SAAAD,EACA,cAAAE,EACA,KAAAH,CACF,EAEA,OAAO,KAAK,aAAaI,EAAO,KAAK,cAAc,EAChD,IAAI,KAAK,aAAaA,EAAO,KAAK,eAAe,CAAC,EAClD,IAAI,KAAK,sBAAsBA,EAAO,KAAK,cAAc,CAAC,EAC1D,UAAU,CACT,CACE,KAAMf,EAAqB,MAC3B,MAAO,IAAI,MACT,mEACF,CACF,CACF,CAAC,CACL,CAEQ,aACN,CAAE,QAAAgB,EAAS,QAAAH,EAAS,SAAAD,EAAU,cAAAE,CAAc,EAC5CG,EACgC,CAChC,OAAOC,EAAW,MAAO,CAAE,UAAAC,CAAU,IAAM,CACzC,MAAMC,EAAS,MAAMH,EAAW,uBAAuB,CACrD,cAAAH,EACA,QAAAE,EACA,QAAAH,EACA,SAAAD,CACF,CAAC,EAED,OAAOO,EAAUC,EAAO,QAAQ,EAAE,OAAQC,GAASA,EAAK,OAAS,CAAC,CAAC,CACrE,CAAC,CACH,CAEQ,sBACN,CAAE,QAAAL,EAAS,QAAAH,EAAS,SAAAD,EAAU,cAAAE,EAAe,KAAAH,CAAK,EAClDM,EACgC,CAWhC,OAVqBC,EAAW,MAAO,CAAE,UAAAC,CAAU,IAAM,CACvD,MAAMC,EAAS,MAAM,KAAK,gBAAgB,8BAA8B,CACtE,SAAUT,EACV,aAAcK,EACd,QAAAH,EACA,UAAW,EACb,CAAC,EACD,OAAOM,EAAUC,EAAO,QAAQ,CAAC,CACnC,CAAC,EAGE,IAAoC,CAAC,CAAE,sBAAAE,CAAsB,IAAM,CAClE,MAAMC,EAAS,CACb,QAASD,EACT,QAAAT,EACA,SAAAD,EACA,cAAAE,EACA,KAAAH,CACF,EACA,OAAO,KAAK,aAAaY,EAAQN,CAAU,EAAE,IAAKO,GAAa,CAG7D,CACE,KAAMxB,EAAqB,WAC3B,QAAS,IACX,EACA,GAAGwB,CACL,CAAC,CACH,CAAC,EACA,KAAK,CACV,CACF,EA/GavB,EAANwB,EAAA,CADNC,EAAW,EAKPC,EAAA,EAAAC,EAAOC,EAAc,gCAAgC,GAErDF,EAAA,EAAAC,EAAOC,EAAc,iCAAiC,GAEtDF,EAAA,EAAAC,EAAOE,EAAW,eAAe,IARzB7B",
6
- "names": ["DeviceModelId", "isHexaString", "inject", "injectable", "MaybeAsync", "calldataTypes", "proxyTypes", "ClearSignContextType", "SUPPORTED_TYPES", "ClearSignContextType", "CalldataContextLoader", "dappDataSource", "tokenDataSource", "proxyDataSource", "input", "expectedTypes", "DeviceModelId", "isHexaString", "type", "to", "data", "selector", "chainId", "deviceModelId", "param", "address", "datasource", "MaybeAsync", "liftMaybe", "result", "ctxs", "implementationAddress", "params", "contexts", "__decorateClass", "injectable", "__decorateParam", "inject", "calldataTypes", "proxyTypes"]
4
+ "sourcesContent": ["import {\n DeviceModelId,\n HexaString,\n isHexaString,\n LoggerPublisherService,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { MaybeAsync } from \"purify-ts\";\n\nimport type { CalldataDescriptorDataSource } from \"@/calldata/data/CalldataDescriptorDataSource\";\nimport { calldataTypes } from \"@/calldata/di/calldataTypes\";\nimport { configTypes } from \"@/config/di/configTypes\";\nimport type { ProxyDataSource } from \"@/proxy/data/ProxyDataSource\";\nimport { proxyTypes } from \"@/proxy/di/proxyTypes\";\nimport { ContextLoader } from \"@/shared/domain/ContextLoader\";\nimport {\n ClearSignContext,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\n\nexport type CalldataContextInput = {\n to: HexaString;\n data: HexaString;\n selector: HexaString;\n chainId: number;\n deviceModelId: DeviceModelId;\n};\n\ntype GetContextsParams = {\n address: string;\n chainId: number;\n data: string;\n selector: HexaString;\n deviceModelId: DeviceModelId;\n};\n\nconst SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.TRANSACTION_INFO,\n ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n ClearSignContextType.PROXY_INFO,\n ClearSignContextType.ENUM,\n];\n\n@injectable()\nexport class CalldataContextLoader\n implements ContextLoader<CalldataContextInput>\n{\n private logger: LoggerPublisherService;\n\n constructor(\n @inject(calldataTypes.DappCalldataDescriptorDataSource)\n private dappDataSource: CalldataDescriptorDataSource,\n @inject(calldataTypes.TokenCalldataDescriptorDataSource)\n private tokenDataSource: CalldataDescriptorDataSource,\n @inject(proxyTypes.ProxyDataSource)\n private proxyDataSource: ProxyDataSource,\n @inject(configTypes.ContextModuleLoggerFactory)\n loggerFactory: (tag: string) => LoggerPublisherService,\n ) {\n this.logger = loggerFactory(\"CalldataContextLoader\");\n }\n\n canHandle(\n input: unknown,\n expectedTypes: ClearSignContextType[],\n ): input is CalldataContextInput {\n return (\n typeof input === \"object\" &&\n input !== null &&\n \"to\" in input &&\n \"data\" in input &&\n \"selector\" in input &&\n \"chainId\" in input &&\n \"deviceModelId\" in input &&\n input.deviceModelId !== undefined &&\n input.deviceModelId !== DeviceModelId.NANO_S &&\n typeof input.chainId === \"number\" &&\n isHexaString(input.to) &&\n input.to !== \"0x\" &&\n isHexaString(input.data) &&\n isHexaString(input.selector) &&\n input.selector !== \"0x\" &&\n SUPPORTED_TYPES.every((type) => expectedTypes.includes(type))\n );\n }\n\n async load(input: CalldataContextInput): Promise<ClearSignContext[]> {\n const { to, data, selector, chainId, deviceModelId } = input;\n\n const param: GetContextsParams = {\n address: to,\n chainId,\n selector,\n deviceModelId,\n data,\n };\n\n const maybeResult = await this._getContexts(param, this.dappDataSource)\n .alt(this._getContexts(param, this.tokenDataSource))\n .alt(this._getContextsWithProxy(param, this.dappDataSource))\n .run();\n\n const result = maybeResult.caseOf({\n Just: (contexts) => contexts,\n Nothing: () => [\n {\n type: ClearSignContextType.ERROR as const,\n error: new Error(\n \"[ContextModule] CalldataContextLoader: No calldata contexts found\",\n ),\n },\n ],\n });\n\n this.logger.debug(\"load result\", { data: { result } });\n return result;\n }\n\n private _getContexts(\n { address, chainId, selector, deviceModelId }: GetContextsParams,\n datasource: CalldataDescriptorDataSource,\n ): MaybeAsync<ClearSignContext[]> {\n return MaybeAsync(async ({ liftMaybe }) => {\n const result = await datasource.getCalldataDescriptors({\n deviceModelId,\n address,\n chainId,\n selector,\n });\n\n return liftMaybe(result.toMaybe().filter((ctxs) => ctxs.length > 0));\n });\n }\n\n private _getContextsWithProxy(\n { address, chainId, selector, deviceModelId, data }: GetContextsParams,\n datasource: CalldataDescriptorDataSource,\n ): MaybeAsync<ClearSignContext[]> {\n const proxyAddress = MaybeAsync(async ({ liftMaybe }) => {\n const result = await this.proxyDataSource.getProxyImplementationAddress({\n calldata: data,\n proxyAddress: address,\n chainId,\n challenge: \"\",\n });\n return liftMaybe(result.toMaybe());\n });\n\n return proxyAddress\n .map<MaybeAsync<ClearSignContext[]>>(({ implementationAddress }) => {\n const params = {\n address: implementationAddress,\n chainId,\n selector,\n deviceModelId,\n data,\n };\n return this._getContexts(params, datasource).map((contexts) => [\n // Add a proxy info context to the list of contexts\n // to specify that the proxy info should be refetched during the provide step\n {\n type: ClearSignContextType.PROXY_INFO,\n payload: \"0x\",\n },\n ...contexts,\n ]);\n })\n .join(); // join the two MaybeAsyncs\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["DeviceModelId", "isHexaString", "inject", "injectable", "MaybeAsync", "calldataTypes", "configTypes", "proxyTypes", "ClearSignContextType", "SUPPORTED_TYPES", "ClearSignContextType", "CalldataContextLoader", "dappDataSource", "tokenDataSource", "proxyDataSource", "loggerFactory", "input", "expectedTypes", "DeviceModelId", "isHexaString", "type", "to", "data", "selector", "chainId", "deviceModelId", "param", "result", "contexts", "address", "datasource", "MaybeAsync", "liftMaybe", "ctxs", "implementationAddress", "params", "__decorateClass", "injectable", "__decorateParam", "inject", "calldataTypes", "proxyTypes", "configTypes"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{DeviceModelId as l}from"@ledgerhq/device-management-kit";import{Left as s,Right as n}from"purify-ts";import{CalldataContextLoader as f}from"../../calldata/domain/CalldataContextLoader";import{ClearSignContextType as a}from"../../shared/model/ClearSignContext";describe("CalldataContextLoader",()=>{const r=vi.fn(),d=vi.fn(),p=vi.fn(),u={getCalldataDescriptors:d},x={getCalldataDescriptors:p},I={getProxyImplementationAddress:r},o=new f(u,x,I),c=[a.TRANSACTION_INFO,a.TRANSACTION_FIELD_DESCRIPTION,a.PROXY_INFO,a.ENUM];beforeEach(()=>{vi.resetAllMocks()}),describe("canHandle function",()=>{const e={to:"0x1234567890123456789012345678901234567890",data:"0xaf68b302000000000000000000000000000000000000000000000000000000000002",selector:"0xaf68b302",chainId:1,deviceModelId:l.NANO_X};it("should return true for valid input",()=>{expect(o.canHandle(e,c)).toBe(!0)}),it("should return false for invalid expected type",()=>{expect(o.canHandle(e,[a.TOKEN])).toBe(!1),expect(o.canHandle(e,[a.NFT])).toBe(!1),expect(o.canHandle(e,[a.PROXY_INFO])).toBe(!1),expect(o.canHandle(e,[a.ENUM])).toBe(!1),expect(o.canHandle(e,[a.TRANSACTION_INFO])).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,i)=>{expect(o.canHandle(t,c)).toBe(!1)}),it.each([[{...e,to:void 0},"missing to"],[{...e,data:void 0},"missing data"],[{...e,selector:void 0},"missing selector"],[{...e,chainId:void 0},"missing chainId"],[{...e,deviceModelId:void 0},"missing deviceModelId"]])("should return false for %s",(t,i)=>{expect(o.canHandle(t,c)).toBe(!1)}),it.each([[{...e,to:"invalid-hex"},"invalid to hex"],[{...e,to:"0x"},"empty to hex"],[{...e,data:"invalid-hex"},"invalid data hex"],[{...e,selector:"invalid-hex"},"invalid selector hex"],[{...e,selector:"0x"},"empty selector hex"]])("should return false for %s",(t,i)=>{expect(o.canHandle(t,c)).toBe(!1)}),it.each([[{...e,chainId:"1"},"string chainId"],[{...e,chainId:null},"null chainId"],[{...e,deviceModelId:l.NANO_S},"deviceModelId is NANO_S"]])("should return false for %s",(t,i)=>{expect(o.canHandle(t,c)).toBe(!1)})}),it("should return an error if data source fails",async()=>{r.mockResolvedValue(s(new Error("data source error"))),d.mockResolvedValue(s(new Error("data source error")));const e={to:"0x1234567890123456789012345678901234567890",chainId:3,data:"0xaf68b302000000000000000000000000000000000000000000000000000000000002",selector:"0xaf68b302",deviceModelId:l.NANO_X},t=await o.load(e);expect(d).toHaveBeenCalledWith({address:"0x1234567890123456789012345678901234567890",chainId:3,selector:"0xaf68b302",deviceModelId:l.NANO_X}),expect(t).toEqual([{type:a.ERROR,error:new Error("[ContextModule] CalldataContextLoader: No calldata contexts found")}])}),it("should return the contexts on success",async()=>{d.mockResolvedValue(n([{type:a.TRANSACTION_INFO,payload:"1234567890"},{type:a.TRANSACTION_FIELD_DESCRIPTION,payload:"deadbeef"}])),r.mockResolvedValue(s(new Error("data source error")));const e={to:"0x1234567890123456789012345678901234567890",chainId:3,data:"0xaf68b302000000000000000000000000000000000000000000000000000000000002",selector:"0xaf68b302",deviceModelId:l.NANO_X},t=await o.load(e);expect(t).toEqual([{type:a.TRANSACTION_INFO,payload:"1234567890"},{type:a.TRANSACTION_FIELD_DESCRIPTION,payload:"deadbeef"}])}),it("should return the proxy delegate call context on success",async()=>{d.mockResolvedValueOnce(n([])),d.mockResolvedValue(n([{type:a.TRANSACTION_INFO,payload:"1234567890"},{type:a.TRANSACTION_FIELD_DESCRIPTION,payload:"deadbeef"}])),r.mockResolvedValue(n({implementationAddress:"0x1234567890abcdef",signedDescriptor:"0x1234567890abcdef"}));const e={to:"0x1234567890123456789012345678901234567890",chainId:3,data:"0xaf68b302000000000000000000000000000000000000000000000000000000000002",selector:"0xaf68b302",deviceModelId:l.NANO_X},t=await o.load(e);expect(t).toEqual([{type:a.PROXY_INFO,payload:"0x"},{type:a.TRANSACTION_INFO,payload:"1234567890"},{type:a.TRANSACTION_FIELD_DESCRIPTION,payload:"deadbeef"}])}),it("should return an error when proxy delegate call succeeds but transaction descriptors for resolved address fail",async()=>{d.mockResolvedValueOnce(n([])),d.mockResolvedValueOnce(s(new Error("data source error"))),r.mockResolvedValue(n({implementationAddress:"0xResolvedAddress",signedDescriptor:"0x1234567890abcdef"}));const e={to:"0x1234567890123456789012345678901234567890",chainId:3,data:"0xaf68b302000000000000000000000000000000000000000000000000000000000002",selector:"0xaf68b302",deviceModelId:l.NANO_X},t=await o.load(e);expect(d).toHaveBeenCalledTimes(2),expect(d).toHaveBeenNthCalledWith(2,{address:"0xResolvedAddress",chainId:3,selector:"0xaf68b302",deviceModelId:l.NANO_X}),expect(t).toEqual([{type:a.ERROR,error:new Error("[ContextModule] CalldataContextLoader: No calldata contexts found")}])})});
1
+ import{DeviceModelId as n}from"@ledgerhq/device-management-kit";import{Left as s,Right as l}from"purify-ts";import{CalldataContextLoader as I}from"../../calldata/domain/CalldataContextLoader";import{ClearSignContextType as a}from"../../shared/model/ClearSignContext";const N=()=>({debug:vi.fn(),info:vi.fn(),warn:vi.fn(),error:vi.fn(),subscribers:[]});describe("CalldataContextLoader",()=>{const r=vi.fn(),d=vi.fn(),p=vi.fn(),u={getCalldataDescriptors:d},x={getCalldataDescriptors:p},f={getProxyImplementationAddress:r},o=new I(u,x,f,N),c=[a.TRANSACTION_INFO,a.TRANSACTION_FIELD_DESCRIPTION,a.PROXY_INFO,a.ENUM];beforeEach(()=>{vi.resetAllMocks()}),describe("canHandle function",()=>{const e={to:"0x1234567890123456789012345678901234567890",data:"0xaf68b302000000000000000000000000000000000000000000000000000000000002",selector:"0xaf68b302",chainId:1,deviceModelId:n.NANO_X};it("should return true for valid input",()=>{expect(o.canHandle(e,c)).toBe(!0)}),it("should return false for invalid expected type",()=>{expect(o.canHandle(e,[a.TOKEN])).toBe(!1),expect(o.canHandle(e,[a.NFT])).toBe(!1),expect(o.canHandle(e,[a.PROXY_INFO])).toBe(!1),expect(o.canHandle(e,[a.ENUM])).toBe(!1),expect(o.canHandle(e,[a.TRANSACTION_INFO])).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,i)=>{expect(o.canHandle(t,c)).toBe(!1)}),it.each([[{...e,to:void 0},"missing to"],[{...e,data:void 0},"missing data"],[{...e,selector:void 0},"missing selector"],[{...e,chainId:void 0},"missing chainId"],[{...e,deviceModelId:void 0},"missing deviceModelId"]])("should return false for %s",(t,i)=>{expect(o.canHandle(t,c)).toBe(!1)}),it.each([[{...e,to:"invalid-hex"},"invalid to hex"],[{...e,to:"0x"},"empty to hex"],[{...e,data:"invalid-hex"},"invalid data hex"],[{...e,selector:"invalid-hex"},"invalid selector hex"],[{...e,selector:"0x"},"empty selector hex"]])("should return false for %s",(t,i)=>{expect(o.canHandle(t,c)).toBe(!1)}),it.each([[{...e,chainId:"1"},"string chainId"],[{...e,chainId:null},"null chainId"],[{...e,deviceModelId:n.NANO_S},"deviceModelId is NANO_S"]])("should return false for %s",(t,i)=>{expect(o.canHandle(t,c)).toBe(!1)})}),it("should return an error if data source fails",async()=>{r.mockResolvedValue(s(new Error("data source error"))),d.mockResolvedValue(s(new Error("data source error")));const e={to:"0x1234567890123456789012345678901234567890",chainId:3,data:"0xaf68b302000000000000000000000000000000000000000000000000000000000002",selector:"0xaf68b302",deviceModelId:n.NANO_X},t=await o.load(e);expect(d).toHaveBeenCalledWith({address:"0x1234567890123456789012345678901234567890",chainId:3,selector:"0xaf68b302",deviceModelId:n.NANO_X}),expect(t).toEqual([{type:a.ERROR,error:new Error("[ContextModule] CalldataContextLoader: No calldata contexts found")}])}),it("should return the contexts on success",async()=>{d.mockResolvedValue(l([{type:a.TRANSACTION_INFO,payload:"1234567890"},{type:a.TRANSACTION_FIELD_DESCRIPTION,payload:"deadbeef"}])),r.mockResolvedValue(s(new Error("data source error")));const e={to:"0x1234567890123456789012345678901234567890",chainId:3,data:"0xaf68b302000000000000000000000000000000000000000000000000000000000002",selector:"0xaf68b302",deviceModelId:n.NANO_X},t=await o.load(e);expect(t).toEqual([{type:a.TRANSACTION_INFO,payload:"1234567890"},{type:a.TRANSACTION_FIELD_DESCRIPTION,payload:"deadbeef"}])}),it("should return the proxy delegate call context on success",async()=>{d.mockResolvedValueOnce(l([])),d.mockResolvedValue(l([{type:a.TRANSACTION_INFO,payload:"1234567890"},{type:a.TRANSACTION_FIELD_DESCRIPTION,payload:"deadbeef"}])),r.mockResolvedValue(l({implementationAddress:"0x1234567890abcdef",signedDescriptor:"0x1234567890abcdef"}));const e={to:"0x1234567890123456789012345678901234567890",chainId:3,data:"0xaf68b302000000000000000000000000000000000000000000000000000000000002",selector:"0xaf68b302",deviceModelId:n.NANO_X},t=await o.load(e);expect(t).toEqual([{type:a.PROXY_INFO,payload:"0x"},{type:a.TRANSACTION_INFO,payload:"1234567890"},{type:a.TRANSACTION_FIELD_DESCRIPTION,payload:"deadbeef"}])}),it("should return an error when proxy delegate call succeeds but transaction descriptors for resolved address fail",async()=>{d.mockResolvedValueOnce(l([])),d.mockResolvedValueOnce(s(new Error("data source error"))),r.mockResolvedValue(l({implementationAddress:"0xResolvedAddress",signedDescriptor:"0x1234567890abcdef"}));const e={to:"0x1234567890123456789012345678901234567890",chainId:3,data:"0xaf68b302000000000000000000000000000000000000000000000000000000000002",selector:"0xaf68b302",deviceModelId:n.NANO_X},t=await o.load(e);expect(d).toHaveBeenCalledTimes(2),expect(d).toHaveBeenNthCalledWith(2,{address:"0xResolvedAddress",chainId:3,selector:"0xaf68b302",deviceModelId:n.NANO_X}),expect(t).toEqual([{type:a.ERROR,error:new Error("[ContextModule] CalldataContextLoader: No calldata contexts found")}])})});
2
2
  //# sourceMappingURL=CalldataContextLoader.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/calldata/domain/CalldataContextLoader.test.ts"],
4
- "sourcesContent": ["import { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\n\nimport type { CalldataDescriptorDataSource } from \"@/calldata/data/CalldataDescriptorDataSource\";\nimport {\n type CalldataContextInput,\n CalldataContextLoader,\n} from \"@/calldata/domain/CalldataContextLoader\";\nimport type { ProxyDataSource } from \"@/proxy/data/ProxyDataSource\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\n\ndescribe(\"CalldataContextLoader\", () => {\n const getProxyImplementationAddress = vi.fn();\n const getDappDescriptorsMock = vi.fn();\n const getTokenDescriptorsMock = vi.fn();\n const mockDappDataSource: CalldataDescriptorDataSource = {\n getCalldataDescriptors: getDappDescriptorsMock,\n };\n const mockTokenDataSource: CalldataDescriptorDataSource = {\n getCalldataDescriptors: getTokenDescriptorsMock,\n };\n const mockProxyDatasource: ProxyDataSource = {\n getProxyImplementationAddress: getProxyImplementationAddress,\n };\n const loader = new CalldataContextLoader(\n mockDappDataSource,\n mockTokenDataSource,\n mockProxyDatasource,\n );\n const SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.TRANSACTION_INFO,\n ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n ClearSignContextType.PROXY_INFO,\n ClearSignContextType.ENUM,\n ];\n\n beforeEach(() => {\n vi.resetAllMocks();\n });\n\n describe(\"canHandle function\", () => {\n const validInput: CalldataContextInput = {\n to: \"0x1234567890123456789012345678901234567890\",\n data: \"0xaf68b302000000000000000000000000000000000000000000000000000000000002\",\n selector: \"0xaf68b302\",\n chainId: 1,\n deviceModelId: DeviceModelId.NANO_X,\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 expect(loader.canHandle(validInput, [ClearSignContextType.NFT])).toBe(\n false,\n );\n expect(\n loader.canHandle(validInput, [ClearSignContextType.PROXY_INFO]),\n ).toBe(false);\n expect(loader.canHandle(validInput, [ClearSignContextType.ENUM])).toBe(\n false,\n );\n expect(\n loader.canHandle(validInput, [ClearSignContextType.TRANSACTION_INFO]),\n ).toBe(false);\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, to: undefined }, \"missing to\"],\n [{ ...validInput, data: undefined }, \"missing data\"],\n [{ ...validInput, selector: undefined }, \"missing selector\"],\n [{ ...validInput, chainId: undefined }, \"missing chainId\"],\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, to: \"invalid-hex\" }, \"invalid to hex\"],\n [{ ...validInput, to: \"0x\" }, \"empty to hex\"],\n [{ ...validInput, data: \"invalid-hex\" }, \"invalid data hex\"],\n [{ ...validInput, selector: \"invalid-hex\" }, \"invalid selector hex\"],\n [{ ...validInput, selector: \"0x\" }, \"empty selector hex\"],\n ])(\"should return false for %s\", (input, _description) => {\n expect(loader.canHandle(input, SUPPORTED_TYPES)).toBe(false);\n });\n\n it.each([\n [{ ...validInput, chainId: \"1\" }, \"string chainId\"],\n [{ ...validInput, chainId: null }, \"null chainId\"],\n [\n { ...validInput, deviceModelId: DeviceModelId.NANO_S },\n \"deviceModelId is NANO_S\",\n ],\n ])(\"should return false for %s\", (input, _description) => {\n expect(loader.canHandle(input, SUPPORTED_TYPES)).toBe(false);\n });\n });\n\n it(\"should return an error if data source fails\", async () => {\n // GIVEN\n getProxyImplementationAddress.mockResolvedValue(\n Left(new Error(\"data source error\")),\n );\n getDappDescriptorsMock.mockResolvedValue(\n Left(new Error(\"data source error\")),\n );\n const input = {\n to: \"0x1234567890123456789012345678901234567890\",\n chainId: 3,\n data: \"0xaf68b302000000000000000000000000000000000000000000000000000000000002\",\n selector: \"0xaf68b302\",\n deviceModelId: DeviceModelId.NANO_X,\n } as CalldataContextInput;\n\n // WHEN\n const result = await loader.load(input);\n\n // THEN\n expect(getDappDescriptorsMock).toHaveBeenCalledWith({\n address: \"0x1234567890123456789012345678901234567890\",\n chainId: 3,\n selector: \"0xaf68b302\",\n deviceModelId: DeviceModelId.NANO_X,\n });\n expect(result).toEqual([\n {\n type: ClearSignContextType.ERROR,\n error: new Error(\n \"[ContextModule] CalldataContextLoader: No calldata contexts found\",\n ),\n },\n ]);\n });\n\n it(\"should return the contexts on success\", async () => {\n // GIVEN\n getDappDescriptorsMock.mockResolvedValue(\n Right([\n {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"1234567890\",\n },\n {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"deadbeef\",\n },\n ]),\n );\n getProxyImplementationAddress.mockResolvedValue(\n Left(new Error(\"data source error\")),\n );\n const input = {\n to: \"0x1234567890123456789012345678901234567890\",\n chainId: 3,\n data: \"0xaf68b302000000000000000000000000000000000000000000000000000000000002\",\n selector: \"0xaf68b302\",\n deviceModelId: DeviceModelId.NANO_X,\n } as CalldataContextInput;\n\n // WHEN\n const result = await loader.load(input);\n\n // THEN\n expect(result).toEqual([\n {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"1234567890\",\n },\n {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"deadbeef\",\n },\n ]);\n });\n\n it(\"should return the proxy delegate call context on success\", async () => {\n // GIVEN\n getDappDescriptorsMock.mockResolvedValueOnce(Right([])); // No transaction descriptors found for the first call\n getDappDescriptorsMock.mockResolvedValue(\n Right([\n {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"1234567890\",\n },\n {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"deadbeef\",\n },\n ]),\n );\n getProxyImplementationAddress.mockResolvedValue(\n Right({\n implementationAddress: \"0x1234567890abcdef\",\n signedDescriptor: \"0x1234567890abcdef\",\n }),\n );\n const input = {\n to: \"0x1234567890123456789012345678901234567890\",\n chainId: 3,\n data: \"0xaf68b302000000000000000000000000000000000000000000000000000000000002\",\n selector: \"0xaf68b302\",\n deviceModelId: DeviceModelId.NANO_X,\n } as CalldataContextInput;\n\n // WHEN\n const result = await loader.load(input);\n\n // THEN\n expect(result).toEqual([\n {\n type: ClearSignContextType.PROXY_INFO,\n payload: \"0x\",\n },\n {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"1234567890\",\n },\n {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"deadbeef\",\n },\n ]);\n });\n\n it(\"should return an error when proxy delegate call succeeds but transaction descriptors for resolved address fail\", async () => {\n // GIVEN\n getDappDescriptorsMock.mockResolvedValueOnce(Right([])); // No transaction descriptors found for the first call\n getDappDescriptorsMock.mockResolvedValueOnce(\n Left(new Error(\"data source error\")),\n ); // Second call fails\n getProxyImplementationAddress.mockResolvedValue(\n Right({\n implementationAddress: \"0xResolvedAddress\",\n signedDescriptor: \"0x1234567890abcdef\",\n }),\n );\n const input = {\n to: \"0x1234567890123456789012345678901234567890\",\n chainId: 3,\n data: \"0xaf68b302000000000000000000000000000000000000000000000000000000000002\",\n selector: \"0xaf68b302\",\n deviceModelId: DeviceModelId.NANO_X,\n } as CalldataContextInput;\n\n // WHEN\n const result = await loader.load(input);\n\n // THEN\n expect(getDappDescriptorsMock).toHaveBeenCalledTimes(2);\n expect(getDappDescriptorsMock).toHaveBeenNthCalledWith(2, {\n address: \"0xResolvedAddress\",\n chainId: 3,\n selector: \"0xaf68b302\",\n deviceModelId: DeviceModelId.NANO_X,\n });\n expect(result).toEqual([\n {\n type: ClearSignContextType.ERROR,\n error: new Error(\n \"[ContextModule] CalldataContextLoader: No calldata contexts found\",\n ),\n },\n ]);\n });\n});\n"],
5
- "mappings": "AAAA,OAAS,iBAAAA,MAAqB,kCAC9B,OAAS,QAAAC,EAAM,SAAAC,MAAa,YAG5B,OAEE,yBAAAC,MACK,0CAEP,OAAS,wBAAAC,MAA4B,kCAErC,SAAS,wBAAyB,IAAM,CACtC,MAAMC,EAAgC,GAAG,GAAG,EACtCC,EAAyB,GAAG,GAAG,EAC/BC,EAA0B,GAAG,GAAG,EAChCC,EAAmD,CACvD,uBAAwBF,CAC1B,EACMG,EAAoD,CACxD,uBAAwBF,CAC1B,EACMG,EAAuC,CAC3C,8BAA+BL,CACjC,EACMM,EAAS,IAAIR,EACjBK,EACAC,EACAC,CACF,EACME,EAA0C,CAC9CR,EAAqB,iBACrBA,EAAqB,8BACrBA,EAAqB,WACrBA,EAAqB,IACvB,EAEA,WAAW,IAAM,CACf,GAAG,cAAc,CACnB,CAAC,EAED,SAAS,qBAAsB,IAAM,CACnC,MAAMS,EAAmC,CACvC,GAAI,6CACJ,KAAM,yEACN,SAAU,aACV,QAAS,EACT,cAAeb,EAAc,MAC/B,EAEA,GAAG,qCAAsC,IAAM,CAC7C,OAAOW,EAAO,UAAUE,EAAYD,CAAe,CAAC,EAAE,KAAK,EAAI,CACjE,CAAC,EAED,GAAG,gDAAiD,IAAM,CACxD,OAAOD,EAAO,UAAUE,EAAY,CAACT,EAAqB,KAAK,CAAC,CAAC,EAAE,KACjE,EACF,EACA,OAAOO,EAAO,UAAUE,EAAY,CAACT,EAAqB,GAAG,CAAC,CAAC,EAAE,KAC/D,EACF,EACA,OACEO,EAAO,UAAUE,EAAY,CAACT,EAAqB,UAAU,CAAC,CAChE,EAAE,KAAK,EAAK,EACZ,OAAOO,EAAO,UAAUE,EAAY,CAACT,EAAqB,IAAI,CAAC,CAAC,EAAE,KAChE,EACF,EACA,OACEO,EAAO,UAAUE,EAAY,CAACT,EAAqB,gBAAgB,CAAC,CACtE,EAAE,KAAK,EAAK,CACd,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,CAACU,EAAOC,IAAiB,CACxD,OAAOJ,EAAO,UAAUG,EAAOF,CAAe,CAAC,EAAE,KAAK,EAAK,CAC7D,CAAC,EAED,GAAG,KAAK,CACN,CAAC,CAAE,GAAGC,EAAY,GAAI,MAAU,EAAG,YAAY,EAC/C,CAAC,CAAE,GAAGA,EAAY,KAAM,MAAU,EAAG,cAAc,EACnD,CAAC,CAAE,GAAGA,EAAY,SAAU,MAAU,EAAG,kBAAkB,EAC3D,CAAC,CAAE,GAAGA,EAAY,QAAS,MAAU,EAAG,iBAAiB,EACzD,CAAC,CAAE,GAAGA,EAAY,cAAe,MAAU,EAAG,uBAAuB,CACvE,CAAC,EAAE,6BAA8B,CAACC,EAAOC,IAAiB,CACxD,OAAOJ,EAAO,UAAUG,EAAOF,CAAe,CAAC,EAAE,KAAK,EAAK,CAC7D,CAAC,EAED,GAAG,KAAK,CACN,CAAC,CAAE,GAAGC,EAAY,GAAI,aAAc,EAAG,gBAAgB,EACvD,CAAC,CAAE,GAAGA,EAAY,GAAI,IAAK,EAAG,cAAc,EAC5C,CAAC,CAAE,GAAGA,EAAY,KAAM,aAAc,EAAG,kBAAkB,EAC3D,CAAC,CAAE,GAAGA,EAAY,SAAU,aAAc,EAAG,sBAAsB,EACnE,CAAC,CAAE,GAAGA,EAAY,SAAU,IAAK,EAAG,oBAAoB,CAC1D,CAAC,EAAE,6BAA8B,CAACC,EAAOC,IAAiB,CACxD,OAAOJ,EAAO,UAAUG,EAAOF,CAAe,CAAC,EAAE,KAAK,EAAK,CAC7D,CAAC,EAED,GAAG,KAAK,CACN,CAAC,CAAE,GAAGC,EAAY,QAAS,GAAI,EAAG,gBAAgB,EAClD,CAAC,CAAE,GAAGA,EAAY,QAAS,IAAK,EAAG,cAAc,EACjD,CACE,CAAE,GAAGA,EAAY,cAAeb,EAAc,MAAO,EACrD,yBACF,CACF,CAAC,EAAE,6BAA8B,CAACc,EAAOC,IAAiB,CACxD,OAAOJ,EAAO,UAAUG,EAAOF,CAAe,CAAC,EAAE,KAAK,EAAK,CAC7D,CAAC,CACH,CAAC,EAED,GAAG,8CAA+C,SAAY,CAE5DP,EAA8B,kBAC5BJ,EAAK,IAAI,MAAM,mBAAmB,CAAC,CACrC,EACAK,EAAuB,kBACrBL,EAAK,IAAI,MAAM,mBAAmB,CAAC,CACrC,EACA,MAAMa,EAAQ,CACZ,GAAI,6CACJ,QAAS,EACT,KAAM,yEACN,SAAU,aACV,cAAed,EAAc,MAC/B,EAGMgB,EAAS,MAAML,EAAO,KAAKG,CAAK,EAGtC,OAAOR,CAAsB,EAAE,qBAAqB,CAClD,QAAS,6CACT,QAAS,EACT,SAAU,aACV,cAAeN,EAAc,MAC/B,CAAC,EACD,OAAOgB,CAAM,EAAE,QAAQ,CACrB,CACE,KAAMZ,EAAqB,MAC3B,MAAO,IAAI,MACT,mEACF,CACF,CACF,CAAC,CACH,CAAC,EAED,GAAG,wCAAyC,SAAY,CAEtDE,EAAuB,kBACrBJ,EAAM,CACJ,CACE,KAAME,EAAqB,iBAC3B,QAAS,YACX,EACA,CACE,KAAMA,EAAqB,8BAC3B,QAAS,UACX,CACF,CAAC,CACH,EACAC,EAA8B,kBAC5BJ,EAAK,IAAI,MAAM,mBAAmB,CAAC,CACrC,EACA,MAAMa,EAAQ,CACZ,GAAI,6CACJ,QAAS,EACT,KAAM,yEACN,SAAU,aACV,cAAed,EAAc,MAC/B,EAGMgB,EAAS,MAAML,EAAO,KAAKG,CAAK,EAGtC,OAAOE,CAAM,EAAE,QAAQ,CACrB,CACE,KAAMZ,EAAqB,iBAC3B,QAAS,YACX,EACA,CACE,KAAMA,EAAqB,8BAC3B,QAAS,UACX,CACF,CAAC,CACH,CAAC,EAED,GAAG,2DAA4D,SAAY,CAEzEE,EAAuB,sBAAsBJ,EAAM,CAAC,CAAC,CAAC,EACtDI,EAAuB,kBACrBJ,EAAM,CACJ,CACE,KAAME,EAAqB,iBAC3B,QAAS,YACX,EACA,CACE,KAAMA,EAAqB,8BAC3B,QAAS,UACX,CACF,CAAC,CACH,EACAC,EAA8B,kBAC5BH,EAAM,CACJ,sBAAuB,qBACvB,iBAAkB,oBACpB,CAAC,CACH,EACA,MAAMY,EAAQ,CACZ,GAAI,6CACJ,QAAS,EACT,KAAM,yEACN,SAAU,aACV,cAAed,EAAc,MAC/B,EAGMgB,EAAS,MAAML,EAAO,KAAKG,CAAK,EAGtC,OAAOE,CAAM,EAAE,QAAQ,CACrB,CACE,KAAMZ,EAAqB,WAC3B,QAAS,IACX,EACA,CACE,KAAMA,EAAqB,iBAC3B,QAAS,YACX,EACA,CACE,KAAMA,EAAqB,8BAC3B,QAAS,UACX,CACF,CAAC,CACH,CAAC,EAED,GAAG,iHAAkH,SAAY,CAE/HE,EAAuB,sBAAsBJ,EAAM,CAAC,CAAC,CAAC,EACtDI,EAAuB,sBACrBL,EAAK,IAAI,MAAM,mBAAmB,CAAC,CACrC,EACAI,EAA8B,kBAC5BH,EAAM,CACJ,sBAAuB,oBACvB,iBAAkB,oBACpB,CAAC,CACH,EACA,MAAMY,EAAQ,CACZ,GAAI,6CACJ,QAAS,EACT,KAAM,yEACN,SAAU,aACV,cAAed,EAAc,MAC/B,EAGMgB,EAAS,MAAML,EAAO,KAAKG,CAAK,EAGtC,OAAOR,CAAsB,EAAE,sBAAsB,CAAC,EACtD,OAAOA,CAAsB,EAAE,wBAAwB,EAAG,CACxD,QAAS,oBACT,QAAS,EACT,SAAU,aACV,cAAeN,EAAc,MAC/B,CAAC,EACD,OAAOgB,CAAM,EAAE,QAAQ,CACrB,CACE,KAAMZ,EAAqB,MAC3B,MAAO,IAAI,MACT,mEACF,CACF,CACF,CAAC,CACH,CAAC,CACH,CAAC",
6
- "names": ["DeviceModelId", "Left", "Right", "CalldataContextLoader", "ClearSignContextType", "getProxyImplementationAddress", "getDappDescriptorsMock", "getTokenDescriptorsMock", "mockDappDataSource", "mockTokenDataSource", "mockProxyDatasource", "loader", "SUPPORTED_TYPES", "validInput", "input", "_description", "result"]
4
+ "sourcesContent": ["import { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\n\nimport type { CalldataDescriptorDataSource } from \"@/calldata/data/CalldataDescriptorDataSource\";\nimport {\n type CalldataContextInput,\n CalldataContextLoader,\n} from \"@/calldata/domain/CalldataContextLoader\";\nimport type { ProxyDataSource } from \"@/proxy/data/ProxyDataSource\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\n\nconst mockLoggerFactory = () => ({\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n});\n\ndescribe(\"CalldataContextLoader\", () => {\n const getProxyImplementationAddress = vi.fn();\n const getDappDescriptorsMock = vi.fn();\n const getTokenDescriptorsMock = vi.fn();\n const mockDappDataSource: CalldataDescriptorDataSource = {\n getCalldataDescriptors: getDappDescriptorsMock,\n };\n const mockTokenDataSource: CalldataDescriptorDataSource = {\n getCalldataDescriptors: getTokenDescriptorsMock,\n };\n const mockProxyDatasource: ProxyDataSource = {\n getProxyImplementationAddress: getProxyImplementationAddress,\n };\n const loader = new CalldataContextLoader(\n mockDappDataSource,\n mockTokenDataSource,\n mockProxyDatasource,\n mockLoggerFactory,\n );\n const SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.TRANSACTION_INFO,\n ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n ClearSignContextType.PROXY_INFO,\n ClearSignContextType.ENUM,\n ];\n\n beforeEach(() => {\n vi.resetAllMocks();\n });\n\n describe(\"canHandle function\", () => {\n const validInput: CalldataContextInput = {\n to: \"0x1234567890123456789012345678901234567890\",\n data: \"0xaf68b302000000000000000000000000000000000000000000000000000000000002\",\n selector: \"0xaf68b302\",\n chainId: 1,\n deviceModelId: DeviceModelId.NANO_X,\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 expect(loader.canHandle(validInput, [ClearSignContextType.NFT])).toBe(\n false,\n );\n expect(\n loader.canHandle(validInput, [ClearSignContextType.PROXY_INFO]),\n ).toBe(false);\n expect(loader.canHandle(validInput, [ClearSignContextType.ENUM])).toBe(\n false,\n );\n expect(\n loader.canHandle(validInput, [ClearSignContextType.TRANSACTION_INFO]),\n ).toBe(false);\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, to: undefined }, \"missing to\"],\n [{ ...validInput, data: undefined }, \"missing data\"],\n [{ ...validInput, selector: undefined }, \"missing selector\"],\n [{ ...validInput, chainId: undefined }, \"missing chainId\"],\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, to: \"invalid-hex\" }, \"invalid to hex\"],\n [{ ...validInput, to: \"0x\" }, \"empty to hex\"],\n [{ ...validInput, data: \"invalid-hex\" }, \"invalid data hex\"],\n [{ ...validInput, selector: \"invalid-hex\" }, \"invalid selector hex\"],\n [{ ...validInput, selector: \"0x\" }, \"empty selector hex\"],\n ])(\"should return false for %s\", (input, _description) => {\n expect(loader.canHandle(input, SUPPORTED_TYPES)).toBe(false);\n });\n\n it.each([\n [{ ...validInput, chainId: \"1\" }, \"string chainId\"],\n [{ ...validInput, chainId: null }, \"null chainId\"],\n [\n { ...validInput, deviceModelId: DeviceModelId.NANO_S },\n \"deviceModelId is NANO_S\",\n ],\n ])(\"should return false for %s\", (input, _description) => {\n expect(loader.canHandle(input, SUPPORTED_TYPES)).toBe(false);\n });\n });\n\n it(\"should return an error if data source fails\", async () => {\n // GIVEN\n getProxyImplementationAddress.mockResolvedValue(\n Left(new Error(\"data source error\")),\n );\n getDappDescriptorsMock.mockResolvedValue(\n Left(new Error(\"data source error\")),\n );\n const input = {\n to: \"0x1234567890123456789012345678901234567890\",\n chainId: 3,\n data: \"0xaf68b302000000000000000000000000000000000000000000000000000000000002\",\n selector: \"0xaf68b302\",\n deviceModelId: DeviceModelId.NANO_X,\n } as CalldataContextInput;\n\n // WHEN\n const result = await loader.load(input);\n\n // THEN\n expect(getDappDescriptorsMock).toHaveBeenCalledWith({\n address: \"0x1234567890123456789012345678901234567890\",\n chainId: 3,\n selector: \"0xaf68b302\",\n deviceModelId: DeviceModelId.NANO_X,\n });\n expect(result).toEqual([\n {\n type: ClearSignContextType.ERROR,\n error: new Error(\n \"[ContextModule] CalldataContextLoader: No calldata contexts found\",\n ),\n },\n ]);\n });\n\n it(\"should return the contexts on success\", async () => {\n // GIVEN\n getDappDescriptorsMock.mockResolvedValue(\n Right([\n {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"1234567890\",\n },\n {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"deadbeef\",\n },\n ]),\n );\n getProxyImplementationAddress.mockResolvedValue(\n Left(new Error(\"data source error\")),\n );\n const input = {\n to: \"0x1234567890123456789012345678901234567890\",\n chainId: 3,\n data: \"0xaf68b302000000000000000000000000000000000000000000000000000000000002\",\n selector: \"0xaf68b302\",\n deviceModelId: DeviceModelId.NANO_X,\n } as CalldataContextInput;\n\n // WHEN\n const result = await loader.load(input);\n\n // THEN\n expect(result).toEqual([\n {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"1234567890\",\n },\n {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"deadbeef\",\n },\n ]);\n });\n\n it(\"should return the proxy delegate call context on success\", async () => {\n // GIVEN\n getDappDescriptorsMock.mockResolvedValueOnce(Right([])); // No transaction descriptors found for the first call\n getDappDescriptorsMock.mockResolvedValue(\n Right([\n {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"1234567890\",\n },\n {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"deadbeef\",\n },\n ]),\n );\n getProxyImplementationAddress.mockResolvedValue(\n Right({\n implementationAddress: \"0x1234567890abcdef\",\n signedDescriptor: \"0x1234567890abcdef\",\n }),\n );\n const input = {\n to: \"0x1234567890123456789012345678901234567890\",\n chainId: 3,\n data: \"0xaf68b302000000000000000000000000000000000000000000000000000000000002\",\n selector: \"0xaf68b302\",\n deviceModelId: DeviceModelId.NANO_X,\n } as CalldataContextInput;\n\n // WHEN\n const result = await loader.load(input);\n\n // THEN\n expect(result).toEqual([\n {\n type: ClearSignContextType.PROXY_INFO,\n payload: \"0x\",\n },\n {\n type: ClearSignContextType.TRANSACTION_INFO,\n payload: \"1234567890\",\n },\n {\n type: ClearSignContextType.TRANSACTION_FIELD_DESCRIPTION,\n payload: \"deadbeef\",\n },\n ]);\n });\n\n it(\"should return an error when proxy delegate call succeeds but transaction descriptors for resolved address fail\", async () => {\n // GIVEN\n getDappDescriptorsMock.mockResolvedValueOnce(Right([])); // No transaction descriptors found for the first call\n getDappDescriptorsMock.mockResolvedValueOnce(\n Left(new Error(\"data source error\")),\n ); // Second call fails\n getProxyImplementationAddress.mockResolvedValue(\n Right({\n implementationAddress: \"0xResolvedAddress\",\n signedDescriptor: \"0x1234567890abcdef\",\n }),\n );\n const input = {\n to: \"0x1234567890123456789012345678901234567890\",\n chainId: 3,\n data: \"0xaf68b302000000000000000000000000000000000000000000000000000000000002\",\n selector: \"0xaf68b302\",\n deviceModelId: DeviceModelId.NANO_X,\n } as CalldataContextInput;\n\n // WHEN\n const result = await loader.load(input);\n\n // THEN\n expect(getDappDescriptorsMock).toHaveBeenCalledTimes(2);\n expect(getDappDescriptorsMock).toHaveBeenNthCalledWith(2, {\n address: \"0xResolvedAddress\",\n chainId: 3,\n selector: \"0xaf68b302\",\n deviceModelId: DeviceModelId.NANO_X,\n });\n expect(result).toEqual([\n {\n type: ClearSignContextType.ERROR,\n error: new Error(\n \"[ContextModule] CalldataContextLoader: No calldata contexts found\",\n ),\n },\n ]);\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["DeviceModelId", "Left", "Right", "CalldataContextLoader", "ClearSignContextType", "mockLoggerFactory", "getProxyImplementationAddress", "getDappDescriptorsMock", "getTokenDescriptorsMock", "mockDappDataSource", "mockTokenDataSource", "mockProxyDatasource", "loader", "SUPPORTED_TYPES", "validInput", "input", "_description", "result"]
7
7
  }
package/lib/esm/src/di.js CHANGED
@@ -1,2 +1,2 @@
1
- import{Container as t}from"inversify";import{calldataModuleFactory as e}from"./calldata/di/calldataModuleFactory";import{configModuleFactory as a}from"./config/di/configModuleFactory";import{configTypes as m}from"./config/di/configTypes";import{dynamicNetworkModuleFactory as i}from"./dynamic-network/di/dynamicNetworkModuleFactory";import{externalPluginModuleFactory as n}from"./external-plugin/di/externalPluginModuleFactory";import{nftModuleFactory as l}from"./nft/di/nftModuleFactory";import{nanoPkiModuleFactory as c}from"./pki/di/pkiModuleFactory";import{proxyModuleFactory as p}from"./proxy/di/proxyModuleFactory";import{safeModuleFactory as y}from"./safe/di/safeModuleFactory";import{solanaContextModuleFactory as f}from"./solana/di/SolanaContextModuleFactory";import{solanaLifiModuleFactory as u}from"./solanaLifi/di/lifiModuleFactory";import{solanaTokenModuleFactory as d}from"./solanaToken/di/tokenModuleFactory";import{tokenModuleFactory as M}from"./token/di/tokenModuleFactory";import{transactionCheckModuleFactory as F}from"./transaction-check/di/transactionCheckModuleFactory";import{trustedNameModuleFactory as g}from"./trusted-name/di/trustedNameModuleFactory";import{typedDataModuleFactory as s}from"./typed-data/di/typedDataModuleFactory";import{uniswapModuleFactory as C}from"./uniswap/di/uniswapModuleFactory";const E=({config:o})=>{const r=new t;return o.loggerFactory&&r.bind(m.ContextModuleLoggerFactory).toConstantValue(o.loggerFactory),r.loadSync(a(o),n(),i(),l(),p(o),y(),M(),e(),g(),s(),c(),C(),F(),f(),d(),u()),r};export{E as makeContainer};
1
+ import{Container as t}from"inversify";import{calldataModuleFactory as e}from"./calldata/di/calldataModuleFactory";import{configModuleFactory as a}from"./config/di/configModuleFactory";import{configTypes as m}from"./config/di/configTypes";import{dynamicNetworkModuleFactory as i}from"./dynamic-network/di/dynamicNetworkModuleFactory";import{externalPluginModuleFactory as n}from"./external-plugin/di/externalPluginModuleFactory";import{nftModuleFactory as l}from"./nft/di/nftModuleFactory";import{nanoPkiModuleFactory as c}from"./pki/di/pkiModuleFactory";import{proxyModuleFactory as p}from"./proxy/di/proxyModuleFactory";import{safeModuleFactory as u}from"./safe/di/safeModuleFactory";import{solanaContextModuleFactory as y}from"./solana/di/SolanaContextModuleFactory";import{solanaLifiModuleFactory as d}from"./solanaLifi/di/lifiModuleFactory";import{solanaTokenModuleFactory as f}from"./solanaToken/di/tokenModuleFactory";import{tokenModuleFactory as M}from"./token/di/tokenModuleFactory";import{transactionCheckModuleFactory as F}from"./transaction-check/di/transactionCheckModuleFactory";import{trustedNameModuleFactory as s}from"./trusted-name/di/trustedNameModuleFactory";import{typedDataModuleFactory as g}from"./typed-data/di/typedDataModuleFactory";import{uniswapModuleFactory as C}from"./uniswap/di/uniswapModuleFactory";const E=({config:o})=>{const r=new t;return r.bind(m.ContextModuleLoggerFactory).toConstantValue(o.loggerFactory),r.loadSync(a(o),n(),i(),l(),p(o),u(),M(),e(),s(o),g(),c(),C(),F(),y(),f(),d()),r};export{E as makeContainer};
2
2
  //# sourceMappingURL=di.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../src/di.ts"],
4
- "sourcesContent": ["import { type LoggerPublisherService } from \"@ledgerhq/device-management-kit\";\nimport { Container } from \"inversify\";\n\nimport { calldataModuleFactory } from \"@/calldata/di/calldataModuleFactory\";\nimport { configModuleFactory } from \"@/config/di/configModuleFactory\";\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { type ContextModuleConfig } from \"@/config/model/ContextModuleConfig\";\nimport { dynamicNetworkModuleFactory } from \"@/dynamic-network/di/dynamicNetworkModuleFactory\";\nimport { externalPluginModuleFactory } from \"@/external-plugin/di/externalPluginModuleFactory\";\nimport { nftModuleFactory } from \"@/nft/di/nftModuleFactory\";\nimport { nanoPkiModuleFactory } from \"@/pki/di/pkiModuleFactory\";\nimport { proxyModuleFactory } from \"@/proxy/di/proxyModuleFactory\";\nimport { safeModuleFactory } from \"@/safe/di/safeModuleFactory\";\nimport { solanaContextModuleFactory } from \"@/solana/di/SolanaContextModuleFactory\";\nimport { solanaLifiModuleFactory } from \"@/solanaLifi/di/lifiModuleFactory\";\nimport { solanaTokenModuleFactory } from \"@/solanaToken/di/tokenModuleFactory\";\nimport { tokenModuleFactory } from \"@/token/di/tokenModuleFactory\";\nimport { transactionCheckModuleFactory } from \"@/transaction-check/di/transactionCheckModuleFactory\";\nimport { trustedNameModuleFactory } from \"@/trusted-name/di/trustedNameModuleFactory\";\nimport { typedDataModuleFactory } from \"@/typed-data/di/typedDataModuleFactory\";\nimport { uniswapModuleFactory } from \"@/uniswap/di/uniswapModuleFactory\";\n\ntype MakeContainerArgs = {\n config: ContextModuleConfig;\n};\n\nexport const makeContainer = ({ config }: MakeContainerArgs) => {\n const container = new Container();\n\n if (config.loggerFactory) {\n container\n .bind<\n (tag: string) => LoggerPublisherService\n >(configTypes.ContextModuleLoggerFactory)\n .toConstantValue(config.loggerFactory);\n }\n\n container.loadSync(\n configModuleFactory(config),\n externalPluginModuleFactory(),\n dynamicNetworkModuleFactory(),\n nftModuleFactory(),\n proxyModuleFactory(config),\n safeModuleFactory(),\n tokenModuleFactory(),\n calldataModuleFactory(),\n trustedNameModuleFactory(),\n typedDataModuleFactory(),\n nanoPkiModuleFactory(),\n uniswapModuleFactory(),\n transactionCheckModuleFactory(),\n solanaContextModuleFactory(),\n solanaTokenModuleFactory(),\n solanaLifiModuleFactory(),\n );\n\n return container;\n};\n"],
5
- "mappings": "AACA,OAAS,aAAAA,MAAiB,YAE1B,OAAS,yBAAAC,MAA6B,sCACtC,OAAS,uBAAAC,MAA2B,kCACpC,OAAS,eAAAC,MAAmB,0BAE5B,OAAS,+BAAAC,MAAmC,mDAC5C,OAAS,+BAAAC,MAAmC,mDAC5C,OAAS,oBAAAC,MAAwB,4BACjC,OAAS,wBAAAC,MAA4B,4BACrC,OAAS,sBAAAC,MAA0B,gCACnC,OAAS,qBAAAC,MAAyB,8BAClC,OAAS,8BAAAC,MAAkC,yCAC3C,OAAS,2BAAAC,MAA+B,oCACxC,OAAS,4BAAAC,MAAgC,sCACzC,OAAS,sBAAAC,MAA0B,gCACnC,OAAS,iCAAAC,MAAqC,uDAC9C,OAAS,4BAAAC,MAAgC,6CACzC,OAAS,0BAAAC,MAA8B,yCACvC,OAAS,wBAAAC,MAA4B,oCAM9B,MAAMC,EAAgB,CAAC,CAAE,OAAAC,CAAO,IAAyB,CAC9D,MAAMC,EAAY,IAAIpB,EAEtB,OAAImB,EAAO,eACTC,EACG,KAECjB,EAAY,0BAA0B,EACvC,gBAAgBgB,EAAO,aAAa,EAGzCC,EAAU,SACRlB,EAAoBiB,CAAM,EAC1Bd,EAA4B,EAC5BD,EAA4B,EAC5BE,EAAiB,EACjBE,EAAmBW,CAAM,EACzBV,EAAkB,EAClBI,EAAmB,EACnBZ,EAAsB,EACtBc,EAAyB,EACzBC,EAAuB,EACvBT,EAAqB,EACrBU,EAAqB,EACrBH,EAA8B,EAC9BJ,EAA2B,EAC3BE,EAAyB,EACzBD,EAAwB,CAC1B,EAEOS,CACT",
4
+ "sourcesContent": ["import { type LoggerPublisherService } from \"@ledgerhq/device-management-kit\";\nimport { Container } from \"inversify\";\n\nimport { calldataModuleFactory } from \"@/calldata/di/calldataModuleFactory\";\nimport { configModuleFactory } from \"@/config/di/configModuleFactory\";\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { type ContextModuleConfig } from \"@/config/model/ContextModuleConfig\";\nimport { dynamicNetworkModuleFactory } from \"@/dynamic-network/di/dynamicNetworkModuleFactory\";\nimport { externalPluginModuleFactory } from \"@/external-plugin/di/externalPluginModuleFactory\";\nimport { nftModuleFactory } from \"@/nft/di/nftModuleFactory\";\nimport { nanoPkiModuleFactory } from \"@/pki/di/pkiModuleFactory\";\nimport { proxyModuleFactory } from \"@/proxy/di/proxyModuleFactory\";\nimport { safeModuleFactory } from \"@/safe/di/safeModuleFactory\";\nimport { solanaContextModuleFactory } from \"@/solana/di/SolanaContextModuleFactory\";\nimport { solanaLifiModuleFactory } from \"@/solanaLifi/di/lifiModuleFactory\";\nimport { solanaTokenModuleFactory } from \"@/solanaToken/di/tokenModuleFactory\";\nimport { tokenModuleFactory } from \"@/token/di/tokenModuleFactory\";\nimport { transactionCheckModuleFactory } from \"@/transaction-check/di/transactionCheckModuleFactory\";\nimport { trustedNameModuleFactory } from \"@/trusted-name/di/trustedNameModuleFactory\";\nimport { typedDataModuleFactory } from \"@/typed-data/di/typedDataModuleFactory\";\nimport { uniswapModuleFactory } from \"@/uniswap/di/uniswapModuleFactory\";\n\ntype MakeContainerArgs = {\n config: ContextModuleConfig;\n};\n\nexport const makeContainer = ({ config }: MakeContainerArgs) => {\n const container = new Container();\n\n container\n .bind<\n (tag: string) => LoggerPublisherService\n >(configTypes.ContextModuleLoggerFactory)\n .toConstantValue(config.loggerFactory);\n\n container.loadSync(\n configModuleFactory(config),\n externalPluginModuleFactory(),\n dynamicNetworkModuleFactory(),\n nftModuleFactory(),\n proxyModuleFactory(config),\n safeModuleFactory(),\n tokenModuleFactory(),\n calldataModuleFactory(),\n trustedNameModuleFactory(config),\n typedDataModuleFactory(),\n nanoPkiModuleFactory(),\n uniswapModuleFactory(),\n transactionCheckModuleFactory(),\n solanaContextModuleFactory(),\n solanaTokenModuleFactory(),\n solanaLifiModuleFactory(),\n );\n\n return container;\n};\n"],
5
+ "mappings": "AACA,OAAS,aAAAA,MAAiB,YAE1B,OAAS,yBAAAC,MAA6B,sCACtC,OAAS,uBAAAC,MAA2B,kCACpC,OAAS,eAAAC,MAAmB,0BAE5B,OAAS,+BAAAC,MAAmC,mDAC5C,OAAS,+BAAAC,MAAmC,mDAC5C,OAAS,oBAAAC,MAAwB,4BACjC,OAAS,wBAAAC,MAA4B,4BACrC,OAAS,sBAAAC,MAA0B,gCACnC,OAAS,qBAAAC,MAAyB,8BAClC,OAAS,8BAAAC,MAAkC,yCAC3C,OAAS,2BAAAC,MAA+B,oCACxC,OAAS,4BAAAC,MAAgC,sCACzC,OAAS,sBAAAC,MAA0B,gCACnC,OAAS,iCAAAC,MAAqC,uDAC9C,OAAS,4BAAAC,MAAgC,6CACzC,OAAS,0BAAAC,MAA8B,yCACvC,OAAS,wBAAAC,MAA4B,oCAM9B,MAAMC,EAAgB,CAAC,CAAE,OAAAC,CAAO,IAAyB,CAC9D,MAAMC,EAAY,IAAIpB,EAEtB,OAAAoB,EACG,KAECjB,EAAY,0BAA0B,EACvC,gBAAgBgB,EAAO,aAAa,EAEvCC,EAAU,SACRlB,EAAoBiB,CAAM,EAC1Bd,EAA4B,EAC5BD,EAA4B,EAC5BE,EAAiB,EACjBE,EAAmBW,CAAM,EACzBV,EAAkB,EAClBI,EAAmB,EACnBZ,EAAsB,EACtBc,EAAyBI,CAAM,EAC/BH,EAAuB,EACvBT,EAAqB,EACrBU,EAAqB,EACrBH,EAA8B,EAC9BJ,EAA2B,EAC3BE,EAAyB,EACzBD,EAAwB,CAC1B,EAEOS,CACT",
6
6
  "names": ["Container", "calldataModuleFactory", "configModuleFactory", "configTypes", "dynamicNetworkModuleFactory", "externalPluginModuleFactory", "nftModuleFactory", "nanoPkiModuleFactory", "proxyModuleFactory", "safeModuleFactory", "solanaContextModuleFactory", "solanaLifiModuleFactory", "solanaTokenModuleFactory", "tokenModuleFactory", "transactionCheckModuleFactory", "trustedNameModuleFactory", "typedDataModuleFactory", "uniswapModuleFactory", "makeContainer", "config", "container"]
7
7
  }
@@ -1,2 +1,2 @@
1
- var u=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var f=(n,o,r,e)=>{for(var t=e>1?void 0:e?m(o,r):o,i=n.length-1,a;i>=0;i--)(a=n[i])&&(t=(e?a(o,r,t):a(t))||t);return e&&t&&u(o,r,t),t},p=(n,o)=>(r,e)=>o(r,e,n);import d from"axios";import{inject as g,injectable as y}from"inversify";import{Left as c,Right as l}from"purify-ts";import{configTypes as D}from"../../config/di/configTypes";import{LEDGER_CLIENT_VERSION_HEADER as w}from"../../shared/constant/HttpHeaders";import k from"../../../package.json";let s=class{constructor(o){this.config=o}async getDynamicNetworkConfiguration(o){let r;try{r=(await d.get(`${this.config.cal.url}/networks?output=id,descriptors,icons&chain_id=${o}`,{headers:{[w]:`context-module/${k.version}`}})).data}catch(i){return c(i instanceof Error?i:new Error("Failed to fetch network configuration"))}const e=r?.[0];if(!e)return c(new Error(`Network configuration not found for chain ID: ${o}`));if(!this.isValidNetworkData(e))return c(new Error(`Invalid network configuration response for chain ID: ${o}`));const t=this.transformToNetworkConfiguration(e);return l(t)}isValidNetworkData(o){if(!o||typeof o!="object")return!1;const r=o;if(typeof r.id!="string"||!r.descriptors||typeof r.descriptors!="object")return!1;for(const e of Object.values(r.descriptors))if(!this.isValidDescriptor(e))return!1;return!(r.icons&&typeof r.icons!="object")}isValidDescriptor(o){if(!o||typeof o!="object")return!1;const r=o;if(typeof r.data!="string"||typeof r.descriptorType!="string"||typeof r.descriptorVersion!="string"||!r.signatures||typeof r.signatures!="object")return!1;const e=r.signatures;return!(typeof e.prod!="string"||typeof e.test!="string")}transformToNetworkConfiguration(o){const r=Object.entries(o.descriptors).reduce((e,[t,i])=>(e[t]={descriptorType:i.descriptorType,descriptorVersion:i.descriptorVersion,data:i.data,signatures:i.signatures,icon:o.icons?.[t]},e),{});return{id:o.id,descriptors:r}}};s=f([y(),p(0,g(D.Config))],s);export{s as HttpDynamicNetworkDataSource};
1
+ var d=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var p=(a,o,r,e)=>{for(var t=e>1?void 0:e?m(o,r):o,i=a.length-1,n;i>=0;i--)(n=a[i])&&(t=(e?n(o,r,t):n(t))||t);return e&&t&&d(o,r,t),t},u=(a,o)=>(r,e)=>o(r,e,a);import{DeviceModelId as s}from"@ledgerhq/device-management-kit";import g from"axios";import{inject as y,injectable as l}from"inversify";import{Left as f,Right as D}from"purify-ts";import{configTypes as w}from"../../config/di/configTypes";import{LEDGER_CLIENT_VERSION_HEADER as N}from"../../shared/constant/HttpHeaders";import k from"../../../package.json";const E={nanos:s.NANO_S,nanosp:s.NANO_SP,nanox:s.NANO_X,stax:s.STAX,flex:s.FLEX,apexp:s.APEX};let c=class{constructor(o){this.config=o}async getDynamicNetworkConfiguration(o){let r;try{r=(await g.get(`${this.config.cal.url}/networks?output=id,descriptors,icons&chain_id=${o}`,{headers:{[N]:`context-module/${k.version}`}})).data}catch(i){return f(i instanceof Error?i:new Error("Failed to fetch network configuration"))}const e=r?.[0];if(!e)return f(new Error(`Network configuration not found for chain ID: ${o}`));if(!this.isValidNetworkData(e))return f(new Error(`Invalid network configuration response for chain ID: ${o}`));const t=this.transformToNetworkConfiguration(e);return D(t)}isValidNetworkData(o){if(!o||typeof o!="object")return!1;const r=o;if(typeof r.id!="string"||!r.descriptors||typeof r.descriptors!="object")return!1;for(const e of Object.values(r.descriptors))if(!this.isValidDescriptor(e))return!1;return!(r.icons&&typeof r.icons!="object")}isValidDescriptor(o){if(!o||typeof o!="object")return!1;const r=o;if(typeof r.data!="string"||typeof r.descriptorType!="string"||typeof r.descriptorVersion!="string"||!r.signatures||typeof r.signatures!="object")return!1;const e=r.signatures;return!(typeof e.prod!="string"||typeof e.test!="string")}transformToNetworkConfiguration(o){const r=Object.entries(o.descriptors).reduce((e,[t,i])=>{const n=E[t.toLowerCase()];return n===void 0||(e[n]={descriptorType:i.descriptorType,descriptorVersion:i.descriptorVersion,data:i.data,signatures:i.signatures,icon:o.icons?.[t]}),e},{});return{id:o.id,descriptors:r}}};c=p([l(),u(0,y(w.Config))],c);export{c as HttpDynamicNetworkDataSource};
2
2
  //# sourceMappingURL=HttpDynamicNetworkDataSource.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/dynamic-network/data/HttpDynamicNetworkDataSource.ts"],
4
- "sourcesContent": ["import { type DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport axios from \"axios\";\nimport { inject, injectable } from \"inversify\";\nimport { Either, Left, Right } from \"purify-ts\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { type ContextModuleConfig } from \"@/config/model/ContextModuleConfig\";\nimport {\n type DynamicNetworkConfiguration,\n type DynamicNetworkDescriptor,\n} from \"@/dynamic-network/model/DynamicNetworkConfiguration\";\nimport { LEDGER_CLIENT_VERSION_HEADER } from \"@/shared/constant/HttpHeaders\";\nimport PACKAGE from \"@root/package.json\";\n\nimport { type DynamicNetworkApiResponseDto } from \"./dto/DynamicNetworkApiResponseDto\";\nimport { type DynamicNetworkDataSource } from \"./DynamicNetworkDataSource\";\n\n@injectable()\nexport class HttpDynamicNetworkDataSource implements DynamicNetworkDataSource {\n constructor(\n @inject(configTypes.Config) private readonly config: ContextModuleConfig,\n ) {}\n\n async getDynamicNetworkConfiguration(\n chainId: number,\n ): Promise<Either<Error, DynamicNetworkConfiguration>> {\n let response: DynamicNetworkApiResponseDto;\n\n try {\n const axiosResponse = await axios.get<DynamicNetworkApiResponseDto>(\n `${this.config.cal.url}/networks?output=id,descriptors,icons&chain_id=${chainId}`,\n {\n headers: {\n [LEDGER_CLIENT_VERSION_HEADER]: `context-module/${PACKAGE.version}`,\n },\n },\n );\n response = axiosResponse.data;\n } catch (error) {\n return Left(\n error instanceof Error\n ? error\n : new Error(\"Failed to fetch network configuration\"),\n );\n }\n\n const networkData = response?.[0];\n if (!networkData) {\n return Left(\n new Error(`Network configuration not found for chain ID: ${chainId}`),\n );\n }\n\n // Validate response structure\n if (!this.isValidNetworkData(networkData)) {\n return Left(\n new Error(\n `Invalid network configuration response for chain ID: ${chainId}`,\n ),\n );\n }\n\n const configuration = this.transformToNetworkConfiguration(networkData);\n return Right(configuration);\n }\n\n private isValidNetworkData(\n data: unknown,\n ): data is DynamicNetworkApiResponseDto[0] {\n if (!data || typeof data !== \"object\") {\n return false;\n }\n\n const obj = data as Record<string, unknown>;\n\n // Check required fields\n if (typeof obj[\"id\"] !== \"string\") {\n return false;\n }\n\n // Check descriptors structure\n if (!obj[\"descriptors\"] || typeof obj[\"descriptors\"] !== \"object\") {\n return false;\n }\n\n // Validate each descriptor\n for (const descriptor of Object.values(obj[\"descriptors\"])) {\n if (!this.isValidDescriptor(descriptor)) {\n return false;\n }\n }\n\n // Icons are optional but if present, should be an object\n if (obj[\"icons\"] && typeof obj[\"icons\"] !== \"object\") {\n return false;\n }\n\n return true;\n }\n\n private isValidDescriptor(\n descriptor: unknown,\n ): descriptor is DynamicNetworkApiResponseDto[0][\"descriptors\"][string] {\n if (!descriptor || typeof descriptor !== \"object\") {\n return false;\n }\n\n const desc = descriptor as Record<string, unknown>;\n\n // Check required descriptor fields\n if (\n typeof desc[\"data\"] !== \"string\" ||\n typeof desc[\"descriptorType\"] !== \"string\" ||\n typeof desc[\"descriptorVersion\"] !== \"string\"\n ) {\n return false;\n }\n\n // Check signatures structure\n if (!desc[\"signatures\"] || typeof desc[\"signatures\"] !== \"object\") {\n return false;\n }\n\n const signatures = desc[\"signatures\"] as Record<string, unknown>;\n if (\n typeof signatures[\"prod\"] !== \"string\" ||\n typeof signatures[\"test\"] !== \"string\"\n ) {\n return false;\n }\n\n return true;\n }\n\n private transformToNetworkConfiguration(\n networkData: DynamicNetworkApiResponseDto[0],\n ): DynamicNetworkConfiguration {\n const descriptors = Object.entries(networkData.descriptors).reduce(\n (acc, [deviceModel, descriptor]) => {\n acc[deviceModel as DeviceModelId] = {\n descriptorType: descriptor.descriptorType,\n descriptorVersion: descriptor.descriptorVersion,\n data: descriptor.data,\n signatures: descriptor.signatures,\n icon: networkData.icons?.[deviceModel],\n };\n return acc;\n },\n {} as Record<DeviceModelId, DynamicNetworkDescriptor>,\n );\n\n return {\n id: networkData.id,\n descriptors,\n };\n }\n}\n"],
5
- "mappings": "iOACA,OAAOA,MAAW,QAClB,OAAS,UAAAC,EAAQ,cAAAC,MAAkB,YACnC,OAAiB,QAAAC,EAAM,SAAAC,MAAa,YAEpC,OAAS,eAAAC,MAAmB,0BAM5B,OAAS,gCAAAC,MAAoC,gCAC7C,OAAOC,MAAa,qBAMb,IAAMC,EAAN,KAAuE,CAC5E,YAC+CC,EAC7C,CAD6C,YAAAA,CAC5C,CAEH,MAAM,+BACJC,EACqD,CACrD,IAAIC,EAEJ,GAAI,CASFA,GARsB,MAAMC,EAAM,IAChC,GAAG,KAAK,OAAO,IAAI,GAAG,kDAAkDF,CAAO,GAC/E,CACE,QAAS,CACP,CAACG,CAA4B,EAAG,kBAAkBC,EAAQ,OAAO,EACnE,CACF,CACF,GACyB,IAC3B,OAASC,EAAO,CACd,OAAOC,EACLD,aAAiB,MACbA,EACA,IAAI,MAAM,uCAAuC,CACvD,CACF,CAEA,MAAME,EAAcN,IAAW,CAAC,EAChC,GAAI,CAACM,EACH,OAAOD,EACL,IAAI,MAAM,iDAAiDN,CAAO,EAAE,CACtE,EAIF,GAAI,CAAC,KAAK,mBAAmBO,CAAW,EACtC,OAAOD,EACL,IAAI,MACF,wDAAwDN,CAAO,EACjE,CACF,EAGF,MAAMQ,EAAgB,KAAK,gCAAgCD,CAAW,EACtE,OAAOE,EAAMD,CAAa,CAC5B,CAEQ,mBACNE,EACyC,CACzC,GAAI,CAACA,GAAQ,OAAOA,GAAS,SAC3B,MAAO,GAGT,MAAMC,EAAMD,EAQZ,GALI,OAAOC,EAAI,IAAU,UAKrB,CAACA,EAAI,aAAkB,OAAOA,EAAI,aAAmB,SACvD,MAAO,GAIT,UAAWC,KAAc,OAAO,OAAOD,EAAI,WAAc,EACvD,GAAI,CAAC,KAAK,kBAAkBC,CAAU,EACpC,MAAO,GAKX,MAAI,EAAAD,EAAI,OAAY,OAAOA,EAAI,OAAa,SAK9C,CAEQ,kBACNC,EACsE,CACtE,GAAI,CAACA,GAAc,OAAOA,GAAe,SACvC,MAAO,GAGT,MAAMC,EAAOD,EAYb,GARE,OAAOC,EAAK,MAAY,UACxB,OAAOA,EAAK,gBAAsB,UAClC,OAAOA,EAAK,mBAAyB,UAMnC,CAACA,EAAK,YAAiB,OAAOA,EAAK,YAAkB,SACvD,MAAO,GAGT,MAAMC,EAAaD,EAAK,WACxB,MACE,SAAOC,EAAW,MAAY,UAC9B,OAAOA,EAAW,MAAY,SAMlC,CAEQ,gCACNP,EAC6B,CAC7B,MAAMQ,EAAc,OAAO,QAAQR,EAAY,WAAW,EAAE,OAC1D,CAACS,EAAK,CAACC,EAAaL,CAAU,KAC5BI,EAAIC,CAA4B,EAAI,CAClC,eAAgBL,EAAW,eAC3B,kBAAmBA,EAAW,kBAC9B,KAAMA,EAAW,KACjB,WAAYA,EAAW,WACvB,KAAML,EAAY,QAAQU,CAAW,CACvC,EACOD,GAET,CAAC,CACH,EAEA,MAAO,CACL,GAAIT,EAAY,GAChB,YAAAQ,CACF,CACF,CACF,EA1IajB,EAANoB,EAAA,CADNC,EAAW,EAGPC,EAAA,EAAAC,EAAOC,EAAY,MAAM,IAFjBxB",
6
- "names": ["axios", "inject", "injectable", "Left", "Right", "configTypes", "LEDGER_CLIENT_VERSION_HEADER", "PACKAGE", "HttpDynamicNetworkDataSource", "config", "chainId", "response", "axios", "LEDGER_CLIENT_VERSION_HEADER", "PACKAGE", "error", "Left", "networkData", "configuration", "Right", "data", "obj", "descriptor", "desc", "signatures", "descriptors", "acc", "deviceModel", "__decorateClass", "injectable", "__decorateParam", "inject", "configTypes"]
4
+ "sourcesContent": ["import { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport axios from \"axios\";\nimport { inject, injectable } from \"inversify\";\nimport { Either, Left, Right } from \"purify-ts\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { type ContextModuleConfig } from \"@/config/model/ContextModuleConfig\";\nimport {\n type DynamicNetworkConfiguration,\n type DynamicNetworkDescriptor,\n} from \"@/dynamic-network/model/DynamicNetworkConfiguration\";\nimport { LEDGER_CLIENT_VERSION_HEADER } from \"@/shared/constant/HttpHeaders\";\nimport PACKAGE from \"@root/package.json\";\n\nimport { type DynamicNetworkApiResponseDto } from \"./dto/DynamicNetworkApiResponseDto\";\nimport { type DynamicNetworkDataSource } from \"./DynamicNetworkDataSource\";\n\n/** Maps lowercase device model keys from the API to DeviceModelId */\nconst LOWERCASE_KEY_TO_DEVICE_MODEL_ID: Record<string, DeviceModelId> = {\n nanos: DeviceModelId.NANO_S,\n nanosp: DeviceModelId.NANO_SP,\n nanox: DeviceModelId.NANO_X,\n stax: DeviceModelId.STAX,\n flex: DeviceModelId.FLEX,\n apexp: DeviceModelId.APEX,\n};\n\n@injectable()\nexport class HttpDynamicNetworkDataSource implements DynamicNetworkDataSource {\n constructor(\n @inject(configTypes.Config) private readonly config: ContextModuleConfig,\n ) {}\n\n async getDynamicNetworkConfiguration(\n chainId: number,\n ): Promise<Either<Error, DynamicNetworkConfiguration>> {\n let response: DynamicNetworkApiResponseDto;\n\n try {\n const axiosResponse = await axios.get<DynamicNetworkApiResponseDto>(\n `${this.config.cal.url}/networks?output=id,descriptors,icons&chain_id=${chainId}`,\n {\n headers: {\n [LEDGER_CLIENT_VERSION_HEADER]: `context-module/${PACKAGE.version}`,\n },\n },\n );\n response = axiosResponse.data;\n } catch (error) {\n return Left(\n error instanceof Error\n ? error\n : new Error(\"Failed to fetch network configuration\"),\n );\n }\n\n const networkData = response?.[0];\n if (!networkData) {\n return Left(\n new Error(`Network configuration not found for chain ID: ${chainId}`),\n );\n }\n\n // Validate response structure\n if (!this.isValidNetworkData(networkData)) {\n return Left(\n new Error(\n `Invalid network configuration response for chain ID: ${chainId}`,\n ),\n );\n }\n\n const configuration = this.transformToNetworkConfiguration(networkData);\n return Right(configuration);\n }\n\n private isValidNetworkData(\n data: unknown,\n ): data is DynamicNetworkApiResponseDto[0] {\n if (!data || typeof data !== \"object\") {\n return false;\n }\n\n const obj = data as Record<string, unknown>;\n\n // Check required fields\n if (typeof obj[\"id\"] !== \"string\") {\n return false;\n }\n\n // Check descriptors structure\n if (!obj[\"descriptors\"] || typeof obj[\"descriptors\"] !== \"object\") {\n return false;\n }\n\n // Validate each descriptor\n for (const descriptor of Object.values(obj[\"descriptors\"])) {\n if (!this.isValidDescriptor(descriptor)) {\n return false;\n }\n }\n\n // Icons are optional but if present, should be an object\n if (obj[\"icons\"] && typeof obj[\"icons\"] !== \"object\") {\n return false;\n }\n\n return true;\n }\n\n private isValidDescriptor(\n descriptor: unknown,\n ): descriptor is DynamicNetworkApiResponseDto[0][\"descriptors\"][string] {\n if (!descriptor || typeof descriptor !== \"object\") {\n return false;\n }\n\n const desc = descriptor as Record<string, unknown>;\n\n // Check required descriptor fields\n if (\n typeof desc[\"data\"] !== \"string\" ||\n typeof desc[\"descriptorType\"] !== \"string\" ||\n typeof desc[\"descriptorVersion\"] !== \"string\"\n ) {\n return false;\n }\n\n // Check signatures structure\n if (!desc[\"signatures\"] || typeof desc[\"signatures\"] !== \"object\") {\n return false;\n }\n\n const signatures = desc[\"signatures\"] as Record<string, unknown>;\n if (\n typeof signatures[\"prod\"] !== \"string\" ||\n typeof signatures[\"test\"] !== \"string\"\n ) {\n return false;\n }\n\n return true;\n }\n\n private transformToNetworkConfiguration(\n networkData: DynamicNetworkApiResponseDto[0],\n ): DynamicNetworkConfiguration {\n const descriptors = Object.entries(networkData.descriptors).reduce(\n (acc, [apiKey, descriptor]) => {\n const deviceModelId =\n LOWERCASE_KEY_TO_DEVICE_MODEL_ID[apiKey.toLowerCase()];\n if (deviceModelId === undefined) {\n return acc;\n }\n acc[deviceModelId] = {\n descriptorType: descriptor.descriptorType,\n descriptorVersion: descriptor.descriptorVersion,\n data: descriptor.data,\n signatures: descriptor.signatures,\n icon: networkData.icons?.[apiKey],\n };\n return acc;\n },\n {} as Record<DeviceModelId, DynamicNetworkDescriptor>,\n );\n\n return {\n id: networkData.id,\n descriptors,\n };\n }\n}\n"],
5
+ "mappings": "iOAAA,OAAS,iBAAAA,MAAqB,kCAC9B,OAAOC,MAAW,QAClB,OAAS,UAAAC,EAAQ,cAAAC,MAAkB,YACnC,OAAiB,QAAAC,EAAM,SAAAC,MAAa,YAEpC,OAAS,eAAAC,MAAmB,0BAM5B,OAAS,gCAAAC,MAAoC,gCAC7C,OAAOC,MAAa,qBAMpB,MAAMC,EAAkE,CACtE,MAAOC,EAAc,OACrB,OAAQA,EAAc,QACtB,MAAOA,EAAc,OACrB,KAAMA,EAAc,KACpB,KAAMA,EAAc,KACpB,MAAOA,EAAc,IACvB,EAGO,IAAMC,EAAN,KAAuE,CAC5E,YAC+CC,EAC7C,CAD6C,YAAAA,CAC5C,CAEH,MAAM,+BACJC,EACqD,CACrD,IAAIC,EAEJ,GAAI,CASFA,GARsB,MAAMC,EAAM,IAChC,GAAG,KAAK,OAAO,IAAI,GAAG,kDAAkDF,CAAO,GAC/E,CACE,QAAS,CACP,CAACG,CAA4B,EAAG,kBAAkBC,EAAQ,OAAO,EACnE,CACF,CACF,GACyB,IAC3B,OAASC,EAAO,CACd,OAAOC,EACLD,aAAiB,MACbA,EACA,IAAI,MAAM,uCAAuC,CACvD,CACF,CAEA,MAAME,EAAcN,IAAW,CAAC,EAChC,GAAI,CAACM,EACH,OAAOD,EACL,IAAI,MAAM,iDAAiDN,CAAO,EAAE,CACtE,EAIF,GAAI,CAAC,KAAK,mBAAmBO,CAAW,EACtC,OAAOD,EACL,IAAI,MACF,wDAAwDN,CAAO,EACjE,CACF,EAGF,MAAMQ,EAAgB,KAAK,gCAAgCD,CAAW,EACtE,OAAOE,EAAMD,CAAa,CAC5B,CAEQ,mBACNE,EACyC,CACzC,GAAI,CAACA,GAAQ,OAAOA,GAAS,SAC3B,MAAO,GAGT,MAAMC,EAAMD,EAQZ,GALI,OAAOC,EAAI,IAAU,UAKrB,CAACA,EAAI,aAAkB,OAAOA,EAAI,aAAmB,SACvD,MAAO,GAIT,UAAWC,KAAc,OAAO,OAAOD,EAAI,WAAc,EACvD,GAAI,CAAC,KAAK,kBAAkBC,CAAU,EACpC,MAAO,GAKX,MAAI,EAAAD,EAAI,OAAY,OAAOA,EAAI,OAAa,SAK9C,CAEQ,kBACNC,EACsE,CACtE,GAAI,CAACA,GAAc,OAAOA,GAAe,SACvC,MAAO,GAGT,MAAMC,EAAOD,EAYb,GARE,OAAOC,EAAK,MAAY,UACxB,OAAOA,EAAK,gBAAsB,UAClC,OAAOA,EAAK,mBAAyB,UAMnC,CAACA,EAAK,YAAiB,OAAOA,EAAK,YAAkB,SACvD,MAAO,GAGT,MAAMC,EAAaD,EAAK,WACxB,MACE,SAAOC,EAAW,MAAY,UAC9B,OAAOA,EAAW,MAAY,SAMlC,CAEQ,gCACNP,EAC6B,CAC7B,MAAMQ,EAAc,OAAO,QAAQR,EAAY,WAAW,EAAE,OAC1D,CAACS,EAAK,CAACC,EAAQL,CAAU,IAAM,CAC7B,MAAMM,EACJtB,EAAiCqB,EAAO,YAAY,CAAC,EACvD,OAAIC,IAAkB,SAGtBF,EAAIE,CAAa,EAAI,CACnB,eAAgBN,EAAW,eAC3B,kBAAmBA,EAAW,kBAC9B,KAAMA,EAAW,KACjB,WAAYA,EAAW,WACvB,KAAML,EAAY,QAAQU,CAAM,CAClC,GACOD,CACT,EACA,CAAC,CACH,EAEA,MAAO,CACL,GAAIT,EAAY,GAChB,YAAAQ,CACF,CACF,CACF,EA/IajB,EAANqB,EAAA,CADNC,EAAW,EAGPC,EAAA,EAAAC,EAAOC,EAAY,MAAM,IAFjBzB",
6
+ "names": ["DeviceModelId", "axios", "inject", "injectable", "Left", "Right", "configTypes", "LEDGER_CLIENT_VERSION_HEADER", "PACKAGE", "LOWERCASE_KEY_TO_DEVICE_MODEL_ID", "DeviceModelId", "HttpDynamicNetworkDataSource", "config", "chainId", "response", "axios", "LEDGER_CLIENT_VERSION_HEADER", "PACKAGE", "error", "Left", "networkData", "configuration", "Right", "data", "obj", "descriptor", "desc", "signatures", "descriptors", "acc", "apiKey", "deviceModelId", "__decorateClass", "injectable", "__decorateParam", "inject", "configTypes"]
7
7
  }
@@ -1,2 +1,2 @@
1
- var u=Object.defineProperty;var g=Object.getOwnPropertyDescriptor;var C=(i,e,o,t)=>{for(var r=t>1?void 0:t?g(e,o):e,n=i.length-1,a;n>=0;n--)(a=i[n])&&(r=(t?a(e,o,r):a(r))||r);return t&&r&&u(e,o,r),r},d=(i,e)=>(o,t)=>e(o,t,i);import{DeviceModelId as I}from"@ledgerhq/device-management-kit";import{inject as m,injectable as N}from"inversify";import{configTypes as D}from"../../config/di/configTypes";import{dynamicNetworkTypes as k}from"../../dynamic-network/di/dynamicNetworkTypes";import{pkiTypes as S}from"../../pki/di/pkiTypes";import{KeyId as _}from"../../pki/model/KeyId";import{KeyUsage as x}from"../../pki/model/KeyUsage";import{ClearSignContextType as f}from"../../shared/model/ClearSignContext";import{HexStringUtils as T}from"../../shared/utils/HexStringUtils";const w="15",M=[f.DYNAMIC_NETWORK,f.DYNAMIC_NETWORK_ICON];let p=class{_networkDataSource;_config;_certificateLoader;constructor(e,o,t){this._networkDataSource=e,this._config=o,this._certificateLoader=t}canHandle(e,o){return typeof e=="object"&&e!==null&&"chainId"in e&&"deviceModelId"in e&&e.deviceModelId!==void 0&&e.deviceModelId!==I.NANO_S&&typeof e.chainId=="number"&&M.every(t=>o.includes(t))}async load(e){const{chainId:o,deviceModelId:t}=e,r=await this._networkDataSource.getDynamicNetworkConfiguration(o),n=await this._certificateLoader.loadCertificate({keyId:_.CalNetwork,keyUsage:x.Network,targetDevice:t});return r.caseOf({Left:()=>[],Right:a=>{const s=[],c=a.descriptors[t];if(!c)return[];const l=c.signatures[this._config.cal.mode];if(!l)return[];const y=T.appendSignatureToPayload(c.data,l,w);return s.push({type:f.DYNAMIC_NETWORK,payload:y,certificate:n}),c.icon&&s.push({type:f.DYNAMIC_NETWORK_ICON,payload:c.icon}),s}})}};p=C([N(),d(0,m(k.DynamicNetworkDataSource)),d(1,m(D.Config)),d(2,m(S.PkiCertificateLoader))],p);export{p as DynamicNetworkContextLoader};
1
+ var I=Object.defineProperty;var N=Object.getOwnPropertyDescriptor;var m=(a,e,o,t)=>{for(var r=t>1?void 0:t?N(e,o):e,n=a.length-1,i;n>=0;n--)(i=a[n])&&(r=(t?i(e,o,r):i(r))||r);return t&&r&&I(e,o,r),r},d=(a,e)=>(o,t)=>e(o,t,a);import{DeviceModelId as k}from"@ledgerhq/device-management-kit";import{inject as s,injectable as D}from"inversify";import{configTypes as C}from"../../config/di/configTypes";import{dynamicNetworkTypes as S}from"../../dynamic-network/di/dynamicNetworkTypes";import{pkiTypes as _}from"../../pki/di/pkiTypes";import{KeyId as h}from"../../pki/model/KeyId";import{KeyUsage as x}from"../../pki/model/KeyUsage";import{ClearSignContextType as g}from"../../shared/model/ClearSignContext";import{HexStringUtils as w}from"../../shared/utils/HexStringUtils";const v="15",T=[g.DYNAMIC_NETWORK,g.DYNAMIC_NETWORK_ICON];let l=class{_networkDataSource;_config;_certificateLoader;logger;constructor(e,o,t,r){this._networkDataSource=e,this._config=o,this._certificateLoader=t,this.logger=r("DynamicNetworkContextLoader")}canHandle(e,o){return typeof e=="object"&&e!==null&&"chainId"in e&&"deviceModelId"in e&&e.deviceModelId!==void 0&&e.deviceModelId!==k.NANO_S&&typeof e.chainId=="number"&&T.every(t=>o.includes(t))}async load(e){const{chainId:o,deviceModelId:t}=e,r=await this._networkDataSource.getDynamicNetworkConfiguration(o),n=await this._certificateLoader.loadCertificate({keyId:h.CalNetwork,keyUsage:x.Network,targetDevice:t}),i=r.caseOf({Left:()=>[],Right:y=>{const p=[],c=y.descriptors[t];if(!c)return[];const f=c.signatures[this._config.cal.mode];if(!f)return[];const u=w.appendSignatureToPayload(c.data,f,v);return p.push({type:g.DYNAMIC_NETWORK,payload:u,certificate:n}),c.icon&&p.push({type:g.DYNAMIC_NETWORK_ICON,payload:c.icon}),p}});return this.logger.debug("load result",{data:{result:i}}),i}};l=m([D(),d(0,s(S.DynamicNetworkDataSource)),d(1,s(C.Config)),d(2,s(_.PkiCertificateLoader)),d(3,s(C.ContextModuleLoggerFactory))],l);export{l as DynamicNetworkContextLoader};
2
2
  //# sourceMappingURL=DynamicNetworkContextLoader.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/dynamic-network/domain/DynamicNetworkContextLoader.ts"],
4
- "sourcesContent": ["import { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { type ContextModuleConfig } from \"@/config/model/ContextModuleConfig\";\nimport { type DynamicNetworkDataSource } from \"@/dynamic-network/data/DynamicNetworkDataSource\";\nimport { dynamicNetworkTypes } from \"@/dynamic-network/di/dynamicNetworkTypes\";\nimport { pkiTypes } from \"@/pki/di/pkiTypes\";\nimport { type PkiCertificateLoader } from \"@/pki/domain/PkiCertificateLoader\";\nimport { KeyId } from \"@/pki/model/KeyId\";\nimport { KeyUsage } from \"@/pki/model/KeyUsage\";\nimport { ContextLoader } from \"@/shared/domain/ContextLoader\";\nimport {\n ClearSignContext,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\nimport { HexStringUtils } from \"@/shared/utils/HexStringUtils\";\n\nexport type DynamicNetworkContextInput = {\n chainId: number;\n deviceModelId: DeviceModelId;\n};\n\nconst NETWORK_SIGNATURE_TAG = \"15\";\n\nconst SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.DYNAMIC_NETWORK,\n ClearSignContextType.DYNAMIC_NETWORK_ICON,\n];\n\n@injectable()\nexport class DynamicNetworkContextLoader\n implements ContextLoader<DynamicNetworkContextInput>\n{\n private readonly _networkDataSource: DynamicNetworkDataSource;\n private readonly _config: ContextModuleConfig;\n private readonly _certificateLoader: PkiCertificateLoader;\n\n constructor(\n @inject(dynamicNetworkTypes.DynamicNetworkDataSource)\n networkDataSource: DynamicNetworkDataSource,\n @inject(configTypes.Config)\n config: ContextModuleConfig,\n @inject(pkiTypes.PkiCertificateLoader)\n certificateLoader: PkiCertificateLoader,\n ) {\n this._networkDataSource = networkDataSource;\n this._config = config;\n this._certificateLoader = certificateLoader;\n }\n\n canHandle(\n input: unknown,\n expectedTypes: ClearSignContextType[],\n ): input is DynamicNetworkContextInput {\n return (\n typeof input === \"object\" &&\n input !== null &&\n \"chainId\" in input &&\n \"deviceModelId\" in input &&\n input.deviceModelId !== undefined &&\n input.deviceModelId !== DeviceModelId.NANO_S &&\n typeof input.chainId === \"number\" &&\n SUPPORTED_TYPES.every((type) => expectedTypes.includes(type))\n );\n }\n\n async load(input: DynamicNetworkContextInput): Promise<ClearSignContext[]> {\n const { chainId, deviceModelId } = input;\n\n const result =\n await this._networkDataSource.getDynamicNetworkConfiguration(chainId);\n\n // Fetch certificate for the network configuration upfront\n const certificate = await this._certificateLoader.loadCertificate({\n keyId: KeyId.CalNetwork,\n keyUsage: KeyUsage.Network,\n targetDevice: deviceModelId,\n });\n\n return result.caseOf({\n Left: () => [],\n Right: (configuration) => {\n const contexts: ClearSignContext[] = [];\n const descriptor = configuration.descriptors[deviceModelId];\n\n if (!descriptor) {\n return [];\n }\n\n const signature = descriptor.signatures[this._config.cal.mode];\n\n if (!signature) {\n return [];\n }\n\n const configPayload = HexStringUtils.appendSignatureToPayload(\n descriptor.data,\n signature,\n NETWORK_SIGNATURE_TAG,\n );\n\n contexts.push({\n type: ClearSignContextType.DYNAMIC_NETWORK,\n payload: configPayload,\n certificate,\n });\n\n // Add icon if available in the descriptor\n if (descriptor.icon) {\n // Icons don't need signatures appended\n contexts.push({\n type: ClearSignContextType.DYNAMIC_NETWORK_ICON,\n payload: descriptor.icon,\n });\n }\n\n return contexts;\n },\n });\n }\n}\n"],
5
- "mappings": "iOAAA,OAAS,iBAAAA,MAAqB,kCAC9B,OAAS,UAAAC,EAAQ,cAAAC,MAAkB,YAEnC,OAAS,eAAAC,MAAmB,0BAG5B,OAAS,uBAAAC,MAA2B,2CACpC,OAAS,YAAAC,MAAgB,oBAEzB,OAAS,SAAAC,MAAa,oBACtB,OAAS,YAAAC,MAAgB,uBAEzB,OAEE,wBAAAC,MACK,kCACP,OAAS,kBAAAC,MAAsB,gCAO/B,MAAMC,EAAwB,KAExBC,EAA0C,CAC9CC,EAAqB,gBACrBA,EAAqB,oBACvB,EAGO,IAAMC,EAAN,KAEP,CACmB,mBACA,QACA,mBAEjB,YAEEC,EAEAC,EAEAC,EACA,CACA,KAAK,mBAAqBF,EAC1B,KAAK,QAAUC,EACf,KAAK,mBAAqBC,CAC5B,CAEA,UACEC,EACAC,EACqC,CACrC,OACE,OAAOD,GAAU,UACjBA,IAAU,MACV,YAAaA,GACb,kBAAmBA,GACnBA,EAAM,gBAAkB,QACxBA,EAAM,gBAAkBE,EAAc,QACtC,OAAOF,EAAM,SAAY,UACzBN,EAAgB,MAAOS,GAASF,EAAc,SAASE,CAAI,CAAC,CAEhE,CAEA,MAAM,KAAKH,EAAgE,CACzE,KAAM,CAAE,QAAAI,EAAS,cAAAC,CAAc,EAAIL,EAE7BM,EACJ,MAAM,KAAK,mBAAmB,+BAA+BF,CAAO,EAGhEG,EAAc,MAAM,KAAK,mBAAmB,gBAAgB,CAChE,MAAOC,EAAM,WACb,SAAUC,EAAS,QACnB,aAAcJ,CAChB,CAAC,EAED,OAAOC,EAAO,OAAO,CACnB,KAAM,IAAM,CAAC,EACb,MAAQI,GAAkB,CACxB,MAAMC,EAA+B,CAAC,EAChCC,EAAaF,EAAc,YAAYL,CAAa,EAE1D,GAAI,CAACO,EACH,MAAO,CAAC,EAGV,MAAMC,EAAYD,EAAW,WAAW,KAAK,QAAQ,IAAI,IAAI,EAE7D,GAAI,CAACC,EACH,MAAO,CAAC,EAGV,MAAMC,EAAgBC,EAAe,yBACnCH,EAAW,KACXC,EACApB,CACF,EAEA,OAAAkB,EAAS,KAAK,CACZ,KAAMhB,EAAqB,gBAC3B,QAASmB,EACT,YAAAP,CACF,CAAC,EAGGK,EAAW,MAEbD,EAAS,KAAK,CACZ,KAAMhB,EAAqB,qBAC3B,QAASiB,EAAW,IACtB,CAAC,EAGID,CACT,CACF,CAAC,CACH,CACF,EA1Faf,EAANoB,EAAA,CADNC,EAAW,EASPC,EAAA,EAAAC,EAAOC,EAAoB,wBAAwB,GAEnDF,EAAA,EAAAC,EAAOE,EAAY,MAAM,GAEzBH,EAAA,EAAAC,EAAOG,EAAS,oBAAoB,IAZ5B1B",
6
- "names": ["DeviceModelId", "inject", "injectable", "configTypes", "dynamicNetworkTypes", "pkiTypes", "KeyId", "KeyUsage", "ClearSignContextType", "HexStringUtils", "NETWORK_SIGNATURE_TAG", "SUPPORTED_TYPES", "ClearSignContextType", "DynamicNetworkContextLoader", "networkDataSource", "config", "certificateLoader", "input", "expectedTypes", "DeviceModelId", "type", "chainId", "deviceModelId", "result", "certificate", "KeyId", "KeyUsage", "configuration", "contexts", "descriptor", "signature", "configPayload", "HexStringUtils", "__decorateClass", "injectable", "__decorateParam", "inject", "dynamicNetworkTypes", "configTypes", "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 { type ContextModuleConfig } from \"@/config/model/ContextModuleConfig\";\nimport { type DynamicNetworkDataSource } from \"@/dynamic-network/data/DynamicNetworkDataSource\";\nimport { dynamicNetworkTypes } from \"@/dynamic-network/di/dynamicNetworkTypes\";\nimport { pkiTypes } from \"@/pki/di/pkiTypes\";\nimport { type PkiCertificateLoader } from \"@/pki/domain/PkiCertificateLoader\";\nimport { KeyId } from \"@/pki/model/KeyId\";\nimport { KeyUsage } from \"@/pki/model/KeyUsage\";\nimport { ContextLoader } from \"@/shared/domain/ContextLoader\";\nimport {\n ClearSignContext,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\nimport { HexStringUtils } from \"@/shared/utils/HexStringUtils\";\n\nexport type DynamicNetworkContextInput = {\n chainId: number;\n deviceModelId: DeviceModelId;\n};\n\nconst NETWORK_SIGNATURE_TAG = \"15\";\n\nconst SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.DYNAMIC_NETWORK,\n ClearSignContextType.DYNAMIC_NETWORK_ICON,\n];\n\n@injectable()\nexport class DynamicNetworkContextLoader\n implements ContextLoader<DynamicNetworkContextInput>\n{\n private readonly _networkDataSource: DynamicNetworkDataSource;\n private readonly _config: ContextModuleConfig;\n private readonly _certificateLoader: PkiCertificateLoader;\n private logger: LoggerPublisherService;\n\n constructor(\n @inject(dynamicNetworkTypes.DynamicNetworkDataSource)\n networkDataSource: DynamicNetworkDataSource,\n @inject(configTypes.Config)\n config: ContextModuleConfig,\n @inject(pkiTypes.PkiCertificateLoader)\n certificateLoader: PkiCertificateLoader,\n @inject(configTypes.ContextModuleLoggerFactory)\n loggerFactory: (tag: string) => LoggerPublisherService,\n ) {\n this._networkDataSource = networkDataSource;\n this._config = config;\n this._certificateLoader = certificateLoader;\n this.logger = loggerFactory(\"DynamicNetworkContextLoader\");\n }\n\n canHandle(\n input: unknown,\n expectedTypes: ClearSignContextType[],\n ): input is DynamicNetworkContextInput {\n return (\n typeof input === \"object\" &&\n input !== null &&\n \"chainId\" in input &&\n \"deviceModelId\" in input &&\n input.deviceModelId !== undefined &&\n input.deviceModelId !== DeviceModelId.NANO_S &&\n typeof input.chainId === \"number\" &&\n SUPPORTED_TYPES.every((type) => expectedTypes.includes(type))\n );\n }\n\n async load(input: DynamicNetworkContextInput): Promise<ClearSignContext[]> {\n const { chainId, deviceModelId } = input;\n\n const networkConfig =\n await this._networkDataSource.getDynamicNetworkConfiguration(chainId);\n\n // Fetch certificate for the network configuration upfront\n const certificate = await this._certificateLoader.loadCertificate({\n keyId: KeyId.CalNetwork,\n keyUsage: KeyUsage.Network,\n targetDevice: deviceModelId,\n });\n\n const result = networkConfig.caseOf({\n Left: () => [],\n Right: (configuration) => {\n const contexts: ClearSignContext[] = [];\n const descriptor = configuration.descriptors[deviceModelId];\n\n if (!descriptor) {\n return [];\n }\n\n const signature = descriptor.signatures[this._config.cal.mode];\n\n if (!signature) {\n return [];\n }\n\n const configPayload = HexStringUtils.appendSignatureToPayload(\n descriptor.data,\n signature,\n NETWORK_SIGNATURE_TAG,\n );\n\n contexts.push({\n type: ClearSignContextType.DYNAMIC_NETWORK,\n payload: configPayload,\n certificate,\n });\n\n // Add icon if available in the descriptor\n if (descriptor.icon) {\n // Icons don't need signatures appended\n contexts.push({\n type: ClearSignContextType.DYNAMIC_NETWORK_ICON,\n payload: descriptor.icon,\n });\n }\n\n return contexts;\n },\n });\n\n this.logger.debug(\"load result\", { data: { result } });\n return result;\n }\n}\n"],
5
+ "mappings": "iOAAA,OACE,iBAAAA,MAEK,kCACP,OAAS,UAAAC,EAAQ,cAAAC,MAAkB,YAEnC,OAAS,eAAAC,MAAmB,0BAG5B,OAAS,uBAAAC,MAA2B,2CACpC,OAAS,YAAAC,MAAgB,oBAEzB,OAAS,SAAAC,MAAa,oBACtB,OAAS,YAAAC,MAAgB,uBAEzB,OAEE,wBAAAC,MACK,kCACP,OAAS,kBAAAC,MAAsB,gCAO/B,MAAMC,EAAwB,KAExBC,EAA0C,CAC9CC,EAAqB,gBACrBA,EAAqB,oBACvB,EAGO,IAAMC,EAAN,KAEP,CACmB,mBACA,QACA,mBACT,OAER,YAEEC,EAEAC,EAEAC,EAEAC,EACA,CACA,KAAK,mBAAqBH,EAC1B,KAAK,QAAUC,EACf,KAAK,mBAAqBC,EAC1B,KAAK,OAASC,EAAc,6BAA6B,CAC3D,CAEA,UACEC,EACAC,EACqC,CACrC,OACE,OAAOD,GAAU,UACjBA,IAAU,MACV,YAAaA,GACb,kBAAmBA,GACnBA,EAAM,gBAAkB,QACxBA,EAAM,gBAAkBE,EAAc,QACtC,OAAOF,EAAM,SAAY,UACzBP,EAAgB,MAAOU,GAASF,EAAc,SAASE,CAAI,CAAC,CAEhE,CAEA,MAAM,KAAKH,EAAgE,CACzE,KAAM,CAAE,QAAAI,EAAS,cAAAC,CAAc,EAAIL,EAE7BM,EACJ,MAAM,KAAK,mBAAmB,+BAA+BF,CAAO,EAGhEG,EAAc,MAAM,KAAK,mBAAmB,gBAAgB,CAChE,MAAOC,EAAM,WACb,SAAUC,EAAS,QACnB,aAAcJ,CAChB,CAAC,EAEKK,EAASJ,EAAc,OAAO,CAClC,KAAM,IAAM,CAAC,EACb,MAAQK,GAAkB,CACxB,MAAMC,EAA+B,CAAC,EAChCC,EAAaF,EAAc,YAAYN,CAAa,EAE1D,GAAI,CAACQ,EACH,MAAO,CAAC,EAGV,MAAMC,EAAYD,EAAW,WAAW,KAAK,QAAQ,IAAI,IAAI,EAE7D,GAAI,CAACC,EACH,MAAO,CAAC,EAGV,MAAMC,EAAgBC,EAAe,yBACnCH,EAAW,KACXC,EACAtB,CACF,EAEA,OAAAoB,EAAS,KAAK,CACZ,KAAMlB,EAAqB,gBAC3B,QAASqB,EACT,YAAAR,CACF,CAAC,EAGGM,EAAW,MAEbD,EAAS,KAAK,CACZ,KAAMlB,EAAqB,qBAC3B,QAASmB,EAAW,IACtB,CAAC,EAGID,CACT,CACF,CAAC,EAED,YAAK,OAAO,MAAM,cAAe,CAAE,KAAM,CAAE,OAAAF,CAAO,CAAE,CAAC,EAC9CA,CACT,CACF,EAjGaf,EAANsB,EAAA,CADNC,EAAW,EAUPC,EAAA,EAAAC,EAAOC,EAAoB,wBAAwB,GAEnDF,EAAA,EAAAC,EAAOE,EAAY,MAAM,GAEzBH,EAAA,EAAAC,EAAOG,EAAS,oBAAoB,GAEpCJ,EAAA,EAAAC,EAAOE,EAAY,0BAA0B,IAfrC3B",
6
+ "names": ["DeviceModelId", "inject", "injectable", "configTypes", "dynamicNetworkTypes", "pkiTypes", "KeyId", "KeyUsage", "ClearSignContextType", "HexStringUtils", "NETWORK_SIGNATURE_TAG", "SUPPORTED_TYPES", "ClearSignContextType", "DynamicNetworkContextLoader", "networkDataSource", "config", "certificateLoader", "loggerFactory", "input", "expectedTypes", "DeviceModelId", "type", "chainId", "deviceModelId", "networkConfig", "certificate", "KeyId", "KeyUsage", "result", "configuration", "contexts", "descriptor", "signature", "configPayload", "HexStringUtils", "__decorateClass", "injectable", "__decorateParam", "inject", "dynamicNetworkTypes", "configTypes", "pkiTypes"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{DeviceModelId as e}from"@ledgerhq/device-management-kit";import{Left as y,Right as s}from"purify-ts";import{DynamicNetworkContextLoader as f}from"../../dynamic-network/domain/DynamicNetworkContextLoader";import{KeyId as m}from"../../pki/model/KeyId";import{KeyUsage as g}from"../../pki/model/KeyUsage";import{ClearSignContextType as r}from"../../shared/model/ClearSignContext";describe("DynamicNetworkContextLoader",()=>{const c={getDynamicNetworkConfiguration:vi.fn()},l={cal:{url:"https://crypto-assets-service.api.ledger.com",mode:"prod",branch:"main"}},p={loadCertificate:vi.fn()},u={keyUsageNumber:1,payload:new Uint8Array([1,2,3])},a=new f(c,l,p),t=o=>({data:"",descriptorType:"",descriptorVersion:"",signatures:{prod:"",test:""},icon:void 0,...o});beforeEach(()=>{vi.restoreAllMocks(),vi.spyOn(p,"loadCertificate").mockResolvedValue(u)}),describe("canHandle function",()=>{const o={chainId:1,deviceModelId:e.STAX};it("should return true for valid input",()=>{expect(a.canHandle(o,[r.DYNAMIC_NETWORK,r.DYNAMIC_NETWORK_ICON])).toBe(!0)}),it("should return false for invalid expected type",()=>{expect(a.canHandle(o,[r.TOKEN])).toBe(!1),expect(a.canHandle(o,[r.DYNAMIC_NETWORK])).toBe(!1),expect(a.canHandle(o,[r.DYNAMIC_NETWORK_ICON])).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,i)=>{expect(a.canHandle(n,[r.DYNAMIC_NETWORK,r.DYNAMIC_NETWORK_ICON])).toBe(!1)}),it.each([[{...o,chainId:void 0},"missing chainId"],[{...o,deviceModelId:void 0},"missing deviceModelId"]])("should return false for %s",(n,i)=>{expect(a.canHandle(n,[r.DYNAMIC_NETWORK,r.DYNAMIC_NETWORK_ICON])).toBe(!1)}),it.each([[{...o,chainId:"1"},"string chainId"],[{...o,chainId:null},"null chainId"],[{...o,deviceModelId:e.NANO_S},"NANO_S deviceModelId"]])("should return false for %s",(n,i)=>{expect(a.canHandle(n,[r.DYNAMIC_NETWORK,r.DYNAMIC_NETWORK_ICON])).toBe(!1)})}),describe("load function",()=>{it("should return empty array when network data source returns error",async()=>{const o={chainId:1,deviceModelId:e.STAX};vi.spyOn(c,"getDynamicNetworkConfiguration").mockResolvedValue(y(new Error("Network error")));const n=await a.load(o);expect(n).toEqual([]),expect(c.getDynamicNetworkConfiguration).toHaveBeenCalledWith(1)}),it("should return empty array when descriptor for device model is not found",async()=>{const o={chainId:1,deviceModelId:e.STAX},n={id:"ethereum",descriptors:{[e.NANO_S]:t(),[e.NANO_SP]:t(),[e.NANO_X]:t(),[e.FLEX]:t({data:"0x0101",descriptorType:"network",descriptorVersion:"v1",signatures:{prod:"prod-sig",test:"test-sig"},icon:void 0})}};vi.spyOn(c,"getDynamicNetworkConfiguration").mockResolvedValue(s(n));const i=await a.load(o);expect(i).toEqual([])}),it("should return empty array when signature for mode is not found",async()=>{const o={chainId:1,deviceModelId:e.STAX},n={id:"ethereum",descriptors:{[e.APEX]:t(),[e.NANO_S]:t(),[e.NANO_SP]:t(),[e.NANO_X]:t(),[e.FLEX]:t(),[e.STAX]:t({data:"0x0101",descriptorType:"network",descriptorVersion:"v1",signatures:{test:"test-sig"},icon:void 0})}};vi.spyOn(c,"getDynamicNetworkConfiguration").mockResolvedValue(s(n));const i=await a.load(o);expect(i).toEqual([])}),it("should return context with network configuration when all data is available",async()=>{const o={chainId:137,deviceModelId:e.STAX},n={id:"polygon",descriptors:{[e.APEX]:t(),[e.NANO_S]:t(),[e.NANO_SP]:t(),[e.NANO_X]:t(),[e.FLEX]:t(),[e.STAX]:{data:"0x0101080201015101012308000000000000008952",descriptorType:"network",descriptorVersion:"v1",signatures:{prod:"3045022100cf42c039c16fc95dc97c09f15cdd93bed0e63ee45cf5c38c2b30bb8a3bc17f8d022053a96c9e51695c3c1c1a31f5cbf84bd6febadc97f4bb02bdc67cf3e24ad0c32d",test:"test-sig"},icon:void 0}}};vi.spyOn(c,"getDynamicNetworkConfiguration").mockResolvedValue(s(n));const i=await a.load(o);expect(i).toHaveLength(1),expect(i[0]).toMatchObject({type:r.DYNAMIC_NETWORK,payload:expect.stringContaining("0x0101080201015101012308000000000000008952"),certificate:u}),expect(p.loadCertificate).toHaveBeenCalledWith({keyId:m.CalNetwork,keyUsage:g.Network,targetDevice:e.STAX})}),it("should include icon context when icon is available",async()=>{const o={chainId:1,deviceModelId:e.STAX},n={id:"ethereum",descriptors:{[e.APEX]:t(),[e.NANO_S]:t(),[e.NANO_SP]:t(),[e.NANO_X]:t(),[e.FLEX]:t(),[e.STAX]:{data:"0x0101",descriptorType:"network",descriptorVersion:"v1",signatures:{prod:"prod-sig",test:"test-sig"},icon:"icon-hex-data"}}};vi.spyOn(c,"getDynamicNetworkConfiguration").mockResolvedValue(s(n));const i=await a.load(o);expect(i).toHaveLength(2),expect(i[0]).toMatchObject({type:r.DYNAMIC_NETWORK,payload:expect.any(String),certificate:u}),expect(i[1]).toMatchObject({type:r.DYNAMIC_NETWORK_ICON,payload:"icon-hex-data"})}),it("should handle multiple device models correctly",async()=>{const o={chainId:1,deviceModelId:e.FLEX},n={id:"ethereum",descriptors:{[e.APEX]:t(),[e.NANO_S]:t(),[e.NANO_SP]:t(),[e.NANO_X]:t(),[e.FLEX]:{data:"0xFLEX",descriptorType:"network",descriptorVersion:"v1",signatures:{prod:"flex-prod-sig",test:"flex-test-sig"},icon:void 0},[e.STAX]:{data:"0xSTAX",descriptorType:"network",descriptorVersion:"v1",signatures:{prod:"stax-prod-sig",test:"stax-test-sig"},icon:void 0}}};vi.spyOn(c,"getDynamicNetworkConfiguration").mockResolvedValue(s(n));const i=await a.load(o);expect(i).toHaveLength(1);const d=i[0];d&&"payload"in d&&(expect(d.payload).toContain("0xFLEX"),expect(d.payload).toContain("flex-prod-sig"))}),it("should use test mode signature when configured",async()=>{const o=new f(c,{...l,cal:{...l.cal,mode:"test"}},p),n={chainId:1,deviceModelId:e.STAX},i={id:"ethereum",descriptors:{[e.APEX]:t(),[e.NANO_S]:t(),[e.NANO_SP]:t(),[e.NANO_X]:t(),[e.FLEX]:t(),[e.STAX]:{data:"0x0101",descriptorType:"network",descriptorVersion:"v1",signatures:{prod:"prod-sig",test:"test-sig"},icon:void 0}}};vi.spyOn(c,"getDynamicNetworkConfiguration").mockResolvedValue(s(i));const d=await o.load(n);expect(d).toHaveLength(1);const N=d[0];N&&"payload"in N&&expect(N.payload).toContain("test-sig")})})});
1
+ import{DeviceModelId as i}from"@ledgerhq/device-management-kit";import{Left as g,Right as l}from"purify-ts";import{DynamicNetworkContextLoader as m}from"../../dynamic-network/domain/DynamicNetworkContextLoader";import{KeyId as k}from"../../pki/model/KeyId";import{KeyUsage as C}from"../../pki/model/KeyUsage";import{ClearSignContextType as r}from"../../shared/model/ClearSignContext";const N=()=>({debug:vi.fn(),info:vi.fn(),warn:vi.fn(),error:vi.fn(),subscribers:[]});describe("DynamicNetworkContextLoader",()=>{const d={getDynamicNetworkConfiguration:vi.fn()},f={cal:{url:"https://crypto-assets-service.api.ledger.com",mode:"prod",branch:"main"}},u={loadCertificate:vi.fn()},y={keyUsageNumber:1,payload:new Uint8Array([1,2,3])},a=new m(d,f,u,N),c=e=>({data:"",descriptorType:"",descriptorVersion:"",signatures:{prod:"",test:""},icon:void 0,...e}),p=(e={})=>({[i.NANO_S]:c(),[i.NANO_SP]:c(),[i.NANO_X]:c(),[i.STAX]:c(),[i.FLEX]:c(),[i.APEX]:c(),...e});beforeEach(()=>{vi.restoreAllMocks(),vi.spyOn(u,"loadCertificate").mockResolvedValue(y)}),describe("canHandle function",()=>{const e={chainId:1,deviceModelId:i.STAX};it("should return true for valid input",()=>{expect(a.canHandle(e,[r.DYNAMIC_NETWORK,r.DYNAMIC_NETWORK_ICON])).toBe(!0)}),it("should return false for invalid expected type",()=>{expect(a.canHandle(e,[r.TOKEN])).toBe(!1),expect(a.canHandle(e,[r.DYNAMIC_NETWORK])).toBe(!1),expect(a.canHandle(e,[r.DYNAMIC_NETWORK_ICON])).toBe(!1)}),it.each([[null,"null input"],[void 0,"undefined input"],[{},"empty object"],["string","string input"],[123,"number input"]])("should return false for %s",(o,t)=>{expect(a.canHandle(o,[r.DYNAMIC_NETWORK,r.DYNAMIC_NETWORK_ICON])).toBe(!1)}),it.each([[{...e,chainId:void 0},"missing chainId"],[{...e,deviceModelId:void 0},"missing deviceModelId"]])("should return false for %s",(o,t)=>{expect(a.canHandle(o,[r.DYNAMIC_NETWORK,r.DYNAMIC_NETWORK_ICON])).toBe(!1)}),it.each([[{...e,chainId:"1"},"string chainId"],[{...e,chainId:null},"null chainId"],[{...e,deviceModelId:i.NANO_S},"NANO_S deviceModelId"]])("should return false for %s",(o,t)=>{expect(a.canHandle(o,[r.DYNAMIC_NETWORK,r.DYNAMIC_NETWORK_ICON])).toBe(!1)})}),describe("load function",()=>{it("should return empty array when network data source returns error",async()=>{const e={chainId:1,deviceModelId:i.STAX};vi.spyOn(d,"getDynamicNetworkConfiguration").mockResolvedValue(g(new Error("Network error")));const o=await a.load(e);expect(o).toEqual([]),expect(d.getDynamicNetworkConfiguration).toHaveBeenCalledWith(1)}),it("should return empty array when descriptor for device model is not found",async()=>{const e={chainId:1,deviceModelId:i.STAX},t={id:"ethereum",descriptors:p({flex:c({data:"0x0101",descriptorType:"network",descriptorVersion:"v1",signatures:{prod:"prod-sig",test:"test-sig"},icon:void 0}),stax:void 0})};vi.spyOn(d,"getDynamicNetworkConfiguration").mockResolvedValue(l(t));const n=await a.load(e);expect(n).toEqual([])}),it("should return empty array when signature for mode is not found",async()=>{const e={chainId:1,deviceModelId:i.STAX},o={id:"ethereum",descriptors:p({stax:c({data:"0x0101",descriptorType:"network",descriptorVersion:"v1",signatures:{prod:"",test:"test-sig"},icon:void 0})})};vi.spyOn(d,"getDynamicNetworkConfiguration").mockResolvedValue(l(o));const t=await a.load(e);expect(t).toEqual([])}),it("should return context with network configuration when all data is available",async()=>{const e={chainId:137,deviceModelId:i.STAX},o={id:"polygon",descriptors:p({stax:c({data:"0x0101080201015101012308000000000000008952",descriptorType:"network",descriptorVersion:"v1",signatures:{prod:"3045022100cf42c039c16fc95dc97c09f15cdd93bed0e63ee45cf5c38c2b30bb8a3bc17f8d022053a96c9e51695c3c1c1a31f5cbf84bd6febadc97f4bb02bdc67cf3e24ad0c32d",test:"test-sig"},icon:void 0})})};vi.spyOn(d,"getDynamicNetworkConfiguration").mockResolvedValue(l(o));const t=await a.load(e);expect(t).toHaveLength(1),expect(t[0]).toMatchObject({type:r.DYNAMIC_NETWORK,certificate:y});const n=t[0];n&&"payload"in n&&expect(n.payload).toContain("0x0101080201015101012308000000000000008952"),expect(u.loadCertificate).toHaveBeenCalledWith({keyId:k.CalNetwork,keyUsage:C.Network,targetDevice:i.STAX})}),it("should include icon context when icon is available",async()=>{const e={chainId:1,deviceModelId:i.STAX},o={id:"ethereum",descriptors:p({stax:c({data:"0x0101",descriptorType:"network",descriptorVersion:"v1",signatures:{prod:"prod-sig",test:"test-sig"},icon:"icon-hex-data"})})};vi.spyOn(d,"getDynamicNetworkConfiguration").mockResolvedValue(l(o));const t=await a.load(e);expect(t).toHaveLength(2),expect(t[0]).toMatchObject({type:r.DYNAMIC_NETWORK,certificate:y});const n=t[0];n&&"payload"in n&&expect(n.payload).toEqual(expect.any(String)),expect(t[1]).toMatchObject({type:r.DYNAMIC_NETWORK_ICON});const s=t[1];s&&"payload"in s&&expect(s.payload).toBe("icon-hex-data")}),it("should handle multiple device models correctly",async()=>{const e={chainId:1,deviceModelId:i.FLEX},o={id:"ethereum",descriptors:p({flex:c({data:"0xFLEX",descriptorType:"network",descriptorVersion:"v1",signatures:{prod:"flex-prod-sig",test:"flex-test-sig"},icon:void 0}),stax:c({data:"0xSTAX",descriptorType:"network",descriptorVersion:"v1",signatures:{prod:"stax-prod-sig",test:"stax-test-sig"},icon:void 0})})};vi.spyOn(d,"getDynamicNetworkConfiguration").mockResolvedValue(l(o));const t=await a.load(e);expect(t).toHaveLength(1);const n=t[0];n&&"payload"in n&&(expect(n.payload).toContain("0xFLEX"),expect(n.payload).toContain("flex-prod-sig"))}),it("should use test mode signature when configured",async()=>{const e=new m(d,{...f,cal:{...f.cal,mode:"test"}},u,N),o={chainId:1,deviceModelId:i.STAX},t={id:"ethereum",descriptors:p({stax:c({data:"0x0101",descriptorType:"network",descriptorVersion:"v1",signatures:{prod:"prod-sig",test:"test-sig"},icon:void 0})})};vi.spyOn(d,"getDynamicNetworkConfiguration").mockResolvedValue(l(t));const n=await e.load(o);expect(n).toHaveLength(1);const s=n[0];s&&"payload"in s&&expect(s.payload).toContain("test-sig")})})});
2
2
  //# sourceMappingURL=DynamicNetworkContextLoader.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/dynamic-network/domain/DynamicNetworkContextLoader.test.ts"],
4
- "sourcesContent": ["import { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\n\nimport { type ContextModuleConfig } from \"@/config/model/ContextModuleConfig\";\nimport { type DynamicNetworkDataSource } from \"@/dynamic-network/data/DynamicNetworkDataSource\";\nimport {\n type DynamicNetworkContextInput,\n DynamicNetworkContextLoader,\n} from \"@/dynamic-network/domain/DynamicNetworkContextLoader\";\nimport {\n type DynamicNetworkConfiguration,\n type DynamicNetworkDescriptor,\n} from \"@/dynamic-network/model/DynamicNetworkConfiguration\";\nimport { type PkiCertificateLoader } from \"@/pki/domain/PkiCertificateLoader\";\nimport { KeyId } from \"@/pki/model/KeyId\";\nimport { KeyUsage } from \"@/pki/model/KeyUsage\";\nimport { type PkiCertificate } from \"@/pki/model/PkiCertificate\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\n\ndescribe(\"DynamicNetworkContextLoader\", () => {\n const mockNetworkDataSource: DynamicNetworkDataSource = {\n getDynamicNetworkConfiguration: vi.fn(),\n };\n\n const mockConfig = {\n cal: {\n url: \"https://crypto-assets-service.api.ledger.com\",\n mode: \"prod\",\n branch: \"main\",\n },\n } as ContextModuleConfig;\n\n const mockCertificateLoader: PkiCertificateLoader = {\n loadCertificate: vi.fn(),\n };\n\n const mockCertificate: PkiCertificate = {\n keyUsageNumber: 1,\n payload: new Uint8Array([0x01, 0x02, 0x03]),\n };\n\n const loader = new DynamicNetworkContextLoader(\n mockNetworkDataSource,\n mockConfig,\n mockCertificateLoader,\n );\n\n // Helper function to create a mock NetworkDescriptor\n const createMockDescriptor = (\n partial?: Partial<DynamicNetworkDescriptor>,\n ): DynamicNetworkDescriptor => ({\n data: \"\",\n descriptorType: \"\",\n descriptorVersion: \"\",\n signatures: {\n prod: \"\",\n test: \"\",\n },\n icon: undefined,\n ...partial,\n });\n\n beforeEach(() => {\n vi.restoreAllMocks();\n vi.spyOn(mockCertificateLoader, \"loadCertificate\").mockResolvedValue(\n mockCertificate,\n );\n });\n\n describe(\"canHandle function\", () => {\n const validInput: DynamicNetworkContextInput = {\n chainId: 1,\n deviceModelId: DeviceModelId.STAX,\n };\n\n it(\"should return true for valid input\", () => {\n expect(\n loader.canHandle(validInput, [\n ClearSignContextType.DYNAMIC_NETWORK,\n ClearSignContextType.DYNAMIC_NETWORK_ICON,\n ]),\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 expect(\n loader.canHandle(validInput, [ClearSignContextType.DYNAMIC_NETWORK]),\n ).toBe(false);\n expect(\n loader.canHandle(validInput, [\n ClearSignContextType.DYNAMIC_NETWORK_ICON,\n ]),\n ).toBe(false);\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(\n loader.canHandle(input, [\n ClearSignContextType.DYNAMIC_NETWORK,\n ClearSignContextType.DYNAMIC_NETWORK_ICON,\n ]),\n ).toBe(false);\n });\n\n it.each([\n [{ ...validInput, chainId: undefined }, \"missing chainId\"],\n [{ ...validInput, deviceModelId: undefined }, \"missing deviceModelId\"],\n ])(\"should return false for %s\", (input, _description) => {\n expect(\n loader.canHandle(input, [\n ClearSignContextType.DYNAMIC_NETWORK,\n ClearSignContextType.DYNAMIC_NETWORK_ICON,\n ]),\n ).toBe(false);\n });\n\n it.each([\n [{ ...validInput, chainId: \"1\" }, \"string chainId\"],\n [{ ...validInput, chainId: null }, \"null chainId\"],\n [\n { ...validInput, deviceModelId: DeviceModelId.NANO_S },\n \"NANO_S deviceModelId\",\n ],\n ])(\"should return false for %s\", (input, _description) => {\n expect(\n loader.canHandle(input, [\n ClearSignContextType.DYNAMIC_NETWORK,\n ClearSignContextType.DYNAMIC_NETWORK_ICON,\n ]),\n ).toBe(false);\n });\n });\n\n describe(\"load function\", () => {\n it(\"should return empty array when network data source returns error\", async () => {\n // GIVEN\n const input: DynamicNetworkContextInput = {\n chainId: 1,\n deviceModelId: DeviceModelId.STAX,\n };\n vi.spyOn(\n mockNetworkDataSource,\n \"getDynamicNetworkConfiguration\",\n ).mockResolvedValue(Left(new Error(\"Network error\")));\n\n // WHEN\n const result = await loader.load(input);\n\n // THEN\n expect(result).toEqual([]);\n expect(\n mockNetworkDataSource.getDynamicNetworkConfiguration,\n ).toHaveBeenCalledWith(1);\n });\n\n it(\"should return empty array when descriptor for device model is not found\", async () => {\n // GIVEN\n const input: DynamicNetworkContextInput = {\n chainId: 1,\n deviceModelId: DeviceModelId.STAX,\n };\n const networkConfig: DynamicNetworkConfiguration = {\n id: \"ethereum\",\n descriptors: {\n [DeviceModelId.NANO_S]: createMockDescriptor(),\n [DeviceModelId.NANO_SP]: createMockDescriptor(),\n [DeviceModelId.NANO_X]: createMockDescriptor(),\n // STAX descriptor is intentionally missing\n [DeviceModelId.FLEX]: createMockDescriptor({\n data: \"0x0101\",\n descriptorType: \"network\",\n descriptorVersion: \"v1\",\n signatures: {\n prod: \"prod-sig\",\n test: \"test-sig\",\n },\n icon: undefined,\n }),\n } as Record<DeviceModelId, DynamicNetworkDescriptor>,\n };\n vi.spyOn(\n mockNetworkDataSource,\n \"getDynamicNetworkConfiguration\",\n ).mockResolvedValue(Right(networkConfig));\n\n // WHEN\n const result = await loader.load(input);\n\n // THEN\n expect(result).toEqual([]);\n });\n\n it(\"should return empty array when signature for mode is not found\", async () => {\n // GIVEN\n const input: DynamicNetworkContextInput = {\n chainId: 1,\n deviceModelId: DeviceModelId.STAX,\n };\n const networkConfig: DynamicNetworkConfiguration = {\n id: \"ethereum\",\n descriptors: {\n [DeviceModelId.APEX]: createMockDescriptor(),\n [DeviceModelId.NANO_S]: createMockDescriptor(),\n [DeviceModelId.NANO_SP]: createMockDescriptor(),\n [DeviceModelId.NANO_X]: createMockDescriptor(),\n [DeviceModelId.FLEX]: createMockDescriptor(),\n [DeviceModelId.STAX]: createMockDescriptor({\n data: \"0x0101\",\n descriptorType: \"network\",\n descriptorVersion: \"v1\",\n signatures: {\n test: \"test-sig\",\n // Missing prod signature - intentionally partial\n } as { prod: string; test: string },\n icon: undefined,\n }),\n },\n };\n vi.spyOn(\n mockNetworkDataSource,\n \"getDynamicNetworkConfiguration\",\n ).mockResolvedValue(Right(networkConfig));\n\n // WHEN\n const result = await loader.load(input);\n\n // THEN\n expect(result).toEqual([]);\n });\n\n it(\"should return context with network configuration when all data is available\", async () => {\n // GIVEN\n const input: DynamicNetworkContextInput = {\n chainId: 137,\n deviceModelId: DeviceModelId.STAX,\n };\n const networkConfig: DynamicNetworkConfiguration = {\n id: \"polygon\",\n descriptors: {\n [DeviceModelId.APEX]: createMockDescriptor(),\n [DeviceModelId.NANO_S]: createMockDescriptor(),\n [DeviceModelId.NANO_SP]: createMockDescriptor(),\n [DeviceModelId.NANO_X]: createMockDescriptor(),\n [DeviceModelId.FLEX]: createMockDescriptor(),\n [DeviceModelId.STAX]: {\n data: \"0x0101080201015101012308000000000000008952\",\n descriptorType: \"network\",\n descriptorVersion: \"v1\",\n signatures: {\n prod: \"3045022100cf42c039c16fc95dc97c09f15cdd93bed0e63ee45cf5c38c2b30bb8a3bc17f8d022053a96c9e51695c3c1c1a31f5cbf84bd6febadc97f4bb02bdc67cf3e24ad0c32d\",\n test: \"test-sig\",\n },\n icon: undefined,\n },\n },\n };\n vi.spyOn(\n mockNetworkDataSource,\n \"getDynamicNetworkConfiguration\",\n ).mockResolvedValue(Right(networkConfig));\n\n // WHEN\n const result = await loader.load(input);\n\n // THEN\n expect(result).toHaveLength(1);\n expect(result[0]).toMatchObject({\n type: ClearSignContextType.DYNAMIC_NETWORK,\n payload: expect.stringContaining(\n \"0x0101080201015101012308000000000000008952\",\n ),\n certificate: mockCertificate,\n });\n expect(mockCertificateLoader.loadCertificate).toHaveBeenCalledWith({\n keyId: KeyId.CalNetwork,\n keyUsage: KeyUsage.Network,\n targetDevice: DeviceModelId.STAX,\n });\n });\n\n it(\"should include icon context when icon is available\", async () => {\n // GIVEN\n const input: DynamicNetworkContextInput = {\n chainId: 1,\n deviceModelId: DeviceModelId.STAX,\n };\n const networkConfig: DynamicNetworkConfiguration = {\n id: \"ethereum\",\n descriptors: {\n [DeviceModelId.APEX]: createMockDescriptor(),\n [DeviceModelId.NANO_S]: createMockDescriptor(),\n [DeviceModelId.NANO_SP]: createMockDescriptor(),\n [DeviceModelId.NANO_X]: createMockDescriptor(),\n [DeviceModelId.FLEX]: createMockDescriptor(),\n [DeviceModelId.STAX]: {\n data: \"0x0101\",\n descriptorType: \"network\",\n descriptorVersion: \"v1\",\n signatures: {\n prod: \"prod-sig\",\n test: \"test-sig\",\n },\n icon: \"icon-hex-data\",\n },\n },\n };\n vi.spyOn(\n mockNetworkDataSource,\n \"getDynamicNetworkConfiguration\",\n ).mockResolvedValue(Right(networkConfig));\n\n // WHEN\n const result = await loader.load(input);\n\n // THEN\n expect(result).toHaveLength(2);\n expect(result[0]).toMatchObject({\n type: ClearSignContextType.DYNAMIC_NETWORK,\n payload: expect.any(String),\n certificate: mockCertificate,\n });\n expect(result[1]).toMatchObject({\n type: ClearSignContextType.DYNAMIC_NETWORK_ICON,\n payload: \"icon-hex-data\",\n });\n });\n\n it(\"should handle multiple device models correctly\", async () => {\n // GIVEN\n const input: DynamicNetworkContextInput = {\n chainId: 1,\n deviceModelId: DeviceModelId.FLEX,\n };\n const networkConfig: DynamicNetworkConfiguration = {\n id: \"ethereum\",\n descriptors: {\n [DeviceModelId.APEX]: createMockDescriptor(),\n [DeviceModelId.NANO_S]: createMockDescriptor(),\n [DeviceModelId.NANO_SP]: createMockDescriptor(),\n [DeviceModelId.NANO_X]: createMockDescriptor(),\n [DeviceModelId.FLEX]: {\n data: \"0xFLEX\",\n descriptorType: \"network\",\n descriptorVersion: \"v1\",\n signatures: {\n prod: \"flex-prod-sig\",\n test: \"flex-test-sig\",\n },\n icon: undefined,\n },\n [DeviceModelId.STAX]: {\n data: \"0xSTAX\",\n descriptorType: \"network\",\n descriptorVersion: \"v1\",\n signatures: {\n prod: \"stax-prod-sig\",\n test: \"stax-test-sig\",\n },\n icon: undefined,\n },\n },\n };\n vi.spyOn(\n mockNetworkDataSource,\n \"getDynamicNetworkConfiguration\",\n ).mockResolvedValue(Right(networkConfig));\n\n // WHEN\n const result = await loader.load(input);\n\n // THEN\n expect(result).toHaveLength(1);\n const context = result[0];\n if (context && \"payload\" in context) {\n expect(context.payload).toContain(\"0xFLEX\");\n expect(context.payload).toContain(\"flex-prod-sig\");\n }\n });\n\n it(\"should use test mode signature when configured\", async () => {\n // GIVEN\n const testModeLoader = new DynamicNetworkContextLoader(\n mockNetworkDataSource,\n { ...mockConfig, cal: { ...mockConfig.cal, mode: \"test\" } },\n mockCertificateLoader,\n );\n const input: DynamicNetworkContextInput = {\n chainId: 1,\n deviceModelId: DeviceModelId.STAX,\n };\n const networkConfig: DynamicNetworkConfiguration = {\n id: \"ethereum\",\n descriptors: {\n [DeviceModelId.APEX]: createMockDescriptor(),\n [DeviceModelId.NANO_S]: createMockDescriptor(),\n [DeviceModelId.NANO_SP]: createMockDescriptor(),\n [DeviceModelId.NANO_X]: createMockDescriptor(),\n [DeviceModelId.FLEX]: createMockDescriptor(),\n [DeviceModelId.STAX]: {\n data: \"0x0101\",\n descriptorType: \"network\",\n descriptorVersion: \"v1\",\n signatures: {\n prod: \"prod-sig\",\n test: \"test-sig\",\n },\n icon: undefined,\n },\n },\n };\n vi.spyOn(\n mockNetworkDataSource,\n \"getDynamicNetworkConfiguration\",\n ).mockResolvedValue(Right(networkConfig));\n\n // WHEN\n const result = await testModeLoader.load(input);\n\n // THEN\n expect(result).toHaveLength(1);\n const context = result[0];\n if (context && \"payload\" in context) {\n expect(context.payload).toContain(\"test-sig\");\n }\n });\n });\n});\n"],
5
- "mappings": "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",
6
- "names": ["DeviceModelId", "Left", "Right", "DynamicNetworkContextLoader", "KeyId", "KeyUsage", "ClearSignContextType", "mockNetworkDataSource", "mockConfig", "mockCertificateLoader", "mockCertificate", "loader", "createMockDescriptor", "partial", "validInput", "input", "_description", "result", "networkConfig", "context", "testModeLoader"]
4
+ "sourcesContent": ["import { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\n\nimport { type ContextModuleConfig } from \"@/config/model/ContextModuleConfig\";\nimport { type DynamicNetworkDataSource } from \"@/dynamic-network/data/DynamicNetworkDataSource\";\nimport {\n type DynamicNetworkContextInput,\n DynamicNetworkContextLoader,\n} from \"@/dynamic-network/domain/DynamicNetworkContextLoader\";\nimport {\n type DynamicNetworkConfiguration,\n type DynamicNetworkDescriptor,\n} from \"@/dynamic-network/model/DynamicNetworkConfiguration\";\nimport { type PkiCertificateLoader } from \"@/pki/domain/PkiCertificateLoader\";\nimport { KeyId } from \"@/pki/model/KeyId\";\nimport { KeyUsage } from \"@/pki/model/KeyUsage\";\nimport { type PkiCertificate } from \"@/pki/model/PkiCertificate\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\n\nconst mockLoggerFactory = () => ({\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n});\n\ndescribe(\"DynamicNetworkContextLoader\", () => {\n const mockNetworkDataSource: DynamicNetworkDataSource = {\n getDynamicNetworkConfiguration: vi.fn(),\n };\n\n const mockConfig = {\n cal: {\n url: \"https://crypto-assets-service.api.ledger.com\",\n mode: \"prod\",\n branch: \"main\",\n },\n } as ContextModuleConfig;\n\n const mockCertificateLoader: PkiCertificateLoader = {\n loadCertificate: vi.fn(),\n };\n\n const mockCertificate: PkiCertificate = {\n keyUsageNumber: 1,\n payload: new Uint8Array([0x01, 0x02, 0x03]),\n };\n\n const loader = new DynamicNetworkContextLoader(\n mockNetworkDataSource,\n mockConfig,\n mockCertificateLoader,\n mockLoggerFactory,\n );\n\n // Helper function to create a mock NetworkDescriptor\n const createMockDescriptor = (\n partial?: Partial<DynamicNetworkDescriptor>,\n ): DynamicNetworkDescriptor => ({\n data: \"\",\n descriptorType: \"\",\n descriptorVersion: \"\",\n signatures: {\n prod: \"\",\n test: \"\",\n },\n icon: undefined,\n ...partial,\n });\n\n const createMockDescriptors = (\n overrides: Partial<Record<DeviceModelId, DynamicNetworkDescriptor>> = {},\n ): Record<DeviceModelId, DynamicNetworkDescriptor> => ({\n [DeviceModelId.NANO_S]: createMockDescriptor(),\n [DeviceModelId.NANO_SP]: createMockDescriptor(),\n [DeviceModelId.NANO_X]: createMockDescriptor(),\n [DeviceModelId.STAX]: createMockDescriptor(),\n [DeviceModelId.FLEX]: createMockDescriptor(),\n [DeviceModelId.APEX]: createMockDescriptor(),\n ...overrides,\n });\n\n beforeEach(() => {\n vi.restoreAllMocks();\n vi.spyOn(mockCertificateLoader, \"loadCertificate\").mockResolvedValue(\n mockCertificate,\n );\n });\n\n describe(\"canHandle function\", () => {\n const validInput: DynamicNetworkContextInput = {\n chainId: 1,\n deviceModelId: DeviceModelId.STAX,\n };\n\n it(\"should return true for valid input\", () => {\n expect(\n loader.canHandle(validInput, [\n ClearSignContextType.DYNAMIC_NETWORK,\n ClearSignContextType.DYNAMIC_NETWORK_ICON,\n ]),\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 expect(\n loader.canHandle(validInput, [ClearSignContextType.DYNAMIC_NETWORK]),\n ).toBe(false);\n expect(\n loader.canHandle(validInput, [\n ClearSignContextType.DYNAMIC_NETWORK_ICON,\n ]),\n ).toBe(false);\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(\n loader.canHandle(input, [\n ClearSignContextType.DYNAMIC_NETWORK,\n ClearSignContextType.DYNAMIC_NETWORK_ICON,\n ]),\n ).toBe(false);\n });\n\n it.each([\n [{ ...validInput, chainId: undefined }, \"missing chainId\"],\n [{ ...validInput, deviceModelId: undefined }, \"missing deviceModelId\"],\n ])(\"should return false for %s\", (input, _description) => {\n expect(\n loader.canHandle(input, [\n ClearSignContextType.DYNAMIC_NETWORK,\n ClearSignContextType.DYNAMIC_NETWORK_ICON,\n ]),\n ).toBe(false);\n });\n\n it.each([\n [{ ...validInput, chainId: \"1\" }, \"string chainId\"],\n [{ ...validInput, chainId: null }, \"null chainId\"],\n [\n { ...validInput, deviceModelId: DeviceModelId.NANO_S },\n \"NANO_S deviceModelId\",\n ],\n ])(\"should return false for %s\", (input, _description) => {\n expect(\n loader.canHandle(input, [\n ClearSignContextType.DYNAMIC_NETWORK,\n ClearSignContextType.DYNAMIC_NETWORK_ICON,\n ]),\n ).toBe(false);\n });\n });\n\n describe(\"load function\", () => {\n it(\"should return empty array when network data source returns error\", async () => {\n // GIVEN\n const input: DynamicNetworkContextInput = {\n chainId: 1,\n deviceModelId: DeviceModelId.STAX,\n };\n vi.spyOn(\n mockNetworkDataSource,\n \"getDynamicNetworkConfiguration\",\n ).mockResolvedValue(Left(new Error(\"Network error\")));\n\n // WHEN\n const result = await loader.load(input);\n\n // THEN\n expect(result).toEqual([]);\n expect(\n mockNetworkDataSource.getDynamicNetworkConfiguration,\n ).toHaveBeenCalledWith(1);\n });\n\n it(\"should return empty array when descriptor for device model is not found\", async () => {\n // GIVEN\n const input: DynamicNetworkContextInput = {\n chainId: 1,\n deviceModelId: DeviceModelId.STAX,\n };\n const descriptors = createMockDescriptors({\n flex: createMockDescriptor({\n data: \"0x0101\",\n descriptorType: \"network\",\n descriptorVersion: \"v1\",\n signatures: {\n prod: \"prod-sig\",\n test: \"test-sig\",\n },\n icon: undefined,\n }),\n stax: undefined as unknown as DynamicNetworkDescriptor,\n });\n const networkConfig: DynamicNetworkConfiguration = {\n id: \"ethereum\",\n descriptors,\n };\n vi.spyOn(\n mockNetworkDataSource,\n \"getDynamicNetworkConfiguration\",\n ).mockResolvedValue(Right(networkConfig));\n\n // WHEN\n const result = await loader.load(input);\n\n // THEN\n expect(result).toEqual([]);\n });\n\n it(\"should return empty array when signature for mode is not found\", async () => {\n // GIVEN\n const input: DynamicNetworkContextInput = {\n chainId: 1,\n deviceModelId: DeviceModelId.STAX,\n };\n const networkConfig: DynamicNetworkConfiguration = {\n id: \"ethereum\",\n descriptors: createMockDescriptors({\n stax: createMockDescriptor({\n data: \"0x0101\",\n descriptorType: \"network\",\n descriptorVersion: \"v1\",\n signatures: {\n prod: \"\",\n test: \"test-sig\",\n },\n icon: undefined,\n }),\n }),\n };\n vi.spyOn(\n mockNetworkDataSource,\n \"getDynamicNetworkConfiguration\",\n ).mockResolvedValue(Right(networkConfig));\n\n // WHEN\n const result = await loader.load(input);\n\n // THEN\n expect(result).toEqual([]);\n });\n\n it(\"should return context with network configuration when all data is available\", async () => {\n // GIVEN\n const input: DynamicNetworkContextInput = {\n chainId: 137,\n deviceModelId: DeviceModelId.STAX,\n };\n const networkConfig: DynamicNetworkConfiguration = {\n id: \"polygon\",\n descriptors: createMockDescriptors({\n stax: createMockDescriptor({\n data: \"0x0101080201015101012308000000000000008952\",\n descriptorType: \"network\",\n descriptorVersion: \"v1\",\n signatures: {\n prod: \"3045022100cf42c039c16fc95dc97c09f15cdd93bed0e63ee45cf5c38c2b30bb8a3bc17f8d022053a96c9e51695c3c1c1a31f5cbf84bd6febadc97f4bb02bdc67cf3e24ad0c32d\",\n test: \"test-sig\",\n },\n icon: undefined,\n }),\n }),\n };\n vi.spyOn(\n mockNetworkDataSource,\n \"getDynamicNetworkConfiguration\",\n ).mockResolvedValue(Right(networkConfig));\n\n // WHEN\n const result = await loader.load(input);\n\n // THEN\n expect(result).toHaveLength(1);\n expect(result[0]).toMatchObject({\n type: ClearSignContextType.DYNAMIC_NETWORK,\n certificate: mockCertificate,\n });\n const context = result[0];\n if (context && \"payload\" in context) {\n expect(context.payload).toContain(\n \"0x0101080201015101012308000000000000008952\",\n );\n }\n expect(mockCertificateLoader.loadCertificate).toHaveBeenCalledWith({\n keyId: KeyId.CalNetwork,\n keyUsage: KeyUsage.Network,\n targetDevice: DeviceModelId.STAX,\n });\n });\n\n it(\"should include icon context when icon is available\", async () => {\n // GIVEN\n const input: DynamicNetworkContextInput = {\n chainId: 1,\n deviceModelId: DeviceModelId.STAX,\n };\n const networkConfig: DynamicNetworkConfiguration = {\n id: \"ethereum\",\n descriptors: createMockDescriptors({\n stax: createMockDescriptor({\n data: \"0x0101\",\n descriptorType: \"network\",\n descriptorVersion: \"v1\",\n signatures: {\n prod: \"prod-sig\",\n test: \"test-sig\",\n },\n icon: \"icon-hex-data\",\n }),\n }),\n };\n vi.spyOn(\n mockNetworkDataSource,\n \"getDynamicNetworkConfiguration\",\n ).mockResolvedValue(Right(networkConfig));\n\n // WHEN\n const result = await loader.load(input);\n\n // THEN\n expect(result).toHaveLength(2);\n expect(result[0]).toMatchObject({\n type: ClearSignContextType.DYNAMIC_NETWORK,\n certificate: mockCertificate,\n });\n const networkContext = result[0];\n if (networkContext && \"payload\" in networkContext) {\n expect(networkContext.payload).toEqual(expect.any(String));\n }\n expect(result[1]).toMatchObject({\n type: ClearSignContextType.DYNAMIC_NETWORK_ICON,\n });\n const iconContext = result[1];\n if (iconContext && \"payload\" in iconContext) {\n expect(iconContext.payload).toBe(\"icon-hex-data\");\n }\n });\n\n it(\"should handle multiple device models correctly\", async () => {\n // GIVEN\n const input: DynamicNetworkContextInput = {\n chainId: 1,\n deviceModelId: DeviceModelId.FLEX,\n };\n const networkConfig: DynamicNetworkConfiguration = {\n id: \"ethereum\",\n descriptors: createMockDescriptors({\n flex: createMockDescriptor({\n data: \"0xFLEX\",\n descriptorType: \"network\",\n descriptorVersion: \"v1\",\n signatures: {\n prod: \"flex-prod-sig\",\n test: \"flex-test-sig\",\n },\n icon: undefined,\n }),\n stax: createMockDescriptor({\n data: \"0xSTAX\",\n descriptorType: \"network\",\n descriptorVersion: \"v1\",\n signatures: {\n prod: \"stax-prod-sig\",\n test: \"stax-test-sig\",\n },\n icon: undefined,\n }),\n }),\n };\n vi.spyOn(\n mockNetworkDataSource,\n \"getDynamicNetworkConfiguration\",\n ).mockResolvedValue(Right(networkConfig));\n\n // WHEN\n const result = await loader.load(input);\n\n // THEN\n expect(result).toHaveLength(1);\n const context = result[0];\n if (context && \"payload\" in context) {\n expect(context.payload).toContain(\"0xFLEX\");\n expect(context.payload).toContain(\"flex-prod-sig\");\n }\n });\n\n it(\"should use test mode signature when configured\", async () => {\n // GIVEN\n const testModeLoader = new DynamicNetworkContextLoader(\n mockNetworkDataSource,\n { ...mockConfig, cal: { ...mockConfig.cal, mode: \"test\" } },\n mockCertificateLoader,\n mockLoggerFactory,\n );\n const input: DynamicNetworkContextInput = {\n chainId: 1,\n deviceModelId: DeviceModelId.STAX,\n };\n const networkConfig: DynamicNetworkConfiguration = {\n id: \"ethereum\",\n descriptors: createMockDescriptors({\n stax: createMockDescriptor({\n data: \"0x0101\",\n descriptorType: \"network\",\n descriptorVersion: \"v1\",\n signatures: {\n prod: \"prod-sig\",\n test: \"test-sig\",\n },\n icon: undefined,\n }),\n }),\n };\n vi.spyOn(\n mockNetworkDataSource,\n \"getDynamicNetworkConfiguration\",\n ).mockResolvedValue(Right(networkConfig));\n\n // WHEN\n const result = await testModeLoader.load(input);\n\n // THEN\n expect(result).toHaveLength(1);\n const context = result[0];\n if (context && \"payload\" in context) {\n expect(context.payload).toContain(\"test-sig\");\n }\n });\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["DeviceModelId", "Left", "Right", "DynamicNetworkContextLoader", "KeyId", "KeyUsage", "ClearSignContextType", "mockLoggerFactory", "mockNetworkDataSource", "mockConfig", "mockCertificateLoader", "mockCertificate", "loader", "createMockDescriptor", "partial", "createMockDescriptors", "overrides", "validInput", "input", "_description", "result", "networkConfig", "context", "networkContext", "iconContext", "testModeLoader"]
7
7
  }
@@ -1,2 +1,2 @@
1
- var D=Object.defineProperty;var I=Object.getOwnPropertyDescriptor;var y=(i,e,r,t)=>{for(var a=t>1?void 0:t?I(e,r):e,o=i.length-1,l;o>=0;o--)(l=i[o])&&(a=(t?l(e,r,a):l(a))||a);return t&&a&&D(e,r,a),a},u=(i,e)=>(r,t)=>e(r,t,i);import{isHexaString as x}from"@ledgerhq/device-management-kit";import{Interface as T}from"ethers";import{inject as h,injectable as L}from"inversify";import{EitherAsync as S,Left as R,Right as k}from"purify-ts";import{externalPluginTypes as w}from"../../external-plugin/di/externalPluginTypes";import{ClearSignContextType as n}from"../../shared/model/ClearSignContext";import{tokenTypes as _}from"../../token/di/tokenTypes";import{uniswapTypes as b}from"../../uniswap/di/uniswapTypes";const H=[n.EXTERNAL_PLUGIN,n.TOKEN];let g=class{constructor(e,r,t){this._externalPluginDataSource=e;this._tokenDataSource=r;this._uniswapLoader=t;this._customPluginLoaders={Uniswap:this._uniswapLoader}}_customPluginLoaders;canHandle(e,r){return typeof e=="object"&&e!==null&&"to"in e&&"data"in e&&"selector"in e&&"chainId"in e&&typeof e.chainId=="number"&&x(e.to)&&e.to!=="0x"&&x(e.data)&&e.data!=="0x"&&x(e.selector)&&e.selector!=="0x"&&H.every(t=>r.includes(t))}async load(e){const{to:r,data:t,selector:a,chainId:o}=e,l=await this._externalPluginDataSource.getDappInfos({address:r,chainId:o,selector:a});return S(async({liftEither:c})=>{const s=await c(l);if(!s)return[];const p={type:n.EXTERNAL_PLUGIN,payload:s.selectorDetails.serializedData.concat(s.selectorDetails.signature)},m=this._customPluginLoaders[s.selectorDetails.plugin];if(m!==void 0&&m.canHandle(e,[n.TOKEN])){const d=await m.load(e);return[p,...d]}const C=this.getDecodedCallData(s.abi,s.selectorDetails.method,t);if(C.isLeft())return[{type:n.ERROR,error:C.extract()},p];const P=C.extract(),E=s.selectorDetails.erc20OfInterest.map(async d=>this.getTokenPayload(e,d,P));return[...(await Promise.all(E)).map(d=>d.caseOf({Left:f=>({type:n.ERROR,error:f}),Right:f=>({type:n.TOKEN,payload:f})})),p]}).caseOf({Left:c=>[{type:n.ERROR,error:c}],Right:c=>c})}getTokenPayload(e,r,t){const a=this.getAddressFromPath(r,t);return S(({fromPromise:o})=>o(this._tokenDataSource.getTokenInfosPayload({address:a,chainId:e.chainId})))}getDecodedCallData(e,r,t){try{const a=new T(e);return k(a.decodeFunctionData(r,t))}catch{return R(new Error("[ContextModule] ExternalPluginContextLoader: Unable to parse abi"))}}getAddressFromPath(e,r){let t=r;for(const a of e.split("."))a==="-1"?t=t[t.length-1]:t=t[a];if(!x(t))throw new Error("[ContextModule] ExternalPluginContextLoader: Unable to get address");return t}};g=y([L(),u(0,h(w.ExternalPluginDataSource)),u(1,h(_.TokenDataSource)),u(2,h(b.UniswapContextLoader))],g);export{g as ExternalPluginContextLoader};
1
+ var L=Object.defineProperty;var I=Object.getOwnPropertyDescriptor;var S=(s,e,a,t)=>{for(var r=t>1?void 0:t?I(e,a):e,n=s.length-1,l;n>=0;n--)(l=s[n])&&(r=(t?l(e,a,r):l(r))||r);return t&&r&&L(e,a,r),r},d=(s,e)=>(a,t)=>e(a,t,s);import{isHexaString as u}from"@ledgerhq/device-management-kit";import{Interface as T}from"ethers";import{inject as x,injectable as R}from"inversify";import{EitherAsync as y,Left as w,Right as k}from"purify-ts";import{configTypes as b}from"../../config/di/configTypes";import{externalPluginTypes as v}from"../../external-plugin/di/externalPluginTypes";import{ClearSignContextType as o}from"../../shared/model/ClearSignContext";import{tokenTypes as _}from"../../token/di/tokenTypes";import{uniswapTypes as H}from"../../uniswap/di/uniswapTypes";const O=[o.EXTERNAL_PLUGIN,o.TOKEN];let p=class{constructor(e,a,t,r){this._externalPluginDataSource=e;this._tokenDataSource=a;this._uniswapLoader=t;this._customPluginLoaders={Uniswap:this._uniswapLoader},this.logger=r("ExternalPluginContextLoader")}_customPluginLoaders;logger;canHandle(e,a){return typeof e=="object"&&e!==null&&"to"in e&&"data"in e&&"selector"in e&&"chainId"in e&&typeof e.chainId=="number"&&u(e.to)&&e.to!=="0x"&&u(e.data)&&e.data!=="0x"&&u(e.selector)&&e.selector!=="0x"&&O.every(t=>a.includes(t))}async load(e){const{to:a,data:t,selector:r,chainId:n}=e,l=await this._externalPluginDataSource.getDappInfos({address:a,chainId:n,selector:r}),P=await y(async({liftEither:c})=>{const i=await c(l);if(!i)return[];const m={type:o.EXTERNAL_PLUGIN,payload:i.selectorDetails.serializedData.concat(i.selectorDetails.signature)},C=this._customPluginLoaders[i.selectorDetails.plugin];if(C!==void 0&&C.canHandle(e,[o.TOKEN])){const g=await C.load(e);return[m,...g]}const h=this.getDecodedCallData(i.abi,i.selectorDetails.method,t);if(h.isLeft())return[{type:o.ERROR,error:h.extract()},m];const E=h.extract(),D=i.selectorDetails.erc20OfInterest.map(async g=>this.getTokenPayload(e,g,E));return[...(await Promise.all(D)).map(g=>g.caseOf({Left:f=>({type:o.ERROR,error:f}),Right:f=>({type:o.TOKEN,payload:f})})),m]}).caseOf({Left:c=>[{type:o.ERROR,error:c}],Right:c=>c});return this.logger.debug("load result",{data:{result:P}}),P}getTokenPayload(e,a,t){const r=this.getAddressFromPath(a,t);return y(({fromPromise:n})=>n(this._tokenDataSource.getTokenInfosPayload({address:r,chainId:e.chainId})))}getDecodedCallData(e,a,t){try{const r=new T(e);return k(r.decodeFunctionData(a,t))}catch{return w(new Error("[ContextModule] ExternalPluginContextLoader: Unable to parse abi"))}}getAddressFromPath(e,a){let t=a;for(const r of e.split("."))r==="-1"?t=t[t.length-1]:t=t[r];if(!u(t))throw new Error("[ContextModule] ExternalPluginContextLoader: Unable to get address");return t}};p=S([R(),d(0,x(v.ExternalPluginDataSource)),d(1,x(_.TokenDataSource)),d(2,x(H.UniswapContextLoader)),d(3,x(b.ContextModuleLoggerFactory))],p);export{p as ExternalPluginContextLoader};
2
2
  //# sourceMappingURL=ExternalPluginContextLoader.js.map