@ledgerhq/context-module 2.4.1 → 2.6.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 (237) hide show
  1. package/lib/cjs/package.json +2 -2
  2. package/lib/cjs/src/ContextModule.js +1 -1
  3. package/lib/cjs/src/ContextModule.js.map +1 -1
  4. package/lib/cjs/src/ContextModuleBuilder.js +1 -1
  5. package/lib/cjs/src/ContextModuleBuilder.js.map +2 -2
  6. package/lib/cjs/src/DefaultContextModule.js +1 -1
  7. package/lib/cjs/src/DefaultContextModule.js.map +3 -3
  8. package/lib/cjs/src/di.js +1 -1
  9. package/lib/cjs/src/di.js.map +3 -3
  10. package/lib/cjs/src/index.js +1 -1
  11. package/lib/cjs/src/index.js.map +2 -2
  12. package/lib/cjs/src/modules/multichain/reporter/data/BlindSigningReporterDatasource.js.map +1 -1
  13. package/lib/cjs/src/modules/multichain/reporter/data/HttpBlindSigningReporterDatasource.js +1 -1
  14. package/lib/cjs/src/modules/multichain/reporter/data/HttpBlindSigningReporterDatasource.js.map +2 -2
  15. package/lib/cjs/src/modules/multichain/reporter/data/HttpBlindSigningReporterDatasource.test.js +1 -1
  16. package/lib/cjs/src/modules/multichain/reporter/data/HttpBlindSigningReporterDatasource.test.js.map +2 -2
  17. package/lib/cjs/src/modules/multichain/reporter/data/dto/BlindSigningEventDto.js.map +1 -1
  18. package/lib/cjs/src/modules/multichain/reporter/domain/DefaultBlindSigningReporter.test.js +1 -1
  19. package/lib/cjs/src/modules/multichain/reporter/domain/DefaultBlindSigningReporter.test.js.map +2 -2
  20. package/lib/cjs/src/modules/multichain/reporter/model/BlindSigningEvent.js +1 -1
  21. package/lib/cjs/src/modules/multichain/reporter/model/BlindSigningEvent.js.map +2 -2
  22. package/lib/cjs/src/modules/multichain/sign-reporter/data/HttpSignReporterDatasource.js +2 -0
  23. package/lib/cjs/src/modules/multichain/sign-reporter/data/HttpSignReporterDatasource.js.map +7 -0
  24. package/lib/cjs/src/modules/multichain/sign-reporter/data/HttpSignReporterDatasource.test.js +2 -0
  25. package/lib/cjs/src/modules/multichain/sign-reporter/data/HttpSignReporterDatasource.test.js.map +7 -0
  26. package/lib/cjs/src/modules/multichain/sign-reporter/data/SignReporterDatasource.js +2 -0
  27. package/lib/cjs/src/modules/multichain/sign-reporter/data/SignReporterDatasource.js.map +7 -0
  28. package/lib/cjs/src/modules/multichain/sign-reporter/data/dto/SigningEventDto.js +2 -0
  29. package/lib/cjs/src/modules/multichain/sign-reporter/data/dto/SigningEventDto.js.map +7 -0
  30. package/lib/cjs/src/modules/multichain/sign-reporter/di/signReporterModuleFactory.js +2 -0
  31. package/lib/cjs/src/modules/multichain/sign-reporter/di/signReporterModuleFactory.js.map +7 -0
  32. package/lib/cjs/src/modules/multichain/sign-reporter/di/signReporterTypes.js +2 -0
  33. package/lib/cjs/src/modules/multichain/sign-reporter/di/signReporterTypes.js.map +7 -0
  34. package/lib/cjs/src/modules/multichain/sign-reporter/domain/DefaultSignReporter.js +2 -0
  35. package/lib/cjs/src/modules/multichain/sign-reporter/domain/DefaultSignReporter.js.map +7 -0
  36. package/lib/cjs/src/modules/multichain/sign-reporter/domain/DefaultSignReporter.test.js +2 -0
  37. package/lib/cjs/src/modules/multichain/sign-reporter/domain/DefaultSignReporter.test.js.map +7 -0
  38. package/lib/cjs/src/modules/multichain/sign-reporter/domain/SignReporter.js +2 -0
  39. package/lib/cjs/src/modules/multichain/sign-reporter/domain/SignReporter.js.map +7 -0
  40. package/lib/cjs/src/modules/multichain/sign-reporter/model/SignReportParams.js +2 -0
  41. package/lib/cjs/src/modules/multichain/sign-reporter/model/SignReportParams.js.map +7 -0
  42. package/lib/cjs/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.test.js +1 -1
  43. package/lib/cjs/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.test.js.map +2 -2
  44. package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoDto.js +1 -1
  45. package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoDto.js.map +3 -3
  46. package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoMapper.js +1 -1
  47. package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoMapper.js.map +3 -3
  48. package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoMapper.test.js +1 -1
  49. package/lib/cjs/src/modules/solana/instruction-info/data/InstructionInfoMapper.test.js.map +2 -2
  50. package/lib/cjs/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.test.js +1 -1
  51. package/lib/cjs/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.test.js.map +2 -2
  52. package/lib/cjs/src/modules/solana/model/SolanaClearSignContext.js +1 -1
  53. package/lib/cjs/src/modules/solana/model/SolanaClearSignContext.js.map +2 -2
  54. package/lib/cjs/src/modules/solana/model/SolanaPayloads.js +1 -1
  55. package/lib/cjs/src/modules/solana/model/SolanaPayloads.js.map +2 -2
  56. package/lib/cjs/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.js +1 -1
  57. package/lib/cjs/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.js.map +3 -3
  58. package/lib/cjs/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.test.js +1 -1
  59. package/lib/cjs/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.test.js.map +3 -3
  60. package/lib/cjs/src/modules/tron/model/TronTransactionContext.js +2 -0
  61. package/lib/cjs/src/modules/tron/model/TronTransactionContext.js.map +7 -0
  62. package/lib/cjs/src/modules/tron/token/data/HttpTokenDataSource.js +2 -0
  63. package/lib/cjs/src/modules/tron/token/data/HttpTokenDataSource.js.map +7 -0
  64. package/lib/cjs/src/modules/tron/token/data/HttpTokenDataSource.test.js +2 -0
  65. package/lib/cjs/src/modules/tron/token/data/HttpTokenDataSource.test.js.map +7 -0
  66. package/lib/cjs/src/modules/tron/token/data/TokenDataSource.js +2 -0
  67. package/lib/cjs/src/modules/tron/token/data/TokenDataSource.js.map +7 -0
  68. package/lib/cjs/src/modules/tron/token/di/tokenModuleFactory.js +2 -0
  69. package/lib/cjs/src/modules/tron/token/di/tokenModuleFactory.js.map +7 -0
  70. package/lib/cjs/src/modules/tron/token/di/tokenTypes.js +2 -0
  71. package/lib/cjs/src/modules/tron/token/di/tokenTypes.js.map +7 -0
  72. package/lib/cjs/src/modules/tron/token/domain/TokenContextLoader.js +2 -0
  73. package/lib/cjs/src/modules/tron/token/domain/TokenContextLoader.js.map +7 -0
  74. package/lib/cjs/src/modules/tron/token/domain/TokenContextLoader.test.js +2 -0
  75. package/lib/cjs/src/modules/tron/token/domain/TokenContextLoader.test.js.map +7 -0
  76. package/lib/cjs/src/modules/tron/token/domain/parseTrc10AssetId.js +2 -0
  77. package/lib/cjs/src/modules/tron/token/domain/parseTrc10AssetId.js.map +7 -0
  78. package/lib/cjs/src/modules/tron/token/domain/parseTrc10AssetId.test.js +2 -0
  79. package/lib/cjs/src/modules/tron/token/domain/parseTrc10AssetId.test.js.map +7 -0
  80. package/lib/cjs/src/shared/domain/ContextModuleChainID.js +1 -1
  81. package/lib/cjs/src/shared/domain/ContextModuleChainID.js.map +2 -2
  82. package/lib/cjs/src/{modules/multichain/reporter → shared}/model/BlindSigningModelId.js.map +1 -1
  83. package/lib/cjs/src/shared/model/ClearSignContext.js +1 -1
  84. package/lib/cjs/src/shared/model/ClearSignContext.js.map +2 -2
  85. package/lib/esm/package.json +2 -2
  86. package/lib/esm/src/ContextModuleBuilder.js +1 -1
  87. package/lib/esm/src/ContextModuleBuilder.js.map +2 -2
  88. package/lib/esm/src/DefaultContextModule.js +1 -1
  89. package/lib/esm/src/DefaultContextModule.js.map +3 -3
  90. package/lib/esm/src/di.js +1 -1
  91. package/lib/esm/src/di.js.map +3 -3
  92. package/lib/esm/src/index.js +1 -1
  93. package/lib/esm/src/index.js.map +2 -2
  94. package/lib/esm/src/modules/multichain/reporter/data/HttpBlindSigningReporterDatasource.js +1 -1
  95. package/lib/esm/src/modules/multichain/reporter/data/HttpBlindSigningReporterDatasource.js.map +2 -2
  96. package/lib/esm/src/modules/multichain/reporter/data/HttpBlindSigningReporterDatasource.test.js +1 -1
  97. package/lib/esm/src/modules/multichain/reporter/data/HttpBlindSigningReporterDatasource.test.js.map +2 -2
  98. package/lib/esm/src/modules/multichain/reporter/domain/DefaultBlindSigningReporter.test.js +1 -1
  99. package/lib/esm/src/modules/multichain/reporter/domain/DefaultBlindSigningReporter.test.js.map +2 -2
  100. package/lib/esm/src/modules/multichain/reporter/model/BlindSigningEvent.js +1 -1
  101. package/lib/esm/src/modules/multichain/reporter/model/BlindSigningEvent.js.map +2 -2
  102. package/lib/esm/src/modules/multichain/sign-reporter/data/HttpSignReporterDatasource.js +2 -0
  103. package/lib/esm/src/modules/multichain/sign-reporter/data/HttpSignReporterDatasource.js.map +7 -0
  104. package/lib/esm/src/modules/multichain/sign-reporter/data/HttpSignReporterDatasource.test.js +2 -0
  105. package/lib/esm/src/modules/multichain/sign-reporter/data/HttpSignReporterDatasource.test.js.map +7 -0
  106. package/lib/esm/src/modules/multichain/sign-reporter/data/SignReporterDatasource.js +1 -0
  107. package/lib/esm/src/modules/multichain/sign-reporter/data/SignReporterDatasource.js.map +7 -0
  108. package/lib/esm/src/modules/multichain/sign-reporter/data/dto/SigningEventDto.js +1 -0
  109. package/lib/esm/src/modules/multichain/sign-reporter/data/dto/SigningEventDto.js.map +7 -0
  110. package/lib/esm/src/modules/multichain/sign-reporter/di/signReporterModuleFactory.js +2 -0
  111. package/lib/esm/src/modules/multichain/sign-reporter/di/signReporterModuleFactory.js.map +7 -0
  112. package/lib/esm/src/modules/multichain/sign-reporter/di/signReporterTypes.js +2 -0
  113. package/lib/esm/src/modules/multichain/sign-reporter/di/signReporterTypes.js.map +7 -0
  114. package/lib/esm/src/modules/multichain/sign-reporter/domain/DefaultSignReporter.js +2 -0
  115. package/lib/esm/src/modules/multichain/sign-reporter/domain/DefaultSignReporter.js.map +7 -0
  116. package/lib/esm/src/modules/multichain/sign-reporter/domain/DefaultSignReporter.test.js +2 -0
  117. package/lib/esm/src/modules/multichain/sign-reporter/domain/DefaultSignReporter.test.js.map +7 -0
  118. package/lib/esm/src/modules/multichain/sign-reporter/domain/SignReporter.js +1 -0
  119. package/lib/esm/src/modules/multichain/sign-reporter/domain/SignReporter.js.map +7 -0
  120. package/lib/esm/src/modules/multichain/sign-reporter/model/SignReportParams.js +2 -0
  121. package/lib/esm/src/modules/multichain/sign-reporter/model/SignReportParams.js.map +7 -0
  122. package/lib/esm/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.test.js +1 -1
  123. package/lib/esm/src/modules/solana/instruction-info/data/HttpInstructionInfoDataSource.test.js.map +2 -2
  124. package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoDto.js +1 -1
  125. package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoDto.js.map +3 -3
  126. package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoMapper.js +1 -1
  127. package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoMapper.js.map +3 -3
  128. package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoMapper.test.js +1 -1
  129. package/lib/esm/src/modules/solana/instruction-info/data/InstructionInfoMapper.test.js.map +3 -3
  130. package/lib/esm/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.test.js +1 -1
  131. package/lib/esm/src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.test.js.map +2 -2
  132. package/lib/esm/src/modules/solana/model/SolanaClearSignContext.js +1 -1
  133. package/lib/esm/src/modules/solana/model/SolanaClearSignContext.js.map +2 -2
  134. package/lib/esm/src/modules/solana/model/SolanaPayloads.js.map +2 -2
  135. package/lib/esm/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.js +1 -1
  136. package/lib/esm/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.js.map +3 -3
  137. package/lib/esm/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.test.js +1 -1
  138. package/lib/esm/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.test.js.map +3 -3
  139. package/lib/esm/src/modules/tron/model/TronTransactionContext.js +1 -0
  140. package/lib/esm/src/modules/tron/model/TronTransactionContext.js.map +7 -0
  141. package/lib/esm/src/modules/tron/token/data/HttpTokenDataSource.js +2 -0
  142. package/lib/esm/src/modules/tron/token/data/HttpTokenDataSource.js.map +7 -0
  143. package/lib/esm/src/modules/tron/token/data/HttpTokenDataSource.test.js +2 -0
  144. package/lib/esm/src/modules/tron/token/data/HttpTokenDataSource.test.js.map +7 -0
  145. package/lib/esm/src/modules/tron/token/data/TokenDataSource.js +2 -0
  146. package/lib/esm/src/modules/tron/token/data/TokenDataSource.js.map +7 -0
  147. package/lib/esm/src/modules/tron/token/di/tokenModuleFactory.js +2 -0
  148. package/lib/esm/src/modules/tron/token/di/tokenModuleFactory.js.map +7 -0
  149. package/lib/esm/src/modules/tron/token/di/tokenTypes.js +2 -0
  150. package/lib/esm/src/modules/tron/token/di/tokenTypes.js.map +7 -0
  151. package/lib/esm/src/modules/tron/token/domain/TokenContextLoader.js +2 -0
  152. package/lib/esm/src/modules/tron/token/domain/TokenContextLoader.js.map +7 -0
  153. package/lib/esm/src/modules/tron/token/domain/TokenContextLoader.test.js +2 -0
  154. package/lib/esm/src/modules/tron/token/domain/TokenContextLoader.test.js.map +7 -0
  155. package/lib/esm/src/modules/tron/token/domain/parseTrc10AssetId.js +2 -0
  156. package/lib/esm/src/modules/tron/token/domain/parseTrc10AssetId.js.map +7 -0
  157. package/lib/esm/src/modules/tron/token/domain/parseTrc10AssetId.test.js +2 -0
  158. package/lib/esm/src/modules/tron/token/domain/parseTrc10AssetId.test.js.map +7 -0
  159. package/lib/esm/src/shared/domain/ContextModuleChainID.js +1 -1
  160. package/lib/esm/src/shared/domain/ContextModuleChainID.js.map +2 -2
  161. package/lib/esm/src/{modules/multichain/reporter → shared}/model/BlindSigningModelId.js.map +1 -1
  162. package/lib/esm/src/shared/model/ClearSignContext.js +1 -1
  163. package/lib/esm/src/shared/model/ClearSignContext.js.map +2 -2
  164. package/lib/types/src/ContextModule.d.ts +2 -0
  165. package/lib/types/src/ContextModule.d.ts.map +1 -1
  166. package/lib/types/src/DefaultContextModule.d.ts +3 -0
  167. package/lib/types/src/DefaultContextModule.d.ts.map +1 -1
  168. package/lib/types/src/di.d.ts.map +1 -1
  169. package/lib/types/src/index.d.ts +3 -1
  170. package/lib/types/src/index.d.ts.map +1 -1
  171. package/lib/types/src/modules/multichain/reporter/data/BlindSigningReporterDatasource.d.ts +1 -1
  172. package/lib/types/src/modules/multichain/reporter/data/BlindSigningReporterDatasource.d.ts.map +1 -1
  173. package/lib/types/src/modules/multichain/reporter/data/dto/BlindSigningEventDto.d.ts +1 -1
  174. package/lib/types/src/modules/multichain/reporter/data/dto/BlindSigningEventDto.d.ts.map +1 -1
  175. package/lib/types/src/modules/multichain/reporter/model/BlindSigningEvent.d.ts +2 -0
  176. package/lib/types/src/modules/multichain/reporter/model/BlindSigningEvent.d.ts.map +1 -1
  177. package/lib/types/src/modules/multichain/sign-reporter/data/HttpSignReporterDatasource.d.ts +14 -0
  178. package/lib/types/src/modules/multichain/sign-reporter/data/HttpSignReporterDatasource.d.ts.map +1 -0
  179. package/lib/types/src/modules/multichain/sign-reporter/data/HttpSignReporterDatasource.test.d.ts +2 -0
  180. package/lib/types/src/modules/multichain/sign-reporter/data/HttpSignReporterDatasource.test.d.ts.map +1 -0
  181. package/lib/types/src/modules/multichain/sign-reporter/data/SignReporterDatasource.d.ts +6 -0
  182. package/lib/types/src/modules/multichain/sign-reporter/data/SignReporterDatasource.d.ts.map +1 -0
  183. package/lib/types/src/modules/multichain/sign-reporter/data/dto/SigningEventDto.d.ts +48 -0
  184. package/lib/types/src/modules/multichain/sign-reporter/data/dto/SigningEventDto.d.ts.map +1 -0
  185. package/lib/types/src/modules/multichain/sign-reporter/di/signReporterModuleFactory.d.ts +3 -0
  186. package/lib/types/src/modules/multichain/sign-reporter/di/signReporterModuleFactory.d.ts.map +1 -0
  187. package/lib/types/src/modules/multichain/sign-reporter/di/signReporterTypes.d.ts +5 -0
  188. package/lib/types/src/modules/multichain/sign-reporter/di/signReporterTypes.d.ts.map +1 -0
  189. package/lib/types/src/modules/multichain/sign-reporter/domain/DefaultSignReporter.d.ts +10 -0
  190. package/lib/types/src/modules/multichain/sign-reporter/domain/DefaultSignReporter.d.ts.map +1 -0
  191. package/lib/types/src/modules/multichain/sign-reporter/domain/DefaultSignReporter.test.d.ts +2 -0
  192. package/lib/types/src/modules/multichain/sign-reporter/domain/DefaultSignReporter.test.d.ts.map +1 -0
  193. package/lib/types/src/modules/multichain/sign-reporter/domain/SignReporter.d.ts +6 -0
  194. package/lib/types/src/modules/multichain/sign-reporter/domain/SignReporter.d.ts.map +1 -0
  195. package/lib/types/src/modules/multichain/sign-reporter/model/SignReportParams.d.ts +45 -0
  196. package/lib/types/src/modules/multichain/sign-reporter/model/SignReportParams.d.ts.map +1 -0
  197. package/lib/types/src/modules/solana/instruction-info/data/InstructionInfoDto.d.ts +46 -2
  198. package/lib/types/src/modules/solana/instruction-info/data/InstructionInfoDto.d.ts.map +1 -1
  199. package/lib/types/src/modules/solana/instruction-info/data/InstructionInfoMapper.d.ts +19 -2
  200. package/lib/types/src/modules/solana/instruction-info/data/InstructionInfoMapper.d.ts.map +1 -1
  201. package/lib/types/src/modules/solana/model/SolanaClearSignContext.d.ts +1 -1
  202. package/lib/types/src/modules/solana/model/SolanaClearSignContext.d.ts.map +1 -1
  203. package/lib/types/src/modules/solana/model/SolanaPayloads.d.ts +54 -0
  204. package/lib/types/src/modules/solana/model/SolanaPayloads.d.ts.map +1 -1
  205. package/lib/types/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.d.ts +3 -2
  206. package/lib/types/src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.d.ts.map +1 -1
  207. package/lib/types/src/modules/tron/model/TronTransactionContext.d.ts +5 -0
  208. package/lib/types/src/modules/tron/model/TronTransactionContext.d.ts.map +1 -0
  209. package/lib/types/src/modules/tron/token/data/HttpTokenDataSource.d.ts +17 -0
  210. package/lib/types/src/modules/tron/token/data/HttpTokenDataSource.d.ts.map +1 -0
  211. package/lib/types/src/modules/tron/token/data/HttpTokenDataSource.test.d.ts +2 -0
  212. package/lib/types/src/modules/tron/token/data/HttpTokenDataSource.test.d.ts.map +1 -0
  213. package/lib/types/src/modules/tron/token/data/TokenDataSource.d.ts +20 -0
  214. package/lib/types/src/modules/tron/token/data/TokenDataSource.d.ts.map +1 -0
  215. package/lib/types/src/modules/tron/token/di/tokenModuleFactory.d.ts +3 -0
  216. package/lib/types/src/modules/tron/token/di/tokenModuleFactory.d.ts.map +1 -0
  217. package/lib/types/src/modules/tron/token/di/tokenTypes.d.ts +5 -0
  218. package/lib/types/src/modules/tron/token/di/tokenTypes.d.ts.map +1 -0
  219. package/lib/types/src/modules/tron/token/domain/TokenContextLoader.d.ts +16 -0
  220. package/lib/types/src/modules/tron/token/domain/TokenContextLoader.d.ts.map +1 -0
  221. package/lib/types/src/modules/tron/token/domain/TokenContextLoader.test.d.ts +2 -0
  222. package/lib/types/src/modules/tron/token/domain/TokenContextLoader.test.d.ts.map +1 -0
  223. package/lib/types/src/modules/tron/token/domain/parseTrc10AssetId.d.ts +16 -0
  224. package/lib/types/src/modules/tron/token/domain/parseTrc10AssetId.d.ts.map +1 -0
  225. package/lib/types/src/modules/tron/token/domain/parseTrc10AssetId.test.d.ts +2 -0
  226. package/lib/types/src/modules/tron/token/domain/parseTrc10AssetId.test.d.ts.map +1 -0
  227. package/lib/types/src/shared/domain/ContextModuleChainID.d.ts +2 -1
  228. package/lib/types/src/shared/domain/ContextModuleChainID.d.ts.map +1 -1
  229. package/lib/types/src/shared/model/BlindSigningModelId.d.ts.map +1 -0
  230. package/lib/types/src/shared/model/ClearSignContext.d.ts +2 -1
  231. package/lib/types/src/shared/model/ClearSignContext.d.ts.map +1 -1
  232. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  233. package/package.json +4 -4
  234. package/lib/types/src/modules/multichain/reporter/model/BlindSigningModelId.d.ts.map +0 -1
  235. /package/lib/cjs/src/{modules/multichain/reporter → shared}/model/BlindSigningModelId.js +0 -0
  236. /package/lib/esm/src/{modules/multichain/reporter → shared}/model/BlindSigningModelId.js +0 -0
  237. /package/lib/types/src/{modules/multichain/reporter → shared}/model/BlindSigningModelId.d.ts +0 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/modules/solana/instruction-info/domain/InstructionInfoContextLoader.test.ts"],
