@ledgerhq/context-module 2.1.0 → 2.2.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 (415) hide show
  1. package/lib/cjs/package.json +2 -2
  2. package/lib/cjs/src/DefaultContextModule.js +1 -1
  3. package/lib/cjs/src/DefaultContextModule.js.map +3 -3
  4. package/lib/cjs/src/di.js +1 -1
  5. package/lib/cjs/src/di.js.map +3 -3
  6. package/lib/cjs/src/index.js +1 -1
  7. package/lib/cjs/src/index.js.map +2 -2
  8. package/lib/cjs/src/modules/multichain/pki/model/KeyId.js +1 -1
  9. package/lib/cjs/src/modules/multichain/pki/model/KeyId.js.map +2 -2
  10. package/lib/cjs/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.js +1 -1
  11. package/lib/cjs/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.js.map +3 -3
  12. package/lib/cjs/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.test.js +1 -1
  13. package/lib/cjs/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.test.js.map +3 -3
  14. package/lib/cjs/src/modules/solana/alt-resolution/data/AltResolutionDataSource.js +2 -0
  15. package/lib/cjs/src/modules/solana/alt-resolution/data/AltResolutionDataSource.js.map +7 -0
  16. package/lib/cjs/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.js +2 -0
  17. package/lib/cjs/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.js.map +7 -0
  18. package/lib/cjs/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.test.js +2 -0
  19. package/lib/cjs/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.test.js.map +7 -0
  20. package/lib/cjs/src/modules/solana/alt-resolution/di/altResolutionModuleFactory.js +2 -0
  21. package/lib/cjs/src/modules/solana/alt-resolution/di/altResolutionModuleFactory.js.map +7 -0
  22. package/lib/cjs/src/modules/solana/alt-resolution/di/altResolutionTypes.js +2 -0
  23. package/lib/cjs/src/modules/solana/alt-resolution/di/altResolutionTypes.js.map +7 -0
  24. package/lib/cjs/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.js +2 -0
  25. package/lib/cjs/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.js.map +7 -0
  26. package/lib/cjs/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.test.js +2 -0
  27. package/lib/cjs/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.test.js.map +7 -0
  28. package/lib/cjs/src/modules/solana/enum-variant/di/enumVariantModuleFactory.js +2 -0
  29. package/lib/cjs/src/modules/solana/enum-variant/di/enumVariantModuleFactory.js.map +7 -0
  30. package/lib/cjs/src/modules/solana/enum-variant/di/enumVariantTypes.js +2 -0
  31. package/lib/cjs/src/modules/solana/enum-variant/di/enumVariantTypes.js.map +7 -0
  32. package/lib/cjs/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.js +2 -0
  33. package/lib/cjs/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.js.map +7 -0
  34. package/lib/cjs/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.test.js +2 -0
  35. package/lib/cjs/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.test.js.map +7 -0
  36. package/lib/cjs/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.js +2 -0
  37. package/lib/cjs/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.js.map +7 -0
  38. package/lib/cjs/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.test.js +2 -0
  39. package/lib/cjs/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.test.js.map +7 -0
  40. package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoDataSource.js +2 -0
  41. package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoDataSource.js.map +7 -0
  42. package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoDto.js +2 -0
  43. package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoDto.js.map +7 -0
  44. package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoMapper.js +2 -0
  45. package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoMapper.js.map +7 -0
  46. package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoMapper.test.js +2 -0
  47. package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoMapper.test.js.map +7 -0
  48. package/lib/cjs/src/modules/solana/instruction-info/di/instructionInfoModuleFactory.js +2 -0
  49. package/lib/cjs/src/modules/solana/instruction-info/di/instructionInfoModuleFactory.js.map +7 -0
  50. package/lib/cjs/src/modules/solana/instruction-info/di/instructionInfoTypes.js +2 -0
  51. package/lib/cjs/src/modules/solana/instruction-info/di/instructionInfoTypes.js.map +7 -0
  52. package/lib/cjs/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.js +2 -0
  53. package/lib/cjs/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.js.map +7 -0
  54. package/lib/cjs/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.test.js +2 -0
  55. package/lib/cjs/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.test.js.map +7 -0
  56. package/lib/cjs/src/modules/solana/model/SolanaClearSignContext.js +1 -1
  57. package/lib/cjs/src/modules/solana/model/SolanaClearSignContext.js.map +3 -3
  58. package/lib/cjs/src/modules/solana/model/SolanaContextTypes.js +1 -1
  59. package/lib/cjs/src/modules/solana/model/SolanaContextTypes.js.map +1 -1
  60. package/lib/cjs/src/modules/solana/model/SolanaPayloads.js +1 -1
  61. package/lib/cjs/src/modules/solana/model/SolanaPayloads.js.map +3 -3
  62. package/lib/cjs/src/modules/solana/model/SolanaTransactionScanChainId.js +1 -1
  63. package/lib/cjs/src/modules/solana/model/SolanaTransactionScanChainId.js.map +2 -2
  64. package/lib/cjs/src/modules/solana/owner-info/domain/OwnerInfoContextLoader.js +1 -1
  65. package/lib/cjs/src/modules/solana/owner-info/domain/OwnerInfoContextLoader.js.map +2 -2
  66. package/lib/cjs/src/modules/solana/owner-info/domain/OwnerInfoContextLoader.test.js +1 -1
  67. package/lib/cjs/src/modules/solana/owner-info/domain/OwnerInfoContextLoader.test.js.map +2 -2
  68. package/lib/cjs/src/modules/solana/owner-info/domain/solanaContextTypes.js +1 -1
  69. package/lib/cjs/src/modules/solana/owner-info/domain/solanaContextTypes.js.map +1 -1
  70. package/lib/cjs/src/modules/solana/token/domain/TokenContextLoader.js +1 -1
  71. package/lib/cjs/src/modules/solana/token/domain/TokenContextLoader.js.map +3 -3
  72. package/lib/cjs/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.js +2 -0
  73. package/lib/cjs/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.js.map +7 -0
  74. package/lib/cjs/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.test.js +2 -0
  75. package/lib/cjs/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.test.js.map +7 -0
  76. package/lib/cjs/src/modules/solana/token-account-state/data/TokenAccountStateDataSource.js +2 -0
  77. package/lib/cjs/src/modules/solana/token-account-state/data/TokenAccountStateDataSource.js.map +7 -0
  78. package/lib/cjs/src/modules/solana/token-account-state/di/tokenAccountStateModuleFactory.js +2 -0
  79. package/lib/cjs/src/modules/solana/token-account-state/di/tokenAccountStateModuleFactory.js.map +7 -0
  80. package/lib/cjs/src/modules/solana/token-account-state/di/tokenAccountStateTypes.js +2 -0
  81. package/lib/cjs/src/modules/solana/token-account-state/di/tokenAccountStateTypes.js.map +7 -0
  82. package/lib/cjs/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.js +2 -0
  83. package/lib/cjs/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.js.map +7 -0
  84. package/lib/cjs/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.test.js +2 -0
  85. package/lib/cjs/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.test.js.map +7 -0
  86. package/lib/cjs/src/modules/solana/token-info/data/HttpTokenInfoDataSource.js +2 -0
  87. package/lib/cjs/src/modules/solana/token-info/data/HttpTokenInfoDataSource.js.map +7 -0
  88. package/lib/cjs/src/modules/solana/token-info/data/HttpTokenInfoDataSource.test.js +2 -0
  89. package/lib/cjs/src/modules/solana/token-info/data/HttpTokenInfoDataSource.test.js.map +7 -0
  90. package/lib/cjs/src/modules/solana/token-info/data/TokenInfoDataSource.js +2 -0
  91. package/lib/cjs/src/modules/solana/token-info/data/TokenInfoDataSource.js.map +7 -0
  92. package/lib/cjs/src/modules/solana/token-info/di/tokenInfoModuleFactory.js +2 -0
  93. package/lib/cjs/src/modules/solana/token-info/di/tokenInfoModuleFactory.js.map +7 -0
  94. package/lib/cjs/src/modules/solana/token-info/di/tokenInfoTypes.js +2 -0
  95. package/lib/cjs/src/modules/solana/token-info/di/tokenInfoTypes.js.map +7 -0
  96. package/lib/cjs/src/modules/solana/token-info/domain/TokenInfoContextLoader.js +2 -0
  97. package/lib/cjs/src/modules/solana/token-info/domain/TokenInfoContextLoader.js.map +7 -0
  98. package/lib/cjs/src/modules/solana/token-info/domain/TokenInfoContextLoader.test.js +2 -0
  99. package/lib/cjs/src/modules/solana/token-info/domain/TokenInfoContextLoader.test.js.map +7 -0
  100. package/lib/cjs/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.js +2 -0
  101. package/lib/cjs/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.js.map +7 -0
  102. package/lib/cjs/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.test.js +2 -0
  103. package/lib/cjs/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.test.js.map +7 -0
  104. package/lib/cjs/src/modules/solana/trusted-name/data/TrustedNameDataSource.js +2 -0
  105. package/lib/cjs/src/modules/solana/trusted-name/data/TrustedNameDataSource.js.map +7 -0
  106. package/lib/cjs/src/modules/solana/trusted-name/di/trustedNameModuleFactory.js +2 -0
  107. package/lib/cjs/src/modules/solana/trusted-name/di/trustedNameModuleFactory.js.map +7 -0
  108. package/lib/cjs/src/modules/solana/trusted-name/di/trustedNameTypes.js +2 -0
  109. package/lib/cjs/src/modules/solana/trusted-name/di/trustedNameTypes.js.map +7 -0
  110. package/lib/cjs/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.js +2 -0
  111. package/lib/cjs/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.js.map +7 -0
  112. package/lib/cjs/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.test.js +2 -0
  113. package/lib/cjs/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.test.js.map +7 -0
  114. package/lib/cjs/src/shared/model/ClearSignContext.js +1 -1
  115. package/lib/cjs/src/shared/model/ClearSignContext.js.map +2 -2
  116. package/lib/cjs/src/shared/utils/HexStringUtils.js +1 -1
  117. package/lib/cjs/src/shared/utils/HexStringUtils.js.map +3 -3
  118. package/lib/cjs/src/shared/utils/HexStringUtils.test.js +1 -1
  119. package/lib/cjs/src/shared/utils/HexStringUtils.test.js.map +2 -2
  120. package/lib/cjs/src/shared/utils/certificateCache.js +2 -0
  121. package/lib/cjs/src/shared/utils/certificateCache.js.map +7 -0
  122. package/lib/cjs/src/shared/utils/certificateCache.test.js +2 -0
  123. package/lib/cjs/src/shared/utils/certificateCache.test.js.map +7 -0
  124. package/lib/cjs/src/shared/utils/certificateResult.js +2 -0
  125. package/lib/cjs/src/shared/utils/certificateResult.js.map +7 -0
  126. package/lib/cjs/src/shared/utils/certificateResult.test.js +2 -0
  127. package/lib/cjs/src/shared/utils/certificateResult.test.js.map +7 -0
  128. package/lib/cjs/src/shared/utils/challengeBoundLoader.js +2 -0
  129. package/lib/cjs/src/shared/utils/challengeBoundLoader.js.map +7 -0
  130. package/lib/cjs/src/shared/utils/challengeBoundLoader.test.js +2 -0
  131. package/lib/cjs/src/shared/utils/challengeBoundLoader.test.js.map +7 -0
  132. package/lib/cjs/src/shared/utils/deviceModelIdCodec.js +2 -0
  133. package/lib/cjs/src/shared/utils/deviceModelIdCodec.js.map +7 -0
  134. package/lib/cjs/src/shared/utils/deviceModelIdCodec.test.js +2 -0
  135. package/lib/cjs/src/shared/utils/deviceModelIdCodec.test.js.map +7 -0
  136. package/lib/cjs/src/shared/utils/signedDescriptorDto.js +2 -0
  137. package/lib/cjs/src/shared/utils/signedDescriptorDto.js.map +7 -0
  138. package/lib/cjs/src/shared/utils/signedDescriptorDto.test.js +2 -0
  139. package/lib/cjs/src/shared/utils/signedDescriptorDto.test.js.map +7 -0
  140. package/lib/cjs/src/shared/utils/uIntCodec.js +2 -0
  141. package/lib/cjs/src/shared/utils/uIntCodec.js.map +7 -0
  142. package/lib/cjs/src/shared/utils/uIntCodec.test.js +2 -0
  143. package/lib/cjs/src/shared/utils/uIntCodec.test.js.map +7 -0
  144. package/lib/esm/package.json +2 -2
  145. package/lib/esm/src/DefaultContextModule.js +1 -1
  146. package/lib/esm/src/DefaultContextModule.js.map +3 -3
  147. package/lib/esm/src/di.js +1 -1
  148. package/lib/esm/src/di.js.map +3 -3
  149. package/lib/esm/src/index.js +1 -1
  150. package/lib/esm/src/index.js.map +2 -2
  151. package/lib/esm/src/modules/multichain/pki/model/KeyId.js +1 -1
  152. package/lib/esm/src/modules/multichain/pki/model/KeyId.js.map +2 -2
  153. package/lib/esm/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.js +1 -1
  154. package/lib/esm/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.js.map +3 -3
  155. package/lib/esm/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.test.js +1 -1
  156. package/lib/esm/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.test.js.map +3 -3
  157. package/lib/esm/src/modules/solana/alt-resolution/data/AltResolutionDataSource.js +1 -0
  158. package/lib/esm/src/modules/solana/alt-resolution/data/AltResolutionDataSource.js.map +7 -0
  159. package/lib/esm/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.js +2 -0
  160. package/lib/esm/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.js.map +7 -0
  161. package/lib/esm/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.test.js +2 -0
  162. package/lib/esm/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.test.js.map +7 -0
  163. package/lib/esm/src/modules/solana/alt-resolution/di/altResolutionModuleFactory.js +2 -0
  164. package/lib/esm/src/modules/solana/alt-resolution/di/altResolutionModuleFactory.js.map +7 -0
  165. package/lib/esm/src/modules/solana/alt-resolution/di/altResolutionTypes.js +2 -0
  166. package/lib/esm/src/modules/solana/alt-resolution/di/altResolutionTypes.js.map +7 -0
  167. package/lib/esm/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.js +2 -0
  168. package/lib/esm/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.js.map +7 -0
  169. package/lib/esm/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.test.js +2 -0
  170. package/lib/esm/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.test.js.map +7 -0
  171. package/lib/esm/src/modules/solana/enum-variant/di/enumVariantModuleFactory.js +2 -0
  172. package/lib/esm/src/modules/solana/enum-variant/di/enumVariantModuleFactory.js.map +7 -0
  173. package/lib/esm/src/modules/solana/enum-variant/di/enumVariantTypes.js +2 -0
  174. package/lib/esm/src/modules/solana/enum-variant/di/enumVariantTypes.js.map +7 -0
  175. package/lib/esm/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.js +2 -0
  176. package/lib/esm/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.js.map +7 -0
  177. package/lib/esm/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.test.js +2 -0
  178. package/lib/esm/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.test.js.map +7 -0
  179. package/lib/esm/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.js +2 -0
  180. package/lib/esm/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.js.map +7 -0
  181. package/lib/esm/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.test.js +2 -0
  182. package/lib/esm/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.test.js.map +7 -0
  183. package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoDataSource.js +1 -0
  184. package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoDataSource.js.map +7 -0
  185. package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoDto.js +2 -0
  186. package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoDto.js.map +7 -0
  187. package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoMapper.js +2 -0
  188. package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoMapper.js.map +7 -0
  189. package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoMapper.test.js +2 -0
  190. package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoMapper.test.js.map +7 -0
  191. package/lib/esm/src/modules/solana/instruction-info/di/instructionInfoModuleFactory.js +2 -0
  192. package/lib/esm/src/modules/solana/instruction-info/di/instructionInfoModuleFactory.js.map +7 -0
  193. package/lib/esm/src/modules/solana/instruction-info/di/instructionInfoTypes.js +2 -0
  194. package/lib/esm/src/modules/solana/instruction-info/di/instructionInfoTypes.js.map +7 -0
  195. package/lib/esm/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.js +2 -0
  196. package/lib/esm/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.js.map +7 -0
  197. package/lib/esm/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.test.js +2 -0
  198. package/lib/esm/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.test.js.map +7 -0
  199. package/lib/esm/src/modules/solana/model/SolanaClearSignContext.js +1 -1
  200. package/lib/esm/src/modules/solana/model/SolanaClearSignContext.js.map +3 -3
  201. package/lib/esm/src/modules/solana/model/SolanaPayloads.js +1 -0
  202. package/lib/esm/src/modules/solana/model/SolanaPayloads.js.map +4 -4
  203. package/lib/esm/src/modules/solana/model/SolanaTransactionScanChainId.js +1 -1
  204. package/lib/esm/src/modules/solana/model/SolanaTransactionScanChainId.js.map +2 -2
  205. package/lib/esm/src/modules/solana/owner-info/domain/OwnerInfoContextLoader.js +1 -1
  206. package/lib/esm/src/modules/solana/owner-info/domain/OwnerInfoContextLoader.js.map +2 -2
  207. package/lib/esm/src/modules/solana/owner-info/domain/OwnerInfoContextLoader.test.js +1 -1
  208. package/lib/esm/src/modules/solana/owner-info/domain/OwnerInfoContextLoader.test.js.map +2 -2
  209. package/lib/esm/src/modules/solana/token/domain/TokenContextLoader.js +1 -1
  210. package/lib/esm/src/modules/solana/token/domain/TokenContextLoader.js.map +3 -3
  211. package/lib/esm/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.js +2 -0
  212. package/lib/esm/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.js.map +7 -0
  213. package/lib/esm/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.test.js +2 -0
  214. package/lib/esm/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.test.js.map +7 -0
  215. package/lib/esm/src/modules/solana/token-account-state/data/TokenAccountStateDataSource.js +1 -0
  216. package/lib/esm/src/modules/solana/token-account-state/data/TokenAccountStateDataSource.js.map +7 -0
  217. package/lib/esm/src/modules/solana/token-account-state/di/tokenAccountStateModuleFactory.js +2 -0
  218. package/lib/esm/src/modules/solana/token-account-state/di/tokenAccountStateModuleFactory.js.map +7 -0
  219. package/lib/esm/src/modules/solana/token-account-state/di/tokenAccountStateTypes.js +2 -0
  220. package/lib/esm/src/modules/solana/token-account-state/di/tokenAccountStateTypes.js.map +7 -0
  221. package/lib/esm/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.js +2 -0
  222. package/lib/esm/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.js.map +7 -0
  223. package/lib/esm/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.test.js +2 -0
  224. package/lib/esm/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.test.js.map +7 -0
  225. package/lib/esm/src/modules/solana/token-info/data/HttpTokenInfoDataSource.js +2 -0
  226. package/lib/esm/src/modules/solana/token-info/data/HttpTokenInfoDataSource.js.map +7 -0
  227. package/lib/esm/src/modules/solana/token-info/data/HttpTokenInfoDataSource.test.js +2 -0
  228. package/lib/esm/src/modules/solana/token-info/data/HttpTokenInfoDataSource.test.js.map +7 -0
  229. package/lib/esm/src/modules/solana/token-info/data/TokenInfoDataSource.js +1 -0
  230. package/lib/esm/src/modules/solana/token-info/data/TokenInfoDataSource.js.map +7 -0
  231. package/lib/esm/src/modules/solana/token-info/di/tokenInfoModuleFactory.js +2 -0
  232. package/lib/esm/src/modules/solana/token-info/di/tokenInfoModuleFactory.js.map +7 -0
  233. package/lib/esm/src/modules/solana/token-info/di/tokenInfoTypes.js +2 -0
  234. package/lib/esm/src/modules/solana/token-info/di/tokenInfoTypes.js.map +7 -0
  235. package/lib/esm/src/modules/solana/token-info/domain/TokenInfoContextLoader.js +2 -0
  236. package/lib/esm/src/modules/solana/token-info/domain/TokenInfoContextLoader.js.map +7 -0
  237. package/lib/esm/src/modules/solana/token-info/domain/TokenInfoContextLoader.test.js +2 -0
  238. package/lib/esm/src/modules/solana/token-info/domain/TokenInfoContextLoader.test.js.map +7 -0
  239. package/lib/esm/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.js +2 -0
  240. package/lib/esm/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.js.map +7 -0
  241. package/lib/esm/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.test.js +2 -0
  242. package/lib/esm/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.test.js.map +7 -0
  243. package/lib/esm/src/modules/solana/trusted-name/data/TrustedNameDataSource.js +1 -0
  244. package/lib/esm/src/modules/solana/trusted-name/data/TrustedNameDataSource.js.map +7 -0
  245. package/lib/esm/src/modules/solana/trusted-name/di/trustedNameModuleFactory.js +2 -0
  246. package/lib/esm/src/modules/solana/trusted-name/di/trustedNameModuleFactory.js.map +7 -0
  247. package/lib/esm/src/modules/solana/trusted-name/di/trustedNameTypes.js +2 -0
  248. package/lib/esm/src/modules/solana/trusted-name/di/trustedNameTypes.js.map +7 -0
  249. package/lib/esm/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.js +2 -0
  250. package/lib/esm/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.js.map +7 -0
  251. package/lib/esm/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.test.js +2 -0
  252. package/lib/esm/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.test.js.map +7 -0
  253. package/lib/esm/src/shared/model/ClearSignContext.js +1 -1
  254. package/lib/esm/src/shared/model/ClearSignContext.js.map +2 -2
  255. package/lib/esm/src/shared/utils/HexStringUtils.js +1 -1
  256. package/lib/esm/src/shared/utils/HexStringUtils.js.map +3 -3
  257. package/lib/esm/src/shared/utils/HexStringUtils.test.js +1 -1
  258. package/lib/esm/src/shared/utils/HexStringUtils.test.js.map +2 -2
  259. package/lib/esm/src/shared/utils/certificateCache.js +2 -0
  260. package/lib/esm/src/shared/utils/certificateCache.js.map +7 -0
  261. package/lib/esm/src/shared/utils/certificateCache.test.js +2 -0
  262. package/lib/esm/src/shared/utils/certificateCache.test.js.map +7 -0
  263. package/lib/esm/src/shared/utils/certificateResult.js +2 -0
  264. package/lib/esm/src/shared/utils/certificateResult.js.map +7 -0
  265. package/lib/esm/src/shared/utils/certificateResult.test.js +2 -0
  266. package/lib/esm/src/shared/utils/certificateResult.test.js.map +7 -0
  267. package/lib/esm/src/shared/utils/challengeBoundLoader.js +2 -0
  268. package/lib/esm/src/shared/utils/challengeBoundLoader.js.map +7 -0
  269. package/lib/esm/src/shared/utils/challengeBoundLoader.test.js +2 -0
  270. package/lib/esm/src/shared/utils/challengeBoundLoader.test.js.map +7 -0
  271. package/lib/esm/src/shared/utils/deviceModelIdCodec.js +2 -0
  272. package/lib/esm/src/shared/utils/deviceModelIdCodec.js.map +7 -0
  273. package/lib/esm/src/shared/utils/deviceModelIdCodec.test.js +2 -0
  274. package/lib/esm/src/shared/utils/deviceModelIdCodec.test.js.map +7 -0
  275. package/lib/esm/src/shared/utils/signedDescriptorDto.js +2 -0
  276. package/lib/esm/src/shared/utils/signedDescriptorDto.js.map +7 -0
  277. package/lib/esm/src/shared/utils/signedDescriptorDto.test.js +2 -0
  278. package/lib/esm/src/shared/utils/signedDescriptorDto.test.js.map +7 -0
  279. package/lib/esm/src/shared/utils/uIntCodec.js +2 -0
  280. package/lib/esm/src/shared/utils/uIntCodec.js.map +7 -0
  281. package/lib/esm/src/shared/utils/uIntCodec.test.js +2 -0
  282. package/lib/esm/src/shared/utils/uIntCodec.test.js.map +7 -0
  283. package/lib/types/src/DefaultContextModule.d.ts.map +1 -1
  284. package/lib/types/src/di.d.ts.map +1 -1
  285. package/lib/types/src/index.d.ts +16 -0
  286. package/lib/types/src/index.d.ts.map +1 -1
  287. package/lib/types/src/modules/multichain/pki/model/KeyId.d.ts +1 -0
  288. package/lib/types/src/modules/multichain/pki/model/KeyId.d.ts.map +1 -1
  289. package/lib/types/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.d.ts +1 -1
  290. package/lib/types/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.d.ts.map +1 -1
  291. package/lib/types/src/modules/solana/alt-resolution/data/AltResolutionDataSource.d.ts +17 -0
  292. package/lib/types/src/modules/solana/alt-resolution/data/AltResolutionDataSource.d.ts.map +1 -0
  293. package/lib/types/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.d.ts +11 -0
  294. package/lib/types/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.d.ts.map +1 -0
  295. package/lib/types/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.test.d.ts +2 -0
  296. package/lib/types/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.test.d.ts.map +1 -0
  297. package/lib/types/src/modules/solana/alt-resolution/di/altResolutionModuleFactory.d.ts +3 -0
  298. package/lib/types/src/modules/solana/alt-resolution/di/altResolutionModuleFactory.d.ts.map +1 -0
  299. package/lib/types/src/modules/solana/alt-resolution/di/altResolutionTypes.d.ts +5 -0
  300. package/lib/types/src/modules/solana/alt-resolution/di/altResolutionTypes.d.ts.map +1 -0
  301. package/lib/types/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.d.ts +23 -0
  302. package/lib/types/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.d.ts.map +1 -0
  303. package/lib/types/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.test.d.ts +2 -0
  304. package/lib/types/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.test.d.ts.map +1 -0
  305. package/lib/types/src/modules/solana/enum-variant/di/enumVariantModuleFactory.d.ts +3 -0
  306. package/lib/types/src/modules/solana/enum-variant/di/enumVariantModuleFactory.d.ts.map +1 -0
  307. package/lib/types/src/modules/solana/enum-variant/di/enumVariantTypes.d.ts +4 -0
  308. package/lib/types/src/modules/solana/enum-variant/di/enumVariantTypes.d.ts.map +1 -0
  309. package/lib/types/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.d.ts +45 -0
  310. package/lib/types/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.d.ts.map +1 -0
  311. package/lib/types/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.test.d.ts +2 -0
  312. package/lib/types/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.test.d.ts.map +1 -0
  313. package/lib/types/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.d.ts +11 -0
  314. package/lib/types/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.d.ts.map +1 -0
  315. package/lib/types/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.test.d.ts +2 -0
  316. package/lib/types/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.test.d.ts.map +1 -0
  317. package/lib/types/src/modules/solana/instruction-info/data/InstructionInfoDataSource.d.ts +32 -0
  318. package/lib/types/src/modules/solana/instruction-info/data/InstructionInfoDataSource.d.ts.map +1 -0
  319. package/lib/types/src/modules/solana/instruction-info/data/InstructionInfoDto.d.ts +135 -0
  320. package/lib/types/src/modules/solana/instruction-info/data/InstructionInfoDto.d.ts.map +1 -0
  321. package/lib/types/src/modules/solana/instruction-info/data/InstructionInfoMapper.d.ts +23 -0
  322. package/lib/types/src/modules/solana/instruction-info/data/InstructionInfoMapper.d.ts.map +1 -0
  323. package/lib/types/src/modules/solana/instruction-info/data/InstructionInfoMapper.test.d.ts +2 -0
  324. package/lib/types/src/modules/solana/instruction-info/data/InstructionInfoMapper.test.d.ts.map +1 -0
  325. package/lib/types/src/modules/solana/instruction-info/di/instructionInfoModuleFactory.d.ts +3 -0
  326. package/lib/types/src/modules/solana/instruction-info/di/instructionInfoModuleFactory.d.ts.map +1 -0
  327. package/lib/types/src/modules/solana/instruction-info/di/instructionInfoTypes.d.ts +5 -0
  328. package/lib/types/src/modules/solana/instruction-info/di/instructionInfoTypes.d.ts.map +1 -0
  329. package/lib/types/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.d.ts +39 -0
  330. package/lib/types/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.d.ts.map +1 -0
  331. package/lib/types/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.test.d.ts +2 -0
  332. package/lib/types/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.test.d.ts.map +1 -0
  333. package/lib/types/src/modules/solana/model/SolanaClearSignContext.d.ts +33 -2
  334. package/lib/types/src/modules/solana/model/SolanaClearSignContext.d.ts.map +1 -1
  335. package/lib/types/src/modules/solana/model/SolanaContextTypes.d.ts +8 -1
  336. package/lib/types/src/modules/solana/model/SolanaContextTypes.d.ts.map +1 -1
  337. package/lib/types/src/modules/solana/model/SolanaPayloads.d.ts +126 -0
  338. package/lib/types/src/modules/solana/model/SolanaPayloads.d.ts.map +1 -1
  339. package/lib/types/src/modules/solana/model/SolanaTransactionScanChainId.d.ts +6 -5
  340. package/lib/types/src/modules/solana/model/SolanaTransactionScanChainId.d.ts.map +1 -1
  341. package/lib/types/src/modules/solana/owner-info/domain/solanaContextTypes.d.ts +2 -5
  342. package/lib/types/src/modules/solana/owner-info/domain/solanaContextTypes.d.ts.map +1 -1
  343. package/lib/types/src/modules/solana/token/domain/TokenContextLoader.d.ts.map +1 -1
  344. package/lib/types/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.d.ts +11 -0
  345. package/lib/types/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.d.ts.map +1 -0
  346. package/lib/types/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.test.d.ts +2 -0
  347. package/lib/types/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.test.d.ts.map +1 -0
  348. package/lib/types/src/modules/solana/token-account-state/data/TokenAccountStateDataSource.d.ts +15 -0
  349. package/lib/types/src/modules/solana/token-account-state/data/TokenAccountStateDataSource.d.ts.map +1 -0
  350. package/lib/types/src/modules/solana/token-account-state/di/tokenAccountStateModuleFactory.d.ts +3 -0
  351. package/lib/types/src/modules/solana/token-account-state/di/tokenAccountStateModuleFactory.d.ts.map +1 -0
  352. package/lib/types/src/modules/solana/token-account-state/di/tokenAccountStateTypes.d.ts +5 -0
  353. package/lib/types/src/modules/solana/token-account-state/di/tokenAccountStateTypes.d.ts.map +1 -0
  354. package/lib/types/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.d.ts +26 -0
  355. package/lib/types/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.d.ts.map +1 -0
  356. package/lib/types/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.test.d.ts +2 -0
  357. package/lib/types/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.test.d.ts.map +1 -0
  358. package/lib/types/src/modules/solana/token-info/data/HttpTokenInfoDataSource.d.ts +11 -0
  359. package/lib/types/src/modules/solana/token-info/data/HttpTokenInfoDataSource.d.ts.map +1 -0
  360. package/lib/types/src/modules/solana/token-info/data/HttpTokenInfoDataSource.test.d.ts +2 -0
  361. package/lib/types/src/modules/solana/token-info/data/HttpTokenInfoDataSource.test.d.ts.map +1 -0
  362. package/lib/types/src/modules/solana/token-info/data/TokenInfoDataSource.d.ts +24 -0
  363. package/lib/types/src/modules/solana/token-info/data/TokenInfoDataSource.d.ts.map +1 -0
  364. package/lib/types/src/modules/solana/token-info/di/tokenInfoModuleFactory.d.ts +3 -0
  365. package/lib/types/src/modules/solana/token-info/di/tokenInfoModuleFactory.d.ts.map +1 -0
  366. package/lib/types/src/modules/solana/token-info/di/tokenInfoTypes.d.ts +5 -0
  367. package/lib/types/src/modules/solana/token-info/di/tokenInfoTypes.d.ts.map +1 -0
  368. package/lib/types/src/modules/solana/token-info/domain/TokenInfoContextLoader.d.ts +26 -0
  369. package/lib/types/src/modules/solana/token-info/domain/TokenInfoContextLoader.d.ts.map +1 -0
  370. package/lib/types/src/modules/solana/token-info/domain/TokenInfoContextLoader.test.d.ts +2 -0
  371. package/lib/types/src/modules/solana/token-info/domain/TokenInfoContextLoader.test.d.ts.map +1 -0
  372. package/lib/types/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.d.ts +11 -0
  373. package/lib/types/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.d.ts.map +1 -0
  374. package/lib/types/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.test.d.ts +2 -0
  375. package/lib/types/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.test.d.ts.map +1 -0
  376. package/lib/types/src/modules/solana/trusted-name/data/TrustedNameDataSource.d.ts +18 -0
  377. package/lib/types/src/modules/solana/trusted-name/data/TrustedNameDataSource.d.ts.map +1 -0
  378. package/lib/types/src/modules/solana/trusted-name/di/trustedNameModuleFactory.d.ts +3 -0
  379. package/lib/types/src/modules/solana/trusted-name/di/trustedNameModuleFactory.d.ts.map +1 -0
  380. package/lib/types/src/modules/solana/trusted-name/di/trustedNameTypes.d.ts +5 -0
  381. package/lib/types/src/modules/solana/trusted-name/di/trustedNameTypes.d.ts.map +1 -0
  382. package/lib/types/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.d.ts +29 -0
  383. package/lib/types/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.d.ts.map +1 -0
  384. package/lib/types/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.test.d.ts +2 -0
  385. package/lib/types/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.test.d.ts.map +1 -0
  386. package/lib/types/src/shared/model/ClearSignContext.d.ts +7 -1
  387. package/lib/types/src/shared/model/ClearSignContext.d.ts.map +1 -1
  388. package/lib/types/src/shared/utils/HexStringUtils.d.ts +7 -0
  389. package/lib/types/src/shared/utils/HexStringUtils.d.ts.map +1 -1
  390. package/lib/types/src/shared/utils/certificateCache.d.ts +23 -0
  391. package/lib/types/src/shared/utils/certificateCache.d.ts.map +1 -0
  392. package/lib/types/src/shared/utils/certificateCache.test.d.ts +2 -0
  393. package/lib/types/src/shared/utils/certificateCache.test.d.ts.map +1 -0
  394. package/lib/types/src/shared/utils/certificateResult.d.ts +26 -0
  395. package/lib/types/src/shared/utils/certificateResult.d.ts.map +1 -0
  396. package/lib/types/src/shared/utils/certificateResult.test.d.ts +2 -0
  397. package/lib/types/src/shared/utils/certificateResult.test.d.ts.map +1 -0
  398. package/lib/types/src/shared/utils/challengeBoundLoader.d.ts +43 -0
  399. package/lib/types/src/shared/utils/challengeBoundLoader.d.ts.map +1 -0
  400. package/lib/types/src/shared/utils/challengeBoundLoader.test.d.ts +2 -0
  401. package/lib/types/src/shared/utils/challengeBoundLoader.test.d.ts.map +1 -0
  402. package/lib/types/src/shared/utils/deviceModelIdCodec.d.ts +7 -0
  403. package/lib/types/src/shared/utils/deviceModelIdCodec.d.ts.map +1 -0
  404. package/lib/types/src/shared/utils/deviceModelIdCodec.test.d.ts +2 -0
  405. package/lib/types/src/shared/utils/deviceModelIdCodec.test.d.ts.map +1 -0
  406. package/lib/types/src/shared/utils/signedDescriptorDto.d.ts +15 -0
  407. package/lib/types/src/shared/utils/signedDescriptorDto.d.ts.map +1 -0
  408. package/lib/types/src/shared/utils/signedDescriptorDto.test.d.ts +2 -0
  409. package/lib/types/src/shared/utils/signedDescriptorDto.test.d.ts.map +1 -0
  410. package/lib/types/src/shared/utils/uIntCodec.d.ts +20 -0
  411. package/lib/types/src/shared/utils/uIntCodec.d.ts.map +1 -0
  412. package/lib/types/src/shared/utils/uIntCodec.test.d.ts +2 -0
  413. package/lib/types/src/shared/utils/uIntCodec.test.d.ts.map +1 -0
  414. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  415. 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.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": "wdAEA,IAAAA,EAA8B,2CAC9BC,EAAiB,mBACjBC,EAA4B,qBAI5BC,EAAsC,kEACtCC,EAAqC,2CAErCC,EAA6C,0CAE7C,MAAMC,EAAa,GAEbC,EAAa,CACjB,MAAO,GAAG,GAAG,EACb,KAAM,GAAG,GAAG,EACZ,KAAM,GAAG,GAAG,EACZ,MAAO,GAAG,GAAG,EACb,YAAa,CAAC,CAChB,EACMC,EAAgB,IAAMD,EAEtBE,EAA8C,CAClD,gBAAiB,GAAG,GAAG,CACzB,EAEA,IAAIC,EACAC,EAEJ,WAAW,IAAM,CACf,GAAG,cAAc,EACjBD,EAAiB,CAAE,MAAO,GAAG,GAAG,CAAE,EAClCC,EAAS,IAAI,+BACXD,EACAD,EACAD,CACF,CACF,CAAC,EAED,SAAS,+BAAgC,IAAM,CAC7C,SAAS,YAAa,IAAM,CAC1B,MAAMI,EAAa,CACjB,cAAe,gBAAc,OAC7B,iBAAkB,CAChB,KAAM,SACN,iBAAkB,IAAI,WAAW,CAAC,EAAG,EAAG,EAAG,GAAI,CAAC,EAChD,MAAO,CACT,CACF,EAEA,GAAG,0DAA2D,IAAM,CAClE,OACED,EAAO,UAAUC,EAAY,CAC3B,uBAAqB,wBACvB,CAAC,CACH,EAAE,KAAK,EAAI,CACb,CAAC,EAED,GAAG,4EAA6E,IAAM,CACpF,OACED,EAAO,UAAUC,EAAY,CAAC,uBAAqB,YAAY,CAAC,CAClE,EAAE,KAAK,EAAK,CACd,CAAC,EAED,GAAG,0DAA2D,IAAM,CAClE,OACED,EAAO,UACL,CACE,GAAGC,EACH,iBAAkB,CAChB,GAAGA,EAAW,iBACd,iBAAkB,QACpB,CACF,EACA,CAAC,uBAAqB,wBAAwB,CAChD,CACF,EAAE,KAAK,EAAK,CACd,CAAC,EAED,GAAG,+CAAgD,IAAM,CACvD,OACED,EAAO,UACL,CACE,GAAGC,EACH,iBAAkB,CAChB,GAAGA,EAAW,iBACd,iBAAkB,IAAI,UACxB,CACF,EACA,CAAC,uBAAqB,wBAAwB,CAChD,CACF,EAAE,KAAK,EAAK,CACd,CAAC,EAED,GAAG,mCAAoC,IAAM,CAC3C,OACED,EAAO,UACL,CACE,GAAGC,EACH,iBAAkB,CAAE,GAAGA,EAAW,iBAAkB,KAAM,EAAG,CAC/D,EACA,CAAC,uBAAqB,wBAAwB,CAChD,CACF,EAAE,KAAK,EAAK,CACd,CAAC,EAED,GAAG,uDAAwD,IAAM,CAC/D,OACED,EAAO,UACL,CAAE,GAAGC,EAAY,cAAe,gBAAc,MAAO,EACrD,CAAC,uBAAqB,wBAAwB,CAChD,CACF,EAAE,KAAK,EAAK,CACd,CAAC,CACH,CAAC,EAED,SAAS,0BAAsB,IAAM,CACnC,WAAW,IAAM,CACfF,EAAe,MAAM,qBACnB,SAAM,CAAE,YAAa,KAAM,WAAY,MAAO,CAAC,CACjD,EACCD,EAAsB,gBAAwB,kBAAkB,CAC/D,QAAS,IAAI,WAAW,CAAC,GAAI,CAAC,EAC9B,eAAgB,EAClB,CAAC,CACH,CAAC,EAED,GAAG,0HAA2H,SAAY,CAExI,MAAMI,EAAU,IAAI,WAAW,CAAC,EAAG,EAAG,EAAG,IAAM,IAAM,GAAI,CAAC,EAE1D,MAAMF,EAAO,KAAK,CAChB,cAAe,gBAAc,OAC7B,iBAAkB,CAChB,KAAM,SACN,iBAAkBE,EAClB,MAAO,CACT,CACF,CAAC,EAED,MAAMC,EAAOJ,EAAe,MAAM,KAAK,MAAM,CAAC,EAAG,CAAC,EAC5CK,EAAU,EAAAC,QAAK,OAAOF,EAAK,KAAK,GAAG,GAAG,EAE5C,OAAOA,EAAK,IAAI,EAAE,KAAK,wBAAsB,kBAAkB,EAC/D,OAAOA,EAAK,KAAK,GAAG,IAAI,EAAE,KAAK,QAAQ,EACvC,OAAOA,EAAK,KAAK,KAAK,EAAE,KAAK,CAAC,EAC9B,OAAOC,EAAQ,MAAM,EAAE,KAAK,EAAI,EAAIT,EAAaO,EAAQ,MAAM,EAC/D,OAAOE,EAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,EACzB,OAAO,MAAM,KAAKA,EAAQ,MAAM,EAAG,EAAI,EAAIT,CAAU,CAAC,CAAC,EAAE,QACvD,IAAI,MAAM,EAAIA,CAAU,EAAE,KAAK,CAAC,CAClC,EACA,OAAO,MAAM,KAAKS,EAAQ,MAAM,EAAI,EAAIT,CAAU,CAAC,CAAC,EAAE,QACpD,MAAM,KAAKO,CAAO,CACpB,CACF,CAAC,EAED,GAAG,mGAAoG,SAAY,CAEjH,MAAMA,EAAU,IAAI,WAAW,CAAC,IAAM,EAAG,EAAG,EAAG,IAAM,GAAI,CAAC,EAE1D,MAAMF,EAAO,KAAK,CAChB,cAAe,gBAAc,OAC7B,iBAAkB,CAChB,KAAM,SACN,iBAAkBE,EAClB,MAAO,CACT,CACF,CAAC,EAED,MAAME,EAAU,EAAAC,QAAK,OACnBN,EAAe,MAAM,KAAK,MAAM,CAAC,EAAG,CAAC,EAAE,KAAK,GAAG,GACjD,EAEA,OAAOK,EAAQ,MAAM,EAAE,KAAK,EAAIT,EAAaO,EAAQ,MAAM,EAC3D,OAAOE,EAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,EACzB,OAAO,MAAM,KAAKA,EAAQ,MAAM,EAAG,EAAIT,CAAU,CAAC,CAAC,EAAE,QACnD,IAAI,MAAMA,CAAU,EAAE,KAAK,CAAC,CAC9B,EACA,OAAO,MAAM,KAAKS,EAAQ,MAAM,EAAIT,CAAU,CAAC,CAAC,EAAE,QAChD,MAAM,KAAKO,CAAO,CACpB,CACF,CAAC,CACH,CAAC,EAED,SAAS,6BAAyB,IAAM,CACtC,GAAG,wFAAyF,SAAY,CACtGH,EAAe,MAAM,qBACnB,SAAM,CAAE,YAAa,OAAQ,WAAY,UAAW,CAAC,CACvD,EACA,MAAMO,EAAO,CAAE,QAAS,IAAI,WAAW,CAAC,GAAI,CAAC,EAAG,eAAgB,EAAG,EAClER,EAAsB,gBAAwB,kBAAkBQ,CAAI,EAErE,KAAM,CAACC,CAAG,EAAI,MAAMP,EAAO,KAAK,CAC9B,cAAe,gBAAc,OAC7B,iBAAkB,CAChB,KAAM,SACN,iBAAkB,IAAI,WAAW,CAAC,EAAG,EAAG,EAAG,GAAI,CAAC,EAChD,MAAO,CACT,CACF,CAAC,EAED,OAAOO,CAAG,EAAE,QAAQ,CAClB,KAAM,uBAAqB,yBAC3B,QAAS,CAAE,WAAY,UAAW,EAClC,YAAaD,CACf,CAAC,CACH,CAAC,EAED,GAAG,6DAA8D,SAAY,CAC3E,MAAME,EAAQ,IAAI,MAAM,cAAc,EACtCT,EAAe,MAAM,qBAAkB,QAAKS,CAAK,CAAC,EAElD,KAAM,CAACD,CAAG,EAAI,MAAMP,EAAO,KAAK,CAC9B,cAAe,gBAAc,OAC7B,iBAAkB,CAChB,KAAM,SACN,iBAAkB,IAAI,WAAW,CAAC,EAAG,EAAG,EAAG,GAAI,CAAC,EAChD,MAAO,CACT,CACF,CAAC,EAED,OAAOO,CAAG,EAAE,QAAQ,CAAE,KAAM,uBAAqB,MAAO,MAAAC,CAAM,CAAC,EAC/D,OAAOV,EAAsB,eAAe,EAAE,IAAI,iBAAiB,CACrE,CAAC,EAED,GAAG,0GAA2G,SAAY,CAExH,MAAMI,EAAU,IAAI,WAAW,CAAC,GAAI,EAAG,EAAG,GAAI,CAAC,EAEzC,CAACK,CAAG,EAAI,MAAMP,EAAO,KAAK,CAC9B,cAAe,gBAAc,OAC7B,iBAAkB,CAChB,KAAM,SACN,iBAAkBE,EAClB,MAAO,CACT,CACF,CAAC,EAED,OAAOK,CAAG,EAAE,cAAc,CACxB,KAAM,uBAAqB,MAC3B,MAAO,OAAO,IAAI,KAAK,CACzB,CAAC,EACD,OAAQA,EAAyB,MAAM,OAAO,EAAE,UAC9C,4BACF,EACA,OAAOR,EAAe,KAAK,EAAE,IAAI,iBAAiB,CACpD,CAAC,CACH,CAAC,CACH,CAAC",
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 g=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var $=Object.prototype.hasOwnProperty;var A=(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 k(e))!$.call(r,o)&&o!==t&&c(r,o,{get:()=>e[o],enumerable:!(s=g(e,o))||s.enumerable});return r};var w=r=>E(c({},"__esModule",{value:!0}),r),f=(r,e,t,s)=>{for(var o=s>1?void 0:s?g(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={};A(x,{HttpAltResolutionDataSource:()=>a});module.exports=w(x);var p=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 u=i instanceof Error?i.message:String(i);return(0,n.Left)(new Error(`[ContextModule] HttpAltResolutionDataSource: Failed to fetch ALT resolution: ${u}`))}return D.signedDescriptorDtoCodec.decode(l).caseOf({Left:i=>(0,n.Left)(new Error(`[ContextModule] HttpAltResolutionDataSource: malformed response for (${e}, ${t}): ${i}`)),Right:i=>{let u;try{u=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:u,keyId:i.keyId,keyUsage:i.keyUsage})}})}};a=f([(0,p.injectable)(),m(0,(0,p.inject)(d.configTypes.Config)),m(1,(0,p.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?: string;\n alt_address?: string;\n entry_index?: number;\n resolved_address?: 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 l=Object.defineProperty;var x=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var O=Object.prototype.hasOwnProperty;var U=(o,e)=>{for(var n in e)l(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&&l(o,a,{get:()=>e[a],enumerable:!(t=x(e,a))||t.enumerable});return o};var b=o=>_(l({},"__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&&l(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"),M=require("../../../../shared/utils/deviceModelIdCodec"),L=require("../../../../shared/utils/uIntCodec");const D=[m.ClearSignContextType.SOLANA_ENUM_VARIANT],$="solana-mainnet",K=i.Codec.interface({programId:i.string,enumId:i.string,variantIndex:L.u16Codec}),F=i.Codec.interface({deviceModelId:M.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.TokenMetadataKey,keyUsage:h.KeyUsage.CoinMeta,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,c)=>[r,T[c]])),v=this.config.cal.mode??"prod";return e.selections.map(r=>{const c=N.get(r.programId);if(!c){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 c.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.TokenMetadataKey,\n keyUsage: KeyUsage.CoinMeta,\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 v=()=>({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://crypto-assets-service.api.ledger.com/v1",mode:"prod",branch:"main"}},t="JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4",g="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,v);(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:g,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://crypto-assets-service.api.ledger.com/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 f=Object.defineProperty;var I=Object.getOwnPropertyDescriptor;var D=Object.getOwnPropertyNames;var k=Object.prototype.hasOwnProperty;var M=(n,t)=>{for(var i in t)f(n,i,{get:t[i],enumerable:!0})},$=(n,t,i,e)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of D(t))!k.call(n,r)&&r!==i&&f(n,r,{get:()=>t[r],enumerable:!(e=I(t,r))||e.enumerable});return n};var x=n=>$(f({},"__esModule",{value:!0}),n),C=(n,t,i,e)=>{for(var r=e>1?void 0:e?I(t,i):t,s=n.length-1,c;s>=0;s--)(c=n[s])&&(r=(e?c(t,i,r):c(r))||r);return e&&r&&f(t,i,r),r},l=(n,t)=>(i,e)=>t(i,e,n);var b={};M(b,{HttpInstructionInfoDataSource:()=>a});module.exports=x(b);var u=require("inversify"),o=require("purify-ts"),g=require("../../../../config/di/configTypes"),h=require("../../../../shared/network/di/networkTypes"),E=require("./InstructionInfoDto"),p=require("./InstructionInfoMapper");const R=o.Codec.interface({descriptors_instruction:(0,o.record)(o.string,o.unknown)});let a=class{constructor(t,i){this.config=t;this.http=i}async getInstructionInfo({programId:t,network:i}){let e;try{e=await this.http.get(`${this.config.cal.url}/solana`,{params:{output:"descriptors_instruction",network:i,program:t,ref:`branch:${this.config.cal.branch}`}})}catch(r){const s=r instanceof Error?r.message:String(r);return(0,o.Left)(new Error(`[ContextModule] HttpInstructionInfoDataSource: Failed to fetch instruction descriptors: ${s}`))}return!Array.isArray(e)||e.length===0?(0,o.Left)(new Error(`[ContextModule] HttpInstructionInfoDataSource: empty response for program ${t}`)):R.decode(e[0]).caseOf({Left:r=>(0,o.Left)(new Error(`[ContextModule] HttpInstructionInfoDataSource: malformed response for program ${t}: ${r}`)),Right:r=>{const s=r.descriptors_instruction[t];return s==null||typeof s!="object"?(0,o.Left)(new Error(`[ContextModule] HttpInstructionInfoDataSource: no descriptors for program ${t}`)):E.calInstructionDescriptorsCodec.decode(s).caseOf({Left:c=>(0,o.Left)(new Error(`[ContextModule] HttpInstructionInfoDataSource: malformed descriptors for program ${t}: ${c}`)),Right:()=>{const c=this.config.cal.mode??"prod",m=s,y=Object.fromEntries(Object.entries(m).map(([d,w])=>[d,(0,p.toInstructionInfoPayload)(d,w,c)]));return(0,o.Right)({programId:t,descriptors:y,enumVariants:(0,p.toProgramEnumVariants)(m,c)})}})}})}};a=C([(0,u.injectable)(),l(0,(0,u.inject)(g.configTypes.Config)),l(1,(0,u.inject)(h.networkTypes.NetworkClient))],a);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 {\n Codec,\n Either,\n Left,\n record,\n Right,\n string,\n unknown as unknownCodec,\n} from \"purify-ts\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { type ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\nimport { networkTypes } from \"@/shared/network/di/networkTypes\";\n\nimport {\n GetInstructionInfoParams,\n InstructionInfoDataSource,\n InstructionInfoResult,\n} from \"./InstructionInfoDataSource\";\nimport {\n type CalInstructionDescriptorDto,\n calInstructionDescriptorsCodec,\n} from \"./InstructionInfoDto\";\nimport {\n type CalMode,\n toInstructionInfoPayload,\n toProgramEnumVariants,\n} from \"./InstructionInfoMapper\";\n\n// Validates the outer envelope shape only. Per-discriminator descriptor\n// content is validated downstream by the loader before being consumed.\nconst calInstructionInfoEnvelopeCodec = Codec.interface({\n descriptors_instruction: record(string, unknownCodec),\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 let data: unknown;\n try {\n data = await this.http.get(`${this.config.cal.url}/solana`, {\n params: {\n output: \"descriptors_instruction\",\n network,\n program: programId,\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 return calInstructionInfoEnvelopeCodec\n .decode(data[0])\n .caseOf<Either<Error, InstructionInfoResult>>({\n Left: (error) =>\n Left(\n new Error(\n `[ContextModule] HttpInstructionInfoDataSource: malformed response for program ${programId}: ${error}`,\n ),\n ),\n Right: (envelope) => {\n const descriptors = envelope.descriptors_instruction[programId];\n if (descriptors == null || typeof descriptors !== \"object\") {\n return Left(\n new Error(\n `[ContextModule] HttpInstructionInfoDataSource: no descriptors for program ${programId}`,\n ),\n );\n }\n\n // Validate the inner descriptor shape so the mapper can dereference\n // `instruction_info.descriptor` / `enum_variants` without\n // runtime-throwing on a malformed CAL payload. A malformed descriptor\n // degrades the whole program to a per-program ERROR rather than\n // rejecting the batch. On success we transform each validated DTO into\n // the core payload so the loader never sees the CAL DTO shapes.\n return calInstructionDescriptorsCodec\n .decode(descriptors)\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 // The codec only validates the consumed shape and strips\n // undeclared fields, so we transform the original (full) object \u2014\n // the cast is justified now that the shape has been validated.\n Right: () => {\n const mode: CalMode = this.config.cal.mode ?? \"prod\";\n const validatedDescriptors = descriptors as Record<\n string,\n CalInstructionDescriptorDto\n >;\n const mapped = Object.fromEntries(\n Object.entries(validatedDescriptors).map(\n ([discriminator, dto]) => [\n discriminator,\n toInstructionInfoPayload(discriminator, dto, mode),\n ],\n ),\n );\n return Right({\n programId,\n descriptors: mapped,\n enumVariants: toProgramEnumVariants(\n validatedDescriptors,\n mode,\n ),\n });\n },\n });\n },\n });\n }\n}\n"],
5
+ "mappings": "okBAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,mCAAAE,IAAA,eAAAC,EAAAH,GACA,IAAAI,EAAmC,qBACnCC,EAQO,qBAEPC,EAA4B,mCAE5BC,EAA6B,4CAO7BC,EAGO,gCACPC,EAIO,mCAIP,MAAMC,EAAkC,QAAM,UAAU,CACtD,2BAAyB,UAAO,SAAQ,EAAAC,OAAY,CACtD,CAAC,EAGM,IAAMC,EAAN,KAEP,CACE,YAEmBC,EAEAC,EACjB,CAHiB,YAAAD,EAEA,UAAAC,CAChB,CAEH,MAAa,mBAAmB,CAC9B,UAAAC,EACA,QAAAC,CACF,EAA4E,CAC1E,IAAIC,EACJ,GAAI,CACFA,EAAO,MAAM,KAAK,KAAK,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,UAAW,CAC1D,OAAQ,CACN,OAAQ,0BACR,QAAAD,EACA,QAASD,EACT,IAAK,UAAU,KAAK,OAAO,IAAI,MAAM,EACvC,CACF,CAAC,CACH,OAASG,EAAO,CACd,MAAMC,EAASD,aAAiB,MAAQA,EAAM,QAAU,OAAOA,CAAK,EACpE,SAAO,QACL,IAAI,MACF,2FAA2FC,CAAM,EACnG,CACF,CACF,CAEA,MAAI,CAAC,MAAM,QAAQF,CAAI,GAAKA,EAAK,SAAW,KACnC,QACL,IAAI,MACF,6EAA6EF,CAAS,EACxF,CACF,EAGKL,EACJ,OAAOO,EAAK,CAAC,CAAC,EACd,OAA6C,CAC5C,KAAOC,MACL,QACE,IAAI,MACF,iFAAiFH,CAAS,KAAKG,CAAK,EACtG,CACF,EACF,MAAQE,GAAa,CACnB,MAAMC,EAAcD,EAAS,wBAAwBL,CAAS,EAC9D,OAAIM,GAAe,MAAQ,OAAOA,GAAgB,YACzC,QACL,IAAI,MACF,6EAA6EN,CAAS,EACxF,CACF,EASK,iCACJ,OAAOM,CAAW,EAClB,OAA6C,CAC5C,KAAOH,MACL,QACE,IAAI,MACF,oFAAoFH,CAAS,KAAKG,CAAK,EACzG,CACF,EAIF,MAAO,IAAM,CACX,MAAMI,EAAgB,KAAK,OAAO,IAAI,MAAQ,OACxCC,EAAuBF,EAIvBG,EAAS,OAAO,YACpB,OAAO,QAAQD,CAAoB,EAAE,IACnC,CAAC,CAACE,EAAeC,CAAG,IAAM,CACxBD,KACA,4BAAyBA,EAAeC,EAAKJ,CAAI,CACnD,CACF,CACF,EACA,SAAO,SAAM,CACX,UAAAP,EACA,YAAaS,EACb,gBAAc,yBACZD,EACAD,CACF,CACF,CAAC,CACH,CACF,CAAC,CACL,CACF,CAAC,CACL,CACF,EAzGaV,EAANe,EAAA,IADN,cAAW,EAKPC,EAAA,eAAO,cAAY,MAAM,GAEzBA,EAAA,eAAO,eAAa,aAAa,IANzBhB",
6
+ "names": ["HttpInstructionInfoDataSource_exports", "__export", "HttpInstructionInfoDataSource", "__toCommonJS", "import_inversify", "import_purify_ts", "import_configTypes", "import_networkTypes", "import_InstructionInfoDto", "import_InstructionInfoMapper", "calInstructionInfoEnvelopeCodec", "unknownCodec", "HttpInstructionInfoDataSource", "config", "http", "programId", "network", "data", "error", "reason", "envelope", "descriptors", "mode", "validatedDescriptors", "mapped", "discriminator", "dto", "__decorateClass", "__decorateParam"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var a=require("purify-ts"),t=require("vitest"),c=require("./HttpInstructionInfoDataSource");(0,t.describe)("HttpInstructionInfoDataSource",()=>{let n,r;const e="11111111111111111111111111111111",s="solana-mainnet",u={cal:{url:"https://crypto-assets-service.api.ledger.com/v1",mode:"prod",branch:"main"}},i=[{descriptors_instruction:{[e]:{"00000000":{type:"instruction",network:"solana-mainnet",version:"v1",instruction_info:{version:1,program_id:e,discriminator:"00000000",hash:"deadbeef",descriptor:{data:"00010101",signatures:{prod:"prodsig",test:"testsig"}}},display_fields:[],value_flow_ports:[],hide_rules:[],account_resets:[]}}}}];(0,t.beforeEach)(()=>{t.vi.clearAllMocks(),r={get:t.vi.fn()},n=new c.HttpInstructionInfoDataSource(u,r)}),(0,t.it)("calls CAL with singular program= and ref=branch:<branch>",async()=>{r.get.mockResolvedValue(i),await n.getInstructionInfo({programId:e,network:s}),(0,t.expect)(r.get).toHaveBeenCalledTimes(1),(0,t.expect)(r.get).toHaveBeenCalledWith("https://crypto-assets-service.api.ledger.com/v1/solana",{params:{output:"descriptors_instruction",network:s,program:e,ref:"branch:main"}})}),(0,t.it)("returns Right with each descriptor transformed into the core payload on success",async()=>{r.get.mockResolvedValue(i);const o=await n.getInstructionInfo({programId:e,network:s});(0,t.expect)(o).toEqual((0,a.Right)({programId:e,descriptors:{"00000000":(0,a.Right)({programId:e,discriminator:"00000000",instructionInfo:{data:"00010101",signature:"prodsig"},substructures:[],enumVariants:[],idlDescriptor:{typePool:[],rootType:0},mintAssociations:[],valueFlowPorts:[],accountResets:[],displayFields:[]})},enumVariants:[]}))}),(0,t.it)("returns Left when the response array is empty",async()=>{r.get.mockResolvedValue([]);const o=await n.getInstructionInfo({programId:e,network:s});(0,t.expect)(o).toEqual((0,a.Left)(new Error(`[ContextModule] HttpInstructionInfoDataSource: empty response for program ${e}`)))}),(0,t.it)("returns Left when the envelope is malformed",async()=>{r.get.mockResolvedValue([{foo:"bar"}]);const o=await n.getInstructionInfo({programId:e,network:s});(0,t.expect)(o.isLeft()).toBe(!0),(0,t.expect)(o.extract().message).toMatch(new RegExp(String.raw`\[ContextModule\] HttpInstructionInfoDataSource: malformed response for program ${e}:`))}),(0,t.it)("returns Left when the response doesn't contain the requested programId",async()=>{r.get.mockResolvedValue([{descriptors_instruction:{OtherProgram:{}}}]);const o=await n.getInstructionInfo({programId:e,network:s});(0,t.expect)(o).toEqual((0,a.Left)(new Error(`[ContextModule] HttpInstructionInfoDataSource: no descriptors for program ${e}`)))}),(0,t.it)("returns Left (not a throw) when an inner descriptor is malformed",async()=>{r.get.mockResolvedValue([{descriptors_instruction:{[e]:{"00000000":{type:"instruction",instruction_info:{}}}}}]);const o=await n.getInstructionInfo({programId:e,network:s});(0,t.expect)(o.isLeft()).toBe(!0),(0,t.expect)(o.extract().message).toMatch(new RegExp(String.raw`\[ContextModule\] HttpInstructionInfoDataSource: malformed descriptors for program ${e}:`))}),(0,t.it)("returns Left when the HTTP client throws",async()=>{r.get.mockRejectedValue(new Error("network"));const o=await n.getInstructionInfo({programId:e,network:s});(0,t.expect)(o).toEqual((0,a.Left)(new Error("[ContextModule] HttpInstructionInfoDataSource: Failed to fetch instruction descriptors: network")))})});
2
+ //# sourceMappingURL=HttpInstructionInfoDataSource.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.test.ts"],
4
+ "sourcesContent": ["import { type DmkNetworkClient } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { type ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\n\nimport { HttpInstructionInfoDataSource } from \"./HttpInstructionInfoDataSource\";\nimport { type InstructionInfoDataSource } from \"./InstructionInfoDataSource\";\nimport { type CalInstructionInfoResponseDto } from \"./InstructionInfoDto\";\n\ndescribe(\"HttpInstructionInfoDataSource\", () => {\n let datasource: InstructionInfoDataSource;\n let httpMock: { get: ReturnType<typeof vi.fn> };\n const programId = \"11111111111111111111111111111111\";\n const network = \"solana-mainnet\";\n const config: ContextModuleServiceConfig = {\n cal: {\n url: \"https://crypto-assets-service.api.ledger.com/v1\",\n mode: \"prod\",\n branch: \"main\",\n },\n } as ContextModuleServiceConfig;\n\n const successResponse: CalInstructionInfoResponseDto = [\n {\n descriptors_instruction: {\n [programId]: {\n \"00000000\": {\n type: \"instruction\",\n network: \"solana-mainnet\",\n version: \"v1\",\n instruction_info: {\n version: 1,\n program_id: programId,\n discriminator: \"00000000\",\n hash: \"deadbeef\",\n descriptor: {\n data: \"00010101\",\n signatures: { prod: \"prodsig\", test: \"testsig\" },\n },\n },\n display_fields: [],\n value_flow_ports: [],\n hide_rules: [],\n account_resets: [],\n },\n },\n },\n },\n ];\n\n beforeEach(() => {\n vi.clearAllMocks();\n httpMock = { get: vi.fn() };\n datasource = new HttpInstructionInfoDataSource(\n config,\n httpMock as unknown as DmkNetworkClient,\n );\n });\n\n it(\"calls CAL with singular program= and ref=branch:<branch>\", async () => {\n httpMock.get.mockResolvedValue(successResponse);\n\n await datasource.getInstructionInfo({ programId, network });\n\n expect(httpMock.get).toHaveBeenCalledTimes(1);\n expect(httpMock.get).toHaveBeenCalledWith(\n \"https://crypto-assets-service.api.ledger.com/v1/solana\",\n {\n params: {\n output: \"descriptors_instruction\",\n network,\n program: programId,\n ref: \"branch:main\",\n },\n },\n );\n });\n\n it(\"returns Right with each descriptor transformed into the core payload on success\", async () => {\n httpMock.get.mockResolvedValue(successResponse);\n\n const result = await datasource.getInstructionInfo({ programId, network });\n\n expect(result).toEqual(\n Right({\n programId,\n descriptors: {\n \"00000000\": Right({\n programId,\n discriminator: \"00000000\",\n instructionInfo: { data: \"00010101\", signature: \"prodsig\" },\n substructures: [],\n enumVariants: [],\n idlDescriptor: { typePool: [], rootType: 0 },\n mintAssociations: [],\n valueFlowPorts: [],\n accountResets: [],\n displayFields: [],\n }),\n },\n enumVariants: [],\n }),\n );\n });\n\n it(\"returns Left when the response array is empty\", async () => {\n httpMock.get.mockResolvedValue([]);\n\n const result = await datasource.getInstructionInfo({ programId, network });\n\n expect(result).toEqual(\n Left(\n new Error(\n `[ContextModule] HttpInstructionInfoDataSource: empty response for program ${programId}`,\n ),\n ),\n );\n });\n\n it(\"returns Left when the envelope is malformed\", async () => {\n httpMock.get.mockResolvedValue([{ foo: \"bar\" }]);\n\n const result = await datasource.getInstructionInfo({ programId, network });\n\n expect(result.isLeft()).toBe(true);\n expect((result.extract() as Error).message).toMatch(\n new RegExp(\n String.raw`\\[ContextModule\\] HttpInstructionInfoDataSource: malformed response for program ${programId}:`,\n ),\n );\n });\n\n it(\"returns Left when the response doesn't contain the requested programId\", async () => {\n httpMock.get.mockResolvedValue([\n { descriptors_instruction: { OtherProgram: {} } },\n ]);\n\n const result = await datasource.getInstructionInfo({ programId, network });\n\n expect(result).toEqual(\n Left(\n new Error(\n `[ContextModule] HttpInstructionInfoDataSource: no descriptors for program ${programId}`,\n ),\n ),\n );\n });\n\n it(\"returns Left (not a throw) when an inner descriptor is malformed\", async () => {\n // `instruction_info.descriptor` missing \u2014 would crash the loader if the\n // datasource handed it through unvalidated.\n httpMock.get.mockResolvedValue([\n {\n descriptors_instruction: {\n [programId]: {\n \"00000000\": { type: \"instruction\", instruction_info: {} },\n },\n },\n },\n ]);\n\n const result = await datasource.getInstructionInfo({ programId, network });\n\n expect(result.isLeft()).toBe(true);\n expect((result.extract() as Error).message).toMatch(\n new RegExp(\n String.raw`\\[ContextModule\\] HttpInstructionInfoDataSource: malformed descriptors for program ${programId}:`,\n ),\n );\n });\n\n it(\"returns Left when the HTTP client throws\", async () => {\n httpMock.get.mockRejectedValue(new Error(\"network\"));\n\n const result = await datasource.getInstructionInfo({ programId, network });\n\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] HttpInstructionInfoDataSource: Failed to fetch instruction descriptors: network\",\n ),\n ),\n );\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["import_purify_ts", "import_vitest", "import_HttpInstructionInfoDataSource", "datasource", "httpMock", "programId", "network", "config", "successResponse", "result"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var a=Object.defineProperty;var e=Object.getOwnPropertyDescriptor;var s=Object.getOwnPropertyNames;var I=Object.prototype.hasOwnProperty;var u=(r,t,i,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of s(t))!I.call(r,n)&&n!==i&&a(r,n,{get:()=>t[n],enumerable:!(o=e(t,n))||o.enumerable});return r};var c=r=>u(a({},"__esModule",{value:!0}),r);var p={};module.exports=c(p);
2
+ //# sourceMappingURL=InstructionInfoDataSource.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/modules/solana/instruction-info/data/InstructionInfoDataSource.ts"],
4
+ "sourcesContent": ["import { type Either } from \"purify-ts\";\n\nimport {\n type SolanaInstructionEnumVariant,\n type SolanaInstructionInfoPayload,\n} from \"@/modules/solana/model/SolanaPayloads\";\n\nexport type GetInstructionInfoParams = {\n programId: string;\n network: string;\n};\n\n/**\n * Result of one CAL call for a single `programId`, fully transformed into core\n * models so consumers never see the CAL DTO shapes.\n *\n * - `descriptors` is indexed by discriminator hex (multiple entries when a\n * program defines several instructions). Each is the decoded\n * {@link SolanaInstructionInfoPayload}, or a `Left` when that descriptor could\n * not be decoded (e.g. no signature for the configured CAL mode) so the\n * consumer can surface a per-descriptor error.\n * - `enumVariants` is the program-wide flat list of decoded enum variants,\n * resolved independently of per-descriptor signature validity.\n */\nexport type InstructionInfoResult = {\n programId: string;\n descriptors: Record<string, Either<Error, SolanaInstructionInfoPayload>>;\n enumVariants: SolanaInstructionEnumVariant[];\n};\n\nexport interface InstructionInfoDataSource {\n /**\n * Fetch all instruction descriptors for one Solana program from CAL.\n * One HTTP call per `programId`; consumers fan out across multiple\n * `programId`s in parallel.\n */\n getInstructionInfo(\n params: GetInstructionInfoParams,\n ): Promise<Either<Error, InstructionInfoResult>>;\n}\n"],
5
+ "mappings": "+WAAA,IAAAA,EAAA,kBAAAC,EAAAD",
6
+ "names": ["InstructionInfoDataSource_exports", "__toCommonJS"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var a=Object.defineProperty;var u=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var p=Object.prototype.hasOwnProperty;var d=(e,r)=>{for(var o in r)a(e,o,{get:r[o],enumerable:!0})},g=(e,r,o,s)=>{if(r&&typeof r=="object"||typeof r=="function")for(let n of l(r))!p.call(e,n)&&n!==o&&a(e,n,{get:()=>r[n],enumerable:!(s=u(r,n))||s.enumerable});return e};var _=e=>g(a({},"__esModule",{value:!0}),e);var x={};d(x,{calInstructionDescriptorsCodec:()=>b});module.exports=_(x);var t=require("purify-ts");const c=t.Codec.interface({prod:(0,t.optional)(t.string),test:(0,t.optional)(t.string)}),C=t.Codec.interface({data:t.string,signatures:c}),D=t.Codec.interface({program_id:t.string,descriptor:C}),m=t.Codec.interface({data:t.string,signatures:c}),i=t.Codec.interface({descriptor:t.string}),y=t.Codec.interface({instruction_info:D,enum_variants:(0,t.optional)((0,t.record)(t.string,(0,t.record)(t.string,m))),display_fields:(0,t.optional)((0,t.array)(i)),value_flow_ports:(0,t.optional)((0,t.array)(i)),hide_rules:(0,t.optional)((0,t.array)(i)),account_resets:(0,t.optional)((0,t.array)(i))}),b=(0,t.record)(t.string,y);0&&(module.exports={calInstructionDescriptorsCodec});
2
+ //# sourceMappingURL=InstructionInfoDto.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/modules/solana/instruction-info/data/InstructionInfoDto.ts"],
4
+ "sourcesContent": ["// DTO + codecs for the CAL instruction-descriptors response (one object per\n// `programId`, wrapped in a JSON array).\n//\n// The hand-written types describe the consumed shape (with genuinely optional\n// `?:` fields); the codecs below validate that shape at runtime so\n// `HttpInstructionInfoDataSource` can hand the loaders a payload they can\n// dereference without runtime-throwing on a malformed descriptor.\n\nimport { array, Codec, optional, record, string } from \"purify-ts\";\n\nexport type CalSignatures = {\n prod?: string;\n test?: string;\n};\n\nexport type CalSignedDescriptorDto = {\n data: string;\n signatures: CalSignatures;\n};\n\n// Decoded CAL JSON shapes (snake_case mirrors the CAL response) that drive\n// host-side requirement building.\n\nexport type CalValueDto = {\n source: string;\n account_index?: number;\n data?: string;\n path?: { steps: number[] };\n};\n\nexport type CalTokenValueDto = {\n kind: string;\n value?: CalValueDto;\n account_index?: number;\n};\n\nexport type CalMintAssociationDto = {\n account_index: number;\n mint_index: number;\n};\n\nexport type CalTypePoolEntryDto = {\n index: number;\n kind: string;\n refs?: number[];\n size?: number;\n encoding?: number;\n len_kind?: string;\n flag_kind?: string;\n sentinel?: string;\n disc_kind?: string;\n total_variants?: number;\n enum_id?: string;\n};\n\nexport type CalInstructionInfoDto = {\n version: number;\n program_id: string;\n discriminator: string;\n hash: string;\n operation_type?: string;\n program_name?: string;\n descriptor: CalSignedDescriptorDto;\n idl_descriptor?: {\n type_pool?: CalTypePoolEntryDto[];\n root_type?: number;\n };\n mint_association?: CalMintAssociationDto;\n owner_association?: unknown;\n};\n\nexport type CalEnumVariantDto = {\n variant_name: string;\n payload_kind?: string;\n data: string;\n signatures: CalSignatures;\n};\n\n/** A substructure CAL serves only as opaque TLV (e.g. HIDE_RULE). */\nexport type CalSubstructureDto = {\n descriptor: string;\n};\n\nexport type CalValueFlowPortDto = CalSubstructureDto & {\n account_indices?: number[];\n account_index?: number;\n optional_account_strategy?: string;\n token_value?: CalTokenValueDto;\n};\n\nexport type CalAccountResetDto = CalSubstructureDto & {\n account_index?: number;\n require_pre_balance_zero?: boolean;\n};\n\nexport type CalDisplayFieldDto = CalSubstructureDto & {\n name?: string;\n param?: { type: string; value?: CalValueDto; token?: CalValueDto };\n};\n\nexport type CalInstructionDescriptorDto = {\n type: string;\n source?: string;\n network?: string;\n version?: string;\n instruction_info: CalInstructionInfoDto;\n enum_variants?: Record<string, Record<string, CalEnumVariantDto>>;\n display_fields?: CalDisplayFieldDto[];\n value_flow_ports?: CalValueFlowPortDto[];\n hide_rules?: CalSubstructureDto[];\n account_resets?: CalAccountResetDto[];\n};\n\n// Outer shape: array containing one envelope object keyed by program_id\n// then by discriminator hex.\nexport type CalInstructionInfoResponseDto = Array<{\n descriptors_instruction: Record<\n string,\n Record<string, CalInstructionDescriptorDto>\n >;\n}>;\n\n// --- Validation codecs (runtime). Validate only the fields the loaders read;\n// `Codec.interface` ignores unknown extras so CAL can add fields freely. ---\n\nconst calSignaturesCodec = Codec.interface({\n prod: optional(string),\n test: optional(string),\n});\n\nconst calSignedDescriptorCodec = Codec.interface({\n data: string,\n signatures: calSignaturesCodec,\n});\n\nconst calInstructionInfoCodec = Codec.interface({\n program_id: string,\n descriptor: calSignedDescriptorCodec,\n});\n\nconst calEnumVariantCodec = Codec.interface({\n data: string,\n signatures: calSignaturesCodec,\n});\n\nconst calSubstructureCodec = Codec.interface({\n descriptor: string,\n});\n\nconst calInstructionDescriptorCodec = Codec.interface({\n instruction_info: calInstructionInfoCodec,\n enum_variants: optional(record(string, record(string, calEnumVariantCodec))),\n display_fields: optional(array(calSubstructureCodec)),\n value_flow_ports: optional(array(calSubstructureCodec)),\n hide_rules: optional(array(calSubstructureCodec)),\n account_resets: optional(array(calSubstructureCodec)),\n});\n\n/**\n * Codec for the per-program descriptor map (keyed by discriminator hex).\n * Used by the datasource to validate the inner CAL payload before handing\n * it to the loaders. Only loader-consumed fields are validated; unrelated\n * CAL fields (`idl_descriptor`, `mint_association`, \u2026) are ignored.\n */\nexport const calInstructionDescriptorsCodec = record(\n string,\n calInstructionDescriptorCodec,\n);\n"],
5
+ "mappings": "yaAAA,IAAAA,EAAA,GAAAC,EAAAD,EAAA,oCAAAE,IAAA,eAAAC,EAAAH,GAQA,IAAAI,EAAuD,qBAqHvD,MAAMC,EAAqB,QAAM,UAAU,CACzC,QAAM,YAAS,QAAM,EACrB,QAAM,YAAS,QAAM,CACvB,CAAC,EAEKC,EAA2B,QAAM,UAAU,CAC/C,KAAM,SACN,WAAYD,CACd,CAAC,EAEKE,EAA0B,QAAM,UAAU,CAC9C,WAAY,SACZ,WAAYD,CACd,CAAC,EAEKE,EAAsB,QAAM,UAAU,CAC1C,KAAM,SACN,WAAYH,CACd,CAAC,EAEKI,EAAuB,QAAM,UAAU,CAC3C,WAAY,QACd,CAAC,EAEKC,EAAgC,QAAM,UAAU,CACpD,iBAAkBH,EAClB,iBAAe,eAAS,UAAO,YAAQ,UAAO,SAAQC,CAAmB,CAAC,CAAC,EAC3E,kBAAgB,eAAS,SAAMC,CAAoB,CAAC,EACpD,oBAAkB,eAAS,SAAMA,CAAoB,CAAC,EACtD,cAAY,eAAS,SAAMA,CAAoB,CAAC,EAChD,kBAAgB,eAAS,SAAMA,CAAoB,CAAC,CACtD,CAAC,EAQYP,KAAiC,UAC5C,SACAQ,CACF",
6
+ "names": ["InstructionInfoDto_exports", "__export", "calInstructionDescriptorsCodec", "__toCommonJS", "import_purify_ts", "calSignaturesCodec", "calSignedDescriptorCodec", "calInstructionInfoCodec", "calEnumVariantCodec", "calSubstructureCodec", "calInstructionDescriptorCodec"]
7
+ }
@@ -0,0 +1,2 @@
1
+ "use strict";var s=Object.defineProperty;var C=Object.getOwnPropertyDescriptor;var I=Object.getOwnPropertyNames;var D=Object.prototype.hasOwnProperty;var S=(n,t)=>{for(var a in t)s(n,a,{get:t[a],enumerable:!0})},g=(n,t,a,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of I(t))!D.call(n,r)&&r!==a&&s(n,r,{get:()=>t[r],enumerable:!(o=C(t,r))||o.enumerable});return n};var E=n=>g(s({},"__esModule",{value:!0}),n);var P={};S(P,{toAccountResets:()=>_,toDisplayFields:()=>f,toInstructionInfoPayload:()=>V,toProgramEnumVariants:()=>F,toValueFlowPorts:()=>d});module.exports=E(P);var i=require("purify-ts"),e=require("../../../../modules/solana/model/SolanaPayloads"),l=require("../../../../shared/utils/uIntCodec");function p(n,t){return n[t]}function d(n=[]){return n.map(t=>({account_indices:t.account_indices,account_index:t.account_index,optional_account_strategy:t.optional_account_strategy,token_value:t.token_value}))}function _(n=[]){return n.flatMap(t=>t.account_index===void 0?[]:[{account_index:t.account_index,require_pre_balance_zero:t.require_pre_balance_zero}])}function f(n=[]){return n.map(t=>({name:t.name,param:t.param??{type:""}}))}function x(n){return[...(n.display_fields??[]).map(t=>({kind:e.SolanaInstructionSubstructureKind.DISPLAY_FIELD,data:t.descriptor})),...(n.value_flow_ports??[]).map(t=>({kind:e.SolanaInstructionSubstructureKind.VALUE_FLOW_PORT,data:t.descriptor})),...(n.hide_rules??[]).map(t=>({kind:e.SolanaInstructionSubstructureKind.HIDE_RULE,data:t.descriptor})),...(n.account_resets??[]).map(t=>({kind:e.SolanaInstructionSubstructureKind.ACCOUNT_RESET,data:t.descriptor}))]}function m(n,t){const a=[];for(const[o,r]of Object.entries(n.enum_variants??{}))for(const[y,u]of Object.entries(r)){const c=Number(y);l.u16Codec.decode(c).isLeft()||a.push({enumId:o,variantIndex:c,descriptor:{data:u.data,signature:p(u.signatures,t)??""}})}return a}function F(n,t){return Object.values(n).flatMap(a=>m(a,t))}function V(n,t,a){const o=t.instruction_info,r=p(o.descriptor.signatures,a);return r?(0,i.Right)({programId:o.program_id,discriminator:n,instructionInfo:{data:o.descriptor.data,signature:r},substructures:x(t),enumVariants:m(t,a),idlDescriptor:{typePool:o.idl_descriptor?.type_pool??[],rootType:o.idl_descriptor?.root_type??0},mintAssociations:o.mint_association?[o.mint_association]:[],valueFlowPorts:d(t.value_flow_ports),accountResets:_(t.account_resets),displayFields:f(t.display_fields)}):(0,i.Left)(new Error(`[ContextModule] InstructionInfoDataSource: missing '${a}' signature for (${o.program_id}, ${n})`))}0&&(module.exports={toAccountResets,toDisplayFields,toInstructionInfoPayload,toProgramEnumVariants,toValueFlowPorts});
2
+ //# sourceMappingURL=InstructionInfoMapper.js.map