@ledgerhq/context-module 2.0.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 (468) hide show
  1. package/lib/cjs/package.json +3 -2
  2. package/lib/cjs/src/ContextModuleBuilder.js +1 -1
  3. package/lib/cjs/src/ContextModuleBuilder.js.map +2 -2
  4. package/lib/cjs/src/DefaultContextModule.js +1 -1
  5. package/lib/cjs/src/DefaultContextModule.js.map +3 -3
  6. package/lib/cjs/src/di.js +1 -1
  7. package/lib/cjs/src/di.js.map +3 -3
  8. package/lib/cjs/src/index.js +1 -1
  9. package/lib/cjs/src/index.js.map +2 -2
  10. package/lib/cjs/src/modules/ethereum/gated-signing/domain/GatedSigningContextLoader.js +1 -1
  11. package/lib/cjs/src/modules/ethereum/gated-signing/domain/GatedSigningContextLoader.js.map +3 -3
  12. package/lib/cjs/src/modules/ethereum/gated-signing/domain/GatedSigningContextLoader.test.js +1 -1
  13. package/lib/cjs/src/modules/ethereum/gated-signing/domain/GatedSigningContextLoader.test.js.map +3 -3
  14. package/lib/cjs/src/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader.js +1 -1
  15. package/lib/cjs/src/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader.js.map +3 -3
  16. package/lib/cjs/src/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader.test.js +1 -1
  17. package/lib/cjs/src/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader.test.js.map +3 -3
  18. package/lib/cjs/src/modules/multichain/pki/model/KeyId.js +1 -1
  19. package/lib/cjs/src/modules/multichain/pki/model/KeyId.js.map +2 -2
  20. package/lib/cjs/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.js +1 -1
  21. package/lib/cjs/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.js.map +3 -3
  22. package/lib/cjs/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.test.js +2 -0
  23. package/lib/cjs/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.test.js.map +7 -0
  24. package/lib/cjs/src/modules/solana/alt-resolution/data/AltResolutionDataSource.js +2 -0
  25. package/lib/cjs/src/modules/solana/alt-resolution/data/AltResolutionDataSource.js.map +7 -0
  26. package/lib/cjs/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.js +2 -0
  27. package/lib/cjs/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.js.map +7 -0
  28. package/lib/cjs/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.test.js +2 -0
  29. package/lib/cjs/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.test.js.map +7 -0
  30. package/lib/cjs/src/modules/solana/alt-resolution/di/altResolutionModuleFactory.js +2 -0
  31. package/lib/cjs/src/modules/solana/alt-resolution/di/altResolutionModuleFactory.js.map +7 -0
  32. package/lib/cjs/src/modules/solana/alt-resolution/di/altResolutionTypes.js +2 -0
  33. package/lib/cjs/src/modules/solana/alt-resolution/di/altResolutionTypes.js.map +7 -0
  34. package/lib/cjs/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.js +2 -0
  35. package/lib/cjs/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.js.map +7 -0
  36. package/lib/cjs/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.test.js +2 -0
  37. package/lib/cjs/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.test.js.map +7 -0
  38. package/lib/cjs/src/modules/solana/enum-variant/di/enumVariantModuleFactory.js +2 -0
  39. package/lib/cjs/src/modules/solana/enum-variant/di/enumVariantModuleFactory.js.map +7 -0
  40. package/lib/cjs/src/modules/solana/enum-variant/di/enumVariantTypes.js +2 -0
  41. package/lib/cjs/src/modules/solana/enum-variant/di/enumVariantTypes.js.map +7 -0
  42. package/lib/cjs/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.js +2 -0
  43. package/lib/cjs/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.js.map +7 -0
  44. package/lib/cjs/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.test.js +2 -0
  45. package/lib/cjs/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.test.js.map +7 -0
  46. package/lib/cjs/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.js +2 -0
  47. package/lib/cjs/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.js.map +7 -0
  48. package/lib/cjs/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.test.js +2 -0
  49. package/lib/cjs/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.test.js.map +7 -0
  50. package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoDataSource.js +2 -0
  51. package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoDataSource.js.map +7 -0
  52. package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoDto.js +2 -0
  53. package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoDto.js.map +7 -0
  54. package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoMapper.js +2 -0
  55. package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoMapper.js.map +7 -0
  56. package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoMapper.test.js +2 -0
  57. package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoMapper.test.js.map +7 -0
  58. package/lib/cjs/src/modules/solana/instruction-info/di/instructionInfoModuleFactory.js +2 -0
  59. package/lib/cjs/src/modules/solana/instruction-info/di/instructionInfoModuleFactory.js.map +7 -0
  60. package/lib/cjs/src/modules/solana/instruction-info/di/instructionInfoTypes.js +2 -0
  61. package/lib/cjs/src/modules/solana/instruction-info/di/instructionInfoTypes.js.map +7 -0
  62. package/lib/cjs/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.js +2 -0
  63. package/lib/cjs/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.js.map +7 -0
  64. package/lib/cjs/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.test.js +2 -0
  65. package/lib/cjs/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.test.js.map +7 -0
  66. package/lib/cjs/src/modules/solana/lifi/data/HttpLifiDataSource.js +1 -1
  67. package/lib/cjs/src/modules/solana/lifi/data/HttpLifiDataSource.js.map +2 -2
  68. package/lib/cjs/src/modules/solana/lifi/data/HttpLifiDataSource.test.js +1 -1
  69. package/lib/cjs/src/modules/solana/lifi/data/HttpLifiDataSource.test.js.map +2 -2
  70. package/lib/cjs/src/modules/solana/model/SolanaClearSignContext.js +1 -1
  71. package/lib/cjs/src/modules/solana/model/SolanaClearSignContext.js.map +3 -3
  72. package/lib/cjs/src/modules/solana/model/SolanaContextTypes.js +1 -1
  73. package/lib/cjs/src/modules/solana/model/SolanaContextTypes.js.map +1 -1
  74. package/lib/cjs/src/modules/solana/model/SolanaPayloads.js +1 -1
  75. package/lib/cjs/src/modules/solana/model/SolanaPayloads.js.map +3 -3
  76. package/lib/cjs/src/modules/solana/model/SolanaTransactionScanChainId.js +1 -1
  77. package/lib/cjs/src/modules/solana/model/SolanaTransactionScanChainId.js.map +2 -2
  78. package/lib/cjs/src/modules/solana/owner-info/domain/OwnerInfoContextLoader.js +1 -1
  79. package/lib/cjs/src/modules/solana/owner-info/domain/OwnerInfoContextLoader.js.map +2 -2
  80. package/lib/cjs/src/modules/solana/owner-info/domain/OwnerInfoContextLoader.test.js +1 -1
  81. package/lib/cjs/src/modules/solana/owner-info/domain/OwnerInfoContextLoader.test.js.map +2 -2
  82. package/lib/cjs/src/modules/solana/owner-info/domain/solanaContextTypes.js +1 -1
  83. package/lib/cjs/src/modules/solana/owner-info/domain/solanaContextTypes.js.map +1 -1
  84. package/lib/cjs/src/modules/solana/token/domain/TokenContextLoader.js +1 -1
  85. package/lib/cjs/src/modules/solana/token/domain/TokenContextLoader.js.map +3 -3
  86. package/lib/cjs/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.js +2 -0
  87. package/lib/cjs/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.js.map +7 -0
  88. package/lib/cjs/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.test.js +2 -0
  89. package/lib/cjs/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.test.js.map +7 -0
  90. package/lib/cjs/src/modules/solana/token-account-state/data/TokenAccountStateDataSource.js +2 -0
  91. package/lib/cjs/src/modules/solana/token-account-state/data/TokenAccountStateDataSource.js.map +7 -0
  92. package/lib/cjs/src/modules/solana/token-account-state/di/tokenAccountStateModuleFactory.js +2 -0
  93. package/lib/cjs/src/modules/solana/token-account-state/di/tokenAccountStateModuleFactory.js.map +7 -0
  94. package/lib/cjs/src/modules/solana/token-account-state/di/tokenAccountStateTypes.js +2 -0
  95. package/lib/cjs/src/modules/solana/token-account-state/di/tokenAccountStateTypes.js.map +7 -0
  96. package/lib/cjs/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.js +2 -0
  97. package/lib/cjs/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.js.map +7 -0
  98. package/lib/cjs/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.test.js +2 -0
  99. package/lib/cjs/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.test.js.map +7 -0
  100. package/lib/cjs/src/modules/solana/token-info/data/HttpTokenInfoDataSource.js +2 -0
  101. package/lib/cjs/src/modules/solana/token-info/data/HttpTokenInfoDataSource.js.map +7 -0
  102. package/lib/cjs/src/modules/solana/token-info/data/HttpTokenInfoDataSource.test.js +2 -0
  103. package/lib/cjs/src/modules/solana/token-info/data/HttpTokenInfoDataSource.test.js.map +7 -0
  104. package/lib/cjs/src/modules/solana/token-info/data/TokenInfoDataSource.js +2 -0
  105. package/lib/cjs/src/modules/solana/token-info/data/TokenInfoDataSource.js.map +7 -0
  106. package/lib/cjs/src/modules/solana/token-info/di/tokenInfoModuleFactory.js +2 -0
  107. package/lib/cjs/src/modules/solana/token-info/di/tokenInfoModuleFactory.js.map +7 -0
  108. package/lib/cjs/src/modules/solana/token-info/di/tokenInfoTypes.js +2 -0
  109. package/lib/cjs/src/modules/solana/token-info/di/tokenInfoTypes.js.map +7 -0
  110. package/lib/cjs/src/modules/solana/token-info/domain/TokenInfoContextLoader.js +2 -0
  111. package/lib/cjs/src/modules/solana/token-info/domain/TokenInfoContextLoader.js.map +7 -0
  112. package/lib/cjs/src/modules/solana/token-info/domain/TokenInfoContextLoader.test.js +2 -0
  113. package/lib/cjs/src/modules/solana/token-info/domain/TokenInfoContextLoader.test.js.map +7 -0
  114. package/lib/cjs/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.js +2 -0
  115. package/lib/cjs/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.js.map +7 -0
  116. package/lib/cjs/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.test.js +2 -0
  117. package/lib/cjs/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.test.js.map +7 -0
  118. package/lib/cjs/src/modules/solana/trusted-name/data/TrustedNameDataSource.js +2 -0
  119. package/lib/cjs/src/modules/solana/trusted-name/data/TrustedNameDataSource.js.map +7 -0
  120. package/lib/cjs/src/modules/solana/trusted-name/di/trustedNameModuleFactory.js +2 -0
  121. package/lib/cjs/src/modules/solana/trusted-name/di/trustedNameModuleFactory.js.map +7 -0
  122. package/lib/cjs/src/modules/solana/trusted-name/di/trustedNameTypes.js +2 -0
  123. package/lib/cjs/src/modules/solana/trusted-name/di/trustedNameTypes.js.map +7 -0
  124. package/lib/cjs/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.js +2 -0
  125. package/lib/cjs/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.js.map +7 -0
  126. package/lib/cjs/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.test.js +2 -0
  127. package/lib/cjs/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.test.js.map +7 -0
  128. package/lib/cjs/src/shared/model/ClearSignContext.js +1 -1
  129. package/lib/cjs/src/shared/model/ClearSignContext.js.map +2 -2
  130. package/lib/cjs/src/shared/utils/HexStringUtils.js +1 -1
  131. package/lib/cjs/src/shared/utils/HexStringUtils.js.map +3 -3
  132. package/lib/cjs/src/shared/utils/HexStringUtils.test.js +1 -1
  133. package/lib/cjs/src/shared/utils/HexStringUtils.test.js.map +2 -2
  134. package/lib/cjs/src/shared/utils/bs58Encoder.js +2 -0
  135. package/lib/cjs/src/shared/utils/bs58Encoder.js.map +7 -0
  136. package/lib/cjs/src/shared/utils/certificateCache.js +2 -0
  137. package/lib/cjs/src/shared/utils/certificateCache.js.map +7 -0
  138. package/lib/cjs/src/shared/utils/certificateCache.test.js +2 -0
  139. package/lib/cjs/src/shared/utils/certificateCache.test.js.map +7 -0
  140. package/lib/cjs/src/shared/utils/certificateResult.js +2 -0
  141. package/lib/cjs/src/shared/utils/certificateResult.js.map +7 -0
  142. package/lib/cjs/src/shared/utils/certificateResult.test.js +2 -0
  143. package/lib/cjs/src/shared/utils/certificateResult.test.js.map +7 -0
  144. package/lib/cjs/src/shared/utils/challengeBoundLoader.js +2 -0
  145. package/lib/cjs/src/shared/utils/challengeBoundLoader.js.map +7 -0
  146. package/lib/cjs/src/shared/utils/challengeBoundLoader.test.js +2 -0
  147. package/lib/cjs/src/shared/utils/challengeBoundLoader.test.js.map +7 -0
  148. package/lib/cjs/src/shared/utils/deviceModelIdCodec.js +2 -0
  149. package/lib/cjs/src/shared/utils/deviceModelIdCodec.js.map +7 -0
  150. package/lib/cjs/src/shared/utils/deviceModelIdCodec.test.js +2 -0
  151. package/lib/cjs/src/shared/utils/deviceModelIdCodec.test.js.map +7 -0
  152. package/lib/cjs/src/shared/utils/signedDescriptorDto.js +2 -0
  153. package/lib/cjs/src/shared/utils/signedDescriptorDto.js.map +7 -0
  154. package/lib/cjs/src/shared/utils/signedDescriptorDto.test.js +2 -0
  155. package/lib/cjs/src/shared/utils/signedDescriptorDto.test.js.map +7 -0
  156. package/lib/cjs/src/shared/utils/uIntCodec.js +2 -0
  157. package/lib/cjs/src/shared/utils/uIntCodec.js.map +7 -0
  158. package/lib/cjs/src/shared/utils/uIntCodec.test.js +2 -0
  159. package/lib/cjs/src/shared/utils/uIntCodec.test.js.map +7 -0
  160. package/lib/cjs/src/shared/utils/uint8ArrayCodec.js +2 -0
  161. package/lib/cjs/src/shared/utils/uint8ArrayCodec.js.map +7 -0
  162. package/lib/cjs/src/shared/utils/uint8ArrayCodec.test.js +2 -0
  163. package/lib/cjs/src/shared/utils/uint8ArrayCodec.test.js.map +7 -0
  164. package/lib/esm/package.json +3 -2
  165. package/lib/esm/src/ContextModuleBuilder.js +1 -1
  166. package/lib/esm/src/ContextModuleBuilder.js.map +2 -2
  167. package/lib/esm/src/DefaultContextModule.js +1 -1
  168. package/lib/esm/src/DefaultContextModule.js.map +3 -3
  169. package/lib/esm/src/di.js +1 -1
  170. package/lib/esm/src/di.js.map +3 -3
  171. package/lib/esm/src/index.js +1 -1
  172. package/lib/esm/src/index.js.map +2 -2
  173. package/lib/esm/src/modules/ethereum/gated-signing/domain/GatedSigningContextLoader.js +1 -1
  174. package/lib/esm/src/modules/ethereum/gated-signing/domain/GatedSigningContextLoader.js.map +3 -3
  175. package/lib/esm/src/modules/ethereum/gated-signing/domain/GatedSigningContextLoader.test.js +1 -1
  176. package/lib/esm/src/modules/ethereum/gated-signing/domain/GatedSigningContextLoader.test.js.map +3 -3
  177. package/lib/esm/src/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader.js +1 -1
  178. package/lib/esm/src/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader.js.map +3 -3
  179. package/lib/esm/src/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader.test.js +1 -1
  180. package/lib/esm/src/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader.test.js.map +3 -3
  181. package/lib/esm/src/modules/multichain/pki/model/KeyId.js +1 -1
  182. package/lib/esm/src/modules/multichain/pki/model/KeyId.js.map +2 -2
  183. package/lib/esm/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.js +1 -1
  184. package/lib/esm/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.js.map +3 -3
  185. package/lib/esm/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.test.js +2 -0
  186. package/lib/esm/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.test.js.map +7 -0
  187. package/lib/esm/src/modules/solana/alt-resolution/data/AltResolutionDataSource.js +1 -0
  188. package/lib/esm/src/modules/solana/alt-resolution/data/AltResolutionDataSource.js.map +7 -0
  189. package/lib/esm/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.js +2 -0
  190. package/lib/esm/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.js.map +7 -0
  191. package/lib/esm/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.test.js +2 -0
  192. package/lib/esm/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.test.js.map +7 -0
  193. package/lib/esm/src/modules/solana/alt-resolution/di/altResolutionModuleFactory.js +2 -0
  194. package/lib/esm/src/modules/solana/alt-resolution/di/altResolutionModuleFactory.js.map +7 -0
  195. package/lib/esm/src/modules/solana/alt-resolution/di/altResolutionTypes.js +2 -0
  196. package/lib/esm/src/modules/solana/alt-resolution/di/altResolutionTypes.js.map +7 -0
  197. package/lib/esm/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.js +2 -0
  198. package/lib/esm/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.js.map +7 -0
  199. package/lib/esm/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.test.js +2 -0
  200. package/lib/esm/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.test.js.map +7 -0
  201. package/lib/esm/src/modules/solana/enum-variant/di/enumVariantModuleFactory.js +2 -0
  202. package/lib/esm/src/modules/solana/enum-variant/di/enumVariantModuleFactory.js.map +7 -0
  203. package/lib/esm/src/modules/solana/enum-variant/di/enumVariantTypes.js +2 -0
  204. package/lib/esm/src/modules/solana/enum-variant/di/enumVariantTypes.js.map +7 -0
  205. package/lib/esm/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.js +2 -0
  206. package/lib/esm/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.js.map +7 -0
  207. package/lib/esm/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.test.js +2 -0
  208. package/lib/esm/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.test.js.map +7 -0
  209. package/lib/esm/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.js +2 -0
  210. package/lib/esm/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.js.map +7 -0
  211. package/lib/esm/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.test.js +2 -0
  212. package/lib/esm/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.test.js.map +7 -0
  213. package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoDataSource.js +1 -0
  214. package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoDataSource.js.map +7 -0
  215. package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoDto.js +2 -0
  216. package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoDto.js.map +7 -0
  217. package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoMapper.js +2 -0
  218. package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoMapper.js.map +7 -0
  219. package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoMapper.test.js +2 -0
  220. package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoMapper.test.js.map +7 -0
  221. package/lib/esm/src/modules/solana/instruction-info/di/instructionInfoModuleFactory.js +2 -0
  222. package/lib/esm/src/modules/solana/instruction-info/di/instructionInfoModuleFactory.js.map +7 -0
  223. package/lib/esm/src/modules/solana/instruction-info/di/instructionInfoTypes.js +2 -0
  224. package/lib/esm/src/modules/solana/instruction-info/di/instructionInfoTypes.js.map +7 -0
  225. package/lib/esm/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.js +2 -0
  226. package/lib/esm/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.js.map +7 -0
  227. package/lib/esm/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.test.js +2 -0
  228. package/lib/esm/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.test.js.map +7 -0
  229. package/lib/esm/src/modules/solana/lifi/data/HttpLifiDataSource.js +1 -1
  230. package/lib/esm/src/modules/solana/lifi/data/HttpLifiDataSource.js.map +2 -2
  231. package/lib/esm/src/modules/solana/lifi/data/HttpLifiDataSource.test.js +1 -1
  232. package/lib/esm/src/modules/solana/lifi/data/HttpLifiDataSource.test.js.map +2 -2
  233. package/lib/esm/src/modules/solana/model/SolanaClearSignContext.js +1 -1
  234. package/lib/esm/src/modules/solana/model/SolanaClearSignContext.js.map +3 -3
  235. package/lib/esm/src/modules/solana/model/SolanaPayloads.js +1 -0
  236. package/lib/esm/src/modules/solana/model/SolanaPayloads.js.map +4 -4
  237. package/lib/esm/src/modules/solana/model/SolanaTransactionScanChainId.js +1 -1
  238. package/lib/esm/src/modules/solana/model/SolanaTransactionScanChainId.js.map +2 -2
  239. package/lib/esm/src/modules/solana/owner-info/domain/OwnerInfoContextLoader.js +1 -1
  240. package/lib/esm/src/modules/solana/owner-info/domain/OwnerInfoContextLoader.js.map +2 -2
  241. package/lib/esm/src/modules/solana/owner-info/domain/OwnerInfoContextLoader.test.js +1 -1
  242. package/lib/esm/src/modules/solana/owner-info/domain/OwnerInfoContextLoader.test.js.map +2 -2
  243. package/lib/esm/src/modules/solana/token/domain/TokenContextLoader.js +1 -1
  244. package/lib/esm/src/modules/solana/token/domain/TokenContextLoader.js.map +3 -3
  245. package/lib/esm/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.js +2 -0
  246. package/lib/esm/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.js.map +7 -0
  247. package/lib/esm/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.test.js +2 -0
  248. package/lib/esm/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.test.js.map +7 -0
  249. package/lib/esm/src/modules/solana/token-account-state/data/TokenAccountStateDataSource.js +1 -0
  250. package/lib/esm/src/modules/solana/token-account-state/data/TokenAccountStateDataSource.js.map +7 -0
  251. package/lib/esm/src/modules/solana/token-account-state/di/tokenAccountStateModuleFactory.js +2 -0
  252. package/lib/esm/src/modules/solana/token-account-state/di/tokenAccountStateModuleFactory.js.map +7 -0
  253. package/lib/esm/src/modules/solana/token-account-state/di/tokenAccountStateTypes.js +2 -0
  254. package/lib/esm/src/modules/solana/token-account-state/di/tokenAccountStateTypes.js.map +7 -0
  255. package/lib/esm/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.js +2 -0
  256. package/lib/esm/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.js.map +7 -0
  257. package/lib/esm/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.test.js +2 -0
  258. package/lib/esm/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.test.js.map +7 -0
  259. package/lib/esm/src/modules/solana/token-info/data/HttpTokenInfoDataSource.js +2 -0
  260. package/lib/esm/src/modules/solana/token-info/data/HttpTokenInfoDataSource.js.map +7 -0
  261. package/lib/esm/src/modules/solana/token-info/data/HttpTokenInfoDataSource.test.js +2 -0
  262. package/lib/esm/src/modules/solana/token-info/data/HttpTokenInfoDataSource.test.js.map +7 -0
  263. package/lib/esm/src/modules/solana/token-info/data/TokenInfoDataSource.js +1 -0
  264. package/lib/esm/src/modules/solana/token-info/data/TokenInfoDataSource.js.map +7 -0
  265. package/lib/esm/src/modules/solana/token-info/di/tokenInfoModuleFactory.js +2 -0
  266. package/lib/esm/src/modules/solana/token-info/di/tokenInfoModuleFactory.js.map +7 -0
  267. package/lib/esm/src/modules/solana/token-info/di/tokenInfoTypes.js +2 -0
  268. package/lib/esm/src/modules/solana/token-info/di/tokenInfoTypes.js.map +7 -0
  269. package/lib/esm/src/modules/solana/token-info/domain/TokenInfoContextLoader.js +2 -0
  270. package/lib/esm/src/modules/solana/token-info/domain/TokenInfoContextLoader.js.map +7 -0
  271. package/lib/esm/src/modules/solana/token-info/domain/TokenInfoContextLoader.test.js +2 -0
  272. package/lib/esm/src/modules/solana/token-info/domain/TokenInfoContextLoader.test.js.map +7 -0
  273. package/lib/esm/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.js +2 -0
  274. package/lib/esm/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.js.map +7 -0
  275. package/lib/esm/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.test.js +2 -0
  276. package/lib/esm/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.test.js.map +7 -0
  277. package/lib/esm/src/modules/solana/trusted-name/data/TrustedNameDataSource.js +1 -0
  278. package/lib/esm/src/modules/solana/trusted-name/data/TrustedNameDataSource.js.map +7 -0
  279. package/lib/esm/src/modules/solana/trusted-name/di/trustedNameModuleFactory.js +2 -0
  280. package/lib/esm/src/modules/solana/trusted-name/di/trustedNameModuleFactory.js.map +7 -0
  281. package/lib/esm/src/modules/solana/trusted-name/di/trustedNameTypes.js +2 -0
  282. package/lib/esm/src/modules/solana/trusted-name/di/trustedNameTypes.js.map +7 -0
  283. package/lib/esm/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.js +2 -0
  284. package/lib/esm/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.js.map +7 -0
  285. package/lib/esm/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.test.js +2 -0
  286. package/lib/esm/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.test.js.map +7 -0
  287. package/lib/esm/src/shared/model/ClearSignContext.js +1 -1
  288. package/lib/esm/src/shared/model/ClearSignContext.js.map +2 -2
  289. package/lib/esm/src/shared/utils/HexStringUtils.js +1 -1
  290. package/lib/esm/src/shared/utils/HexStringUtils.js.map +3 -3
  291. package/lib/esm/src/shared/utils/HexStringUtils.test.js +1 -1
  292. package/lib/esm/src/shared/utils/HexStringUtils.test.js.map +2 -2
  293. package/lib/esm/src/shared/utils/bs58Encoder.js +2 -0
  294. package/lib/esm/src/shared/utils/bs58Encoder.js.map +7 -0
  295. package/lib/esm/src/shared/utils/certificateCache.js +2 -0
  296. package/lib/esm/src/shared/utils/certificateCache.js.map +7 -0
  297. package/lib/esm/src/shared/utils/certificateCache.test.js +2 -0
  298. package/lib/esm/src/shared/utils/certificateCache.test.js.map +7 -0
  299. package/lib/esm/src/shared/utils/certificateResult.js +2 -0
  300. package/lib/esm/src/shared/utils/certificateResult.js.map +7 -0
  301. package/lib/esm/src/shared/utils/certificateResult.test.js +2 -0
  302. package/lib/esm/src/shared/utils/certificateResult.test.js.map +7 -0
  303. package/lib/esm/src/shared/utils/challengeBoundLoader.js +2 -0
  304. package/lib/esm/src/shared/utils/challengeBoundLoader.js.map +7 -0
  305. package/lib/esm/src/shared/utils/challengeBoundLoader.test.js +2 -0
  306. package/lib/esm/src/shared/utils/challengeBoundLoader.test.js.map +7 -0
  307. package/lib/esm/src/shared/utils/deviceModelIdCodec.js +2 -0
  308. package/lib/esm/src/shared/utils/deviceModelIdCodec.js.map +7 -0
  309. package/lib/esm/src/shared/utils/deviceModelIdCodec.test.js +2 -0
  310. package/lib/esm/src/shared/utils/deviceModelIdCodec.test.js.map +7 -0
  311. package/lib/esm/src/shared/utils/signedDescriptorDto.js +2 -0
  312. package/lib/esm/src/shared/utils/signedDescriptorDto.js.map +7 -0
  313. package/lib/esm/src/shared/utils/signedDescriptorDto.test.js +2 -0
  314. package/lib/esm/src/shared/utils/signedDescriptorDto.test.js.map +7 -0
  315. package/lib/esm/src/shared/utils/uIntCodec.js +2 -0
  316. package/lib/esm/src/shared/utils/uIntCodec.js.map +7 -0
  317. package/lib/esm/src/shared/utils/uIntCodec.test.js +2 -0
  318. package/lib/esm/src/shared/utils/uIntCodec.test.js.map +7 -0
  319. package/lib/esm/src/shared/utils/uint8ArrayCodec.js +2 -0
  320. package/lib/esm/src/shared/utils/uint8ArrayCodec.js.map +7 -0
  321. package/lib/esm/src/shared/utils/uint8ArrayCodec.test.js +2 -0
  322. package/lib/esm/src/shared/utils/uint8ArrayCodec.test.js.map +7 -0
  323. package/lib/types/src/DefaultContextModule.d.ts.map +1 -1
  324. package/lib/types/src/di.d.ts.map +1 -1
  325. package/lib/types/src/index.d.ts +16 -0
  326. package/lib/types/src/index.d.ts.map +1 -1
  327. package/lib/types/src/modules/ethereum/gated-signing/domain/GatedSigningContextLoader.d.ts +3 -2
  328. package/lib/types/src/modules/ethereum/gated-signing/domain/GatedSigningContextLoader.d.ts.map +1 -1
  329. package/lib/types/src/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader.d.ts +3 -2
  330. package/lib/types/src/modules/ethereum/gated-signing/domain/GatedSigningTypedDataContextLoader.d.ts.map +1 -1
  331. package/lib/types/src/modules/multichain/pki/model/KeyId.d.ts +1 -0
  332. package/lib/types/src/modules/multichain/pki/model/KeyId.d.ts.map +1 -1
  333. package/lib/types/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.d.ts +17 -3
  334. package/lib/types/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.d.ts.map +1 -1
  335. package/lib/types/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.test.d.ts +2 -0
  336. package/lib/types/src/modules/multichain/transaction-check/loaders/SolanaTransactionCheckLoader.test.d.ts.map +1 -0
  337. package/lib/types/src/modules/solana/alt-resolution/data/AltResolutionDataSource.d.ts +17 -0
  338. package/lib/types/src/modules/solana/alt-resolution/data/AltResolutionDataSource.d.ts.map +1 -0
  339. package/lib/types/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.d.ts +11 -0
  340. package/lib/types/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.d.ts.map +1 -0
  341. package/lib/types/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.test.d.ts +2 -0
  342. package/lib/types/src/modules/solana/alt-resolution/data/HttpAltResolutionDataSource.test.d.ts.map +1 -0
  343. package/lib/types/src/modules/solana/alt-resolution/di/altResolutionModuleFactory.d.ts +3 -0
  344. package/lib/types/src/modules/solana/alt-resolution/di/altResolutionModuleFactory.d.ts.map +1 -0
  345. package/lib/types/src/modules/solana/alt-resolution/di/altResolutionTypes.d.ts +5 -0
  346. package/lib/types/src/modules/solana/alt-resolution/di/altResolutionTypes.d.ts.map +1 -0
  347. package/lib/types/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.d.ts +23 -0
  348. package/lib/types/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.d.ts.map +1 -0
  349. package/lib/types/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.test.d.ts +2 -0
  350. package/lib/types/src/modules/solana/alt-resolution/domain/AltResolutionContextLoader.test.d.ts.map +1 -0
  351. package/lib/types/src/modules/solana/enum-variant/di/enumVariantModuleFactory.d.ts +3 -0
  352. package/lib/types/src/modules/solana/enum-variant/di/enumVariantModuleFactory.d.ts.map +1 -0
  353. package/lib/types/src/modules/solana/enum-variant/di/enumVariantTypes.d.ts +4 -0
  354. package/lib/types/src/modules/solana/enum-variant/di/enumVariantTypes.d.ts.map +1 -0
  355. package/lib/types/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.d.ts +45 -0
  356. package/lib/types/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.d.ts.map +1 -0
  357. package/lib/types/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.test.d.ts +2 -0
  358. package/lib/types/src/modules/solana/enum-variant/domain/EnumVariantContextLoader.test.d.ts.map +1 -0
  359. package/lib/types/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.d.ts +11 -0
  360. package/lib/types/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.d.ts.map +1 -0
  361. package/lib/types/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.test.d.ts +2 -0
  362. package/lib/types/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.test.d.ts.map +1 -0
  363. package/lib/types/src/modules/solana/instruction-info/data/InstructionInfoDataSource.d.ts +32 -0
  364. package/lib/types/src/modules/solana/instruction-info/data/InstructionInfoDataSource.d.ts.map +1 -0
  365. package/lib/types/src/modules/solana/instruction-info/data/InstructionInfoDto.d.ts +135 -0
  366. package/lib/types/src/modules/solana/instruction-info/data/InstructionInfoDto.d.ts.map +1 -0
  367. package/lib/types/src/modules/solana/instruction-info/data/InstructionInfoMapper.d.ts +23 -0
  368. package/lib/types/src/modules/solana/instruction-info/data/InstructionInfoMapper.d.ts.map +1 -0
  369. package/lib/types/src/modules/solana/instruction-info/data/InstructionInfoMapper.test.d.ts +2 -0
  370. package/lib/types/src/modules/solana/instruction-info/data/InstructionInfoMapper.test.d.ts.map +1 -0
  371. package/lib/types/src/modules/solana/instruction-info/di/instructionInfoModuleFactory.d.ts +3 -0
  372. package/lib/types/src/modules/solana/instruction-info/di/instructionInfoModuleFactory.d.ts.map +1 -0
  373. package/lib/types/src/modules/solana/instruction-info/di/instructionInfoTypes.d.ts +5 -0
  374. package/lib/types/src/modules/solana/instruction-info/di/instructionInfoTypes.d.ts.map +1 -0
  375. package/lib/types/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.d.ts +39 -0
  376. package/lib/types/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.d.ts.map +1 -0
  377. package/lib/types/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.test.d.ts +2 -0
  378. package/lib/types/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.test.d.ts.map +1 -0
  379. package/lib/types/src/modules/solana/lifi/data/HttpLifiDataSource.d.ts.map +1 -1
  380. package/lib/types/src/modules/solana/model/SolanaClearSignContext.d.ts +33 -2
  381. package/lib/types/src/modules/solana/model/SolanaClearSignContext.d.ts.map +1 -1
  382. package/lib/types/src/modules/solana/model/SolanaContextTypes.d.ts +8 -1
  383. package/lib/types/src/modules/solana/model/SolanaContextTypes.d.ts.map +1 -1
  384. package/lib/types/src/modules/solana/model/SolanaPayloads.d.ts +126 -0
  385. package/lib/types/src/modules/solana/model/SolanaPayloads.d.ts.map +1 -1
  386. package/lib/types/src/modules/solana/model/SolanaTransactionScanChainId.d.ts +6 -5
  387. package/lib/types/src/modules/solana/model/SolanaTransactionScanChainId.d.ts.map +1 -1
  388. package/lib/types/src/modules/solana/owner-info/domain/solanaContextTypes.d.ts +2 -5
  389. package/lib/types/src/modules/solana/owner-info/domain/solanaContextTypes.d.ts.map +1 -1
  390. package/lib/types/src/modules/solana/token/domain/TokenContextLoader.d.ts.map +1 -1
  391. package/lib/types/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.d.ts +11 -0
  392. package/lib/types/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.d.ts.map +1 -0
  393. package/lib/types/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.test.d.ts +2 -0
  394. package/lib/types/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.test.d.ts.map +1 -0
  395. package/lib/types/src/modules/solana/token-account-state/data/TokenAccountStateDataSource.d.ts +15 -0
  396. package/lib/types/src/modules/solana/token-account-state/data/TokenAccountStateDataSource.d.ts.map +1 -0
  397. package/lib/types/src/modules/solana/token-account-state/di/tokenAccountStateModuleFactory.d.ts +3 -0
  398. package/lib/types/src/modules/solana/token-account-state/di/tokenAccountStateModuleFactory.d.ts.map +1 -0
  399. package/lib/types/src/modules/solana/token-account-state/di/tokenAccountStateTypes.d.ts +5 -0
  400. package/lib/types/src/modules/solana/token-account-state/di/tokenAccountStateTypes.d.ts.map +1 -0
  401. package/lib/types/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.d.ts +26 -0
  402. package/lib/types/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.d.ts.map +1 -0
  403. package/lib/types/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.test.d.ts +2 -0
  404. package/lib/types/src/modules/solana/token-account-state/domain/TokenAccountStateContextLoader.test.d.ts.map +1 -0
  405. package/lib/types/src/modules/solana/token-info/data/HttpTokenInfoDataSource.d.ts +11 -0
  406. package/lib/types/src/modules/solana/token-info/data/HttpTokenInfoDataSource.d.ts.map +1 -0
  407. package/lib/types/src/modules/solana/token-info/data/HttpTokenInfoDataSource.test.d.ts +2 -0
  408. package/lib/types/src/modules/solana/token-info/data/HttpTokenInfoDataSource.test.d.ts.map +1 -0
  409. package/lib/types/src/modules/solana/token-info/data/TokenInfoDataSource.d.ts +24 -0
  410. package/lib/types/src/modules/solana/token-info/data/TokenInfoDataSource.d.ts.map +1 -0
  411. package/lib/types/src/modules/solana/token-info/di/tokenInfoModuleFactory.d.ts +3 -0
  412. package/lib/types/src/modules/solana/token-info/di/tokenInfoModuleFactory.d.ts.map +1 -0
  413. package/lib/types/src/modules/solana/token-info/di/tokenInfoTypes.d.ts +5 -0
  414. package/lib/types/src/modules/solana/token-info/di/tokenInfoTypes.d.ts.map +1 -0
  415. package/lib/types/src/modules/solana/token-info/domain/TokenInfoContextLoader.d.ts +26 -0
  416. package/lib/types/src/modules/solana/token-info/domain/TokenInfoContextLoader.d.ts.map +1 -0
  417. package/lib/types/src/modules/solana/token-info/domain/TokenInfoContextLoader.test.d.ts +2 -0
  418. package/lib/types/src/modules/solana/token-info/domain/TokenInfoContextLoader.test.d.ts.map +1 -0
  419. package/lib/types/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.d.ts +11 -0
  420. package/lib/types/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.d.ts.map +1 -0
  421. package/lib/types/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.test.d.ts +2 -0
  422. package/lib/types/src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.test.d.ts.map +1 -0
  423. package/lib/types/src/modules/solana/trusted-name/data/TrustedNameDataSource.d.ts +18 -0
  424. package/lib/types/src/modules/solana/trusted-name/data/TrustedNameDataSource.d.ts.map +1 -0
  425. package/lib/types/src/modules/solana/trusted-name/di/trustedNameModuleFactory.d.ts +3 -0
  426. package/lib/types/src/modules/solana/trusted-name/di/trustedNameModuleFactory.d.ts.map +1 -0
  427. package/lib/types/src/modules/solana/trusted-name/di/trustedNameTypes.d.ts +5 -0
  428. package/lib/types/src/modules/solana/trusted-name/di/trustedNameTypes.d.ts.map +1 -0
  429. package/lib/types/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.d.ts +29 -0
  430. package/lib/types/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.d.ts.map +1 -0
  431. package/lib/types/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.test.d.ts +2 -0
  432. package/lib/types/src/modules/solana/trusted-name/domain/TrustedNameContextLoader.test.d.ts.map +1 -0
  433. package/lib/types/src/shared/model/ClearSignContext.d.ts +7 -1
  434. package/lib/types/src/shared/model/ClearSignContext.d.ts.map +1 -1
  435. package/lib/types/src/shared/utils/HexStringUtils.d.ts +7 -0
  436. package/lib/types/src/shared/utils/HexStringUtils.d.ts.map +1 -1
  437. package/lib/types/src/shared/utils/bs58Encoder.d.ts +9 -0
  438. package/lib/types/src/shared/utils/bs58Encoder.d.ts.map +1 -0
  439. package/lib/types/src/shared/utils/certificateCache.d.ts +23 -0
  440. package/lib/types/src/shared/utils/certificateCache.d.ts.map +1 -0
  441. package/lib/types/src/shared/utils/certificateCache.test.d.ts +2 -0
  442. package/lib/types/src/shared/utils/certificateCache.test.d.ts.map +1 -0
  443. package/lib/types/src/shared/utils/certificateResult.d.ts +26 -0
  444. package/lib/types/src/shared/utils/certificateResult.d.ts.map +1 -0
  445. package/lib/types/src/shared/utils/certificateResult.test.d.ts +2 -0
  446. package/lib/types/src/shared/utils/certificateResult.test.d.ts.map +1 -0
  447. package/lib/types/src/shared/utils/challengeBoundLoader.d.ts +43 -0
  448. package/lib/types/src/shared/utils/challengeBoundLoader.d.ts.map +1 -0
  449. package/lib/types/src/shared/utils/challengeBoundLoader.test.d.ts +2 -0
  450. package/lib/types/src/shared/utils/challengeBoundLoader.test.d.ts.map +1 -0
  451. package/lib/types/src/shared/utils/deviceModelIdCodec.d.ts +7 -0
  452. package/lib/types/src/shared/utils/deviceModelIdCodec.d.ts.map +1 -0
  453. package/lib/types/src/shared/utils/deviceModelIdCodec.test.d.ts +2 -0
  454. package/lib/types/src/shared/utils/deviceModelIdCodec.test.d.ts.map +1 -0
  455. package/lib/types/src/shared/utils/signedDescriptorDto.d.ts +15 -0
  456. package/lib/types/src/shared/utils/signedDescriptorDto.d.ts.map +1 -0
  457. package/lib/types/src/shared/utils/signedDescriptorDto.test.d.ts +2 -0
  458. package/lib/types/src/shared/utils/signedDescriptorDto.test.d.ts.map +1 -0
  459. package/lib/types/src/shared/utils/uIntCodec.d.ts +20 -0
  460. package/lib/types/src/shared/utils/uIntCodec.d.ts.map +1 -0
  461. package/lib/types/src/shared/utils/uIntCodec.test.d.ts +2 -0
  462. package/lib/types/src/shared/utils/uIntCodec.test.d.ts.map +1 -0
  463. package/lib/types/src/shared/utils/uint8ArrayCodec.d.ts +3 -0
  464. package/lib/types/src/shared/utils/uint8ArrayCodec.d.ts.map +1 -0
  465. package/lib/types/src/shared/utils/uint8ArrayCodec.test.d.ts +2 -0
  466. package/lib/types/src/shared/utils/uint8ArrayCodec.test.d.ts.map +1 -0
  467. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  468. package/package.json +7 -6
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -0,0 +1,2 @@
1
+ import{ContainerModule as e}from"inversify";import{HttpTokenInfoDataSource as n}from"../../../../modules/solana/token-info/data/HttpTokenInfoDataSource";import{tokenInfoTypes as t}from"../../../../modules/solana/token-info/di/tokenInfoTypes";import{TokenInfoContextLoader as r}from"../../../../modules/solana/token-info/domain/TokenInfoContextLoader";const k=()=>new e(({bind:o})=>{o(t.TokenInfoDataSource).to(n),o(t.TokenInfoContextLoader).to(r)});export{k as tokenInfoModuleFactory};
2
+ //# sourceMappingURL=tokenInfoModuleFactory.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/modules/solana/token-info/di/tokenInfoModuleFactory.ts"],
4
+ "sourcesContent": ["import { ContainerModule } from \"inversify\";\n\nimport { HttpTokenInfoDataSource } from \"@/modules/solana/token-info/data/HttpTokenInfoDataSource\";\nimport { tokenInfoTypes } from \"@/modules/solana/token-info/di/tokenInfoTypes\";\nimport { TokenInfoContextLoader } from \"@/modules/solana/token-info/domain/TokenInfoContextLoader\";\n\nexport const tokenInfoModuleFactory = () =>\n new ContainerModule(({ bind }) => {\n bind(tokenInfoTypes.TokenInfoDataSource).to(HttpTokenInfoDataSource);\n bind(tokenInfoTypes.TokenInfoContextLoader).to(TokenInfoContextLoader);\n });\n"],
5
+ "mappings": "AAAA,OAAS,mBAAAA,MAAuB,YAEhC,OAAS,2BAAAC,MAA+B,2DACxC,OAAS,kBAAAC,MAAsB,gDAC/B,OAAS,0BAAAC,MAA8B,4DAEhC,MAAMC,EAAyB,IACpC,IAAIJ,EAAgB,CAAC,CAAE,KAAAK,CAAK,IAAM,CAChCA,EAAKH,EAAe,mBAAmB,EAAE,GAAGD,CAAuB,EACnEI,EAAKH,EAAe,sBAAsB,EAAE,GAAGC,CAAsB,CACvE,CAAC",
6
+ "names": ["ContainerModule", "HttpTokenInfoDataSource", "tokenInfoTypes", "TokenInfoContextLoader", "tokenInfoModuleFactory", "bind"]
7
+ }
@@ -0,0 +1,2 @@
1
+ const o={TokenInfoDataSource:Symbol.for("TokenInfoDataSource"),TokenInfoContextLoader:Symbol.for("TokenInfoContextLoader")};export{o as tokenInfoTypes};
2
+ //# sourceMappingURL=tokenInfoTypes.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/modules/solana/token-info/di/tokenInfoTypes.ts"],
4
+ "sourcesContent": ["export const tokenInfoTypes = {\n TokenInfoDataSource: Symbol.for(\"TokenInfoDataSource\"),\n TokenInfoContextLoader: Symbol.for(\"TokenInfoContextLoader\"),\n};\n"],
5
+ "mappings": "AAAO,MAAMA,EAAiB,CAC5B,oBAAqB,OAAO,IAAI,qBAAqB,EACrD,uBAAwB,OAAO,IAAI,wBAAwB,CAC7D",
6
+ "names": ["tokenInfoTypes"]
7
+ }
@@ -0,0 +1,2 @@
1
+ var v=Object.defineProperty;var h=Object.getOwnPropertyDescriptor;var u=(i,o,r,e)=>{for(var t=e>1?void 0:e?h(o,r):o,s=i.length-1,a;s>=0;s--)(a=i[s])&&(t=(e?a(o,r,t):a(t))||t);return e&&t&&v(o,r,t),t},l=(i,o)=>(r,e)=>o(r,e,i);import{inject as p,injectable as x}from"inversify";import{array as R,Codec as L,optional as P,string as y}from"purify-ts";import{configTypes as C}from"../../../../config/di/configTypes";import{pkiTypes as E}from"../../../../modules/multichain/pki/di/pkiTypes";import{KeyId as N}from"../../../../modules/multichain/pki/model/KeyId";import{KeyUsage as M}from"../../../../modules/multichain/pki/model/KeyUsage";import{tokenInfoTypes as w}from"../../../../modules/solana/token-info/di/tokenInfoTypes";import{ClearSignContextType as d}from"../../../../shared/model/ClearSignContext";import{loadCertificateResult as K}from"../../../../shared/utils/certificateResult";import{deviceModelIdCodec as _}from"../../../../shared/utils/deviceModelIdCodec";const F=[d.SOLANA_TOKEN_INFO],b="solana-mainnet",D=L.interface({deviceModelId:_,mints:R(y),network:P(y)});let f=class{constructor(o,r,e,t){this.dataSource=o;this.config=r;this.certificateLoader=e;this.logger=t("TokenInfoContextLoader")}logger;canHandle(o,r){return F.every(e=>r.includes(e))?D.decode(o).caseOf({Left:()=>!1,Right:({mints:e})=>e.length>0&&e.every(t=>t.length>0)}):!1}async load(o){const r=o.network||b,e=Array.from(new Set(o.mints));this.logger.debug("[load] Fetching TOKEN_INFO descriptors",{data:{network:r,mintCount:e.length}});const t=K(this.certificateLoader,{keyId:N.TokenMetadataKey,keyUsage:M.CoinMeta,targetDevice:o.deviceModelId}),s=Promise.all(e.map(async n=>({mint:n,either:await this.dataSource.getTokenInfo({mint:n,network:r})}))),[a,I]=await Promise.all([t,s]);if(!a.ok||!a.value){const n=a.ok?new Error("[ContextModule] TokenInfoContextLoader: certificate is missing"):a.error;return this.logger.warn("[load] TOKEN_INFO certificate unavailable",{data:{error:n.message}}),e.map(()=>({type:d.ERROR,error:n}))}const T=a.value,g=this.config.cal.mode??"prod";return I.map(({mint:n,either:k})=>k.caseOf({Left:c=>(this.logger.warn("[load] TOKEN_INFO fetch failed",{data:{mint:n,error:c.message}}),{type:d.ERROR,error:c}),Right:c=>{const m=c.descriptor.signatures[g];if(!m){const O=new Error(`[ContextModule] TokenInfoContextLoader: missing '${g}' signature for mint ${n}`);return this.logger.warn("[load] TOKEN_INFO missing signature",{data:{mint:n,mode:g}}),{type:d.ERROR,error:O}}const S={mint:n,descriptor:{data:c.descriptor.data,signature:m}};return{type:d.SOLANA_TOKEN_INFO,payload:S,certificate:T}}}))}};f=u([x(),l(0,p(w.TokenInfoDataSource)),l(1,p(C.Config)),l(2,p(E.PkiCertificateLoader)),l(3,p(C.ContextModuleLoggerFactory))],f);export{f as TokenInfoContextLoader};
2
+ //# sourceMappingURL=TokenInfoContextLoader.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/modules/solana/token-info/domain/TokenInfoContextLoader.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 { type SolanaTokenInfoPayload } from \"@/modules/solana/model/SolanaPayloads\";\nimport {\n type TokenInfoDataSource,\n type TokenInfoResult,\n} from \"@/modules/solana/token-info/data/TokenInfoDataSource\";\nimport { tokenInfoTypes } from \"@/modules/solana/token-info/di/tokenInfoTypes\";\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\";\n\nconst SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.SOLANA_TOKEN_INFO,\n];\n\nconst NETWORK_DEFAULT = \"solana-mainnet\";\n\n/**\n * Input shape for the new clear-signing token-info lookup. The dedup key\n * is the on-chain **mint pubkey**, not the legacy Ledger CAL internal id\n * used by the original {@link TokenContextLoader}.\n */\nexport type SolanaTokenInfoContextInput = {\n deviceModelId: DeviceModelId;\n mints: string[];\n network?: string;\n};\n\nconst solanaTokenInfoInputCodec = Codec.interface({\n deviceModelId: deviceModelIdCodec,\n mints: array(string),\n network: optional(string),\n});\n\n@injectable()\nexport class TokenInfoContextLoader\n implements ContextLoader<SolanaTokenInfoContextInput>\n{\n private readonly logger: LoggerPublisherService;\n\n constructor(\n @inject(tokenInfoTypes.TokenInfoDataSource)\n private readonly dataSource: TokenInfoDataSource,\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(\"TokenInfoContextLoader\");\n }\n\n public canHandle(\n input: unknown,\n expectedTypes: ClearSignContextType[],\n ): input is SolanaTokenInfoContextInput {\n if (!SUPPORTED_TYPES.every((t) => expectedTypes.includes(t))) return false;\n return solanaTokenInfoInputCodec.decode(input).caseOf({\n Left: () => false,\n Right: ({ mints }) =>\n mints.length > 0 && mints.every((m) => m.length > 0),\n });\n }\n\n public async load(\n input: SolanaTokenInfoContextInput,\n ): Promise<ClearSignContext[]> {\n const network = input.network || NETWORK_DEFAULT;\n const uniqueMints = Array.from(new Set(input.mints));\n\n this.logger.debug(\"[load] Fetching TOKEN_INFO descriptors\", {\n data: { network, mintCount: uniqueMints.length },\n });\n\n // Cert load and per-mint fetches are independent \u2014 kick them off\n // together. The tagged-Result wrapper on the cert lets us still\n // return per-mint ERROR contexts on PKI failure without dropping\n // the data fetches that already started.\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 uniqueMints.map(async (mint) => ({\n mint,\n either: await this.dataSource.getTokenInfo({ mint, 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] TokenInfoContextLoader: certificate is missing\",\n )\n : certResult.error;\n this.logger.warn(\"[load] TOKEN_INFO certificate unavailable\", {\n data: { error: error.message },\n });\n return uniqueMints.map(() => ({\n type: ClearSignContextType.ERROR,\n error,\n }));\n }\n const certificate = certResult.value;\n\n const mode = this.config.cal.mode ?? \"prod\";\n\n return results.map(({ mint, either }) =>\n either.caseOf<ClearSignContext>({\n Left: (error) => {\n this.logger.warn(\"[load] TOKEN_INFO fetch failed\", {\n data: { mint, error: error.message },\n });\n return { type: ClearSignContextType.ERROR, error };\n },\n Right: (value: TokenInfoResult) => {\n const signature = value.descriptor.signatures[mode];\n if (!signature) {\n const error = new Error(\n `[ContextModule] TokenInfoContextLoader: missing '${mode}' signature for mint ${mint}`,\n );\n this.logger.warn(\"[load] TOKEN_INFO missing signature\", {\n data: { mint, mode },\n });\n return { type: ClearSignContextType.ERROR, error };\n }\n const payload: SolanaTokenInfoPayload = {\n mint,\n descriptor: {\n data: value.descriptor.data,\n signature,\n },\n };\n return {\n type: ClearSignContextType.SOLANA_TOKEN_INFO,\n payload,\n certificate,\n };\n },\n }),\n );\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["inject", "injectable", "array", "Codec", "optional", "string", "configTypes", "pkiTypes", "KeyId", "KeyUsage", "tokenInfoTypes", "ClearSignContextType", "loadCertificateResult", "deviceModelIdCodec", "SUPPORTED_TYPES", "ClearSignContextType", "NETWORK_DEFAULT", "solanaTokenInfoInputCodec", "Codec", "deviceModelIdCodec", "array", "string", "optional", "TokenInfoContextLoader", "dataSource", "config", "certificateLoader", "loggerFactory", "input", "expectedTypes", "t", "mints", "m", "network", "uniqueMints", "certPromise", "loadCertificateResult", "KeyId", "KeyUsage", "dataPromise", "mint", "certResult", "results", "error", "certificate", "mode", "either", "value", "signature", "payload", "__decorateClass", "injectable", "__decorateParam", "inject", "tokenInfoTypes", "configTypes", "pkiTypes"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{DeviceModelId as c}from"@ledgerhq/device-management-kit";import{Left as N,Right as l}from"purify-ts";import{beforeEach as y,describe as m,expect as t,it as r,vi as n}from"vitest";import{ClearSignContextType as i}from"../../../../shared/model/ClearSignContext";import{TokenInfoContextLoader as g}from"./TokenInfoContextLoader";const _=()=>({debug:n.fn(),info:n.fn(),warn:n.fn(),error:n.fn(),subscribers:[]}),u={keyUsageNumber:13,payload:new Uint8Array([16])},p={cal:{url:"https://crypto-assets-service.api.ledger.com/v1",mode:"prod",branch:"main"}},o="EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v",f="So11111111111111111111111111111111111111112";m("TokenInfoContextLoader",()=>{let d,O;y(()=>{n.restoreAllMocks(),d={getTokenInfo:n.fn()},O={loadCertificate:n.fn().mockResolvedValue(u)}});const s=(e=p)=>new g(d,e,O,_);m("canHandle",()=>{r("returns true when SOLANA_TOKEN_INFO is requested and mints are non-empty",()=>{t(s().canHandle({deviceModelId:c.NANO_X,mints:[o]},[i.SOLANA_TOKEN_INFO])).toBe(!0)}),r("returns false when SOLANA_TOKEN_INFO is not requested",()=>{t(s().canHandle({deviceModelId:c.NANO_X,mints:[o]},[i.SOLANA_TOKEN])).toBe(!1)}),r("returns false on missing / empty / malformed mints",()=>{const e=s(),a=[i.SOLANA_TOKEN_INFO];t(e.canHandle({},a)).toBe(!1),t(e.canHandle({mints:[]},a)).toBe(!1),t(e.canHandle({mints:[""]},a)).toBe(!1),t(e.canHandle(null,a)).toBe(!1)})}),m("load",()=>{r("emits one SOLANA_TOKEN_INFO per unique mint with certificate",async()=>{n.spyOn(d,"getTokenInfo").mockImplementation(async({mint:a})=>l({mint:a,descriptor:{data:`data_${a.slice(0,4)}`,signatures:{prod:`psig_${a.slice(0,4)}`,test:"tsig"}}}));const e=await s().load({deviceModelId:c.NANO_X,mints:[o,f,o]});t(e).toHaveLength(2),t(e[0]).toMatchObject({type:i.SOLANA_TOKEN_INFO,payload:{mint:o,descriptor:{data:"data_EPjF",signature:"psig_EPjF"}},certificate:u}),t(e[1]).toMatchObject({type:i.SOLANA_TOKEN_INFO,payload:{mint:f,descriptor:{data:"data_So11",signature:"psig_So11"}}})}),r("emits an ERROR context per failing mint and keeps the others",async()=>{n.spyOn(d,"getTokenInfo").mockImplementation(async({mint:a})=>a===o?l({mint:a,descriptor:{data:"usdc_data",signatures:{prod:"psig",test:"tsig"}}}):N(new Error("upstream-500")));const e=await s().load({deviceModelId:c.NANO_X,mints:[o,f]});t(e).toHaveLength(2),t(e[0]?.type).toBe(i.SOLANA_TOKEN_INFO),t(e[1]?.type).toBe(i.ERROR)}),r("selects signature based on config.cal.mode (test)",async()=>{n.spyOn(d,"getTokenInfo").mockResolvedValue(l({mint:o,descriptor:{data:"data",signatures:{prod:"p",test:"T"}}}));const e=await s({...p,cal:{...p.cal,mode:"test"}}).load({deviceModelId:c.NANO_X,mints:[o]});t(e[0].payload.descriptor.signature).toBe("T")}),r("falls back to default network when input.network is omitted",async()=>{const e=n.spyOn(d,"getTokenInfo").mockResolvedValue(l({mint:o,descriptor:{data:"x",signatures:{prod:"p",test:"t"}}}));await s().load({deviceModelId:c.NANO_X,mints:[o]}),t(e).toHaveBeenCalledWith({mint:o,network:"solana-mainnet"})})})});
2
+ //# sourceMappingURL=TokenInfoContextLoader.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/modules/solana/token-info/domain/TokenInfoContextLoader.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 { type TokenInfoDataSource } from \"@/modules/solana/token-info/data/TokenInfoDataSource\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\n\nimport { TokenInfoContextLoader } from \"./TokenInfoContextLoader\";\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: 13,\n payload: new Uint8Array([0x10]),\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 USDC = \"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\";\nconst SOL = \"So11111111111111111111111111111111111111112\";\n\ndescribe(\"TokenInfoContextLoader\", () => {\n let dataSource: TokenInfoDataSource;\n let certificateLoader: PkiCertificateLoader;\n\n beforeEach(() => {\n vi.restoreAllMocks();\n dataSource = {\n getTokenInfo: vi.fn(),\n };\n certificateLoader = {\n loadCertificate: vi.fn().mockResolvedValue(mockCertificate),\n };\n });\n\n const makeLoader = (config = mockConfig) =>\n new TokenInfoContextLoader(\n dataSource,\n config,\n certificateLoader,\n mockLoggerFactory,\n );\n\n describe(\"canHandle\", () => {\n it(\"returns true when SOLANA_TOKEN_INFO is requested and mints are non-empty\", () => {\n expect(\n makeLoader().canHandle(\n { deviceModelId: DeviceModelId.NANO_X, mints: [USDC] },\n [ClearSignContextType.SOLANA_TOKEN_INFO],\n ),\n ).toBe(true);\n });\n\n it(\"returns false when SOLANA_TOKEN_INFO is not requested\", () => {\n expect(\n makeLoader().canHandle(\n { deviceModelId: DeviceModelId.NANO_X, mints: [USDC] },\n [ClearSignContextType.SOLANA_TOKEN],\n ),\n ).toBe(false);\n });\n\n it(\"returns false on missing / empty / malformed mints\", () => {\n const loader = makeLoader();\n const types = [ClearSignContextType.SOLANA_TOKEN_INFO];\n expect(loader.canHandle({} as any, types)).toBe(false);\n expect(loader.canHandle({ mints: [] } as any, types)).toBe(false);\n expect(loader.canHandle({ mints: [\"\"] } as any, types)).toBe(false);\n expect(loader.canHandle(null, types)).toBe(false);\n });\n });\n\n describe(\"load\", () => {\n it(\"emits one SOLANA_TOKEN_INFO per unique mint with certificate\", async () => {\n vi.spyOn(dataSource, \"getTokenInfo\").mockImplementation(\n async ({ mint }) =>\n Right({\n mint,\n descriptor: {\n data: `data_${mint.slice(0, 4)}`,\n signatures: { prod: `psig_${mint.slice(0, 4)}`, test: \"tsig\" },\n },\n }),\n );\n\n const result = await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n mints: [USDC, SOL, USDC], // duplicate USDC must dedup\n });\n\n expect(result).toHaveLength(2);\n expect(result[0]).toMatchObject({\n type: ClearSignContextType.SOLANA_TOKEN_INFO,\n payload: {\n mint: USDC,\n descriptor: { data: \"data_EPjF\", signature: \"psig_EPjF\" },\n },\n certificate: mockCertificate,\n });\n expect(result[1]).toMatchObject({\n type: ClearSignContextType.SOLANA_TOKEN_INFO,\n payload: {\n mint: SOL,\n descriptor: { data: \"data_So11\", signature: \"psig_So11\" },\n },\n });\n });\n\n it(\"emits an ERROR context per failing mint and keeps the others\", async () => {\n vi.spyOn(dataSource, \"getTokenInfo\").mockImplementation(\n async ({ mint }) => {\n if (mint === USDC) {\n return Right({\n mint,\n descriptor: {\n data: \"usdc_data\",\n signatures: { prod: \"psig\", test: \"tsig\" },\n },\n });\n }\n return Left(new Error(\"upstream-500\"));\n },\n );\n\n const result = await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n mints: [USDC, SOL],\n });\n\n expect(result).toHaveLength(2);\n expect(result[0]?.type).toBe(ClearSignContextType.SOLANA_TOKEN_INFO);\n expect(result[1]?.type).toBe(ClearSignContextType.ERROR);\n });\n\n it(\"selects signature based on config.cal.mode (test)\", async () => {\n vi.spyOn(dataSource, \"getTokenInfo\").mockResolvedValue(\n Right({\n mint: USDC,\n descriptor: {\n data: \"data\",\n signatures: { prod: \"p\", test: \"T\" },\n },\n }),\n );\n\n const result = await makeLoader({\n ...mockConfig,\n cal: { ...mockConfig.cal, mode: \"test\" },\n } as any).load({ deviceModelId: DeviceModelId.NANO_X, mints: [USDC] });\n\n expect((result[0] as any).payload.descriptor.signature).toBe(\"T\");\n });\n\n it(\"falls back to default network when input.network is omitted\", async () => {\n const spy = vi.spyOn(dataSource, \"getTokenInfo\").mockResolvedValue(\n Right({\n mint: USDC,\n descriptor: { data: \"x\", signatures: { prod: \"p\", test: \"t\" } },\n }),\n );\n\n await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n mints: [USDC],\n });\n\n expect(spy).toHaveBeenCalledWith({\n mint: USDC,\n network: \"solana-mainnet\",\n });\n });\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["DeviceModelId", "Left", "Right", "beforeEach", "describe", "expect", "it", "vi", "ClearSignContextType", "TokenInfoContextLoader", "mockLoggerFactory", "mockCertificate", "mockConfig", "USDC", "SOL", "dataSource", "certificateLoader", "makeLoader", "config", "loader", "types", "mint", "result", "spy"]
7
+ }
@@ -0,0 +1,2 @@
1
+ var f=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var g=(i,e,o,s)=>{for(var r=s>1?void 0:s?y(e,o):e,a=i.length-1,n;a>=0;a--)(n=i[a])&&(r=(s?n(e,o,r):n(r))||r);return s&&r&&f(e,o,r),r},c=(i,e)=>(o,s)=>e(o,s,i);import{inject as l,injectable as T}from"inversify";import{Left as u,Right as h}from"purify-ts";import{configTypes as N}from"../../../../config/di/configTypes";import{networkTypes as S}from"../../../../shared/network/di/networkTypes";import{HexStringUtils as D}from"../../../../shared/utils/HexStringUtils";import{signedDescriptorDtoCodec as k}from"../../../../shared/utils/signedDescriptorDto";let p=class{constructor(e,o){this.config=e;this.http=o}async getTrustedName({address:e,network:o,challenge:s,types:r,sources:a}){let n;try{n=await this.http.get(`${this.config.metadataServiceDomain.url}/v2/names/solana/${o}/reverse/${e}`,{params:{types:r.join(","),sources:a.join(","),challenge:s}})}catch(t){const m=t instanceof Error?t.message:String(t);return u(new Error(`[ContextModule] HttpSolanaTrustedNameDataSource: Failed to fetch trusted name: ${m}`))}return k.decode(n).caseOf({Left:t=>u(new Error(`[ContextModule] HttpSolanaTrustedNameDataSource: malformed response for ${e}: ${t}`)),Right:t=>{let m;try{m=D.hexToBytes(t.signedDescriptor)}catch(d){return u(new Error(`[ContextModule] HttpSolanaTrustedNameDataSource: invalid hex in signedDescriptor for ${e}: ${d.message}`))}return h({address:e,descriptor:m,keyId:t.keyId,keyUsage:t.keyUsage})}})}};p=g([T(),c(0,l(N.Config)),c(1,l(S.NetworkClient))],p);export{p as HttpSolanaTrustedNameDataSource};
2
+ //# sourceMappingURL=HttpTrustedNameDataSource.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.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\";\n\nimport {\n type GetSolanaTrustedNameParams,\n type SolanaTrustedNameDataSource,\n type SolanaTrustedNameResult,\n} from \"./TrustedNameDataSource\";\n\ntype TrustedNameResponseDto = {\n descriptorType?: string;\n descriptorVersion?: string;\n address?: string;\n name?: string;\n source?: string;\n nameType?: string;\n signedDescriptor: string;\n keyId: string;\n keyUsage: string;\n};\n\n@injectable()\nexport class HttpSolanaTrustedNameDataSource\n implements SolanaTrustedNameDataSource\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 getTrustedName({\n address,\n network,\n challenge,\n types,\n sources,\n }: GetSolanaTrustedNameParams): Promise<\n Either<Error, SolanaTrustedNameResult>\n > {\n let dto: TrustedNameResponseDto;\n try {\n dto = (await this.http.get(\n `${this.config.metadataServiceDomain.url}/v2/names/solana/${network}/reverse/${address}`,\n {\n params: {\n types: types.join(\",\"),\n sources: sources.join(\",\"),\n challenge,\n },\n },\n )) as TrustedNameResponseDto;\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n return Left(\n new Error(\n `[ContextModule] HttpSolanaTrustedNameDataSource: Failed to fetch trusted name: ${reason}`,\n ),\n );\n }\n\n return signedDescriptorDtoCodec\n .decode(dto)\n .caseOf<Either<Error, SolanaTrustedNameResult>>({\n Left: (error) =>\n Left(\n new Error(\n `[ContextModule] HttpSolanaTrustedNameDataSource: malformed response for ${address}: ${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] HttpSolanaTrustedNameDataSource: invalid hex in signedDescriptor for ${address}: ${(error as Error).message}`,\n ),\n );\n }\n\n return Right({\n address,\n descriptor,\n keyId: validated.keyId,\n keyUsage: validated.keyUsage,\n });\n },\n });\n }\n}\n"],
5
+ "mappings": "iOACA,OAAS,UAAAA,EAAQ,cAAAC,MAAkB,YACnC,OAAiB,QAAAC,EAAM,SAAAC,MAAa,YAEpC,OAAS,eAAAC,MAAmB,0BAE5B,OAAS,gBAAAC,MAAoB,mCAC7B,OAAS,kBAAAC,MAAsB,gCAC/B,OAAS,4BAAAC,MAAgC,qCAqBlC,IAAMC,EAAN,KAEP,CACE,YAEmBC,EAEAC,EACjB,CAHiB,YAAAD,EAEA,UAAAC,CAChB,CAEH,MAAa,eAAe,CAC1B,QAAAC,EACA,QAAAC,EACA,UAAAC,EACA,MAAAC,EACA,QAAAC,CACF,EAEE,CACA,IAAIC,EACJ,GAAI,CACFA,EAAO,MAAM,KAAK,KAAK,IACrB,GAAG,KAAK,OAAO,sBAAsB,GAAG,oBAAoBJ,CAAO,YAAYD,CAAO,GACtF,CACE,OAAQ,CACN,MAAOG,EAAM,KAAK,GAAG,EACrB,QAASC,EAAQ,KAAK,GAAG,EACzB,UAAAF,CACF,CACF,CACF,CACF,OAASI,EAAO,CACd,MAAMC,EAASD,aAAiB,MAAQA,EAAM,QAAU,OAAOA,CAAK,EACpE,OAAOE,EACL,IAAI,MACF,kFAAkFD,CAAM,EAC1F,CACF,CACF,CAEA,OAAOE,EACJ,OAAOJ,CAAG,EACV,OAA+C,CAC9C,KAAOC,GACLE,EACE,IAAI,MACF,2EAA2ER,CAAO,KAAKM,CAAK,EAC9F,CACF,EACF,MAAQI,GAAc,CACpB,IAAIC,EACJ,GAAI,CACFA,EAAaC,EAAe,WAAWF,EAAU,gBAAgB,CACnE,OAASJ,EAAO,CACd,OAAOE,EACL,IAAI,MACF,wFAAwFR,CAAO,KAAMM,EAAgB,OAAO,EAC9H,CACF,CACF,CAEA,OAAOO,EAAM,CACX,QAAAb,EACA,WAAAW,EACA,MAAOD,EAAU,MACjB,SAAUA,EAAU,QACtB,CAAC,CACH,CACF,CAAC,CACL,CACF,EAtEab,EAANiB,EAAA,CADNC,EAAW,EAKPC,EAAA,EAAAC,EAAOC,EAAY,MAAM,GAEzBF,EAAA,EAAAC,EAAOE,EAAa,aAAa,IANzBtB",
6
+ "names": ["inject", "injectable", "Left", "Right", "configTypes", "networkTypes", "HexStringUtils", "signedDescriptorDtoCodec", "HttpSolanaTrustedNameDataSource", "config", "http", "address", "network", "challenge", "types", "sources", "dto", "error", "reason", "Left", "signedDescriptorDtoCodec", "validated", "descriptor", "HexStringUtils", "Right", "__decorateClass", "injectable", "__decorateParam", "inject", "configTypes", "networkTypes"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{Left as l,Right as m}from"purify-ts";import{beforeEach as u,describe as d,expect as s,it as n,vi as c}from"vitest";import{HttpSolanaTrustedNameDataSource as p}from"./HttpTrustedNameDataSource";d("HttpSolanaTrustedNameDataSource",()=>{let o,e;const t="vitalik.sol",r="deadbeef",i={metadataServiceDomain:{url:"https://nft.api.ledger.com"}};u(()=>{c.clearAllMocks(),e={get:c.fn()},o=new p(i,e)}),n("calls the names endpoint with network, types, sources and challenge",async()=>{e.get.mockResolvedValue({signedDescriptor:"01020304",keyId:"name_key",keyUsage:"trusted_name"}),await o.getTrustedName({address:t,network:"mainnet",challenge:r,types:["eoa","program"],sources:["sns","cal"]}),s(e.get).toHaveBeenCalledWith(`https://nft.api.ledger.com/v2/names/solana/mainnet/reverse/${t}`,{params:{types:"eoa,program",sources:"sns,cal",challenge:r}})}),n("decodes signedDescriptor hex into Uint8Array",async()=>{e.get.mockResolvedValue({signedDescriptor:"ff00",keyId:"k",keyUsage:"u"});const a=await o.getTrustedName({address:t,network:"mainnet",challenge:r,types:["eoa"],sources:["sns"]});s(a).toEqual(m({address:t,descriptor:new Uint8Array([255,0]),keyId:"k",keyUsage:"u"}))}),n("returns Left on malformed response",async()=>{e.get.mockResolvedValue({keyId:"k",keyUsage:"u"});const a=await o.getTrustedName({address:t,network:"mainnet",challenge:r,types:[],sources:[]});s(a.isLeft()).toBe(!0),s(a.extract().message).toMatch(new RegExp(String.raw`\[ContextModule\] HttpSolanaTrustedNameDataSource: malformed response for ${t}:`))}),n("returns Left when HTTP client throws",async()=>{e.get.mockRejectedValue(new Error("net"));const a=await o.getTrustedName({address:t,network:"mainnet",challenge:r,types:[],sources:[]});s(a).toEqual(l(new Error("[ContextModule] HttpSolanaTrustedNameDataSource: Failed to fetch trusted name: net")))})});
2
+ //# sourceMappingURL=HttpTrustedNameDataSource.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/modules/solana/trusted-name/data/HttpTrustedNameDataSource.test.ts"],
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { type DmkNetworkClient } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { type ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\n\nimport { HttpSolanaTrustedNameDataSource } from \"./HttpTrustedNameDataSource\";\nimport { type SolanaTrustedNameDataSource } from \"./TrustedNameDataSource\";\n\ndescribe(\"HttpSolanaTrustedNameDataSource\", () => {\n let datasource: SolanaTrustedNameDataSource;\n let httpMock: { get: ReturnType<typeof vi.fn> };\n const address = \"vitalik.sol\";\n const challenge = \"deadbeef\";\n 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 HttpSolanaTrustedNameDataSource(\n config,\n httpMock as unknown as DmkNetworkClient,\n );\n });\n\n it(\"calls the names endpoint with network, types, sources and challenge\", async () => {\n httpMock.get.mockResolvedValue({\n signedDescriptor: \"01020304\",\n keyId: \"name_key\",\n keyUsage: \"trusted_name\",\n });\n\n await datasource.getTrustedName({\n address,\n network: \"mainnet\",\n challenge,\n types: [\"eoa\", \"program\"],\n sources: [\"sns\", \"cal\"],\n });\n\n expect(httpMock.get).toHaveBeenCalledWith(\n `https://nft.api.ledger.com/v2/names/solana/mainnet/reverse/${address}`,\n { params: { types: \"eoa,program\", sources: \"sns,cal\", challenge } },\n );\n });\n\n it(\"decodes signedDescriptor hex into Uint8Array\", async () => {\n httpMock.get.mockResolvedValue({\n signedDescriptor: \"ff00\",\n keyId: \"k\",\n keyUsage: \"u\",\n });\n\n const result = await datasource.getTrustedName({\n address,\n network: \"mainnet\",\n challenge,\n types: [\"eoa\"],\n sources: [\"sns\"],\n });\n\n expect(result).toEqual(\n Right({\n address,\n descriptor: new Uint8Array([0xff, 0x00]),\n keyId: \"k\",\n keyUsage: \"u\",\n }),\n );\n });\n\n it(\"returns Left on malformed response\", async () => {\n httpMock.get.mockResolvedValue({ keyId: \"k\", keyUsage: \"u\" } as any);\n\n const result = await datasource.getTrustedName({\n address,\n network: \"mainnet\",\n challenge,\n types: [],\n sources: [],\n });\n\n expect(result.isLeft()).toBe(true);\n expect((result.extract() as Error).message).toMatch(\n new RegExp(\n String.raw`\\[ContextModule\\] HttpSolanaTrustedNameDataSource: malformed response for ${address}:`,\n ),\n );\n });\n\n it(\"returns Left when HTTP client throws\", async () => {\n httpMock.get.mockRejectedValue(new Error(\"net\"));\n\n const result = await datasource.getTrustedName({\n address,\n network: \"mainnet\",\n challenge,\n types: [],\n sources: [],\n });\n\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] HttpSolanaTrustedNameDataSource: Failed to fetch trusted name: net\",\n ),\n ),\n );\n });\n});\n"],
5
+ "mappings": "AAEA,OAAS,QAAAA,EAAM,SAAAC,MAAa,YAC5B,OAAS,cAAAC,EAAY,YAAAC,EAAU,UAAAC,EAAQ,MAAAC,EAAI,MAAAC,MAAU,SAIrD,OAAS,mCAAAC,MAAuC,8BAGhDJ,EAAS,kCAAmC,IAAM,CAChD,IAAIK,EACAC,EACJ,MAAMC,EAAU,cACVC,EAAY,WACZC,EAAqC,CACzC,sBAAuB,CAAE,IAAK,4BAA6B,CAC7D,EAEAV,EAAW,IAAM,CACfI,EAAG,cAAc,EACjBG,EAAW,CAAE,IAAKH,EAAG,GAAG,CAAE,EAC1BE,EAAa,IAAID,EACfK,EACAH,CACF,CACF,CAAC,EAEDJ,EAAG,sEAAuE,SAAY,CACpFI,EAAS,IAAI,kBAAkB,CAC7B,iBAAkB,WAClB,MAAO,WACP,SAAU,cACZ,CAAC,EAED,MAAMD,EAAW,eAAe,CAC9B,QAAAE,EACA,QAAS,UACT,UAAAC,EACA,MAAO,CAAC,MAAO,SAAS,EACxB,QAAS,CAAC,MAAO,KAAK,CACxB,CAAC,EAEDP,EAAOK,EAAS,GAAG,EAAE,qBACnB,8DAA8DC,CAAO,GACrE,CAAE,OAAQ,CAAE,MAAO,cAAe,QAAS,UAAW,UAAAC,CAAU,CAAE,CACpE,CACF,CAAC,EAEDN,EAAG,+CAAgD,SAAY,CAC7DI,EAAS,IAAI,kBAAkB,CAC7B,iBAAkB,OAClB,MAAO,IACP,SAAU,GACZ,CAAC,EAED,MAAMI,EAAS,MAAML,EAAW,eAAe,CAC7C,QAAAE,EACA,QAAS,UACT,UAAAC,EACA,MAAO,CAAC,KAAK,EACb,QAAS,CAAC,KAAK,CACjB,CAAC,EAEDP,EAAOS,CAAM,EAAE,QACbZ,EAAM,CACJ,QAAAS,EACA,WAAY,IAAI,WAAW,CAAC,IAAM,CAAI,CAAC,EACvC,MAAO,IACP,SAAU,GACZ,CAAC,CACH,CACF,CAAC,EAEDL,EAAG,qCAAsC,SAAY,CACnDI,EAAS,IAAI,kBAAkB,CAAE,MAAO,IAAK,SAAU,GAAI,CAAQ,EAEnE,MAAMI,EAAS,MAAML,EAAW,eAAe,CAC7C,QAAAE,EACA,QAAS,UACT,UAAAC,EACA,MAAO,CAAC,EACR,QAAS,CAAC,CACZ,CAAC,EAEDP,EAAOS,EAAO,OAAO,CAAC,EAAE,KAAK,EAAI,EACjCT,EAAQS,EAAO,QAAQ,EAAY,OAAO,EAAE,QAC1C,IAAI,OACF,OAAO,gFAAgFH,CAAO,GAChG,CACF,CACF,CAAC,EAEDL,EAAG,uCAAwC,SAAY,CACrDI,EAAS,IAAI,kBAAkB,IAAI,MAAM,KAAK,CAAC,EAE/C,MAAMI,EAAS,MAAML,EAAW,eAAe,CAC7C,QAAAE,EACA,QAAS,UACT,UAAAC,EACA,MAAO,CAAC,EACR,QAAS,CAAC,CACZ,CAAC,EAEDP,EAAOS,CAAM,EAAE,QACbb,EACE,IAAI,MACF,oFACF,CACF,CACF,CACF,CAAC,CACH,CAAC",
6
+ "names": ["Left", "Right", "beforeEach", "describe", "expect", "it", "vi", "HttpSolanaTrustedNameDataSource", "datasource", "httpMock", "address", "challenge", "config", "result"]
7
+ }
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=TrustedNameDataSource.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -0,0 +1,2 @@
1
+ import{ContainerModule as e}from"inversify";import{HttpSolanaTrustedNameDataSource as t}from"../../../../modules/solana/trusted-name/data/HttpTrustedNameDataSource";import{solanaTrustedNameTypes as a}from"../../../../modules/solana/trusted-name/di/trustedNameTypes";import{SolanaTrustedNameContextLoader as r}from"../../../../modules/solana/trusted-name/domain/TrustedNameContextLoader";const d=()=>new e(({bind:o})=>{o(a.SolanaTrustedNameDataSource).to(t),o(a.SolanaTrustedNameContextLoader).to(r)});export{d as solanaTrustedNameModuleFactory};
2
+ //# sourceMappingURL=trustedNameModuleFactory.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/modules/solana/trusted-name/di/trustedNameModuleFactory.ts"],
4
+ "sourcesContent": ["import { ContainerModule } from \"inversify\";\n\nimport { HttpSolanaTrustedNameDataSource } from \"@/modules/solana/trusted-name/data/HttpTrustedNameDataSource\";\nimport { solanaTrustedNameTypes } from \"@/modules/solana/trusted-name/di/trustedNameTypes\";\nimport { SolanaTrustedNameContextLoader } from \"@/modules/solana/trusted-name/domain/TrustedNameContextLoader\";\n\nexport const solanaTrustedNameModuleFactory = () =>\n new ContainerModule(({ bind }) => {\n bind(solanaTrustedNameTypes.SolanaTrustedNameDataSource).to(\n HttpSolanaTrustedNameDataSource,\n );\n bind(solanaTrustedNameTypes.SolanaTrustedNameContextLoader).to(\n SolanaTrustedNameContextLoader,\n );\n });\n"],
5
+ "mappings": "AAAA,OAAS,mBAAAA,MAAuB,YAEhC,OAAS,mCAAAC,MAAuC,+DAChD,OAAS,0BAAAC,MAA8B,oDACvC,OAAS,kCAAAC,MAAsC,gEAExC,MAAMC,EAAiC,IAC5C,IAAIJ,EAAgB,CAAC,CAAE,KAAAK,CAAK,IAAM,CAChCA,EAAKH,EAAuB,2BAA2B,EAAE,GACvDD,CACF,EACAI,EAAKH,EAAuB,8BAA8B,EAAE,GAC1DC,CACF,CACF,CAAC",
6
+ "names": ["ContainerModule", "HttpSolanaTrustedNameDataSource", "solanaTrustedNameTypes", "SolanaTrustedNameContextLoader", "solanaTrustedNameModuleFactory", "bind"]
7
+ }
@@ -0,0 +1,2 @@
1
+ const a={SolanaTrustedNameDataSource:Symbol.for("SolanaTrustedNameDataSource"),SolanaTrustedNameContextLoader:Symbol.for("SolanaTrustedNameContextLoader")};export{a as solanaTrustedNameTypes};
2
+ //# sourceMappingURL=trustedNameTypes.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/modules/solana/trusted-name/di/trustedNameTypes.ts"],
4
+ "sourcesContent": ["export const solanaTrustedNameTypes = {\n SolanaTrustedNameDataSource: Symbol.for(\"SolanaTrustedNameDataSource\"),\n SolanaTrustedNameContextLoader: Symbol.for(\"SolanaTrustedNameContextLoader\"),\n};\n"],
5
+ "mappings": "AAAO,MAAMA,EAAyB,CACpC,4BAA6B,OAAO,IAAI,6BAA6B,EACrE,+BAAgC,OAAO,IAAI,gCAAgC,CAC7E",
6
+ "names": ["solanaTrustedNameTypes"]
7
+ }
@@ -0,0 +1,2 @@
1
+ var y=Object.defineProperty;var f=Object.getOwnPropertyDescriptor;var g=(a,t,o,e)=>{for(var r=e>1?void 0:e?f(t,o):t,d=a.length-1,l;d>=0;d--)(l=a[d])&&(r=(e?l(t,o,r):l(r))||r);return e&&r&&y(t,o,r),r},n=(a,t)=>(o,e)=>t(o,e,a);import{inject as c,injectable as S}from"inversify";import{array as p,Codec as u,optional as T,string as s}from"purify-ts";import{configTypes as C}from"../../../../config/di/configTypes";import{pkiTypes as h}from"../../../../modules/multichain/pki/di/pkiTypes";import{solanaTrustedNameTypes as N}from"../../../../modules/solana/trusted-name/di/trustedNameTypes";import{ClearSignContextType as m}from"../../../../shared/model/ClearSignContext";import{loadChallengeBoundContexts as v}from"../../../../shared/utils/challengeBoundLoader";import{deviceModelIdCodec as x}from"../../../../shared/utils/deviceModelIdCodec";const L=[m.SOLANA_TRUSTED_NAME],I="mainnet",M=u.interface({address:s,challenge:s,types:p(s),sources:p(s)}),D=u.interface({deviceModelId:x,network:T(s),requests:p(M)});let i=class{constructor(t,o,e){this.dataSource=t;this.certificateLoader=o;this.logger=e("SolanaTrustedNameContextLoader")}logger;canHandle(t,o){return L.every(e=>o.includes(e))?D.decode(t).caseOf({Left:()=>!1,Right:({requests:e})=>e.length>0&&e.every(r=>r.address.length>0&&r.challenge.length>0)}):!1}async load(t){const o=t.network||I;return v({requests:t.requests,deviceModelId:t.deviceModelId,certificateLoader:this.certificateLoader,logger:this.logger,label:"TRUSTED_NAME",fetch:e=>this.dataSource.getTrustedName({address:e.address,challenge:e.challenge,types:e.types,sources:e.sources,network:o}),toContext:(e,r)=>({type:m.SOLANA_TRUSTED_NAME,payload:e.descriptor,certificate:r}),describe:e=>({address:e.address})})}};i=g([S(),n(0,c(N.SolanaTrustedNameDataSource)),n(1,c(h.PkiCertificateLoader)),n(2,c(C.ContextModuleLoggerFactory))],i);export{i as SolanaTrustedNameContextLoader};
2
+ //# sourceMappingURL=TrustedNameContextLoader.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/modules/solana/trusted-name/domain/TrustedNameContextLoader.ts"],
4
+ "sourcesContent": ["import {\n type DeviceModelId,\n type LoggerPublisherService,\n} from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { array, Codec, optional, string } from \"purify-ts\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { pkiTypes } from \"@/modules/multichain/pki/di/pkiTypes\";\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport { type SolanaTrustedNameDataSource } from \"@/modules/solana/trusted-name/data/TrustedNameDataSource\";\nimport { solanaTrustedNameTypes } from \"@/modules/solana/trusted-name/di/trustedNameTypes\";\nimport { type ContextLoader } from \"@/shared/domain/ContextLoader\";\nimport {\n type ClearSignContext,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\nimport { loadChallengeBoundContexts } from \"@/shared/utils/challengeBoundLoader\";\nimport { deviceModelIdCodec } from \"@/shared/utils/deviceModelIdCodec\";\n\nconst SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.SOLANA_TRUSTED_NAME,\n];\n\nconst NETWORK_DEFAULT = \"mainnet\";\n\n/**\n * One trusted-name request, resolved to a Uint8Array TLV descriptor. The\n * caller must obtain a fresh challenge immediately before each fetch.\n */\nexport type SolanaTrustedNameRequest = {\n address: string;\n challenge: string;\n types: string[];\n sources: string[];\n};\n\nexport type SolanaTrustedNameContextInput = {\n deviceModelId: DeviceModelId;\n network?: string; // \"mainnet\" | \"devnet\" | \"testnet\"; defaults to mainnet\n requests: SolanaTrustedNameRequest[];\n};\n\nconst trustedNameRequestCodec = Codec.interface({\n address: string,\n challenge: string,\n types: array(string),\n sources: array(string),\n});\n\nconst solanaTrustedNameInputCodec = Codec.interface({\n deviceModelId: deviceModelIdCodec,\n network: optional(string),\n requests: array(trustedNameRequestCodec),\n});\n\n@injectable()\nexport class SolanaTrustedNameContextLoader\n implements ContextLoader<SolanaTrustedNameContextInput>\n{\n private readonly logger: LoggerPublisherService;\n\n constructor(\n @inject(solanaTrustedNameTypes.SolanaTrustedNameDataSource)\n private readonly dataSource: SolanaTrustedNameDataSource,\n @inject(pkiTypes.PkiCertificateLoader)\n private readonly certificateLoader: PkiCertificateLoader,\n @inject(configTypes.ContextModuleLoggerFactory)\n loggerFactory: (tag: string) => LoggerPublisherService,\n ) {\n this.logger = loggerFactory(\"SolanaTrustedNameContextLoader\");\n }\n\n public canHandle(\n input: unknown,\n expectedTypes: ClearSignContextType[],\n ): input is SolanaTrustedNameContextInput {\n if (!SUPPORTED_TYPES.every((t) => expectedTypes.includes(t))) return false;\n return solanaTrustedNameInputCodec.decode(input).caseOf({\n Left: () => false,\n Right: ({ requests }) =>\n requests.length > 0 &&\n requests.every((r) => r.address.length > 0 && r.challenge.length > 0),\n });\n }\n\n public async load(\n input: SolanaTrustedNameContextInput,\n ): Promise<ClearSignContext[]> {\n const network = input.network || NETWORK_DEFAULT;\n\n return loadChallengeBoundContexts({\n requests: input.requests,\n deviceModelId: input.deviceModelId,\n certificateLoader: this.certificateLoader,\n logger: this.logger,\n label: \"TRUSTED_NAME\",\n fetch: (request) =>\n this.dataSource.getTrustedName({\n address: request.address,\n challenge: request.challenge,\n types: request.types,\n sources: request.sources,\n network,\n }),\n toContext: (value, certificate) => ({\n type: ClearSignContextType.SOLANA_TRUSTED_NAME,\n payload: value.descriptor,\n certificate,\n }),\n describe: (request) => ({ address: request.address }),\n });\n }\n}\n"],
5
+ "mappings": "iOAIA,OAAS,UAAAA,EAAQ,cAAAC,MAAkB,YACnC,OAAS,SAAAC,EAAO,SAAAC,EAAO,YAAAC,EAAU,UAAAC,MAAc,YAE/C,OAAS,eAAAC,MAAmB,0BAC5B,OAAS,YAAAC,MAAgB,uCAGzB,OAAS,0BAAAC,MAA8B,oDAEvC,OAEE,wBAAAC,MACK,kCACP,OAAS,8BAAAC,MAAkC,sCAC3C,OAAS,sBAAAC,MAA0B,oCAEnC,MAAMC,EAA0C,CAC9CC,EAAqB,mBACvB,EAEMC,EAAkB,UAmBlBC,EAA0BC,EAAM,UAAU,CAC9C,QAASC,EACT,UAAWA,EACX,MAAOC,EAAMD,CAAM,EACnB,QAASC,EAAMD,CAAM,CACvB,CAAC,EAEKE,EAA8BH,EAAM,UAAU,CAClD,cAAeI,EACf,QAASC,EAASJ,CAAM,EACxB,SAAUC,EAAMH,CAAuB,CACzC,CAAC,EAGM,IAAMO,EAAN,KAEP,CAGE,YAEmBC,EAEAC,EAEjBC,EACA,CALiB,gBAAAF,EAEA,uBAAAC,EAIjB,KAAK,OAASC,EAAc,gCAAgC,CAC9D,CAXiB,OAaV,UACLC,EACAC,EACwC,CACxC,OAAKf,EAAgB,MAAOgB,GAAMD,EAAc,SAASC,CAAC,CAAC,EACpDT,EAA4B,OAAOO,CAAK,EAAE,OAAO,CACtD,KAAM,IAAM,GACZ,MAAO,CAAC,CAAE,SAAAG,CAAS,IACjBA,EAAS,OAAS,GAClBA,EAAS,MAAO,GAAM,EAAE,QAAQ,OAAS,GAAK,EAAE,UAAU,OAAS,CAAC,CACxE,CAAC,EANoE,EAOvE,CAEA,MAAa,KACXH,EAC6B,CAC7B,MAAMI,EAAUJ,EAAM,SAAWZ,EAEjC,OAAOiB,EAA2B,CAChC,SAAUL,EAAM,SAChB,cAAeA,EAAM,cACrB,kBAAmB,KAAK,kBACxB,OAAQ,KAAK,OACb,MAAO,eACP,MAAQM,GACN,KAAK,WAAW,eAAe,CAC7B,QAASA,EAAQ,QACjB,UAAWA,EAAQ,UACnB,MAAOA,EAAQ,MACf,QAASA,EAAQ,QACjB,QAAAF,CACF,CAAC,EACH,UAAW,CAACG,EAAOC,KAAiB,CAClC,KAAMrB,EAAqB,oBAC3B,QAASoB,EAAM,WACf,YAAAC,CACF,GACA,SAAWF,IAAa,CAAE,QAASA,EAAQ,OAAQ,EACrD,CAAC,CACH,CACF,EAxDaV,EAANa,EAAA,CADNC,EAAW,EAOPC,EAAA,EAAAC,EAAOC,EAAuB,2BAA2B,GAEzDF,EAAA,EAAAC,EAAOE,EAAS,oBAAoB,GAEpCH,EAAA,EAAAC,EAAOG,EAAY,0BAA0B,IAVrCnB",
6
+ "names": ["inject", "injectable", "array", "Codec", "optional", "string", "configTypes", "pkiTypes", "solanaTrustedNameTypes", "ClearSignContextType", "loadChallengeBoundContexts", "deviceModelIdCodec", "SUPPORTED_TYPES", "ClearSignContextType", "NETWORK_DEFAULT", "trustedNameRequestCodec", "Codec", "string", "array", "solanaTrustedNameInputCodec", "deviceModelIdCodec", "optional", "SolanaTrustedNameContextLoader", "dataSource", "certificateLoader", "loggerFactory", "input", "expectedTypes", "t", "requests", "network", "loadChallengeBoundContexts", "request", "value", "certificate", "__decorateClass", "injectable", "__decorateParam", "inject", "solanaTrustedNameTypes", "pkiTypes", "configTypes"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{DeviceModelId as l}from"@ledgerhq/device-management-kit";import{Left as A,Right as i}from"purify-ts";import{beforeEach as N,describe as u,expect as t,it as d,vi as a}from"vitest";import{ClearSignContextType as o}from"../../../../shared/model/ClearSignContext";import{SolanaTrustedNameContextLoader as f}from"./TrustedNameContextLoader";const g=()=>({debug:a.fn(),info:a.fn(),warn:a.fn(),error:a.fn(),subscribers:[]}),m={keyUsageNumber:4,payload:new Uint8Array([7])},r="Addr11111111111111111111111111111111111111",p="Addr22222222222222222222222222222222222222";u("SolanaTrustedNameContextLoader",()=>{let c,y;N(()=>{a.restoreAllMocks(),c={getTrustedName:a.fn()},y={loadCertificate:a.fn().mockResolvedValue(m)}});const n=()=>new f(c,y,g);u("canHandle",()=>{d("returns true when SOLANA_TRUSTED_NAME is requested with valid requests",()=>{t(n().canHandle({deviceModelId:l.NANO_X,requests:[{address:r,challenge:"c",types:["eoa"],sources:["sns"]}]},[o.SOLANA_TRUSTED_NAME])).toBe(!0)}),d("returns false when SOLANA_TRUSTED_NAME is not requested",()=>{t(n().canHandle({requests:[{address:r,challenge:"c",types:["eoa"],sources:["sns"]}]},[o.SOLANA_TOKEN])).toBe(!1)}),d("returns false on malformed input",()=>{const e=n(),s=[o.SOLANA_TRUSTED_NAME];t(e.canHandle({requests:[]},s)).toBe(!1),t(e.canHandle({requests:[{address:"",challenge:"c",types:[],sources:[]}]},s)).toBe(!1),t(e.canHandle({requests:[{address:r,challenge:"",types:[],sources:[]}]},s)).toBe(!1)})}),u("load",()=>{d("emits one SOLANA_TRUSTED_NAME per request with Uint8Array payload",async()=>{a.spyOn(c,"getTrustedName").mockImplementation(async({address:s})=>i({address:s,descriptor:new Uint8Array([s===r?170:187]),keyId:"name_key",keyUsage:"trusted_name"}));const e=await n().load({deviceModelId:l.NANO_X,requests:[{address:r,challenge:"c1",types:["eoa"],sources:["sns"]},{address:p,challenge:"c2",types:["program"],sources:["cal"]}]});t(e).toHaveLength(2),t(e[0]).toMatchObject({type:o.SOLANA_TRUSTED_NAME,payload:new Uint8Array([170]),certificate:m}),t(e[1]).toMatchObject({type:o.SOLANA_TRUSTED_NAME,payload:new Uint8Array([187])})}),d("emits an ERROR per failing request and keeps the others",async()=>{a.spyOn(c,"getTrustedName").mockImplementation(async({address:s})=>s===r?i({address:s,descriptor:new Uint8Array([170]),keyId:"k",keyUsage:"u"}):A(new Error("upstream-404")));const e=await n().load({deviceModelId:l.NANO_X,requests:[{address:r,challenge:"c1",types:[],sources:[]},{address:p,challenge:"c2",types:[],sources:[]}]});t(e[0]?.type).toBe(o.SOLANA_TRUSTED_NAME),t(e[1]?.type).toBe(o.ERROR)}),d("forwards default network=mainnet when input.network is omitted",async()=>{const e=a.spyOn(c,"getTrustedName").mockResolvedValue(i({address:r,descriptor:new Uint8Array([1]),keyId:"k",keyUsage:"u"}));await n().load({deviceModelId:l.NANO_X,requests:[{address:r,challenge:"c",types:[],sources:[]}]}),t(e).toHaveBeenCalledWith(t.objectContaining({network:"mainnet"}))})})});
2
+ //# sourceMappingURL=TrustedNameContextLoader.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/modules/solana/trusted-name/domain/TrustedNameContextLoader.test.ts"],
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { DeviceModelId } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport { type SolanaTrustedNameDataSource } from \"@/modules/solana/trusted-name/data/TrustedNameDataSource\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\n\nimport { SolanaTrustedNameContextLoader } from \"./TrustedNameContextLoader\";\n\nconst mockLoggerFactory = () => ({\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n});\n\nconst mockCertificate = { keyUsageNumber: 4, payload: new Uint8Array([7]) };\nconst ADDR_A = \"Addr11111111111111111111111111111111111111\";\nconst ADDR_B = \"Addr22222222222222222222222222222222222222\";\n\ndescribe(\"SolanaTrustedNameContextLoader\", () => {\n let dataSource: SolanaTrustedNameDataSource;\n let certificateLoader: PkiCertificateLoader;\n\n beforeEach(() => {\n vi.restoreAllMocks();\n dataSource = {\n getTrustedName: vi.fn(),\n };\n certificateLoader = {\n loadCertificate: vi.fn().mockResolvedValue(mockCertificate),\n };\n });\n\n const makeLoader = () =>\n new SolanaTrustedNameContextLoader(\n dataSource,\n certificateLoader,\n mockLoggerFactory,\n );\n\n describe(\"canHandle\", () => {\n it(\"returns true when SOLANA_TRUSTED_NAME is requested with valid requests\", () => {\n expect(\n makeLoader().canHandle(\n {\n deviceModelId: DeviceModelId.NANO_X,\n requests: [\n {\n address: ADDR_A,\n challenge: \"c\",\n types: [\"eoa\"],\n sources: [\"sns\"],\n },\n ],\n },\n [ClearSignContextType.SOLANA_TRUSTED_NAME],\n ),\n ).toBe(true);\n });\n\n it(\"returns false when SOLANA_TRUSTED_NAME is not requested\", () => {\n expect(\n makeLoader().canHandle(\n {\n requests: [\n {\n address: ADDR_A,\n challenge: \"c\",\n types: [\"eoa\"],\n sources: [\"sns\"],\n },\n ],\n } as any,\n [ClearSignContextType.SOLANA_TOKEN],\n ),\n ).toBe(false);\n });\n\n it(\"returns false on malformed input\", () => {\n const loader = makeLoader();\n const types = [ClearSignContextType.SOLANA_TRUSTED_NAME];\n expect(loader.canHandle({ requests: [] } as any, types)).toBe(false);\n expect(\n loader.canHandle(\n {\n requests: [{ address: \"\", challenge: \"c\", types: [], sources: [] }],\n } as any,\n types,\n ),\n ).toBe(false);\n expect(\n loader.canHandle(\n {\n requests: [\n { address: ADDR_A, challenge: \"\", types: [], sources: [] },\n ],\n } as any,\n types,\n ),\n ).toBe(false);\n });\n });\n\n describe(\"load\", () => {\n it(\"emits one SOLANA_TRUSTED_NAME per request with Uint8Array payload\", async () => {\n vi.spyOn(dataSource, \"getTrustedName\").mockImplementation(\n async ({ address }) =>\n Right({\n address,\n descriptor: new Uint8Array([address === ADDR_A ? 0xaa : 0xbb]),\n keyId: \"name_key\",\n keyUsage: \"trusted_name\",\n }),\n );\n\n const result = await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n requests: [\n {\n address: ADDR_A,\n challenge: \"c1\",\n types: [\"eoa\"],\n sources: [\"sns\"],\n },\n {\n address: ADDR_B,\n challenge: \"c2\",\n types: [\"program\"],\n sources: [\"cal\"],\n },\n ],\n });\n\n expect(result).toHaveLength(2);\n expect(result[0]).toMatchObject({\n type: ClearSignContextType.SOLANA_TRUSTED_NAME,\n payload: new Uint8Array([0xaa]),\n certificate: mockCertificate,\n });\n expect(result[1]).toMatchObject({\n type: ClearSignContextType.SOLANA_TRUSTED_NAME,\n payload: new Uint8Array([0xbb]),\n });\n });\n\n it(\"emits an ERROR per failing request and keeps the others\", async () => {\n vi.spyOn(dataSource, \"getTrustedName\").mockImplementation(\n async ({ address }) => {\n if (address === ADDR_A) {\n return Right({\n address,\n descriptor: new Uint8Array([0xaa]),\n keyId: \"k\",\n keyUsage: \"u\",\n });\n }\n return Left(new Error(\"upstream-404\"));\n },\n );\n\n const out = await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n requests: [\n { address: ADDR_A, challenge: \"c1\", types: [], sources: [] },\n { address: ADDR_B, challenge: \"c2\", types: [], sources: [] },\n ],\n });\n\n expect(out[0]?.type).toBe(ClearSignContextType.SOLANA_TRUSTED_NAME);\n expect(out[1]?.type).toBe(ClearSignContextType.ERROR);\n });\n\n it(\"forwards default network=mainnet when input.network is omitted\", async () => {\n const spy = vi.spyOn(dataSource, \"getTrustedName\").mockResolvedValue(\n Right({\n address: ADDR_A,\n descriptor: new Uint8Array([1]),\n keyId: \"k\",\n keyUsage: \"u\",\n }),\n );\n\n await makeLoader().load({\n deviceModelId: DeviceModelId.NANO_X,\n requests: [{ address: ADDR_A, challenge: \"c\", types: [], sources: [] }],\n });\n\n expect(spy).toHaveBeenCalledWith(\n expect.objectContaining({ network: \"mainnet\" }),\n );\n });\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["DeviceModelId", "Left", "Right", "beforeEach", "describe", "expect", "it", "vi", "ClearSignContextType", "SolanaTrustedNameContextLoader", "mockLoggerFactory", "mockCertificate", "ADDR_A", "ADDR_B", "dataSource", "certificateLoader", "makeLoader", "loader", "types", "address", "result", "out", "spy"]
7
+ }
@@ -1,2 +1,2 @@
1
- var r=(e=>(e.ERROR="error",e.CONCORDIUM_ACCOUNT_OWNERSHIP="concordiumAccountOwnership",e.ETHEREUM_TOKEN="ethereumToken",e.ETHEREUM_NFT="ethereumNft",e.ETHEREUM_TRUSTED_NAME="ethereumTrustedName",e.ETHEREUM_PLUGIN="ethereumPlugin",e.ETHEREUM_EXTERNAL_PLUGIN="ethereumExternalPlugin",e.ETHEREUM_TRANSACTION_INFO="ethereumTransactionInfo",e.ETHEREUM_PROXY_INFO="ethereumProxyInfo",e.ETHEREUM_ENUM="ethereumEnum",e.ETHEREUM_TRANSACTION_FIELD_DESCRIPTION="ethereumTransactionFieldDescription",e.ETHEREUM_TRANSACTION_CHECK="ethereumTransactionCheck",e.ETHEREUM_DYNAMIC_NETWORK="ethereumDynamicNetwork",e.ETHEREUM_DYNAMIC_NETWORK_ICON="ethereumDynamicNetworkIcon",e.ETHEREUM_SAFE="ethereumSafe",e.ETHEREUM_SIGNER="ethereumSigner",e.ETHEREUM_GATED_SIGNING="ethereumGatedSigning",e.SOLANA_TOKEN="solanaToken",e.SOLANA_LIFI="solanaLifi",e.SOLANA_TRUSTED_NAME="solanaTrustedName",e.SOLANA_TRANSACTION_CHECK="solanaTransactionCheck",e))(r||{});export{r as ClearSignContextType};
1
+ var E=(e=>(e.ERROR="error",e.CONCORDIUM_ACCOUNT_OWNERSHIP="concordiumAccountOwnership",e.ETHEREUM_TOKEN="ethereumToken",e.ETHEREUM_NFT="ethereumNft",e.ETHEREUM_TRUSTED_NAME="ethereumTrustedName",e.ETHEREUM_PLUGIN="ethereumPlugin",e.ETHEREUM_EXTERNAL_PLUGIN="ethereumExternalPlugin",e.ETHEREUM_TRANSACTION_INFO="ethereumTransactionInfo",e.ETHEREUM_PROXY_INFO="ethereumProxyInfo",e.ETHEREUM_ENUM="ethereumEnum",e.ETHEREUM_TRANSACTION_FIELD_DESCRIPTION="ethereumTransactionFieldDescription",e.ETHEREUM_TRANSACTION_CHECK="ethereumTransactionCheck",e.ETHEREUM_DYNAMIC_NETWORK="ethereumDynamicNetwork",e.ETHEREUM_DYNAMIC_NETWORK_ICON="ethereumDynamicNetworkIcon",e.ETHEREUM_SAFE="ethereumSafe",e.ETHEREUM_SIGNER="ethereumSigner",e.ETHEREUM_GATED_SIGNING="ethereumGatedSigning",e.SOLANA_TOKEN="solanaToken",e.SOLANA_LIFI="solanaLifi",e.SOLANA_TRUSTED_NAME="solanaTrustedName",e.SOLANA_BASIC_TRUSTED_NAME="solanaBasicTrustedName",e.SOLANA_TRANSACTION_CHECK="solanaTransactionCheck",e.SOLANA_INSTRUCTION_INFO="solanaInstructionInfo",e.SOLANA_ENUM_VARIANT="solanaEnumVariant",e.SOLANA_TOKEN_INFO="solanaTokenInfo",e.SOLANA_TOKEN_ACCOUNT_STATE="solanaTokenAccountState",e.SOLANA_ALT_RESOLUTION="solanaAltResolution",e))(E||{});export{E as ClearSignContextType};
2
2
  //# sourceMappingURL=ClearSignContext.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/shared/model/ClearSignContext.ts"],
