@ledgerhq/context-module 2.1.0 → 2.3.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 (468) hide show
  1. package/lib/cjs/package.json +2 -2
  2. package/lib/cjs/src/ContextModuleBuilder.js +1 -1
  3. package/lib/cjs/src/ContextModuleBuilder.js.map +2 -2
  4. package/lib/cjs/src/ContextModuleBuilder.test.js +1 -1
  5. package/lib/cjs/src/ContextModuleBuilder.test.js.map +2 -2
  6. package/lib/cjs/src/DefaultContextModule.js +1 -1
  7. package/lib/cjs/src/DefaultContextModule.js.map +3 -3
  8. package/lib/cjs/src/di.js +1 -1
  9. package/lib/cjs/src/di.js.map +3 -3
  10. package/lib/cjs/src/index.js +1 -1
  11. package/lib/cjs/src/index.js.map +2 -2
  12. package/lib/cjs/src/modules/ethereum/calldata/data/HttpCalldataDescriptorDataSource.test.js +1 -1
  13. package/lib/cjs/src/modules/ethereum/calldata/data/HttpCalldataDescriptorDataSource.test.js.map +2 -2
  14. package/lib/cjs/src/modules/ethereum/dynamic-network/data/HttpDynamicNetworkDataSource.test.js +1 -1
  15. package/lib/cjs/src/modules/ethereum/dynamic-network/data/HttpDynamicNetworkDataSource.test.js.map +2 -2
  16. package/lib/cjs/src/modules/ethereum/dynamic-network/domain/DynamicNetworkContextLoader.test.js +1 -1
  17. package/lib/cjs/src/modules/ethereum/dynamic-network/domain/DynamicNetworkContextLoader.test.js.map +2 -2
  18. package/lib/cjs/src/modules/ethereum/external-plugin/data/HttpExternalPluginDataSource.test.js +1 -1
  19. package/lib/cjs/src/modules/ethereum/external-plugin/data/HttpExternalPluginDataSource.test.js.map +2 -2
  20. package/lib/cjs/src/modules/ethereum/gated-signing/data/HttpGatedDescriptorDataSource.test.js +1 -1
  21. package/lib/cjs/src/modules/ethereum/gated-signing/data/HttpGatedDescriptorDataSource.test.js.map +2 -2
  22. package/lib/cjs/src/modules/ethereum/token/data/HttpTokenDataSource.test.js +1 -1
  23. package/lib/cjs/src/modules/ethereum/token/data/HttpTokenDataSource.test.js.map +2 -2
  24. package/lib/cjs/src/modules/ethereum/trusted-name/data/HttpTrustedNameDataSource.test.js +1 -1
  25. package/lib/cjs/src/modules/ethereum/trusted-name/data/HttpTrustedNameDataSource.test.js.map +2 -2
  26. package/lib/cjs/src/modules/ethereum/typed-data/data/HttpTypedDataDataSource.test.js +1 -1
  27. package/lib/cjs/src/modules/ethereum/typed-data/data/HttpTypedDataDataSource.test.js.map +2 -2
  28. package/lib/cjs/src/modules/multichain/pki/model/KeyId.js +1 -1
  29. package/lib/cjs/src/modules/multichain/pki/model/KeyId.js.map +2 -2
  30. package/lib/cjs/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.js +1 -1
  31. package/lib/cjs/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.js.map +3 -3
  32. package/lib/cjs/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.test.js +1 -1
  33. package/lib/cjs/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.test.js.map +3 -3
  34. package/lib/cjs/src/modules/solana/alt-resolution/data/AltResolutionDataSource.js +2 -0
  35. package/lib/cjs/src/modules/solana/alt-resolution/data/AltResolutionDataSource.js.map +7 -0
  36. package/lib/cjs/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.js +2 -0
  37. package/lib/cjs/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.js.map +7 -0
  38. package/lib/cjs/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.test.js +2 -0
  39. package/lib/cjs/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.test.js.map +7 -0
  40. package/lib/cjs/src/modules/solana/alt-resolution/di/altResolutionModuleFactory.js +2 -0
  41. package/lib/cjs/src/modules/solana/alt-resolution/di/altResolutionModuleFactory.js.map +7 -0
  42. package/lib/cjs/src/modules/solana/alt-resolution/di/altResolutionTypes.js +2 -0
  43. package/lib/cjs/src/modules/solana/alt-resolution/di/altResolutionTypes.js.map +7 -0
  44. package/lib/cjs/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.js +2 -0
  45. package/lib/cjs/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.js.map +7 -0
  46. package/lib/cjs/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.test.js +2 -0
  47. package/lib/cjs/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.test.js.map +7 -0
  48. package/lib/cjs/src/modules/solana/enum-variant/di/enumVariantModuleFactory.js +2 -0
  49. package/lib/cjs/src/modules/solana/enum-variant/di/enumVariantModuleFactory.js.map +7 -0
  50. package/lib/cjs/src/modules/solana/enum-variant/di/enumVariantTypes.js +2 -0
  51. package/lib/cjs/src/modules/solana/enum-variant/di/enumVariantTypes.js.map +7 -0
  52. package/lib/cjs/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.js +2 -0
  53. package/lib/cjs/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.js.map +7 -0
  54. package/lib/cjs/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.test.js +2 -0
  55. package/lib/cjs/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.test.js.map +7 -0
  56. package/lib/cjs/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.js +2 -0
  57. package/lib/cjs/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.js.map +7 -0
  58. package/lib/cjs/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.test.js +2 -0
  59. package/lib/cjs/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.test.js.map +7 -0
  60. package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoDataSource.js +2 -0
  61. package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoDataSource.js.map +7 -0
  62. package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoDto.js +2 -0
  63. package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoDto.js.map +7 -0
  64. package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoMapper.js +2 -0
  65. package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoMapper.js.map +7 -0
  66. package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoMapper.test.js +2 -0
  67. package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoMapper.test.js.map +7 -0
  68. package/lib/cjs/src/modules/solana/instruction-info/di/instructionInfoModuleFactory.js +2 -0
  69. package/lib/cjs/src/modules/solana/instruction-info/di/instructionInfoModuleFactory.js.map +7 -0
  70. package/lib/cjs/src/modules/solana/instruction-info/di/instructionInfoTypes.js +2 -0
  71. package/lib/cjs/src/modules/solana/instruction-info/di/instructionInfoTypes.js.map +7 -0
  72. package/lib/cjs/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.js +2 -0
  73. package/lib/cjs/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.js.map +7 -0
  74. package/lib/cjs/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.test.js +2 -0
  75. package/lib/cjs/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.test.js.map +7 -0
  76. package/lib/cjs/src/modules/solana/lifi/data/HttpLifiDataSource.test.js +1 -1
  77. package/lib/cjs/src/modules/solana/lifi/data/HttpLifiDataSource.test.js.map +2 -2
  78. package/lib/cjs/src/modules/solana/lifi/domain/LifiContextLoader.test.js +1 -1
  79. package/lib/cjs/src/modules/solana/lifi/domain/LifiContextLoader.test.js.map +2 -2
  80. package/lib/cjs/src/modules/solana/model/SolanaClearSignContext.js +1 -1
  81. package/lib/cjs/src/modules/solana/model/SolanaClearSignContext.js.map +3 -3
  82. package/lib/cjs/src/modules/solana/model/SolanaContextTypes.js +1 -1
  83. package/lib/cjs/src/modules/solana/model/SolanaContextTypes.js.map +1 -1
  84. package/lib/cjs/src/modules/solana/model/SolanaPayloads.js +1 -1
  85. package/lib/cjs/src/modules/solana/model/SolanaPayloads.js.map +3 -3
  86. package/lib/cjs/src/modules/solana/model/SolanaTransactionScanChainId.js +1 -1
  87. package/lib/cjs/src/modules/solana/model/SolanaTransactionScanChainId.js.map +2 -2
  88. package/lib/cjs/src/modules/solana/owner-info/domain/OwnerInfoContextLoader.js +1 -1
  89. package/lib/cjs/src/modules/solana/owner-info/domain/OwnerInfoContextLoader.js.map +2 -2
  90. package/lib/cjs/src/modules/solana/owner-info/domain/OwnerInfoContextLoader.test.js +1 -1
  91. package/lib/cjs/src/modules/solana/owner-info/domain/OwnerInfoContextLoader.test.js.map +2 -2
  92. package/lib/cjs/src/modules/solana/owner-info/domain/solanaContextTypes.js +1 -1
  93. package/lib/cjs/src/modules/solana/owner-info/domain/solanaContextTypes.js.map +1 -1
  94. package/lib/cjs/src/modules/solana/token/data/HttpTokenDataSource.test.js +2 -2
  95. package/lib/cjs/src/modules/solana/token/data/HttpTokenDataSource.test.js.map +2 -2
  96. package/lib/cjs/src/modules/solana/token/domain/TokenContextLoader.js +1 -1
  97. package/lib/cjs/src/modules/solana/token/domain/TokenContextLoader.js.map +3 -3
  98. package/lib/cjs/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.js +2 -0
  99. package/lib/cjs/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.js.map +7 -0
  100. package/lib/cjs/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.test.js +2 -0
  101. package/lib/cjs/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.test.js.map +7 -0
  102. package/lib/cjs/src/modules/solana/token-account-state/data/TokenAccountStateDataSource.js +2 -0
  103. package/lib/cjs/src/modules/solana/token-account-state/data/TokenAccountStateDataSource.js.map +7 -0
  104. package/lib/cjs/src/modules/solana/token-account-state/di/tokenAccountStateModuleFactory.js +2 -0
  105. package/lib/cjs/src/modules/solana/token-account-state/di/tokenAccountStateModuleFactory.js.map +7 -0
  106. package/lib/cjs/src/modules/solana/token-account-state/di/tokenAccountStateTypes.js +2 -0
  107. package/lib/cjs/src/modules/solana/token-account-state/di/tokenAccountStateTypes.js.map +7 -0
  108. package/lib/cjs/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.js +2 -0
  109. package/lib/cjs/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.js.map +7 -0
  110. package/lib/cjs/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.test.js +2 -0
  111. package/lib/cjs/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.test.js.map +7 -0
  112. package/lib/cjs/src/modules/solana/token-info/data/HttpTokenInfoDataSource.js +2 -0
  113. package/lib/cjs/src/modules/solana/token-info/data/HttpTokenInfoDataSource.js.map +7 -0
  114. package/lib/cjs/src/modules/solana/token-info/data/HttpTokenInfoDataSource.test.js +2 -0
  115. package/lib/cjs/src/modules/solana/token-info/data/HttpTokenInfoDataSource.test.js.map +7 -0
  116. package/lib/cjs/src/modules/solana/token-info/data/TokenInfoDataSource.js +2 -0
  117. package/lib/cjs/src/modules/solana/token-info/data/TokenInfoDataSource.js.map +7 -0
  118. package/lib/cjs/src/modules/solana/token-info/di/tokenInfoModuleFactory.js +2 -0
  119. package/lib/cjs/src/modules/solana/token-info/di/tokenInfoModuleFactory.js.map +7 -0
  120. package/lib/cjs/src/modules/solana/token-info/di/tokenInfoTypes.js +2 -0
  121. package/lib/cjs/src/modules/solana/token-info/di/tokenInfoTypes.js.map +7 -0
  122. package/lib/cjs/src/modules/solana/token-info/domain/TokenInfoContextLoader.js +2 -0
  123. package/lib/cjs/src/modules/solana/token-info/domain/TokenInfoContextLoader.js.map +7 -0
  124. package/lib/cjs/src/modules/solana/token-info/domain/TokenInfoContextLoader.test.js +2 -0
  125. package/lib/cjs/src/modules/solana/token-info/domain/TokenInfoContextLoader.test.js.map +7 -0
  126. package/lib/cjs/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.js +2 -0
  127. package/lib/cjs/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.js.map +7 -0
  128. package/lib/cjs/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.test.js +2 -0
  129. package/lib/cjs/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.test.js.map +7 -0
  130. package/lib/cjs/src/modules/solana/trusted-name/data/TrustedNameDataSource.js +2 -0
  131. package/lib/cjs/src/modules/solana/trusted-name/data/TrustedNameDataSource.js.map +7 -0
  132. package/lib/cjs/src/modules/solana/trusted-name/di/trustedNameModuleFactory.js +2 -0
  133. package/lib/cjs/src/modules/solana/trusted-name/di/trustedNameModuleFactory.js.map +7 -0
  134. package/lib/cjs/src/modules/solana/trusted-name/di/trustedNameTypes.js +2 -0
  135. package/lib/cjs/src/modules/solana/trusted-name/di/trustedNameTypes.js.map +7 -0
  136. package/lib/cjs/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.js +2 -0
  137. package/lib/cjs/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.js.map +7 -0
  138. package/lib/cjs/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.test.js +2 -0
  139. package/lib/cjs/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.test.js.map +7 -0
  140. package/lib/cjs/src/shared/model/ClearSignContext.js +1 -1
  141. package/lib/cjs/src/shared/model/ClearSignContext.js.map +2 -2
  142. package/lib/cjs/src/shared/utils/HexStringUtils.js +1 -1
  143. package/lib/cjs/src/shared/utils/HexStringUtils.js.map +3 -3
  144. package/lib/cjs/src/shared/utils/HexStringUtils.test.js +1 -1
  145. package/lib/cjs/src/shared/utils/HexStringUtils.test.js.map +2 -2
  146. package/lib/cjs/src/shared/utils/certificateCache.js +2 -0
  147. package/lib/cjs/src/shared/utils/certificateCache.js.map +7 -0
  148. package/lib/cjs/src/shared/utils/certificateCache.test.js +2 -0
  149. package/lib/cjs/src/shared/utils/certificateCache.test.js.map +7 -0
  150. package/lib/cjs/src/shared/utils/certificateResult.js +2 -0
  151. package/lib/cjs/src/shared/utils/certificateResult.js.map +7 -0
  152. package/lib/cjs/src/shared/utils/certificateResult.test.js +2 -0
  153. package/lib/cjs/src/shared/utils/certificateResult.test.js.map +7 -0
  154. package/lib/cjs/src/shared/utils/challengeBoundLoader.js +2 -0
  155. package/lib/cjs/src/shared/utils/challengeBoundLoader.js.map +7 -0
  156. package/lib/cjs/src/shared/utils/challengeBoundLoader.test.js +2 -0
  157. package/lib/cjs/src/shared/utils/challengeBoundLoader.test.js.map +7 -0
  158. package/lib/cjs/src/shared/utils/deviceModelIdCodec.js +2 -0
  159. package/lib/cjs/src/shared/utils/deviceModelIdCodec.js.map +7 -0
  160. package/lib/cjs/src/shared/utils/deviceModelIdCodec.test.js +2 -0
  161. package/lib/cjs/src/shared/utils/deviceModelIdCodec.test.js.map +7 -0
  162. package/lib/cjs/src/shared/utils/signedDescriptorDto.js +2 -0
  163. package/lib/cjs/src/shared/utils/signedDescriptorDto.js.map +7 -0
  164. package/lib/cjs/src/shared/utils/signedDescriptorDto.test.js +2 -0
  165. package/lib/cjs/src/shared/utils/signedDescriptorDto.test.js.map +7 -0
  166. package/lib/cjs/src/shared/utils/uIntCodec.js +2 -0
  167. package/lib/cjs/src/shared/utils/uIntCodec.js.map +7 -0
  168. package/lib/cjs/src/shared/utils/uIntCodec.test.js +2 -0
  169. package/lib/cjs/src/shared/utils/uIntCodec.test.js.map +7 -0
  170. package/lib/esm/package.json +2 -2
  171. package/lib/esm/src/ContextModuleBuilder.js +1 -1
  172. package/lib/esm/src/ContextModuleBuilder.js.map +2 -2
  173. package/lib/esm/src/ContextModuleBuilder.test.js +1 -1
  174. package/lib/esm/src/ContextModuleBuilder.test.js.map +2 -2
  175. package/lib/esm/src/DefaultContextModule.js +1 -1
  176. package/lib/esm/src/DefaultContextModule.js.map +3 -3
  177. package/lib/esm/src/di.js +1 -1
  178. package/lib/esm/src/di.js.map +3 -3
  179. package/lib/esm/src/index.js +1 -1
  180. package/lib/esm/src/index.js.map +2 -2
  181. package/lib/esm/src/modules/ethereum/calldata/data/HttpCalldataDescriptorDataSource.test.js +1 -1
  182. package/lib/esm/src/modules/ethereum/calldata/data/HttpCalldataDescriptorDataSource.test.js.map +2 -2
  183. package/lib/esm/src/modules/ethereum/dynamic-network/data/HttpDynamicNetworkDataSource.test.js +1 -1
  184. package/lib/esm/src/modules/ethereum/dynamic-network/data/HttpDynamicNetworkDataSource.test.js.map +2 -2
  185. package/lib/esm/src/modules/ethereum/dynamic-network/domain/DynamicNetworkContextLoader.test.js +1 -1
  186. package/lib/esm/src/modules/ethereum/dynamic-network/domain/DynamicNetworkContextLoader.test.js.map +2 -2
  187. package/lib/esm/src/modules/ethereum/external-plugin/data/HttpExternalPluginDataSource.test.js +1 -1
  188. package/lib/esm/src/modules/ethereum/external-plugin/data/HttpExternalPluginDataSource.test.js.map +2 -2
  189. package/lib/esm/src/modules/ethereum/gated-signing/data/HttpGatedDescriptorDataSource.test.js +1 -1
  190. package/lib/esm/src/modules/ethereum/gated-signing/data/HttpGatedDescriptorDataSource.test.js.map +2 -2
  191. package/lib/esm/src/modules/ethereum/token/data/HttpTokenDataSource.test.js +1 -1
  192. package/lib/esm/src/modules/ethereum/token/data/HttpTokenDataSource.test.js.map +2 -2
  193. package/lib/esm/src/modules/ethereum/trusted-name/data/HttpTrustedNameDataSource.test.js +1 -1
  194. package/lib/esm/src/modules/ethereum/trusted-name/data/HttpTrustedNameDataSource.test.js.map +2 -2
  195. package/lib/esm/src/modules/ethereum/typed-data/data/HttpTypedDataDataSource.test.js +1 -1
  196. package/lib/esm/src/modules/ethereum/typed-data/data/HttpTypedDataDataSource.test.js.map +2 -2
  197. package/lib/esm/src/modules/multichain/pki/model/KeyId.js +1 -1
  198. package/lib/esm/src/modules/multichain/pki/model/KeyId.js.map +2 -2
  199. package/lib/esm/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.js +1 -1
  200. package/lib/esm/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.js.map +3 -3
  201. package/lib/esm/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.test.js +1 -1
  202. package/lib/esm/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.test.js.map +3 -3
  203. package/lib/esm/src/modules/solana/alt-resolution/data/AltResolutionDataSource.js +1 -0
  204. package/lib/esm/src/modules/solana/alt-resolution/data/AltResolutionDataSource.js.map +7 -0
  205. package/lib/esm/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.js +2 -0
  206. package/lib/esm/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.js.map +7 -0
  207. package/lib/esm/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.test.js +2 -0
  208. package/lib/esm/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.test.js.map +7 -0
  209. package/lib/esm/src/modules/solana/alt-resolution/di/altResolutionModuleFactory.js +2 -0
  210. package/lib/esm/src/modules/solana/alt-resolution/di/altResolutionModuleFactory.js.map +7 -0
  211. package/lib/esm/src/modules/solana/alt-resolution/di/altResolutionTypes.js +2 -0
  212. package/lib/esm/src/modules/solana/alt-resolution/di/altResolutionTypes.js.map +7 -0
  213. package/lib/esm/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.js +2 -0
  214. package/lib/esm/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.js.map +7 -0
  215. package/lib/esm/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.test.js +2 -0
  216. package/lib/esm/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.test.js.map +7 -0
  217. package/lib/esm/src/modules/solana/enum-variant/di/enumVariantModuleFactory.js +2 -0
  218. package/lib/esm/src/modules/solana/enum-variant/di/enumVariantModuleFactory.js.map +7 -0
  219. package/lib/esm/src/modules/solana/enum-variant/di/enumVariantTypes.js +2 -0
  220. package/lib/esm/src/modules/solana/enum-variant/di/enumVariantTypes.js.map +7 -0
  221. package/lib/esm/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.js +2 -0
  222. package/lib/esm/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.js.map +7 -0
  223. package/lib/esm/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.test.js +2 -0
  224. package/lib/esm/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.test.js.map +7 -0
  225. package/lib/esm/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.js +2 -0
  226. package/lib/esm/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.js.map +7 -0
  227. package/lib/esm/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.test.js +2 -0
  228. package/lib/esm/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.test.js.map +7 -0
  229. package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoDataSource.js +1 -0
  230. package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoDataSource.js.map +7 -0
  231. package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoDto.js +2 -0
  232. package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoDto.js.map +7 -0
  233. package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoMapper.js +2 -0
  234. package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoMapper.js.map +7 -0
  235. package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoMapper.test.js +2 -0
  236. package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoMapper.test.js.map +7 -0
  237. package/lib/esm/src/modules/solana/instruction-info/di/instructionInfoModuleFactory.js +2 -0
  238. package/lib/esm/src/modules/solana/instruction-info/di/instructionInfoModuleFactory.js.map +7 -0
  239. package/lib/esm/src/modules/solana/instruction-info/di/instructionInfoTypes.js +2 -0
  240. package/lib/esm/src/modules/solana/instruction-info/di/instructionInfoTypes.js.map +7 -0
  241. package/lib/esm/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.js +2 -0
  242. package/lib/esm/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.js.map +7 -0
  243. package/lib/esm/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.test.js +2 -0
  244. package/lib/esm/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.test.js.map +7 -0
  245. package/lib/esm/src/modules/solana/lifi/data/HttpLifiDataSource.test.js +1 -1
  246. package/lib/esm/src/modules/solana/lifi/data/HttpLifiDataSource.test.js.map +2 -2
  247. package/lib/esm/src/modules/solana/lifi/domain/LifiContextLoader.test.js +1 -1
  248. package/lib/esm/src/modules/solana/lifi/domain/LifiContextLoader.test.js.map +2 -2
  249. package/lib/esm/src/modules/solana/model/SolanaClearSignContext.js +1 -1
  250. package/lib/esm/src/modules/solana/model/SolanaClearSignContext.js.map +3 -3
  251. package/lib/esm/src/modules/solana/model/SolanaPayloads.js +1 -0
  252. package/lib/esm/src/modules/solana/model/SolanaPayloads.js.map +4 -4
  253. package/lib/esm/src/modules/solana/model/SolanaTransactionScanChainId.js +1 -1
  254. package/lib/esm/src/modules/solana/model/SolanaTransactionScanChainId.js.map +2 -2
  255. package/lib/esm/src/modules/solana/owner-info/domain/OwnerInfoContextLoader.js +1 -1
  256. package/lib/esm/src/modules/solana/owner-info/domain/OwnerInfoContextLoader.js.map +2 -2
  257. package/lib/esm/src/modules/solana/owner-info/domain/OwnerInfoContextLoader.test.js +1 -1
  258. package/lib/esm/src/modules/solana/owner-info/domain/OwnerInfoContextLoader.test.js.map +2 -2
  259. package/lib/esm/src/modules/solana/token/data/HttpTokenDataSource.test.js +2 -2
  260. package/lib/esm/src/modules/solana/token/data/HttpTokenDataSource.test.js.map +2 -2
  261. package/lib/esm/src/modules/solana/token/domain/TokenContextLoader.js +1 -1
  262. package/lib/esm/src/modules/solana/token/domain/TokenContextLoader.js.map +3 -3
  263. package/lib/esm/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.js +2 -0
  264. package/lib/esm/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.js.map +7 -0
  265. package/lib/esm/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.test.js +2 -0
  266. package/lib/esm/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.test.js.map +7 -0
  267. package/lib/esm/src/modules/solana/token-account-state/data/TokenAccountStateDataSource.js +1 -0
  268. package/lib/esm/src/modules/solana/token-account-state/data/TokenAccountStateDataSource.js.map +7 -0
  269. package/lib/esm/src/modules/solana/token-account-state/di/tokenAccountStateModuleFactory.js +2 -0
  270. package/lib/esm/src/modules/solana/token-account-state/di/tokenAccountStateModuleFactory.js.map +7 -0
  271. package/lib/esm/src/modules/solana/token-account-state/di/tokenAccountStateTypes.js +2 -0
  272. package/lib/esm/src/modules/solana/token-account-state/di/tokenAccountStateTypes.js.map +7 -0
  273. package/lib/esm/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.js +2 -0
  274. package/lib/esm/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.js.map +7 -0
  275. package/lib/esm/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.test.js +2 -0
  276. package/lib/esm/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.test.js.map +7 -0
  277. package/lib/esm/src/modules/solana/token-info/data/HttpTokenInfoDataSource.js +2 -0
  278. package/lib/esm/src/modules/solana/token-info/data/HttpTokenInfoDataSource.js.map +7 -0
  279. package/lib/esm/src/modules/solana/token-info/data/HttpTokenInfoDataSource.test.js +2 -0
  280. package/lib/esm/src/modules/solana/token-info/data/HttpTokenInfoDataSource.test.js.map +7 -0
  281. package/lib/esm/src/modules/solana/token-info/data/TokenInfoDataSource.js +1 -0
  282. package/lib/esm/src/modules/solana/token-info/data/TokenInfoDataSource.js.map +7 -0
  283. package/lib/esm/src/modules/solana/token-info/di/tokenInfoModuleFactory.js +2 -0
  284. package/lib/esm/src/modules/solana/token-info/di/tokenInfoModuleFactory.js.map +7 -0
  285. package/lib/esm/src/modules/solana/token-info/di/tokenInfoTypes.js +2 -0
  286. package/lib/esm/src/modules/solana/token-info/di/tokenInfoTypes.js.map +7 -0
  287. package/lib/esm/src/modules/solana/token-info/domain/TokenInfoContextLoader.js +2 -0
  288. package/lib/esm/src/modules/solana/token-info/domain/TokenInfoContextLoader.js.map +7 -0
  289. package/lib/esm/src/modules/solana/token-info/domain/TokenInfoContextLoader.test.js +2 -0
  290. package/lib/esm/src/modules/solana/token-info/domain/TokenInfoContextLoader.test.js.map +7 -0
  291. package/lib/esm/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.js +2 -0
  292. package/lib/esm/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.js.map +7 -0
  293. package/lib/esm/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.test.js +2 -0
  294. package/lib/esm/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.test.js.map +7 -0
  295. package/lib/esm/src/modules/solana/trusted-name/data/TrustedNameDataSource.js +1 -0
  296. package/lib/esm/src/modules/solana/trusted-name/data/TrustedNameDataSource.js.map +7 -0
  297. package/lib/esm/src/modules/solana/trusted-name/di/trustedNameModuleFactory.js +2 -0
  298. package/lib/esm/src/modules/solana/trusted-name/di/trustedNameModuleFactory.js.map +7 -0
  299. package/lib/esm/src/modules/solana/trusted-name/di/trustedNameTypes.js +2 -0
  300. package/lib/esm/src/modules/solana/trusted-name/di/trustedNameTypes.js.map +7 -0
  301. package/lib/esm/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.js +2 -0
  302. package/lib/esm/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.js.map +7 -0
  303. package/lib/esm/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.test.js +2 -0
  304. package/lib/esm/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.test.js.map +7 -0
  305. package/lib/esm/src/shared/model/ClearSignContext.js +1 -1
  306. package/lib/esm/src/shared/model/ClearSignContext.js.map +2 -2
  307. package/lib/esm/src/shared/utils/HexStringUtils.js +1 -1
  308. package/lib/esm/src/shared/utils/HexStringUtils.js.map +3 -3
  309. package/lib/esm/src/shared/utils/HexStringUtils.test.js +1 -1
  310. package/lib/esm/src/shared/utils/HexStringUtils.test.js.map +2 -2
  311. package/lib/esm/src/shared/utils/certificateCache.js +2 -0
  312. package/lib/esm/src/shared/utils/certificateCache.js.map +7 -0
  313. package/lib/esm/src/shared/utils/certificateCache.test.js +2 -0
  314. package/lib/esm/src/shared/utils/certificateCache.test.js.map +7 -0
  315. package/lib/esm/src/shared/utils/certificateResult.js +2 -0
  316. package/lib/esm/src/shared/utils/certificateResult.js.map +7 -0
  317. package/lib/esm/src/shared/utils/certificateResult.test.js +2 -0
  318. package/lib/esm/src/shared/utils/certificateResult.test.js.map +7 -0
  319. package/lib/esm/src/shared/utils/challengeBoundLoader.js +2 -0
  320. package/lib/esm/src/shared/utils/challengeBoundLoader.js.map +7 -0
  321. package/lib/esm/src/shared/utils/challengeBoundLoader.test.js +2 -0
  322. package/lib/esm/src/shared/utils/challengeBoundLoader.test.js.map +7 -0
  323. package/lib/esm/src/shared/utils/deviceModelIdCodec.js +2 -0
  324. package/lib/esm/src/shared/utils/deviceModelIdCodec.js.map +7 -0
  325. package/lib/esm/src/shared/utils/deviceModelIdCodec.test.js +2 -0
  326. package/lib/esm/src/shared/utils/deviceModelIdCodec.test.js.map +7 -0
  327. package/lib/esm/src/shared/utils/signedDescriptorDto.js +2 -0
  328. package/lib/esm/src/shared/utils/signedDescriptorDto.js.map +7 -0
  329. package/lib/esm/src/shared/utils/signedDescriptorDto.test.js +2 -0
  330. package/lib/esm/src/shared/utils/signedDescriptorDto.test.js.map +7 -0
  331. package/lib/esm/src/shared/utils/uIntCodec.js +2 -0
  332. package/lib/esm/src/shared/utils/uIntCodec.js.map +7 -0
  333. package/lib/esm/src/shared/utils/uIntCodec.test.js +2 -0
  334. package/lib/esm/src/shared/utils/uIntCodec.test.js.map +7 -0
  335. package/lib/types/src/ContextModuleBuilder.d.ts.map +1 -1
  336. package/lib/types/src/DefaultContextModule.d.ts.map +1 -1
  337. package/lib/types/src/di.d.ts.map +1 -1
  338. package/lib/types/src/index.d.ts +16 -0
  339. package/lib/types/src/index.d.ts.map +1 -1
  340. package/lib/types/src/modules/multichain/pki/model/KeyId.d.ts +1 -0
  341. package/lib/types/src/modules/multichain/pki/model/KeyId.d.ts.map +1 -1
  342. package/lib/types/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.d.ts +1 -1
  343. package/lib/types/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.d.ts.map +1 -1
  344. package/lib/types/src/modules/solana/alt-resolution/data/AltResolutionDataSource.d.ts +17 -0
  345. package/lib/types/src/modules/solana/alt-resolution/data/AltResolutionDataSource.d.ts.map +1 -0
  346. package/lib/types/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.d.ts +11 -0
  347. package/lib/types/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.d.ts.map +1 -0
  348. package/lib/types/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.test.d.ts +2 -0
  349. package/lib/types/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.test.d.ts.map +1 -0
  350. package/lib/types/src/modules/solana/alt-resolution/di/altResolutionModuleFactory.d.ts +3 -0
  351. package/lib/types/src/modules/solana/alt-resolution/di/altResolutionModuleFactory.d.ts.map +1 -0
  352. package/lib/types/src/modules/solana/alt-resolution/di/altResolutionTypes.d.ts +5 -0
  353. package/lib/types/src/modules/solana/alt-resolution/di/altResolutionTypes.d.ts.map +1 -0
  354. package/lib/types/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.d.ts +23 -0
  355. package/lib/types/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.d.ts.map +1 -0
  356. package/lib/types/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.test.d.ts +2 -0
  357. package/lib/types/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.test.d.ts.map +1 -0
  358. package/lib/types/src/modules/solana/enum-variant/di/enumVariantModuleFactory.d.ts +3 -0
  359. package/lib/types/src/modules/solana/enum-variant/di/enumVariantModuleFactory.d.ts.map +1 -0
  360. package/lib/types/src/modules/solana/enum-variant/di/enumVariantTypes.d.ts +4 -0
  361. package/lib/types/src/modules/solana/enum-variant/di/enumVariantTypes.d.ts.map +1 -0
  362. package/lib/types/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.d.ts +45 -0
  363. package/lib/types/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.d.ts.map +1 -0
  364. package/lib/types/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.test.d.ts +2 -0
  365. package/lib/types/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.test.d.ts.map +1 -0
  366. package/lib/types/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.d.ts +11 -0
  367. package/lib/types/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.d.ts.map +1 -0
  368. package/lib/types/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.test.d.ts +2 -0
  369. package/lib/types/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.test.d.ts.map +1 -0
  370. package/lib/types/src/modules/solana/instruction-info/data/InstructionInfoDataSource.d.ts +32 -0
  371. package/lib/types/src/modules/solana/instruction-info/data/InstructionInfoDataSource.d.ts.map +1 -0
  372. package/lib/types/src/modules/solana/instruction-info/data/InstructionInfoDto.d.ts +129 -0
  373. package/lib/types/src/modules/solana/instruction-info/data/InstructionInfoDto.d.ts.map +1 -0
  374. package/lib/types/src/modules/solana/instruction-info/data/InstructionInfoMapper.d.ts +26 -0
  375. package/lib/types/src/modules/solana/instruction-info/data/InstructionInfoMapper.d.ts.map +1 -0
  376. package/lib/types/src/modules/solana/instruction-info/data/InstructionInfoMapper.test.d.ts +2 -0
  377. package/lib/types/src/modules/solana/instruction-info/data/InstructionInfoMapper.test.d.ts.map +1 -0
  378. package/lib/types/src/modules/solana/instruction-info/di/instructionInfoModuleFactory.d.ts +3 -0
  379. package/lib/types/src/modules/solana/instruction-info/di/instructionInfoModuleFactory.d.ts.map +1 -0
  380. package/lib/types/src/modules/solana/instruction-info/di/instructionInfoTypes.d.ts +5 -0
  381. package/lib/types/src/modules/solana/instruction-info/di/instructionInfoTypes.d.ts.map +1 -0
  382. package/lib/types/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.d.ts +39 -0
  383. package/lib/types/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.d.ts.map +1 -0
  384. package/lib/types/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.test.d.ts +2 -0
  385. package/lib/types/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.test.d.ts.map +1 -0
  386. package/lib/types/src/modules/solana/model/SolanaClearSignContext.d.ts +33 -2
  387. package/lib/types/src/modules/solana/model/SolanaClearSignContext.d.ts.map +1 -1
  388. package/lib/types/src/modules/solana/model/SolanaContextTypes.d.ts +8 -1
  389. package/lib/types/src/modules/solana/model/SolanaContextTypes.d.ts.map +1 -1
  390. package/lib/types/src/modules/solana/model/SolanaPayloads.d.ts +124 -0
  391. package/lib/types/src/modules/solana/model/SolanaPayloads.d.ts.map +1 -1
  392. package/lib/types/src/modules/solana/model/SolanaTransactionScanChainId.d.ts +6 -5
  393. package/lib/types/src/modules/solana/model/SolanaTransactionScanChainId.d.ts.map +1 -1
  394. package/lib/types/src/modules/solana/owner-info/domain/solanaContextTypes.d.ts +2 -5
  395. package/lib/types/src/modules/solana/owner-info/domain/solanaContextTypes.d.ts.map +1 -1
  396. package/lib/types/src/modules/solana/token/domain/TokenContextLoader.d.ts.map +1 -1
  397. package/lib/types/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.d.ts +11 -0
  398. package/lib/types/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.d.ts.map +1 -0
  399. package/lib/types/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.test.d.ts +2 -0
  400. package/lib/types/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.test.d.ts.map +1 -0
  401. package/lib/types/src/modules/solana/token-account-state/data/TokenAccountStateDataSource.d.ts +15 -0
  402. package/lib/types/src/modules/solana/token-account-state/data/TokenAccountStateDataSource.d.ts.map +1 -0
  403. package/lib/types/src/modules/solana/token-account-state/di/tokenAccountStateModuleFactory.d.ts +3 -0
  404. package/lib/types/src/modules/solana/token-account-state/di/tokenAccountStateModuleFactory.d.ts.map +1 -0
  405. package/lib/types/src/modules/solana/token-account-state/di/tokenAccountStateTypes.d.ts +5 -0
  406. package/lib/types/src/modules/solana/token-account-state/di/tokenAccountStateTypes.d.ts.map +1 -0
  407. package/lib/types/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.d.ts +26 -0
  408. package/lib/types/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.d.ts.map +1 -0
  409. package/lib/types/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.test.d.ts +2 -0
  410. package/lib/types/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.test.d.ts.map +1 -0
  411. package/lib/types/src/modules/solana/token-info/data/HttpTokenInfoDataSource.d.ts +11 -0
  412. package/lib/types/src/modules/solana/token-info/data/HttpTokenInfoDataSource.d.ts.map +1 -0
  413. package/lib/types/src/modules/solana/token-info/data/HttpTokenInfoDataSource.test.d.ts +2 -0
  414. package/lib/types/src/modules/solana/token-info/data/HttpTokenInfoDataSource.test.d.ts.map +1 -0
  415. package/lib/types/src/modules/solana/token-info/data/TokenInfoDataSource.d.ts +24 -0
  416. package/lib/types/src/modules/solana/token-info/data/TokenInfoDataSource.d.ts.map +1 -0
  417. package/lib/types/src/modules/solana/token-info/di/tokenInfoModuleFactory.d.ts +3 -0
  418. package/lib/types/src/modules/solana/token-info/di/tokenInfoModuleFactory.d.ts.map +1 -0
  419. package/lib/types/src/modules/solana/token-info/di/tokenInfoTypes.d.ts +5 -0
  420. package/lib/types/src/modules/solana/token-info/di/tokenInfoTypes.d.ts.map +1 -0
  421. package/lib/types/src/modules/solana/token-info/domain/TokenInfoContextLoader.d.ts +26 -0
  422. package/lib/types/src/modules/solana/token-info/domain/TokenInfoContextLoader.d.ts.map +1 -0
  423. package/lib/types/src/modules/solana/token-info/domain/TokenInfoContextLoader.test.d.ts +2 -0
  424. package/lib/types/src/modules/solana/token-info/domain/TokenInfoContextLoader.test.d.ts.map +1 -0
  425. package/lib/types/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.d.ts +11 -0
  426. package/lib/types/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.d.ts.map +1 -0
  427. package/lib/types/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.test.d.ts +2 -0
  428. package/lib/types/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.test.d.ts.map +1 -0
  429. package/lib/types/src/modules/solana/trusted-name/data/TrustedNameDataSource.d.ts +17 -0
  430. package/lib/types/src/modules/solana/trusted-name/data/TrustedNameDataSource.d.ts.map +1 -0
  431. package/lib/types/src/modules/solana/trusted-name/di/trustedNameModuleFactory.d.ts +3 -0
  432. package/lib/types/src/modules/solana/trusted-name/di/trustedNameModuleFactory.d.ts.map +1 -0
  433. package/lib/types/src/modules/solana/trusted-name/di/trustedNameTypes.d.ts +5 -0
  434. package/lib/types/src/modules/solana/trusted-name/di/trustedNameTypes.d.ts.map +1 -0
  435. package/lib/types/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.d.ts +28 -0
  436. package/lib/types/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.d.ts.map +1 -0
  437. package/lib/types/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.test.d.ts +2 -0
  438. package/lib/types/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.test.d.ts.map +1 -0
  439. package/lib/types/src/shared/model/ClearSignContext.d.ts +7 -1
  440. package/lib/types/src/shared/model/ClearSignContext.d.ts.map +1 -1
  441. package/lib/types/src/shared/utils/HexStringUtils.d.ts +7 -0
  442. package/lib/types/src/shared/utils/HexStringUtils.d.ts.map +1 -1
  443. package/lib/types/src/shared/utils/certificateCache.d.ts +23 -0
  444. package/lib/types/src/shared/utils/certificateCache.d.ts.map +1 -0
  445. package/lib/types/src/shared/utils/certificateCache.test.d.ts +2 -0
  446. package/lib/types/src/shared/utils/certificateCache.test.d.ts.map +1 -0
  447. package/lib/types/src/shared/utils/certificateResult.d.ts +26 -0
  448. package/lib/types/src/shared/utils/certificateResult.d.ts.map +1 -0
  449. package/lib/types/src/shared/utils/certificateResult.test.d.ts +2 -0
  450. package/lib/types/src/shared/utils/certificateResult.test.d.ts.map +1 -0
  451. package/lib/types/src/shared/utils/challengeBoundLoader.d.ts +43 -0
  452. package/lib/types/src/shared/utils/challengeBoundLoader.d.ts.map +1 -0
  453. package/lib/types/src/shared/utils/challengeBoundLoader.test.d.ts +2 -0
  454. package/lib/types/src/shared/utils/challengeBoundLoader.test.d.ts.map +1 -0
  455. package/lib/types/src/shared/utils/deviceModelIdCodec.d.ts +7 -0
  456. package/lib/types/src/shared/utils/deviceModelIdCodec.d.ts.map +1 -0
  457. package/lib/types/src/shared/utils/deviceModelIdCodec.test.d.ts +2 -0
  458. package/lib/types/src/shared/utils/deviceModelIdCodec.test.d.ts.map +1 -0
  459. package/lib/types/src/shared/utils/signedDescriptorDto.d.ts +15 -0
  460. package/lib/types/src/shared/utils/signedDescriptorDto.d.ts.map +1 -0
  461. package/lib/types/src/shared/utils/signedDescriptorDto.test.d.ts +2 -0
  462. package/lib/types/src/shared/utils/signedDescriptorDto.test.d.ts.map +1 -0
  463. package/lib/types/src/shared/utils/uIntCodec.d.ts +20 -0
  464. package/lib/types/src/shared/utils/uIntCodec.d.ts.map +1 -0
  465. package/lib/types/src/shared/utils/uIntCodec.test.d.ts +2 -0
  466. package/lib/types/src/shared/utils/uIntCodec.test.d.ts.map +1 -0
  467. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  468. package/package.json +6 -6
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.ts"],
4
- "sourcesContent": ["import {\n DeviceModelId,\n LoggerPublisherService,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { Codec, exactly, number, oneOf, string } from \"purify-ts\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { pkiTypes } from \"@/modules/multichain/pki/di/pkiTypes\";\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport { KeyUsage } from \"@/modules/multichain/pki/model/KeyUsage\";\nimport { type TransactionCheckDataSource } from \"@/modules/multichain/transaction-check/data/TransactionCheckDataSource\";\nimport { transactionCheckTypes } from \"@/modules/multichain/transaction-check/di/transactionCheckTypes\";\nimport { type TransactionCheckLoader } from \"@/modules/multichain/transaction-check/loaders/TransactionCheckLoader\";\nimport { TransactionCheckPaths } from \"@/modules/multichain/transaction-check/utils/constants\";\nimport {\n ClearSignContext,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\nimport {\n type Bs58Encoder,\n DefaultBs58Encoder,\n} from \"@/shared/utils/bs58Encoder\";\nimport { uint8ArrayCodec } from \"@/shared/utils/uint8ArrayCodec\";\n\nexport type SolanaTransactionCheckRequest = {\n from: string;\n transactionBytes: Uint8Array;\n chain: number;\n};\n\nexport type SolanaTransactionCheckContextInput = {\n deviceModelId: DeviceModelId;\n transactionCheck: SolanaTransactionCheckRequest;\n};\n\nconst SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.SOLANA_TRANSACTION_CHECK,\n];\n\nconst SOLANA_SIGNATURE_LENGTH = 64;\nconst SOLANA_MAX_SIGNATURES = 64;\nconst VERSIONED_MESSAGE_PREFIX_MASK = 0x80;\nconst SHORTVEC_CONTINUATION_BIT = 0x80;\nconst SHORTVEC_DATA_MASK = 0x7f;\nconst SHORTVEC_DATA_BITS = 7;\n\nconst solanaTransactionCheckInputCodec = Codec.interface({\n deviceModelId: oneOf([\n exactly(DeviceModelId.NANO_X),\n exactly(DeviceModelId.NANO_SP),\n exactly(DeviceModelId.STAX),\n exactly(DeviceModelId.FLEX),\n ]),\n transactionCheck: Codec.interface({\n from: string,\n transactionBytes: uint8ArrayCodec,\n chain: number,\n }),\n});\n\n@injectable()\nexport class SolanaTransactionCheckLoader\n implements TransactionCheckLoader<SolanaTransactionCheckContextInput>\n{\n private readonly logger: LoggerPublisherService;\n\n constructor(\n @inject(transactionCheckTypes.TransactionCheckDataSource)\n private readonly transactionCheckDataSource: TransactionCheckDataSource,\n @inject(pkiTypes.PkiCertificateLoader)\n private readonly certificateLoader: PkiCertificateLoader,\n @inject(configTypes.ContextModuleLoggerFactory)\n loggerFactory: (tag: string) => LoggerPublisherService,\n private readonly bs58Encoder: Bs58Encoder = DefaultBs58Encoder,\n ) {\n this.logger = loggerFactory(\"SolanaTransactionCheckLoader\");\n }\n\n canHandle(\n input: unknown,\n expectedType: ClearSignContextType[],\n ): input is SolanaTransactionCheckContextInput {\n if (!SUPPORTED_TYPES.every((type) => expectedType.includes(type)))\n return false;\n return solanaTransactionCheckInputCodec.decode(input).caseOf({\n Left: () => false,\n Right: ({ transactionCheck: { from, transactionBytes } }) =>\n from.length > 0 && transactionBytes.length > 0,\n });\n }\n\n async load(\n ctx: SolanaTransactionCheckContextInput,\n ): Promise<ClearSignContext[]> {\n const { from, transactionBytes, chain } = ctx.transactionCheck;\n\n let rawTx: string;\n try {\n rawTx = this.bs58Encoder.encode(\n this.wrapMessageAsTransaction(transactionBytes),\n );\n } catch (error) {\n const result: ClearSignContext[] = [\n {\n type: ClearSignContextType.ERROR,\n error: error instanceof Error ? error : new Error(String(error)),\n },\n ];\n this.logger.debug(\"load result\", { data: { result } });\n return result;\n }\n\n const txCheck = await this.transactionCheckDataSource.check({\n path: TransactionCheckPaths.SOLANA_TRANSACTION,\n body: { tx: { from, raw: rawTx }, chain },\n });\n\n const context = await txCheck.caseOf<Promise<ClearSignContext>>({\n Left: (error) =>\n Promise.resolve({\n type: ClearSignContextType.ERROR,\n error,\n }),\n Right: async (data) => {\n const certificate = await this.certificateLoader.loadCertificate({\n keyId: data.publicKeyId,\n keyUsage: KeyUsage.TxSimulationSigner,\n targetDevice: ctx.deviceModelId,\n });\n\n return {\n type: ClearSignContextType.SOLANA_TRANSACTION_CHECK,\n payload: { descriptor: data.descriptor },\n certificate,\n };\n },\n });\n\n const result = [context];\n this.logger.debug(\"load result\", { data: { result } });\n return result;\n }\n\n /**\n * Wrap a serialized Solana Message into a serialized Transaction expected\n * by the web3checks endpoint, by prepending a compact-u16 signature count\n * and the matching number of zero-filled signature placeholders.\n *\n * Supports legacy and versioned messages: versioned messages start with a\n * version prefix byte (high bit set), shifting `numRequiredSignatures` by\n * one position.\n */\n private wrapMessageAsTransaction(message: Uint8Array): Uint8Array {\n const numRequiredSignatures = this.readNumRequiredSignatures(message);\n const sigCount = this.encodeShortVec(numRequiredSignatures);\n const placeholdersLength = numRequiredSignatures * SOLANA_SIGNATURE_LENGTH;\n\n const wrapped = new Uint8Array(\n sigCount.length + placeholdersLength + message.length,\n );\n wrapped.set(sigCount, 0);\n wrapped.set(message, sigCount.length + placeholdersLength);\n return wrapped;\n }\n\n private readNumRequiredSignatures(message: Uint8Array): number {\n const firstByte = message[0];\n if (firstByte === undefined) {\n throw new Error(\n \"[ContextModule] SolanaTransactionCheckLoader: empty transaction bytes\",\n );\n }\n const isVersioned = (firstByte & VERSIONED_MESSAGE_PREFIX_MASK) !== 0;\n const headerOffset = isVersioned ? 1 : 0;\n const numRequiredSignatures = message[headerOffset];\n if (numRequiredSignatures === undefined) {\n throw new Error(\n \"[ContextModule] SolanaTransactionCheckLoader: malformed message header\",\n );\n }\n if (numRequiredSignatures > SOLANA_MAX_SIGNATURES) {\n throw new Error(\n `[ContextModule] SolanaTransactionCheckLoader: numRequiredSignatures (${numRequiredSignatures}) exceeds SOLANA_MAX_SIGNATURES (${SOLANA_MAX_SIGNATURES})`,\n );\n }\n return numRequiredSignatures;\n }\n\n private encodeShortVec(value: number): Uint8Array {\n const bytes: number[] = [];\n let remaining = value;\n while (true) {\n const lowBits = remaining & SHORTVEC_DATA_MASK;\n remaining >>>= SHORTVEC_DATA_BITS;\n if (remaining === 0) {\n bytes.push(lowBits);\n break;\n }\n bytes.push(lowBits | SHORTVEC_CONTINUATION_BIT);\n }\n return Uint8Array.from(bytes);\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["SolanaTransactionCheckLoader_exports", "__export", "SolanaTransactionCheckLoader", "__toCommonJS", "import_device_management_kit", "import_inversify", "import_purify_ts", "import_configTypes", "import_pkiTypes", "import_KeyUsage", "import_transactionCheckTypes", "import_constants", "import_ClearSignContext", "import_bs58Encoder", "import_uint8ArrayCodec", "SUPPORTED_TYPES", "SOLANA_SIGNATURE_LENGTH", "SOLANA_MAX_SIGNATURES", "VERSIONED_MESSAGE_PREFIX_MASK", "SHORTVEC_CONTINUATION_BIT", "SHORTVEC_DATA_MASK", "SHORTVEC_DATA_BITS", "solanaTransactionCheckInputCodec", "SolanaTransactionCheckLoader", "transactionCheckDataSource", "certificateLoader", "loggerFactory", "bs58Encoder", "input", "expectedType", "type", "from", "transactionBytes", "ctx", "chain", "rawTx", "error", "result", "data", "certificate", "message", "numRequiredSignatures", "sigCount", "placeholdersLength", "wrapped", "firstByte", "headerOffset", "value", "bytes", "remaining", "lowBits", "__decorateClass", "__decorateParam"]
4
+ "sourcesContent": ["import {\n type DeviceModelId,\n LoggerPublisherService,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { Codec, number, string } from \"purify-ts\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { pkiTypes } from \"@/modules/multichain/pki/di/pkiTypes\";\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport { KeyUsage } from \"@/modules/multichain/pki/model/KeyUsage\";\nimport { type TransactionCheckDataSource } from \"@/modules/multichain/transaction-check/data/TransactionCheckDataSource\";\nimport { transactionCheckTypes } from \"@/modules/multichain/transaction-check/di/transactionCheckTypes\";\nimport { type TransactionCheckLoader } from \"@/modules/multichain/transaction-check/loaders/TransactionCheckLoader\";\nimport { TransactionCheckPaths } from \"@/modules/multichain/transaction-check/utils/constants\";\nimport {\n ClearSignContext,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\nimport {\n type Bs58Encoder,\n DefaultBs58Encoder,\n} from \"@/shared/utils/bs58Encoder\";\nimport { deviceModelIdCodec } from \"@/shared/utils/deviceModelIdCodec\";\nimport { uint8ArrayCodec } from \"@/shared/utils/uint8ArrayCodec\";\n\nexport type SolanaTransactionCheckRequest = {\n from: string;\n transactionBytes: Uint8Array;\n chain: number;\n};\n\nexport type SolanaTransactionCheckContextInput = {\n deviceModelId: DeviceModelId;\n transactionCheck: SolanaTransactionCheckRequest;\n};\n\nconst SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.SOLANA_TRANSACTION_CHECK,\n];\n\nconst SOLANA_SIGNATURE_LENGTH = 64;\nconst SOLANA_MAX_SIGNATURES = 64;\nconst VERSIONED_MESSAGE_PREFIX_MASK = 0x80;\nconst SHORTVEC_CONTINUATION_BIT = 0x80;\nconst SHORTVEC_DATA_MASK = 0x7f;\nconst SHORTVEC_DATA_BITS = 7;\n\nconst solanaTransactionCheckInputCodec = Codec.interface({\n deviceModelId: deviceModelIdCodec,\n transactionCheck: Codec.interface({\n from: string,\n transactionBytes: uint8ArrayCodec,\n chain: number,\n }),\n});\n\n@injectable()\nexport class SolanaTransactionCheckLoader\n implements TransactionCheckLoader<SolanaTransactionCheckContextInput>\n{\n private readonly logger: LoggerPublisherService;\n\n constructor(\n @inject(transactionCheckTypes.TransactionCheckDataSource)\n private readonly transactionCheckDataSource: TransactionCheckDataSource,\n @inject(pkiTypes.PkiCertificateLoader)\n private readonly certificateLoader: PkiCertificateLoader,\n @inject(configTypes.ContextModuleLoggerFactory)\n loggerFactory: (tag: string) => LoggerPublisherService,\n private readonly bs58Encoder: Bs58Encoder = DefaultBs58Encoder,\n ) {\n this.logger = loggerFactory(\"SolanaTransactionCheckLoader\");\n }\n\n canHandle(\n input: unknown,\n expectedType: ClearSignContextType[],\n ): input is SolanaTransactionCheckContextInput {\n if (!SUPPORTED_TYPES.every((type) => expectedType.includes(type)))\n return false;\n return solanaTransactionCheckInputCodec.decode(input).caseOf({\n Left: () => false,\n Right: ({ transactionCheck: { from, transactionBytes } }) =>\n from.length > 0 && transactionBytes.length > 0,\n });\n }\n\n async load(\n ctx: SolanaTransactionCheckContextInput,\n ): Promise<ClearSignContext[]> {\n const { from, transactionBytes, chain } = ctx.transactionCheck;\n\n let rawTx: string;\n try {\n rawTx = this.bs58Encoder.encode(\n this.wrapMessageAsTransaction(transactionBytes),\n );\n } catch (error) {\n const result: ClearSignContext[] = [\n {\n type: ClearSignContextType.ERROR,\n error: error instanceof Error ? error : new Error(String(error)),\n },\n ];\n this.logger.debug(\"load result\", { data: { result } });\n return result;\n }\n\n const txCheck = await this.transactionCheckDataSource.check({\n path: TransactionCheckPaths.SOLANA_TRANSACTION,\n body: { tx: { from, raw: rawTx }, chain },\n });\n\n const context = await txCheck.caseOf<Promise<ClearSignContext>>({\n Left: (error) =>\n Promise.resolve({\n type: ClearSignContextType.ERROR,\n error,\n }),\n Right: async (data) => {\n const certificate = await this.certificateLoader.loadCertificate({\n keyId: data.publicKeyId,\n keyUsage: KeyUsage.TxSimulationSigner,\n targetDevice: ctx.deviceModelId,\n });\n\n return {\n type: ClearSignContextType.SOLANA_TRANSACTION_CHECK,\n payload: { descriptor: data.descriptor },\n certificate,\n };\n },\n });\n\n const result = [context];\n this.logger.debug(\"load result\", { data: { result } });\n return result;\n }\n\n /**\n * Wrap a serialized Solana Message into a serialized Transaction expected\n * by the web3checks endpoint, by prepending a compact-u16 signature count\n * and the matching number of zero-filled signature placeholders.\n *\n * Supports legacy and versioned messages: versioned messages start with a\n * version prefix byte (high bit set), shifting `numRequiredSignatures` by\n * one position.\n */\n private wrapMessageAsTransaction(message: Uint8Array): Uint8Array {\n const numRequiredSignatures = this.readNumRequiredSignatures(message);\n const sigCount = this.encodeShortVec(numRequiredSignatures);\n const placeholdersLength = numRequiredSignatures * SOLANA_SIGNATURE_LENGTH;\n\n const wrapped = new Uint8Array(\n sigCount.length + placeholdersLength + message.length,\n );\n wrapped.set(sigCount, 0);\n wrapped.set(message, sigCount.length + placeholdersLength);\n return wrapped;\n }\n\n private readNumRequiredSignatures(message: Uint8Array): number {\n const firstByte = message[0];\n if (firstByte === undefined) {\n throw new Error(\n \"[ContextModule] SolanaTransactionCheckLoader: empty transaction bytes\",\n );\n }\n const isVersioned = (firstByte & VERSIONED_MESSAGE_PREFIX_MASK) !== 0;\n const headerOffset = isVersioned ? 1 : 0;\n const numRequiredSignatures = message[headerOffset];\n if (numRequiredSignatures === undefined) {\n throw new Error(\n \"[ContextModule] SolanaTransactionCheckLoader: malformed message header\",\n );\n }\n if (numRequiredSignatures > SOLANA_MAX_SIGNATURES) {\n throw new Error(\n `[ContextModule] SolanaTransactionCheckLoader: numRequiredSignatures (${numRequiredSignatures}) exceeds SOLANA_MAX_SIGNATURES (${SOLANA_MAX_SIGNATURES})`,\n );\n }\n return numRequiredSignatures;\n }\n\n private encodeShortVec(value: number): Uint8Array {\n const bytes: number[] = [];\n let remaining = value;\n while (true) {\n const lowBits = remaining & SHORTVEC_DATA_MASK;\n remaining >>>= SHORTVEC_DATA_BITS;\n if (remaining === 0) {\n bytes.push(lowBits);\n break;\n }\n bytes.push(lowBits | SHORTVEC_CONTINUATION_BIT);\n }\n return Uint8Array.from(bytes);\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["SolanaTransactionCheckLoader_exports", "__export", "SolanaTransactionCheckLoader", "__toCommonJS", "import_inversify", "import_purify_ts", "import_configTypes", "import_pkiTypes", "import_KeyUsage", "import_transactionCheckTypes", "import_constants", "import_ClearSignContext", "import_bs58Encoder", "import_deviceModelIdCodec", "import_uint8ArrayCodec", "SUPPORTED_TYPES", "SOLANA_SIGNATURE_LENGTH", "SOLANA_MAX_SIGNATURES", "VERSIONED_MESSAGE_PREFIX_MASK", "SHORTVEC_CONTINUATION_BIT", "SHORTVEC_DATA_MASK", "SHORTVEC_DATA_BITS", "solanaTransactionCheckInputCodec", "SolanaTransactionCheckLoader", "transactionCheckDataSource", "certificateLoader", "loggerFactory", "bs58Encoder", "input", "expectedType", "type", "from", "transactionBytes", "ctx", "chain", "rawTx", "error", "result", "data", "certificate", "message", "numRequiredSignatures", "sigCount", "placeholdersLength", "wrapped", "firstByte", "headerOffset", "value", "bytes", "remaining", "lowBits", "__decorateClass", "__decorateParam"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var u=Object.create;var f=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var C=Object.getOwnPropertyNames;var x=Object.getPrototypeOf,k=Object.prototype.hasOwnProperty;var N=(e,a,r,A)=>{if(a&&typeof a=="object"||typeof a=="function")for(let s of C(a))!k.call(e,s)&&s!==r&&f(e,s,{get:()=>a[s],enumerable:!(A=m(a,s))||A.enumerable});return e};var w=(e,a,r)=>(r=e!=null?u(x(e)):{},N(a||!e||!e.__esModule?f(r,"default",{value:e,enumerable:!0}):r,e));var o=require("@ledgerhq/device-management-kit"),p=w(require("bs58")),d=require("purify-ts"),y=require("../../../../modules/multichain/transaction-check/utils/constants"),n=require("../../../../shared/model/ClearSignContext"),h=require("./SolanaTransactionCheckLoader");const c=64,g={debug:vi.fn(),info:vi.fn(),warn:vi.fn(),error:vi.fn(),subscribers:[]},O=()=>g,l={loadCertificate:vi.fn()};let i,t;beforeEach(()=>{vi.resetAllMocks(),i={check:vi.fn()},t=new h.SolanaTransactionCheckLoader(i,l,O)});describe("SolanaTransactionCheckLoader",()=>{describe("canHandle",()=>{const e={deviceModelId:o.DeviceModelId.NANO_X,transactionCheck:{from:"signer",transactionBytes:new Uint8Array([1,0,3,222]),chain:1}};it("returns true for a valid Solana transaction-check input",()=>{expect(t.canHandle(e,[n.ClearSignContextType.SOLANA_TRANSACTION_CHECK])).toBe(!0)}),it("returns false when expected types do not include SOLANA_TRANSACTION_CHECK",()=>{expect(t.canHandle(e,[n.ClearSignContextType.SOLANA_TOKEN])).toBe(!1)}),it("returns false when transactionBytes is not a Uint8Array",()=>{expect(t.canHandle({...e,transactionCheck:{...e.transactionCheck,transactionBytes:"0xdead"}},[n.ClearSignContextType.SOLANA_TRANSACTION_CHECK])).toBe(!1)}),it("returns false when transactionBytes is empty",()=>{expect(t.canHandle({...e,transactionCheck:{...e.transactionCheck,transactionBytes:new Uint8Array}},[n.ClearSignContextType.SOLANA_TRANSACTION_CHECK])).toBe(!1)}),it("returns false when from is empty",()=>{expect(t.canHandle({...e,transactionCheck:{...e.transactionCheck,from:""}},[n.ClearSignContextType.SOLANA_TRANSACTION_CHECK])).toBe(!1)}),it("returns false for unsupported device models (NANO_S)",()=>{expect(t.canHandle({...e,deviceModelId:o.DeviceModelId.NANO_S},[n.ClearSignContextType.SOLANA_TRANSACTION_CHECK])).toBe(!1)})}),describe("load \u2014 wire format",()=>{beforeEach(()=>{i.check.mockResolvedValue((0,d.Right)({publicKeyId:"pk",descriptor:"aabb"})),l.loadCertificate.mockResolvedValue({payload:new Uint8Array([204]),keyUsageNumber:14})}),it("wraps a legacy Message into a serialized Transaction (sig count + zero-filled signatures + message) and bs58-encodes it",async()=>{const e=new Uint8Array([2,0,3,170,187,204]);await t.load({deviceModelId:o.DeviceModelId.NANO_X,transactionCheck:{from:"signer",transactionBytes:e,chain:1}});const a=i.check.mock.calls[0][0],r=p.default.decode(a.body.tx.raw);expect(a.path).toBe(y.TransactionCheckPaths.SOLANA_TRANSACTION),expect(a.body.tx.from).toBe("signer"),expect(a.body.chain).toBe(1),expect(r.length).toBe(1+2*c+e.length),expect(r[0]).toBe(2),expect(Array.from(r.slice(1,1+2*c))).toEqual(new Array(2*c).fill(0)),expect(Array.from(r.slice(1+2*c))).toEqual(Array.from(e))}),it("wraps a versioned (v0) Message by skipping the version prefix when reading numRequiredSignatures",async()=>{const e=new Uint8Array([128,1,0,3,222,173]);await t.load({deviceModelId:o.DeviceModelId.NANO_X,transactionCheck:{from:"signer",transactionBytes:e,chain:1}});const a=p.default.decode(i.check.mock.calls[0][0].body.tx.raw);expect(a.length).toBe(1+c+e.length),expect(a[0]).toBe(1),expect(Array.from(a.slice(1,1+c))).toEqual(new Array(c).fill(0)),expect(Array.from(a.slice(1+c))).toEqual(Array.from(e))})}),describe("load \u2014 result mapping",()=>{it("returns a SOLANA_TRANSACTION_CHECK context with descriptor and certificate on success",async()=>{i.check.mockResolvedValue((0,d.Right)({publicKeyId:"pk-1",descriptor:"deadbeef"}));const e={payload:new Uint8Array([153]),keyUsageNumber:14};l.loadCertificate.mockResolvedValue(e);const[a]=await t.load({deviceModelId:o.DeviceModelId.NANO_X,transactionCheck:{from:"signer",transactionBytes:new Uint8Array([1,0,3,170]),chain:1}});expect(a).toEqual({type:n.ClearSignContextType.SOLANA_TRANSACTION_CHECK,payload:{descriptor:"deadbeef"},certificate:e})}),it("returns an ERROR context when the data source returns Left",async()=>{const e=new Error("network fail");i.check.mockResolvedValue((0,d.Left)(e));const[a]=await t.load({deviceModelId:o.DeviceModelId.NANO_X,transactionCheck:{from:"signer",transactionBytes:new Uint8Array([1,0,3,170]),chain:1}});expect(a).toEqual({type:n.ClearSignContextType.ERROR,error:e}),expect(l.loadCertificate).not.toHaveBeenCalled()}),it("returns an ERROR context (and does not call the data source) when numRequiredSignatures exceeds the max",async()=>{const e=new Uint8Array([65,0,3,170]),[a]=await t.load({deviceModelId:o.DeviceModelId.NANO_X,transactionCheck:{from:"signer",transactionBytes:e,chain:1}});expect(a).toMatchObject({type:n.ClearSignContextType.ERROR,error:expect.any(Error)}),expect(a.error.message).toContain("numRequiredSignatures (65)"),expect(i.check).not.toHaveBeenCalled()})})});
1
+ "use strict";var h=Object.create;var f=Object.defineProperty;var C=Object.getOwnPropertyDescriptor;var m=Object.getOwnPropertyNames;var x=Object.getPrototypeOf,k=Object.prototype.hasOwnProperty;var u=(e,t,a,p)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of m(t))!k.call(e,s)&&s!==a&&f(e,s,{get:()=>t[s],enumerable:!(p=C(t,s))||p.enumerable});return e};var w=(e,t,a)=>(a=e!=null?h(x(e)):{},u(t||!e||!e.__esModule?f(a,"default",{value:e,enumerable:!0}):a,e));var c=require("@ledgerhq/device-management-kit"),l=w(require("bs58")),d=require("purify-ts"),N=require("../../../../modules/multichain/transaction-check/utils/constants"),i=require("../../../../modules/solana/model/SolanaTransactionScanChainId"),r=require("../../../../shared/model/ClearSignContext"),y=require("./SolanaTransactionCheckLoader");const S={debug:vi.fn(),info:vi.fn(),warn:vi.fn(),error:vi.fn(),subscribers:[]},T=()=>S,A={loadCertificate:vi.fn()};let o,n;beforeEach(()=>{vi.resetAllMocks(),o={check:vi.fn()},n=new y.SolanaTransactionCheckLoader(o,A,T)});describe("SolanaTransactionCheckLoader",()=>{describe("canHandle",()=>{const e={deviceModelId:c.DeviceModelId.NANO_X,transactionCheck:{from:"signer",transactionBytes:new Uint8Array([1,0,3,222]),chain:1}};it("returns true for a valid Solana transaction-check input",()=>{expect(n.canHandle(e,[r.ClearSignContextType.SOLANA_TRANSACTION_CHECK])).toBe(!0)}),it("returns false when expected types do not include SOLANA_TRANSACTION_CHECK",()=>{expect(n.canHandle(e,[r.ClearSignContextType.SOLANA_TOKEN])).toBe(!1)}),it("returns false when transactionBytes is not a Uint8Array",()=>{expect(n.canHandle({...e,transactionCheck:{...e.transactionCheck,transactionBytes:"0xdead"}},[r.ClearSignContextType.SOLANA_TRANSACTION_CHECK])).toBe(!1)}),it("returns false when transactionBytes is empty",()=>{expect(n.canHandle({...e,transactionCheck:{...e.transactionCheck,transactionBytes:new Uint8Array}},[r.ClearSignContextType.SOLANA_TRANSACTION_CHECK])).toBe(!1)}),it("returns false when from is empty",()=>{expect(n.canHandle({...e,transactionCheck:{...e.transactionCheck,from:""}},[r.ClearSignContextType.SOLANA_TRANSACTION_CHECK])).toBe(!1)}),it("returns false for unsupported device models (NANO_S)",()=>{expect(n.canHandle({...e,deviceModelId:c.DeviceModelId.NANO_S},[r.ClearSignContextType.SOLANA_TRANSACTION_CHECK])).toBe(!1)})}),describe("load \u2014 wire format",()=>{beforeEach(()=>{o.check.mockResolvedValue((0,d.Right)({publicKeyId:"pk",descriptor:"aabb"})),A.loadCertificate.mockResolvedValue({payload:new Uint8Array([204]),keyUsageNumber:14})}),it("wraps a legacy message with zero-filled signature placeholders before bs58-encoding",async()=>{const e=new Uint8Array([2,0,3,170,187,204]),t=new Uint8Array(1+2*64+e.length);t[0]=2,t.set(e,1+2*64),await n.load({deviceModelId:c.DeviceModelId.NANO_X,transactionCheck:{from:"signer",transactionBytes:e,chain:i.SolanaTransactionScanChainId.MAINNET}});const a=o.check.mock.calls[0][0];expect(a.path).toBe(N.TransactionCheckPaths.SOLANA_TRANSACTION),expect(a.body.tx.from).toBe("signer"),expect(a.body.chain).toBe(i.SolanaTransactionScanChainId.MAINNET),expect(Array.from(l.default.decode(a.body.tx.raw))).toEqual(Array.from(t)),expect(a.body.tx.raw).toBe(l.default.encode(t))}),it("wraps a versioned (v0) message with signature placeholders",async()=>{const e=new Uint8Array([128,1,0,3,222,173]),t=new Uint8Array(1+1*64+e.length);t[0]=1,t.set(e,1+1*64),await n.load({deviceModelId:c.DeviceModelId.NANO_X,transactionCheck:{from:"signer",transactionBytes:e,chain:i.SolanaTransactionScanChainId.MAINNET}});const a=o.check.mock.calls[0][0].body.tx.raw;expect(Array.from(l.default.decode(a))).toEqual(Array.from(t))})}),describe("load \u2014 result mapping",()=>{it("returns a SOLANA_TRANSACTION_CHECK context with descriptor and certificate on success",async()=>{o.check.mockResolvedValue((0,d.Right)({publicKeyId:"pk-1",descriptor:"deadbeef"}));const e={payload:new Uint8Array([153]),keyUsageNumber:14};A.loadCertificate.mockResolvedValue(e);const[t]=await n.load({deviceModelId:c.DeviceModelId.NANO_X,transactionCheck:{from:"signer",transactionBytes:new Uint8Array([1,0,3,170]),chain:i.SolanaTransactionScanChainId.MAINNET}});expect(t).toEqual({type:r.ClearSignContextType.SOLANA_TRANSACTION_CHECK,payload:{descriptor:"deadbeef"},certificate:e})}),it("returns an ERROR context when the data source returns Left",async()=>{const e=new Error("network fail");o.check.mockResolvedValue((0,d.Left)(e));const[t]=await n.load({deviceModelId:c.DeviceModelId.NANO_X,transactionCheck:{from:"signer",transactionBytes:new Uint8Array([1,0,3,170]),chain:i.SolanaTransactionScanChainId.MAINNET}});expect(t).toEqual({type:r.ClearSignContextType.ERROR,error:e}),expect(A.loadCertificate).not.toHaveBeenCalled()}),it("returns an ERROR context when numRequiredSignatures exceeds the 64-signature limit",async()=>{const e=new Uint8Array([65,0,3,170]),[t]=await n.load({deviceModelId:c.DeviceModelId.NANO_X,transactionCheck:{from:"signer",transactionBytes:e,chain:i.SolanaTransactionScanChainId.MAINNET}});expect(t).toMatchObject({type:r.ClearSignContextType.ERROR,error:expect.objectContaining({message:expect.stringContaining("exceeds SOLANA_MAX_SIGNATURES")})}),expect(o.check).not.toHaveBeenCalled()})})});
2
2
  //# sourceMappingURL=SolanaTransactionCheckLoader.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.test.ts"],