4
- "sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\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 {\n type InstructionInfoDataSource,\n type InstructionInfoResult,\n} from \"@/modules/solana/instruction-info/data/InstructionInfoDataSource\";\nimport {\n type SolanaInstructionEnumVariant,\n type SolanaInstructionInfoPayload,\n} from \"@/modules/solana/model/SolanaPayloads\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\n\nimport { InstructionInfoContextLoader } from \"./InstructionInfoContextLoader\";\n\nconst mockLoggerFactory = () => ({\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n});\n\nconst mockCertificate = {\n keyUsageNumber: 8,\n payload: new Uint8Array([0x42]),\n};\n\nconst SYSTEM_PROGRAM = \"11111111111111111111111111111111\";\nconst JUPITER_PROGRAM = \"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4\";\n\n// The data source hands the loader fully-decoded core payloads.\nfunction makeSystemPayload(): SolanaInstructionInfoPayload {\n return {\n programId: SYSTEM_PROGRAM,\n discriminator: \"00000000\",\n instructionInfo: { data: \"0001sys_data\", signature: \"prodsig_sys\" },\n substructures: [\n { kind: 0x00, data: \"df1\" },\n { kind: 0x00, data: \"df2\" },\n { kind: 0x01, data: \"vfp1\" },\n ],\n enumVariants: [],\n idlDescriptor: { typePool: [], rootType: 0 },\n mintAssociations: [],\n valueFlowPorts: [],\n accountResets: [],\n displayFields: [],\n };\n}\n\nfunction makeSystemResult(): InstructionInfoResult {\n return {\n programId: SYSTEM_PROGRAM,\n descriptors: { \"00000000\": Right(makeSystemPayload()) },\n enumVariants: [],\n };\n}\n\nfunction makeJupiterPayload(): SolanaInstructionInfoPayload {\n return {\n programId: JUPITER_PROGRAM,\n discriminator: \"e517cb977ae3ad2a\",\n instructionInfo: { data: \"0001jup_data\", signature: \"prodsig_jup\" },\n substructures: [],\n enumVariants: [],\n idlDescriptor: { typePool: [], rootType: 0 },\n mintAssociations: [],\n valueFlowPorts: [],\n accountResets: [],\n displayFields: [],\n };\n}\n\nfunction makeJupiterResult(): InstructionInfoResult {\n return {\n programId: JUPITER_PROGRAM,\n descriptors: { e517cb977ae3ad2a: Right(makeJupiterPayload()) },\n enumVariants: [],\n };\n}\n\nfunction makeJupiterRouteResult(\n enumVariants: SolanaInstructionEnumVariant[] = [],\n): InstructionInfoResult {\n return {\n programId: JUPITER_PROGRAM,\n descriptors: {\n e517cb977ae3ad2a: Right({ ...makeJupiterPayload(), enumVariants }),\n },\n enumVariants,\n };\n}\n\ndescribe(\"InstructionInfoContextLoader\", () => {\n let dataSource: InstructionInfoDataSource;\n let certificateLoader: PkiCertificateLoader;\n\n beforeEach(() => {\n vi.restoreAllMocks();\n dataSource = {\n getInstructionInfo: vi.fn(),\n };\n certificateLoader = {\n loadCertificate: vi.fn().mockResolvedValue(mockCertificate),\n };\n });\n\n const makeLoader = () =>\n new InstructionInfoContextLoader(\n dataSource,\n certificateLoader,\n mockLoggerFactory,\n );\n\n describe(\"canHandle\", () => {\n it(\"returns true when SOLANA_INSTRUCTION_INFO is requested and instructions are present\", () => {\n expect(\n makeLoader().canHandle(\n {\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [{ programId: SYSTEM_PROGRAM }],\n },\n [ClearSignContextType.SOLANA_INSTRUCTION_INFO],\n ),\n ).toBe(true);\n });\n\n it(\"returns false when SOLANA_INSTRUCTION_INFO is not requested\", () => {\n expect(\n makeLoader().canHandle(\n {\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [{ programId: SYSTEM_PROGRAM }],\n },\n [ClearSignContextType.SOLANA_TOKEN],\n ),\n ).toBe(false);\n });\n\n it(\"returns false on missing / empty / malformed instructions\", () => {\n const loader = makeLoader();\n const types = [ClearSignContextType.SOLANA_INSTRUCTION_INFO];\n expect(loader.canHandle({} as any, types)).toBe(false);\n expect(loader.canHandle({ instructions: [] } as any, types)).toBe(false);\n expect(\n loader.canHandle({ instructions: [{ programId: \"\" }] } as any, types),\n ).toBe(false);\n expect(loader.canHandle(null, types)).toBe(false);\n expect(loader.canHandle(\"string\", types)).toBe(false);\n });\n });\n\n describe(\"load\", () => {\n it(\"fans out one CAL call per distinct programId in parallel\", async () => {\n const loader = makeLoader();\n const spy = vi\n .spyOn(dataSource, \"getInstructionInfo\")\n .mockImplementation(async ({ programId }) => {\n if (programId === SYSTEM_PROGRAM) return Right(makeSystemResult());\n if (programId === JUPITER_PROGRAM) return Right(makeJupiterResult());\n return Left(new Error(\"unknown program\"));\n });\n\n const result = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [\n { programId: SYSTEM_PROGRAM, discriminator: \"00000000\" },\n { programId: SYSTEM_PROGRAM, discriminator: \"00000000\" }, // dup\n { programId: JUPITER_PROGRAM, discriminator: \"e517cb977ae3ad2a\" },\n ],\n network: \"solana-mainnet\",\n });\n\n expect(spy).toHaveBeenCalledTimes(2);\n expect(spy).toHaveBeenCalledWith({\n programId: SYSTEM_PROGRAM,\n network: \"solana-mainnet\",\n });\n expect(spy).toHaveBeenCalledWith({\n programId: JUPITER_PROGRAM,\n network: \"solana-mainnet\",\n });\n\n expect(\n result.every(\n (c) =>\n c.type === ClearSignContextType.SOLANA_INSTRUCTION_INFO ||\n c.type === ClearSignContextType.ERROR,\n ),\n ).toBe(true);\n expect(\n result.filter(\n (c) => c.type === ClearSignContextType.SOLANA_INSTRUCTION_INFO,\n ),\n ).toHaveLength(2);\n });\n\n it(\"emits one SOLANA_INSTRUCTION_INFO per matching (programId, discriminator), passing the decoded payload through with the certificate\", async () => {\n const loader = makeLoader();\n vi.spyOn(dataSource, \"getInstructionInfo\").mockResolvedValue(\n Right(makeSystemResult()),\n );\n\n const result = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [\n { programId: SYSTEM_PROGRAM, discriminator: \"00000000\" },\n ],\n });\n\n const infoCtx = result.find(\n (c) => c.type === ClearSignContextType.SOLANA_INSTRUCTION_INFO,\n );\n expect(infoCtx).toBeDefined();\n expect(infoCtx).toMatchObject({\n type: ClearSignContextType.SOLANA_INSTRUCTION_INFO,\n certificate: mockCertificate,\n });\n // The loader does not transform \u2014 it forwards the data source's payload.\n expect((infoCtx as any).payload).toEqual(makeSystemPayload());\n });\n\n it(\"does NOT emit SOLANA_ENUM_VARIANT contexts (those come from EnumVariantContextLoader)\", async () => {\n const loader = makeLoader();\n // Pass a pre-decoded variant to confirm the loader never emits SOLANA_ENUM_VARIANT.\n const jupiter = makeJupiterRouteResult([\n {\n enumId: \"swap\",\n variantIndex: 46,\n descriptor: { data: \"01_raydium_tlv\", signature: \"prodsig_v46\" },\n },\n ]);\n vi.spyOn(dataSource, \"getInstructionInfo\").mockResolvedValue(\n Right(jupiter),\n );\n\n const result = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [\n { programId: JUPITER_PROGRAM, discriminator: \"e517cb977ae3ad2a\" },\n ],\n });\n\n expect(\n result.filter(\n (c) => c.type === ClearSignContextType.SOLANA_ENUM_VARIANT,\n ),\n ).toHaveLength(0);\n });\n\n it(\"bundles CAL enum_variants into the SOLANA_INSTRUCTION_INFO payload (host decode cache)\", async () => {\n const loader = makeLoader();\n const expectedVariants: SolanaInstructionEnumVariant[] = [\n {\n enumId: \"swap\",\n variantIndex: 46,\n descriptor: { data: \"01_raydium_tlv\", signature: \"prodsig_v46\" },\n },\n ];\n vi.spyOn(dataSource, \"getInstructionInfo\").mockResolvedValue(\n Right(makeJupiterRouteResult(expectedVariants)),\n );\n\n const result = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [\n { programId: JUPITER_PROGRAM, discriminator: \"e517cb977ae3ad2a\" },\n ],\n });\n\n const infoCtx = result.find(\n (c) => c.type === ClearSignContextType.SOLANA_INSTRUCTION_INFO,\n );\n\n expect((infoCtx as any).payload.enumVariants).toEqual(expectedVariants);\n });\n\n it(\"forwards exactly the enumVariants the data source decoded \u2014 no NaN indices\", async () => {\n const loader = makeLoader();\n // The data source is responsible for filtering malformed variant keys;\n // the loader forwards whatever pre-decoded variants it receives as-is.\n const validVariant: SolanaInstructionEnumVariant = {\n enumId: \"swap\",\n variantIndex: 46,\n descriptor: { data: \"01_raydium_tlv\", signature: \"prodsig_v46\" },\n };\n vi.spyOn(dataSource, \"getInstructionInfo\").mockResolvedValue(\n Right(makeJupiterRouteResult([validVariant])),\n );\n\n const result = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [\n { programId: JUPITER_PROGRAM, discriminator: \"e517cb977ae3ad2a\" },\n ],\n });\n\n const infoCtx = result.find(\n (c) => c.type === ClearSignContextType.SOLANA_INSTRUCTION_INFO,\n );\n\n expect((infoCtx as any).payload.enumVariants).toEqual([validVariant]);\n });\n\n it(\"filters descriptors by requested discriminator\", async () => {\n const loader = makeLoader();\n const result: InstructionInfoResult = {\n programId: SYSTEM_PROGRAM,\n descriptors: {\n \"00000000\": Right(makeSystemPayload()),\n \"00000001\": Right({\n ...makeSystemPayload(),\n discriminator: \"00000001\",\n instructionInfo: { data: \"0001other\", signature: \"p\" },\n }),\n },\n enumVariants: [],\n };\n vi.spyOn(dataSource, \"getInstructionInfo\").mockResolvedValue(\n Right(result),\n );\n\n const out = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [\n { programId: SYSTEM_PROGRAM, discriminator: \"00000000\" },\n ],\n });\n\n const infos = out.filter(\n (c) => c.type === ClearSignContextType.SOLANA_INSTRUCTION_INFO,\n );\n expect(infos).toHaveLength(1);\n expect((infos[0] as any).payload.discriminator).toBe(\"00000000\");\n });\n\n it(\"emits an ERROR context for a descriptor the data source could not decode\", async () => {\n const loader = makeLoader();\n const result: InstructionInfoResult = {\n programId: SYSTEM_PROGRAM,\n descriptors: {\n \"00000000\": Left(new Error(\"missing 'test' signature\")),\n },\n enumVariants: [],\n };\n vi.spyOn(dataSource, \"getInstructionInfo\").mockResolvedValue(\n Right(result),\n );\n\n const out = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [\n { programId: SYSTEM_PROGRAM, discriminator: \"00000000\" },\n ],\n });\n\n expect(out).toHaveLength(1);\n expect(out[0]?.type).toBe(ClearSignContextType.ERROR);\n expect((out[0] as any).error.message).toMatch(/missing 'test' signature/);\n });\n\n it(\"emits one ERROR context when CAL fails for a program but keeps processing the others\", async () => {\n const loader = makeLoader();\n vi.spyOn(dataSource, \"getInstructionInfo\").mockImplementation(\n async ({ programId }) => {\n if (programId === SYSTEM_PROGRAM) return Right(makeSystemResult());\n return Left(new Error(\"upstream-500\"));\n },\n );\n\n const out = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [\n { programId: SYSTEM_PROGRAM, discriminator: \"00000000\" },\n { programId: JUPITER_PROGRAM, discriminator: \"e517cb977ae3ad2a\" },\n ],\n });\n\n const errors = out.filter((c) => c.type === ClearSignContextType.ERROR);\n const infos = out.filter(\n (c) => c.type === ClearSignContextType.SOLANA_INSTRUCTION_INFO,\n );\n expect(errors).toHaveLength(1);\n expect(infos).toHaveLength(1);\n });\n\n it(\"degrades every program to ERROR when certificate loading fails\", async () => {\n vi.spyOn(certificateLoader, \"loadCertificate\").mockRejectedValue(\n new Error(\"pki-down\"),\n );\n vi.spyOn(dataSource, \"getInstructionInfo\").mockResolvedValue(\n Right(makeSystemResult()),\n );\n const loader = makeLoader();\n\n const out = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [\n { programId: SYSTEM_PROGRAM },\n { programId: JUPITER_PROGRAM },\n ],\n });\n\n expect(out).toHaveLength(2);\n expect(out.every((c) => c.type === ClearSignContextType.ERROR)).toBe(\n true,\n );\n });\n\n it(\"degrades every program to ERROR when the certificate resolves undefined\", async () => {\n vi.spyOn(certificateLoader, \"loadCertificate\").mockResolvedValue(\n undefined,\n );\n vi.spyOn(dataSource, \"getInstructionInfo\").mockResolvedValue(\n Right(makeSystemResult()),\n );\n const loader = makeLoader();\n\n const out = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [\n { programId: SYSTEM_PROGRAM },\n { programId: JUPITER_PROGRAM },\n ],\n });\n\n expect(out).toHaveLength(2);\n expect(out.every((c) => c.type === ClearSignContextType.ERROR)).toBe(\n true,\n );\n expect((out[0] as any).error.message).toMatch(/certificate is missing/);\n });\n\n it(\"falls back to default network when input.network is omitted or empty string\", async () => {\n const loader = makeLoader();\n const spy = vi\n .spyOn(dataSource, \"getInstructionInfo\")\n .mockResolvedValue(Right(makeSystemResult()));\n\n await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [{ programId: SYSTEM_PROGRAM }],\n });\n expect(spy).toHaveBeenLastCalledWith({\n programId: SYSTEM_PROGRAM,\n network: \"solana-mainnet\",\n });\n\n await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [{ programId: SYSTEM_PROGRAM }],\n network: \"\",\n });\n expect(spy).toHaveBeenLastCalledWith({\n programId: SYSTEM_PROGRAM,\n network: \"solana-mainnet\",\n });\n });\n });\n});\n"],
5
- "mappings": "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",
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\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 {\n type InstructionInfoDataSource,\n type InstructionInfoResult,\n} from \"@/modules/solana/instruction-info/data/InstructionInfoDataSource\";\nimport {\n type SolanaInstructionEnumVariant,\n type SolanaInstructionInfoPayload,\n} from \"@/modules/solana/model/SolanaPayloads\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\n\nimport { InstructionInfoContextLoader } from \"./InstructionInfoContextLoader\";\n\nconst mockLoggerFactory = () => ({\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n});\n\nconst mockCertificate = {\n keyUsageNumber: 8,\n payload: new Uint8Array([0x42]),\n};\n\nconst SYSTEM_PROGRAM = \"11111111111111111111111111111111\";\nconst JUPITER_PROGRAM = \"JUP6LkbZbjS1jKKwapdHNy74zcZ3tLUZoi5QNyVTaV4\";\n\n// The data source hands the loader fully-decoded core payloads.\nfunction makeSystemPayload(): SolanaInstructionInfoPayload {\n return {\n programId: SYSTEM_PROGRAM,\n discriminator: \"00000000\",\n instructionInfo: { data: \"0001sys_data\", signature: \"prodsig_sys\" },\n substructures: [\n { kind: 0x00, data: \"df1\" },\n { kind: 0x00, data: \"df2\" },\n { kind: 0x01, data: \"vfp1\" },\n ],\n enumVariants: [],\n idlDescriptor: { typePool: [], rootType: 0 },\n mintAssociations: [],\n ownerAssociations: [],\n valueFlowPorts: [],\n accountResets: [],\n displayFields: [],\n hideRules: [],\n };\n}\n\nfunction makeSystemResult(): InstructionInfoResult {\n return {\n programId: SYSTEM_PROGRAM,\n descriptors: { \"00000000\": Right(makeSystemPayload()) },\n enumVariants: [],\n };\n}\n\nfunction makeJupiterPayload(): SolanaInstructionInfoPayload {\n return {\n programId: JUPITER_PROGRAM,\n discriminator: \"e517cb977ae3ad2a\",\n instructionInfo: { data: \"0001jup_data\", signature: \"prodsig_jup\" },\n substructures: [],\n enumVariants: [],\n idlDescriptor: { typePool: [], rootType: 0 },\n mintAssociations: [],\n ownerAssociations: [],\n valueFlowPorts: [],\n accountResets: [],\n displayFields: [],\n hideRules: [],\n };\n}\n\nfunction makeJupiterResult(): InstructionInfoResult {\n return {\n programId: JUPITER_PROGRAM,\n descriptors: { e517cb977ae3ad2a: Right(makeJupiterPayload()) },\n enumVariants: [],\n };\n}\n\nfunction makeJupiterRouteResult(\n enumVariants: SolanaInstructionEnumVariant[] = [],\n): InstructionInfoResult {\n return {\n programId: JUPITER_PROGRAM,\n descriptors: {\n e517cb977ae3ad2a: Right({ ...makeJupiterPayload(), enumVariants }),\n },\n enumVariants,\n };\n}\n\ndescribe(\"InstructionInfoContextLoader\", () => {\n let dataSource: InstructionInfoDataSource;\n let certificateLoader: PkiCertificateLoader;\n\n beforeEach(() => {\n vi.restoreAllMocks();\n dataSource = {\n getInstructionInfo: vi.fn(),\n };\n certificateLoader = {\n loadCertificate: vi.fn().mockResolvedValue(mockCertificate),\n };\n });\n\n const makeLoader = () =>\n new InstructionInfoContextLoader(\n dataSource,\n certificateLoader,\n mockLoggerFactory,\n );\n\n describe(\"canHandle\", () => {\n it(\"returns true when SOLANA_INSTRUCTION_INFO is requested and instructions are present\", () => {\n expect(\n makeLoader().canHandle(\n {\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [{ programId: SYSTEM_PROGRAM }],\n },\n [ClearSignContextType.SOLANA_INSTRUCTION_INFO],\n ),\n ).toBe(true);\n });\n\n it(\"returns false when SOLANA_INSTRUCTION_INFO is not requested\", () => {\n expect(\n makeLoader().canHandle(\n {\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [{ programId: SYSTEM_PROGRAM }],\n },\n [ClearSignContextType.SOLANA_TOKEN],\n ),\n ).toBe(false);\n });\n\n it(\"returns false on missing / empty / malformed instructions\", () => {\n const loader = makeLoader();\n const types = [ClearSignContextType.SOLANA_INSTRUCTION_INFO];\n expect(loader.canHandle({} as any, types)).toBe(false);\n expect(loader.canHandle({ instructions: [] } as any, types)).toBe(false);\n expect(\n loader.canHandle({ instructions: [{ programId: \"\" }] } as any, types),\n ).toBe(false);\n expect(loader.canHandle(null, types)).toBe(false);\n expect(loader.canHandle(\"string\", types)).toBe(false);\n });\n });\n\n describe(\"load\", () => {\n it(\"fans out one CAL call per distinct programId in parallel\", async () => {\n const loader = makeLoader();\n const spy = vi\n .spyOn(dataSource, \"getInstructionInfo\")\n .mockImplementation(async ({ programId }) => {\n if (programId === SYSTEM_PROGRAM) return Right(makeSystemResult());\n if (programId === JUPITER_PROGRAM) return Right(makeJupiterResult());\n return Left(new Error(\"unknown program\"));\n });\n\n const result = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [\n { programId: SYSTEM_PROGRAM, discriminator: \"00000000\" },\n { programId: SYSTEM_PROGRAM, discriminator: \"00000000\" }, // dup\n { programId: JUPITER_PROGRAM, discriminator: \"e517cb977ae3ad2a\" },\n ],\n network: \"solana-mainnet\",\n });\n\n expect(spy).toHaveBeenCalledTimes(2);\n expect(spy).toHaveBeenCalledWith({\n programId: SYSTEM_PROGRAM,\n network: \"solana-mainnet\",\n });\n expect(spy).toHaveBeenCalledWith({\n programId: JUPITER_PROGRAM,\n network: \"solana-mainnet\",\n });\n\n expect(\n result.every(\n (c) =>\n c.type === ClearSignContextType.SOLANA_INSTRUCTION_INFO ||\n c.type === ClearSignContextType.ERROR,\n ),\n ).toBe(true);\n expect(\n result.filter(\n (c) => c.type === ClearSignContextType.SOLANA_INSTRUCTION_INFO,\n ),\n ).toHaveLength(2);\n });\n\n it(\"emits one SOLANA_INSTRUCTION_INFO per matching (programId, discriminator), passing the decoded payload through with the certificate\", async () => {\n const loader = makeLoader();\n vi.spyOn(dataSource, \"getInstructionInfo\").mockResolvedValue(\n Right(makeSystemResult()),\n );\n\n const result = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [\n { programId: SYSTEM_PROGRAM, discriminator: \"00000000\" },\n ],\n });\n\n const infoCtx = result.find(\n (c) => c.type === ClearSignContextType.SOLANA_INSTRUCTION_INFO,\n );\n expect(infoCtx).toBeDefined();\n expect(infoCtx).toMatchObject({\n type: ClearSignContextType.SOLANA_INSTRUCTION_INFO,\n certificate: mockCertificate,\n });\n // The loader does not transform \u2014 it forwards the data source's payload.\n expect((infoCtx as any).payload).toEqual(makeSystemPayload());\n });\n\n it(\"does NOT emit SOLANA_ENUM_VARIANT contexts (those come from EnumVariantContextLoader)\", async () => {\n const loader = makeLoader();\n // Pass a pre-decoded variant to confirm the loader never emits SOLANA_ENUM_VARIANT.\n const jupiter = makeJupiterRouteResult([\n {\n enumId: \"swap\",\n variantIndex: 46,\n descriptor: { data: \"01_raydium_tlv\", signature: \"prodsig_v46\" },\n },\n ]);\n vi.spyOn(dataSource, \"getInstructionInfo\").mockResolvedValue(\n Right(jupiter),\n );\n\n const result = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [\n { programId: JUPITER_PROGRAM, discriminator: \"e517cb977ae3ad2a\" },\n ],\n });\n\n expect(\n result.filter(\n (c) => c.type === ClearSignContextType.SOLANA_ENUM_VARIANT,\n ),\n ).toHaveLength(0);\n });\n\n it(\"bundles CAL enum_variants into the SOLANA_INSTRUCTION_INFO payload (host decode cache)\", async () => {\n const loader = makeLoader();\n const expectedVariants: SolanaInstructionEnumVariant[] = [\n {\n enumId: \"swap\",\n variantIndex: 46,\n descriptor: { data: \"01_raydium_tlv\", signature: \"prodsig_v46\" },\n },\n ];\n vi.spyOn(dataSource, \"getInstructionInfo\").mockResolvedValue(\n Right(makeJupiterRouteResult(expectedVariants)),\n );\n\n const result = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [\n { programId: JUPITER_PROGRAM, discriminator: \"e517cb977ae3ad2a\" },\n ],\n });\n\n const infoCtx = result.find(\n (c) => c.type === ClearSignContextType.SOLANA_INSTRUCTION_INFO,\n );\n\n expect((infoCtx as any).payload.enumVariants).toEqual(expectedVariants);\n });\n\n it(\"forwards exactly the enumVariants the data source decoded \u2014 no NaN indices\", async () => {\n const loader = makeLoader();\n // The data source is responsible for filtering malformed variant keys;\n // the loader forwards whatever pre-decoded variants it receives as-is.\n const validVariant: SolanaInstructionEnumVariant = {\n enumId: \"swap\",\n variantIndex: 46,\n descriptor: { data: \"01_raydium_tlv\", signature: \"prodsig_v46\" },\n };\n vi.spyOn(dataSource, \"getInstructionInfo\").mockResolvedValue(\n Right(makeJupiterRouteResult([validVariant])),\n );\n\n const result = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [\n { programId: JUPITER_PROGRAM, discriminator: \"e517cb977ae3ad2a\" },\n ],\n });\n\n const infoCtx = result.find(\n (c) => c.type === ClearSignContextType.SOLANA_INSTRUCTION_INFO,\n );\n\n expect((infoCtx as any).payload.enumVariants).toEqual([validVariant]);\n });\n\n it(\"filters descriptors by requested discriminator\", async () => {\n const loader = makeLoader();\n const result: InstructionInfoResult = {\n programId: SYSTEM_PROGRAM,\n descriptors: {\n \"00000000\": Right(makeSystemPayload()),\n \"00000001\": Right({\n ...makeSystemPayload(),\n discriminator: \"00000001\",\n instructionInfo: { data: \"0001other\", signature: \"p\" },\n }),\n },\n enumVariants: [],\n };\n vi.spyOn(dataSource, \"getInstructionInfo\").mockResolvedValue(\n Right(result),\n );\n\n const out = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [\n { programId: SYSTEM_PROGRAM, discriminator: \"00000000\" },\n ],\n });\n\n const infos = out.filter(\n (c) => c.type === ClearSignContextType.SOLANA_INSTRUCTION_INFO,\n );\n expect(infos).toHaveLength(1);\n expect((infos[0] as any).payload.discriminator).toBe(\"00000000\");\n });\n\n it(\"emits an ERROR context for a descriptor the data source could not decode\", async () => {\n const loader = makeLoader();\n const result: InstructionInfoResult = {\n programId: SYSTEM_PROGRAM,\n descriptors: {\n \"00000000\": Left(new Error(\"missing 'test' signature\")),\n },\n enumVariants: [],\n };\n vi.spyOn(dataSource, \"getInstructionInfo\").mockResolvedValue(\n Right(result),\n );\n\n const out = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [\n { programId: SYSTEM_PROGRAM, discriminator: \"00000000\" },\n ],\n });\n\n expect(out).toHaveLength(1);\n expect(out[0]?.type).toBe(ClearSignContextType.ERROR);\n expect((out[0] as any).error.message).toMatch(/missing 'test' signature/);\n });\n\n it(\"emits one ERROR context when CAL fails for a program but keeps processing the others\", async () => {\n const loader = makeLoader();\n vi.spyOn(dataSource, \"getInstructionInfo\").mockImplementation(\n async ({ programId }) => {\n if (programId === SYSTEM_PROGRAM) return Right(makeSystemResult());\n return Left(new Error(\"upstream-500\"));\n },\n );\n\n const out = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [\n { programId: SYSTEM_PROGRAM, discriminator: \"00000000\" },\n { programId: JUPITER_PROGRAM, discriminator: \"e517cb977ae3ad2a\" },\n ],\n });\n\n const errors = out.filter((c) => c.type === ClearSignContextType.ERROR);\n const infos = out.filter(\n (c) => c.type === ClearSignContextType.SOLANA_INSTRUCTION_INFO,\n );\n expect(errors).toHaveLength(1);\n expect(infos).toHaveLength(1);\n });\n\n it(\"degrades every program to ERROR when certificate loading fails\", async () => {\n vi.spyOn(certificateLoader, \"loadCertificate\").mockRejectedValue(\n new Error(\"pki-down\"),\n );\n vi.spyOn(dataSource, \"getInstructionInfo\").mockResolvedValue(\n Right(makeSystemResult()),\n );\n const loader = makeLoader();\n\n const out = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [\n { programId: SYSTEM_PROGRAM },\n { programId: JUPITER_PROGRAM },\n ],\n });\n\n expect(out).toHaveLength(2);\n expect(out.every((c) => c.type === ClearSignContextType.ERROR)).toBe(\n true,\n );\n });\n\n it(\"degrades every program to ERROR when the certificate resolves undefined\", async () => {\n vi.spyOn(certificateLoader, \"loadCertificate\").mockResolvedValue(\n undefined,\n );\n vi.spyOn(dataSource, \"getInstructionInfo\").mockResolvedValue(\n Right(makeSystemResult()),\n );\n const loader = makeLoader();\n\n const out = await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [\n { programId: SYSTEM_PROGRAM },\n { programId: JUPITER_PROGRAM },\n ],\n });\n\n expect(out).toHaveLength(2);\n expect(out.every((c) => c.type === ClearSignContextType.ERROR)).toBe(\n true,\n );\n expect((out[0] as any).error.message).toMatch(/certificate is missing/);\n });\n\n it(\"falls back to default network when input.network is omitted or empty string\", async () => {\n const loader = makeLoader();\n const spy = vi\n .spyOn(dataSource, \"getInstructionInfo\")\n .mockResolvedValue(Right(makeSystemResult()));\n\n await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [{ programId: SYSTEM_PROGRAM }],\n });\n expect(spy).toHaveBeenLastCalledWith({\n programId: SYSTEM_PROGRAM,\n network: \"solana-mainnet\",\n });\n\n await loader.load({\n deviceModelId: DeviceModelId.NANO_X,\n instructions: [{ programId: SYSTEM_PROGRAM }],\n network: \"\",\n });\n expect(spy).toHaveBeenLastCalledWith({\n programId: SYSTEM_PROGRAM,\n network: \"solana-mainnet\",\n });\n });\n });\n});\n"],
5
+ "mappings": "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",
6
6
  "names": ["DeviceModelId", "Left", "Right", "beforeEach", "describe", "expect", "it", "vi", "ClearSignContextType", "InstructionInfoContextLoader", "mockLoggerFactory", "mockCertificate", "SYSTEM_PROGRAM", "JUPITER_PROGRAM", "makeSystemPayload", "makeSystemResult", "makeJupiterPayload", "makeJupiterResult", "makeJupiterRouteResult", "enumVariants", "dataSource", "certificateLoader", "makeLoader", "loader", "types", "spy", "programId", "result", "c", "infoCtx", "jupiter", "expectedVariants", "validVariant", "infos", "out", "errors"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{ClearSignContextType as a}from"../../../shared/model/ClearSignContext";import{SolanaInstructionSubstructureKind as r}from"../../../modules/solana/model/SolanaPayloads";const e={TOKEN:a.SOLANA_TOKEN,LIFI:a.SOLANA_LIFI,TRUSTED_NAME:a.SOLANA_TRUSTED_NAME,BASIC_TRUSTED_NAME:a.SOLANA_BASIC_TRUSTED_NAME,TRANSACTION_CHECK:a.SOLANA_TRANSACTION_CHECK,INSTRUCTION_INFO:a.SOLANA_INSTRUCTION_INFO,ENUM_VARIANT:a.SOLANA_ENUM_VARIANT,TOKEN_INFO:a.SOLANA_TOKEN_INFO,TOKEN_ACCOUNT_STATE:a.SOLANA_TOKEN_ACCOUNT_STATE,ALT_RESOLUTION:a.SOLANA_ALT_RESOLUTION},o=new Set(Object.values(e));function S(t){return o.has(t.type)}export{o as SOLANA_CLEAR_SIGN_CONTEXT_SUCCESS_TYPES,e as SolanaContextType,r as SolanaInstructionSubstructureKind,S as isSolanaContextSuccess};
1
+ import{ClearSignContextType as a}from"../../../shared/model/ClearSignContext";import{SolanaInstructionSubstructureKind as C}from"../../../modules/solana/model/SolanaPayloads";const e={TOKEN:a.SOLANA_TOKEN,LIFI:a.SOLANA_LIFI,TRUSTED_NAME:a.SOLANA_TRUSTED_NAME,BASIC_TRUSTED_NAME:a.SOLANA_BASIC_TRUSTED_NAME,TRANSACTION_CHECK:a.SOLANA_TRANSACTION_CHECK,INSTRUCTION_INFO:a.SOLANA_INSTRUCTION_INFO,ENUM_VARIANT:a.SOLANA_ENUM_VARIANT,TOKEN_INFO:a.SOLANA_TOKEN_INFO,TOKEN_ACCOUNT_STATE:a.SOLANA_TOKEN_ACCOUNT_STATE,ALT_RESOLUTION:a.SOLANA_ALT_RESOLUTION},o=new Set(Object.values(e));function l(t){return o.has(t.type)}export{o as SOLANA_CLEAR_SIGN_CONTEXT_SUCCESS_TYPES,e as SolanaContextType,C as SolanaInstructionSubstructureKind,l as isSolanaContextSuccess};
2
2
  //# sourceMappingURL=SolanaClearSignContext.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/modules/solana/model/SolanaClearSignContext.ts"],
4
- "sourcesContent": ["import { type PkiCertificate } from \"@/modules/multichain/pki/model/PkiCertificate\";\nimport {\n type SolanaAltResolutionPayload,\n type SolanaEnumVariantPayload,\n type SolanaInstructionInfoPayload,\n type SolanaLifiPayload,\n type SolanaTokenAccountStatePayload,\n type SolanaTokenData,\n type SolanaTokenInfoPayload,\n type SolanaTransactionCheckPayload,\n} from \"@/modules/solana/model/SolanaPayloads\";\nimport {\n type ClearSignContext,\n type ClearSignContextSuccess,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\n\n// Re-export Solana payload types so consumers can import from this file\nexport type {\n SolanaAltResolutionPayload,\n SolanaCalAccountReset,\n SolanaCalDisplayField,\n SolanaCalMintAssociation,\n SolanaCalTokenValue,\n SolanaCalTypePoolEntry,\n SolanaCalValue,\n SolanaCalValueFlowPort,\n SolanaEnumVariantPayload,\n SolanaInstructionEnumVariant,\n SolanaInstructionInfoPayload,\n SolanaInstructionSubstructure,\n SolanaLifiInstructionMeta,\n SolanaLifiPayload,\n SolanaSignedDescriptor,\n SolanaTokenAccountStatePayload,\n SolanaTokenData,\n SolanaTokenInfoPayload,\n SolanaTransactionCheckPayload,\n SolanaTransactionDescriptor,\n} from \"@/modules/solana/model/SolanaPayloads\";\nexport { SolanaInstructionSubstructureKind } from \"@/modules/solana/model/SolanaPayloads\";\n\n/**\n * Solana-specific payload overrides \u2014 contributed to the shared\n * ClearSignContextSuccessPayloads map at the integration boundary.\n */\nexport type SolanaPayloadOverrides = {\n [ClearSignContextType.SOLANA_TOKEN]: {\n payload: SolanaTokenData;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_LIFI]: {\n payload: SolanaLifiPayload;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_TRUSTED_NAME]: {\n payload: Uint8Array;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_BASIC_TRUSTED_NAME]: {\n payload: Uint8Array;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_TRANSACTION_CHECK]: {\n payload: SolanaTransactionCheckPayload;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_INSTRUCTION_INFO]: {\n payload: SolanaInstructionInfoPayload;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_ENUM_VARIANT]: {\n payload: SolanaEnumVariantPayload;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_TOKEN_INFO]: {\n payload: SolanaTokenInfoPayload;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_TOKEN_ACCOUNT_STATE]: {\n payload: SolanaTokenAccountStatePayload;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_ALT_RESOLUTION]: {\n payload: SolanaAltResolutionPayload;\n certificate?: PkiCertificate;\n };\n};\n\nexport const SolanaContextType = {\n TOKEN: ClearSignContextType.SOLANA_TOKEN,\n LIFI: ClearSignContextType.SOLANA_LIFI,\n TRUSTED_NAME: ClearSignContextType.SOLANA_TRUSTED_NAME,\n BASIC_TRUSTED_NAME: ClearSignContextType.SOLANA_BASIC_TRUSTED_NAME,\n TRANSACTION_CHECK: ClearSignContextType.SOLANA_TRANSACTION_CHECK,\n INSTRUCTION_INFO: ClearSignContextType.SOLANA_INSTRUCTION_INFO,\n ENUM_VARIANT: ClearSignContextType.SOLANA_ENUM_VARIANT,\n TOKEN_INFO: ClearSignContextType.SOLANA_TOKEN_INFO,\n TOKEN_ACCOUNT_STATE: ClearSignContextType.SOLANA_TOKEN_ACCOUNT_STATE,\n ALT_RESOLUTION: ClearSignContextType.SOLANA_ALT_RESOLUTION,\n} as const;\n\n/**\n * Union of all Solana-relevant success context types.\n */\nexport type SolanaClearSignContextSuccessType =\n (typeof SolanaContextType)[keyof typeof SolanaContextType];\n\n/**\n * A ClearSignContextSuccess narrowed to only Solana-relevant types.\n */\nexport type SolanaClearSignContextSuccess =\n ClearSignContextSuccess<SolanaClearSignContextSuccessType>;\n\n/**\n * Set of all Solana-relevant success ClearSignContextType values.\n * Used by the type guard below to filter out non-Solana contexts at runtime.\n */\nexport const SOLANA_CLEAR_SIGN_CONTEXT_SUCCESS_TYPES =\n new Set<ClearSignContextType>(Object.values(SolanaContextType));\n\n/**\n * Type guard that narrows a ClearSignContextSuccess to a\n * SolanaClearSignContextSuccess, filtering out non-Solana types.\n */\nexport function isSolanaContextSuccess(\n ctx: ClearSignContext,\n): ctx is SolanaClearSignContextSuccess {\n return SOLANA_CLEAR_SIGN_CONTEXT_SUCCESS_TYPES.has(ctx.type);\n}\n"],
5
- "mappings": "AAWA,OAGE,wBAAAA,MACK,kCAyBP,OAAS,qCAAAC,MAAyC,wCAiD3C,MAAMC,EAAoB,CAC/B,MAAOF,EAAqB,aAC5B,KAAMA,EAAqB,YAC3B,aAAcA,EAAqB,oBACnC,mBAAoBA,EAAqB,0BACzC,kBAAmBA,EAAqB,yBACxC,iBAAkBA,EAAqB,wBACvC,aAAcA,EAAqB,oBACnC,WAAYA,EAAqB,kBACjC,oBAAqBA,EAAqB,2BAC1C,eAAgBA,EAAqB,qBACvC,EAkBaG,EACX,IAAI,IAA0B,OAAO,OAAOD,CAAiB,CAAC,EAMzD,SAASE,EACdC,EACsC,CACtC,OAAOF,EAAwC,IAAIE,EAAI,IAAI,CAC7D",
4
+ "sourcesContent": ["import { type PkiCertificate } from \"@/modules/multichain/pki/model/PkiCertificate\";\nimport {\n type SolanaAltResolutionPayload,\n type SolanaEnumVariantPayload,\n type SolanaInstructionInfoPayload,\n type SolanaLifiPayload,\n type SolanaTokenAccountStatePayload,\n type SolanaTokenData,\n type SolanaTokenInfoPayload,\n type SolanaTransactionCheckPayload,\n} from \"@/modules/solana/model/SolanaPayloads\";\nimport {\n type ClearSignContext,\n type ClearSignContextSuccess,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\n\n// Re-export Solana payload types so consumers can import from this file\nexport type {\n SolanaAltResolutionPayload,\n SolanaCalAccountReset,\n SolanaCalAccountSchema,\n SolanaCalActiveWhenPredicate,\n SolanaCalDisplayField,\n SolanaCalHideRule,\n SolanaCalMintAssociation,\n SolanaCalOwnerAssociation,\n SolanaCalSlotConstraint,\n SolanaCalTokenValue,\n SolanaCalTypePoolEntry,\n SolanaCalValue,\n SolanaCalValueFlowPort,\n SolanaEnumVariantPayload,\n SolanaInstructionEnumVariant,\n SolanaInstructionInfoPayload,\n SolanaInstructionSubstructure,\n SolanaLifiInstructionMeta,\n SolanaLifiPayload,\n SolanaSignedDescriptor,\n SolanaTokenAccountStatePayload,\n SolanaTokenData,\n SolanaTokenInfoPayload,\n SolanaTransactionCheckPayload,\n SolanaTransactionDescriptor,\n} from \"@/modules/solana/model/SolanaPayloads\";\nexport { SolanaInstructionSubstructureKind } from \"@/modules/solana/model/SolanaPayloads\";\n\n/**\n * Solana-specific payload overrides \u2014 contributed to the shared\n * ClearSignContextSuccessPayloads map at the integration boundary.\n */\nexport type SolanaPayloadOverrides = {\n [ClearSignContextType.SOLANA_TOKEN]: {\n payload: SolanaTokenData;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_LIFI]: {\n payload: SolanaLifiPayload;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_TRUSTED_NAME]: {\n payload: Uint8Array;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_BASIC_TRUSTED_NAME]: {\n payload: Uint8Array;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_TRANSACTION_CHECK]: {\n payload: SolanaTransactionCheckPayload;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_INSTRUCTION_INFO]: {\n payload: SolanaInstructionInfoPayload;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_ENUM_VARIANT]: {\n payload: SolanaEnumVariantPayload;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_TOKEN_INFO]: {\n payload: SolanaTokenInfoPayload;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_TOKEN_ACCOUNT_STATE]: {\n payload: SolanaTokenAccountStatePayload;\n certificate?: PkiCertificate;\n };\n [ClearSignContextType.SOLANA_ALT_RESOLUTION]: {\n payload: SolanaAltResolutionPayload;\n certificate?: PkiCertificate;\n };\n};\n\nexport const SolanaContextType = {\n TOKEN: ClearSignContextType.SOLANA_TOKEN,\n LIFI: ClearSignContextType.SOLANA_LIFI,\n TRUSTED_NAME: ClearSignContextType.SOLANA_TRUSTED_NAME,\n BASIC_TRUSTED_NAME: ClearSignContextType.SOLANA_BASIC_TRUSTED_NAME,\n TRANSACTION_CHECK: ClearSignContextType.SOLANA_TRANSACTION_CHECK,\n INSTRUCTION_INFO: ClearSignContextType.SOLANA_INSTRUCTION_INFO,\n ENUM_VARIANT: ClearSignContextType.SOLANA_ENUM_VARIANT,\n TOKEN_INFO: ClearSignContextType.SOLANA_TOKEN_INFO,\n TOKEN_ACCOUNT_STATE: ClearSignContextType.SOLANA_TOKEN_ACCOUNT_STATE,\n ALT_RESOLUTION: ClearSignContextType.SOLANA_ALT_RESOLUTION,\n} as const;\n\n/**\n * Union of all Solana-relevant success context types.\n */\nexport type SolanaClearSignContextSuccessType =\n (typeof SolanaContextType)[keyof typeof SolanaContextType];\n\n/**\n * A ClearSignContextSuccess narrowed to only Solana-relevant types.\n */\nexport type SolanaClearSignContextSuccess =\n ClearSignContextSuccess<SolanaClearSignContextSuccessType>;\n\n/**\n * Set of all Solana-relevant success ClearSignContextType values.\n * Used by the type guard below to filter out non-Solana contexts at runtime.\n */\nexport const SOLANA_CLEAR_SIGN_CONTEXT_SUCCESS_TYPES =\n new Set<ClearSignContextType>(Object.values(SolanaContextType));\n\n/**\n * Type guard that narrows a ClearSignContextSuccess to a\n * SolanaClearSignContextSuccess, filtering out non-Solana types.\n */\nexport function isSolanaContextSuccess(\n ctx: ClearSignContext,\n): ctx is SolanaClearSignContextSuccess {\n return SOLANA_CLEAR_SIGN_CONTEXT_SUCCESS_TYPES.has(ctx.type);\n}\n"],
5
+ "mappings": "AAWA,OAGE,wBAAAA,MACK,kCA8BP,OAAS,qCAAAC,MAAyC,wCAiD3C,MAAMC,EAAoB,CAC/B,MAAOF,EAAqB,aAC5B,KAAMA,EAAqB,YAC3B,aAAcA,EAAqB,oBACnC,mBAAoBA,EAAqB,0BACzC,kBAAmBA,EAAqB,yBACxC,iBAAkBA,EAAqB,wBACvC,aAAcA,EAAqB,oBACnC,WAAYA,EAAqB,kBACjC,oBAAqBA,EAAqB,2BAC1C,eAAgBA,EAAqB,qBACvC,EAkBaG,EACX,IAAI,IAA0B,OAAO,OAAOD,CAAiB,CAAC,EAMzD,SAASE,EACdC,EACsC,CACtC,OAAOF,EAAwC,IAAIE,EAAI,IAAI,CAC7D",
6
6
  "names": ["ClearSignContextType", "SolanaInstructionSubstructureKind", "SolanaContextType", "SOLANA_CLEAR_SIGN_CONTEXT_SUCCESS_TYPES", "isSolanaContextSuccess", "ctx"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/modules/solana/model/SolanaPayloads.ts"],
4
- "sourcesContent": ["// Solana payload types \u2014 used both by Solana loaders and (type-only)\n// referenced by the shared ClearSignContext union for typed-payload variants.\n\nexport type SolanaTokenData = {\n solanaTokenDescriptor: {\n data: string;\n signature: string;\n };\n};\n\nexport type SolanaTransactionDescriptor = {\n data: string;\n descriptorType: string;\n descriptorVersion: string;\n signature: string;\n has_basis_point?: boolean;\n};\n\nexport type SolanaLifiInstructionMeta = {\n program_id: string;\n discriminator_hex?: string;\n has_basis_point?: boolean;\n};\n\nexport type SolanaLifiPayload = {\n descriptors: Record<string, SolanaTransactionDescriptor[]>;\n instructions: SolanaLifiInstructionMeta[];\n};\n\nexport type SolanaTransactionCheckPayload = {\n descriptor: string;\n};\n\n// --- Generic clear-signing payloads ---\n\n// CAL static descriptor payloads. `data` is the signed TLV (hex string);\n// `signature` is the resolved signature for the configured CAL signature\n// kind (`prod` | `test`).\n\nexport type SolanaSignedDescriptor = {\n data: string;\n signature: string;\n};\n\n/**\n * One enum-variant descriptor bundled with an instruction descriptor by CAL.\n * The signed TLV (`descriptor.data`) feeds the host-side type-pool decode\n * cache, `enumId`/`variantIndex` identify which variant it describes (and let\n * the host stream the selected variant's signed descriptor to the device).\n */\nexport type SolanaInstructionEnumVariant = {\n enumId: string;\n variantIndex: number;\n descriptor: SolanaSignedDescriptor;\n};\n\n/**\n * Payload for ClearSignContextType.SOLANA_INSTRUCTION_INFO.\n *\n * `instructionInfo` + `substructures` are the signed TLVs streamed to the\n * device, and `enumVariants` are the signed enum-variant descriptors CAL\n * bundles for the program's enums (used to build the host decode cache). The\n * remaining fields are CAL's decoded JSON consumed host-side by the\n * requirement builder.\n */\nexport type SolanaInstructionInfoPayload = {\n programId: string;\n discriminator: string;\n instructionName?: string;\n instructionInfo: SolanaSignedDescriptor;\n substructures: SolanaInstructionSubstructure[];\n enumVariants: SolanaInstructionEnumVariant[];\n idlDescriptor: {\n typePool: SolanaCalTypePoolEntry[];\n rootType: number;\n };\n mintAssociations: SolanaCalMintAssociation[];\n valueFlowPorts: SolanaCalValueFlowPort[];\n accountResets: SolanaCalAccountReset[];\n displayFields: SolanaCalDisplayField[];\n};\n\nexport enum SolanaInstructionSubstructureKind {\n DISPLAY_FIELD = 0x00,\n VALUE_FLOW_PORT = 0x01,\n HIDE_RULE = 0x02,\n ACCOUNT_RESET = 0x03,\n}\n\nexport type SolanaInstructionSubstructure = {\n kind: SolanaInstructionSubstructureKind;\n // TLV payload (hex string) for the substructure.\n data: string;\n};\n\n// --- Decoded CAL JSON (snake_case mirrors the CAL response) ---\n\nexport type SolanaCalValue = {\n source: string;\n /** ACCOUNT_PATH: index into the instruction's accounts. */\n account_index?: number;\n /** CONSTANT: hex-encoded bytes. */\n data?: string;\n /** ARGUMENT_PATH: decoded steps. */\n path?: { steps: number[] };\n};\n\nexport type SolanaCalTokenValue = {\n kind: string;\n value?: SolanaCalValue;\n account_index?: number;\n};\n\nexport type SolanaCalValueFlowPort = {\n /** Ordered candidate list of account indices (length 1 for a single-account port). */\n account_indices: number[];\n optional_account_strategy?: string;\n token_value: SolanaCalTokenValue;\n};\n\nexport type SolanaCalAccountReset = {\n account_index: number;\n require_pre_balance_zero?: boolean;\n};\n\nexport type SolanaCalDisplayField = {\n name?: string;\n param: { type: string; value?: SolanaCalValue; token?: SolanaCalValue };\n};\n\nexport type SolanaCalTypePoolEntry = {\n index: number;\n kind: string;\n refs?: number[];\n size?: number;\n encoding?: number;\n len_kind?: string;\n flag_kind?: string;\n sentinel?: string;\n disc_kind?: string;\n total_variants?: number;\n enum_id?: string;\n};\n\nexport type SolanaCalMintAssociation = {\n account_index: number;\n mint_index: number;\n};\n\n/**\n * Payload for ClearSignContextType.SOLANA_ENUM_VARIANT: one signed\n * ENUM_VARIANT descriptor for a `(programId, enumId, variantIndex)` triple.\n */\nexport type SolanaEnumVariantPayload = {\n programId: string;\n enumId: string;\n variantIndex: number;\n descriptor: SolanaSignedDescriptor;\n};\n\n/**\n * Payload for ClearSignContextType.SOLANA_TOKEN_INFO, keyed by mint pubkey.\n * Distinct from the legacy SOLANA_TOKEN context.\n */\nexport type SolanaTokenInfoPayload = {\n mint: string;\n descriptor: SolanaSignedDescriptor;\n};\n\n// --- Dynamic descriptor payloads (challenge-bound) ---\n//\n// Each payload carries the raw signed TLV bytes decoded from the backend's\n// hex `signedDescriptor`.\n\nexport type SolanaTokenAccountStatePayload = {\n descriptor: Uint8Array;\n mint?: string;\n};\n\nexport type SolanaAltResolutionPayload = {\n descriptor: Uint8Array;\n resolvedAddress?: string;\n};\n\n// SOLANA_TRUSTED_NAME (generic flow, with 2-byte length prefix) is emitted by\n// SolanaTrustedNameContextLoader. SOLANA_BASIC_TRUSTED_NAME (basic flow, raw\n// bytes) is emitted by OwnerInfoContextLoader. Both carry `payload: Uint8Array`.\n"],
5
- "mappings": "AAkFO,IAAKA,OACVA,IAAA,cAAgB,GAAhB,gBACAA,IAAA,gBAAkB,GAAlB,kBACAA,IAAA,UAAY,GAAZ,YACAA,IAAA,cAAgB,GAAhB,gBAJUA,OAAA",
4
+ "sourcesContent": ["// Solana payload types \u2014 used both by Solana loaders and (type-only)\n// referenced by the shared ClearSignContext union for typed-payload variants.\n\nexport type SolanaTokenData = {\n solanaTokenDescriptor: {\n data: string;\n signature: string;\n };\n};\n\nexport type SolanaTransactionDescriptor = {\n data: string;\n descriptorType: string;\n descriptorVersion: string;\n signature: string;\n has_basis_point?: boolean;\n};\n\nexport type SolanaLifiInstructionMeta = {\n program_id: string;\n discriminator_hex?: string;\n has_basis_point?: boolean;\n};\n\nexport type SolanaLifiPayload = {\n descriptors: Record<string, SolanaTransactionDescriptor[]>;\n instructions: SolanaLifiInstructionMeta[];\n};\n\nexport type SolanaTransactionCheckPayload = {\n descriptor: string;\n};\n\n// --- Generic clear-signing payloads ---\n\n// CAL static descriptor payloads. `data` is the signed TLV (hex string);\n// `signature` is the resolved signature for the configured CAL signature\n// kind (`prod` | `test`).\n\nexport type SolanaSignedDescriptor = {\n data: string;\n signature: string;\n};\n\n/**\n * One enum-variant descriptor bundled with an instruction descriptor by CAL.\n * The signed TLV (`descriptor.data`) feeds the host-side type-pool decode\n * cache, `enumId`/`variantIndex` identify which variant it describes (and let\n * the host stream the selected variant's signed descriptor to the device).\n */\nexport type SolanaInstructionEnumVariant = {\n enumId: string;\n variantIndex: number;\n descriptor: SolanaSignedDescriptor;\n};\n\n/**\n * Payload for ClearSignContextType.SOLANA_INSTRUCTION_INFO.\n *\n * `instructionInfo` + `substructures` are the signed TLVs streamed to the\n * device, and `enumVariants` are the signed enum-variant descriptors CAL\n * bundles for the program's enums (used to build the host decode cache). The\n * remaining fields are CAL's decoded JSON consumed host-side by the\n * requirement builder.\n */\nexport type SolanaInstructionInfoPayload = {\n programId: string;\n discriminator: string;\n instructionName?: string;\n instructionInfo: SolanaSignedDescriptor;\n substructures: SolanaInstructionSubstructure[];\n enumVariants: SolanaInstructionEnumVariant[];\n idlDescriptor: {\n typePool: SolanaCalTypePoolEntry[];\n rootType: number;\n };\n mintAssociations: SolanaCalMintAssociation[];\n ownerAssociations: SolanaCalOwnerAssociation[];\n valueFlowPorts: SolanaCalValueFlowPort[];\n accountResets: SolanaCalAccountReset[];\n displayFields: SolanaCalDisplayField[];\n hideRules: SolanaCalHideRule[];\n accountSchema?: SolanaCalAccountSchema;\n};\n\nexport enum SolanaInstructionSubstructureKind {\n DISPLAY_FIELD = 0x00,\n VALUE_FLOW_PORT = 0x01,\n HIDE_RULE = 0x02,\n ACCOUNT_RESET = 0x03,\n}\n\nexport type SolanaInstructionSubstructure = {\n kind: SolanaInstructionSubstructureKind;\n // TLV payload (hex string) for the substructure.\n data: string;\n};\n\n// --- Decoded CAL JSON (snake_case mirrors the CAL response) ---\n\nexport type SolanaCalValue = {\n source: string;\n /** ACCOUNT_PATH: index into the instruction's accounts. */\n account_index?: number;\n /** CONSTANT: hex-encoded bytes. */\n data?: string;\n /** ARGUMENT_PATH: decoded steps. */\n path?: { steps: number[] };\n};\n\nexport type SolanaCalTokenValue = {\n kind: string;\n value?: SolanaCalValue;\n account_index?: number;\n /**\n * `RESOLVE` only: account index whose *address* the device uses as the mint\n * when the binding lookup fails through both the mint-association map and\n * `TOKEN_ACCOUNT_STATE` (`accountMintTokenNode.fallbackAccount`).\n */\n fallback_account?: number;\n};\n\n/**\n * One `VALUE_FLOW_PORT.ACTIVE_WHEN` predicate: a bare `ActiveWhenPredicate`\n * name, or `MINT_PREDICATE` with its trailing mint.\n */\nexport type SolanaCalActiveWhenPredicate =\n | string\n | { kind: string; mint?: string };\n\nexport type SolanaCalValueFlowPort = {\n /** Ordered candidate list of account indices (length 1 for a single-account port). */\n account_indices: number[];\n optional_account_strategy?: string;\n token_value: SolanaCalTokenValue;\n /** Port activation predicates; all must pass for the port to be active. */\n active_when?: SolanaCalActiveWhenPredicate[];\n};\n\n/**\n * One `HIDE_RULE` substructure: a `(rule_set_index, target, condition)` triple.\n * `condition` is non-optional in the TLV, but it stays optional here: the signed\n * substructure reaches the device either way, so a rule whose condition CAL\n * failed to name must still be surfaced \u2014 dropping it would lose the `target`\n * the device resolves for every rule.\n */\nexport type SolanaCalHideRule = {\n rule_set_index?: number;\n target?: SolanaCalValue;\n condition?: string;\n};\n\n/**\n * An `OWNER_ASSOC_ACCOUNT` / `OWNER_ASSOC_OWNER` pair: binds a token account to\n * its owner, seeding the transaction-scoped owner map the `IS_SIGNER` /\n * `IS_ANOTHER_SIGNER` predicates read.\n */\nexport type SolanaCalOwnerAssociation = {\n account_index: number;\n owner: SolanaCalValue;\n};\n\nexport type SolanaCalAccountReset = {\n account_index: number;\n require_pre_balance_zero?: boolean;\n value_kind?: string;\n token?: SolanaCalTokenValue;\n require_native_pre_balance_zero?: boolean;\n};\n\nexport type SolanaCalSlotConstraint = {\n signer: \"FORBIDDEN\" | \"EITHER\" | \"REQUIRED\";\n writable: \"FORBIDDEN\" | \"EITHER\" | \"REQUIRED\";\n};\n\nexport type SolanaCalAccountSchema = {\n count_min: number;\n /** 255 = COUNT_UNBOUNDED (no upper limit). */\n count_max: number;\n remaining_policy: SolanaCalSlotConstraint;\n slots: SolanaCalSlotConstraint[];\n};\n\nexport type SolanaCalDisplayField = {\n name?: string;\n param: { type: string; value?: SolanaCalValue; token?: SolanaCalValue };\n};\n\nexport type SolanaCalTypePoolEntry = {\n index: number;\n kind: string;\n refs?: number[];\n size?: number;\n encoding?: number;\n len_kind?: string;\n flag_kind?: string;\n sentinel?: string;\n disc_kind?: string;\n total_variants?: number;\n enum_id?: string;\n};\n\nexport type SolanaCalMintAssociation = {\n account_index: number;\n mint_index: number;\n};\n\n/**\n * Payload for ClearSignContextType.SOLANA_ENUM_VARIANT: one signed\n * ENUM_VARIANT descriptor for a `(programId, enumId, variantIndex)` triple.\n */\nexport type SolanaEnumVariantPayload = {\n programId: string;\n enumId: string;\n variantIndex: number;\n descriptor: SolanaSignedDescriptor;\n};\n\n/**\n * Payload for ClearSignContextType.SOLANA_TOKEN_INFO, keyed by mint pubkey.\n * Distinct from the legacy SOLANA_TOKEN context.\n */\nexport type SolanaTokenInfoPayload = {\n mint: string;\n descriptor: SolanaSignedDescriptor;\n};\n\n// --- Dynamic descriptor payloads (challenge-bound) ---\n//\n// Each payload carries the raw signed TLV bytes decoded from the backend's\n// hex `signedDescriptor`.\n\nexport type SolanaTokenAccountStatePayload = {\n descriptor: Uint8Array;\n mint?: string;\n};\n\nexport type SolanaAltResolutionPayload = {\n descriptor: Uint8Array;\n resolvedAddress?: string;\n};\n\n// SOLANA_TRUSTED_NAME (generic flow, with 2-byte length prefix) is emitted by\n// SolanaTrustedNameContextLoader. SOLANA_BASIC_TRUSTED_NAME (basic flow, raw\n// bytes) is emitted by OwnerInfoContextLoader. Both carry `payload: Uint8Array`.\n"],
5
+ "mappings": "AAqFO,IAAKA,OACVA,IAAA,cAAgB,GAAhB,gBACAA,IAAA,gBAAkB,GAAlB,kBACAA,IAAA,UAAY,GAAZ,YACAA,IAAA,cAAgB,GAAhB,gBAJUA,OAAA",
6
6
  "names": ["SolanaInstructionSubstructureKind"]
7
7
  }
@@ -1,2 +1,2 @@
1
- var g=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var p=(i,t,o,r)=>{for(var e=r>1?void 0:r?l(t,o):t,n=i.length-1,s;n>=0;n--)(s=i[n])&&(e=(r?s(t,o,e):s(e))||e);return r&&e&&g(t,o,e),e},a=(i,t)=>(o,r)=>t(o,r,i);import{inject as u,injectable as f}from"inversify";import{Left as m,Right as k}from"purify-ts";import{configTypes as d}from"../../../../config/di/configTypes";import{networkTypes as y}from"../../../../shared/network/di/networkTypes";import{HexStringUtils as S}from"../../../../shared/utils/HexStringUtils";import{signedDescriptorDtoCodec as T}from"../../../../shared/utils/signedDescriptorDto";let c=class{constructor(t,o){this.config=t;this.http=o}async getTokenAccountState({tokenAccount:t,challenge:o}){let r;try{r=await this.http.get(`${this.config.metadataServiceDomain.url}/v2/solana/token-account-state/${t}`,{params:{challenge:o}})}catch(e){const n=e instanceof Error?e.message:String(e);return m(new Error(`[ContextModule] HttpTokenAccountStateDataSource: Failed to fetch token account state: ${n}`))}return T.decode(r).caseOf({Left:e=>m(new Error(`[ContextModule] HttpTokenAccountStateDataSource: malformed response for ${t}: ${e}`)),Right:e=>{let n;try{n=S.hexToBytes(e.signedDescriptor)}catch(s){return m(new Error(`[ContextModule] HttpTokenAccountStateDataSource: invalid hex in signedDescriptor for ${t}: ${s.message}`))}return k({tokenAccount:t,descriptor:n,mint:r.mint,keyId:e.keyId,keyUsage:e.keyUsage})}})}};c=p([f(),a(0,u(d.Config)),a(1,u(y.NetworkClient))],c);export{c as HttpTokenAccountStateDataSource};
1
+ var m=Object.defineProperty;var d=Object.getOwnPropertyDescriptor;var l=(i,t,o,r)=>{for(var e=r>1?void 0:r?d(t,o):t,n=i.length-1,a;n>=0;n--)(a=i[n])&&(e=(r?a(t,o,e):a(e))||e);return r&&e&&m(t,o,e),e},s=(i,t)=>(o,r)=>t(o,r,i);import{inject as g,injectable as f}from"inversify";import{Left as p,Right as k}from"purify-ts";import{configTypes as u}from"../../../../config/di/configTypes";import{networkTypes as S}from"../../../../shared/network/di/networkTypes";import{HexStringUtils as h}from"../../../../shared/utils/HexStringUtils";import{signedDescriptorDtoCodec as y}from"../../../../shared/utils/signedDescriptorDto";let c=class{constructor(t,o,r){this.config=t;this.http=r;this.logger=o("HttpTokenAccountStateDataSource")}logger;async getTokenAccountState({tokenAccount:t,challenge:o}){let r;try{r=await this.http.get(`${this.config.metadataServiceDomain.url}/v2/solana/token-account-state/${t}`,{params:{challenge:o}})}catch(e){const n=e instanceof Error?e.message:String(e);return p(new Error(`[ContextModule] HttpTokenAccountStateDataSource: Failed to fetch token account state: ${n}`))}return y.decode(r).caseOf({Left:e=>p(new Error(`[ContextModule] HttpTokenAccountStateDataSource: malformed response for ${t}: ${e}`)),Right:e=>{r.owner!==void 0&&r.mint===void 0&&this.logger.warn("[getTokenAccountState] response has owner but no mint \u2014 canonical-ATA check will fail and the OWNER binding will be dropped by the device",{data:{tokenAccount:t}});let n;try{n=h.hexToBytes(e.signedDescriptor)}catch(a){return p(new Error(`[ContextModule] HttpTokenAccountStateDataSource: invalid hex in signedDescriptor for ${t}: ${a.message}`))}return r.nativePreBalance===void 0&&this.logger.debug("[getTokenAccountState] nativePreBalance absent in response \u2014 native resets will not attest wrappable excess",{data:{tokenAccount:t}}),k({tokenAccount:t,descriptor:n,mint:r.mint,keyId:e.keyId,keyUsage:e.keyUsage})}})}};c=l([f(),s(0,g(u.Config)),s(1,g(u.ContextModuleLoggerFactory)),s(2,g(S.NetworkClient))],c);export{c as HttpTokenAccountStateDataSource};
2
2
  //# sourceMappingURL=HttpTokenAccountStateDataSource.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.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 GetTokenAccountStateParams,\n type TokenAccountStateDataSource,\n type TokenAccountStateResult,\n} from \"./TokenAccountStateDataSource\";\n\ntype TokenAccountStateResponseDto = {\n descriptorType?: string;\n descriptorVersion?: number;\n tokenAccount?: string;\n mint?: string;\n owner?: string;\n preBalance?: number;\n signedDescriptor: string;\n keyId: string;\n keyUsage: string;\n};\n\n@injectable()\nexport class HttpTokenAccountStateDataSource\n implements TokenAccountStateDataSource\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 getTokenAccountState({\n tokenAccount,\n challenge,\n }: GetTokenAccountStateParams): Promise<\n Either<Error, TokenAccountStateResult>\n > {\n let dto: TokenAccountStateResponseDto;\n try {\n dto = (await this.http.get(\n `${this.config.metadataServiceDomain.url}/v2/solana/token-account-state/${tokenAccount}`,\n { params: { challenge } },\n )) as TokenAccountStateResponseDto;\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n return Left(\n new Error(\n `[ContextModule] HttpTokenAccountStateDataSource: Failed to fetch token account state: ${reason}`,\n ),\n );\n }\n\n return signedDescriptorDtoCodec\n .decode(dto)\n .caseOf<Either<Error, TokenAccountStateResult>>({\n Left: (error) =>\n Left(\n new Error(\n `[ContextModule] HttpTokenAccountStateDataSource: malformed response for ${tokenAccount}: ${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] HttpTokenAccountStateDataSource: invalid hex in signedDescriptor for ${tokenAccount}: ${(error as Error).message}`,\n ),\n );\n }\n\n return Right({\n tokenAccount,\n descriptor,\n mint: dto.mint,\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,qBAAqB,CAChC,aAAAC,EACA,UAAAC,CACF,EAEE,CACA,IAAIC,EACJ,GAAI,CACFA,EAAO,MAAM,KAAK,KAAK,IACrB,GAAG,KAAK,OAAO,sBAAsB,GAAG,kCAAkCF,CAAY,GACtF,CAAE,OAAQ,CAAE,UAAAC,CAAU,CAAE,CAC1B,CACF,OAASE,EAAO,CACd,MAAMC,EAASD,aAAiB,MAAQA,EAAM,QAAU,OAAOA,CAAK,EACpE,OAAOE,EACL,IAAI,MACF,yFAAyFD,CAAM,EACjG,CACF,CACF,CAEA,OAAOE,EACJ,OAAOJ,CAAG,EACV,OAA+C,CAC9C,KAAOC,GACLE,EACE,IAAI,MACF,2EAA2EL,CAAY,KAAKG,CAAK,EACnG,CACF,EACF,MAAQI,GAAc,CACpB,IAAIC,EACJ,GAAI,CACFA,EAAaC,EAAe,WAAWF,EAAU,gBAAgB,CACnE,OAASJ,EAAO,CACd,OAAOE,EACL,IAAI,MACF,wFAAwFL,CAAY,KAAMG,EAAgB,OAAO,EACnI,CACF,CACF,CAEA,OAAOO,EAAM,CACX,aAAAV,EACA,WAAAQ,EACA,KAAMN,EAAI,KACV,MAAOK,EAAU,MACjB,SAAUA,EAAU,QACtB,CAAC,CACH,CACF,CAAC,CACL,CACF,EA9DaV,EAANc,EAAA,CADNC,EAAW,EAKPC,EAAA,EAAAC,EAAOC,EAAY,MAAM,GAEzBF,EAAA,EAAAC,EAAOE,EAAa,aAAa,IANzBnB",
6
- "names": ["inject", "injectable", "Left", "Right", "configTypes", "networkTypes", "HexStringUtils", "signedDescriptorDtoCodec", "HttpTokenAccountStateDataSource", "config", "http", "tokenAccount", "challenge", "dto", "error", "reason", "Left", "signedDescriptorDtoCodec", "validated", "descriptor", "HexStringUtils", "Right", "__decorateClass", "injectable", "__decorateParam", "inject", "configTypes", "networkTypes"]
4
+ "sourcesContent": ["import {\n DmkNetworkClient,\n LoggerPublisherService,\n} 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 GetTokenAccountStateParams,\n type TokenAccountStateDataSource,\n type TokenAccountStateResult,\n} from \"./TokenAccountStateDataSource\";\n\ntype TokenAccountStateResponseDto = {\n descriptorType?: string;\n descriptorVersion?: number;\n tokenAccount?: string;\n mint?: string;\n owner?: string;\n preBalance?: number;\n nativePreBalance?: number; // wrappable lamport excess; absent = old backend\n signedDescriptor: string;\n keyId: string;\n keyUsage: string;\n};\n\n@injectable()\nexport class HttpTokenAccountStateDataSource\n implements TokenAccountStateDataSource\n{\n private logger: LoggerPublisherService;\n\n constructor(\n @inject(configTypes.Config)\n private readonly config: ContextModuleServiceConfig,\n @inject(configTypes.ContextModuleLoggerFactory)\n loggerFactory: (tag: string) => LoggerPublisherService,\n @inject(networkTypes.NetworkClient)\n private readonly http: DmkNetworkClient,\n ) {\n this.logger = loggerFactory(\"HttpTokenAccountStateDataSource\");\n }\n\n public async getTokenAccountState({\n tokenAccount,\n challenge,\n }: GetTokenAccountStateParams): Promise<\n Either<Error, TokenAccountStateResult>\n > {\n let dto: TokenAccountStateResponseDto;\n try {\n dto = (await this.http.get(\n `${this.config.metadataServiceDomain.url}/v2/solana/token-account-state/${tokenAccount}`,\n { params: { challenge } },\n )) as TokenAccountStateResponseDto;\n } catch (error) {\n const reason = error instanceof Error ? error.message : String(error);\n return Left(\n new Error(\n `[ContextModule] HttpTokenAccountStateDataSource: Failed to fetch token account state: ${reason}`,\n ),\n );\n }\n\n return signedDescriptorDtoCodec\n .decode(dto)\n .caseOf<Either<Error, TokenAccountStateResult>>({\n Left: (error) =>\n Left(\n new Error(\n `[ContextModule] HttpTokenAccountStateDataSource: malformed response for ${tokenAccount}: ${error}`,\n ),\n ),\n Right: (validated) => {\n if (dto.owner !== undefined && dto.mint === undefined) {\n this.logger.warn(\n \"[getTokenAccountState] response has owner but no mint \u2014 \" +\n \"canonical-ATA check will fail and the OWNER binding will be dropped by the device\",\n { data: { tokenAccount } },\n );\n }\n\n let descriptor: Uint8Array;\n try {\n descriptor = HexStringUtils.hexToBytes(validated.signedDescriptor);\n } catch (error) {\n return Left(\n new Error(\n `[ContextModule] HttpTokenAccountStateDataSource: invalid hex in signedDescriptor for ${tokenAccount}: ${(error as Error).message}`,\n ),\n );\n }\n\n if (dto.nativePreBalance === undefined) {\n this.logger.debug(\n \"[getTokenAccountState] nativePreBalance absent in response \u2014 native resets will not attest wrappable excess\",\n { data: { tokenAccount } },\n );\n }\n\n return Right({\n tokenAccount,\n descriptor,\n mint: dto.mint,\n keyId: validated.keyId,\n keyUsage: validated.keyUsage,\n });\n },\n });\n }\n}\n"],
5
+ "mappings": "iOAIA,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,qCAsBlC,IAAMC,EAAN,KAEP,CAGE,YAEmBC,EAEjBC,EAEiBC,EACjB,CALiB,YAAAF,EAIA,UAAAE,EAEjB,KAAK,OAASD,EAAc,iCAAiC,CAC/D,CAXQ,OAaR,MAAa,qBAAqB,CAChC,aAAAE,EACA,UAAAC,CACF,EAEE,CACA,IAAIC,EACJ,GAAI,CACFA,EAAO,MAAM,KAAK,KAAK,IACrB,GAAG,KAAK,OAAO,sBAAsB,GAAG,kCAAkCF,CAAY,GACtF,CAAE,OAAQ,CAAE,UAAAC,CAAU,CAAE,CAC1B,CACF,OAASE,EAAO,CACd,MAAMC,EAASD,aAAiB,MAAQA,EAAM,QAAU,OAAOA,CAAK,EACpE,OAAOE,EACL,IAAI,MACF,yFAAyFD,CAAM,EACjG,CACF,CACF,CAEA,OAAOE,EACJ,OAAOJ,CAAG,EACV,OAA+C,CAC9C,KAAOC,GACLE,EACE,IAAI,MACF,2EAA2EL,CAAY,KAAKG,CAAK,EACnG,CACF,EACF,MAAQI,GAAc,CAChBL,EAAI,QAAU,QAAaA,EAAI,OAAS,QAC1C,KAAK,OAAO,KACV,iJAEA,CAAE,KAAM,CAAE,aAAAF,CAAa,CAAE,CAC3B,EAGF,IAAIQ,EACJ,GAAI,CACFA,EAAaC,EAAe,WAAWF,EAAU,gBAAgB,CACnE,OAASJ,EAAO,CACd,OAAOE,EACL,IAAI,MACF,wFAAwFL,CAAY,KAAMG,EAAgB,OAAO,EACnI,CACF,CACF,CAEA,OAAID,EAAI,mBAAqB,QAC3B,KAAK,OAAO,MACV,mHACA,CAAE,KAAM,CAAE,aAAAF,CAAa,CAAE,CAC3B,EAGKU,EAAM,CACX,aAAAV,EACA,WAAAQ,EACA,KAAMN,EAAI,KACV,MAAOK,EAAU,MACjB,SAAUA,EAAU,QACtB,CAAC,CACH,CACF,CAAC,CACL,CACF,EAnFaX,EAANe,EAAA,CADNC,EAAW,EAOPC,EAAA,EAAAC,EAAOC,EAAY,MAAM,GAEzBF,EAAA,EAAAC,EAAOC,EAAY,0BAA0B,GAE7CF,EAAA,EAAAC,EAAOE,EAAa,aAAa,IAVzBpB",
6
+ "names": ["inject", "injectable", "Left", "Right", "configTypes", "networkTypes", "HexStringUtils", "signedDescriptorDtoCodec", "HttpTokenAccountStateDataSource", "config", "loggerFactory", "http", "tokenAccount", "challenge", "dto", "error", "reason", "Left", "signedDescriptorDtoCodec", "validated", "descriptor", "HexStringUtils", "Right", "__decorateClass", "injectable", "__decorateParam", "inject", "configTypes", "networkTypes"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{Left as u,Right as d}from"purify-ts";import{beforeEach as l,describe as k,expect as a,it as r,vi as s}from"vitest";import{HttpTokenAccountStateDataSource as g}from"./HttpTokenAccountStateDataSource";k("HttpTokenAccountStateDataSource",()=>{let n,t;const o="TokenAccountAddrXXXXXXXXXXXXXXXXXXXXXXXXXXX",c="deadbeef",i={metadataServiceDomain:{url:"https://nft.api.ledger.com"}};l(()=>{s.clearAllMocks(),t={get:s.fn()},n=new g(i,t)}),r("calls the metadata endpoint with the challenge param",async()=>{t.get.mockResolvedValue({descriptorType:"token_account_state",signedDescriptor:"01020304",keyId:"tas_key",keyUsage:"coin_meta"}),await n.getTokenAccountState({tokenAccount:o,challenge:c}),a(t.get).toHaveBeenCalledWith(`https://nft.api.ledger.com/v2/solana/token-account-state/${o}`,{params:{challenge:c}})}),r("decodes signedDescriptor hex into Uint8Array",async()=>{t.get.mockResolvedValue({signedDescriptor:"deadbeef",keyId:"k",keyUsage:"u"});const e=await n.getTokenAccountState({tokenAccount:o,challenge:c});a(e).toEqual(d({tokenAccount:o,descriptor:new Uint8Array([222,173,190,239]),keyId:"k",keyUsage:"u"}))}),r("returns Left on malformed response (missing signedDescriptor)",async()=>{t.get.mockResolvedValue({keyId:"k",keyUsage:"u"});const e=await n.getTokenAccountState({tokenAccount:o,challenge:c});a(e.isLeft()).toBe(!0),a(e.extract().message).toMatch(new RegExp(String.raw`\[ContextModule\] HttpTokenAccountStateDataSource: malformed response for ${o}:`))}),r("returns Left when signedDescriptor is not valid hex",async()=>{t.get.mockResolvedValue({signedDescriptor:"ZZZZ",keyId:"k",keyUsage:"u"});const e=await n.getTokenAccountState({tokenAccount:o,challenge:c});a(e.isLeft()).toBe(!0),a(e.extract().message).toMatch(/invalid hex/)}),r("returns Left when HTTP client throws",async()=>{t.get.mockRejectedValue(new Error("net"));const e=await n.getTokenAccountState({tokenAccount:o,challenge:c});a(e).toEqual(u(new Error("[ContextModule] HttpTokenAccountStateDataSource: Failed to fetch token account state: net")))})});
1
+ import{Left as d,Right as u}from"purify-ts";import{beforeEach as g,describe as l,expect as e,it as X,vi as c}from"vitest";import{HttpTokenAccountStateDataSource as k}from"./HttpTokenAccountStateDataSource";const s={debug:c.fn(),info:c.fn(),warn:c.fn(),error:c.fn(),subscribers:[]},m=()=>s;l("HttpTokenAccountStateDataSource",()=>{let o,n;const t="TokenAccountAddrXXXXXXXXXXXXXXXXXXXXXXXXXXX",a="deadbeef",i={metadataServiceDomain:{url:"https://nft.api.ledger.com"}};g(()=>{c.clearAllMocks(),n={get:c.fn()},o=new k(i,m,n)}),X("calls the metadata endpoint with the challenge param",async()=>{n.get.mockResolvedValue({descriptorType:"token_account_state",signedDescriptor:"01020304",keyId:"tas_key",keyUsage:"coin_meta"}),await o.getTokenAccountState({tokenAccount:t,challenge:a}),e(n.get).toHaveBeenCalledWith(`https://nft.api.ledger.com/v2/solana/token-account-state/${t}`,{params:{challenge:a}})}),X("decodes signedDescriptor hex into Uint8Array",async()=>{n.get.mockResolvedValue({signedDescriptor:"deadbeef",keyId:"k",keyUsage:"u"});const r=await o.getTokenAccountState({tokenAccount:t,challenge:a});e(r).toEqual(u({tokenAccount:t,descriptor:new Uint8Array([222,173,190,239]),keyId:"k",keyUsage:"u"}))}),X("returns Left on malformed response (missing signedDescriptor)",async()=>{n.get.mockResolvedValue({keyId:"k",keyUsage:"u"});const r=await o.getTokenAccountState({tokenAccount:t,challenge:a});e(r.isLeft()).toBe(!0),e(r.extract().message).toMatch(new RegExp(String.raw`\[ContextModule\] HttpTokenAccountStateDataSource: malformed response for ${t}:`))}),X("returns Left when signedDescriptor is not valid hex",async()=>{n.get.mockResolvedValue({signedDescriptor:"ZZZZ",keyId:"k",keyUsage:"u"});const r=await o.getTokenAccountState({tokenAccount:t,challenge:a});e(r.isLeft()).toBe(!0),e(r.extract().message).toMatch(/invalid hex/)}),X("returns Left when HTTP client throws",async()=>{n.get.mockRejectedValue(new Error("net"));const r=await o.getTokenAccountState({tokenAccount:t,challenge:a});e(r).toEqual(d(new Error("[ContextModule] HttpTokenAccountStateDataSource: Failed to fetch token account state: net")))}),X("logs debug when nativePreBalance is absent",async()=>{n.get.mockResolvedValue({signedDescriptor:"deadbeef",keyId:"k",keyUsage:"u"}),await o.getTokenAccountState({tokenAccount:t,challenge:a}),e(s.debug).toHaveBeenCalledWith(e.stringContaining("nativePreBalance absent"),e.objectContaining({data:{tokenAccount:t}}))}),X("does not log debug when nativePreBalance is present",async()=>{n.get.mockResolvedValue({signedDescriptor:"deadbeef",keyId:"k",keyUsage:"u",nativePreBalance:1e3}),await o.getTokenAccountState({tokenAccount:t,challenge:a}),e(s.debug).not.toHaveBeenCalled()}),X("logs warn when owner is present but mint is absent",async()=>{n.get.mockResolvedValue({signedDescriptor:"deadbeef",keyId:"k",keyUsage:"u",owner:"OwnerPubkeyXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"}),await o.getTokenAccountState({tokenAccount:t,challenge:a}),e(s.warn).toHaveBeenCalledWith(e.stringContaining("owner but no mint"),e.objectContaining({data:{tokenAccount:t}}))}),X("does not log warn when both owner and mint are present",async()=>{n.get.mockResolvedValue({signedDescriptor:"deadbeef",keyId:"k",keyUsage:"u",owner:"OwnerPubkeyXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX",mint:"MintPubkeyXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"}),await o.getTokenAccountState({tokenAccount:t,challenge:a}),e(s.warn).not.toHaveBeenCalled()})});
2
2
  //# sourceMappingURL=HttpTokenAccountStateDataSource.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../../src/modules/solana/token-account-state/data/HttpTokenAccountStateDataSource.test.ts"],
4
- "sourcesContent": ["import { type DmkNetworkClient } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { type ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\n\nimport { HttpTokenAccountStateDataSource } from \"./HttpTokenAccountStateDataSource\";\nimport { type TokenAccountStateDataSource } from \"./TokenAccountStateDataSource\";\n\ndescribe(\"HttpTokenAccountStateDataSource\", () => {\n let datasource: TokenAccountStateDataSource;\n let httpMock: { get: ReturnType<typeof vi.fn> };\n const tokenAccount = \"TokenAccountAddrXXXXXXXXXXXXXXXXXXXXXXXXXXX\";\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 HttpTokenAccountStateDataSource(\n config,\n httpMock as unknown as DmkNetworkClient,\n );\n });\n\n it(\"calls the metadata endpoint with the challenge param\", async () => {\n httpMock.get.mockResolvedValue({\n descriptorType: \"token_account_state\",\n signedDescriptor: \"01020304\",\n keyId: \"tas_key\",\n keyUsage: \"coin_meta\",\n });\n\n await datasource.getTokenAccountState({ tokenAccount, challenge });\n\n expect(httpMock.get).toHaveBeenCalledWith(\n `https://nft.api.ledger.com/v2/solana/token-account-state/${tokenAccount}`,\n { params: { challenge } },\n );\n });\n\n it(\"decodes signedDescriptor hex into Uint8Array\", async () => {\n httpMock.get.mockResolvedValue({\n signedDescriptor: \"deadbeef\",\n keyId: \"k\",\n keyUsage: \"u\",\n });\n\n const result = await datasource.getTokenAccountState({\n tokenAccount,\n challenge,\n });\n\n expect(result).toEqual(\n Right({\n tokenAccount,\n descriptor: new Uint8Array([0xde, 0xad, 0xbe, 0xef]),\n keyId: \"k\",\n keyUsage: \"u\",\n }),\n );\n });\n\n it(\"returns Left on malformed response (missing signedDescriptor)\", async () => {\n httpMock.get.mockResolvedValue({ keyId: \"k\", keyUsage: \"u\" });\n\n const result = await datasource.getTokenAccountState({\n tokenAccount,\n challenge,\n });\n\n expect(result.isLeft()).toBe(true);\n expect((result.extract() as Error).message).toMatch(\n new RegExp(\n String.raw`\\[ContextModule\\] HttpTokenAccountStateDataSource: malformed response for ${tokenAccount}:`,\n ),\n );\n });\n\n it(\"returns Left when signedDescriptor is not valid hex\", async () => {\n httpMock.get.mockResolvedValue({\n signedDescriptor: \"ZZZZ\",\n keyId: \"k\",\n keyUsage: \"u\",\n });\n\n const result = await datasource.getTokenAccountState({\n tokenAccount,\n challenge,\n });\n\n expect(result.isLeft()).toBe(true);\n expect((result.extract() as Error).message).toMatch(/invalid hex/);\n });\n\n it(\"returns Left when HTTP client throws\", async () => {\n httpMock.get.mockRejectedValue(new Error(\"net\"));\n\n const result = await datasource.getTokenAccountState({\n tokenAccount,\n challenge,\n });\n\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] HttpTokenAccountStateDataSource: Failed to fetch token account state: net\",\n ),\n ),\n );\n });\n});\n"],
5
- "mappings": "AACA,OAAS,QAAAA,EAAM,SAAAC,MAAa,YAC5B,OAAS,cAAAC,EAAY,YAAAC,EAAU,UAAAC,EAAQ,MAAAC,EAAI,MAAAC,MAAU,SAIrD,OAAS,mCAAAC,MAAuC,oCAGhDJ,EAAS,kCAAmC,IAAM,CAChD,IAAIK,EACAC,EACJ,MAAMC,EAAe,8CACfC,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,uDAAwD,SAAY,CACrEI,EAAS,IAAI,kBAAkB,CAC7B,eAAgB,sBAChB,iBAAkB,WAClB,MAAO,UACP,SAAU,WACZ,CAAC,EAED,MAAMD,EAAW,qBAAqB,CAAE,aAAAE,EAAc,UAAAC,CAAU,CAAC,EAEjEP,EAAOK,EAAS,GAAG,EAAE,qBACnB,4DAA4DC,CAAY,GACxE,CAAE,OAAQ,CAAE,UAAAC,CAAU,CAAE,CAC1B,CACF,CAAC,EAEDN,EAAG,+CAAgD,SAAY,CAC7DI,EAAS,IAAI,kBAAkB,CAC7B,iBAAkB,WAClB,MAAO,IACP,SAAU,GACZ,CAAC,EAED,MAAMI,EAAS,MAAML,EAAW,qBAAqB,CACnD,aAAAE,EACA,UAAAC,CACF,CAAC,EAEDP,EAAOS,CAAM,EAAE,QACbZ,EAAM,CACJ,aAAAS,EACA,WAAY,IAAI,WAAW,CAAC,IAAM,IAAM,IAAM,GAAI,CAAC,EACnD,MAAO,IACP,SAAU,GACZ,CAAC,CACH,CACF,CAAC,EAEDL,EAAG,gEAAiE,SAAY,CAC9EI,EAAS,IAAI,kBAAkB,CAAE,MAAO,IAAK,SAAU,GAAI,CAAC,EAE5D,MAAMI,EAAS,MAAML,EAAW,qBAAqB,CACnD,aAAAE,EACA,UAAAC,CACF,CAAC,EAEDP,EAAOS,EAAO,OAAO,CAAC,EAAE,KAAK,EAAI,EACjCT,EAAQS,EAAO,QAAQ,EAAY,OAAO,EAAE,QAC1C,IAAI,OACF,OAAO,gFAAgFH,CAAY,GACrG,CACF,CACF,CAAC,EAEDL,EAAG,sDAAuD,SAAY,CACpEI,EAAS,IAAI,kBAAkB,CAC7B,iBAAkB,OAClB,MAAO,IACP,SAAU,GACZ,CAAC,EAED,MAAMI,EAAS,MAAML,EAAW,qBAAqB,CACnD,aAAAE,EACA,UAAAC,CACF,CAAC,EAEDP,EAAOS,EAAO,OAAO,CAAC,EAAE,KAAK,EAAI,EACjCT,EAAQS,EAAO,QAAQ,EAAY,OAAO,EAAE,QAAQ,aAAa,CACnE,CAAC,EAEDR,EAAG,uCAAwC,SAAY,CACrDI,EAAS,IAAI,kBAAkB,IAAI,MAAM,KAAK,CAAC,EAE/C,MAAMI,EAAS,MAAML,EAAW,qBAAqB,CACnD,aAAAE,EACA,UAAAC,CACF,CAAC,EAEDP,EAAOS,CAAM,EAAE,QACbb,EACE,IAAI,MACF,2FACF,CACF,CACF,CACF,CAAC,CACH,CAAC",
6
- "names": ["Left", "Right", "beforeEach", "describe", "expect", "it", "vi", "HttpTokenAccountStateDataSource", "datasource", "httpMock", "tokenAccount", "challenge", "config", "result"]
4
+ "sourcesContent": ["import { type DmkNetworkClient } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { type ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\n\nimport { HttpTokenAccountStateDataSource } from \"./HttpTokenAccountStateDataSource\";\nimport { type TokenAccountStateDataSource } from \"./TokenAccountStateDataSource\";\n\nconst mockLogger = {\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n};\nconst mockLoggerFactory = () => mockLogger;\n\ndescribe(\"HttpTokenAccountStateDataSource\", () => {\n let datasource: TokenAccountStateDataSource;\n let httpMock: { get: ReturnType<typeof vi.fn> };\n const tokenAccount = \"TokenAccountAddrXXXXXXXXXXXXXXXXXXXXXXXXXXX\";\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 HttpTokenAccountStateDataSource(\n config,\n mockLoggerFactory,\n httpMock as unknown as DmkNetworkClient,\n );\n });\n\n it(\"calls the metadata endpoint with the challenge param\", async () => {\n httpMock.get.mockResolvedValue({\n descriptorType: \"token_account_state\",\n signedDescriptor: \"01020304\",\n keyId: \"tas_key\",\n keyUsage: \"coin_meta\",\n });\n\n await datasource.getTokenAccountState({ tokenAccount, challenge });\n\n expect(httpMock.get).toHaveBeenCalledWith(\n `https://nft.api.ledger.com/v2/solana/token-account-state/${tokenAccount}`,\n { params: { challenge } },\n );\n });\n\n it(\"decodes signedDescriptor hex into Uint8Array\", async () => {\n httpMock.get.mockResolvedValue({\n signedDescriptor: \"deadbeef\",\n keyId: \"k\",\n keyUsage: \"u\",\n });\n\n const result = await datasource.getTokenAccountState({\n tokenAccount,\n challenge,\n });\n\n expect(result).toEqual(\n Right({\n tokenAccount,\n descriptor: new Uint8Array([0xde, 0xad, 0xbe, 0xef]),\n keyId: \"k\",\n keyUsage: \"u\",\n }),\n );\n });\n\n it(\"returns Left on malformed response (missing signedDescriptor)\", async () => {\n httpMock.get.mockResolvedValue({ keyId: \"k\", keyUsage: \"u\" });\n\n const result = await datasource.getTokenAccountState({\n tokenAccount,\n challenge,\n });\n\n expect(result.isLeft()).toBe(true);\n expect((result.extract() as Error).message).toMatch(\n new RegExp(\n String.raw`\\[ContextModule\\] HttpTokenAccountStateDataSource: malformed response for ${tokenAccount}:`,\n ),\n );\n });\n\n it(\"returns Left when signedDescriptor is not valid hex\", async () => {\n httpMock.get.mockResolvedValue({\n signedDescriptor: \"ZZZZ\",\n keyId: \"k\",\n keyUsage: \"u\",\n });\n\n const result = await datasource.getTokenAccountState({\n tokenAccount,\n challenge,\n });\n\n expect(result.isLeft()).toBe(true);\n expect((result.extract() as Error).message).toMatch(/invalid hex/);\n });\n\n it(\"returns Left when HTTP client throws\", async () => {\n httpMock.get.mockRejectedValue(new Error(\"net\"));\n\n const result = await datasource.getTokenAccountState({\n tokenAccount,\n challenge,\n });\n\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] HttpTokenAccountStateDataSource: Failed to fetch token account state: net\",\n ),\n ),\n );\n });\n\n it(\"logs debug when nativePreBalance is absent\", async () => {\n httpMock.get.mockResolvedValue({\n signedDescriptor: \"deadbeef\",\n keyId: \"k\",\n keyUsage: \"u\",\n });\n\n await datasource.getTokenAccountState({ tokenAccount, challenge });\n\n expect(mockLogger.debug).toHaveBeenCalledWith(\n expect.stringContaining(\"nativePreBalance absent\"),\n expect.objectContaining({ data: { tokenAccount } }),\n );\n });\n\n it(\"does not log debug when nativePreBalance is present\", async () => {\n httpMock.get.mockResolvedValue({\n signedDescriptor: \"deadbeef\",\n keyId: \"k\",\n keyUsage: \"u\",\n nativePreBalance: 1000,\n });\n\n await datasource.getTokenAccountState({ tokenAccount, challenge });\n\n expect(mockLogger.debug).not.toHaveBeenCalled();\n });\n\n it(\"logs warn when owner is present but mint is absent\", async () => {\n httpMock.get.mockResolvedValue({\n signedDescriptor: \"deadbeef\",\n keyId: \"k\",\n keyUsage: \"u\",\n owner: \"OwnerPubkeyXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\",\n });\n\n await datasource.getTokenAccountState({ tokenAccount, challenge });\n\n expect(mockLogger.warn).toHaveBeenCalledWith(\n expect.stringContaining(\"owner but no mint\"),\n expect.objectContaining({ data: { tokenAccount } }),\n );\n });\n\n it(\"does not log warn when both owner and mint are present\", async () => {\n httpMock.get.mockResolvedValue({\n signedDescriptor: \"deadbeef\",\n keyId: \"k\",\n keyUsage: \"u\",\n owner: \"OwnerPubkeyXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\",\n mint: \"MintPubkeyXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX\",\n });\n\n await datasource.getTokenAccountState({ tokenAccount, challenge });\n\n expect(mockLogger.warn).not.toHaveBeenCalled();\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["Left", "Right", "beforeEach", "describe", "expect", "it", "vi", "HttpTokenAccountStateDataSource", "mockLogger", "mockLoggerFactory", "datasource", "httpMock", "tokenAccount", "challenge", "config", "result"]
7
7
  }
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=TronTransactionContext.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": [],
4
+ "sourcesContent": [],
5
+ "mappings": "",
6
+ "names": []
7
+ }
@@ -0,0 +1,2 @@
1
+ var d=Object.defineProperty;var l=Object.getOwnPropertyDescriptor;var f=(i,e,t,o)=>{for(var r=o>1?void 0:o?l(e,t):e,n=i.length-1,s;n>=0;n--)(s=i[n])&&(r=(o?s(e,t,r):s(r))||r);return o&&r&&d(e,t,r),r},c=(i,e)=>(t,o)=>e(t,o,i);import{inject as m,injectable as k}from"inversify";import{Left as p,Right as g}from"purify-ts";import{configTypes as h}from"../../../../config/di/configTypes";import{tokenDataResponsesCodec as u}from"../../../../modules/tron/token/data/TokenDataSource";import{networkTypes as y}from"../../../../shared/network/di/networkTypes";let a=class{constructor(e,t){this.config=e;this.http=t}async getTokenInfosPayload({assetId:e}){const t=()=>p(new Error(`[ContextModule] HttpTokenDataSource: no token metadata for asset id ${e}`));try{const o=await this.http.get(`${this.config.cal.url}/tokens`,{params:{id:`tron/trc10/${e}`,output:"id,ticker,decimals,descriptor",ref:`branch:${this.config.cal.branch}`}});return u.decode(o).caseOf({Left:t,Right:r=>{const n=r[0]?.descriptor.signatures[this.config.cal.mode];return n===void 0||n.length===0?t():g(n)}})}catch{return p(new Error("[ContextModule] HttpTokenDataSource: Failed to fetch token informations"))}}};a=f([k(),c(0,m(h.Config)),c(1,m(y.NetworkClient))],a);export{a as HttpTokenDataSource};
2
+ //# sourceMappingURL=HttpTokenDataSource.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/modules/tron/token/data/HttpTokenDataSource.ts"],
4
+ "sourcesContent": ["import { DmkNetworkClient } from \"@ledgerhq/device-management-kit\";\nimport { inject, injectable } from \"inversify\";\nimport { type Either, Left, Right } from \"purify-ts\";\n\nimport { configTypes } from \"@/config/di/configTypes\";\nimport { type ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\nimport {\n type GetTokenInfosParams,\n tokenDataResponsesCodec,\n type TokenDataSource,\n} from \"@/modules/tron/token/data/TokenDataSource\";\nimport { networkTypes } from \"@/shared/network/di/networkTypes\";\n\n@injectable()\nexport class HttpTokenDataSource implements TokenDataSource {\n constructor(\n @inject(configTypes.Config)\n private readonly config: ContextModuleServiceConfig,\n @inject(networkTypes.NetworkClient)\n private readonly http: DmkNetworkClient,\n ) {}\n\n /**\n * Unlike the EVM descriptor, which is assembled from `descriptor.data` plus a\n * signature, the whole TRC10 payload the device expects is the signature\n * field: a protobuf `TokenDetails` the app checks against its built-in key.\n * `descriptor.data` is empty for these entries.\n */\n public async getTokenInfosPayload({\n assetId,\n }: GetTokenInfosParams): Promise<Either<Error, string>> {\n const noTokenMetadata = () =>\n Left(\n new Error(\n `[ContextModule] HttpTokenDataSource: no token metadata for asset id ${assetId}`,\n ),\n );\n\n try {\n const response = await this.http.get(`${this.config.cal.url}/tokens`, {\n params: {\n id: `tron/trc10/${assetId}`,\n output: \"id,ticker,decimals,descriptor\",\n ref: `branch:${this.config.cal.branch}`,\n },\n });\n\n return tokenDataResponsesCodec.decode(response).caseOf({\n Left: noTokenMetadata,\n Right: (entries) => {\n const payload =\n entries[0]?.descriptor.signatures[this.config.cal.mode];\n\n return payload === undefined || payload.length === 0\n ? noTokenMetadata()\n : Right(payload);\n },\n });\n } catch (_error) {\n return Left(\n new Error(\n \"[ContextModule] HttpTokenDataSource: Failed to fetch token informations\",\n ),\n );\n }\n }\n}\n"],
5
+ "mappings": "iOACA,OAAS,UAAAA,EAAQ,cAAAC,MAAkB,YACnC,OAAsB,QAAAC,EAAM,SAAAC,MAAa,YAEzC,OAAS,eAAAC,MAAmB,0BAE5B,OAEE,2BAAAC,MAEK,4CACP,OAAS,gBAAAC,MAAoB,mCAGtB,IAAMC,EAAN,KAAqD,CAC1D,YAEmBC,EAEAC,EACjB,CAHiB,YAAAD,EAEA,UAAAC,CAChB,CAQH,MAAa,qBAAqB,CAChC,QAAAC,CACF,EAAwD,CACtD,MAAMC,EAAkB,IACtBC,EACE,IAAI,MACF,uEAAuEF,CAAO,EAChF,CACF,EAEF,GAAI,CACF,MAAMG,EAAW,MAAM,KAAK,KAAK,IAAI,GAAG,KAAK,OAAO,IAAI,GAAG,UAAW,CACpE,OAAQ,CACN,GAAI,cAAcH,CAAO,GACzB,OAAQ,gCACR,IAAK,UAAU,KAAK,OAAO,IAAI,MAAM,EACvC,CACF,CAAC,EAED,OAAOI,EAAwB,OAAOD,CAAQ,EAAE,OAAO,CACrD,KAAMF,EACN,MAAQI,GAAY,CAClB,MAAMC,EACJD,EAAQ,CAAC,GAAG,WAAW,WAAW,KAAK,OAAO,IAAI,IAAI,EAExD,OAAOC,IAAY,QAAaA,EAAQ,SAAW,EAC/CL,EAAgB,EAChBM,EAAMD,CAAO,CACnB,CACF,CAAC,CACH,MAAiB,CACf,OAAOJ,EACL,IAAI,MACF,yEACF,CACF,CACF,CACF,CACF,EApDaL,EAANW,EAAA,CADNC,EAAW,EAGPC,EAAA,EAAAC,EAAOC,EAAY,MAAM,GAEzBF,EAAA,EAAAC,EAAOE,EAAa,aAAa,IAJzBhB",
6
+ "names": ["inject", "injectable", "Left", "Right", "configTypes", "tokenDataResponsesCodec", "networkTypes", "HttpTokenDataSource", "config", "http", "assetId", "noTokenMetadata", "Left", "response", "tokenDataResponsesCodec", "entries", "payload", "Right", "__decorateClass", "injectable", "__decorateParam", "inject", "configTypes", "networkTypes"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{Left as s,Right as p}from"purify-ts";import{beforeEach as g,describe as k,expect as a,it as n,vi as c}from"vitest";import{HttpTokenDataSource as m}from"./HttpTokenDataSource";k("HttpTokenDataSource",()=>{let r,t;const o="1002000",d={cal:{url:"https://global.api.prd.ledger.com/cal/v1",mode:"prod",branch:"main"}},i=e=>[{id:`tron/trc10/${o}`,ticker:"BTTOLD",decimals:6,descriptor:{data:"",descriptorType:"token",signatures:e}}];g(()=>{c.clearAllMocks(),t={get:c.fn()},r=new m(d,t)}),n("should call http.get with the correct url and params",async()=>{t.get.mockResolvedValue([]),await r.getTokenInfosPayload({assetId:o}),a(t.get).toHaveBeenCalledWith("https://global.api.prd.ledger.com/cal/v1/tokens",{params:{id:"tron/trc10/1002000",output:"id,ticker,decimals,descriptor",ref:"branch:main"}})}),n("should return the signature matching the configured mode",async()=>{t.get.mockResolvedValue(i({prod:"prod-sig",test:"test-sig"}));const e=await r.getTokenInfosPayload({assetId:o});a(e).toEqual(p("prod-sig"))}),n("should return an error when no token matches",async()=>{t.get.mockResolvedValue([]);const e=await r.getTokenInfosPayload({assetId:o});a(e).toEqual(s(new Error("[ContextModule] HttpTokenDataSource: no token metadata for asset id 1002000")))}),n("should return an error when the descriptor carries no signature",async()=>{t.get.mockResolvedValue(i({prod:"",test:"test-sig"}));const e=await r.getTokenInfosPayload({assetId:o});a(e).toEqual(s(new Error("[ContextModule] HttpTokenDataSource: no token metadata for asset id 1002000")))}),n.each([["the response is not a list",{descriptor:{}}],["an entry carries no descriptor",[{id:`tron/trc10/${o}`}]],["the descriptor carries no signature field",[{descriptor:{data:"",descriptorType:"token"}}]],["a signature is not a string",[{descriptor:{signatures:{prod:42,test:"test-sig"}}}]]])("should return an error when %s",async(e,l)=>{t.get.mockResolvedValue(l);const u=await r.getTokenInfosPayload({assetId:o});a(u).toEqual(s(new Error("[ContextModule] HttpTokenDataSource: no token metadata for asset id 1002000")))}),n("should return an error when the request fails",async()=>{t.get.mockRejectedValue(new Error("network"));const e=await r.getTokenInfosPayload({assetId:o});a(e).toEqual(s(new Error("[ContextModule] HttpTokenDataSource: Failed to fetch token informations")))})});
2
+ //# sourceMappingURL=HttpTokenDataSource.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/modules/tron/token/data/HttpTokenDataSource.test.ts"],
4
+ "sourcesContent": ["import { type DmkNetworkClient } from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { type ContextModuleServiceConfig } from \"@/config/model/ContextModuleConfig\";\n\nimport { HttpTokenDataSource } from \"./HttpTokenDataSource\";\nimport { type TokenDataSource } from \"./TokenDataSource\";\n\ndescribe(\"HttpTokenDataSource\", () => {\n let datasource: TokenDataSource;\n let httpMock: { get: ReturnType<typeof vi.fn> };\n const assetId = \"1002000\";\n const config: ContextModuleServiceConfig = {\n cal: {\n url: \"https://global.api.prd.ledger.com/cal/v1\",\n mode: \"prod\",\n branch: \"main\",\n },\n } as ContextModuleServiceConfig;\n\n const response = (signatures: { prod: string; test: string }) => [\n {\n id: `tron/trc10/${assetId}`,\n ticker: \"BTTOLD\",\n decimals: 6,\n descriptor: { data: \"\", descriptorType: \"token\", signatures },\n },\n ];\n\n beforeEach(() => {\n vi.clearAllMocks();\n httpMock = { get: vi.fn() };\n datasource = new HttpTokenDataSource(\n config,\n httpMock as unknown as DmkNetworkClient,\n );\n });\n\n it(\"should call http.get with the correct url and params\", async () => {\n httpMock.get.mockResolvedValue([]);\n\n await datasource.getTokenInfosPayload({ assetId });\n\n expect(httpMock.get).toHaveBeenCalledWith(\n \"https://global.api.prd.ledger.com/cal/v1/tokens\",\n {\n params: {\n id: \"tron/trc10/1002000\",\n output: \"id,ticker,decimals,descriptor\",\n ref: \"branch:main\",\n },\n },\n );\n });\n\n it(\"should return the signature matching the configured mode\", async () => {\n httpMock.get.mockResolvedValue(\n response({ prod: \"prod-sig\", test: \"test-sig\" }),\n );\n\n const result = await datasource.getTokenInfosPayload({ assetId });\n\n expect(result).toEqual(Right(\"prod-sig\"));\n });\n\n it(\"should return an error when no token matches\", async () => {\n httpMock.get.mockResolvedValue([]);\n\n const result = await datasource.getTokenInfosPayload({ assetId });\n\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] HttpTokenDataSource: no token metadata for asset id 1002000\",\n ),\n ),\n );\n });\n\n it(\"should return an error when the descriptor carries no signature\", async () => {\n httpMock.get.mockResolvedValue(response({ prod: \"\", test: \"test-sig\" }));\n\n const result = await datasource.getTokenInfosPayload({ assetId });\n\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] HttpTokenDataSource: no token metadata for asset id 1002000\",\n ),\n ),\n );\n });\n\n it.each([\n [\"the response is not a list\", { descriptor: {} }],\n [\"an entry carries no descriptor\", [{ id: `tron/trc10/${assetId}` }]],\n [\n \"the descriptor carries no signature field\",\n [{ descriptor: { data: \"\", descriptorType: \"token\" } }],\n ],\n [\n \"a signature is not a string\",\n [{ descriptor: { signatures: { prod: 42, test: \"test-sig\" } } }],\n ],\n ])(\"should return an error when %s\", async (_case, payload) => {\n httpMock.get.mockResolvedValue(payload);\n\n const result = await datasource.getTokenInfosPayload({ assetId });\n\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] HttpTokenDataSource: no token metadata for asset id 1002000\",\n ),\n ),\n );\n });\n\n it(\"should return an error when the request fails\", async () => {\n httpMock.get.mockRejectedValue(new Error(\"network\"));\n\n const result = await datasource.getTokenInfosPayload({ assetId });\n\n expect(result).toEqual(\n Left(\n new Error(\n \"[ContextModule] HttpTokenDataSource: Failed to fetch token informations\",\n ),\n ),\n );\n });\n});\n"],
5
+ "mappings": "AACA,OAAS,QAAAA,EAAM,SAAAC,MAAa,YAC5B,OAAS,cAAAC,EAAY,YAAAC,EAAU,UAAAC,EAAQ,MAAAC,EAAI,MAAAC,MAAU,SAIrD,OAAS,uBAAAC,MAA2B,wBAGpCJ,EAAS,sBAAuB,IAAM,CACpC,IAAIK,EACAC,EACJ,MAAMC,EAAU,UACVC,EAAqC,CACzC,IAAK,CACH,IAAK,2CACL,KAAM,OACN,OAAQ,MACV,CACF,EAEMC,EAAYC,GAA+C,CAC/D,CACE,GAAI,cAAcH,CAAO,GACzB,OAAQ,SACR,SAAU,EACV,WAAY,CAAE,KAAM,GAAI,eAAgB,QAAS,WAAAG,CAAW,CAC9D,CACF,EAEAX,EAAW,IAAM,CACfI,EAAG,cAAc,EACjBG,EAAW,CAAE,IAAKH,EAAG,GAAG,CAAE,EAC1BE,EAAa,IAAID,EACfI,EACAF,CACF,CACF,CAAC,EAEDJ,EAAG,uDAAwD,SAAY,CACrEI,EAAS,IAAI,kBAAkB,CAAC,CAAC,EAEjC,MAAMD,EAAW,qBAAqB,CAAE,QAAAE,CAAQ,CAAC,EAEjDN,EAAOK,EAAS,GAAG,EAAE,qBACnB,kDACA,CACE,OAAQ,CACN,GAAI,qBACJ,OAAQ,gCACR,IAAK,aACP,CACF,CACF,CACF,CAAC,EAEDJ,EAAG,2DAA4D,SAAY,CACzEI,EAAS,IAAI,kBACXG,EAAS,CAAE,KAAM,WAAY,KAAM,UAAW,CAAC,CACjD,EAEA,MAAME,EAAS,MAAMN,EAAW,qBAAqB,CAAE,QAAAE,CAAQ,CAAC,EAEhEN,EAAOU,CAAM,EAAE,QAAQb,EAAM,UAAU,CAAC,CAC1C,CAAC,EAEDI,EAAG,+CAAgD,SAAY,CAC7DI,EAAS,IAAI,kBAAkB,CAAC,CAAC,EAEjC,MAAMK,EAAS,MAAMN,EAAW,qBAAqB,CAAE,QAAAE,CAAQ,CAAC,EAEhEN,EAAOU,CAAM,EAAE,QACbd,EACE,IAAI,MACF,6EACF,CACF,CACF,CACF,CAAC,EAEDK,EAAG,kEAAmE,SAAY,CAChFI,EAAS,IAAI,kBAAkBG,EAAS,CAAE,KAAM,GAAI,KAAM,UAAW,CAAC,CAAC,EAEvE,MAAME,EAAS,MAAMN,EAAW,qBAAqB,CAAE,QAAAE,CAAQ,CAAC,EAEhEN,EAAOU,CAAM,EAAE,QACbd,EACE,IAAI,MACF,6EACF,CACF,CACF,CACF,CAAC,EAEDK,EAAG,KAAK,CACN,CAAC,6BAA8B,CAAE,WAAY,CAAC,CAAE,CAAC,EACjD,CAAC,iCAAkC,CAAC,CAAE,GAAI,cAAcK,CAAO,EAAG,CAAC,CAAC,EACpE,CACE,4CACA,CAAC,CAAE,WAAY,CAAE,KAAM,GAAI,eAAgB,OAAQ,CAAE,CAAC,CACxD,EACA,CACE,8BACA,CAAC,CAAE,WAAY,CAAE,WAAY,CAAE,KAAM,GAAI,KAAM,UAAW,CAAE,CAAE,CAAC,CACjE,CACF,CAAC,EAAE,iCAAkC,MAAOK,EAAOC,IAAY,CAC7DP,EAAS,IAAI,kBAAkBO,CAAO,EAEtC,MAAMF,EAAS,MAAMN,EAAW,qBAAqB,CAAE,QAAAE,CAAQ,CAAC,EAEhEN,EAAOU,CAAM,EAAE,QACbd,EACE,IAAI,MACF,6EACF,CACF,CACF,CACF,CAAC,EAEDK,EAAG,gDAAiD,SAAY,CAC9DI,EAAS,IAAI,kBAAkB,IAAI,MAAM,SAAS,CAAC,EAEnD,MAAMK,EAAS,MAAMN,EAAW,qBAAqB,CAAE,QAAAE,CAAQ,CAAC,EAEhEN,EAAOU,CAAM,EAAE,QACbd,EACE,IAAI,MACF,yEACF,CACF,CACF,CACF,CAAC,CACH,CAAC",
6
+ "names": ["Left", "Right", "beforeEach", "describe", "expect", "it", "vi", "HttpTokenDataSource", "datasource", "httpMock", "assetId", "config", "response", "signatures", "result", "_case", "payload"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{array as t,Codec as e,string as r}from"purify-ts";const a=t(e.interface({descriptor:e.interface({signatures:e.interface({prod:r,test:r})})}));export{a as tokenDataResponsesCodec};
2
+ //# sourceMappingURL=TokenDataSource.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/modules/tron/token/data/TokenDataSource.ts"],
4
+ "sourcesContent": ["import { array, Codec, type Either, string } from \"purify-ts\";\n\nexport type GetTokenInfosParams = {\n assetId: string;\n};\n\n/**\n * Only the fields the payload is read from are validated: a CAL change to the\n * ones we ignore must not downgrade a signable descriptor to a blind signature.\n */\nexport const tokenDataResponsesCodec = array(\n Codec.interface({\n descriptor: Codec.interface({\n signatures: Codec.interface({\n prod: string,\n test: string,\n }),\n }),\n }),\n);\n\nexport interface TokenDataSource {\n getTokenInfosPayload(\n params: GetTokenInfosParams,\n ): Promise<Either<Error, string>>;\n}\n"],
5
+ "mappings": "AAAA,OAAS,SAAAA,EAAO,SAAAC,EAAoB,UAAAC,MAAc,YAU3C,MAAMC,EAA0BH,EACrCC,EAAM,UAAU,CACd,WAAYA,EAAM,UAAU,CAC1B,WAAYA,EAAM,UAAU,CAC1B,KAAMC,EACN,KAAMA,CACR,CAAC,CACH,CAAC,CACH,CAAC,CACH",
6
+ "names": ["array", "Codec", "string", "tokenDataResponsesCodec"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{ContainerModule as e}from"inversify";import{HttpTokenDataSource as r}from"../../../../modules/tron/token/data/HttpTokenDataSource";import{tokenTypes as t}from"../../../../modules/tron/token/di/tokenTypes";import{TokenContextLoader as n}from"../../../../modules/tron/token/domain/TokenContextLoader";const T=()=>new e(({bind:o})=>{o(t.TokenDataSource).to(r),o(t.TokenContextLoader).to(n)});export{T as tokenModuleFactory};
2
+ //# sourceMappingURL=tokenModuleFactory.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/modules/tron/token/di/tokenModuleFactory.ts"],
4
+ "sourcesContent": ["import { ContainerModule } from \"inversify\";\n\nimport { HttpTokenDataSource } from \"@/modules/tron/token/data/HttpTokenDataSource\";\nimport { tokenTypes } from \"@/modules/tron/token/di/tokenTypes\";\nimport { TokenContextLoader } from \"@/modules/tron/token/domain/TokenContextLoader\";\n\nexport const tokenModuleFactory = () =>\n new ContainerModule(({ bind }) => {\n bind(tokenTypes.TokenDataSource).to(HttpTokenDataSource);\n bind(tokenTypes.TokenContextLoader).to(TokenContextLoader);\n });\n"],
5
+ "mappings": "AAAA,OAAS,mBAAAA,MAAuB,YAEhC,OAAS,uBAAAC,MAA2B,gDACpC,OAAS,cAAAC,MAAkB,qCAC3B,OAAS,sBAAAC,MAA0B,iDAE5B,MAAMC,EAAqB,IAChC,IAAIJ,EAAgB,CAAC,CAAE,KAAAK,CAAK,IAAM,CAChCA,EAAKH,EAAW,eAAe,EAAE,GAAGD,CAAmB,EACvDI,EAAKH,EAAW,kBAAkB,EAAE,GAAGC,CAAkB,CAC3D,CAAC",
6
+ "names": ["ContainerModule", "HttpTokenDataSource", "tokenTypes", "TokenContextLoader", "tokenModuleFactory", "bind"]
7
+ }
@@ -0,0 +1,2 @@
1
+ const o={TokenDataSource:Symbol.for("TokenDataSource"),TokenContextLoader:Symbol.for("TokenContextLoader")};export{o as tokenTypes};
2
+ //# sourceMappingURL=tokenTypes.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/modules/tron/token/di/tokenTypes.ts"],
4
+ "sourcesContent": ["export const tokenTypes = {\n TokenDataSource: Symbol.for(\"TokenDataSource\"),\n TokenContextLoader: Symbol.for(\"TokenContextLoader\"),\n};\n"],
5
+ "mappings": "AAAO,MAAMA,EAAa,CACxB,gBAAiB,OAAO,IAAI,iBAAiB,EAC7C,mBAAoB,OAAO,IAAI,oBAAoB,CACrD",
6
+ "names": ["tokenTypes"]
7
+ }
@@ -0,0 +1,2 @@
1
+ var l=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var T=(a,t,n,o)=>{for(var e=o>1?void 0:o?y(t,n):t,i=a.length-1,s;i>=0;i--)(s=a[i])&&(e=(o?s(t,n,e):s(e))||e);return o&&e&&l(t,n,e),e},p=(a,t)=>(n,o)=>t(n,o,a);import{inject as m,injectable as C}from"inversify";import{tokenTypes as f}from"../../../../modules/tron/token/di/tokenTypes";import{parseTrc10AssetId as S}from"../../../../modules/tron/token/domain/parseTrc10AssetId";import{ClearSignContextType as c}from"../../../../shared/model/ClearSignContext";const d=[c.TRON_TOKEN];let r=class{constructor(t){this.dataSource=t}canHandle(t,n){return d.every(o=>n.includes(o))&&typeof t=="object"&&t!==null&&"rawTransaction"in t&&t.rawTransaction instanceof Uint8Array&&t.rawTransaction.length>0}async load({rawTransaction:t}){const n=S(t);return n===void 0?[]:(await this.dataSource.getTokenInfosPayload({assetId:n})).caseOf({Left:e=>[{type:c.ERROR,error:e}],Right:e=>[{type:c.TRON_TOKEN,payload:e}]})}};r=T([C(),p(0,m(f.TokenDataSource))],r);export{r as TokenContextLoader};
2
+ //# sourceMappingURL=TokenContextLoader.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/modules/tron/token/domain/TokenContextLoader.ts"],
4
+ "sourcesContent": ["import { inject, injectable } from \"inversify\";\n\nimport { type TronTransactionContext } from \"@/modules/tron/model/TronTransactionContext\";\nimport { type TokenDataSource } from \"@/modules/tron/token/data/TokenDataSource\";\nimport { tokenTypes } from \"@/modules/tron/token/di/tokenTypes\";\nimport { parseTrc10AssetId } from \"@/modules/tron/token/domain/parseTrc10AssetId\";\nimport { type ContextLoader } from \"@/shared/domain/ContextLoader\";\nimport {\n type ClearSignContext,\n ClearSignContextType,\n} from \"@/shared/model/ClearSignContext\";\n\nconst SUPPORTED_TYPES: ClearSignContextType[] = [\n ClearSignContextType.TRON_TOKEN,\n];\n\n@injectable()\nexport class TokenContextLoader\n implements ContextLoader<TronTransactionContext>\n{\n constructor(\n @inject(tokenTypes.TokenDataSource)\n private readonly dataSource: TokenDataSource,\n ) {}\n\n canHandle(\n input: unknown,\n expectedTypes: ClearSignContextType[],\n ): input is TronTransactionContext {\n return (\n SUPPORTED_TYPES.every((type) => expectedTypes.includes(type)) &&\n typeof input === \"object\" &&\n input !== null &&\n \"rawTransaction\" in input &&\n input.rawTransaction instanceof Uint8Array &&\n input.rawTransaction.length > 0\n );\n }\n\n /**\n * A transaction carrying no TRC10 transfer yields no context rather than an\n * error: the device reviews it unchanged, which is the normal outcome for\n * every TRX and TRC20 transfer.\n */\n async load({\n rawTransaction,\n }: TronTransactionContext): Promise<ClearSignContext[]> {\n const assetId = parseTrc10AssetId(rawTransaction);\n if (assetId === undefined) return [];\n\n const payload = await this.dataSource.getTokenInfosPayload({ assetId });\n\n return payload.caseOf({\n Left: (error): ClearSignContext[] => [\n { type: ClearSignContextType.ERROR, error },\n ],\n Right: (value): ClearSignContext[] => [\n { type: ClearSignContextType.TRON_TOKEN, payload: value },\n ],\n });\n }\n}\n"],
5
+ "mappings": "iOAAA,OAAS,UAAAA,EAAQ,cAAAC,MAAkB,YAInC,OAAS,cAAAC,MAAkB,qCAC3B,OAAS,qBAAAC,MAAyB,gDAElC,OAEE,wBAAAC,MACK,kCAEP,MAAMC,EAA0C,CAC9CC,EAAqB,UACvB,EAGO,IAAMC,EAAN,KAEP,CACE,YAEmBC,EACjB,CADiB,gBAAAA,CAChB,CAEH,UACEC,EACAC,EACiC,CACjC,OACEL,EAAgB,MAAOM,GAASD,EAAc,SAASC,CAAI,CAAC,GAC5D,OAAOF,GAAU,UACjBA,IAAU,MACV,mBAAoBA,GACpBA,EAAM,0BAA0B,YAChCA,EAAM,eAAe,OAAS,CAElC,CAOA,MAAM,KAAK,CACT,eAAAG,CACF,EAAwD,CACtD,MAAMC,EAAUC,EAAkBF,CAAc,EAChD,OAAIC,IAAY,OAAkB,CAAC,GAEnB,MAAM,KAAK,WAAW,qBAAqB,CAAE,QAAAA,CAAQ,CAAC,GAEvD,OAAO,CACpB,KAAOE,GAA8B,CACnC,CAAE,KAAMT,EAAqB,MAAO,MAAAS,CAAM,CAC5C,EACA,MAAQC,GAA8B,CACpC,CAAE,KAAMV,EAAqB,WAAY,QAASU,CAAM,CAC1D,CACF,CAAC,CACH,CACF,EA5CaT,EAANU,EAAA,CADNC,EAAW,EAKPC,EAAA,EAAAC,EAAOC,EAAW,eAAe,IAJzBd",
6
+ "names": ["inject", "injectable", "tokenTypes", "parseTrc10AssetId", "ClearSignContextType", "SUPPORTED_TYPES", "ClearSignContextType", "TokenContextLoader", "dataSource", "input", "expectedTypes", "type", "rawTransaction", "assetId", "parseTrc10AssetId", "error", "value", "__decorateClass", "injectable", "__decorateParam", "inject", "tokenTypes"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{Left as i,Right as b}from"purify-ts";import{beforeEach as u,describe as s,expect as o,it as t,vi as d}from"vitest";import{ClearSignContextType as c}from"../../../../shared/model/ClearSignContext";import{TokenContextLoader as h}from"./TokenContextLoader";const T=a=>Uint8Array.from(a.match(/.{2}/g).map(e=>parseInt(e,16))),r=T("0a023dce220895da42177db005074080d095ffbc315a75080212710a32747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e5472616e736665724173736574436f6e7472616374123b0a0731303032303030121541c8599111f29c1e1e061265b4af93ea1f274ad78a1a154114183f3bbca4ae9fc1de55b9bbe2d071942dc1a62087ad4b70a0fb91ffbc31"),p=T("0a023dce220895da42177db0050740d8e0a5feed2d522c43727970746f436861696e2d54726f6e5352204c6564676572205472616e73616374696f6e732054657374735a68080112640a2d747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e5472616e73666572436f6e747261637412330a1541c8599111f29c1e1e061265b4af93ea1f274ad78a121541c8599111f29c1e1e061265b4af93ea1f274ad78a1880c2d72f709d94a2feed2d"),l="0a0a426974546f7272656e7410061a46304402202e2502f36b00e57be785fc79ec4043abcdd4fdd1b58d737ce123599dffad2cb602201702c307f009d014a553503b499591558b3634ceee4c054c61cedd8aca94c02b";s("TokenContextLoader",()=>{let a,e;u(()=>{d.restoreAllMocks(),a={getTokenInfosPayload:d.fn()},e=new h(a)}),s("canHandle",()=>{t("should handle a raw transaction when the token type is expected",()=>{o(e.canHandle({rawTransaction:r},[c.TRON_TOKEN])).toBe(!0)}),t("should not handle it when the token type is not expected",()=>{o(e.canHandle({rawTransaction:r},[c.ETHEREUM_TOKEN])).toBe(!1)}),t.each([["null",null],["an empty object",{}],["a hex string",{rawTransaction:"0a023dce"}],["an empty transaction",{rawTransaction:new Uint8Array}]])("should not handle %s",(n,f)=>{o(e.canHandle(f,[c.TRON_TOKEN])).toBe(!1)})}),s("load",()=>{t("should return the token context of a TRC10 transfer",async()=>{d.spyOn(a,"getTokenInfosPayload").mockResolvedValue(b(l));const n=await e.load({rawTransaction:r});o(a.getTokenInfosPayload).toHaveBeenCalledWith({assetId:"1002000"}),o(n).toEqual([{type:c.TRON_TOKEN,payload:l}])}),t("should return no context and not call CAL when the transaction holds no TRC10 transfer",async()=>{const n=await e.load({rawTransaction:p});o(n).toEqual([]),o(a.getTokenInfosPayload).not.toHaveBeenCalled()}),t("should return an error context when the token is unknown to CAL",async()=>{const n=new Error("not found");d.spyOn(a,"getTokenInfosPayload").mockResolvedValue(i(n));const f=await e.load({rawTransaction:r});o(f).toEqual([{type:c.ERROR,error:n}])})})});
2
+ //# sourceMappingURL=TokenContextLoader.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/modules/tron/token/domain/TokenContextLoader.test.ts"],
4
+ "sourcesContent": ["import { Left, Right } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { type TokenDataSource } from \"@/modules/tron/token/data/TokenDataSource\";\nimport { ClearSignContextType } from \"@/shared/model/ClearSignContext\";\n\nimport { TokenContextLoader } from \"./TokenContextLoader\";\n\nconst fromHex = (hex: string) =>\n Uint8Array.from(hex.match(/.{2}/g)!.map((byte) => parseInt(byte, 16)));\n\n// TransferAssetContract, asset_name \"1002000\".\nconst TRC10_TRANSFER = fromHex(\n \"0a023dce220895da42177db005074080d095ffbc315a75080212710a32747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e5472616e736665724173736574436f6e7472616374123b0a0731303032303030121541c8599111f29c1e1e061265b4af93ea1f274ad78a1a154114183f3bbca4ae9fc1de55b9bbe2d071942dc1a62087ad4b70a0fb91ffbc31\",\n);\n\n// Plain TRX TransferContract.\nconst TRX_TRANSFER = fromHex(\n \"0a023dce220895da42177db0050740d8e0a5feed2d522c43727970746f436861696e2d54726f6e5352204c6564676572205472616e73616374696f6e732054657374735a68080112640a2d747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e5472616e73666572436f6e747261637412330a1541c8599111f29c1e1e061265b4af93ea1f274ad78a121541c8599111f29c1e1e061265b4af93ea1f274ad78a1880c2d72f709d94a2feed2d\",\n);\n\nconst PAYLOAD =\n \"0a0a426974546f7272656e7410061a46304402202e2502f36b00e57be785fc79ec4043abcdd4fdd1b58d737ce123599dffad2cb602201702c307f009d014a553503b499591558b3634ceee4c054c61cedd8aca94c02b\";\n\ndescribe(\"TokenContextLoader\", () => {\n let dataSource: TokenDataSource;\n let loader: TokenContextLoader;\n\n beforeEach(() => {\n vi.restoreAllMocks();\n dataSource = {\n getTokenInfosPayload: vi.fn(),\n } as unknown as TokenDataSource;\n loader = new TokenContextLoader(dataSource);\n });\n\n describe(\"canHandle\", () => {\n it(\"should handle a raw transaction when the token type is expected\", () => {\n expect(\n loader.canHandle({ rawTransaction: TRC10_TRANSFER }, [\n ClearSignContextType.TRON_TOKEN,\n ]),\n ).toBe(true);\n });\n\n it(\"should not handle it when the token type is not expected\", () => {\n expect(\n loader.canHandle({ rawTransaction: TRC10_TRANSFER }, [\n ClearSignContextType.ETHEREUM_TOKEN,\n ]),\n ).toBe(false);\n });\n\n it.each([\n [\"null\", null],\n [\"an empty object\", {}],\n [\"a hex string\", { rawTransaction: \"0a023dce\" }],\n [\"an empty transaction\", { rawTransaction: new Uint8Array() }],\n ])(\"should not handle %s\", (_label, input) => {\n expect(loader.canHandle(input, [ClearSignContextType.TRON_TOKEN])).toBe(\n false,\n );\n });\n });\n\n describe(\"load\", () => {\n it(\"should return the token context of a TRC10 transfer\", async () => {\n vi.spyOn(dataSource, \"getTokenInfosPayload\").mockResolvedValue(\n Right(PAYLOAD),\n );\n\n const result = await loader.load({ rawTransaction: TRC10_TRANSFER });\n\n expect(dataSource.getTokenInfosPayload).toHaveBeenCalledWith({\n assetId: \"1002000\",\n });\n expect(result).toEqual([\n { type: ClearSignContextType.TRON_TOKEN, payload: PAYLOAD },\n ]);\n });\n\n it(\"should return no context and not call CAL when the transaction holds no TRC10 transfer\", async () => {\n const result = await loader.load({ rawTransaction: TRX_TRANSFER });\n\n expect(result).toEqual([]);\n expect(dataSource.getTokenInfosPayload).not.toHaveBeenCalled();\n });\n\n it(\"should return an error context when the token is unknown to CAL\", async () => {\n const error = new Error(\"not found\");\n vi.spyOn(dataSource, \"getTokenInfosPayload\").mockResolvedValue(\n Left(error),\n );\n\n const result = await loader.load({ rawTransaction: TRC10_TRANSFER });\n\n expect(result).toEqual([{ type: ClearSignContextType.ERROR, error }]);\n });\n });\n});\n"],
5
+ "mappings": "AAAA,OAAS,QAAAA,EAAM,SAAAC,MAAa,YAC5B,OAAS,cAAAC,EAAY,YAAAC,EAAU,UAAAC,EAAQ,MAAAC,EAAI,MAAAC,MAAU,SAGrD,OAAS,wBAAAC,MAA4B,kCAErC,OAAS,sBAAAC,MAA0B,uBAEnC,MAAMC,EAAWC,GACf,WAAW,KAAKA,EAAI,MAAM,OAAO,EAAG,IAAKC,GAAS,SAASA,EAAM,EAAE,CAAC,CAAC,EAGjEC,EAAiBH,EACrB,wSACF,EAGMI,EAAeJ,EACnB,0WACF,EAEMK,EACJ,+KAEFX,EAAS,qBAAsB,IAAM,CACnC,IAAIY,EACAC,EAEJd,EAAW,IAAM,CACfI,EAAG,gBAAgB,EACnBS,EAAa,CACX,qBAAsBT,EAAG,GAAG,CAC9B,EACAU,EAAS,IAAIR,EAAmBO,CAAU,CAC5C,CAAC,EAEDZ,EAAS,YAAa,IAAM,CAC1BE,EAAG,kEAAmE,IAAM,CAC1ED,EACEY,EAAO,UAAU,CAAE,eAAgBJ,CAAe,EAAG,CACnDL,EAAqB,UACvB,CAAC,CACH,EAAE,KAAK,EAAI,CACb,CAAC,EAEDF,EAAG,2DAA4D,IAAM,CACnED,EACEY,EAAO,UAAU,CAAE,eAAgBJ,CAAe,EAAG,CACnDL,EAAqB,cACvB,CAAC,CACH,EAAE,KAAK,EAAK,CACd,CAAC,EAEDF,EAAG,KAAK,CACN,CAAC,OAAQ,IAAI,EACb,CAAC,kBAAmB,CAAC,CAAC,EACtB,CAAC,eAAgB,CAAE,eAAgB,UAAW,CAAC,EAC/C,CAAC,uBAAwB,CAAE,eAAgB,IAAI,UAAa,CAAC,CAC/D,CAAC,EAAE,uBAAwB,CAACY,EAAQC,IAAU,CAC5Cd,EAAOY,EAAO,UAAUE,EAAO,CAACX,EAAqB,UAAU,CAAC,CAAC,EAAE,KACjE,EACF,CACF,CAAC,CACH,CAAC,EAEDJ,EAAS,OAAQ,IAAM,CACrBE,EAAG,sDAAuD,SAAY,CACpEC,EAAG,MAAMS,EAAY,sBAAsB,EAAE,kBAC3Cd,EAAMa,CAAO,CACf,EAEA,MAAMK,EAAS,MAAMH,EAAO,KAAK,CAAE,eAAgBJ,CAAe,CAAC,EAEnER,EAAOW,EAAW,oBAAoB,EAAE,qBAAqB,CAC3D,QAAS,SACX,CAAC,EACDX,EAAOe,CAAM,EAAE,QAAQ,CACrB,CAAE,KAAMZ,EAAqB,WAAY,QAASO,CAAQ,CAC5D,CAAC,CACH,CAAC,EAEDT,EAAG,yFAA0F,SAAY,CACvG,MAAMc,EAAS,MAAMH,EAAO,KAAK,CAAE,eAAgBH,CAAa,CAAC,EAEjET,EAAOe,CAAM,EAAE,QAAQ,CAAC,CAAC,EACzBf,EAAOW,EAAW,oBAAoB,EAAE,IAAI,iBAAiB,CAC/D,CAAC,EAEDV,EAAG,kEAAmE,SAAY,CAChF,MAAMe,EAAQ,IAAI,MAAM,WAAW,EACnCd,EAAG,MAAMS,EAAY,sBAAsB,EAAE,kBAC3Cf,EAAKoB,CAAK,CACZ,EAEA,MAAMD,EAAS,MAAMH,EAAO,KAAK,CAAE,eAAgBJ,CAAe,CAAC,EAEnER,EAAOe,CAAM,EAAE,QAAQ,CAAC,CAAE,KAAMZ,EAAqB,MAAO,MAAAa,CAAM,CAAC,CAAC,CACtE,CAAC,CACH,CAAC,CACH,CAAC",
6
+ "names": ["Left", "Right", "beforeEach", "describe", "expect", "it", "vi", "ClearSignContextType", "TokenContextLoader", "fromHex", "hex", "byte", "TRC10_TRANSFER", "TRX_TRANSFER", "PAYLOAD", "dataSource", "loader", "_label", "input", "result", "error"]
7
+ }
@@ -0,0 +1,2 @@
1
+ function E(t,i){let e=0,n=1;for(let d=0;d<10;d++){const r=t[i+d];if(r===void 0)return;if(e+=(r&127)*n,(r&128)===0)return{value:e,next:i+d+1};n*=128}}function a(t,i){const e=E(t,i);if(e===void 0)return;const n=Math.floor(e.value/8),d=e.value%8;switch(d){case 0:{const r=E(t,e.next);return r===void 0?void 0:{fieldNumber:n,wireType:d,value:r.value,next:r.next}}case 2:{const r=E(t,e.next);if(r===void 0)return;const u=r.next+r.value;return u>t.length?void 0:{fieldNumber:n,wireType:d,data:t.subarray(r.next,u),next:u}}case 1:case 5:{const r=e.next+(d===1?8:4);return r>t.length?void 0:{fieldNumber:n,wireType:d,next:r}}default:return}}function f(t,i){let e=0;for(;e<t.length;){const n=a(t,e);if(n===void 0)return;if(n.fieldNumber===i&&n.data!==void 0)return n.data;e=n.next}}function I(t,i){let e=0;for(;e<t.length;){const n=a(t,e);if(n===void 0)return;if(n.fieldNumber===i&&n.wireType===0)return n.value;e=n.next}}function T(t){const i=f(t,11);if(i===void 0||I(i,1)!==2)return;const e=f(i,2);if(e===void 0)return;const n=f(e,2);if(n===void 0)return;const d=f(n,1);if(!(d===void 0||d.length===0||!d.every(u=>u>=48&&u<=57)))return String.fromCharCode(...d)}export{T as parseTrc10AssetId};
2
+ //# sourceMappingURL=parseTrc10AssetId.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/modules/tron/token/domain/parseTrc10AssetId.ts"],
4
+ "sourcesContent": ["/**\n * Extracts the TRC10 asset id from a serialized Tron `Transaction.raw`.\n *\n * The asset id travels in the transaction itself, so a TRC10 transfer is\n * recognisable without the caller naming the token.\n *\n * Field numbers follow app-tron's `proto/core/Tron.proto` and\n * `proto/core/Contract.proto`.\n */\n\nconst CONTRACT_FIELD = 11; // Transaction.raw.contract\nconst CONTRACT_TYPE_FIELD = 1; // Transaction.Contract.type\nconst CONTRACT_PARAMETER_FIELD = 2; // Transaction.Contract.parameter\nconst ANY_VALUE_FIELD = 2; // google.protobuf.Any.value\nconst ASSET_NAME_FIELD = 1; // TransferAssetContract.asset_name\n\nconst TRANSFER_ASSET_CONTRACT = 2; // Transaction.Contract.ContractType\n\nconst WIRE_VARINT = 0;\nconst WIRE_64BIT = 1;\nconst WIRE_LENGTH_DELIMITED = 2;\nconst WIRE_32BIT = 5;\n\nconst MAX_VARINT_BYTES = 10;\nconst ASCII_ZERO = 0x30;\nconst ASCII_NINE = 0x39;\n\ntype Varint = { value: number; next: number };\n\ntype ProtobufField = {\n fieldNumber: number;\n wireType: number;\n data?: Uint8Array;\n value?: number;\n next: number;\n};\n\n/**\n * Values above 2^53 lose precision, which is harmless here: the only decoded\n * value ever compared is the contract type, and oversized varints (amounts,\n * timestamps) are read solely to know where the next field starts.\n */\nfunction readVarint(bytes: Uint8Array, offset: number): Varint | undefined {\n let value = 0;\n let shift = 1;\n for (let i = 0; i < MAX_VARINT_BYTES; i++) {\n const byte = bytes[offset + i];\n if (byte === undefined) return undefined;\n value += (byte & 0x7f) * shift;\n if ((byte & 0x80) === 0) return { value, next: offset + i + 1 };\n shift *= 128;\n }\n return undefined;\n}\n\nfunction readField(\n bytes: Uint8Array,\n offset: number,\n): ProtobufField | undefined {\n const key = readVarint(bytes, offset);\n if (key === undefined) return undefined;\n\n const fieldNumber = Math.floor(key.value / 8);\n const wireType = key.value % 8;\n\n switch (wireType) {\n case WIRE_VARINT: {\n const varint = readVarint(bytes, key.next);\n if (varint === undefined) return undefined;\n return { fieldNumber, wireType, value: varint.value, next: varint.next };\n }\n case WIRE_LENGTH_DELIMITED: {\n const length = readVarint(bytes, key.next);\n if (length === undefined) return undefined;\n const end = length.next + length.value;\n if (end > bytes.length) return undefined;\n return {\n fieldNumber,\n wireType,\n data: bytes.subarray(length.next, end),\n next: end,\n };\n }\n case WIRE_64BIT:\n case WIRE_32BIT: {\n const end = key.next + (wireType === WIRE_64BIT ? 8 : 4);\n if (end > bytes.length) return undefined;\n return { fieldNumber, wireType, next: end };\n }\n default:\n return undefined;\n }\n}\n\nfunction findLengthDelimited(\n bytes: Uint8Array,\n fieldNumber: number,\n): Uint8Array | undefined {\n let offset = 0;\n while (offset < bytes.length) {\n const field = readField(bytes, offset);\n if (field === undefined) return undefined;\n if (field.fieldNumber === fieldNumber && field.data !== undefined) {\n return field.data;\n }\n offset = field.next;\n }\n return undefined;\n}\n\nfunction findVarint(\n bytes: Uint8Array,\n fieldNumber: number,\n): number | undefined {\n let offset = 0;\n while (offset < bytes.length) {\n const field = readField(bytes, offset);\n if (field === undefined) return undefined;\n if (field.fieldNumber === fieldNumber && field.wireType === WIRE_VARINT) {\n return field.value;\n }\n offset = field.next;\n }\n return undefined;\n}\n\n/**\n * Returns the TRC10 asset id, or `undefined` when the transaction is not a\n * TRC10 transfer. Native TRX rides on the same contract with an `_` asset\n * name, and is rejected here along with any malformed payload.\n */\nexport function parseTrc10AssetId(\n rawTransaction: Uint8Array,\n): string | undefined {\n const contract = findLengthDelimited(rawTransaction, CONTRACT_FIELD);\n if (contract === undefined) return undefined;\n\n if (findVarint(contract, CONTRACT_TYPE_FIELD) !== TRANSFER_ASSET_CONTRACT) {\n return undefined;\n }\n\n const parameter = findLengthDelimited(contract, CONTRACT_PARAMETER_FIELD);\n if (parameter === undefined) return undefined;\n\n const value = findLengthDelimited(parameter, ANY_VALUE_FIELD);\n if (value === undefined) return undefined;\n\n const assetName = findLengthDelimited(value, ASSET_NAME_FIELD);\n if (assetName === undefined || assetName.length === 0) return undefined;\n\n const isAssetId = assetName.every(\n (byte) => byte >= ASCII_ZERO && byte <= ASCII_NINE,\n );\n if (!isAssetId) return undefined;\n\n return String.fromCharCode(...assetName);\n}\n"],
5
+ "mappings": "AA0CA,SAASA,EAAWC,EAAmBC,EAAoC,CACzE,IAAIC,EAAQ,EACRC,EAAQ,EACZ,QAASC,EAAI,EAAGA,EAAI,GAAkBA,IAAK,CACzC,MAAMC,EAAOL,EAAMC,EAASG,CAAC,EAC7B,GAAIC,IAAS,OAAW,OAExB,GADAH,IAAUG,EAAO,KAAQF,GACpBE,EAAO,OAAU,EAAG,MAAO,CAAE,MAAAH,EAAO,KAAMD,EAASG,EAAI,CAAE,EAC9DD,GAAS,GACX,CAEF,CAEA,SAASG,EACPN,EACAC,EAC2B,CAC3B,MAAMM,EAAMR,EAAWC,EAAOC,CAAM,EACpC,GAAIM,IAAQ,OAAW,OAEvB,MAAMC,EAAc,KAAK,MAAMD,EAAI,MAAQ,CAAC,EACtCE,EAAWF,EAAI,MAAQ,EAE7B,OAAQE,EAAU,CAChB,IAAK,GAAa,CAChB,MAAMC,EAASX,EAAWC,EAAOO,EAAI,IAAI,EACzC,OAAIG,IAAW,OAAW,OACnB,CAAE,YAAAF,EAAa,SAAAC,EAAU,MAAOC,EAAO,MAAO,KAAMA,EAAO,IAAK,CACzE,CACA,IAAK,GAAuB,CAC1B,MAAMC,EAASZ,EAAWC,EAAOO,EAAI,IAAI,EACzC,GAAII,IAAW,OAAW,OAC1B,MAAMC,EAAMD,EAAO,KAAOA,EAAO,MACjC,OAAIC,EAAMZ,EAAM,OAAQ,OACjB,CACL,YAAAQ,EACA,SAAAC,EACA,KAAMT,EAAM,SAASW,EAAO,KAAMC,CAAG,EACrC,KAAMA,CACR,CACF,CACA,IAAK,GACL,IAAK,GAAY,CACf,MAAMA,EAAML,EAAI,MAAQE,IAAa,EAAa,EAAI,GACtD,OAAIG,EAAMZ,EAAM,OAAQ,OACjB,CAAE,YAAAQ,EAAa,SAAAC,EAAU,KAAMG,CAAI,CAC5C,CACA,QACE,MACJ,CACF,CAEA,SAASC,EACPb,EACAQ,EACwB,CACxB,IAAIP,EAAS,EACb,KAAOA,EAASD,EAAM,QAAQ,CAC5B,MAAMc,EAAQR,EAAUN,EAAOC,CAAM,EACrC,GAAIa,IAAU,OAAW,OACzB,GAAIA,EAAM,cAAgBN,GAAeM,EAAM,OAAS,OACtD,OAAOA,EAAM,KAEfb,EAASa,EAAM,IACjB,CAEF,CAEA,SAASC,EACPf,EACAQ,EACoB,CACpB,IAAIP,EAAS,EACb,KAAOA,EAASD,EAAM,QAAQ,CAC5B,MAAMc,EAAQR,EAAUN,EAAOC,CAAM,EACrC,GAAIa,IAAU,OAAW,OACzB,GAAIA,EAAM,cAAgBN,GAAeM,EAAM,WAAa,EAC1D,OAAOA,EAAM,MAEfb,EAASa,EAAM,IACjB,CAEF,CAOO,SAASE,EACdC,EACoB,CACpB,MAAMC,EAAWL,EAAoBI,EAAgB,EAAc,EAGnE,GAFIC,IAAa,QAEbH,EAAWG,EAAU,CAAmB,IAAM,EAChD,OAGF,MAAMC,EAAYN,EAAoBK,EAAU,CAAwB,EACxE,GAAIC,IAAc,OAAW,OAE7B,MAAMjB,EAAQW,EAAoBM,EAAW,CAAe,EAC5D,GAAIjB,IAAU,OAAW,OAEzB,MAAMkB,EAAYP,EAAoBX,EAAO,CAAgB,EAM7D,GALI,EAAAkB,IAAc,QAAaA,EAAU,SAAW,GAKhD,CAHcA,EAAU,MACzBf,GAASA,GAAQ,IAAcA,GAAQ,EAC1C,GAGA,OAAO,OAAO,aAAa,GAAGe,CAAS,CACzC",
6
+ "names": ["readVarint", "bytes", "offset", "value", "shift", "i", "byte", "readField", "key", "fieldNumber", "wireType", "varint", "length", "end", "findLengthDelimited", "field", "findVarint", "parseTrc10AssetId", "rawTransaction", "contract", "parameter", "assetName"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{describe as r,expect as e,it as f}from"vitest";import{parseTrc10AssetId as a}from"./parseTrc10AssetId";const d=c=>Uint8Array.from(c.match(/.{2}/g).map(t=>parseInt(t,16))),n="0a023dce220895da42177db005074080d095ffbc315a75080212710a32747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e5472616e736665724173736574436f6e7472616374123b0a0731303032303030121541c8599111f29c1e1e061265b4af93ea1f274ad78a1a154114183f3bbca4ae9fc1de55b9bbe2d071942dc1a62087ad4b70a0fb91ffbc31",b="0a023dce220895da42177db005074080d095ffbc315aae01081f12a9010a31747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e54726967676572536d617274436f6e747261637412740a1541c8599111f29c1e1e061265b4af93ea1f274ad78a121541a614f803b6fd780986a42c78ec9c7f77e6ded13c2244a9059cbb00000000000000000000000014183f3bbca4ae9fc1de55b9bbe2d071942dc1a60000000000000000000000000000000000000000000000000000000000bc614e70a0fb91ffbc31900180c2d72f",o="0a023dce220895da42177db0050740d8e0a5feed2d522c43727970746f436861696e2d54726f6e5352204c6564676572205472616e73616374696f6e732054657374735a68080112640a2d747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e5472616e73666572436f6e747261637412330a1541c8599111f29c1e1e061265b4af93ea1f274ad78a121541c8599111f29c1e1e061265b4af93ea1f274ad78a1880c2d72f709d94a2feed2d",s="0a023dce220895da42177db005074080d095ffbc315a6e0802126a0a32747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e5472616e736665724173736574436f6e747261637412340a015f121541c8599111f29c1e1e061265b4af93ea1f274ad78a1a154114183f3bbca4ae9fc1de55b9bbe2d071942dc1a620e80770a0fb91ffbc31";r("parseTrc10AssetId",()=>{f("should return the asset id of a TRC10 transfer",()=>{e(a(d(n))).toBe("1002000")}),f("should return undefined for a TRC20 transfer",()=>{e(a(d(b))).toBeUndefined()}),f("should return undefined for a plain TRX transfer",()=>{e(a(d(o))).toBeUndefined()}),f("should return undefined when the asset name is the native TRX marker",()=>{e(a(d(s))).toBeUndefined()}),f("should return undefined for an empty transaction",()=>{e(a(new Uint8Array)).toBeUndefined()}),f("should return undefined for a truncated transaction",()=>{const c=d(n).subarray(0,40);e(a(c)).toBeUndefined()}),f("should return undefined for bytes that are not protobuf",()=>{e(a(d("ffffffffffffffffffff"))).toBeUndefined()})});
2
+ //# sourceMappingURL=parseTrc10AssetId.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../../src/modules/tron/token/domain/parseTrc10AssetId.test.ts"],
4
+ "sourcesContent": ["import { describe, expect, it } from \"vitest\";\n\nimport { parseTrc10AssetId } from \"./parseTrc10AssetId\";\n\nconst fromHex = (hex: string) =>\n Uint8Array.from(hex.match(/.{2}/g)!.map((byte) => parseInt(byte, 16)));\n\n// TransferAssetContract, asset_name \"1002000\" (BitTorrent), amount 1234567.\nconst TRC10_TRANSFER =\n \"0a023dce220895da42177db005074080d095ffbc315a75080212710a32747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e5472616e736665724173736574436f6e7472616374123b0a0731303032303030121541c8599111f29c1e1e061265b4af93ea1f274ad78a1a154114183f3bbca4ae9fc1de55b9bbe2d071942dc1a62087ad4b70a0fb91ffbc31\";\n\n// TriggerSmartContract calling transfer(address,uint256) on USDT.\nconst TRC20_TRANSFER =\n \"0a023dce220895da42177db005074080d095ffbc315aae01081f12a9010a31747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e54726967676572536d617274436f6e747261637412740a1541c8599111f29c1e1e061265b4af93ea1f274ad78a121541a614f803b6fd780986a42c78ec9c7f77e6ded13c2244a9059cbb00000000000000000000000014183f3bbca4ae9fc1de55b9bbe2d071942dc1a60000000000000000000000000000000000000000000000000000000000bc614e70a0fb91ffbc31900180c2d72f\";\n\n// Plain TRX TransferContract, from the hw-app-trx vector.\nconst TRX_TRANSFER =\n \"0a023dce220895da42177db0050740d8e0a5feed2d522c43727970746f436861696e2d54726f6e5352204c6564676572205472616e73616374696f6e732054657374735a68080112640a2d747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e5472616e73666572436f6e747261637412330a1541c8599111f29c1e1e061265b4af93ea1f274ad78a121541c8599111f29c1e1e061265b4af93ea1f274ad78a1880c2d72f709d94a2feed2d\";\n\n// TransferAssetContract whose asset_name is \"_\", the native-TRX marker.\nconst NATIVE_TRX_ASSET =\n \"0a023dce220895da42177db005074080d095ffbc315a6e0802126a0a32747970652e676f6f676c65617069732e636f6d2f70726f746f636f6c2e5472616e736665724173736574436f6e747261637412340a015f121541c8599111f29c1e1e061265b4af93ea1f274ad78a1a154114183f3bbca4ae9fc1de55b9bbe2d071942dc1a620e80770a0fb91ffbc31\";\n\ndescribe(\"parseTrc10AssetId\", () => {\n it(\"should return the asset id of a TRC10 transfer\", () => {\n expect(parseTrc10AssetId(fromHex(TRC10_TRANSFER))).toBe(\"1002000\");\n });\n\n it(\"should return undefined for a TRC20 transfer\", () => {\n expect(parseTrc10AssetId(fromHex(TRC20_TRANSFER))).toBeUndefined();\n });\n\n it(\"should return undefined for a plain TRX transfer\", () => {\n expect(parseTrc10AssetId(fromHex(TRX_TRANSFER))).toBeUndefined();\n });\n\n it(\"should return undefined when the asset name is the native TRX marker\", () => {\n expect(parseTrc10AssetId(fromHex(NATIVE_TRX_ASSET))).toBeUndefined();\n });\n\n it(\"should return undefined for an empty transaction\", () => {\n expect(parseTrc10AssetId(new Uint8Array())).toBeUndefined();\n });\n\n it(\"should return undefined for a truncated transaction\", () => {\n const truncated = fromHex(TRC10_TRANSFER).subarray(0, 40);\n expect(parseTrc10AssetId(truncated)).toBeUndefined();\n });\n\n it(\"should return undefined for bytes that are not protobuf\", () => {\n expect(parseTrc10AssetId(fromHex(\"ffffffffffffffffffff\"))).toBeUndefined();\n });\n});\n"],
5
+ "mappings": "AAAA,OAAS,YAAAA,EAAU,UAAAC,EAAQ,MAAAC,MAAU,SAErC,OAAS,qBAAAC,MAAyB,sBAElC,MAAMC,EAAWC,GACf,WAAW,KAAKA,EAAI,MAAM,OAAO,EAAG,IAAKC,GAAS,SAASA,EAAM,EAAE,CAAC,CAAC,EAGjEC,EACJ,ySAGIC,EACJ,yaAGIC,EACJ,2WAGIC,EACJ,2RAEFV,EAAS,oBAAqB,IAAM,CAClCE,EAAG,iDAAkD,IAAM,CACzDD,EAAOE,EAAkBC,EAAQG,CAAc,CAAC,CAAC,EAAE,KAAK,SAAS,CACnE,CAAC,EAEDL,EAAG,+CAAgD,IAAM,CACvDD,EAAOE,EAAkBC,EAAQI,CAAc,CAAC,CAAC,EAAE,cAAc,CACnE,CAAC,EAEDN,EAAG,mDAAoD,IAAM,CAC3DD,EAAOE,EAAkBC,EAAQK,CAAY,CAAC,CAAC,EAAE,cAAc,CACjE,CAAC,EAEDP,EAAG,uEAAwE,IAAM,CAC/ED,EAAOE,EAAkBC,EAAQM,CAAgB,CAAC,CAAC,EAAE,cAAc,CACrE,CAAC,EAEDR,EAAG,mDAAoD,IAAM,CAC3DD,EAAOE,EAAkB,IAAI,UAAY,CAAC,EAAE,cAAc,CAC5D,CAAC,EAEDD,EAAG,sDAAuD,IAAM,CAC9D,MAAMS,EAAYP,EAAQG,CAAc,EAAE,SAAS,EAAG,EAAE,EACxDN,EAAOE,EAAkBQ,CAAS,CAAC,EAAE,cAAc,CACrD,CAAC,EAEDT,EAAG,0DAA2D,IAAM,CAClED,EAAOE,EAAkBC,EAAQ,sBAAsB,CAAC,CAAC,EAAE,cAAc,CAC3E,CAAC,CACH,CAAC",
6
+ "names": ["describe", "expect", "it", "parseTrc10AssetId", "fromHex", "hex", "byte", "TRC10_TRANSFER", "TRC20_TRANSFER", "TRX_TRANSFER", "NATIVE_TRX_ASSET", "truncated"]
7
+ }
@@ -1,2 +1,2 @@
1
- var r=(m=>(m.Ethereum="ethereum",m.Solana="solana",m.Concordium="concordium",m))(r||{});export{r as ContextModuleChainID};
1
+ var m=(r=>(r.Ethereum="ethereum",r.Solana="solana",r.Concordium="concordium",r.Tron="tron",r))(m||{});export{m as ContextModuleChainID};
2
2
  //# sourceMappingURL=ContextModuleChainID.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/shared/domain/ContextModuleChainID.ts"],
4
- "sourcesContent": ["export enum ContextModuleChainID {\n Ethereum = \"ethereum\",\n Solana = \"solana\",\n Concordium = \"concordium\",\n}\n"],
5
- "mappings": "AAAO,IAAKA,OACVA,EAAA,SAAW,WACXA,EAAA,OAAS,SACTA,EAAA,WAAa,aAHHA,OAAA",
4
+ "sourcesContent": ["export enum ContextModuleChainID {\n Ethereum = \"ethereum\",\n Solana = \"solana\",\n Concordium = \"concordium\",\n Tron = \"tron\",\n}\n"],
5
+ "mappings": "AAAO,IAAKA,OACVA,EAAA,SAAW,WACXA,EAAA,OAAS,SACTA,EAAA,WAAa,aACbA,EAAA,KAAO,OAJGA,OAAA",
6
6
  "names": ["ContextModuleChainID"]
7
7
  }