4
- "sourcesContent": ["import { type EthereumPayloadOverrides } from \"@/modules/ethereum/model/EthereumClearSignContext\";\nimport { type PkiCertificate } from \"@/modules/multichain/pki/model/PkiCertificate\";\nimport { type SolanaPayloadOverrides } from \"@/modules/solana/model/SolanaClearSignContext\";\n\nexport enum ClearSignContextType {\n ERROR = \"error\",\n CONCORDIUM_ACCOUNT_OWNERSHIP = \"concordiumAccountOwnership\",\n ETHEREUM_TOKEN = \"ethereumToken\",\n ETHEREUM_NFT = \"ethereumNft\",\n ETHEREUM_TRUSTED_NAME = \"ethereumTrustedName\",\n ETHEREUM_PLUGIN = \"ethereumPlugin\",\n ETHEREUM_EXTERNAL_PLUGIN = \"ethereumExternalPlugin\",\n ETHEREUM_TRANSACTION_INFO = \"ethereumTransactionInfo\",\n ETHEREUM_PROXY_INFO = \"ethereumProxyInfo\",\n ETHEREUM_ENUM = \"ethereumEnum\",\n ETHEREUM_TRANSACTION_FIELD_DESCRIPTION = \"ethereumTransactionFieldDescription\",\n ETHEREUM_TRANSACTION_CHECK = \"ethereumTransactionCheck\",\n ETHEREUM_DYNAMIC_NETWORK = \"ethereumDynamicNetwork\",\n ETHEREUM_DYNAMIC_NETWORK_ICON = \"ethereumDynamicNetworkIcon\",\n ETHEREUM_SAFE = \"ethereumSafe\",\n ETHEREUM_SIGNER = \"ethereumSigner\",\n ETHEREUM_GATED_SIGNING = \"ethereumGatedSigning\",\n SOLANA_TOKEN = \"solanaToken\",\n SOLANA_LIFI = \"solanaLifi\",\n SOLANA_TRUSTED_NAME = \"solanaTrustedName\",\n SOLANA_TRANSACTION_CHECK = \"solanaTransactionCheck\",\n}\n\nexport type ClearSignContextSuccessType = Exclude<\n ClearSignContextType,\n ClearSignContextType.ERROR\n>;\n\n/**\n * Base payload shape shared by every success context. Chain modules extend\n * this via PayloadOverrides for variants that carry typed payloads.\n */\nexport type ClearSignContextSuccessBase = {\n payload: string;\n certificate?: PkiCertificate;\n};\n\ntype ClearSignContextSuccessPayloadsBase = {\n [K in ClearSignContextSuccessType]: ClearSignContextSuccessBase;\n};\n\n// Chain modules contribute typed-payload overrides. This file is the\n// integration boundary that assembles them into the cross-chain union.\ntype ClearSignContextSuccessPayloadOverrides = EthereumPayloadOverrides &\n SolanaPayloadOverrides;\n\ntype ClearSignContextSuccessPayloads = Omit<\n ClearSignContextSuccessPayloadsBase,\n keyof ClearSignContextSuccessPayloadOverrides\n> &\n ClearSignContextSuccessPayloadOverrides;\n\nexport type ClearSignContextSuccess<\n T extends ClearSignContextSuccessType = ClearSignContextSuccessType,\n> = T extends ClearSignContextSuccessType\n ? { type: T } & ClearSignContextSuccessPayloads[T]\n : never;\n\nexport type ClearSignContextError = {\n type: ClearSignContextType.ERROR;\n error: Error;\n};\n\nexport type ClearSignContext = ClearSignContextSuccess | ClearSignContextError;\n"],
5
- "mappings": "AAIO,IAAKA,OACVA,EAAA,MAAQ,QACRA,EAAA,6BAA+B,6BAC/BA,EAAA,eAAiB,gBACjBA,EAAA,aAAe,cACfA,EAAA,sBAAwB,sBACxBA,EAAA,gBAAkB,iBAClBA,EAAA,yBAA2B,yBAC3BA,EAAA,0BAA4B,0BAC5BA,EAAA,oBAAsB,oBACtBA,EAAA,cAAgB,eAChBA,EAAA,uCAAyC,sCACzCA,EAAA,2BAA6B,2BAC7BA,EAAA,yBAA2B,yBAC3BA,EAAA,8BAAgC,6BAChCA,EAAA,cAAgB,eAChBA,EAAA,gBAAkB,iBAClBA,EAAA,uBAAyB,uBACzBA,EAAA,aAAe,cACfA,EAAA,YAAc,aACdA,EAAA,oBAAsB,oBACtBA,EAAA,yBAA2B,yBArBjBA,OAAA",
4
+ "sourcesContent": ["import { type EthereumPayloadOverrides } from \"@/modules/ethereum/model/EthereumClearSignContext\";\nimport { type PkiCertificate } from \"@/modules/multichain/pki/model/PkiCertificate\";\nimport { type SolanaPayloadOverrides } from \"@/modules/solana/model/SolanaClearSignContext\";\n\nexport enum ClearSignContextType {\n ERROR = \"error\",\n CONCORDIUM_ACCOUNT_OWNERSHIP = \"concordiumAccountOwnership\",\n ETHEREUM_TOKEN = \"ethereumToken\",\n ETHEREUM_NFT = \"ethereumNft\",\n ETHEREUM_TRUSTED_NAME = \"ethereumTrustedName\",\n ETHEREUM_PLUGIN = \"ethereumPlugin\",\n ETHEREUM_EXTERNAL_PLUGIN = \"ethereumExternalPlugin\",\n ETHEREUM_TRANSACTION_INFO = \"ethereumTransactionInfo\",\n ETHEREUM_PROXY_INFO = \"ethereumProxyInfo\",\n ETHEREUM_ENUM = \"ethereumEnum\",\n ETHEREUM_TRANSACTION_FIELD_DESCRIPTION = \"ethereumTransactionFieldDescription\",\n ETHEREUM_TRANSACTION_CHECK = \"ethereumTransactionCheck\",\n ETHEREUM_DYNAMIC_NETWORK = \"ethereumDynamicNetwork\",\n ETHEREUM_DYNAMIC_NETWORK_ICON = \"ethereumDynamicNetworkIcon\",\n ETHEREUM_SAFE = \"ethereumSafe\",\n ETHEREUM_SIGNER = \"ethereumSigner\",\n ETHEREUM_GATED_SIGNING = \"ethereumGatedSigning\",\n SOLANA_TOKEN = \"solanaToken\",\n SOLANA_LIFI = \"solanaLifi\",\n SOLANA_TRUSTED_NAME = \"solanaTrustedName\",\n SOLANA_BASIC_TRUSTED_NAME = \"solanaBasicTrustedName\",\n SOLANA_TRANSACTION_CHECK = \"solanaTransactionCheck\",\n SOLANA_INSTRUCTION_INFO = \"solanaInstructionInfo\",\n SOLANA_ENUM_VARIANT = \"solanaEnumVariant\",\n SOLANA_TOKEN_INFO = \"solanaTokenInfo\",\n SOLANA_TOKEN_ACCOUNT_STATE = \"solanaTokenAccountState\",\n SOLANA_ALT_RESOLUTION = \"solanaAltResolution\",\n}\n\nexport type ClearSignContextSuccessType = Exclude<\n ClearSignContextType,\n ClearSignContextType.ERROR\n>;\n\n/**\n * Base payload shape shared by every success context. Chain modules extend\n * this via PayloadOverrides for variants that carry typed payloads.\n */\nexport type ClearSignContextSuccessBase = {\n payload: string;\n certificate?: PkiCertificate;\n};\n\ntype ClearSignContextSuccessPayloadsBase = {\n [K in ClearSignContextSuccessType]: ClearSignContextSuccessBase;\n};\n\n// Chain modules contribute typed-payload overrides. This file is the\n// integration boundary that assembles them into the cross-chain union.\ntype ClearSignContextSuccessPayloadOverrides = EthereumPayloadOverrides &\n SolanaPayloadOverrides;\n\ntype ClearSignContextSuccessPayloads = Omit<\n ClearSignContextSuccessPayloadsBase,\n keyof ClearSignContextSuccessPayloadOverrides\n> &\n ClearSignContextSuccessPayloadOverrides;\n\nexport type ClearSignContextSuccess<\n T extends ClearSignContextSuccessType = ClearSignContextSuccessType,\n> = T extends ClearSignContextSuccessType\n ? { type: T } & ClearSignContextSuccessPayloads[T]\n : never;\n\nexport type ClearSignContextError = {\n type: ClearSignContextType.ERROR;\n error: Error;\n};\n\nexport type ClearSignContext = ClearSignContextSuccess | ClearSignContextError;\n"],
5
+ "mappings": "AAIO,IAAKA,OACVA,EAAA,MAAQ,QACRA,EAAA,6BAA+B,6BAC/BA,EAAA,eAAiB,gBACjBA,EAAA,aAAe,cACfA,EAAA,sBAAwB,sBACxBA,EAAA,gBAAkB,iBAClBA,EAAA,yBAA2B,yBAC3BA,EAAA,0BAA4B,0BAC5BA,EAAA,oBAAsB,oBACtBA,EAAA,cAAgB,eAChBA,EAAA,uCAAyC,sCACzCA,EAAA,2BAA6B,2BAC7BA,EAAA,yBAA2B,yBAC3BA,EAAA,8BAAgC,6BAChCA,EAAA,cAAgB,eAChBA,EAAA,gBAAkB,iBAClBA,EAAA,uBAAyB,uBACzBA,EAAA,aAAe,cACfA,EAAA,YAAc,aACdA,EAAA,oBAAsB,oBACtBA,EAAA,0BAA4B,yBAC5BA,EAAA,yBAA2B,yBAC3BA,EAAA,wBAA0B,wBAC1BA,EAAA,oBAAsB,oBACtBA,EAAA,kBAAoB,kBACpBA,EAAA,2BAA6B,0BAC7BA,EAAA,sBAAwB,sBA3BdA,OAAA",
6
6
  "names": ["ClearSignContextType"]