4
- "sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport bs58 from \"bs58\";\nimport { Left, Right } from \"purify-ts\";\n\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport { type TransactionCheckDataSource } from \"@/modules/multichain/transaction-check/data/TransactionCheckDataSource\";\nimport { TransactionCheckPaths } from \"@/modules/multichain/transaction-check/utils/constants\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\n\nimport { SolanaTransactionCheckLoader } from \"./SolanaTransactionCheckLoader\";\n\nconst SIG_LENGTH = 64;\n\nconst loggerMock = {\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n};\nconst loggerFactory = () => loggerMock;\n\nconst certificateLoaderMock: PkiCertificateLoader = {\n loadCertificate: vi.fn(),\n};\n\nlet dataSourceMock: { check: ReturnType<typeof vi.fn> };\nlet loader: SolanaTransactionCheckLoader;\n\nbeforeEach(() => {\n vi.resetAllMocks();\n dataSourceMock = { check: vi.fn() };\n loader = new SolanaTransactionCheckLoader(\n dataSourceMock as unknown as TransactionCheckDataSource,\n certificateLoaderMock,\n loggerFactory,\n );\n});\n\ndescribe(\"SolanaTransactionCheckLoader\", () => {\n describe(\"canHandle\", () => {\n const validInput = {\n deviceModelId: DeviceModelId.NANO_X,\n transactionCheck: {\n from: \"signer\",\n transactionBytes: new Uint8Array([1, 0, 3, 0xde]),\n chain: 1,\n },\n };\n\n it(\"returns true for a valid Solana transaction-check input\", () => {\n expect(\n loader.canHandle(validInput, [\n ClearSignContextType.SOLANA_TRANSACTION_CHECK,\n ]),\n ).toBe(true);\n });\n\n it(\"returns false when expected types do not include SOLANA_TRANSACTION_CHECK\", () => {\n expect(\n loader.canHandle(validInput, [ClearSignContextType.SOLANA_TOKEN]),\n ).toBe(false);\n });\n\n it(\"returns false when transactionBytes is not a Uint8Array\", () => {\n expect(\n loader.canHandle(\n {\n ...validInput,\n transactionCheck: {\n ...validInput.transactionCheck,\n transactionBytes: \"0xdead\" as unknown as Uint8Array,\n },\n },\n [ClearSignContextType.SOLANA_TRANSACTION_CHECK],\n ),\n ).toBe(false);\n });\n\n it(\"returns false when transactionBytes is empty\", () => {\n expect(\n loader.canHandle(\n {\n ...validInput,\n transactionCheck: {\n ...validInput.transactionCheck,\n transactionBytes: new Uint8Array(),\n },\n },\n [ClearSignContextType.SOLANA_TRANSACTION_CHECK],\n ),\n ).toBe(false);\n });\n\n it(\"returns false when from is empty\", () => {\n expect(\n loader.canHandle(\n {\n ...validInput,\n transactionCheck: { ...validInput.transactionCheck, from: \"\" },\n },\n [ClearSignContextType.SOLANA_TRANSACTION_CHECK],\n ),\n ).toBe(false);\n });\n\n it(\"returns false for unsupported device models (NANO_S)\", () => {\n expect(\n loader.canHandle(\n { ...validInput, deviceModelId: DeviceModelId.NANO_S },\n [ClearSignContextType.SOLANA_TRANSACTION_CHECK],\n ),\n ).toBe(false);\n });\n });\n\n describe(\"load \u2014 wire format\", () => {\n beforeEach(() => {\n dataSourceMock.check.mockResolvedValue(\n Right({ publicKeyId: \"pk\", descriptor: \"aabb\" }),\n );\n (certificateLoaderMock.loadCertificate as any).mockResolvedValue({\n payload: new Uint8Array([0xcc]),\n keyUsageNumber: 14,\n });\n });\n\n it(\"wraps a legacy Message into a serialized Transaction (sig count + zero-filled signatures + message) and bs58-encodes it\", async () => {\n // Legacy message: numRequiredSignatures=2, then arbitrary bytes\n const message = new Uint8Array([2, 0, 3, 0xaa, 0xbb, 0xcc]);\n\n await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n transactionCheck: {\n from: \"signer\",\n transactionBytes: message,\n chain: 1,\n },\n });\n\n const sent = dataSourceMock.check.mock.calls[0]![0];\n const wrapped = bs58.decode(sent.body.tx.raw);\n\n expect(sent.path).toBe(TransactionCheckPaths.SOLANA_TRANSACTION);\n expect(sent.body.tx.from).toBe(\"signer\");\n expect(sent.body.chain).toBe(1);\n expect(wrapped.length).toBe(1 + 2 * SIG_LENGTH + message.length);\n expect(wrapped[0]).toBe(2);\n expect(Array.from(wrapped.slice(1, 1 + 2 * SIG_LENGTH))).toEqual(\n new Array(2 * SIG_LENGTH).fill(0),\n );\n expect(Array.from(wrapped.slice(1 + 2 * SIG_LENGTH))).toEqual(\n Array.from(message),\n );\n });\n\n it(\"wraps a versioned (v0) Message by skipping the version prefix when reading numRequiredSignatures\", async () => {\n // V0 message: [0x80 version prefix, numRequiredSignatures=1, ...]\n const message = new Uint8Array([0x80, 1, 0, 3, 0xde, 0xad]);\n\n await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n transactionCheck: {\n from: \"signer\",\n transactionBytes: message,\n chain: 1,\n },\n });\n\n const wrapped = bs58.decode(\n dataSourceMock.check.mock.calls[0]![0].body.tx.raw,\n );\n\n expect(wrapped.length).toBe(1 + SIG_LENGTH + message.length);\n expect(wrapped[0]).toBe(1);\n expect(Array.from(wrapped.slice(1, 1 + SIG_LENGTH))).toEqual(\n new Array(SIG_LENGTH).fill(0),\n );\n expect(Array.from(wrapped.slice(1 + SIG_LENGTH))).toEqual(\n Array.from(message),\n );\n });\n });\n\n describe(\"load \u2014 result mapping\", () => {\n it(\"returns a SOLANA_TRANSACTION_CHECK context with descriptor and certificate on success\", async () => {\n dataSourceMock.check.mockResolvedValue(\n Right({ publicKeyId: \"pk-1\", descriptor: \"deadbeef\" }),\n );\n const cert = { payload: new Uint8Array([0x99]), keyUsageNumber: 14 };\n (certificateLoaderMock.loadCertificate as any).mockResolvedValue(cert);\n\n const [ctx] = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n transactionCheck: {\n from: \"signer\",\n transactionBytes: new Uint8Array([1, 0, 3, 0xaa]),\n chain: 1,\n },\n });\n\n expect(ctx).toEqual({\n type: ClearSignContextType.SOLANA_TRANSACTION_CHECK,\n payload: { descriptor: \"deadbeef\" },\n certificate: cert,\n });\n });\n\n it(\"returns an ERROR context when the data source returns Left\", async () => {\n const error = new Error(\"network fail\");\n dataSourceMock.check.mockResolvedValue(Left(error));\n\n const [ctx] = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n transactionCheck: {\n from: \"signer\",\n transactionBytes: new Uint8Array([1, 0, 3, 0xaa]),\n chain: 1,\n },\n });\n\n expect(ctx).toEqual({ type: ClearSignContextType.ERROR, error });\n expect(certificateLoaderMock.loadCertificate).not.toHaveBeenCalled();\n });\n\n it(\"returns an ERROR context (and does not call the data source) when numRequiredSignatures exceeds the max\", async () => {\n // numRequiredSignatures = 65, one above SOLANA_MAX_SIGNATURES (64)\n const message = new Uint8Array([65, 0, 3, 0xaa]);\n\n const [ctx] = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n transactionCheck: {\n from: \"signer\",\n transactionBytes: message,\n chain: 1,\n },\n });\n\n expect(ctx).toMatchObject({\n type: ClearSignContextType.ERROR,\n error: expect.any(Error),\n });\n expect((ctx as { error: Error }).error.message).toContain(\n \"numRequiredSignatures (65)\",\n );\n expect(dataSourceMock.check).not.toHaveBeenCalled();\n });\n });\n});\n"],
5
- "mappings": "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",
6
- "names": ["import_device_management_kit", "import_bs58", "import_purify_ts", "import_constants", "import_ClearSignContext", "import_SolanaTransactionCheckLoader", "SIG_LENGTH", "loggerMock", "loggerFactory", "certificateLoaderMock", "dataSourceMock", "loader", "validInput", "message", "sent", "wrapped", "bs58", "cert", "ctx", "error"]
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport bs58 from \"bs58\";\nimport { Left, Right } from \"purify-ts\";\n\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport { type TransactionCheckDataSource } from \"@/modules/multichain/transaction-check/data/TransactionCheckDataSource\";\nimport { TransactionCheckPaths } from \"@/modules/multichain/transaction-check/utils/constants\";\nimport { SolanaTransactionScanChainId } from \"@/modules/solana/model/SolanaTransactionScanChainId\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\n\nimport { SolanaTransactionCheckLoader } from \"./SolanaTransactionCheckLoader\";\n\nconst loggerMock = {\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n};\nconst loggerFactory = () => loggerMock;\n\nconst certificateLoaderMock: PkiCertificateLoader = {\n loadCertificate: vi.fn(),\n};\n\nlet dataSourceMock: { check: ReturnType<typeof vi.fn> };\nlet loader: SolanaTransactionCheckLoader;\n\nbeforeEach(() => {\n vi.resetAllMocks();\n dataSourceMock = { check: vi.fn() };\n loader = new SolanaTransactionCheckLoader(\n dataSourceMock as unknown as TransactionCheckDataSource,\n certificateLoaderMock,\n loggerFactory,\n );\n});\n\ndescribe(\"SolanaTransactionCheckLoader\", () => {\n describe(\"canHandle\", () => {\n const validInput = {\n deviceModelId: DeviceModelId.NANO_X,\n transactionCheck: {\n from: \"signer\",\n transactionBytes: new Uint8Array([1, 0, 3, 0xde]),\n chain: 1,\n },\n };\n\n it(\"returns true for a valid Solana transaction-check input\", () => {\n expect(\n loader.canHandle(validInput, [\n ClearSignContextType.SOLANA_TRANSACTION_CHECK,\n ]),\n ).toBe(true);\n });\n\n it(\"returns false when expected types do not include SOLANA_TRANSACTION_CHECK\", () => {\n expect(\n loader.canHandle(validInput, [ClearSignContextType.SOLANA_TOKEN]),\n ).toBe(false);\n });\n\n it(\"returns false when transactionBytes is not a Uint8Array\", () => {\n expect(\n loader.canHandle(\n {\n ...validInput,\n transactionCheck: {\n ...validInput.transactionCheck,\n transactionBytes: \"0xdead\" as unknown as Uint8Array,\n },\n },\n [ClearSignContextType.SOLANA_TRANSACTION_CHECK],\n ),\n ).toBe(false);\n });\n\n it(\"returns false when transactionBytes is empty\", () => {\n expect(\n loader.canHandle(\n {\n ...validInput,\n transactionCheck: {\n ...validInput.transactionCheck,\n transactionBytes: new Uint8Array(),\n },\n },\n [ClearSignContextType.SOLANA_TRANSACTION_CHECK],\n ),\n ).toBe(false);\n });\n\n it(\"returns false when from is empty\", () => {\n expect(\n loader.canHandle(\n {\n ...validInput,\n transactionCheck: { ...validInput.transactionCheck, from: \"\" },\n },\n [ClearSignContextType.SOLANA_TRANSACTION_CHECK],\n ),\n ).toBe(false);\n });\n\n it(\"returns false for unsupported device models (NANO_S)\", () => {\n expect(\n loader.canHandle(\n { ...validInput, deviceModelId: DeviceModelId.NANO_S },\n [ClearSignContextType.SOLANA_TRANSACTION_CHECK],\n ),\n ).toBe(false);\n });\n });\n\n describe(\"load \u2014 wire format\", () => {\n beforeEach(() => {\n dataSourceMock.check.mockResolvedValue(\n Right({ publicKeyId: \"pk\", descriptor: \"aabb\" }),\n );\n (certificateLoaderMock.loadCertificate as any).mockResolvedValue({\n payload: new Uint8Array([0xcc]),\n keyUsageNumber: 14,\n });\n });\n\n it(\"wraps a legacy message with zero-filled signature placeholders before bs58-encoding\", async () => {\n // message[0] = 2 \u2192 numRequiredSignatures = 2 (legacy, high bit clear)\n const message = new Uint8Array([2, 0, 3, 0xaa, 0xbb, 0xcc]);\n // expected: compact-u16(2) + 2*64 zero bytes + message\n const expected = new Uint8Array(1 + 2 * 64 + message.length);\n expected[0] = 2; // compact-u16 encoding of 2\n expected.set(message, 1 + 2 * 64);\n\n await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n transactionCheck: {\n from: \"signer\",\n transactionBytes: message,\n chain: SolanaTransactionScanChainId.MAINNET,\n },\n });\n\n const sent = dataSourceMock.check.mock.calls[0]![0];\n\n expect(sent.path).toBe(TransactionCheckPaths.SOLANA_TRANSACTION);\n expect(sent.body.tx.from).toBe(\"signer\");\n expect(sent.body.chain).toBe(SolanaTransactionScanChainId.MAINNET);\n expect(Array.from(bs58.decode(sent.body.tx.raw))).toEqual(\n Array.from(expected),\n );\n expect(sent.body.tx.raw).toBe(bs58.encode(expected));\n });\n\n it(\"wraps a versioned (v0) message with signature placeholders\", async () => {\n // message[0] = 0x80 \u2192 versioned prefix; message[1] = 1 \u2192 numRequiredSignatures = 1\n const message = new Uint8Array([0x80, 1, 0, 3, 0xde, 0xad]);\n // expected: compact-u16(1) + 1*64 zero bytes + message\n const expected = new Uint8Array(1 + 1 * 64 + message.length);\n expected[0] = 1; // compact-u16 encoding of 1\n expected.set(message, 1 + 1 * 64);\n\n await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n transactionCheck: {\n from: \"signer\",\n transactionBytes: message,\n chain: SolanaTransactionScanChainId.MAINNET,\n },\n });\n\n const raw = dataSourceMock.check.mock.calls[0]![0].body.tx.raw;\n\n expect(Array.from(bs58.decode(raw))).toEqual(Array.from(expected));\n });\n });\n\n describe(\"load \u2014 result mapping\", () => {\n it(\"returns a SOLANA_TRANSACTION_CHECK context with descriptor and certificate on success\", async () => {\n dataSourceMock.check.mockResolvedValue(\n Right({ publicKeyId: \"pk-1\", descriptor: \"deadbeef\" }),\n );\n const cert = { payload: new Uint8Array([0x99]), keyUsageNumber: 14 };\n (certificateLoaderMock.loadCertificate as any).mockResolvedValue(cert);\n\n const [ctx] = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n transactionCheck: {\n from: \"signer\",\n transactionBytes: new Uint8Array([1, 0, 3, 0xaa]),\n chain: SolanaTransactionScanChainId.MAINNET,\n },\n });\n\n expect(ctx).toEqual({\n type: ClearSignContextType.SOLANA_TRANSACTION_CHECK,\n payload: { descriptor: \"deadbeef\" },\n certificate: cert,\n });\n });\n\n it(\"returns an ERROR context when the data source returns Left\", async () => {\n const error = new Error(\"network fail\");\n dataSourceMock.check.mockResolvedValue(Left(error));\n\n const [ctx] = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n transactionCheck: {\n from: \"signer\",\n transactionBytes: new Uint8Array([1, 0, 3, 0xaa]),\n chain: SolanaTransactionScanChainId.MAINNET,\n },\n });\n\n expect(ctx).toEqual({ type: ClearSignContextType.ERROR, error });\n expect(certificateLoaderMock.loadCertificate).not.toHaveBeenCalled();\n });\n\n it(\"returns an ERROR context when numRequiredSignatures exceeds the 64-signature limit\", async () => {\n // message[0] = 65 \u2192 numRequiredSignatures = 65 (legacy, high bit clear), which exceeds SOLANA_MAX_SIGNATURES\n const message = new Uint8Array([65, 0, 3, 0xaa]);\n\n const [ctx] = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n transactionCheck: {\n from: \"signer\",\n transactionBytes: message,\n chain: SolanaTransactionScanChainId.MAINNET,\n },\n });\n\n expect(ctx).toMatchObject({\n type: ClearSignContextType.ERROR,\n error: expect.objectContaining({\n message: expect.stringContaining(\"exceeds SOLANA_MAX_SIGNATURES\"),\n }),\n });\n expect(dataSourceMock.check).not.toHaveBeenCalled();\n });\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["import_device_management_kit", "import_bs58", "import_purify_ts", "import_constants", "import_SolanaTransactionScanChainId", "import_ClearSignContext", "import_SolanaTransactionCheckLoader", "loggerMock", "loggerFactory", "certificateLoaderMock", "dataSourceMock", "loader", "validInput", "message", "expected", "sent", "bs58", "raw", "cert", "ctx", "error"]
7
7
  }
@@ -0,0 +1,2 @@
1
+ "use strict";var o=Object.defineProperty;var i=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var a=Object.prototype.hasOwnProperty;var u=(e,t,n,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of l(t))!a.call(e,r)&&r!==n&&o(e,r,{get:()=>t[r],enumerable:!(s=i(t,r))||s.enumerable});return e};var p=e=>u(o({},"__esModule",{value:!0}),e);var A={};module.exports=p(A);
2
+ //# sourceMappingURL=AltResolutionDataSource.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/modules/solana/alt-resolution/data/AltResolutionDataSource.ts"],
4
+ "sourcesContent": ["import { type Either } from \"purify-ts\";\n\nexport type GetAltResolutionParams = {\n altAddress: string;\n entryIndex: number;\n challenge: string;\n};\n\nexport type AltResolutionResult = {\n altAddress: string;\n entryIndex: number;\n // Raw signed TLV bytes decoded from the backend response.\n descriptor: Uint8Array;\n keyId: string;\n keyUsage: string;\n};\n\nexport interface AltResolutionDataSource {\n getAltResolution(\n params: GetAltResolutionParams,\n ): Promise<Either<Error, AltResolutionResult>>;\n}\n"],
5
+ "mappings": "+WAAA,IAAAA,EAAA,kBAAAC,EAAAD",
6
+ "names": ["AltResolutionDataSource_exports", "__toCommonJS"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var c=Object.defineProperty;var f=Object.getOwnPropertyDescriptor;var A=Object.getOwnPropertyNames;var k=Object.prototype.hasOwnProperty;var $=(r,e)=>{for(var t in e)c(r,t,{get:e[t],enumerable:!0})},E=(r,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of A(e))!k.call(r,o)&&o!==t&&c(r,o,{get:()=>e[o],enumerable:!(s=f(e,o))||s.enumerable});return r};var w=r=>E(c({},"__esModule",{value:!0}),r),g=(r,e,t,s)=>{for(var o=s>1?void 0:s?f(e,t):e,l=r.length-1,i;l>=0;l--)(i=r[l])&&(o=(s?i(e,t,o):i(o))||o);return s&&o&&c(e,t,o),o},m=(r,e)=>(t,s)=>e(t,s,r);var x={};$(x,{HttpAltResolutionDataSource:()=>a});module.exports=w(x);var u=require("inversify"),n=require("purify-ts"),d=require("../../../../config/di/configTypes"),R=require("../../../../shared/network/di/networkTypes"),y=require("../../../../shared/utils/HexStringUtils"),D=require("../../../../shared/utils/signedDescriptorDto"),h=require("../../../../shared/utils/uIntCodec");let a=class{constructor(e,t){this.config=e;this.http=t}async getAltResolution({altAddress:e,entryIndex:t,challenge:s}){const o=h.u8Codec.decode(t);if(o.isLeft())return(0,n.Left)(new Error(`[ContextModule] HttpAltResolutionDataSource: invalid entryIndex (got ${t}): ${o.leftOrDefault("")}`));let l;try{l=await this.http.get(`${this.config.metadataServiceDomain.url}/v2/solana/alt-resolution/${e}/${t}`,{params:{challenge:s}})}catch(i){const p=i instanceof Error?i.message:String(i);return(0,n.Left)(new Error(`[ContextModule] HttpAltResolutionDataSource: Failed to fetch ALT resolution: ${p}`))}return D.signedDescriptorDtoCodec.decode(l).caseOf({Left:i=>(0,n.Left)(new Error(`[ContextModule] HttpAltResolutionDataSource: malformed response for (${e}, ${t}): ${i}`)),Right:i=>{let p;try{p=y.HexStringUtils.hexToBytes(i.signedDescriptor)}catch(C){return(0,n.Left)(new Error(`[ContextModule] HttpAltResolutionDataSource: invalid hex in signedDescriptor for (${e}, ${t}): ${C.message}`))}return(0,n.Right)({altAddress:e,entryIndex:t,descriptor:p,keyId:i.keyId,keyUsage:i.keyUsage})}})}};a=g([(0,u.injectable)(),m(0,(0,u.inject)(d.configTypes.Config)),m(1,(0,u.inject)(R.networkTypes.NetworkClient))],a);0&&(module.exports={HttpAltResolutionDataSource});
2
+ //# sourceMappingURL=HttpAltResolutionDataSource.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.ts"],
4
+ "sourcesContent": ["import { DmkNetworkClient } from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { Either, Left, Right } from \"purify-ts\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { type ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\nimport { networkTypes } from \"@/shared/network/di/networkTypes\";\nimport { HexStringUtils } from \"@/shared/utils/HexStringUtils\";\nimport { signedDescriptorDtoCodec } from \"@/shared/utils/signedDescriptorDto\";\nimport { u8Codec } from \"@/shared/utils/uIntCodec\";\n\nimport {\n type AltResolutionDataSource,\n type AltResolutionResult,\n type GetAltResolutionParams,\n} from \"./AltResolutionDataSource\";\n\ntype AltResolutionResponseDto = {\n descriptorType?: string;\n descriptorVersion?: number;\n altAddress?: string;\n entryIndex?: number;\n resolvedAddress?: string;\n signedDescriptor: string;\n keyId: string;\n keyUsage: string;\n};\n\n@injectable()\nexport class HttpAltResolutionDataSource implements AltResolutionDataSource {\n constructor(\n @inject(configTypes.Config)\n private readonly config: ContextModuleServiceConfig,\n @inject(networkTypes.NetworkClient)\n private readonly http: DmkNetworkClient,\n ) {}\n\n public async getAltResolution({\n altAddress,\n entryIndex,\n challenge,\n }: GetAltResolutionParams): Promise<Either<Error, AltResolutionResult>> {\n const entryIndexResult = u8Codec.decode(entryIndex);\n if (entryIndexResult.isLeft()) {\n return Left(\n new Error(\n `[ContextModule] HttpAltResolutionDataSource: invalid entryIndex (got ${entryIndex}): ${entryIndexResult.leftOrDefault(\"\")}`,\n ),\n );\n }\n\n let dto: AltResolutionResponseDto;\n try {\n dto = (await this.http.get(\n `${this.config.metadataServiceDomain.url}/v2/solana/alt-resolution/${altAddress}/${entryIndex}`,\n { params: { challenge } },\n )) as AltResolutionResponseDto;\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n return Left(\n new Error(\n `[ContextModule] HttpAltResolutionDataSource: Failed to fetch ALT resolution: ${reason}`,\n ),\n );\n }\n\n return signedDescriptorDtoCodec\n .decode(dto)\n .caseOf<Either<Error, AltResolutionResult>>({\n Left: (error) =>\n Left(\n new Error(\n `[ContextModule] HttpAltResolutionDataSource: malformed response for (${altAddress}, ${entryIndex}): ${error}`,\n ),\n ),\n Right: (validated) => {\n let descriptor: Uint8Array;\n try {\n descriptor = HexStringUtils.hexToBytes(validated.signedDescriptor);\n } catch (error) {\n return Left(\n new Error(\n `[ContextModule] HttpAltResolutionDataSource: invalid hex in signedDescriptor for (${altAddress}, ${entryIndex}): ${(error as Error).message}`,\n ),\n );\n }\n\n return Right({\n altAddress,\n entryIndex,\n descriptor,\n keyId: validated.keyId,\n keyUsage: validated.keyUsage,\n });\n },\n });\n }\n}\n"],
5
+ "mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,iCAAAE,IAAA,eAAAC,EAAAH,GACA,IAAAI,EAAmC,qBACnCC,EAAoC,qBAEpCC,EAA4B,mCAE5BC,EAA6B,4CAC7BC,EAA+B,yCAC/BC,EAAyC,8CACzCC,EAAwB,oCAoBjB,IAAMC,EAAN,KAAqE,CAC1E,YAEmBC,EAEAC,EACjB,CAHiB,YAAAD,EAEA,UAAAC,CAChB,CAEH,MAAa,iBAAiB,CAC5B,WAAAC,EACA,WAAAC,EACA,UAAAC,CACF,EAAwE,CACtE,MAAMC,EAAmB,UAAQ,OAAOF,CAAU,EAClD,GAAIE,EAAiB,OAAO,EAC1B,SAAO,QACL,IAAI,MACF,wEAAwEF,CAAU,MAAME,EAAiB,cAAc,EAAE,CAAC,EAC5H,CACF,EAGF,IAAIC,EACJ,GAAI,CACFA,EAAO,MAAM,KAAK,KAAK,IACrB,GAAG,KAAK,OAAO,sBAAsB,GAAG,6BAA6BJ,CAAU,IAAIC,CAAU,GAC7F,CAAE,OAAQ,CAAE,UAAAC,CAAU,CAAE,CAC1B,CACF,OAASG,EAAO,CACd,MAAMC,EAASD,aAAiB,MAAQA,EAAM,QAAU,OAAOA,CAAK,EACpE,SAAO,QACL,IAAI,MACF,gFAAgFC,CAAM,EACxF,CACF,CACF,CAEA,OAAO,2BACJ,OAAOF,CAAG,EACV,OAA2C,CAC1C,KAAOC,MACL,QACE,IAAI,MACF,wEAAwEL,CAAU,KAAKC,CAAU,MAAMI,CAAK,EAC9G,CACF,EACF,MAAQE,GAAc,CACpB,IAAIC,EACJ,GAAI,CACFA,EAAa,iBAAe,WAAWD,EAAU,gBAAgB,CACnE,OAASF,EAAO,CACd,SAAO,QACL,IAAI,MACF,qFAAqFL,CAAU,KAAKC,CAAU,MAAOI,EAAgB,OAAO,EAC9I,CACF,CACF,CAEA,SAAO,SAAM,CACX,WAAAL,EACA,WAAAC,EACA,WAAAO,EACA,MAAOD,EAAU,MACjB,SAAUA,EAAU,QACtB,CAAC,CACH,CACF,CAAC,CACL,CACF,EApEaV,EAANY,EAAA,IADN,cAAW,EAGPC,EAAA,eAAO,cAAY,MAAM,GAEzBA,EAAA,eAAO,eAAa,aAAa,IAJzBb",
6
+ "names": ["HttpAltResolutionDataSource_exports", "__export", "HttpAltResolutionDataSource", "__toCommonJS", "import_inversify", "import_purify_ts", "import_configTypes", "import_networkTypes", "import_HexStringUtils", "import_signedDescriptorDto", "import_uIntCodec", "HttpAltResolutionDataSource", "config", "http", "altAddress", "entryIndex", "challenge", "entryIndexResult", "dto", "error", "reason", "validated", "descriptor", "__decorateClass", "__decorateParam"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var a=require("purify-ts"),l=require("./HttpAltResolutionDataSource");describe("HttpAltResolutionDataSource",()=>{let n,o;const e="AltAddress1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",r="cafebabe",i={metadataServiceDomain:{url:"https://nft.api.ledger.com"}};beforeEach(()=>{vi.clearAllMocks(),o={get:vi.fn()},n=new l.HttpAltResolutionDataSource(i,o)}),it("calls the metadata endpoint with the right path and challenge",async()=>{o.get.mockResolvedValue({signedDescriptor:"01020304",keyId:"alt_key",keyUsage:"coin_meta"}),await n.getAltResolution({altAddress:e,entryIndex:3,challenge:r}),expect(o.get).toHaveBeenCalledWith(`https://nft.api.ledger.com/v2/solana/alt-resolution/${e}/3`,{params:{challenge:r}})}),it("decodes signedDescriptor hex into Uint8Array",async()=>{o.get.mockResolvedValue({signedDescriptor:"abcd",keyId:"k",keyUsage:"u"});const t=await n.getAltResolution({altAddress:e,entryIndex:3,challenge:r});expect(t).toEqual((0,a.Right)({altAddress:e,entryIndex:3,descriptor:new Uint8Array([171,205]),keyId:"k",keyUsage:"u"}))}),it.each([-1,256,1.5,Number.NaN])("rejects entryIndex out of u8 range: %s",async t=>{const s=await n.getAltResolution({altAddress:e,entryIndex:t,challenge:r});expect(s.isLeft()).toBe(!0),expect(s.extract().message).toMatch(/entryIndex/)}),it("returns Left on malformed response",async()=>{o.get.mockResolvedValue({keyId:"k"});const t=await n.getAltResolution({altAddress:e,entryIndex:3,challenge:r});expect(t.isLeft()).toBe(!0),expect(t.extract().message).toMatch(new RegExp(String.raw`\[ContextModule\] HttpAltResolutionDataSource: malformed response for \(${e}, ${3}\):`))}),it("returns Left when HTTP client throws",async()=>{o.get.mockRejectedValue(new Error("net"));const t=await n.getAltResolution({altAddress:e,entryIndex:3,challenge:r});expect(t).toEqual((0,a.Left)(new Error("[ContextModule] HttpAltResolutionDataSource: Failed to fetch ALT resolution: net")))})});
2
+ //# sourceMappingURL=HttpAltResolutionDataSource.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.test.ts"],
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { type DmkNetworkClient } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\n\nimport { type ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\n\nimport { type AltResolutionDataSource } from \"./AltResolutionDataSource\";\nimport { HttpAltResolutionDataSource } from \"./HttpAltResolutionDataSource\";\n\ndescribe(\"HttpAltResolutionDataSource\", () => {\n let datasource: AltResolutionDataSource;\n let httpMock: { get: ReturnType<typeof vi.fn> };\n const altAddress = \"AltAddress1xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx\";\n const entryIndex = 3;\n const challenge = \"cafebabe\";\n const config: ContextModuleServiceConfig = {\n metadataServiceDomain: { url: \"https://nft.api.ledger.com\" },\n } as ContextModuleServiceConfig;\n\n beforeEach(() => {\n vi.clearAllMocks();\n httpMock = { get: vi.fn() };\n datasource = new HttpAltResolutionDataSource(\n config,\n httpMock as unknown as DmkNetworkClient,\n );\n });\n\n it(\"calls the metadata endpoint with the right path and challenge\", async () => {\n httpMock.get.mockResolvedValue({\n signedDescriptor: \"01020304\",\n keyId: \"alt_key\",\n keyUsage: \"coin_meta\",\n });\n\n await datasource.getAltResolution({ altAddress, entryIndex, challenge });\n\n expect(httpMock.get).toHaveBeenCalledWith(\n `https://nft.api.ledger.com/v2/solana/alt-resolution/${altAddress}/${entryIndex}`,\n { params: { challenge } },\n );\n });\n\n it(\"decodes signedDescriptor hex into Uint8Array\", async () => {\n httpMock.get.mockResolvedValue({\n signedDescriptor: \"abcd\",\n keyId: \"k\",\n keyUsage: \"u\",\n });\n\n const result = await datasource.getAltResolution({\n altAddress,\n entryIndex,\n challenge,\n });\n\n expect(result).toEqual(\n Right({\n altAddress,\n entryIndex,\n descriptor: new Uint8Array([0xab, 0xcd]),\n keyId: \"k\",\n keyUsage: \"u\",\n }),\n );\n });\n\n it.each([-1, 256, 1.5, Number.NaN])(\n \"rejects entryIndex out of u8 range: %s\",\n async (badIndex) => {\n const result = await datasource.getAltResolution({\n altAddress,\n entryIndex: badIndex,\n challenge,\n });\n expect(result.isLeft()).toBe(true);\n expect((result.extract() as Error).message).toMatch(/entryIndex/);\n },\n );\n\n it(\"returns Left on malformed response\", async () => {\n httpMock.get.mockResolvedValue({ keyId: \"k\" } as any);\n\n const result = await datasource.getAltResolution({\n altAddress,\n entryIndex,\n challenge,\n });\n\n expect(result.isLeft()).toBe(true);\n expect((result.extract() as Error).message).toMatch(\n new RegExp(\n String.raw`\\[ContextModule\\] HttpAltResolutionDataSource: malformed response for \\(${altAddress}, ${entryIndex}\\):`,\n ),\n );\n });\n\n it(\"returns Left when HTTP client throws\", async () => {\n httpMock.get.mockRejectedValue(new Error(\"net\"));\n\n const result = await datasource.getAltResolution({\n altAddress,\n entryIndex,\n challenge,\n });\n\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] HttpAltResolutionDataSource: Failed to fetch ALT resolution: net\",\n ),\n ),\n );\n });\n});\n"],
5
+ "mappings": "aAEA,IAAAA,EAA4B,qBAK5BC,EAA4C,yCAE5C,SAAS,8BAA+B,IAAM,CAC5C,IAAIC,EACAC,EACJ,MAAMC,EAAa,8CAEbC,EAAY,WACZC,EAAqC,CACzC,sBAAuB,CAAE,IAAK,4BAA6B,CAC7D,EAEA,WAAW,IAAM,CACf,GAAG,cAAc,EACjBH,EAAW,CAAE,IAAK,GAAG,GAAG,CAAE,EAC1BD,EAAa,IAAI,8BACfI,EACAH,CACF,CACF,CAAC,EAED,GAAG,gEAAiE,SAAY,CAC9EA,EAAS,IAAI,kBAAkB,CAC7B,iBAAkB,WAClB,MAAO,UACP,SAAU,WACZ,CAAC,EAED,MAAMD,EAAW,iBAAiB,CAAE,WAAAE,EAAY,aAAY,UAAAC,CAAU,CAAC,EAEvE,OAAOF,EAAS,GAAG,EAAE,qBACnB,uDAAuDC,CAAU,KACjE,CAAE,OAAQ,CAAE,UAAAC,CAAU,CAAE,CAC1B,CACF,CAAC,EAED,GAAG,+CAAgD,SAAY,CAC7DF,EAAS,IAAI,kBAAkB,CAC7B,iBAAkB,OAClB,MAAO,IACP,SAAU,GACZ,CAAC,EAED,MAAMI,EAAS,MAAML,EAAW,iBAAiB,CAC/C,WAAAE,EACA,aACA,UAAAC,CACF,CAAC,EAED,OAAOE,CAAM,EAAE,WACb,SAAM,CACJ,WAAAH,EACA,aACA,WAAY,IAAI,WAAW,CAAC,IAAM,GAAI,CAAC,EACvC,MAAO,IACP,SAAU,GACZ,CAAC,CACH,CACF,CAAC,EAED,GAAG,KAAK,CAAC,GAAI,IAAK,IAAK,OAAO,GAAG,CAAC,EAChC,yCACA,MAAOI,GAAa,CAClB,MAAMD,EAAS,MAAML,EAAW,iBAAiB,CAC/C,WAAAE,EACA,WAAYI,EACZ,UAAAH,CACF,CAAC,EACD,OAAOE,EAAO,OAAO,CAAC,EAAE,KAAK,EAAI,EACjC,OAAQA,EAAO,QAAQ,EAAY,OAAO,EAAE,QAAQ,YAAY,CAClE,CACF,EAEA,GAAG,qCAAsC,SAAY,CACnDJ,EAAS,IAAI,kBAAkB,CAAE,MAAO,GAAI,CAAQ,EAEpD,MAAMI,EAAS,MAAML,EAAW,iBAAiB,CAC/C,WAAAE,EACA,aACA,UAAAC,CACF,CAAC,EAED,OAAOE,EAAO,OAAO,CAAC,EAAE,KAAK,EAAI,EACjC,OAAQA,EAAO,QAAQ,EAAY,OAAO,EAAE,QAC1C,IAAI,OACF,OAAO,8EAA8EH,CAAU,KAAK,CAAU,KAChH,CACF,CACF,CAAC,EAED,GAAG,uCAAwC,SAAY,CACrDD,EAAS,IAAI,kBAAkB,IAAI,MAAM,KAAK,CAAC,EAE/C,MAAMI,EAAS,MAAML,EAAW,iBAAiB,CAC/C,WAAAE,EACA,aACA,UAAAC,CACF,CAAC,EAED,OAAOE,CAAM,EAAE,WACb,QACE,IAAI,MACF,kFACF,CACF,CACF,CACF,CAAC,CACH,CAAC",
6
+ "names": ["import_purify_ts", "import_HttpAltResolutionDataSource", "datasource", "httpMock", "altAddress", "challenge", "config", "result", "badIndex"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var l=Object.defineProperty;var s=Object.getOwnPropertyDescriptor;var p=Object.getOwnPropertyNames;var R=Object.prototype.hasOwnProperty;var c=(o,t)=>{for(var r in t)l(o,r,{get:t[r],enumerable:!0})},f=(o,t,r,a)=>{if(t&&typeof t=="object"||typeof t=="function")for(let e of p(t))!R.call(o,e)&&e!==r&&l(o,e,{get:()=>t[e],enumerable:!(a=s(t,e))||a.enumerable});return o};var A=o=>f(l({},"__esModule",{value:!0}),o);var x={};c(x,{altResolutionModuleFactory:()=>d});module.exports=A(x);var i=require("inversify"),u=require("../../../../modules/solana/alt-resolution/data/HttpAltResolutionDataSource"),n=require("../../../../modules/solana/alt-resolution/di/altResolutionTypes"),m=require("../../../../modules/solana/alt-resolution/domain/AltResolutionContextLoader");const d=()=>new i.ContainerModule(({bind:o})=>{o(n.altResolutionTypes.AltResolutionDataSource).to(u.HttpAltResolutionDataSource),o(n.altResolutionTypes.AltResolutionContextLoader).to(m.AltResolutionContextLoader)});0&&(module.exports={altResolutionModuleFactory});
2
+ //# sourceMappingURL=altResolutionModuleFactory.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/modules/solana/alt-resolution/di/altResolutionModuleFactory.ts"],
4
+ "sourcesContent": ["import { ContainerModule } from \"inversify\";\n\nimport { HttpAltResolutionDataSource } from \"@/modules/solana/alt-resolution/data/HttpAltResolutionDataSource\";\nimport { altResolutionTypes } from \"@/modules/solana/alt-resolution/di/altResolutionTypes\";\nimport { AltResolutionContextLoader } from \"@/modules/solana/alt-resolution/domain/AltResolutionContextLoader\";\n\nexport const altResolutionModuleFactory = () =>\n new ContainerModule(({ bind }) => {\n bind(altResolutionTypes.AltResolutionDataSource).to(\n HttpAltResolutionDataSource,\n );\n bind(altResolutionTypes.AltResolutionContextLoader).to(\n AltResolutionContextLoader,\n );\n });\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,gCAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAgC,qBAEhCC,EAA4C,4EAC5CC,EAAmC,iEACnCC,EAA2C,6EAEpC,MAAML,EAA6B,IACxC,IAAI,kBAAgB,CAAC,CAAE,KAAAM,CAAK,IAAM,CAChCA,EAAK,qBAAmB,uBAAuB,EAAE,GAC/C,6BACF,EACAA,EAAK,qBAAmB,0BAA0B,EAAE,GAClD,4BACF,CACF,CAAC",
6
+ "names": ["altResolutionModuleFactory_exports", "__export", "altResolutionModuleFactory", "__toCommonJS", "import_inversify", "import_HttpAltResolutionDataSource", "import_altResolutionTypes", "import_AltResolutionContextLoader", "bind"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var n=Object.defineProperty;var r=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var u=Object.prototype.hasOwnProperty;var i=(t,o)=>{for(var l in o)n(t,l,{get:o[l],enumerable:!0})},R=(t,o,l,a)=>{if(o&&typeof o=="object"||typeof o=="function")for(let e of s(o))!u.call(t,e)&&e!==l&&n(t,e,{get:()=>o[e],enumerable:!(a=r(o,e))||a.enumerable});return t};var A=t=>R(n({},"__esModule",{value:!0}),t);var c={};i(c,{altResolutionTypes:()=>S});module.exports=A(c);const S={AltResolutionDataSource:Symbol.for("AltResolutionDataSource"),AltResolutionContextLoader:Symbol.for("AltResolutionContextLoader")};0&&(module.exports={altResolutionTypes});
2
+ //# sourceMappingURL=altResolutionTypes.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/modules/solana/alt-resolution/di/altResolutionTypes.ts"],
4
+ "sourcesContent": ["export const altResolutionTypes = {\n AltResolutionDataSource: Symbol.for(\"AltResolutionDataSource\"),\n AltResolutionContextLoader: Symbol.for(\"AltResolutionContextLoader\"),\n};\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,wBAAAE,IAAA,eAAAC,EAAAH,GAAO,MAAME,EAAqB,CAChC,wBAAyB,OAAO,IAAI,yBAAyB,EAC7D,2BAA4B,OAAO,IAAI,4BAA4B,CACrE",
6
+ "names": ["altResolutionTypes_exports", "__export", "altResolutionTypes", "__toCommonJS"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var s=Object.defineProperty;var g=Object.getOwnPropertyDescriptor;var x=Object.getOwnPropertyNames;var I=Object.prototype.hasOwnProperty;var L=(l,e)=>{for(var t in e)s(l,t,{get:e[t],enumerable:!0})},h=(l,e,t,o)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of x(e))!I.call(l,r)&&r!==t&&s(l,r,{get:()=>e[r],enumerable:!(o=g(e,r))||o.enumerable});return l};var v=l=>h(s({},"__esModule",{value:!0}),l),m=(l,e,t,o)=>{for(var r=o>1?void 0:o?g(e,t):e,c=l.length-1,p;c>=0;c--)(p=l[c])&&(r=(o?p(e,t,r):p(r))||r);return o&&r&&s(e,t,r),r},d=(l,e)=>(t,o)=>e(t,o,l);var b={};L(b,{AltResolutionContextLoader:()=>a});module.exports=v(b);var i=require("inversify"),n=require("purify-ts"),y=require("../../../../config/di/configTypes"),f=require("../../../../modules/multichain/pki/di/pkiTypes"),S=require("../../../../modules/solana/alt-resolution/di/altResolutionTypes"),u=require("../../../../shared/model/ClearSignContext"),C=require("../../../../shared/utils/challengeBoundLoader"),A=require("../../../../shared/utils/deviceModelIdCodec"),R=require("../../../../shared/utils/uIntCodec");const T=[u.ClearSignContextType.SOLANA_ALT_RESOLUTION],P=n.Codec.interface({altAddress:n.string,entryIndex:R.u8Codec,challenge:n.string}),O=n.Codec.interface({deviceModelId:A.deviceModelIdCodec,requests:(0,n.array)(P)});let a=class{constructor(e,t,o){this.dataSource=e;this.certificateLoader=t;this.logger=o("AltResolutionContextLoader")}logger;canHandle(e,t){return T.every(o=>t.includes(o))?O.decode(e).caseOf({Left:()=>!1,Right:({requests:o})=>o.length>0&&o.every(r=>r.altAddress.length>0&&r.challenge.length>0)}):!1}async load(e){return(0,C.loadChallengeBoundContexts)({requests:e.requests,deviceModelId:e.deviceModelId,certificateLoader:this.certificateLoader,logger:this.logger,label:"ALT_RESOLUTION",fetch:t=>this.dataSource.getAltResolution(t),toContext:(t,o)=>{const r={descriptor:t.descriptor};return{type:u.ClearSignContextType.SOLANA_ALT_RESOLUTION,payload:r,certificate:o}},describe:t=>({altAddress:t.altAddress,entryIndex:t.entryIndex})})}};a=m([(0,i.injectable)(),d(0,(0,i.inject)(S.altResolutionTypes.AltResolutionDataSource)),d(1,(0,i.inject)(f.pkiTypes.PkiCertificateLoader)),d(2,(0,i.inject)(y.configTypes.ContextModuleLoggerFactory))],a);0&&(module.exports={AltResolutionContextLoader});
2
+ //# sourceMappingURL=AltResolutionContextLoader.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.ts"],
4
+ "sourcesContent": ["import {\n type DeviceModelId,\n type LoggerPublisherService,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { array, Codec, string } from \"purify-ts\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { pkiTypes } from \"@/modules/multichain/pki/di/pkiTypes\";\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport { type AltResolutionDataSource } from \"@/modules/solana/alt-resolution/data/AltResolutionDataSource\";\nimport { altResolutionTypes } from \"@/modules/solana/alt-resolution/di/altResolutionTypes\";\nimport { type SolanaAltResolutionPayload } from \"@/modules/solana/model/SolanaPayloads\";\nimport { type ContextLoader } from \"@/shared/domain/ContextLoader\";\nimport {\n type ClearSignContext,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\nimport { loadChallengeBoundContexts } from \"@/shared/utils/challengeBoundLoader\";\nimport { deviceModelIdCodec } from \"@/shared/utils/deviceModelIdCodec\";\nimport { u8Codec } from \"@/shared/utils/uIntCodec\";\n\nconst SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.SOLANA_ALT_RESOLUTION,\n];\n\nexport type SolanaAltResolutionRequest = {\n altAddress: string;\n entryIndex: number;\n challenge: string;\n};\n\nexport type SolanaAltResolutionContextInput = {\n deviceModelId: DeviceModelId;\n requests: SolanaAltResolutionRequest[];\n};\n\nconst altResolutionRequestCodec = Codec.interface({\n altAddress: string,\n entryIndex: u8Codec,\n challenge: string,\n});\n\nconst solanaAltResolutionInputCodec = Codec.interface({\n deviceModelId: deviceModelIdCodec,\n requests: array(altResolutionRequestCodec),\n});\n\n@injectable()\nexport class AltResolutionContextLoader\n implements ContextLoader<SolanaAltResolutionContextInput>\n{\n private readonly logger: LoggerPublisherService;\n\n constructor(\n @inject(altResolutionTypes.AltResolutionDataSource)\n private readonly dataSource: AltResolutionDataSource,\n @inject(pkiTypes.PkiCertificateLoader)\n private readonly certificateLoader: PkiCertificateLoader,\n @inject(configTypes.ContextModuleLoggerFactory)\n loggerFactory: (tag: string) => LoggerPublisherService,\n ) {\n this.logger = loggerFactory(\"AltResolutionContextLoader\");\n }\n\n public canHandle(\n input: unknown,\n expectedTypes: ClearSignContextType[],\n ): input is SolanaAltResolutionContextInput {\n if (!SUPPORTED_TYPES.every((t) => expectedTypes.includes(t))) return false;\n return solanaAltResolutionInputCodec.decode(input).caseOf({\n Left: () => false,\n Right: ({ requests }) =>\n requests.length > 0 &&\n requests.every(\n (r) => r.altAddress.length > 0 && r.challenge.length > 0,\n ),\n });\n }\n\n public async load(\n input: SolanaAltResolutionContextInput,\n ): Promise<ClearSignContext[]> {\n return loadChallengeBoundContexts({\n requests: input.requests,\n deviceModelId: input.deviceModelId,\n certificateLoader: this.certificateLoader,\n logger: this.logger,\n label: \"ALT_RESOLUTION\",\n fetch: (request) => this.dataSource.getAltResolution(request),\n toContext: (value, certificate) => {\n const payload: SolanaAltResolutionPayload = {\n descriptor: value.descriptor,\n };\n return {\n type: ClearSignContextType.SOLANA_ALT_RESOLUTION,\n payload,\n certificate,\n };\n },\n describe: (request) => ({\n altAddress: request.altAddress,\n entryIndex: request.entryIndex,\n }),\n });\n }\n}\n"],
5
+ "mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,gCAAAE,IAAA,eAAAC,EAAAH,GAIA,IAAAI,EAAmC,qBACnCC,EAAqC,qBAErCC,EAA4B,mCAC5BC,EAAyB,gDAGzBC,EAAmC,iEAGnCC,EAGO,2CACPC,EAA2C,+CAC3CC,EAAmC,6CACnCC,EAAwB,oCAExB,MAAMC,EAA0C,CAC9C,uBAAqB,qBACvB,EAaMC,EAA4B,QAAM,UAAU,CAChD,WAAY,SACZ,WAAY,UACZ,UAAW,QACb,CAAC,EAEKC,EAAgC,QAAM,UAAU,CACpD,cAAe,qBACf,YAAU,SAAMD,CAAyB,CAC3C,CAAC,EAGM,IAAME,EAAN,KAEP,CAGE,YAEmBC,EAEAC,EAEjBC,EACA,CALiB,gBAAAF,EAEA,uBAAAC,EAIjB,KAAK,OAASC,EAAc,4BAA4B,CAC1D,CAXiB,OAaV,UACLC,EACAC,EAC0C,CAC1C,OAAKR,EAAgB,MAAOS,GAAMD,EAAc,SAASC,CAAC,CAAC,EACpDP,EAA8B,OAAOK,CAAK,EAAE,OAAO,CACxD,KAAM,IAAM,GACZ,MAAO,CAAC,CAAE,SAAAG,CAAS,IACjBA,EAAS,OAAS,GAClBA,EAAS,MACN,GAAM,EAAE,WAAW,OAAS,GAAK,EAAE,UAAU,OAAS,CACzD,CACJ,CAAC,EARoE,EASvE,CAEA,MAAa,KACXH,EAC6B,CAC7B,SAAO,8BAA2B,CAChC,SAAUA,EAAM,SAChB,cAAeA,EAAM,cACrB,kBAAmB,KAAK,kBACxB,OAAQ,KAAK,OACb,MAAO,iBACP,MAAQI,GAAY,KAAK,WAAW,iBAAiBA,CAAO,EAC5D,UAAW,CAACC,EAAOC,IAAgB,CACjC,MAAMC,EAAsC,CAC1C,WAAYF,EAAM,UACpB,EACA,MAAO,CACL,KAAM,uBAAqB,sBAC3B,QAAAE,EACA,YAAAD,CACF,CACF,EACA,SAAWF,IAAa,CACtB,WAAYA,EAAQ,WACpB,WAAYA,EAAQ,UACtB,EACF,CAAC,CACH,CACF,EAzDaR,EAANY,EAAA,IADN,cAAW,EAOPC,EAAA,eAAO,qBAAmB,uBAAuB,GAEjDA,EAAA,eAAO,WAAS,oBAAoB,GAEpCA,EAAA,eAAO,cAAY,0BAA0B,IAVrCb",
6
+ "names": ["AltResolutionContextLoader_exports", "__export", "AltResolutionContextLoader", "__toCommonJS", "import_inversify", "import_purify_ts", "import_configTypes", "import_pkiTypes", "import_altResolutionTypes", "import_ClearSignContext", "import_challengeBoundLoader", "import_deviceModelIdCodec", "import_uIntCodec", "SUPPORTED_TYPES", "altResolutionRequestCodec", "solanaAltResolutionInputCodec", "AltResolutionContextLoader", "dataSource", "certificateLoader", "loggerFactory", "input", "expectedTypes", "t", "requests", "request", "value", "certificate", "payload", "__decorateClass", "__decorateParam"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var s=require("@ledgerhq/device-management-kit"),o=require("purify-ts"),n=require("../../../../shared/model/ClearSignContext"),y=require("./AltResolutionContextLoader");const p=()=>({debug:vi.fn(),info:vi.fn(),warn:vi.fn(),error:vi.fn(),subscribers:[]}),A={keyUsageNumber:8,payload:new Uint8Array([1])},a="AltA1111111111111111111111111111111111111111",d="AltB2222222222222222222222222222222222222222";describe("AltResolutionContextLoader",()=>{let c,l;beforeEach(()=>{vi.restoreAllMocks(),c={getAltResolution:vi.fn()},l={loadCertificate:vi.fn().mockResolvedValue(A)}});const r=()=>new y.AltResolutionContextLoader(c,l,p);describe("canHandle",()=>{it("returns true when SOLANA_ALT_RESOLUTION is requested with valid requests",()=>{expect(r().canHandle({deviceModelId:s.DeviceModelId.NANO_X,requests:[{altAddress:a,entryIndex:0,challenge:"c"}]},[n.ClearSignContextType.SOLANA_ALT_RESOLUTION])).toBe(!0)}),it("returns false when SOLANA_ALT_RESOLUTION is not requested",()=>{expect(r().canHandle({deviceModelId:s.DeviceModelId.NANO_X,requests:[{altAddress:a,entryIndex:0,challenge:"c"}]},[n.ClearSignContextType.SOLANA_TOKEN])).toBe(!1)}),it("rejects out-of-range entryIndex",()=>{const e=r(),t=[n.ClearSignContextType.SOLANA_ALT_RESOLUTION];expect(e.canHandle({requests:[{altAddress:a,entryIndex:-1,challenge:"c"}]},t)).toBe(!1),expect(e.canHandle({requests:[{altAddress:a,entryIndex:256,challenge:"c"}]},t)).toBe(!1),expect(e.canHandle({requests:[{altAddress:a,entryIndex:1.5,challenge:"c"}]},t)).toBe(!1)})}),describe("load",()=>{it("emits one SOLANA_ALT_RESOLUTION per request",async()=>{vi.spyOn(c,"getAltResolution").mockImplementation(async({altAddress:t,entryIndex:i})=>(0,o.Right)({altAddress:t,entryIndex:i,descriptor:new Uint8Array([i]),keyId:"alt_key",keyUsage:"coin_meta"}));const e=await r().load({deviceModelId:s.DeviceModelId.NANO_X,requests:[{altAddress:a,entryIndex:1,challenge:"c1"},{altAddress:d,entryIndex:7,challenge:"c2"}]});expect(e).toHaveLength(2),expect(e[0]).toMatchObject({type:n.ClearSignContextType.SOLANA_ALT_RESOLUTION,payload:{descriptor:new Uint8Array([1])},certificate:A}),expect(e[1]).toMatchObject({type:n.ClearSignContextType.SOLANA_ALT_RESOLUTION,payload:{descriptor:new Uint8Array([7])}})}),it("dedups certificate loads across requests sharing the same (keyId, keyUsage)",async()=>{vi.spyOn(c,"getAltResolution").mockImplementation(async({altAddress:e,entryIndex:t})=>(0,o.Right)({altAddress:e,entryIndex:t,descriptor:new Uint8Array([t]),keyId:"alt_key",keyUsage:"coin_meta"})),await r().load({deviceModelId:s.DeviceModelId.NANO_X,requests:[{altAddress:a,entryIndex:0,challenge:"c1"},{altAddress:a,entryIndex:1,challenge:"c2"},{altAddress:d,entryIndex:2,challenge:"c3"}]}),expect(l.loadCertificate).toHaveBeenCalledTimes(1)}),it("issues distinct cert loads when (keyId, keyUsage) differ",async()=>{vi.spyOn(c,"getAltResolution").mockImplementation(async({altAddress:e,entryIndex:t})=>(0,o.Right)({altAddress:e,entryIndex:t,descriptor:new Uint8Array([t]),keyId:e===a?"alt_key_a":"alt_key_b",keyUsage:"coin_meta"})),await r().load({deviceModelId:s.DeviceModelId.NANO_X,requests:[{altAddress:a,entryIndex:0,challenge:"c1"},{altAddress:d,entryIndex:1,challenge:"c2"}]}),expect(l.loadCertificate).toHaveBeenCalledTimes(2)}),it("emits an ERROR per failing request and keeps the others",async()=>{vi.spyOn(c,"getAltResolution").mockImplementation(async({altAddress:t})=>t===a?(0,o.Right)({altAddress:t,entryIndex:0,descriptor:new Uint8Array([170]),keyId:"k",keyUsage:"u"}):(0,o.Left)(new Error("upstream-500")));const e=await r().load({deviceModelId:s.DeviceModelId.NANO_X,requests:[{altAddress:a,entryIndex:0,challenge:"c1"},{altAddress:d,entryIndex:1,challenge:"c2"}]});expect(e[0]?.type).toBe(n.ClearSignContextType.SOLANA_ALT_RESOLUTION),expect(e[1]?.type).toBe(n.ClearSignContextType.ERROR)})})});
2
+ //# sourceMappingURL=AltResolutionContextLoader.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.test.ts"],
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\n\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport { type AltResolutionDataSource } from \"@/modules/solana/alt-resolution/data/AltResolutionDataSource\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\n\nimport { AltResolutionContextLoader } from \"./AltResolutionContextLoader\";\n\nconst mockLoggerFactory = () => ({\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n});\n\nconst mockCertificate = { keyUsageNumber: 8, payload: new Uint8Array([1]) };\nconst ALT_A = \"AltA1111111111111111111111111111111111111111\";\nconst ALT_B = \"AltB2222222222222222222222222222222222222222\";\n\ndescribe(\"AltResolutionContextLoader\", () => {\n let dataSource: AltResolutionDataSource;\n let certificateLoader: PkiCertificateLoader;\n\n beforeEach(() => {\n vi.restoreAllMocks();\n dataSource = {\n getAltResolution: vi.fn(),\n };\n certificateLoader = {\n loadCertificate: vi.fn().mockResolvedValue(mockCertificate),\n };\n });\n\n const makeLoader = () =>\n new AltResolutionContextLoader(\n dataSource,\n certificateLoader,\n mockLoggerFactory,\n );\n\n describe(\"canHandle\", () => {\n it(\"returns true when SOLANA_ALT_RESOLUTION is requested with valid requests\", () => {\n expect(\n makeLoader().canHandle(\n {\n deviceModelId: DeviceModelId.NANO_X,\n requests: [{ altAddress: ALT_A, entryIndex: 0, challenge: \"c\" }],\n },\n [ClearSignContextType.SOLANA_ALT_RESOLUTION],\n ),\n ).toBe(true);\n });\n\n it(\"returns false when SOLANA_ALT_RESOLUTION is not requested\", () => {\n expect(\n makeLoader().canHandle(\n {\n deviceModelId: DeviceModelId.NANO_X,\n requests: [{ altAddress: ALT_A, entryIndex: 0, challenge: \"c\" }],\n },\n [ClearSignContextType.SOLANA_TOKEN],\n ),\n ).toBe(false);\n });\n\n it(\"rejects out-of-range entryIndex\", () => {\n const loader = makeLoader();\n const types = [ClearSignContextType.SOLANA_ALT_RESOLUTION];\n expect(\n loader.canHandle(\n {\n requests: [{ altAddress: ALT_A, entryIndex: -1, challenge: \"c\" }],\n } as any,\n types,\n ),\n ).toBe(false);\n expect(\n loader.canHandle(\n {\n requests: [{ altAddress: ALT_A, entryIndex: 256, challenge: \"c\" }],\n } as any,\n types,\n ),\n ).toBe(false);\n expect(\n loader.canHandle(\n {\n requests: [{ altAddress: ALT_A, entryIndex: 1.5, challenge: \"c\" }],\n } as any,\n types,\n ),\n ).toBe(false);\n });\n });\n\n describe(\"load\", () => {\n it(\"emits one SOLANA_ALT_RESOLUTION per request\", async () => {\n vi.spyOn(dataSource, \"getAltResolution\").mockImplementation(\n async ({ altAddress, entryIndex }) =>\n Right({\n altAddress,\n entryIndex,\n descriptor: new Uint8Array([entryIndex]),\n keyId: \"alt_key\",\n keyUsage: \"coin_meta\",\n }),\n );\n\n const result = await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n requests: [\n { altAddress: ALT_A, entryIndex: 1, challenge: \"c1\" },\n { altAddress: ALT_B, entryIndex: 7, challenge: \"c2\" },\n ],\n });\n\n expect(result).toHaveLength(2);\n expect(result[0]).toMatchObject({\n type: ClearSignContextType.SOLANA_ALT_RESOLUTION,\n payload: { descriptor: new Uint8Array([1]) },\n certificate: mockCertificate,\n });\n expect(result[1]).toMatchObject({\n type: ClearSignContextType.SOLANA_ALT_RESOLUTION,\n payload: { descriptor: new Uint8Array([7]) },\n });\n });\n\n it(\"dedups certificate loads across requests sharing the same (keyId, keyUsage)\", async () => {\n vi.spyOn(dataSource, \"getAltResolution\").mockImplementation(\n async ({ altAddress, entryIndex }) =>\n Right({\n altAddress,\n entryIndex,\n descriptor: new Uint8Array([entryIndex]),\n keyId: \"alt_key\",\n keyUsage: \"coin_meta\",\n }),\n );\n\n await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n requests: [\n { altAddress: ALT_A, entryIndex: 0, challenge: \"c1\" },\n { altAddress: ALT_A, entryIndex: 1, challenge: \"c2\" },\n { altAddress: ALT_B, entryIndex: 2, challenge: \"c3\" },\n ],\n });\n\n expect(certificateLoader.loadCertificate).toHaveBeenCalledTimes(1);\n });\n\n it(\"issues distinct cert loads when (keyId, keyUsage) differ\", async () => {\n vi.spyOn(dataSource, \"getAltResolution\").mockImplementation(\n async ({ altAddress, entryIndex }) =>\n Right({\n altAddress,\n entryIndex,\n descriptor: new Uint8Array([entryIndex]),\n keyId: altAddress === ALT_A ? \"alt_key_a\" : \"alt_key_b\",\n keyUsage: \"coin_meta\",\n }),\n );\n\n await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n requests: [\n { altAddress: ALT_A, entryIndex: 0, challenge: \"c1\" },\n { altAddress: ALT_B, entryIndex: 1, challenge: \"c2\" },\n ],\n });\n\n expect(certificateLoader.loadCertificate).toHaveBeenCalledTimes(2);\n });\n\n it(\"emits an ERROR per failing request and keeps the others\", async () => {\n vi.spyOn(dataSource, \"getAltResolution\").mockImplementation(\n async ({ altAddress }) => {\n if (altAddress === ALT_A) {\n return Right({\n altAddress,\n entryIndex: 0,\n descriptor: new Uint8Array([0xaa]),\n keyId: \"k\",\n keyUsage: \"u\",\n });\n }\n return Left(new Error(\"upstream-500\"));\n },\n );\n\n const out = await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n requests: [\n { altAddress: ALT_A, entryIndex: 0, challenge: \"c1\" },\n { altAddress: ALT_B, entryIndex: 1, challenge: \"c2\" },\n ],\n });\n\n expect(out[0]?.type).toBe(ClearSignContextType.SOLANA_ALT_RESOLUTION);\n expect(out[1]?.type).toBe(ClearSignContextType.ERROR);\n });\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["import_device_management_kit", "import_purify_ts", "import_ClearSignContext", "import_AltResolutionContextLoader", "mockLoggerFactory", "mockCertificate", "ALT_A", "ALT_B", "dataSource", "certificateLoader", "makeLoader", "loader", "types", "altAddress", "entryIndex", "result", "out"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var a=Object.defineProperty;var p=Object.getOwnPropertyDescriptor;var d=Object.getOwnPropertyNames;var V=Object.prototype.hasOwnProperty;var f=(o,t)=>{for(var n in t)a(o,n,{get:t[n],enumerable:!0})},x=(o,t,n,e)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of d(t))!V.call(o,r)&&r!==n&&a(o,r,{get:()=>t[r],enumerable:!(e=p(t,r))||e.enumerable});return o};var C=o=>x(a({},"__esModule",{value:!0}),o);var l={};f(l,{enumVariantModuleFactory:()=>c});module.exports=C(l);var m=require("inversify"),i=require("../../../../modules/solana/enum-variant/di/enumVariantTypes"),u=require("../../../../modules/solana/enum-variant/domain/EnumVariantContextLoader");const c=()=>new m.ContainerModule(({bind:o})=>{o(i.enumVariantTypes.EnumVariantContextLoader).to(u.EnumVariantContextLoader)});0&&(module.exports={enumVariantModuleFactory});
2
+ //# sourceMappingURL=enumVariantModuleFactory.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/modules/solana/enum-variant/di/enumVariantModuleFactory.ts"],
4
+ "sourcesContent": ["import { ContainerModule } from \"inversify\";\n\nimport { enumVariantTypes } from \"@/modules/solana/enum-variant/di/enumVariantTypes\";\nimport { EnumVariantContextLoader } from \"@/modules/solana/enum-variant/domain/EnumVariantContextLoader\";\n\n// EnumVariantContextLoader shares InstructionInfoDataSource \u2014 its binding\n// is owned by `instructionInfoModuleFactory` and reused here via DI.\nexport const enumVariantModuleFactory = () =>\n new ContainerModule(({ bind }) => {\n bind(enumVariantTypes.EnumVariantContextLoader).to(\n EnumVariantContextLoader,\n );\n });\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,8BAAAE,IAAA,eAAAC,EAAAH,GAAA,IAAAI,EAAgC,qBAEhCC,EAAiC,6DACjCC,EAAyC,yEAIlC,MAAMJ,EAA2B,IACtC,IAAI,kBAAgB,CAAC,CAAE,KAAAK,CAAK,IAAM,CAChCA,EAAK,mBAAiB,wBAAwB,EAAE,GAC9C,0BACF,CACF,CAAC",
6
+ "names": ["enumVariantModuleFactory_exports", "__export", "enumVariantModuleFactory", "__toCommonJS", "import_inversify", "import_enumVariantTypes", "import_EnumVariantContextLoader", "bind"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var e=Object.defineProperty;var m=Object.getOwnPropertyDescriptor;var i=Object.getOwnPropertyNames;var u=Object.prototype.hasOwnProperty;var x=(t,n)=>{for(var o in n)e(t,o,{get:n[o],enumerable:!0})},V=(t,n,o,r)=>{if(n&&typeof n=="object"||typeof n=="function")for(let a of i(n))!u.call(t,a)&&a!==o&&e(t,a,{get:()=>n[a],enumerable:!(r=m(n,a))||r.enumerable});return t};var d=t=>V(e({},"__esModule",{value:!0}),t);var s={};x(s,{enumVariantTypes:()=>p});module.exports=d(s);const p={EnumVariantContextLoader:Symbol.for("EnumVariantContextLoader")};0&&(module.exports={enumVariantTypes});
2
+ //# sourceMappingURL=enumVariantTypes.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/modules/solana/enum-variant/di/enumVariantTypes.ts"],
4
+ "sourcesContent": ["export const enumVariantTypes = {\n EnumVariantContextLoader: Symbol.for(\"EnumVariantContextLoader\"),\n};\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,sBAAAE,IAAA,eAAAC,EAAAH,GAAO,MAAME,EAAmB,CAC9B,yBAA0B,OAAO,IAAI,0BAA0B,CACjE",
6
+ "names": ["enumVariantTypes_exports", "__export", "enumVariantTypes", "__toCommonJS"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var c=Object.defineProperty;var x=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var O=Object.prototype.hasOwnProperty;var U=(o,e)=>{for(var n in e)c(o,n,{get:e[n],enumerable:!0})},_=(o,e,n,t)=>{if(e&&typeof e=="object"||typeof e=="function")for(let a of k(e))!O.call(o,a)&&a!==n&&c(o,a,{get:()=>e[a],enumerable:!(t=x(e,a))||t.enumerable});return o};var b=o=>_(c({},"__esModule",{value:!0}),o),S=(o,e,n,t)=>{for(var a=t>1?void 0:t?x(e,n):e,s=o.length-1,d;s>=0;s--)(d=o[s])&&(a=(t?d(e,n,a):d(a))||a);return t&&a&&c(e,n,a),a},g=(o,e)=>(n,t)=>e(n,t,o);var j={};U(j,{EnumVariantContextLoader:()=>I});module.exports=b(j);var p=require("inversify"),i=require("purify-ts"),y=require("../../../../config/di/configTypes"),E=require("../../../../modules/multichain/pki/di/pkiTypes"),R=require("../../../../modules/multichain/pki/model/KeyId"),h=require("../../../../modules/multichain/pki/model/KeyUsage"),V=require("../../../../modules/solana/instruction-info/di/instructionInfoTypes"),m=require("../../../../shared/model/ClearSignContext"),A=require("../../../../shared/utils/certificateResult"),L=require("../../../../shared/utils/deviceModelIdCodec"),M=require("../../../../shared/utils/uIntCodec");const D=[m.ClearSignContextType.SOLANA_ENUM_VARIANT],$="solana-mainnet",K=i.Codec.interface({programId:i.string,enumId:i.string,variantIndex:M.u16Codec}),F=i.Codec.interface({deviceModelId:L.deviceModelIdCodec,selections:(0,i.array)(K),network:(0,i.optional)(i.string)});let I=class{constructor(e,n,t,a){this.dataSource=e;this.config=n;this.certificateLoader=t;this.logger=a("EnumVariantContextLoader")}logger;canHandle(e,n){return D.every(t=>n.includes(t))?F.decode(e).caseOf({Left:()=>!1,Right:({selections:t})=>t.length>0&&t.every(a=>a.programId.length>0&&a.enumId.length>0)}):!1}async load(e){const n=e.network||$,t=Array.from(new Set(e.selections.map(r=>r.programId)));this.logger.debug("[load] Fetching enum variants",{data:{network:n,programCount:t.length,selectionCount:e.selections.length}});const a=(0,A.loadCertificateResult)(this.certificateLoader,{keyId:R.KeyId.CalCalldataKey,keyUsage:h.KeyUsage.Calldata,targetDevice:e.deviceModelId}),s=Promise.all(t.map(r=>this.dataSource.getInstructionInfo({programId:r,network:n}))),[d,T]=await Promise.all([a,s]);if(!d.ok||!d.value){const r=d.ok?new Error("[ContextModule] EnumVariantContextLoader: certificate is missing"):d.error;return this.logger.warn("[load] ENUM_VARIANT certificate unavailable",{data:{error:r.message}}),e.selections.map(()=>({type:m.ClearSignContextType.ERROR,error:r}))}const w=d.value,N=new Map(t.map((r,l)=>[r,T[l]])),v=this.config.cal.mode??"prod";return e.selections.map(r=>{const l=N.get(r.programId);if(!l){const u=new Error(`[ContextModule] EnumVariantContextLoader: no CAL response for program ${r.programId}`);return this.logger.warn("[load] ENUM_VARIANT fetch failed",{data:{programId:r.programId,enumId:r.enumId,variantIndex:r.variantIndex,error:u.message}}),{type:m.ClearSignContextType.ERROR,error:u}}return l.caseOf({Left:u=>(this.logger.warn("[load] ENUM_VARIANT fetch failed",{data:{programId:r.programId,enumId:r.enumId,variantIndex:r.variantIndex,error:u.message}}),{type:m.ClearSignContextType.ERROR,error:u}),Right:u=>{const f=this.lookupVariant(u,r);if(!f){const C=new Error(`[ContextModule] EnumVariantContextLoader: CAL has no enum variant for (${r.programId}, ${r.enumId}, ${r.variantIndex})`);return this.logger.warn("[load] ENUM_VARIANT not found in CAL response",{data:{programId:r.programId,enumId:r.enumId,variantIndex:r.variantIndex}}),{type:m.ClearSignContextType.ERROR,error:C}}if(!f.descriptor.signature){const C=new Error(`[ContextModule] EnumVariantContextLoader: missing '${v}' signature for (${r.programId}, ${r.enumId}, ${r.variantIndex})`);return this.logger.warn("[load] ENUM_VARIANT missing signature",{data:{programId:r.programId,enumId:r.enumId,variantIndex:r.variantIndex,mode:v}}),{type:m.ClearSignContextType.ERROR,error:C}}const P={programId:r.programId,enumId:r.enumId,variantIndex:r.variantIndex,descriptor:f.descriptor};return{type:m.ClearSignContextType.SOLANA_ENUM_VARIANT,payload:P,certificate:w}}})})}lookupVariant(e,n){return e.enumVariants.find(t=>t.enumId===n.enumId&&t.variantIndex===n.variantIndex)}};I=S([(0,p.injectable)(),g(0,(0,p.inject)(V.instructionInfoTypes.InstructionInfoDataSource)),g(1,(0,p.inject)(y.configTypes.Config)),g(2,(0,p.inject)(E.pkiTypes.PkiCertificateLoader)),g(3,(0,p.inject)(y.configTypes.ContextModuleLoggerFactory))],I);0&&(module.exports={EnumVariantContextLoader});
2
+ //# sourceMappingURL=EnumVariantContextLoader.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/modules/solana/enum-variant/domain/EnumVariantContextLoader.ts"],
4
+ "sourcesContent": ["import {\n type DeviceModelId,\n type LoggerPublisherService,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { array, Codec, optional, string } from \"purify-ts\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { type ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\nimport { pkiTypes } from \"@/modules/multichain/pki/di/pkiTypes\";\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport { KeyId } from \"@/modules/multichain/pki/model/KeyId\";\nimport { KeyUsage } from \"@/modules/multichain/pki/model/KeyUsage\";\nimport {\n type InstructionInfoDataSource,\n type InstructionInfoResult,\n} from \"@/modules/solana/instruction-info/data/InstructionInfoDataSource\";\nimport { instructionInfoTypes } from \"@/modules/solana/instruction-info/di/instructionInfoTypes\";\nimport {\n type SolanaEnumVariantPayload,\n type SolanaInstructionEnumVariant,\n} from \"@/modules/solana/model/SolanaPayloads\";\nimport { type ContextLoader } from \"@/shared/domain/ContextLoader\";\nimport {\n type ClearSignContext,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\nimport { loadCertificateResult } from \"@/shared/utils/certificateResult\";\nimport { deviceModelIdCodec } from \"@/shared/utils/deviceModelIdCodec\";\nimport { u16Codec } from \"@/shared/utils/uIntCodec\";\n\nconst SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.SOLANA_ENUM_VARIANT,\n];\n\nconst NETWORK_DEFAULT = \"solana-mainnet\";\n\n/**\n * One enum-variant selection the caller wants resolved. `variantIndex` is\n * constrained to a u16 (0..=65535).\n */\nexport type SolanaEnumVariantSelection = {\n programId: string;\n enumId: string;\n variantIndex: number;\n};\n\nexport type SolanaEnumVariantContextInput = {\n deviceModelId: DeviceModelId;\n selections: SolanaEnumVariantSelection[];\n network?: string;\n};\n\nconst enumVariantSelectionCodec = Codec.interface({\n programId: string,\n enumId: string,\n variantIndex: u16Codec,\n});\n\nconst solanaEnumVariantInputCodec = Codec.interface({\n deviceModelId: deviceModelIdCodec,\n selections: array(enumVariantSelectionCodec),\n network: optional(string),\n});\n\n/**\n * Emits one SOLANA_ENUM_VARIANT context per `(programId, enumId,\n * variantIndex)` selection: fetches the CAL response for each distinct\n * program, looks up the matching variant, and emits only the selected ones.\n *\n * Shares {@link InstructionInfoDataSource} with\n * {@link InstructionInfoContextLoader}.\n */\n@injectable()\nexport class EnumVariantContextLoader\n implements ContextLoader<SolanaEnumVariantContextInput>\n{\n private readonly logger: LoggerPublisherService;\n\n constructor(\n @inject(instructionInfoTypes.InstructionInfoDataSource)\n private readonly dataSource: InstructionInfoDataSource,\n @inject(configTypes.Config)\n private readonly config: ContextModuleServiceConfig,\n @inject(pkiTypes.PkiCertificateLoader)\n private readonly certificateLoader: PkiCertificateLoader,\n @inject(configTypes.ContextModuleLoggerFactory)\n loggerFactory: (tag: string) => LoggerPublisherService,\n ) {\n this.logger = loggerFactory(\"EnumVariantContextLoader\");\n }\n\n public canHandle(\n input: unknown,\n expectedTypes: ClearSignContextType[],\n ): input is SolanaEnumVariantContextInput {\n if (!SUPPORTED_TYPES.every((t) => expectedTypes.includes(t))) return false;\n return solanaEnumVariantInputCodec.decode(input).caseOf({\n Left: () => false,\n Right: ({ selections }) =>\n selections.length > 0 &&\n selections.every((s) => s.programId.length > 0 && s.enumId.length > 0),\n });\n }\n\n public async load(\n input: SolanaEnumVariantContextInput,\n ): Promise<ClearSignContext[]> {\n const network = input.network || NETWORK_DEFAULT;\n const distinctProgramIds = Array.from(\n new Set(input.selections.map((s) => s.programId)),\n );\n\n this.logger.debug(\"[load] Fetching enum variants\", {\n data: {\n network,\n programCount: distinctProgramIds.length,\n selectionCount: input.selections.length,\n },\n });\n\n // Cert load and CAL fetches are independent \u2014 run them in parallel. A\n // PKI failure still degrades each selection to ERROR.\n const certPromise = loadCertificateResult(this.certificateLoader, {\n keyId: KeyId.CalCalldataKey,\n keyUsage: KeyUsage.Calldata,\n targetDevice: input.deviceModelId,\n });\n\n const dataPromise = Promise.all(\n distinctProgramIds.map((programId) =>\n this.dataSource.getInstructionInfo({ programId, network }),\n ),\n );\n\n const [certResult, results] = await Promise.all([certPromise, dataPromise]);\n\n if (!certResult.ok || !certResult.value) {\n const error = certResult.ok\n ? new Error(\n \"[ContextModule] EnumVariantContextLoader: certificate is missing\",\n )\n : certResult.error;\n this.logger.warn(\"[load] ENUM_VARIANT certificate unavailable\", {\n data: { error: error.message },\n });\n return input.selections.map(() => ({\n type: ClearSignContextType.ERROR,\n error,\n }));\n }\n const certificate = certResult.value;\n\n const programToEither = new Map(\n distinctProgramIds.map((programId, i) => [programId, results[i]!]),\n );\n\n const mode = this.config.cal.mode ?? \"prod\";\n\n return input.selections.map((selection) => {\n const either = programToEither.get(selection.programId);\n if (!either) {\n const error = new Error(\n `[ContextModule] EnumVariantContextLoader: no CAL response for program ${selection.programId}`,\n );\n this.logger.warn(\"[load] ENUM_VARIANT fetch failed\", {\n data: {\n programId: selection.programId,\n enumId: selection.enumId,\n variantIndex: selection.variantIndex,\n error: error.message,\n },\n });\n return { type: ClearSignContextType.ERROR, error };\n }\n\n return either.caseOf<ClearSignContext>({\n Left: (err) => {\n this.logger.warn(\"[load] ENUM_VARIANT fetch failed\", {\n data: {\n programId: selection.programId,\n enumId: selection.enumId,\n variantIndex: selection.variantIndex,\n error: err.message,\n },\n });\n return { type: ClearSignContextType.ERROR, error: err };\n },\n Right: (value) => {\n const variant = this.lookupVariant(value, selection);\n if (!variant) {\n const error = new Error(\n `[ContextModule] EnumVariantContextLoader: CAL has no enum variant for (${selection.programId}, ${selection.enumId}, ${selection.variantIndex})`,\n );\n this.logger.warn(\"[load] ENUM_VARIANT not found in CAL response\", {\n data: {\n programId: selection.programId,\n enumId: selection.enumId,\n variantIndex: selection.variantIndex,\n },\n });\n return { type: ClearSignContextType.ERROR, error };\n }\n\n // The mapper already picked the signature for the configured mode (or\n // left it empty when CAL has none for that mode).\n if (!variant.descriptor.signature) {\n const error = new Error(\n `[ContextModule] EnumVariantContextLoader: missing '${mode}' signature for (${selection.programId}, ${selection.enumId}, ${selection.variantIndex})`,\n );\n this.logger.warn(\"[load] ENUM_VARIANT missing signature\", {\n data: {\n programId: selection.programId,\n enumId: selection.enumId,\n variantIndex: selection.variantIndex,\n mode,\n },\n });\n return { type: ClearSignContextType.ERROR, error };\n }\n\n const payload: SolanaEnumVariantPayload = {\n programId: selection.programId,\n enumId: selection.enumId,\n variantIndex: selection.variantIndex,\n descriptor: variant.descriptor,\n };\n return {\n type: ClearSignContextType.SOLANA_ENUM_VARIANT,\n payload,\n certificate,\n };\n },\n });\n });\n }\n\n /**\n * Find the decoded enum variant for a selection. The data source flattens\n * `enum_variants` across all of the program's descriptors into a single list\n * (malformed `u16` keys already dropped), and CAL guarantees `(enumId,\n * variantIndex)` is unique across a program's instructions.\n */\n private lookupVariant(\n result: InstructionInfoResult,\n selection: SolanaEnumVariantSelection,\n ): SolanaInstructionEnumVariant | undefined {\n return result.enumVariants.find(\n (variant) =>\n variant.enumId === selection.enumId &&\n variant.variantIndex === selection.variantIndex,\n );\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["EnumVariantContextLoader_exports", "__export", "EnumVariantContextLoader", "__toCommonJS", "import_inversify", "import_purify_ts", "import_configTypes", "import_pkiTypes", "import_KeyId", "import_KeyUsage", "import_instructionInfoTypes", "import_ClearSignContext", "import_certificateResult", "import_deviceModelIdCodec", "import_uIntCodec", "SUPPORTED_TYPES", "NETWORK_DEFAULT", "enumVariantSelectionCodec", "solanaEnumVariantInputCodec", "EnumVariantContextLoader", "dataSource", "config", "certificateLoader", "loggerFactory", "input", "expectedTypes", "selections", "s", "network", "distinctProgramIds", "certPromise", "dataPromise", "programId", "certResult", "results", "error", "certificate", "programToEither", "i", "mode", "selection", "either", "err", "value", "variant", "payload", "result", "__decorateClass", "__decorateParam"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var r=require("@ledgerhq/device-management-kit"),i=require("purify-ts"),e=require("vitest"),s=require("../../../../shared/model/ClearSignContext"),u=require("./EnumVariantContextLoader");const g=()=>({debug:e.vi.fn(),info:e.vi.fn(),warn:e.vi.fn(),error:e.vi.fn(),subscribers:[]}),p={keyUsageNumber:8,payload:new Uint8Array([66])},I={cal:{url:"https://global.api.prd.ledger.com/cal/v1",mode:"prod",branch:"main"}},t="JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4",v="OtherProgram111111111111111111111111111111";function c(){return{programId:t,descriptors:{},enumVariants:[{enumId:"swap",variantIndex:46,descriptor:{data:"01_raydium_tlv",signature:"prodsig_v46"}},{enumId:"swap",variantIndex:12,descriptor:{data:"01_orca_tlv",signature:"prodsig_v12"}}]}}(0,e.describe)("EnumVariantContextLoader",()=>{let d,l;(0,e.beforeEach)(()=>{e.vi.restoreAllMocks(),d={getInstructionInfo:e.vi.fn()},l={loadCertificate:e.vi.fn().mockResolvedValue(p)}});const n=(a=I)=>new u.EnumVariantContextLoader(d,a,l,g);(0,e.describe)("canHandle",()=>{(0,e.it)("returns true when SOLANA_ENUM_VARIANT is requested and selections are valid",()=>{(0,e.expect)(n().canHandle({deviceModelId:r.DeviceModelId.NANO_X,selections:[{programId:t,enumId:"swap",variantIndex:46}]},[s.ClearSignContextType.SOLANA_ENUM_VARIANT])).toBe(!0)}),(0,e.it)("returns false when SOLANA_ENUM_VARIANT is not requested",()=>{(0,e.expect)(n().canHandle({deviceModelId:r.DeviceModelId.NANO_X,selections:[{programId:t,enumId:"swap",variantIndex:46}]},[s.ClearSignContextType.SOLANA_INSTRUCTION_INFO])).toBe(!1)}),e.it.each([-1,65536,1.5,"46",null])("rejects non-u16 variantIndex: %s",a=>{const o=n();(0,e.expect)(o.canHandle({deviceModelId:r.DeviceModelId.NANO_X,selections:[{programId:t,enumId:"swap",variantIndex:a}]},[s.ClearSignContextType.SOLANA_ENUM_VARIANT])).toBe(!1)}),(0,e.it)("rejects empty programId / enumId / selections",()=>{const a=n(),o=[s.ClearSignContextType.SOLANA_ENUM_VARIANT];(0,e.expect)(a.canHandle({selections:[]},o)).toBe(!1),(0,e.expect)(a.canHandle({selections:[{programId:"",enumId:"swap",variantIndex:1}]},o)).toBe(!1),(0,e.expect)(a.canHandle({selections:[{programId:t,enumId:"",variantIndex:1}]},o)).toBe(!1)})}),(0,e.describe)("load",()=>{(0,e.it)("emits one SOLANA_ENUM_VARIANT per selection with certificate",async()=>{e.vi.spyOn(d,"getInstructionInfo").mockResolvedValue((0,i.Right)(c()));const a=await n().load({deviceModelId:r.DeviceModelId.NANO_X,selections:[{programId:t,enumId:"swap",variantIndex:46},{programId:t,enumId:"swap",variantIndex:12}]});(0,e.expect)(a).toHaveLength(2),(0,e.expect)(a[0]).toMatchObject({type:s.ClearSignContextType.SOLANA_ENUM_VARIANT,payload:{programId:t,enumId:"swap",variantIndex:46,descriptor:{data:"01_raydium_tlv",signature:"prodsig_v46"}},certificate:p}),(0,e.expect)(a[1]).toMatchObject({payload:{variantIndex:12,descriptor:{data:"01_orca_tlv",signature:"prodsig_v12"}}})}),(0,e.it)("dedups CAL fetches across selections that share a programId",async()=>{const a=e.vi.spyOn(d,"getInstructionInfo").mockResolvedValue((0,i.Right)(c()));await n().load({deviceModelId:r.DeviceModelId.NANO_X,selections:[{programId:t,enumId:"swap",variantIndex:46},{programId:t,enumId:"swap",variantIndex:12}]}),(0,e.expect)(a).toHaveBeenCalledTimes(1)}),(0,e.it)("resolves a variant index > 255 (u16, disc_kind U16 enums)",async()=>{const a={programId:t,descriptors:{},enumVariants:[{enumId:"swap",variantIndex:300,descriptor:{data:"01_big_tlv",signature:"prodsig_v300"}}]};e.vi.spyOn(d,"getInstructionInfo").mockResolvedValue((0,i.Right)(a));const o=await n().load({deviceModelId:r.DeviceModelId.NANO_X,selections:[{programId:t,enumId:"swap",variantIndex:300}]});(0,e.expect)(o).toHaveLength(1),(0,e.expect)(o[0]?.type).toBe(s.ClearSignContextType.SOLANA_ENUM_VARIANT),(0,e.expect)(o[0].payload).toMatchObject({variantIndex:300,descriptor:{data:"01_big_tlv",signature:"prodsig_v300"}})}),(0,e.it)("emits ERROR when CAL has no matching variant for a selection",async()=>{e.vi.spyOn(d,"getInstructionInfo").mockResolvedValue((0,i.Right)(c()));const a=await n().load({deviceModelId:r.DeviceModelId.NANO_X,selections:[{programId:t,enumId:"swap",variantIndex:99}]});(0,e.expect)(a).toHaveLength(1),(0,e.expect)(a[0]?.type).toBe(s.ClearSignContextType.ERROR),(0,e.expect)(a[0].error.message).toMatch(/no enum variant/)}),(0,e.it)("emits ERROR when CAL fetch fails",async()=>{e.vi.spyOn(d,"getInstructionInfo").mockResolvedValue((0,i.Left)(new Error("upstream-500")));const a=await n().load({deviceModelId:r.DeviceModelId.NANO_X,selections:[{programId:v,enumId:"x",variantIndex:0}]});(0,e.expect)(a[0]?.type).toBe(s.ClearSignContextType.ERROR),(0,e.expect)(a[0].error.message).toBe("upstream-500")}),(0,e.it)("emits ERROR when configured signature mode is missing",async()=>{const a={programId:t,descriptors:{},enumVariants:[{enumId:"swap",variantIndex:46,descriptor:{data:"01_raydium_tlv",signature:""}}]};e.vi.spyOn(d,"getInstructionInfo").mockResolvedValue((0,i.Right)(a));const m=await n({...I,cal:{...I.cal,mode:"test"}}).load({deviceModelId:r.DeviceModelId.NANO_X,selections:[{programId:t,enumId:"swap",variantIndex:46}]});(0,e.expect)(m[0]?.type).toBe(s.ClearSignContextType.ERROR),(0,e.expect)(m[0].error.message).toMatch(/missing 'test' signature/)}),(0,e.it)("degrades every selection to ERROR when certificate loading fails",async()=>{e.vi.spyOn(l,"loadCertificate").mockRejectedValue(new Error("pki-down")),e.vi.spyOn(d,"getInstructionInfo").mockResolvedValue((0,i.Right)(c()));const a=await n().load({deviceModelId:r.DeviceModelId.NANO_X,selections:[{programId:t,enumId:"swap",variantIndex:46},{programId:t,enumId:"swap",variantIndex:12}]});(0,e.expect)(a).toHaveLength(2),(0,e.expect)(a.every(o=>o.type===s.ClearSignContextType.ERROR)).toBe(!0)}),(0,e.it)("falls back to default network when input.network is empty / missing",async()=>{const a=e.vi.spyOn(d,"getInstructionInfo").mockResolvedValue((0,i.Right)(c()));await n().load({deviceModelId:r.DeviceModelId.NANO_X,selections:[{programId:t,enumId:"swap",variantIndex:46}],network:""}),(0,e.expect)(a).toHaveBeenCalledWith({programId:t,network:"solana-mainnet"})})})});
2
+ //# sourceMappingURL=EnumVariantContextLoader.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/modules/solana/enum-variant/domain/EnumVariantContextLoader.test.ts"],
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { type ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport {\n type InstructionInfoDataSource,\n type InstructionInfoResult,\n} from \"@/modules/solana/instruction-info/data/InstructionInfoDataSource\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\n\nimport { EnumVariantContextLoader } from \"./EnumVariantContextLoader\";\n\nconst mockLoggerFactory = () => ({\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n});\n\nconst mockCertificate = {\n keyUsageNumber: 8,\n payload: new Uint8Array([0x42]),\n};\n\nconst mockConfig = {\n cal: {\n url: \"https://global.api.prd.ledger.com/cal/v1\",\n mode: \"prod\",\n branch: \"main\",\n },\n} as ContextModuleServiceConfig;\n\nconst JUPITER_PROGRAM = \"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4\";\nconst OTHER_PROGRAM = \"OtherProgram111111111111111111111111111111\";\n\n// The data source flattens enum variants into core models, with the signature\n// already picked for the configured mode.\nfunction makeJupiterWithVariants(): InstructionInfoResult {\n return {\n programId: JUPITER_PROGRAM,\n descriptors: {},\n enumVariants: [\n {\n enumId: \"swap\",\n variantIndex: 46,\n descriptor: { data: \"01_raydium_tlv\", signature: \"prodsig_v46\" },\n },\n {\n enumId: \"swap\",\n variantIndex: 12,\n descriptor: { data: \"01_orca_tlv\", signature: \"prodsig_v12\" },\n },\n ],\n };\n}\n\ndescribe(\"EnumVariantContextLoader\", () => {\n let dataSource: InstructionInfoDataSource;\n let certificateLoader: PkiCertificateLoader;\n\n beforeEach(() => {\n vi.restoreAllMocks();\n dataSource = {\n getInstructionInfo: vi.fn(),\n };\n certificateLoader = {\n loadCertificate: vi.fn().mockResolvedValue(mockCertificate),\n };\n });\n\n const makeLoader = (config = mockConfig) =>\n new EnumVariantContextLoader(\n dataSource,\n config,\n certificateLoader,\n mockLoggerFactory,\n );\n\n describe(\"canHandle\", () => {\n it(\"returns true when SOLANA_ENUM_VARIANT is requested and selections are valid\", () => {\n expect(\n makeLoader().canHandle(\n {\n deviceModelId: DeviceModelId.NANO_X,\n selections: [\n {\n programId: JUPITER_PROGRAM,\n enumId: \"swap\",\n variantIndex: 46,\n },\n ],\n },\n [ClearSignContextType.SOLANA_ENUM_VARIANT],\n ),\n ).toBe(true);\n });\n\n it(\"returns false when SOLANA_ENUM_VARIANT is not requested\", () => {\n expect(\n makeLoader().canHandle(\n {\n deviceModelId: DeviceModelId.NANO_X,\n selections: [\n { programId: JUPITER_PROGRAM, enumId: \"swap\", variantIndex: 46 },\n ],\n },\n [ClearSignContextType.SOLANA_INSTRUCTION_INFO],\n ),\n ).toBe(false);\n });\n\n it.each([-1, 65536, 1.5, \"46\", null])(\n \"rejects non-u16 variantIndex: %s\",\n (badIndex) => {\n const loader = makeLoader();\n expect(\n loader.canHandle(\n {\n deviceModelId: DeviceModelId.NANO_X,\n selections: [\n {\n programId: JUPITER_PROGRAM,\n enumId: \"swap\",\n variantIndex: badIndex,\n },\n ],\n } as any,\n [ClearSignContextType.SOLANA_ENUM_VARIANT],\n ),\n ).toBe(false);\n },\n );\n\n it(\"rejects empty programId / enumId / selections\", () => {\n const loader = makeLoader();\n const types = [ClearSignContextType.SOLANA_ENUM_VARIANT];\n expect(loader.canHandle({ selections: [] } as any, types)).toBe(false);\n expect(\n loader.canHandle(\n {\n selections: [{ programId: \"\", enumId: \"swap\", variantIndex: 1 }],\n } as any,\n types,\n ),\n ).toBe(false);\n expect(\n loader.canHandle(\n {\n selections: [\n { programId: JUPITER_PROGRAM, enumId: \"\", variantIndex: 1 },\n ],\n } as any,\n types,\n ),\n ).toBe(false);\n });\n });\n\n describe(\"load\", () => {\n it(\"emits one SOLANA_ENUM_VARIANT per selection with certificate\", async () => {\n vi.spyOn(dataSource, \"getInstructionInfo\").mockResolvedValue(\n Right(makeJupiterWithVariants()),\n );\n\n const result = await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n selections: [\n { programId: JUPITER_PROGRAM, enumId: \"swap\", variantIndex: 46 },\n { programId: JUPITER_PROGRAM, enumId: \"swap\", variantIndex: 12 },\n ],\n });\n\n expect(result).toHaveLength(2);\n expect(result[0]).toMatchObject({\n type: ClearSignContextType.SOLANA_ENUM_VARIANT,\n payload: {\n programId: JUPITER_PROGRAM,\n enumId: \"swap\",\n variantIndex: 46,\n descriptor: { data: \"01_raydium_tlv\", signature: \"prodsig_v46\" },\n },\n certificate: mockCertificate,\n });\n expect(result[1]).toMatchObject({\n payload: {\n variantIndex: 12,\n descriptor: { data: \"01_orca_tlv\", signature: \"prodsig_v12\" },\n },\n });\n });\n\n it(\"dedups CAL fetches across selections that share a programId\", async () => {\n const spy = vi\n .spyOn(dataSource, \"getInstructionInfo\")\n .mockResolvedValue(Right(makeJupiterWithVariants()));\n\n await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n selections: [\n { programId: JUPITER_PROGRAM, enumId: \"swap\", variantIndex: 46 },\n { programId: JUPITER_PROGRAM, enumId: \"swap\", variantIndex: 12 },\n ],\n });\n\n expect(spy).toHaveBeenCalledTimes(1);\n });\n\n it(\"resolves a variant index > 255 (u16, disc_kind U16 enums)\", async () => {\n const result: InstructionInfoResult = {\n programId: JUPITER_PROGRAM,\n descriptors: {},\n enumVariants: [\n {\n enumId: \"swap\",\n variantIndex: 300,\n descriptor: { data: \"01_big_tlv\", signature: \"prodsig_v300\" },\n },\n ],\n };\n vi.spyOn(dataSource, \"getInstructionInfo\").mockResolvedValue(\n Right(result),\n );\n\n const out = await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n selections: [\n { programId: JUPITER_PROGRAM, enumId: \"swap\", variantIndex: 300 },\n ],\n });\n\n expect(out).toHaveLength(1);\n expect(out[0]?.type).toBe(ClearSignContextType.SOLANA_ENUM_VARIANT);\n expect((out[0] as any).payload).toMatchObject({\n variantIndex: 300,\n descriptor: { data: \"01_big_tlv\", signature: \"prodsig_v300\" },\n });\n });\n\n it(\"emits ERROR when CAL has no matching variant for a selection\", async () => {\n vi.spyOn(dataSource, \"getInstructionInfo\").mockResolvedValue(\n Right(makeJupiterWithVariants()),\n );\n\n const result = await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n selections: [\n { programId: JUPITER_PROGRAM, enumId: \"swap\", variantIndex: 99 },\n ],\n });\n\n expect(result).toHaveLength(1);\n expect(result[0]?.type).toBe(ClearSignContextType.ERROR);\n expect((result[0] as any).error.message).toMatch(/no enum variant/);\n });\n\n it(\"emits ERROR when CAL fetch fails\", async () => {\n vi.spyOn(dataSource, \"getInstructionInfo\").mockResolvedValue(\n Left(new Error(\"upstream-500\")),\n );\n\n const result = await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n selections: [\n { programId: OTHER_PROGRAM, enumId: \"x\", variantIndex: 0 },\n ],\n });\n\n expect(result[0]?.type).toBe(ClearSignContextType.ERROR);\n expect((result[0] as any).error.message).toBe(\"upstream-500\");\n });\n\n it(\"emits ERROR when configured signature mode is missing\", async () => {\n // The mapper leaves the signature empty when CAL has none for the mode.\n const result: InstructionInfoResult = {\n programId: JUPITER_PROGRAM,\n descriptors: {},\n enumVariants: [\n {\n enumId: \"swap\",\n variantIndex: 46,\n descriptor: { data: \"01_raydium_tlv\", signature: \"\" },\n },\n ],\n };\n vi.spyOn(dataSource, \"getInstructionInfo\").mockResolvedValue(\n Right(result),\n );\n\n const loader = makeLoader({\n ...mockConfig,\n cal: { ...mockConfig.cal, mode: \"test\" },\n } as any);\n\n const out = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n selections: [\n { programId: JUPITER_PROGRAM, enumId: \"swap\", variantIndex: 46 },\n ],\n });\n\n expect(out[0]?.type).toBe(ClearSignContextType.ERROR);\n expect((out[0] as any).error.message).toMatch(/missing 'test' signature/);\n });\n\n it(\"degrades every selection to ERROR when certificate loading fails\", async () => {\n vi.spyOn(certificateLoader, \"loadCertificate\").mockRejectedValue(\n new Error(\"pki-down\"),\n );\n // Data fetches run in parallel with cert load; resolve so awaits settle.\n vi.spyOn(dataSource, \"getInstructionInfo\").mockResolvedValue(\n Right(makeJupiterWithVariants()),\n );\n\n const out = await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n selections: [\n { programId: JUPITER_PROGRAM, enumId: \"swap\", variantIndex: 46 },\n { programId: JUPITER_PROGRAM, enumId: \"swap\", variantIndex: 12 },\n ],\n });\n\n expect(out).toHaveLength(2);\n expect(out.every((c) => c.type === ClearSignContextType.ERROR)).toBe(\n true,\n );\n });\n\n it(\"falls back to default network when input.network is empty / missing\", async () => {\n const spy = vi\n .spyOn(dataSource, \"getInstructionInfo\")\n .mockResolvedValue(Right(makeJupiterWithVariants()));\n\n await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n selections: [\n { programId: JUPITER_PROGRAM, enumId: \"swap\", variantIndex: 46 },\n ],\n network: \"\",\n });\n\n expect(spy).toHaveBeenCalledWith({\n programId: JUPITER_PROGRAM,\n network: \"solana-mainnet\",\n });\n });\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["import_device_management_kit", "import_purify_ts", "import_vitest", "import_ClearSignContext", "import_EnumVariantContextLoader", "mockLoggerFactory", "mockCertificate", "mockConfig", "JUPITER_PROGRAM", "OTHER_PROGRAM", "makeJupiterWithVariants", "dataSource", "certificateLoader", "makeLoader", "config", "badIndex", "loader", "types", "result", "spy", "out", "c"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var l=Object.defineProperty;var C=Object.getOwnPropertyDescriptor;var S=Object.getOwnPropertyNames;var T=Object.prototype.hasOwnProperty;var M=(n,t)=>{for(var e in t)l(n,e,{get:t[e],enumerable:!0})},k=(n,t,e,i)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of S(t))!T.call(n,o)&&o!==e&&l(n,o,{get:()=>t[o],enumerable:!(i=C(t,o))||i.enumerable});return n};var b=n=>k(l({},"__esModule",{value:!0}),n),g=(n,t,e,i)=>{for(var o=i>1?void 0:i?C(t,e):t,s=n.length-1,r;s>=0;s--)(r=n[s])&&(o=(i?r(t,e,o):r(o))||o);return i&&o&&l(t,e,o),o},I=(n,t)=>(e,i)=>t(e,i,n);var P={};M(P,{HttpInstructionInfoDataSource:()=>u});module.exports=b(P);var f=require("inversify"),a=require("purify-ts"),E=require("../../../../config/di/configTypes"),m=require("../../../../modules/solana/model/SolanaTransactionScanChainId"),y=require("../../../../shared/network/di/networkTypes"),D=require("./InstructionInfoDto"),p=require("./InstructionInfoMapper");const x={"solana-mainnet":m.SolanaTransactionScanChainId.MAINNET,"solana-devnet":m.SolanaTransactionScanChainId.DEVNET,"solana-testnet":m.SolanaTransactionScanChainId.TESTNET};let u=class{constructor(t,e){this.config=t;this.http=e}async getInstructionInfo({programId:t,network:e}){const i=x[e]??m.SolanaTransactionScanChainId.MAINNET;let o;try{o=await this.http.get(`${this.config.cal.url}/solana_programs`,{params:{id:t,chain_id:i,output:"id,chain_id,instructions",ref:`branch:${this.config.cal.branch}`}})}catch(r){const d=r instanceof Error?r.message:String(r);return(0,a.Left)(new Error(`[ContextModule] HttpInstructionInfoDataSource: Failed to fetch instruction descriptors: ${d}`))}if(!Array.isArray(o)||o.length===0)return(0,a.Left)(new Error(`[ContextModule] HttpInstructionInfoDataSource: empty response for program ${t}`));const s=o.find(r=>r!=null&&typeof r=="object"&&r.id===t);return s===void 0?(0,a.Left)(new Error(`[ContextModule] HttpInstructionInfoDataSource: no descriptors for program ${t}`)):D.calInstructionProgramCodec.decode(s).caseOf({Left:r=>(0,a.Left)(new Error(`[ContextModule] HttpInstructionInfoDataSource: malformed descriptors for program ${t}: ${r}`)),Right:()=>{const r=this.config.cal.mode??"prod",d=s.instructions,h=Object.fromEntries(d.map(c=>[c.discriminator_hex,c])),w=Object.fromEntries(Object.entries(h).map(([c,N])=>[c,(0,p.toInstructionInfoPayload)(t,c,N,r)]));return(0,a.Right)({programId:t,descriptors:w,enumVariants:(0,p.toProgramEnumVariants)(h,r)})}})}};u=g([(0,f.injectable)(),I(0,(0,f.inject)(E.configTypes.Config)),I(1,(0,f.inject)(y.networkTypes.NetworkClient))],u);0&&(module.exports={HttpInstructionInfoDataSource});
2
+ //# sourceMappingURL=HttpInstructionInfoDataSource.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.ts"],
4
+ "sourcesContent": ["import { DmkNetworkClient } from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { Either, Left, Right } from \"purify-ts\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { type ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\nimport { SolanaTransactionScanChainId } from \"@/modules/solana/model/SolanaTransactionScanChainId\";\nimport { networkTypes } from \"@/shared/network/di/networkTypes\";\n\nimport {\n GetInstructionInfoParams,\n InstructionInfoDataSource,\n InstructionInfoResult,\n} from \"./InstructionInfoDataSource\";\nimport {\n type CalInstructionDescriptorDto,\n calInstructionProgramCodec,\n type CalInstructionProgramDto,\n} from \"./InstructionInfoDto\";\nimport {\n type CalMode,\n toInstructionInfoPayload,\n toProgramEnumVariants,\n} from \"./InstructionInfoMapper\";\n\n// Maps the DMK network label to the numeric CAL `chain_id` (the extended\n// Solana network ids 900/901/902). Unknown labels fall back to mainnet.\nconst CHAIN_ID_BY_NETWORK: Record<string, SolanaTransactionScanChainId> = {\n \"solana-mainnet\": SolanaTransactionScanChainId.MAINNET,\n \"solana-devnet\": SolanaTransactionScanChainId.DEVNET,\n \"solana-testnet\": SolanaTransactionScanChainId.TESTNET,\n};\n\n@injectable()\nexport class HttpInstructionInfoDataSource\n implements InstructionInfoDataSource\n{\n constructor(\n @inject(configTypes.Config)\n private readonly config: ContextModuleServiceConfig,\n @inject(networkTypes.NetworkClient)\n private readonly http: DmkNetworkClient,\n ) {}\n\n public async getInstructionInfo({\n programId,\n network,\n }: GetInstructionInfoParams): Promise<Either<Error, InstructionInfoResult>> {\n const chainId =\n CHAIN_ID_BY_NETWORK[network] ?? SolanaTransactionScanChainId.MAINNET;\n let data: unknown;\n try {\n data = await this.http.get(`${this.config.cal.url}/solana_programs`, {\n params: {\n id: programId,\n chain_id: chainId,\n output: \"id,chain_id,instructions\",\n ref: `branch:${this.config.cal.branch}`,\n },\n });\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n return Left(\n new Error(\n `[ContextModule] HttpInstructionInfoDataSource: Failed to fetch instruction descriptors: ${reason}`,\n ),\n );\n }\n\n if (!Array.isArray(data) || data.length === 0) {\n return Left(\n new Error(\n `[ContextModule] HttpInstructionInfoDataSource: empty response for program ${programId}`,\n ),\n );\n }\n\n // Select the program object whose `id` matches the requested `programId`\n // (the response is an array, one object per requested id).\n const program = data.find(\n (entry): entry is { id: unknown } =>\n entry != null &&\n typeof entry === \"object\" &&\n (entry as { id?: unknown }).id === programId,\n );\n if (program === undefined) {\n return Left(\n new Error(\n `[ContextModule] HttpInstructionInfoDataSource: no descriptors for program ${programId}`,\n ),\n );\n }\n\n // Validate the program shape so the mapper can dereference `descriptor` /\n // `enum_variants` without runtime-throwing on a malformed CAL payload. A\n // malformed program degrades to a per-program ERROR rather than rejecting\n // the batch. On success we transform each validated DTO into the core\n // payload so the loader never sees the CAL DTO shapes.\n return calInstructionProgramCodec\n .decode(program)\n .caseOf<Either<Error, InstructionInfoResult>>({\n Left: (error) =>\n Left(\n new Error(\n `[ContextModule] HttpInstructionInfoDataSource: malformed descriptors for program ${programId}: ${error}`,\n ),\n ),\n Right: () => {\n const mode: CalMode = this.config.cal.mode ?? \"prod\";\n // The codec strips undeclared fields, so we key the original\n // (full) instruction objects by `discriminator_hex` \u2014 the cast is\n // justified now that the shape has been validated.\n const instructions = (program as CalInstructionProgramDto)\n .instructions;\n const descriptorsByDiscriminator: Record<\n string,\n CalInstructionDescriptorDto\n > = Object.fromEntries(\n instructions.map((dto) => [dto.discriminator_hex, dto]),\n );\n const mapped = Object.fromEntries(\n Object.entries(descriptorsByDiscriminator).map(\n ([discriminator, dto]) => [\n discriminator,\n toInstructionInfoPayload(programId, discriminator, dto, mode),\n ],\n ),\n );\n return Right({\n programId,\n descriptors: mapped,\n enumVariants: toProgramEnumVariants(\n descriptorsByDiscriminator,\n mode,\n ),\n });\n },\n });\n }\n}\n"],
5
+ "mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,mCAAAE,IAAA,eAAAC,EAAAH,GACA,IAAAI,EAAmC,qBACnCC,EAAoC,qBAEpCC,EAA4B,mCAE5BC,EAA6C,+DAC7CC,EAA6B,4CAO7BC,EAIO,gCACPC,EAIO,mCAIP,MAAMC,EAAoE,CACxE,iBAAkB,+BAA6B,QAC/C,gBAAiB,+BAA6B,OAC9C,iBAAkB,+BAA6B,OACjD,EAGO,IAAMC,EAAN,KAEP,CACE,YAEmBC,EAEAC,EACjB,CAHiB,YAAAD,EAEA,UAAAC,CAChB,CAEH,MAAa,mBAAmB,CAC9B,UAAAC,EACA,QAAAC,CACF,EAA4E,CAC1E,MAAMC,EACJN,EAAoBK,CAAO,GAAK,+BAA6B,QAC/D,IAAIE,EACJ,GAAI,CACFA,EAAO,MAAM,KAAK,KAAK,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,mBAAoB,CACnE,OAAQ,CACN,GAAIH,EACJ,SAAUE,EACV,OAAQ,2BACR,IAAK,UAAU,KAAK,OAAO,IAAI,MAAM,EACvC,CACF,CAAC,CACH,OAASE,EAAO,CACd,MAAMC,EAASD,aAAiB,MAAQA,EAAM,QAAU,OAAOA,CAAK,EACpE,SAAO,QACL,IAAI,MACF,2FAA2FC,CAAM,EACnG,CACF,CACF,CAEA,GAAI,CAAC,MAAM,QAAQF,CAAI,GAAKA,EAAK,SAAW,EAC1C,SAAO,QACL,IAAI,MACF,6EAA6EH,CAAS,EACxF,CACF,EAKF,MAAMM,EAAUH,EAAK,KAClBI,GACCA,GAAS,MACT,OAAOA,GAAU,UAChBA,EAA2B,KAAOP,CACvC,EACA,OAAIM,IAAY,UACP,QACL,IAAI,MACF,6EAA6EN,CAAS,EACxF,CACF,EAQK,6BACJ,OAAOM,CAAO,EACd,OAA6C,CAC5C,KAAOF,MACL,QACE,IAAI,MACF,oFAAoFJ,CAAS,KAAKI,CAAK,EACzG,CACF,EACF,MAAO,IAAM,CACX,MAAMI,EAAgB,KAAK,OAAO,IAAI,MAAQ,OAIxCC,EAAgBH,EACnB,aACGI,EAGF,OAAO,YACTD,EAAa,IAAKE,GAAQ,CAACA,EAAI,kBAAmBA,CAAG,CAAC,CACxD,EACMC,EAAS,OAAO,YACpB,OAAO,QAAQF,CAA0B,EAAE,IACzC,CAAC,CAACG,EAAeF,CAAG,IAAM,CACxBE,KACA,4BAAyBb,EAAWa,EAAeF,EAAKH,CAAI,CAC9D,CACF,CACF,EACA,SAAO,SAAM,CACX,UAAAR,EACA,YAAaY,EACb,gBAAc,yBACZF,EACAF,CACF,CACF,CAAC,CACH,CACF,CAAC,CACL,CACF,EAzGaX,EAANiB,EAAA,IADN,cAAW,EAKPC,EAAA,eAAO,cAAY,MAAM,GAEzBA,EAAA,eAAO,eAAa,aAAa,IANzBlB",
6
+ "names": ["HttpInstructionInfoDataSource_exports", "__export", "HttpInstructionInfoDataSource", "__toCommonJS", "import_inversify", "import_purify_ts", "import_configTypes", "import_SolanaTransactionScanChainId", "import_networkTypes", "import_InstructionInfoDto", "import_InstructionInfoMapper", "CHAIN_ID_BY_NETWORK", "HttpInstructionInfoDataSource", "config", "http", "programId", "network", "chainId", "data", "error", "reason", "program", "entry", "mode", "instructions", "descriptorsByDiscriminator", "dto", "mapped", "discriminator", "__decorateClass", "__decorateParam"]
7
+ }