7
7
  }
@@ -1,2 +1,2 @@
1
- class g{static stringToHex(e){let t="";for(let r=0;r<e.length;r++){const n=e.charCodeAt(r).toString(16);t+=n.padStart(2,"0")}return t}static appendSignatureToPayload(e,t,r){t.length%2!==0&&(t="0"+t);let n=(t.length/2).toString(16);return n.length%2!==0&&(n="0"+n),`${e}${r}${n}${t}`}}export{g as HexStringUtils};
1
+ class s{static hexToBytes(e){const t=e.startsWith("0x")||e.startsWith("0X")?e.slice(2):e;if(t.length===0)throw new Error("HexStringUtils.hexToBytes: empty hex string");if(t.length%2!==0)throw new Error(`HexStringUtils.hexToBytes: odd-length hex string (${t.length})`);if(!/^[0-9a-fA-F]+$/.test(t))throw new Error("HexStringUtils.hexToBytes: non-hex characters");const n=new Uint8Array(t.length/2);for(let r=0;r<n.length;r++)n[r]=Number.parseInt(t.slice(r*2,r*2+2),16);return n}static stringToHex(e){let t="";for(let n=0;n<e.length;n++){const r=e.charCodeAt(n).toString(16);t+=r.padStart(2,"0")}return t}static appendSignatureToPayload(e,t,n){t.length%2!==0&&(t="0"+t);let r=(t.length/2).toString(16);return r.length%2!==0&&(r="0"+r),`${e}${n}${r}${t}`}}export{s as HexStringUtils};
2
2
  //# sourceMappingURL=HexStringUtils.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/shared/utils/HexStringUtils.ts"],
4
- "sourcesContent": ["export class HexStringUtils {\n static stringToHex(str: string): string {\n let hexString = \"\";\n for (let i = 0; i < str.length; i++) {\n const hex = str.charCodeAt(i).toString(16);\n hexString += hex.padStart(2, \"0\"); // Ensure each hex code is at least 2 characters long\n }\n return hexString;\n }\n\n static appendSignatureToPayload(\n payload: string,\n signature: string,\n tag: string,\n ): string {\n // Ensure correct padding\n if (signature.length % 2 !== 0) {\n signature = \"0\" + signature;\n }\n // TLV encoding as according to trusted name documentation\n let signatureLength = (signature.length / 2).toString(16);\n if (signatureLength.length % 2 !== 0) {\n signatureLength = \"0\" + signatureLength;\n }\n\n return `${payload}${tag}${signatureLength}${signature}`;\n }\n}\n"],
5
- "mappings": "AAAO,MAAMA,CAAe,CAC1B,OAAO,YAAYC,EAAqB,CACtC,IAAIC,EAAY,GAChB,QAASC,EAAI,EAAGA,EAAIF,EAAI,OAAQE,IAAK,CACnC,MAAMC,EAAMH,EAAI,WAAWE,CAAC,EAAE,SAAS,EAAE,EACzCD,GAAaE,EAAI,SAAS,EAAG,GAAG,CAClC,CACA,OAAOF,CACT,CAEA,OAAO,yBACLG,EACAC,EACAC,EACQ,CAEJD,EAAU,OAAS,IAAM,IAC3BA,EAAY,IAAMA,GAGpB,IAAIE,GAAmBF,EAAU,OAAS,GAAG,SAAS,EAAE,EACxD,OAAIE,EAAgB,OAAS,IAAM,IACjCA,EAAkB,IAAMA,GAGnB,GAAGH,CAAO,GAAGE,CAAG,GAAGC,CAAe,GAAGF,CAAS,EACvD,CACF",
6
- "names": ["HexStringUtils", "str", "hexString", "i", "hex", "payload", "signature", "tag", "signatureLength"]
4
+ "sourcesContent": ["export class HexStringUtils {\n /**\n * Decode a non-empty even-length hex string (with optional `0x` prefix)\n * into a Uint8Array. Throws on empty input, odd length, or non-hex\n * characters \u2014 the empty case is rejected explicitly so callers can't\n * silently produce a zero-length descriptor.\n */\n static hexToBytes(hex: string): Uint8Array {\n const s = hex.startsWith(\"0x\") || hex.startsWith(\"0X\") ? hex.slice(2) : hex;\n if (s.length === 0) {\n throw new Error(\"HexStringUtils.hexToBytes: empty hex string\");\n }\n if (s.length % 2 !== 0) {\n throw new Error(\n `HexStringUtils.hexToBytes: odd-length hex string (${s.length})`,\n );\n }\n if (!/^[0-9a-fA-F]+$/.test(s)) {\n throw new Error(\"HexStringUtils.hexToBytes: non-hex characters\");\n }\n const out = new Uint8Array(s.length / 2);\n for (let i = 0; i < out.length; i++) {\n out[i] = Number.parseInt(s.slice(i * 2, i * 2 + 2), 16);\n }\n return out;\n }\n\n static stringToHex(str: string): string {\n let hexString = \"\";\n for (let i = 0; i < str.length; i++) {\n const hex = str.charCodeAt(i).toString(16);\n hexString += hex.padStart(2, \"0\"); // Ensure each hex code is at least 2 characters long\n }\n return hexString;\n }\n\n static appendSignatureToPayload(\n payload: string,\n signature: string,\n tag: string,\n ): string {\n // Ensure correct padding\n if (signature.length % 2 !== 0) {\n signature = \"0\" + signature;\n }\n // TLV encoding as according to trusted name documentation\n let signatureLength = (signature.length / 2).toString(16);\n if (signatureLength.length % 2 !== 0) {\n signatureLength = \"0\" + signatureLength;\n }\n\n return `${payload}${tag}${signatureLength}${signature}`;\n }\n}\n"],
5
+ "mappings": "AAAO,MAAMA,CAAe,CAO1B,OAAO,WAAWC,EAAyB,CACzC,MAAMC,EAAID,EAAI,WAAW,IAAI,GAAKA,EAAI,WAAW,IAAI,EAAIA,EAAI,MAAM,CAAC,EAAIA,EACxE,GAAIC,EAAE,SAAW,EACf,MAAM,IAAI,MAAM,6CAA6C,EAE/D,GAAIA,EAAE,OAAS,IAAM,EACnB,MAAM,IAAI,MACR,qDAAqDA,EAAE,MAAM,GAC/D,EAEF,GAAI,CAAC,iBAAiB,KAAKA,CAAC,EAC1B,MAAM,IAAI,MAAM,+CAA+C,EAEjE,MAAMC,EAAM,IAAI,WAAWD,EAAE,OAAS,CAAC,EACvC,QAASE,EAAI,EAAGA,EAAID,EAAI,OAAQC,IAC9BD,EAAIC,CAAC,EAAI,OAAO,SAASF,EAAE,MAAME,EAAI,EAAGA,EAAI,EAAI,CAAC,EAAG,EAAE,EAExD,OAAOD,CACT,CAEA,OAAO,YAAYE,EAAqB,CACtC,IAAIC,EAAY,GAChB,QAASF,EAAI,EAAGA,EAAIC,EAAI,OAAQD,IAAK,CACnC,MAAMH,EAAMI,EAAI,WAAWD,CAAC,EAAE,SAAS,EAAE,EACzCE,GAAaL,EAAI,SAAS,EAAG,GAAG,CAClC,CACA,OAAOK,CACT,CAEA,OAAO,yBACLC,EACAC,EACAC,EACQ,CAEJD,EAAU,OAAS,IAAM,IAC3BA,EAAY,IAAMA,GAGpB,IAAIE,GAAmBF,EAAU,OAAS,GAAG,SAAS,EAAE,EACxD,OAAIE,EAAgB,OAAS,IAAM,IACjCA,EAAkB,IAAMA,GAGnB,GAAGH,CAAO,GAAGE,CAAG,GAAGC,CAAe,GAAGF,CAAS,EACvD,CACF",
6
+ "names": ["HexStringUtils", "hex", "s", "out", "i", "str", "hexString", "payload", "signature", "tag", "signatureLength"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{HexStringUtils as e}from"../../shared/utils/HexStringUtils";describe("HexStringUtils",()=>{describe("appendSignatureToPayload",()=>{it("should append signature to payload",()=>{const s=e.appendSignatureToPayload("01020304","05060708","15");expect(s).toEqual("01020304150405060708")}),it("should append signature to payload with odd length",()=>{const s=e.appendSignatureToPayload("01020304","5060708","15");expect(s).toEqual("01020304150405060708")})}),describe("stringToHex",()=>{it("should convert string to hex",()=>{const t=e.stringToHex("test");expect(t).toEqual("74657374")}),it("should convert string to hex with odd length",()=>{const t=e.stringToHex("test1");expect(t).toEqual("7465737431")})})});
1
+ import{HexStringUtils as t}from"../../shared/utils/HexStringUtils";describe("HexStringUtils",()=>{describe("appendSignatureToPayload",()=>{it("should append signature to payload",()=>{const s=t.appendSignatureToPayload("01020304","05060708","15");expect(s).toEqual("01020304150405060708")}),it("should append signature to payload with odd length",()=>{const s=t.appendSignatureToPayload("01020304","5060708","15");expect(s).toEqual("01020304150405060708")})}),describe("hexToBytes",()=>{it("decodes a plain hex string into Uint8Array",()=>{expect(t.hexToBytes("deadbeef")).toEqual(new Uint8Array([222,173,190,239]))}),it("strips a 0x prefix",()=>{expect(t.hexToBytes("0xCAFEBABE")).toEqual(new Uint8Array([202,254,186,190]))}),it("throws on the empty string",()=>{expect(()=>t.hexToBytes("")).toThrow(/empty hex string/)}),it("throws on a bare `0x` prefix with no payload",()=>{expect(()=>t.hexToBytes("0x")).toThrow(/empty hex string/)}),it("throws on odd-length input",()=>{expect(()=>t.hexToBytes("abc")).toThrow(/odd-length/)}),it("throws on non-hex characters",()=>{expect(()=>t.hexToBytes("zzzz")).toThrow(/non-hex/)})}),describe("stringToHex",()=>{it("should convert string to hex",()=>{const e=t.stringToHex("test");expect(e).toEqual("74657374")}),it("should convert string to hex with odd length",()=>{const e=t.stringToHex("test1");expect(e).toEqual("7465737431")})})});
2
2
  //# sourceMappingURL=HexStringUtils.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/shared/utils/HexStringUtils.test.ts"],
4
- "sourcesContent": ["import { HexStringUtils } from \"@/shared/utils/HexStringUtils\";\n\ndescribe(\"HexStringUtils\", () => {\n describe(\"appendSignatureToPayload\", () => {\n it(\"should append signature to payload\", () => {\n // GIVEN\n const payload = \"01020304\";\n const signature = \"05060708\";\n const tag = \"15\";\n // WHEN\n const result = HexStringUtils.appendSignatureToPayload(\n payload,\n signature,\n tag,\n );\n // THEN\n expect(result).toEqual(\"01020304150405060708\");\n });\n\n it(\"should append signature to payload with odd length\", () => {\n // GIVEN\n const payload = \"01020304\";\n const signature = \"5060708\";\n const tag = \"15\";\n // WHEN\n const result = HexStringUtils.appendSignatureToPayload(\n payload,\n signature,\n tag,\n );\n // THEN\n expect(result).toEqual(\"01020304150405060708\");\n });\n });\n\n describe(\"stringToHex\", () => {\n it(\"should convert string to hex\", () => {\n // GIVEN\n const str = \"test\";\n // WHEN\n const result = HexStringUtils.stringToHex(str);\n // THEN\n expect(result).toEqual(\"74657374\");\n });\n\n it(\"should convert string to hex with odd length\", () => {\n // GIVEN\n const str = \"test1\";\n // WHEN\n const result = HexStringUtils.stringToHex(str);\n // THEN\n expect(result).toEqual(\"7465737431\");\n });\n });\n});\n"],
5
- "mappings": "AAAA,OAAS,kBAAAA,MAAsB,gCAE/B,SAAS,iBAAkB,IAAM,CAC/B,SAAS,2BAA4B,IAAM,CACzC,GAAG,qCAAsC,IAAM,CAM7C,MAAMC,EAASD,EAAe,yBAJd,WACE,WACN,IAMZ,EAEA,OAAOC,CAAM,EAAE,QAAQ,sBAAsB,CAC/C,CAAC,EAED,GAAG,qDAAsD,IAAM,CAM7D,MAAMA,EAASD,EAAe,yBAJd,WACE,UACN,IAMZ,EAEA,OAAOC,CAAM,EAAE,QAAQ,sBAAsB,CAC/C,CAAC,CACH,CAAC,EAED,SAAS,cAAe,IAAM,CAC5B,GAAG,+BAAgC,IAAM,CAIvC,MAAMA,EAASD,EAAe,YAFlB,MAEiC,EAE7C,OAAOC,CAAM,EAAE,QAAQ,UAAU,CACnC,CAAC,EAED,GAAG,+CAAgD,IAAM,CAIvD,MAAMA,EAASD,EAAe,YAFlB,OAEiC,EAE7C,OAAOC,CAAM,EAAE,QAAQ,YAAY,CACrC,CAAC,CACH,CAAC,CACH,CAAC",
4
+ "sourcesContent": ["import { HexStringUtils } from \"@/shared/utils/HexStringUtils\";\n\ndescribe(\"HexStringUtils\", () => {\n describe(\"appendSignatureToPayload\", () => {\n it(\"should append signature to payload\", () => {\n // GIVEN\n const payload = \"01020304\";\n const signature = \"05060708\";\n const tag = \"15\";\n // WHEN\n const result = HexStringUtils.appendSignatureToPayload(\n payload,\n signature,\n tag,\n );\n // THEN\n expect(result).toEqual(\"01020304150405060708\");\n });\n\n it(\"should append signature to payload with odd length\", () => {\n // GIVEN\n const payload = \"01020304\";\n const signature = \"5060708\";\n const tag = \"15\";\n // WHEN\n const result = HexStringUtils.appendSignatureToPayload(\n payload,\n signature,\n tag,\n );\n // THEN\n expect(result).toEqual(\"01020304150405060708\");\n });\n });\n\n describe(\"hexToBytes\", () => {\n it(\"decodes a plain hex string into Uint8Array\", () => {\n expect(HexStringUtils.hexToBytes(\"deadbeef\")).toEqual(\n new Uint8Array([0xde, 0xad, 0xbe, 0xef]),\n );\n });\n\n it(\"strips a 0x prefix\", () => {\n expect(HexStringUtils.hexToBytes(\"0xCAFEBABE\")).toEqual(\n new Uint8Array([0xca, 0xfe, 0xba, 0xbe]),\n );\n });\n\n it(\"throws on the empty string\", () => {\n expect(() => HexStringUtils.hexToBytes(\"\")).toThrow(/empty hex string/);\n });\n\n it(\"throws on a bare `0x` prefix with no payload\", () => {\n expect(() => HexStringUtils.hexToBytes(\"0x\")).toThrow(/empty hex string/);\n });\n\n it(\"throws on odd-length input\", () => {\n expect(() => HexStringUtils.hexToBytes(\"abc\")).toThrow(/odd-length/);\n });\n\n it(\"throws on non-hex characters\", () => {\n expect(() => HexStringUtils.hexToBytes(\"zzzz\")).toThrow(/non-hex/);\n });\n });\n\n describe(\"stringToHex\", () => {\n it(\"should convert string to hex\", () => {\n // GIVEN\n const str = \"test\";\n // WHEN\n const result = HexStringUtils.stringToHex(str);\n // THEN\n expect(result).toEqual(\"74657374\");\n });\n\n it(\"should convert string to hex with odd length\", () => {\n // GIVEN\n const str = \"test1\";\n // WHEN\n const result = HexStringUtils.stringToHex(str);\n // THEN\n expect(result).toEqual(\"7465737431\");\n });\n });\n});\n"],
5
+ "mappings": "AAAA,OAAS,kBAAAA,MAAsB,gCAE/B,SAAS,iBAAkB,IAAM,CAC/B,SAAS,2BAA4B,IAAM,CACzC,GAAG,qCAAsC,IAAM,CAM7C,MAAMC,EAASD,EAAe,yBAJd,WACE,WACN,IAMZ,EAEA,OAAOC,CAAM,EAAE,QAAQ,sBAAsB,CAC/C,CAAC,EAED,GAAG,qDAAsD,IAAM,CAM7D,MAAMA,EAASD,EAAe,yBAJd,WACE,UACN,IAMZ,EAEA,OAAOC,CAAM,EAAE,QAAQ,sBAAsB,CAC/C,CAAC,CACH,CAAC,EAED,SAAS,aAAc,IAAM,CAC3B,GAAG,6CAA8C,IAAM,CACrD,OAAOD,EAAe,WAAW,UAAU,CAAC,EAAE,QAC5C,IAAI,WAAW,CAAC,IAAM,IAAM,IAAM,GAAI,CAAC,CACzC,CACF,CAAC,EAED,GAAG,qBAAsB,IAAM,CAC7B,OAAOA,EAAe,WAAW,YAAY,CAAC,EAAE,QAC9C,IAAI,WAAW,CAAC,IAAM,IAAM,IAAM,GAAI,CAAC,CACzC,CACF,CAAC,EAED,GAAG,6BAA8B,IAAM,CACrC,OAAO,IAAMA,EAAe,WAAW,EAAE,CAAC,EAAE,QAAQ,kBAAkB,CACxE,CAAC,EAED,GAAG,+CAAgD,IAAM,CACvD,OAAO,IAAMA,EAAe,WAAW,IAAI,CAAC,EAAE,QAAQ,kBAAkB,CAC1E,CAAC,EAED,GAAG,6BAA8B,IAAM,CACrC,OAAO,IAAMA,EAAe,WAAW,KAAK,CAAC,EAAE,QAAQ,YAAY,CACrE,CAAC,EAED,GAAG,+BAAgC,IAAM,CACvC,OAAO,IAAMA,EAAe,WAAW,MAAM,CAAC,EAAE,QAAQ,SAAS,CACnE,CAAC,CACH,CAAC,EAED,SAAS,cAAe,IAAM,CAC5B,GAAG,+BAAgC,IAAM,CAIvC,MAAMC,EAASD,EAAe,YAFlB,MAEiC,EAE7C,OAAOC,CAAM,EAAE,QAAQ,UAAU,CACnC,CAAC,EAED,GAAG,+CAAgD,IAAM,CAIvD,MAAMA,EAASD,EAAe,YAFlB,OAEiC,EAE7C,OAAOC,CAAM,EAAE,QAAQ,YAAY,CACrC,CAAC,CACH,CAAC,CACH,CAAC",
6
6
  "names": ["HexStringUtils", "result"]
7
7
  }
@@ -0,0 +1,2 @@
1
+ import r from"bs58";class d{static encode(e){return r.encode(e)}static decode(e){return r.decode(e)}}export{d as DefaultBs58Encoder};
2
+ //# sourceMappingURL=bs58Encoder.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/shared/utils/bs58Encoder.ts"],
4
+ "sourcesContent": ["import bs58 from \"bs58\";\n\nexport interface Bs58Encoder {\n encode(data: Uint8Array): string;\n decode(encoded: string): Uint8Array;\n}\n\nexport class DefaultBs58Encoder {\n static encode(data: Uint8Array): string {\n return bs58.encode(data);\n }\n static decode(encoded: string): Uint8Array {\n return bs58.decode(encoded);\n }\n}\n"],
5
+ "mappings": "AAAA,OAAOA,MAAU,OAOV,MAAMC,CAAmB,CAC9B,OAAO,OAAOC,EAA0B,CACtC,OAAOF,EAAK,OAAOE,CAAI,CACzB,CACA,OAAO,OAAOC,EAA6B,CACzC,OAAOH,EAAK,OAAOG,CAAO,CAC5B,CACF",
6
+ "names": ["bs58", "DefaultBs58Encoder", "data", "encoded"]
7
+ }
@@ -0,0 +1,2 @@
1
+ function f(o,c){const t=new Map;return(i,r)=>{const a=`${i}::${r}`;let e=t.get(a);return e||(e=o.loadCertificate({keyId:i,keyUsage:r,targetDevice:c}),t.set(a,e)),e}}export{f as makeCertificateCache};
2
+ //# sourceMappingURL=certificateCache.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/shared/utils/certificateCache.ts"],
4
+ "sourcesContent": ["import { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\n\ntype LoadCertificate = PkiCertificateLoader[\"loadCertificate\"];\ntype LoadCertificateResult = ReturnType<LoadCertificate>;\ntype CertificateLookup = (\n keyId: string,\n keyUsage: string,\n) => LoadCertificateResult;\n\n/**\n * Builds a per-batch certificate-loader memoiser. Returns a `(keyId,\n * keyUsage) => Promise<Certificate | undefined>` function that issues\n * `loadCertificate` once per distinct `(keyId, keyUsage)` pair and\n * returns the cached promise for every subsequent caller in the same\n * batch.\n *\n * Use when a single `load()` call fans out N requests whose backend\n * responses report `(keyId, keyUsage)` independently but, in the common\n * case, all reference the same PKI root \u2014 issuing N parallel duplicate\n * cert loads would waste cycles and bandwidth.\n *\n * The returned cache is intentionally short-lived: scope it to one\n * loader invocation, then drop it. Cross-invocation caching is a\n * different concern handled (or not) elsewhere.\n */\nexport function makeCertificateCache(\n certificateLoader: PkiCertificateLoader,\n targetDevice: string,\n): CertificateLookup {\n const cache = new Map<string, LoadCertificateResult>();\n return (keyId, keyUsage) => {\n const key = `${keyId}::${keyUsage}`;\n let promise = cache.get(key);\n if (!promise) {\n promise = certificateLoader.loadCertificate({\n keyId,\n keyUsage,\n targetDevice,\n });\n cache.set(key, promise);\n }\n return promise;\n };\n}\n"],
5
+ "mappings": "AAyBO,SAASA,EACdC,EACAC,EACmB,CACnB,MAAMC,EAAQ,IAAI,IAClB,MAAO,CAACC,EAAOC,IAAa,CAC1B,MAAMC,EAAM,GAAGF,CAAK,KAAKC,CAAQ,GACjC,IAAIE,EAAUJ,EAAM,IAAIG,CAAG,EAC3B,OAAKC,IACHA,EAAUN,EAAkB,gBAAgB,CAC1C,MAAAG,EACA,SAAAC,EACA,aAAAH,CACF,CAAC,EACDC,EAAM,IAAIG,EAAKC,CAAO,GAEjBA,CACT,CACF",
6
+ "names": ["makeCertificateCache", "certificateLoader", "targetDevice", "cache", "keyId", "keyUsage", "key", "promise"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{beforeEach as n,describe as s,expect as t,it as i,vi as m}from"vitest";import{makeCertificateCache as o}from"./certificateCache";s("makeCertificateCache",()=>{let a;n(()=>{a={loadCertificate:m.fn().mockResolvedValue({keyUsageNumber:8,payload:new Uint8Array([1])})}}),i("calls loadCertificate once for repeated (keyId, keyUsage)",async()=>{const e=o(a,"nanoX");await Promise.all([e("k1","coin_meta"),e("k1","coin_meta"),e("k1","coin_meta")]),t(a.loadCertificate).toHaveBeenCalledTimes(1),t(a.loadCertificate).toHaveBeenCalledWith({keyId:"k1",keyUsage:"coin_meta",targetDevice:"nanoX"})}),i("issues distinct calls per distinct (keyId, keyUsage)",async()=>{const e=o(a,"nanoX");await Promise.all([e("k1","coin_meta"),e("k2","coin_meta"),e("k1","trusted_name")]),t(a.loadCertificate).toHaveBeenCalledTimes(3)}),i("returns the same promise instance for the same key",()=>{const e=o(a,"nanoX"),c=e("k1","coin_meta"),r=e("k1","coin_meta");t(c).toBe(r)})});
2
+ //# sourceMappingURL=certificateCache.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/shared/utils/certificateCache.test.ts"],
4
+ "sourcesContent": ["import { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\n\nimport { makeCertificateCache } from \"./certificateCache\";\n\ndescribe(\"makeCertificateCache\", () => {\n let loader: PkiCertificateLoader;\n\n beforeEach(() => {\n loader = {\n loadCertificate: vi\n .fn()\n .mockResolvedValue({ keyUsageNumber: 8, payload: new Uint8Array([1]) }),\n };\n });\n\n it(\"calls loadCertificate once for repeated (keyId, keyUsage)\", async () => {\n const getCert = makeCertificateCache(loader, \"nanoX\");\n\n await Promise.all([\n getCert(\"k1\", \"coin_meta\"),\n getCert(\"k1\", \"coin_meta\"),\n getCert(\"k1\", \"coin_meta\"),\n ]);\n\n expect(loader.loadCertificate).toHaveBeenCalledTimes(1);\n expect(loader.loadCertificate).toHaveBeenCalledWith({\n keyId: \"k1\",\n keyUsage: \"coin_meta\",\n targetDevice: \"nanoX\",\n });\n });\n\n it(\"issues distinct calls per distinct (keyId, keyUsage)\", async () => {\n const getCert = makeCertificateCache(loader, \"nanoX\");\n\n await Promise.all([\n getCert(\"k1\", \"coin_meta\"),\n getCert(\"k2\", \"coin_meta\"),\n getCert(\"k1\", \"trusted_name\"),\n ]);\n\n expect(loader.loadCertificate).toHaveBeenCalledTimes(3);\n });\n\n it(\"returns the same promise instance for the same key\", () => {\n const getCert = makeCertificateCache(loader, \"nanoX\");\n const a = getCert(\"k1\", \"coin_meta\");\n const b = getCert(\"k1\", \"coin_meta\");\n expect(a).toBe(b);\n });\n});\n"],
5
+ "mappings": "AAAA,OAAS,cAAAA,EAAY,YAAAC,EAAU,UAAAC,EAAQ,MAAAC,EAAI,MAAAC,MAAU,SAIrD,OAAS,wBAAAC,MAA4B,qBAErCJ,EAAS,uBAAwB,IAAM,CACrC,IAAIK,EAEJN,EAAW,IAAM,CACfM,EAAS,CACP,gBAAiBF,EACd,GAAG,EACH,kBAAkB,CAAE,eAAgB,EAAG,QAAS,IAAI,WAAW,CAAC,CAAC,CAAC,CAAE,CAAC,CAC1E,CACF,CAAC,EAEDD,EAAG,4DAA6D,SAAY,CAC1E,MAAMI,EAAUF,EAAqBC,EAAQ,OAAO,EAEpD,MAAM,QAAQ,IAAI,CAChBC,EAAQ,KAAM,WAAW,EACzBA,EAAQ,KAAM,WAAW,EACzBA,EAAQ,KAAM,WAAW,CAC3B,CAAC,EAEDL,EAAOI,EAAO,eAAe,EAAE,sBAAsB,CAAC,EACtDJ,EAAOI,EAAO,eAAe,EAAE,qBAAqB,CAClD,MAAO,KACP,SAAU,YACV,aAAc,OAChB,CAAC,CACH,CAAC,EAEDH,EAAG,uDAAwD,SAAY,CACrE,MAAMI,EAAUF,EAAqBC,EAAQ,OAAO,EAEpD,MAAM,QAAQ,IAAI,CAChBC,EAAQ,KAAM,WAAW,EACzBA,EAAQ,KAAM,WAAW,EACzBA,EAAQ,KAAM,cAAc,CAC9B,CAAC,EAEDL,EAAOI,EAAO,eAAe,EAAE,sBAAsB,CAAC,CACxD,CAAC,EAEDH,EAAG,qDAAsD,IAAM,CAC7D,MAAMI,EAAUF,EAAqBC,EAAQ,OAAO,EAC9CE,EAAID,EAAQ,KAAM,WAAW,EAC7BE,EAAIF,EAAQ,KAAM,WAAW,EACnCL,EAAOM,CAAC,EAAE,KAAKC,CAAC,CAClB,CAAC,CACH,CAAC",
6
+ "names": ["beforeEach", "describe", "expect", "it", "vi", "makeCertificateCache", "loader", "getCert", "a", "b"]
7
+ }
@@ -0,0 +1,2 @@
1
+ function r(t,i){return t.loadCertificate(i).then(e=>({ok:!0,value:e}),e=>({ok:!1,error:e instanceof Error?e:new Error(typeof e=="string"?e:JSON.stringify(e))}))}export{r as loadCertificateResult};
2
+ //# sourceMappingURL=certificateResult.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/shared/utils/certificateResult.ts"],
4
+ "sourcesContent": ["import { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport { type PkiCertificate } from \"@/modules/multichain/pki/model/PkiCertificate\";\nimport { type PkiCertificateInfo } from \"@/modules/multichain/pki/model/PkiCertificateInfo\";\n\n/**\n * Tagged result of a certificate load attempt. Mirrors the\n * `Promise.allSettled`-style pattern but stays inside a single Promise\n * so callers can `Promise.all([certPromise, dataPromise])` to\n * parallelise cert + data fetches without one path's rejection tanking\n * the other.\n */\nexport type CertificateResult =\n | { ok: true; value: PkiCertificate | undefined }\n | { ok: false; error: Error };\n\n/**\n * Wrap a `loadCertificate` call into a non-rejecting promise so it can\n * be awaited alongside a parallel data fetch via `Promise.all`. A\n * thrown error is normalised into a tagged `{ ok: false }` Result;\n * caller decides how to surface it (typically: one ERROR\n * ClearSignContext per request in the batch).\n */\nexport function loadCertificateResult(\n certificateLoader: PkiCertificateLoader,\n params: PkiCertificateInfo,\n): Promise<CertificateResult> {\n return certificateLoader.loadCertificate(params).then(\n (value): CertificateResult => ({ ok: true, value }),\n (error: unknown): CertificateResult => ({\n ok: false,\n error:\n error instanceof Error\n ? error\n : new Error(\n typeof error === \"string\" ? error : JSON.stringify(error),\n ),\n }),\n );\n}\n"],
5
+ "mappings": "AAsBO,SAASA,EACdC,EACAC,EAC4B,CAC5B,OAAOD,EAAkB,gBAAgBC,CAAM,EAAE,KAC9CC,IAA8B,CAAE,GAAI,GAAM,MAAAA,CAAM,GAChDC,IAAuC,CACtC,GAAI,GACJ,MACEA,aAAiB,MACbA,EACA,IAAI,MACF,OAAOA,GAAU,SAAWA,EAAQ,KAAK,UAAUA,CAAK,CAC1D,CACR,EACF,CACF",
6
+ "names": ["loadCertificateResult", "certificateLoader", "params", "value", "error"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{beforeEach as s,describe as c,expect as t,it as a,vi as o}from"vitest";import{loadCertificateResult as n}from"./certificateResult";c("loadCertificateResult",()=>{let r;s(()=>{r={loadCertificate:o.fn()}}),a("returns { ok: true, value } on success",async()=>{const e={keyUsageNumber:8,payload:new Uint8Array([1])};o.spyOn(r,"loadCertificate").mockResolvedValue(e);const i=await n(r,{keyId:"k",keyUsage:"u",targetDevice:"nanoX"});t(i).toEqual({ok:!0,value:e})}),a("returns { ok: true, value: undefined } when loader resolves undefined",async()=>{o.spyOn(r,"loadCertificate").mockResolvedValue(void 0);const e=await n(r,{keyId:"k",keyUsage:"u",targetDevice:"nanoX"});t(e).toEqual({ok:!0,value:void 0})}),a("returns { ok: false, error } on rejection (no rethrow)",async()=>{o.spyOn(r,"loadCertificate").mockRejectedValue(new Error("pki-down"));const e=await n(r,{keyId:"k",keyUsage:"u",targetDevice:"nanoX"});t(e).toEqual({ok:!1,error:new Error("pki-down")})}),a("wraps non-Error throws in Error",async()=>{o.spyOn(r,"loadCertificate").mockRejectedValue("string-rejection");const e=await n(r,{keyId:"k",keyUsage:"u",targetDevice:"nanoX"});t(e.ok).toBe(!1),e.ok||(t(e.error).toBeInstanceOf(Error),t(e.error.message).toBe("string-rejection"))})});
2
+ //# sourceMappingURL=certificateResult.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/shared/utils/certificateResult.test.ts"],
4
+ "sourcesContent": ["import { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\n\nimport { loadCertificateResult } from \"./certificateResult\";\n\ndescribe(\"loadCertificateResult\", () => {\n let loader: PkiCertificateLoader;\n\n beforeEach(() => {\n loader = {\n loadCertificate: vi.fn(),\n };\n });\n\n it(\"returns { ok: true, value } on success\", async () => {\n const cert = { keyUsageNumber: 8, payload: new Uint8Array([1]) };\n vi.spyOn(loader, \"loadCertificate\").mockResolvedValue(cert);\n\n const result = await loadCertificateResult(loader, {\n keyId: \"k\",\n keyUsage: \"u\",\n targetDevice: \"nanoX\",\n });\n\n expect(result).toEqual({ ok: true, value: cert });\n });\n\n it(\"returns { ok: true, value: undefined } when loader resolves undefined\", async () => {\n vi.spyOn(loader, \"loadCertificate\").mockResolvedValue(undefined);\n\n const result = await loadCertificateResult(loader, {\n keyId: \"k\",\n keyUsage: \"u\",\n targetDevice: \"nanoX\",\n });\n\n expect(result).toEqual({ ok: true, value: undefined });\n });\n\n it(\"returns { ok: false, error } on rejection (no rethrow)\", async () => {\n vi.spyOn(loader, \"loadCertificate\").mockRejectedValue(\n new Error(\"pki-down\"),\n );\n\n const result = await loadCertificateResult(loader, {\n keyId: \"k\",\n keyUsage: \"u\",\n targetDevice: \"nanoX\",\n });\n\n expect(result).toEqual({ ok: false, error: new Error(\"pki-down\") });\n });\n\n it(\"wraps non-Error throws in Error\", async () => {\n vi.spyOn(loader, \"loadCertificate\").mockRejectedValue(\"string-rejection\");\n\n const result = await loadCertificateResult(loader, {\n keyId: \"k\",\n keyUsage: \"u\",\n targetDevice: \"nanoX\",\n });\n\n expect(result.ok).toBe(false);\n if (!result.ok) {\n expect(result.error).toBeInstanceOf(Error);\n expect(result.error.message).toBe(\"string-rejection\");\n }\n });\n});\n"],
5
+ "mappings": "AAAA,OAAS,cAAAA,EAAY,YAAAC,EAAU,UAAAC,EAAQ,MAAAC,EAAI,MAAAC,MAAU,SAIrD,OAAS,yBAAAC,MAA6B,sBAEtCJ,EAAS,wBAAyB,IAAM,CACtC,IAAIK,EAEJN,EAAW,IAAM,CACfM,EAAS,CACP,gBAAiBF,EAAG,GAAG,CACzB,CACF,CAAC,EAEDD,EAAG,yCAA0C,SAAY,CACvD,MAAMI,EAAO,CAAE,eAAgB,EAAG,QAAS,IAAI,WAAW,CAAC,CAAC,CAAC,CAAE,EAC/DH,EAAG,MAAME,EAAQ,iBAAiB,EAAE,kBAAkBC,CAAI,EAE1D,MAAMC,EAAS,MAAMH,EAAsBC,EAAQ,CACjD,MAAO,IACP,SAAU,IACV,aAAc,OAChB,CAAC,EAEDJ,EAAOM,CAAM,EAAE,QAAQ,CAAE,GAAI,GAAM,MAAOD,CAAK,CAAC,CAClD,CAAC,EAEDJ,EAAG,wEAAyE,SAAY,CACtFC,EAAG,MAAME,EAAQ,iBAAiB,EAAE,kBAAkB,MAAS,EAE/D,MAAME,EAAS,MAAMH,EAAsBC,EAAQ,CACjD,MAAO,IACP,SAAU,IACV,aAAc,OAChB,CAAC,EAEDJ,EAAOM,CAAM,EAAE,QAAQ,CAAE,GAAI,GAAM,MAAO,MAAU,CAAC,CACvD,CAAC,EAEDL,EAAG,yDAA0D,SAAY,CACvEC,EAAG,MAAME,EAAQ,iBAAiB,EAAE,kBAClC,IAAI,MAAM,UAAU,CACtB,EAEA,MAAME,EAAS,MAAMH,EAAsBC,EAAQ,CACjD,MAAO,IACP,SAAU,IACV,aAAc,OAChB,CAAC,EAEDJ,EAAOM,CAAM,EAAE,QAAQ,CAAE,GAAI,GAAO,MAAO,IAAI,MAAM,UAAU,CAAE,CAAC,CACpE,CAAC,EAEDL,EAAG,kCAAmC,SAAY,CAChDC,EAAG,MAAME,EAAQ,iBAAiB,EAAE,kBAAkB,kBAAkB,EAExE,MAAME,EAAS,MAAMH,EAAsBC,EAAQ,CACjD,MAAO,IACP,SAAU,IACV,aAAc,OAChB,CAAC,EAEDJ,EAAOM,EAAO,EAAE,EAAE,KAAK,EAAK,EACvBA,EAAO,KACVN,EAAOM,EAAO,KAAK,EAAE,eAAe,KAAK,EACzCN,EAAOM,EAAO,MAAM,OAAO,EAAE,KAAK,kBAAkB,EAExD,CAAC,CACH,CAAC",
6
+ "names": ["beforeEach", "describe", "expect", "it", "vi", "loadCertificateResult", "loader", "cert", "result"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{ClearSignContextType as s}from"../../shared/model/ClearSignContext";import{makeCertificateCache as p}from"../../shared/utils/certificateCache";async function P({requests:c,deviceModelId:l,certificateLoader:u,logger:a,label:r,fetch:f,toContext:g,describe:n}){a.debug(`[load] Fetching ${r} descriptors`,{data:{count:c.length}});const C=await Promise.all(c.map(async e=>({request:e,either:await f(e)}))),m=p(u,l);return Promise.all(C.map(({request:e,either:R})=>R.caseOf({Left:async t=>(a.warn(`[load] ${r} fetch failed`,{data:{...n(e),error:t.message}}),{type:s.ERROR,error:t}),Right:async t=>{let o;try{o=await m(t.keyId,t.keyUsage)}catch(i){const d=i instanceof Error?i:new Error(String(i));return a.warn(`[load] ${r} certificate load failed`,{data:{...n(e),error:d.message}}),{type:s.ERROR,error:d}}if(!o){const i=new Error(`[ContextModule] ${r}: certificate is missing`);return a.warn(`[load] ${r} certificate missing`,{data:n(e)}),{type:s.ERROR,error:i}}return g(t,o)}})))}export{P as loadChallengeBoundContexts};
2
+ //# sourceMappingURL=challengeBoundLoader.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/shared/utils/challengeBoundLoader.ts"],
4
+ "sourcesContent": ["import { type LoggerPublisherService } from \"@ledgerhq/device-management-kit\";\nimport { type Either } from \"purify-ts\";\n\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport { type PkiCertificate } from \"@/modules/multichain/pki/model/PkiCertificate\";\nimport {\n type ClearSignContext,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\nimport { makeCertificateCache } from \"@/shared/utils/certificateCache\";\n\n/**\n * Shape every challenge-bound dynamic-descriptor result shares: the PKI\n * identifiers the host needs to load the matching certificate. The three\n * Solana challenge-bound loaders (token-account-state, alt-resolution,\n * trusted-name) each fetch a per-request descriptor whose backend response\n * reports its own `(keyId, keyUsage)`.\n */\nexport type ChallengeBoundResult = {\n keyId: string;\n keyUsage: string;\n};\n\nexport type ChallengeBoundLoaderParams<\n TRequest,\n TResult extends ChallengeBoundResult,\n> = {\n requests: TRequest[];\n deviceModelId: string;\n certificateLoader: PkiCertificateLoader;\n logger: LoggerPublisherService;\n /** Short UPPER_SNAKE label used in log messages, e.g. `\"TRUSTED_NAME\"`. */\n label: string;\n /** Issue the per-request backend fetch. */\n fetch: (request: TRequest) => Promise<Either<Error, TResult>>;\n /** Build the success context from a validated result + its certificate. */\n toContext: (result: TResult, certificate: PkiCertificate) => ClearSignContext;\n /** Structured fields attached to per-request log lines. */\n describe: (request: TRequest) => Record<string, unknown>;\n};\n\n/**\n * Orchestrates the shared lifecycle of the Solana challenge-bound loaders:\n * fan out the per-request fetches in parallel, dedup certificate loads per\n * batch via {@link makeCertificateCache}, and map each request to exactly\n * one {@link ClearSignContext}.\n *\n * A fetch failure, a certificate-load throw, or an absent (resolved-\n * `undefined`) certificate each degrade that single request to an ERROR\n * context \u2014 never the whole batch, and never a success context shipped\n * without a certificate.\n */\nexport async function loadChallengeBoundContexts<\n TRequest,\n TResult extends ChallengeBoundResult,\n>({\n requests,\n deviceModelId,\n certificateLoader,\n logger,\n label,\n fetch,\n toContext,\n describe,\n}: ChallengeBoundLoaderParams<TRequest, TResult>): Promise<ClearSignContext[]> {\n logger.debug(`[load] Fetching ${label} descriptors`, {\n data: { count: requests.length },\n });\n\n const fetched = await Promise.all(\n requests.map(async (request) => ({\n request,\n either: await fetch(request),\n })),\n );\n\n const getCert = makeCertificateCache(certificateLoader, deviceModelId);\n\n return Promise.all(\n fetched.map(({ request, either }) =>\n either.caseOf<Promise<ClearSignContext>>({\n Left: async (error) => {\n logger.warn(`[load] ${label} fetch failed`, {\n data: { ...describe(request), error: error.message },\n });\n return { type: ClearSignContextType.ERROR, error };\n },\n Right: async (value) => {\n let certificate: PkiCertificate | undefined;\n try {\n certificate = await getCert(value.keyId, value.keyUsage);\n } catch (caught) {\n const error =\n caught instanceof Error ? caught : new Error(String(caught));\n logger.warn(`[load] ${label} certificate load failed`, {\n data: { ...describe(request), error: error.message },\n });\n return { type: ClearSignContextType.ERROR, error };\n }\n if (!certificate) {\n const error = new Error(\n `[ContextModule] ${label}: certificate is missing`,\n );\n logger.warn(`[load] ${label} certificate missing`, {\n data: describe(request),\n });\n return { type: ClearSignContextType.ERROR, error };\n }\n return toContext(value, certificate);\n },\n }),\n ),\n );\n}\n"],
5
+ "mappings": "AAKA,OAEE,wBAAAA,MACK,kCACP,OAAS,wBAAAC,MAA4B,kCA2CrC,eAAsBC,EAGpB,CACA,SAAAC,EACA,cAAAC,EACA,kBAAAC,EACA,OAAAC,EACA,MAAAC,EACA,MAAAC,EACA,UAAAC,EACA,SAAAC,CACF,EAA+E,CAC7EJ,EAAO,MAAM,mBAAmBC,CAAK,eAAgB,CACnD,KAAM,CAAE,MAAOJ,EAAS,MAAO,CACjC,CAAC,EAED,MAAMQ,EAAU,MAAM,QAAQ,IAC5BR,EAAS,IAAI,MAAOS,IAAa,CAC/B,QAAAA,EACA,OAAQ,MAAMJ,EAAMI,CAAO,CAC7B,EAAE,CACJ,EAEMC,EAAUZ,EAAqBI,EAAmBD,CAAa,EAErE,OAAO,QAAQ,IACbO,EAAQ,IAAI,CAAC,CAAE,QAAAC,EAAS,OAAAE,CAAO,IAC7BA,EAAO,OAAkC,CACvC,KAAM,MAAOC,IACXT,EAAO,KAAK,UAAUC,CAAK,gBAAiB,CAC1C,KAAM,CAAE,GAAGG,EAASE,CAAO,EAAG,MAAOG,EAAM,OAAQ,CACrD,CAAC,EACM,CAAE,KAAMf,EAAqB,MAAO,MAAAe,CAAM,GAEnD,MAAO,MAAOC,GAAU,CACtB,IAAIC,EACJ,GAAI,CACFA,EAAc,MAAMJ,EAAQG,EAAM,MAAOA,EAAM,QAAQ,CACzD,OAASE,EAAQ,CACf,MAAMH,EACJG,aAAkB,MAAQA,EAAS,IAAI,MAAM,OAAOA,CAAM,CAAC,EAC7D,OAAAZ,EAAO,KAAK,UAAUC,CAAK,2BAA4B,CACrD,KAAM,CAAE,GAAGG,EAASE,CAAO,EAAG,MAAOG,EAAM,OAAQ,CACrD,CAAC,EACM,CAAE,KAAMf,EAAqB,MAAO,MAAAe,CAAM,CACnD,CACA,GAAI,CAACE,EAAa,CAChB,MAAMF,EAAQ,IAAI,MAChB,mBAAmBR,CAAK,0BAC1B,EACA,OAAAD,EAAO,KAAK,UAAUC,CAAK,uBAAwB,CACjD,KAAMG,EAASE,CAAO,CACxB,CAAC,EACM,CAAE,KAAMZ,EAAqB,MAAO,MAAAe,CAAM,CACnD,CACA,OAAON,EAAUO,EAAOC,CAAW,CACrC,CACF,CAAC,CACH,CACF,CACF",
6
+ "names": ["ClearSignContextType", "makeCertificateCache", "loadChallengeBoundContexts", "requests", "deviceModelId", "certificateLoader", "logger", "label", "fetch", "toContext", "describe", "fetched", "request", "getCert", "either", "error", "value", "certificate", "caught"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{Left as g,Right as o}from"purify-ts";import{beforeEach as f,describe as p,expect as r,it as c,vi as i}from"vitest";import{ClearSignContextType as s}from"../../shared/model/ClearSignContext";import{loadChallengeBoundContexts as n}from"./challengeBoundLoader";const k=()=>({debug:i.fn(),info:i.fn(),warn:i.fn(),error:i.fn(),subscribers:[]}),y={keyUsageNumber:1,payload:new Uint8Array([1])},d=(a,e)=>({deviceModelId:"stax",certificateLoader:a,logger:k(),label:"TEST_CTX",fetch:e,toContext:(t,l)=>({type:s.SOLANA_TRUSTED_NAME,payload:t.descriptor,certificate:l}),describe:t=>({id:t.id})});p("loadChallengeBoundContexts",()=>{let a;f(()=>{i.restoreAllMocks(),a={loadCertificate:i.fn().mockResolvedValue(y)}}),c("emits one success context per request with its certificate",async()=>{const e=await n({...d(a,async({id:t})=>o({id:t,descriptor:new Uint8Array([170]),keyId:"k",keyUsage:"u"})),requests:[{id:"a",challenge:"c1"},{id:"b",challenge:"c2"}]});r(e).toHaveLength(2),r(e.every(t=>t.type===s.SOLANA_TRUSTED_NAME)).toBe(!0),r(e[0].certificate).toBe(y)}),c("degrades only the failing request to ERROR and keeps the others",async()=>{const e=await n({...d(a,async({id:t})=>t==="a"?o({id:t,descriptor:new Uint8Array([1]),keyId:"k",keyUsage:"u"}):g(new Error("boom"))),requests:[{id:"a",challenge:"c1"},{id:"b",challenge:"c2"}]});r(e[0]?.type).toBe(s.SOLANA_TRUSTED_NAME),r(e[1]?.type).toBe(s.ERROR)}),c("emits ERROR when the certificate load throws",async()=>{i.spyOn(a,"loadCertificate").mockRejectedValue(new Error("pki-down"));const e=await n({...d(a,async({id:t})=>o({id:t,descriptor:new Uint8Array([1]),keyId:"k",keyUsage:"u"})),requests:[{id:"a",challenge:"c1"}]});r(e[0]?.type).toBe(s.ERROR),r(e[0].error.message).toBe("pki-down")}),c("emits ERROR (not a cert-less success) when the certificate resolves undefined",async()=>{i.spyOn(a,"loadCertificate").mockResolvedValue(void 0);const e=await n({...d(a,async({id:t})=>o({id:t,descriptor:new Uint8Array([1]),keyId:"k",keyUsage:"u"})),requests:[{id:"a",challenge:"c1"}]});r(e[0]?.type).toBe(s.ERROR),r(e[0].error.message).toMatch(/TEST_CTX: certificate is missing/)}),c("dedups certificate loads per (keyId, keyUsage) across the batch",async()=>{const e=await n({...d(a,async({id:t})=>o({id:t,descriptor:new Uint8Array([1]),keyId:"same",keyUsage:"same"})),requests:[{id:"a",challenge:"c1"},{id:"b",challenge:"c2"},{id:"c",challenge:"c3"}]});r(e).toHaveLength(3),r(a.loadCertificate).toHaveBeenCalledTimes(1)})});
2
+ //# sourceMappingURL=challengeBoundLoader.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/shared/utils/challengeBoundLoader.test.ts"],
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Left, Right } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { type PkiCertificateLoader } from \"@/modules/multichain/pki/domain/PkiCertificateLoader\";\nimport { type PkiCertificate } from \"@/modules/multichain/pki/model/PkiCertificate\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\n\nimport { loadChallengeBoundContexts } from \"./challengeBoundLoader\";\n\nconst mockLogger = () => ({\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n});\n\nconst certificate = { keyUsageNumber: 1, payload: new Uint8Array([0x01]) };\n\ntype Req = { id: string; challenge: string };\ntype Res = {\n id: string;\n descriptor: Uint8Array;\n keyId: string;\n keyUsage: string;\n};\n\nconst baseParams = (\n certificateLoader: PkiCertificateLoader,\n fetch: (r: Req) => Promise<any>,\n) => ({\n deviceModelId: \"stax\",\n certificateLoader,\n logger: mockLogger() as any,\n label: \"TEST_CTX\",\n fetch,\n toContext: (value: Res, cert: PkiCertificate) => ({\n type: ClearSignContextType.SOLANA_TRUSTED_NAME as const,\n payload: value.descriptor,\n certificate: cert,\n }),\n describe: (r: Req) => ({ id: r.id }),\n});\n\ndescribe(\"loadChallengeBoundContexts\", () => {\n let certificateLoader: PkiCertificateLoader;\n\n beforeEach(() => {\n vi.restoreAllMocks();\n certificateLoader = {\n loadCertificate: vi.fn().mockResolvedValue(certificate),\n };\n });\n\n it(\"emits one success context per request with its certificate\", async () => {\n const out = await loadChallengeBoundContexts({\n ...baseParams(certificateLoader, async ({ id }) =>\n Right({\n id,\n descriptor: new Uint8Array([0xaa]),\n keyId: \"k\",\n keyUsage: \"u\",\n }),\n ),\n requests: [\n { id: \"a\", challenge: \"c1\" },\n { id: \"b\", challenge: \"c2\" },\n ],\n });\n\n expect(out).toHaveLength(2);\n expect(\n out.every((c) => c.type === ClearSignContextType.SOLANA_TRUSTED_NAME),\n ).toBe(true);\n expect((out[0] as any).certificate).toBe(certificate);\n });\n\n it(\"degrades only the failing request to ERROR and keeps the others\", async () => {\n const out = await loadChallengeBoundContexts({\n ...baseParams(certificateLoader, async ({ id }) =>\n id === \"a\"\n ? Right({\n id,\n descriptor: new Uint8Array([1]),\n keyId: \"k\",\n keyUsage: \"u\",\n })\n : Left(new Error(\"boom\")),\n ),\n requests: [\n { id: \"a\", challenge: \"c1\" },\n { id: \"b\", challenge: \"c2\" },\n ],\n });\n\n expect(out[0]?.type).toBe(ClearSignContextType.SOLANA_TRUSTED_NAME);\n expect(out[1]?.type).toBe(ClearSignContextType.ERROR);\n });\n\n it(\"emits ERROR when the certificate load throws\", async () => {\n vi.spyOn(certificateLoader, \"loadCertificate\").mockRejectedValue(\n new Error(\"pki-down\"),\n );\n\n const out = await loadChallengeBoundContexts({\n ...baseParams(certificateLoader, async ({ id }) =>\n Right({\n id,\n descriptor: new Uint8Array([1]),\n keyId: \"k\",\n keyUsage: \"u\",\n }),\n ),\n requests: [{ id: \"a\", challenge: \"c1\" }],\n });\n\n expect(out[0]?.type).toBe(ClearSignContextType.ERROR);\n expect((out[0] as any).error.message).toBe(\"pki-down\");\n });\n\n it(\"emits ERROR (not a cert-less success) when the certificate resolves undefined\", async () => {\n vi.spyOn(certificateLoader, \"loadCertificate\").mockResolvedValue(undefined);\n\n const out = await loadChallengeBoundContexts({\n ...baseParams(certificateLoader, async ({ id }) =>\n Right({\n id,\n descriptor: new Uint8Array([1]),\n keyId: \"k\",\n keyUsage: \"u\",\n }),\n ),\n requests: [{ id: \"a\", challenge: \"c1\" }],\n });\n\n expect(out[0]?.type).toBe(ClearSignContextType.ERROR);\n expect((out[0] as any).error.message).toMatch(\n /TEST_CTX: certificate is missing/,\n );\n });\n\n it(\"dedups certificate loads per (keyId, keyUsage) across the batch\", async () => {\n const out = await loadChallengeBoundContexts({\n ...baseParams(certificateLoader, async ({ id }) =>\n Right({\n id,\n descriptor: new Uint8Array([1]),\n keyId: \"same\",\n keyUsage: \"same\",\n }),\n ),\n requests: [\n { id: \"a\", challenge: \"c1\" },\n { id: \"b\", challenge: \"c2\" },\n { id: \"c\", challenge: \"c3\" },\n ],\n });\n\n expect(out).toHaveLength(3);\n // Three requests share one PKI key \u2192 exactly one loadCertificate call.\n expect(certificateLoader.loadCertificate).toHaveBeenCalledTimes(1);\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["Left", "Right", "beforeEach", "describe", "expect", "it", "vi", "ClearSignContextType", "loadChallengeBoundContexts", "mockLogger", "certificate", "baseParams", "certificateLoader", "fetch", "value", "cert", "r", "out", "id", "c"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{DeviceModelId as e}from"@ledgerhq/device-management-kit";import{exactly as o,oneOf as d}from"purify-ts";const t=d([o(e.NANO_X),o(e.NANO_SP),o(e.STAX),o(e.FLEX)]);export{t as deviceModelIdCodec};
2
+ //# sourceMappingURL=deviceModelIdCodec.js.map