@ledgerhq/device-signer-kit-solana 0.0.0-signer-eth-plugin-fix-20250331141239 → 0.0.0-web-ble-29-08---20250829104351

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 (299) hide show
  1. package/README.md +5 -1
  2. package/lib/cjs/api/SignerSolana.js +1 -1
  3. package/lib/cjs/api/SignerSolana.js.map +1 -1
  4. package/lib/cjs/api/SignerSolanaBuilder.js +1 -1
  5. package/lib/cjs/api/SignerSolanaBuilder.js.map +3 -3
  6. package/lib/cjs/api/SolanaTools.js +2 -0
  7. package/lib/cjs/api/SolanaTools.js.map +7 -0
  8. package/lib/cjs/api/SolanaToolsBuilder.js +2 -0
  9. package/lib/cjs/api/SolanaToolsBuilder.js.map +7 -0
  10. package/lib/cjs/api/app-binder/GenerateTransactionDeviceActionTypes.js +2 -0
  11. package/lib/cjs/api/app-binder/GenerateTransactionDeviceActionTypes.js.map +7 -0
  12. package/lib/cjs/api/app-binder/SignTransactionDeviceActionTypes.js +1 -1
  13. package/lib/cjs/api/app-binder/SignTransactionDeviceActionTypes.js.map +1 -1
  14. package/lib/cjs/api/index.js +1 -1
  15. package/lib/cjs/api/index.js.map +3 -3
  16. package/lib/cjs/api/model/AddressOption.js +1 -1
  17. package/lib/cjs/api/model/AddressOption.js.map +1 -1
  18. package/lib/cjs/api/model/MessageOptions.js +2 -0
  19. package/lib/cjs/api/model/MessageOptions.js.map +7 -0
  20. package/lib/cjs/api/model/TransactionOptions.js +1 -1
  21. package/lib/cjs/api/model/TransactionOptions.js.map +1 -1
  22. package/lib/cjs/internal/DefaultSignerSolana.js +1 -1
  23. package/lib/cjs/internal/DefaultSignerSolana.js.map +3 -3
  24. package/lib/cjs/internal/DefaultSignerSolana.test.js +1 -1
  25. package/lib/cjs/internal/DefaultSignerSolana.test.js.map +3 -3
  26. package/lib/cjs/internal/DefaultSolanaTools.js +2 -0
  27. package/lib/cjs/internal/DefaultSolanaTools.js.map +7 -0
  28. package/lib/cjs/internal/DefaultSolanaTools.test.js +2 -0
  29. package/lib/cjs/internal/DefaultSolanaTools.test.js.map +7 -0
  30. package/lib/cjs/internal/app-binder/SolanaAppBinder.js +1 -1
  31. package/lib/cjs/internal/app-binder/SolanaAppBinder.js.map +3 -3
  32. package/lib/cjs/internal/app-binder/SolanaAppBinder.test.js +1 -1
  33. package/lib/cjs/internal/app-binder/SolanaAppBinder.test.js.map +3 -3
  34. package/lib/cjs/internal/app-binder/command/GetChallengeCommand.js +2 -0
  35. package/lib/cjs/internal/app-binder/command/GetChallengeCommand.js.map +7 -0
  36. package/lib/cjs/internal/app-binder/command/GetChallengeCommand.test.js +2 -0
  37. package/lib/cjs/internal/app-binder/command/GetChallengeCommand.test.js.map +7 -0
  38. package/lib/cjs/internal/app-binder/command/GetPubKeyCommand.js.map +2 -2
  39. package/lib/cjs/internal/app-binder/command/ProvideTLVDescriptorCommand.js +2 -0
  40. package/lib/cjs/internal/app-binder/command/ProvideTLVDescriptorCommand.js.map +7 -0
  41. package/lib/cjs/internal/app-binder/command/ProvideTLVDescriptorCommand.test.js +2 -0
  42. package/lib/cjs/internal/app-binder/command/ProvideTLVDescriptorCommand.test.js.map +7 -0
  43. package/lib/cjs/internal/app-binder/command/ProvideTrustedNamePKICommand.js +2 -0
  44. package/lib/cjs/internal/app-binder/command/ProvideTrustedNamePKICommand.js.map +7 -0
  45. package/lib/cjs/internal/app-binder/command/ProvideTrustedNamePKICommand.test.js +2 -0
  46. package/lib/cjs/internal/app-binder/command/ProvideTrustedNamePKICommand.test.js.map +7 -0
  47. package/lib/cjs/internal/app-binder/device-action/GenerateTransactionDeviceAction.js +2 -0
  48. package/lib/cjs/internal/app-binder/device-action/GenerateTransactionDeviceAction.js.map +7 -0
  49. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.js +1 -1
  50. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.js.map +3 -3
  51. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.test.js +1 -1
  52. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.test.js.map +3 -3
  53. package/lib/cjs/internal/app-binder/device-action/__test-utils__/makeInternalApi.js +1 -1
  54. package/lib/cjs/internal/app-binder/device-action/__test-utils__/makeInternalApi.js.map +3 -3
  55. package/lib/cjs/internal/app-binder/di/appBinderModule.js +1 -1
  56. package/lib/cjs/internal/app-binder/di/appBinderModule.js.map +3 -3
  57. package/lib/cjs/internal/app-binder/di/appBinderModule.test.js +1 -1
  58. package/lib/cjs/internal/app-binder/di/appBinderModule.test.js.map +2 -2
  59. package/lib/cjs/internal/app-binder/services/ApplicationChecker.js +2 -0
  60. package/lib/cjs/internal/app-binder/services/ApplicationChecker.js.map +7 -0
  61. package/lib/cjs/internal/app-binder/services/ApplicationChecker.test.js +2 -0
  62. package/lib/cjs/internal/app-binder/services/ApplicationChecker.test.js.map +7 -0
  63. package/lib/cjs/internal/app-binder/services/GenerateSolanaTransaction.js +2 -0
  64. package/lib/cjs/internal/app-binder/services/GenerateSolanaTransaction.js.map +7 -0
  65. package/lib/cjs/internal/app-binder/services/GenerateSolanaTransaction.test.js +2 -0
  66. package/lib/cjs/internal/app-binder/services/GenerateSolanaTransaction.test.js.map +7 -0
  67. package/lib/cjs/internal/app-binder/services/TransactionInspector.js +2 -0
  68. package/lib/cjs/internal/app-binder/services/TransactionInspector.js.map +7 -0
  69. package/lib/cjs/internal/app-binder/services/TransactionInspector.test.js +2 -0
  70. package/lib/cjs/internal/app-binder/services/TransactionInspector.test.js.map +7 -0
  71. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.js +2 -0
  72. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.js.map +7 -0
  73. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.test.js +2 -0
  74. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.test.js.map +7 -0
  75. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.js +2 -0
  76. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.js.map +7 -0
  77. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.test.js +2 -0
  78. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.test.js.map +7 -0
  79. package/lib/cjs/internal/app-binder/task/SendSignMessageTask.js +1 -1
  80. package/lib/cjs/internal/app-binder/task/SendSignMessageTask.js.map +3 -3
  81. package/lib/cjs/internal/app-binder/task/SendSignMessageTask.test.js +1 -1
  82. package/lib/cjs/internal/app-binder/task/SendSignMessageTask.test.js.map +3 -3
  83. package/lib/cjs/internal/di.js +1 -1
  84. package/lib/cjs/internal/di.js.map +3 -3
  85. package/lib/cjs/internal/externalTypes.js +1 -1
  86. package/lib/cjs/internal/externalTypes.js.map +2 -2
  87. package/lib/cjs/internal/use-cases/address/GetAddressUseCase.js +1 -1
  88. package/lib/cjs/internal/use-cases/address/GetAddressUseCase.js.map +2 -2
  89. package/lib/cjs/internal/use-cases/address/GetAddressUseCase.test.js +1 -1
  90. package/lib/cjs/internal/use-cases/address/GetAddressUseCase.test.js.map +2 -2
  91. package/lib/cjs/internal/use-cases/di/useCasesModule.js +1 -1
  92. package/lib/cjs/internal/use-cases/di/useCasesModule.js.map +3 -3
  93. package/lib/cjs/internal/use-cases/di/useCasesModule.test.js +1 -1
  94. package/lib/cjs/internal/use-cases/di/useCasesModule.test.js.map +2 -2
  95. package/lib/cjs/internal/use-cases/di/useCasesTypes.js +1 -1
  96. package/lib/cjs/internal/use-cases/di/useCasesTypes.js.map +2 -2
  97. package/lib/cjs/internal/use-cases/generateTransaction/GenerateTransactionUseCase.js +2 -0
  98. package/lib/cjs/internal/use-cases/generateTransaction/GenerateTransactionUseCase.js.map +7 -0
  99. package/lib/cjs/internal/use-cases/generateTransaction/GenerateTransactionUseCase.test.js +2 -0
  100. package/lib/cjs/internal/use-cases/generateTransaction/GenerateTransactionUseCase.test.js.map +7 -0
  101. package/lib/cjs/internal/use-cases/message/SignMessageUseCase.js +1 -1
  102. package/lib/cjs/internal/use-cases/message/SignMessageUseCase.js.map +3 -3
  103. package/lib/cjs/internal/use-cases/message/SignMessageUseCase.test.js +1 -1
  104. package/lib/cjs/internal/use-cases/message/SignMessageUseCase.test.js.map +2 -2
  105. package/lib/cjs/internal/use-cases/transaction/SignTransactionUseCase.js +1 -1
  106. package/lib/cjs/internal/use-cases/transaction/SignTransactionUseCase.js.map +2 -2
  107. package/lib/cjs/internal/use-cases/transaction/SignTransactionUseCase.test.js +1 -1
  108. package/lib/cjs/internal/use-cases/transaction/SignTransactionUseCase.test.js.map +3 -3
  109. package/lib/cjs/package.json +17 -12
  110. package/lib/esm/api/SignerSolanaBuilder.js +1 -1
  111. package/lib/esm/api/SignerSolanaBuilder.js.map +3 -3
  112. package/lib/esm/api/SolanaTools.js +1 -0
  113. package/lib/esm/api/SolanaTools.js.map +7 -0
  114. package/lib/esm/api/SolanaToolsBuilder.js +2 -0
  115. package/lib/esm/api/SolanaToolsBuilder.js.map +7 -0
  116. package/lib/esm/api/app-binder/GenerateTransactionDeviceActionTypes.js +1 -0
  117. package/lib/esm/api/app-binder/GenerateTransactionDeviceActionTypes.js.map +7 -0
  118. package/lib/esm/api/index.js +1 -1
  119. package/lib/esm/api/index.js.map +3 -3
  120. package/lib/esm/api/model/MessageOptions.js +1 -0
  121. package/lib/esm/api/model/MessageOptions.js.map +7 -0
  122. package/lib/esm/internal/DefaultSignerSolana.js +1 -1
  123. package/lib/esm/internal/DefaultSignerSolana.js.map +3 -3
  124. package/lib/esm/internal/DefaultSignerSolana.test.js +1 -1
  125. package/lib/esm/internal/DefaultSignerSolana.test.js.map +3 -3
  126. package/lib/esm/internal/DefaultSolanaTools.js +2 -0
  127. package/lib/esm/internal/DefaultSolanaTools.js.map +7 -0
  128. package/lib/esm/internal/DefaultSolanaTools.test.js +2 -0
  129. package/lib/esm/internal/DefaultSolanaTools.test.js.map +7 -0
  130. package/lib/esm/internal/app-binder/SolanaAppBinder.js +1 -1
  131. package/lib/esm/internal/app-binder/SolanaAppBinder.js.map +3 -3
  132. package/lib/esm/internal/app-binder/SolanaAppBinder.test.js +1 -1
  133. package/lib/esm/internal/app-binder/SolanaAppBinder.test.js.map +3 -3
  134. package/lib/esm/internal/app-binder/command/GetChallengeCommand.js +2 -0
  135. package/lib/esm/internal/app-binder/command/GetChallengeCommand.js.map +7 -0
  136. package/lib/esm/internal/app-binder/command/GetChallengeCommand.test.js +2 -0
  137. package/lib/esm/internal/app-binder/command/GetChallengeCommand.test.js.map +7 -0
  138. package/lib/esm/internal/app-binder/command/GetPubKeyCommand.js.map +2 -2
  139. package/lib/esm/internal/app-binder/command/ProvideTLVDescriptorCommand.js +2 -0
  140. package/lib/esm/internal/app-binder/command/ProvideTLVDescriptorCommand.js.map +7 -0
  141. package/lib/esm/internal/app-binder/command/ProvideTLVDescriptorCommand.test.js +2 -0
  142. package/lib/esm/internal/app-binder/command/ProvideTLVDescriptorCommand.test.js.map +7 -0
  143. package/lib/esm/internal/app-binder/command/ProvideTrustedNamePKICommand.js +2 -0
  144. package/lib/esm/internal/app-binder/command/ProvideTrustedNamePKICommand.js.map +7 -0
  145. package/lib/esm/internal/app-binder/command/ProvideTrustedNamePKICommand.test.js +2 -0
  146. package/lib/esm/internal/app-binder/command/ProvideTrustedNamePKICommand.test.js.map +7 -0
  147. package/lib/esm/internal/app-binder/device-action/GenerateTransactionDeviceAction.js +2 -0
  148. package/lib/esm/internal/app-binder/device-action/GenerateTransactionDeviceAction.js.map +7 -0
  149. package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.js +1 -1
  150. package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.js.map +3 -3
  151. package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.test.js +1 -1
  152. package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.test.js.map +3 -3
  153. package/lib/esm/internal/app-binder/device-action/__test-utils__/makeInternalApi.js +1 -1
  154. package/lib/esm/internal/app-binder/device-action/__test-utils__/makeInternalApi.js.map +3 -3
  155. package/lib/esm/internal/app-binder/di/appBinderModule.js +1 -1
  156. package/lib/esm/internal/app-binder/di/appBinderModule.js.map +3 -3
  157. package/lib/esm/internal/app-binder/di/appBinderModule.test.js +1 -1
  158. package/lib/esm/internal/app-binder/di/appBinderModule.test.js.map +2 -2
  159. package/lib/esm/internal/app-binder/services/ApplicationChecker.js +2 -0
  160. package/lib/esm/internal/app-binder/services/ApplicationChecker.js.map +7 -0
  161. package/lib/esm/internal/app-binder/services/ApplicationChecker.test.js +2 -0
  162. package/lib/esm/internal/app-binder/services/ApplicationChecker.test.js.map +7 -0
  163. package/lib/esm/internal/app-binder/services/GenerateSolanaTransaction.js +2 -0
  164. package/lib/esm/internal/app-binder/services/GenerateSolanaTransaction.js.map +7 -0
  165. package/lib/esm/internal/app-binder/services/GenerateSolanaTransaction.test.js +2 -0
  166. package/lib/esm/internal/app-binder/services/GenerateSolanaTransaction.test.js.map +7 -0
  167. package/lib/esm/internal/app-binder/services/TransactionInspector.js +2 -0
  168. package/lib/esm/internal/app-binder/services/TransactionInspector.js.map +7 -0
  169. package/lib/esm/internal/app-binder/services/TransactionInspector.test.js +2 -0
  170. package/lib/esm/internal/app-binder/services/TransactionInspector.test.js.map +7 -0
  171. package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.js +2 -0
  172. package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.js.map +7 -0
  173. package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.test.js +2 -0
  174. package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.test.js.map +7 -0
  175. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.js +2 -0
  176. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.js.map +7 -0
  177. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.test.js +2 -0
  178. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.test.js.map +7 -0
  179. package/lib/esm/internal/app-binder/task/SendSignMessageTask.js +1 -1
  180. package/lib/esm/internal/app-binder/task/SendSignMessageTask.js.map +3 -3
  181. package/lib/esm/internal/app-binder/task/SendSignMessageTask.test.js +1 -1
  182. package/lib/esm/internal/app-binder/task/SendSignMessageTask.test.js.map +3 -3
  183. package/lib/esm/internal/di.js +1 -1
  184. package/lib/esm/internal/di.js.map +3 -3
  185. package/lib/esm/internal/externalTypes.js +1 -1
  186. package/lib/esm/internal/externalTypes.js.map +2 -2
  187. package/lib/esm/internal/use-cases/address/GetAddressUseCase.js +1 -1
  188. package/lib/esm/internal/use-cases/address/GetAddressUseCase.js.map +2 -2
  189. package/lib/esm/internal/use-cases/address/GetAddressUseCase.test.js +1 -1
  190. package/lib/esm/internal/use-cases/address/GetAddressUseCase.test.js.map +2 -2
  191. package/lib/esm/internal/use-cases/di/useCasesModule.js +1 -1
  192. package/lib/esm/internal/use-cases/di/useCasesModule.js.map +3 -3
  193. package/lib/esm/internal/use-cases/di/useCasesModule.test.js +1 -1
  194. package/lib/esm/internal/use-cases/di/useCasesModule.test.js.map +2 -2
  195. package/lib/esm/internal/use-cases/di/useCasesTypes.js +1 -1
  196. package/lib/esm/internal/use-cases/di/useCasesTypes.js.map +2 -2
  197. package/lib/esm/internal/use-cases/generateTransaction/GenerateTransactionUseCase.js +2 -0
  198. package/lib/esm/internal/use-cases/generateTransaction/GenerateTransactionUseCase.js.map +7 -0
  199. package/lib/esm/internal/use-cases/generateTransaction/GenerateTransactionUseCase.test.js +2 -0
  200. package/lib/esm/internal/use-cases/generateTransaction/GenerateTransactionUseCase.test.js.map +7 -0
  201. package/lib/esm/internal/use-cases/message/SignMessageUseCase.js +1 -1
  202. package/lib/esm/internal/use-cases/message/SignMessageUseCase.js.map +3 -3
  203. package/lib/esm/internal/use-cases/message/SignMessageUseCase.test.js +1 -1
  204. package/lib/esm/internal/use-cases/message/SignMessageUseCase.test.js.map +2 -2
  205. package/lib/esm/internal/use-cases/transaction/SignTransactionUseCase.js +1 -1
  206. package/lib/esm/internal/use-cases/transaction/SignTransactionUseCase.js.map +2 -2
  207. package/lib/esm/internal/use-cases/transaction/SignTransactionUseCase.test.js +1 -1
  208. package/lib/esm/internal/use-cases/transaction/SignTransactionUseCase.test.js.map +3 -3
  209. package/lib/esm/package.json +17 -12
  210. package/lib/types/api/SignerSolana.d.ts +2 -1
  211. package/lib/types/api/SignerSolana.d.ts.map +1 -1
  212. package/lib/types/api/SignerSolanaBuilder.d.ts +12 -1
  213. package/lib/types/api/SignerSolanaBuilder.d.ts.map +1 -1
  214. package/lib/types/api/SolanaTools.d.ts +11 -0
  215. package/lib/types/api/SolanaTools.d.ts.map +1 -0
  216. package/lib/types/api/SolanaToolsBuilder.d.ts +39 -0
  217. package/lib/types/api/SolanaToolsBuilder.d.ts.map +1 -0
  218. package/lib/types/api/app-binder/GenerateTransactionDeviceActionTypes.d.ts +24 -0
  219. package/lib/types/api/app-binder/GenerateTransactionDeviceActionTypes.d.ts.map +1 -0
  220. package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts +10 -3
  221. package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts.map +1 -1
  222. package/lib/types/api/index.d.ts +3 -0
  223. package/lib/types/api/index.d.ts.map +1 -1
  224. package/lib/types/api/model/AddressOption.d.ts +1 -0
  225. package/lib/types/api/model/AddressOption.d.ts.map +1 -1
  226. package/lib/types/api/model/MessageOptions.d.ts +4 -0
  227. package/lib/types/api/model/MessageOptions.d.ts.map +1 -0
  228. package/lib/types/api/model/TransactionOptions.d.ts +7 -1
  229. package/lib/types/api/model/TransactionOptions.d.ts.map +1 -1
  230. package/lib/types/internal/DefaultSignerSolana.d.ts +6 -4
  231. package/lib/types/internal/DefaultSignerSolana.d.ts.map +1 -1
  232. package/lib/types/internal/DefaultSolanaTools.d.ts +20 -0
  233. package/lib/types/internal/DefaultSolanaTools.d.ts.map +1 -0
  234. package/lib/types/internal/DefaultSolanaTools.test.d.ts +2 -0
  235. package/lib/types/internal/DefaultSolanaTools.test.d.ts.map +1 -0
  236. package/lib/types/internal/app-binder/SolanaAppBinder.d.ts +11 -3
  237. package/lib/types/internal/app-binder/SolanaAppBinder.d.ts.map +1 -1
  238. package/lib/types/internal/app-binder/command/GetChallengeCommand.d.ts +11 -0
  239. package/lib/types/internal/app-binder/command/GetChallengeCommand.d.ts.map +1 -0
  240. package/lib/types/internal/app-binder/command/GetChallengeCommand.test.d.ts +2 -0
  241. package/lib/types/internal/app-binder/command/GetChallengeCommand.test.d.ts.map +1 -0
  242. package/lib/types/internal/app-binder/command/GetPubKeyCommand.d.ts +2 -3
  243. package/lib/types/internal/app-binder/command/GetPubKeyCommand.d.ts.map +1 -1
  244. package/lib/types/internal/app-binder/command/ProvideTLVDescriptorCommand.d.ts +13 -0
  245. package/lib/types/internal/app-binder/command/ProvideTLVDescriptorCommand.d.ts.map +1 -0
  246. package/lib/types/internal/app-binder/command/ProvideTLVDescriptorCommand.test.d.ts +2 -0
  247. package/lib/types/internal/app-binder/command/ProvideTLVDescriptorCommand.test.d.ts.map +1 -0
  248. package/lib/types/internal/app-binder/command/ProvideTrustedNamePKICommand.d.ts +13 -0
  249. package/lib/types/internal/app-binder/command/ProvideTrustedNamePKICommand.d.ts.map +1 -0
  250. package/lib/types/internal/app-binder/command/ProvideTrustedNamePKICommand.test.d.ts +2 -0
  251. package/lib/types/internal/app-binder/command/ProvideTrustedNamePKICommand.test.d.ts.map +1 -0
  252. package/lib/types/internal/app-binder/command/utils/SolanaApplicationErrors.d.ts.map +1 -1
  253. package/lib/types/internal/app-binder/device-action/GenerateTransactionDeviceAction.d.ts +23 -0
  254. package/lib/types/internal/app-binder/device-action/GenerateTransactionDeviceAction.d.ts.map +1 -0
  255. package/lib/types/internal/app-binder/device-action/SignTransactionDeviceAction.d.ts +15 -1
  256. package/lib/types/internal/app-binder/device-action/SignTransactionDeviceAction.d.ts.map +1 -1
  257. package/lib/types/internal/app-binder/device-action/__test-utils__/makeInternalApi.d.ts.map +1 -1
  258. package/lib/types/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.d.ts.map +1 -1
  259. package/lib/types/internal/app-binder/di/appBinderModule.d.ts.map +1 -1
  260. package/lib/types/internal/app-binder/services/ApplicationChecker.d.ts +13 -0
  261. package/lib/types/internal/app-binder/services/ApplicationChecker.d.ts.map +1 -0
  262. package/lib/types/internal/app-binder/services/ApplicationChecker.test.d.ts +2 -0
  263. package/lib/types/internal/app-binder/services/ApplicationChecker.test.d.ts.map +1 -0
  264. package/lib/types/internal/app-binder/services/GenerateSolanaTransaction.d.ts +14 -0
  265. package/lib/types/internal/app-binder/services/GenerateSolanaTransaction.d.ts.map +1 -0
  266. package/lib/types/internal/app-binder/services/GenerateSolanaTransaction.test.d.ts +2 -0
  267. package/lib/types/internal/app-binder/services/GenerateSolanaTransaction.test.d.ts.map +1 -0
  268. package/lib/types/internal/app-binder/services/TransactionInspector.d.ts +30 -0
  269. package/lib/types/internal/app-binder/services/TransactionInspector.d.ts.map +1 -0
  270. package/lib/types/internal/app-binder/services/TransactionInspector.test.d.ts +2 -0
  271. package/lib/types/internal/app-binder/services/TransactionInspector.test.d.ts.map +1 -0
  272. package/lib/types/internal/app-binder/task/BuildTransactionContextTask.d.ts +24 -0
  273. package/lib/types/internal/app-binder/task/BuildTransactionContextTask.d.ts.map +1 -0
  274. package/lib/types/internal/app-binder/task/BuildTransactionContextTask.test.d.ts +2 -0
  275. package/lib/types/internal/app-binder/task/BuildTransactionContextTask.test.d.ts.map +1 -0
  276. package/lib/types/internal/app-binder/task/ProvideTransactionContextTask.d.ts +15 -0
  277. package/lib/types/internal/app-binder/task/ProvideTransactionContextTask.d.ts.map +1 -0
  278. package/lib/types/internal/app-binder/task/ProvideTransactionContextTask.test.d.ts +2 -0
  279. package/lib/types/internal/app-binder/task/ProvideTransactionContextTask.test.d.ts.map +1 -0
  280. package/lib/types/internal/app-binder/task/SendSignMessageTask.d.ts +7 -0
  281. package/lib/types/internal/app-binder/task/SendSignMessageTask.d.ts.map +1 -1
  282. package/lib/types/internal/di.d.ts +3 -1
  283. package/lib/types/internal/di.d.ts.map +1 -1
  284. package/lib/types/internal/externalTypes.d.ts +1 -0
  285. package/lib/types/internal/externalTypes.d.ts.map +1 -1
  286. package/lib/types/internal/use-cases/address/GetAddressUseCase.d.ts.map +1 -1
  287. package/lib/types/internal/use-cases/di/useCasesModule.d.ts.map +1 -1
  288. package/lib/types/internal/use-cases/di/useCasesTypes.d.ts +1 -0
  289. package/lib/types/internal/use-cases/di/useCasesTypes.d.ts.map +1 -1
  290. package/lib/types/internal/use-cases/generateTransaction/GenerateTransactionUseCase.d.ts +10 -0
  291. package/lib/types/internal/use-cases/generateTransaction/GenerateTransactionUseCase.d.ts.map +1 -0
  292. package/lib/types/internal/use-cases/generateTransaction/GenerateTransactionUseCase.test.d.ts +2 -0
  293. package/lib/types/internal/use-cases/generateTransaction/GenerateTransactionUseCase.test.d.ts.map +1 -0
  294. package/lib/types/internal/use-cases/message/SignMessageUseCase.d.ts +2 -1
  295. package/lib/types/internal/use-cases/message/SignMessageUseCase.d.ts.map +1 -1
  296. package/lib/types/internal/use-cases/transaction/SignTransactionUseCase.d.ts +3 -2
  297. package/lib/types/internal/use-cases/transaction/SignTransactionUseCase.d.ts.map +1 -1
  298. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  299. package/package.json +19 -14
@@ -1,2 +1,2 @@
1
- import{CommandResultFactory as u,DeviceActionStatus as e,InvalidStatusWordError as x,UnknownDAError as g,UserInteractionRequired as t}from"@ledgerhq/device-management-kit";import{Just as A,Nothing as f}from"purify-ts";import{makeDeviceActionInternalApiMock as c}from"../../app-binder/device-action/__test-utils__/makeInternalApi";import{setupOpenAppDAMock as l}from"../../app-binder/device-action/__test-utils__/setupOpenAppDAMock";import{testDeviceActionStates as v}from"../../app-binder/device-action/__test-utils__/testDeviceActionStates";import{SignTransactionDeviceAction as m}from"./SignTransactionDeviceAction";vi.mock("@ledgerhq/device-management-kit",async o=>({...await o(),OpenAppDeviceAction:vi.fn(()=>({makeStateMachine:vi.fn()}))}));describe("SignTransactionDeviceAction",()=>{const o=vi.fn();function d(){return{signTransaction:o}}const p={};let s;beforeEach(()=>{vi.clearAllMocks(),s=new Uint8Array([1,2,3])}),describe("Happy path",()=>{it("should call external dependencies with the correct parameters",()=>new Promise((r,i)=>{l();const n=new m({input:{derivationPath:"44'/501'/0'/0'",transaction:s,options:p}});o.mockResolvedValueOnce(u({data:A(new Uint8Array([5,6,7]))})),vi.spyOn(n,"extractDependencies").mockReturnValue(d());const a=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.ConfirmOpenApp},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.SignTransaction},status:e.Pending},{output:new Uint8Array([5,6,7]),status:e.Completed}];v(n,a,c(),{onError:i,onDone:()=>{expect(o).toHaveBeenCalledWith(expect.objectContaining({input:{derivationPath:"44'/501'/0'/0'",serializedTransaction:new Uint8Array([1,2,3])}})),r()}})}))}),describe("OpenApp errors",()=>{it("should fail if OpenApp throw an error",()=>new Promise((r,i)=>{l(new g("OpenApp error"));const n=new m({input:{derivationPath:"44'/501'/0'/0'",transaction:s,options:p}});vi.spyOn(n,"extractDependencies").mockReturnValue(d());const a=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.ConfirmOpenApp},status:e.Pending},{error:new g("OpenApp error"),status:e.Error}];v(n,a,c(),{onDone:r,onError:i})}))}),describe("SignTransaction errors",()=>{it("should fail if signTransaction returns an error",()=>new Promise((r,i)=>{l();const n=new m({input:{derivationPath:"44'/501'/0'/0'",transaction:s,options:p}});o.mockResolvedValueOnce(u({error:new x("signTransaction error")})),vi.spyOn(n,"extractDependencies").mockReturnValue(d());const a=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.ConfirmOpenApp},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.SignTransaction},status:e.Pending},{error:new x("signTransaction error"),status:e.Error}];v(n,a,c(),{onDone:r,onError:i})})),it("should fail if signTransaction returns nothing",()=>new Promise((r,i)=>{l();const n=new m({input:{derivationPath:"44'/501'/0'/0'",transaction:s,options:p}});o.mockResolvedValueOnce(u({data:f})),vi.spyOn(n,"extractDependencies").mockReturnValue(d());const a=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.ConfirmOpenApp},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.SignTransaction},status:e.Pending},{error:new g("No Signature available"),status:e.Error}];v(n,a,c(),{onDone:r,onError:i})}))}),describe("extractDependencies",()=>{it("should extract dependencies",async()=>{const r=new m({input:{derivationPath:"44'/501'/0'/0'",transaction:s,options:p}}),i=c();vi.spyOn(i,"sendCommand").mockResolvedValue(u({data:A(new Uint8Array([5,6,7]))}));const n=r.extractDependencies(c()),a=await n.signTransaction({input:{derivationPath:"44'/501'/0'/0'",serializedTransaction:s}});expect(n.signTransaction).toBeInstanceOf(Function),expect(a).toEqual(u({data:A(new Uint8Array([5,6,7]))})),expect(i.sendCommand).toHaveBeenCalledTimes(1)})})});
1
+ import{CommandResultFactory as o,DeviceActionStatus as e,DeviceModelId as g,DeviceSessionStateType as v,DeviceStatus as y,InvalidStatusWordError as C,UserInteractionRequired as t}from"@ledgerhq/device-management-kit";import{Just as T,Nothing as N}from"purify-ts";import{beforeEach as P,describe as w,it as D,vi as n}from"vitest";import{testDeviceActionStates as f}from"../../app-binder/device-action/__test-utils__/testDeviceActionStates";import{SolanaTransactionTypes as m}from"../../app-binder/services/TransactionInspector";import{makeDeviceActionInternalApiMock as E}from"./__test-utils__/makeInternalApi";import{SignTransactionDeviceAction as k}from"./SignTransactionDeviceAction";const V="44'/501'/0'/0'",x=new Uint8Array([222,173,190,239]),I={getSolanaContext:n.fn(),getContext:n.fn(),getContexts:n.fn(),getTypedDataFilters:n.fn(),getWeb3Checks:n.fn()};let r,u,d,A,S,l;function R(){return{getAppConfig:u,buildContext:d,provideContext:A,signTransaction:S,inspectTransaction:l}}w("SignTransactionDeviceAction (Solana)",()=>{P(()=>{r=E(),u=n.fn(),d=n.fn(),A=n.fn(),S=n.fn(),l=n.fn().mockResolvedValue({transactionType:m.SPL,data:{tokenAddress:null,createATA:!1}})}),D("happy path (skip open): getAppConfig -> inspect -> build -> provide -> sign",()=>new Promise((s,c)=>{r.getDeviceSessionState.mockReturnValue({sessionStateType:v.ReadyWithoutSecureChannel,deviceStatus:y.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:g.NANO_X,isSecureConnectionAllowed:!0}),u.mockResolvedValue(o({data:{}})),l.mockResolvedValue({transactionType:m.SPL});const a={descriptor:new Uint8Array([1]),calCertificate:{keyUsageNumber:0,payload:new Uint8Array([1])},challenge:void 0,addressResult:{tokenAccount:"",owner:"",contract:""}};d.mockResolvedValue(a),A.mockResolvedValue(N);const i=new Uint8Array([170,187]);S.mockResolvedValue(o({data:T(i)}));const p=new k({input:{derivationPath:V,transaction:x,skipOpenApp:!0,options:{},contextModule:I}});n.spyOn(p,"extractDependencies").mockReturnValue(R());const U=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.SignTransaction},status:e.Pending},{output:i,status:e.Completed}];f(p,U,r,{onDone:s,onError:c})})),D("failure in provideContext still signs",()=>new Promise((s,c)=>{r.getDeviceSessionState.mockReturnValue({sessionStateType:v.ReadyWithoutSecureChannel,deviceStatus:y.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:g.NANO_X,isSecureConnectionAllowed:!0}),u.mockResolvedValue(o({data:{}})),l.mockResolvedValue({transactionType:m.SPL}),d.mockResolvedValue({descriptor:new Uint8Array([2]),calCertificate:{keyUsageNumber:0,payload:new Uint8Array},challenge:void 0,addressResult:{tokenAccount:"",owner:"",contract:""}}),A.mockResolvedValue(T(o({error:new C("ctxErr")})));const a=new Uint8Array([254]);S.mockResolvedValue(o({data:T(a)}));const i=new k({input:{derivationPath:V,transaction:x,skipOpenApp:!0,options:{},contextModule:I}});n.spyOn(i,"extractDependencies").mockReturnValue(R());const p=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.SignTransaction},status:e.Pending},{output:a,status:e.Completed}];f(i,p,r,{onDone:s,onError:c})})),D("buildContext throws \u2192 error",()=>new Promise((s,c)=>{r.getDeviceSessionState.mockReturnValue({sessionStateType:v.ReadyWithoutSecureChannel,deviceStatus:y.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:g.NANO_X,isSecureConnectionAllowed:!0}),u.mockResolvedValue(o({data:{}})),l.mockResolvedValue({transactionType:m.SPL}),d.mockRejectedValue(new C("bldErr"));const a=new k({input:{derivationPath:V,transaction:x,skipOpenApp:!0,options:{},contextModule:I}});n.spyOn(a,"extractDependencies").mockReturnValue(R());const i=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{error:expect.anything(),status:e.Error}];f(a,i,r,{onDone:s,onError:c})}))});
2
2
  //# sourceMappingURL=SignTransactionDeviceAction.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/device-action/SignTransactionDeviceAction.test.ts"],
4
- "sourcesContent": ["/* eslint @typescript-eslint/consistent-type-imports: off */\nimport {\n CommandResultFactory,\n DeviceActionStatus,\n InvalidStatusWordError,\n UnknownDAError,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { Just, Nothing } from \"purify-ts\";\n\nimport { type SignTransactionDAState } from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { type Transaction } from \"@api/model/Transaction\";\nimport { makeDeviceActionInternalApiMock } from \"@internal/app-binder/device-action/__test-utils__/makeInternalApi\";\nimport { setupOpenAppDAMock } from \"@internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock\";\nimport { testDeviceActionStates } from \"@internal/app-binder/device-action/__test-utils__/testDeviceActionStates\";\n\nimport { SignTransactionDeviceAction } from \"./SignTransactionDeviceAction\";\n\nvi.mock(\"@ledgerhq/device-management-kit\", async (importOriginal) => {\n const original =\n await importOriginal<typeof import(\"@ledgerhq/device-management-kit\")>();\n return {\n ...original,\n OpenAppDeviceAction: vi.fn(() => ({\n makeStateMachine: vi.fn(),\n })),\n };\n});\n\ndescribe(\"SignTransactionDeviceAction\", () => {\n const signTransactionMock = vi.fn();\n function extractDependenciesMock() {\n return {\n signTransaction: signTransactionMock,\n };\n }\n const defaultOptions = {};\n let defaultTransaction: Transaction;\n\n beforeEach(() => {\n vi.clearAllMocks();\n defaultTransaction = new Uint8Array([0x01, 0x02, 0x03]);\n });\n\n describe(\"Happy path\", () => {\n it(\"should call external dependencies with the correct parameters\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n\n const deviceAction = new SignTransactionDeviceAction({\n input: {\n derivationPath: \"44'/501'/0'/0'\",\n transaction: defaultTransaction,\n options: defaultOptions,\n },\n });\n\n // Mock the dependencies to return some sample data\n signTransactionMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: Just(new Uint8Array([0x05, 0x06, 0x07])),\n }),\n );\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n // Expected intermediate values for the following state sequence:\n // Initial -> OpenApp -> GetChallenge -> BuildContext -> ProvideContext -> SignTransaction\n const expectedStates: Array<SignTransactionDAState> = [\n // Initial state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // OpenApp interaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n status: DeviceActionStatus.Pending,\n },\n // SignTransaction state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n },\n status: DeviceActionStatus.Pending,\n },\n // Final state\n {\n output: new Uint8Array([0x05, 0x06, 0x07]),\n status: DeviceActionStatus.Completed,\n },\n ];\n\n testDeviceActionStates(\n deviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onError: reject,\n onDone: () => {\n // Verify mocks calls parameters\n expect(signTransactionMock).toHaveBeenCalledWith(\n expect.objectContaining({\n input: {\n derivationPath: \"44'/501'/0'/0'\",\n serializedTransaction: new Uint8Array([0x01, 0x02, 0x03]),\n },\n }),\n );\n resolve();\n },\n },\n );\n }));\n });\n\n describe(\"OpenApp errors\", () => {\n it(\"should fail if OpenApp throw an error\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock(new UnknownDAError(\"OpenApp error\"));\n\n const deviceAction = new SignTransactionDeviceAction({\n input: {\n derivationPath: \"44'/501'/0'/0'\",\n transaction: defaultTransaction,\n options: defaultOptions,\n },\n });\n\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n const expectedStates: Array<SignTransactionDAState> = [\n // Initial state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // OpenApp interaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n status: DeviceActionStatus.Pending,\n },\n // OpenApp error\n {\n error: new UnknownDAError(\"OpenApp error\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(\n deviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n });\n\n describe(\"SignTransaction errors\", () => {\n it(\"should fail if signTransaction returns an error\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n\n const deviceAction = new SignTransactionDeviceAction({\n input: {\n derivationPath: \"44'/501'/0'/0'\",\n transaction: defaultTransaction,\n options: defaultOptions,\n },\n });\n\n signTransactionMock.mockResolvedValueOnce(\n CommandResultFactory({\n error: new InvalidStatusWordError(\"signTransaction error\"),\n }),\n );\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n const expectedStates: Array<SignTransactionDAState> = [\n // Initial state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // OpenApp interaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n status: DeviceActionStatus.Pending,\n },\n // SignTransaction state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n },\n status: DeviceActionStatus.Pending,\n },\n // SignTransaction error\n {\n error: new InvalidStatusWordError(\"signTransaction error\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(\n deviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n\n it(\"should fail if signTransaction returns nothing\", () =>\n new Promise<void>((resolve, reject) => {\n setupOpenAppDAMock();\n\n const deviceAction = new SignTransactionDeviceAction({\n input: {\n derivationPath: \"44'/501'/0'/0'\",\n transaction: defaultTransaction,\n options: defaultOptions,\n },\n });\n\n signTransactionMock.mockResolvedValueOnce(\n CommandResultFactory({\n data: Nothing,\n }),\n );\n vi.spyOn(deviceAction, \"extractDependencies\").mockReturnValue(\n extractDependenciesMock(),\n );\n\n const expectedStates: Array<SignTransactionDAState> = [\n // Initial state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // OpenApp interaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.ConfirmOpenApp,\n },\n status: DeviceActionStatus.Pending,\n },\n // SignTransaction state\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n },\n status: DeviceActionStatus.Pending,\n },\n // SignTransaction error\n {\n error: new UnknownDAError(\"No Signature available\"),\n status: DeviceActionStatus.Error,\n },\n ];\n\n testDeviceActionStates(\n deviceAction,\n expectedStates,\n makeDeviceActionInternalApiMock(),\n {\n onDone: resolve,\n onError: reject,\n },\n );\n }));\n });\n\n describe(\"extractDependencies\", () => {\n it(\"should extract dependencies\", async () => {\n const deviceAction = new SignTransactionDeviceAction({\n input: {\n derivationPath: \"44'/501'/0'/0'\",\n transaction: defaultTransaction,\n options: defaultOptions,\n },\n });\n // mock sendCommand to return a successful result\n const api = makeDeviceActionInternalApiMock();\n vi.spyOn(api, \"sendCommand\").mockResolvedValue(\n CommandResultFactory({\n data: Just(new Uint8Array([0x05, 0x06, 0x07])),\n }),\n );\n\n const dependencies = deviceAction.extractDependencies(\n makeDeviceActionInternalApiMock(),\n );\n const signature = await dependencies.signTransaction({\n input: {\n derivationPath: \"44'/501'/0'/0'\",\n serializedTransaction: defaultTransaction,\n },\n });\n\n expect(dependencies.signTransaction).toBeInstanceOf(Function);\n expect(signature).toEqual(\n CommandResultFactory({\n data: Just(new Uint8Array([0x05, 0x06, 0x07])),\n }),\n );\n expect(api.sendCommand).toHaveBeenCalledTimes(1);\n });\n });\n});\n"],
5
- "mappings": "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",
6
- "names": ["CommandResultFactory", "DeviceActionStatus", "InvalidStatusWordError", "UnknownDAError", "UserInteractionRequired", "Just", "Nothing", "makeDeviceActionInternalApiMock", "setupOpenAppDAMock", "testDeviceActionStates", "SignTransactionDeviceAction", "importOriginal", "signTransactionMock", "extractDependenciesMock", "defaultOptions", "defaultTransaction", "resolve", "reject", "deviceAction", "expectedStates", "api", "dependencies", "signature"]
4
+ "sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n CommandResultFactory,\n type DeviceActionState,\n DeviceActionStatus,\n DeviceModelId,\n DeviceSessionStateType,\n DeviceStatus,\n InvalidStatusWordError,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { Just, Nothing } from \"purify-ts\";\nimport { beforeEach, describe, it, vi } from \"vitest\";\n\nimport {\n type SignTransactionDAError,\n type SignTransactionDAInput,\n type SignTransactionDAIntermediateValue,\n} from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { testDeviceActionStates } from \"@internal/app-binder/device-action/__test-utils__/testDeviceActionStates\";\nimport { SolanaTransactionTypes } from \"@internal/app-binder/services/TransactionInspector\";\nimport { type SolanaBuildContextResult } from \"@internal/app-binder/task/BuildTransactionContextTask\";\n\nimport { makeDeviceActionInternalApiMock } from \"./__test-utils__/makeInternalApi\";\nimport { SignTransactionDeviceAction } from \"./SignTransactionDeviceAction\";\n\nconst defaultDerivation = \"44'/501'/0'/0'\";\nconst exampleTx = new Uint8Array([0xde, 0xad, 0xbe, 0xef]);\n\nconst contextModuleStub: ContextModule = {\n getSolanaContext: vi.fn(),\n getContext: vi.fn(),\n getContexts: vi.fn(),\n getTypedDataFilters: vi.fn(),\n getWeb3Checks: vi.fn(),\n};\n\nlet apiMock: ReturnType<typeof makeDeviceActionInternalApiMock>;\nlet getAppConfigMock: ReturnType<typeof vi.fn>;\nlet buildContextMock: ReturnType<typeof vi.fn>;\nlet provideContextMock: ReturnType<typeof vi.fn>;\nlet signMock: ReturnType<typeof vi.fn>;\nlet inspectTransactionMock: ReturnType<typeof vi.fn>;\n\nfunction extractDeps() {\n return {\n getAppConfig: getAppConfigMock,\n buildContext: buildContextMock,\n provideContext: provideContextMock,\n signTransaction: signMock,\n inspectTransaction: inspectTransactionMock,\n };\n}\n\ndescribe(\"SignTransactionDeviceAction (Solana)\", () => {\n beforeEach(() => {\n apiMock = makeDeviceActionInternalApiMock();\n getAppConfigMock = vi.fn();\n buildContextMock = vi.fn();\n provideContextMock = vi.fn();\n signMock = vi.fn();\n inspectTransactionMock = vi.fn().mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n data: { tokenAddress: null, createATA: false },\n });\n });\n\n it(\"happy path (skip open): getAppConfig -> inspect -> build -> provide -> sign\", () =>\n new Promise<void>((resolve, reject) => {\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.1\" },\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: true,\n });\n\n getAppConfigMock.mockResolvedValue(CommandResultFactory({ data: {} }));\n inspectTransactionMock.mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n });\n\n const ctx: SolanaBuildContextResult = {\n descriptor: new Uint8Array([1]),\n calCertificate: { keyUsageNumber: 0, payload: new Uint8Array([0x01]) },\n challenge: undefined,\n addressResult: { tokenAccount: \"\", owner: \"\", contract: \"\" },\n };\n buildContextMock.mockResolvedValue(ctx);\n provideContextMock.mockResolvedValue(Nothing);\n\n const signature = new Uint8Array([0xaa, 0xbb]);\n signMock.mockResolvedValue(\n CommandResultFactory({ data: Just(signature) }),\n );\n\n const action = new SignTransactionDeviceAction({\n input: {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n skipOpenApp: true, // always skip open\n options: {},\n contextModule: contextModuleStub,\n } as SignTransactionDAInput,\n });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n\n const expected = [\n // getAppConfig\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // inspectTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // buildContext\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // provideContext\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // signTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n },\n status: DeviceActionStatus.Pending,\n },\n // success\n { output: signature, status: DeviceActionStatus.Completed },\n ] as DeviceActionState<\n Uint8Array,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[];\n\n testDeviceActionStates<\n Uint8Array,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >(action, expected, apiMock, { onDone: resolve, onError: reject });\n }));\n\n it(\"failure in provideContext still signs\", () =>\n new Promise<void>((resolve, reject) => {\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.1\" },\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: true,\n });\n\n getAppConfigMock.mockResolvedValue(CommandResultFactory({ data: {} }));\n inspectTransactionMock.mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n });\n\n buildContextMock.mockResolvedValue({\n descriptor: new Uint8Array([2]),\n calCertificate: { keyUsageNumber: 0, payload: new Uint8Array() },\n challenge: undefined,\n addressResult: { tokenAccount: \"\", owner: \"\", contract: \"\" },\n });\n provideContextMock.mockResolvedValue(\n Just(\n CommandResultFactory({ error: new InvalidStatusWordError(\"ctxErr\") }),\n ),\n );\n const sig = new Uint8Array([0xfe]);\n signMock.mockResolvedValue(CommandResultFactory({ data: Just(sig) }));\n\n const action = new SignTransactionDeviceAction({\n input: {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n skipOpenApp: true,\n options: {},\n contextModule: contextModuleStub,\n } as SignTransactionDAInput,\n });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n\n const expected = [\n // getAppConfig\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // inspectTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // buildContext\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // provideContext (returns error but continues)\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // signTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n },\n status: DeviceActionStatus.Pending,\n },\n // success\n { output: sig, status: DeviceActionStatus.Completed },\n ] as DeviceActionState<\n Uint8Array,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[];\n\n testDeviceActionStates<\n Uint8Array,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >(action, expected, apiMock, { onDone: resolve, onError: reject });\n }));\n\n it(\"buildContext throws \u2192 error\", () =>\n new Promise<void>((resolve, reject) => {\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.1\" },\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: true,\n });\n\n getAppConfigMock.mockResolvedValue(CommandResultFactory({ data: {} }));\n inspectTransactionMock.mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n });\n\n buildContextMock.mockRejectedValue(new InvalidStatusWordError(\"bldErr\"));\n\n const action = new SignTransactionDeviceAction({\n input: {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n skipOpenApp: true,\n options: {},\n contextModule: contextModuleStub,\n } as SignTransactionDAInput,\n });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n\n const expected = [\n // getAppConfig\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // inspectTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // buildContext (throws)\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // error raised from buildContext\n {\n error: expect.anything() as unknown as SignTransactionDAError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n Uint8Array,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[];\n\n testDeviceActionStates<\n Uint8Array,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >(action, expected, apiMock, { onDone: resolve, onError: reject });\n }));\n});\n"],
5
+ "mappings": "AACA,OACE,wBAAAA,EAEA,sBAAAC,EACA,iBAAAC,EACA,0BAAAC,EACA,gBAAAC,EACA,0BAAAC,EACA,2BAAAC,MACK,kCACP,OAAS,QAAAC,EAAM,WAAAC,MAAe,YAC9B,OAAS,cAAAC,EAAY,YAAAC,EAAU,MAAAC,EAAI,MAAAC,MAAU,SAO7C,OAAS,0BAAAC,MAA8B,2EACvC,OAAS,0BAAAC,MAA8B,qDAGvC,OAAS,mCAAAC,MAAuC,mCAChD,OAAS,+BAAAC,MAAmC,gCAE5C,MAAMC,EAAoB,iBACpBC,EAAY,IAAI,WAAW,CAAC,IAAM,IAAM,IAAM,GAAI,CAAC,EAEnDC,EAAmC,CACvC,iBAAkBP,EAAG,GAAG,EACxB,WAAYA,EAAG,GAAG,EAClB,YAAaA,EAAG,GAAG,EACnB,oBAAqBA,EAAG,GAAG,EAC3B,cAAeA,EAAG,GAAG,CACvB,EAEA,IAAIQ,EACAC,EACAC,EACAC,EACAC,EACAC,EAEJ,SAASC,GAAc,CACrB,MAAO,CACL,aAAcL,EACd,aAAcC,EACd,eAAgBC,EAChB,gBAAiBC,EACjB,mBAAoBC,CACtB,CACF,CAEAf,EAAS,uCAAwC,IAAM,CACrDD,EAAW,IAAM,CACfW,EAAUL,EAAgC,EAC1CM,EAAmBT,EAAG,GAAG,EACzBU,EAAmBV,EAAG,GAAG,EACzBW,EAAqBX,EAAG,GAAG,EAC3BY,EAAWZ,EAAG,GAAG,EACjBa,EAAyBb,EAAG,GAAG,EAAE,kBAAkB,CACjD,gBAAiBE,EAAuB,IACxC,KAAM,CAAE,aAAc,KAAM,UAAW,EAAM,CAC/C,CAAC,CACH,CAAC,EAEDH,EAAG,8EAA+E,IAChF,IAAI,QAAc,CAACgB,EAASC,IAAW,CACrCR,EAAQ,sBAAsB,gBAAgB,CAC5C,iBAAkBjB,EAAuB,0BACzC,aAAcC,EAAa,UAC3B,cAAe,CAAC,EAChB,WAAY,CAAE,KAAM,SAAU,QAAS,OAAQ,EAC/C,cAAeF,EAAc,OAC7B,0BAA2B,EAC7B,CAAC,EAEDmB,EAAiB,kBAAkBrB,EAAqB,CAAE,KAAM,CAAC,CAAE,CAAC,CAAC,EACrEyB,EAAuB,kBAAkB,CACvC,gBAAiBX,EAAuB,GAC1C,CAAC,EAED,MAAMe,EAAgC,CACpC,WAAY,IAAI,WAAW,CAAC,CAAC,CAAC,EAC9B,eAAgB,CAAE,eAAgB,EAAG,QAAS,IAAI,WAAW,CAAC,CAAI,CAAC,CAAE,EACrE,UAAW,OACX,cAAe,CAAE,aAAc,GAAI,MAAO,GAAI,SAAU,EAAG,CAC7D,EACAP,EAAiB,kBAAkBO,CAAG,EACtCN,EAAmB,kBAAkBf,CAAO,EAE5C,MAAMsB,EAAY,IAAI,WAAW,CAAC,IAAM,GAAI,CAAC,EAC7CN,EAAS,kBACPxB,EAAqB,CAAE,KAAMO,EAAKuB,CAAS,CAAE,CAAC,CAChD,EAEA,MAAMC,EAAS,IAAIf,EAA4B,CAC7C,MAAO,CACL,eAAgBC,EAChB,YAAaC,EACb,YAAa,GACb,QAAS,CAAC,EACV,cAAeC,CACjB,CACF,CAAC,EACDP,EAAG,MAAMmB,EAAQ,qBAAqB,EAAE,gBAAgBL,EAAY,CAAC,EAErE,MAAMM,EAAW,CAEf,CACE,kBAAmB,CACjB,wBAAyB1B,EAAwB,IACnD,EACA,OAAQL,EAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyBK,EAAwB,IACnD,EACA,OAAQL,EAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyBK,EAAwB,IACnD,EACA,OAAQL,EAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyBK,EAAwB,IACnD,EACA,OAAQL,EAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyBK,EAAwB,eACnD,EACA,OAAQL,EAAmB,OAC7B,EAEA,CAAE,OAAQ6B,EAAW,OAAQ7B,EAAmB,SAAU,CAC5D,EAMAY,EAKEkB,EAAQC,EAAUZ,EAAS,CAAE,OAAQO,EAAS,QAASC,CAAO,CAAC,CACnE,CAAC,CAAC,EAEJjB,EAAG,wCAAyC,IAC1C,IAAI,QAAc,CAACgB,EAASC,IAAW,CACrCR,EAAQ,sBAAsB,gBAAgB,CAC5C,iBAAkBjB,EAAuB,0BACzC,aAAcC,EAAa,UAC3B,cAAe,CAAC,EAChB,WAAY,CAAE,KAAM,SAAU,QAAS,OAAQ,EAC/C,cAAeF,EAAc,OAC7B,0BAA2B,EAC7B,CAAC,EAEDmB,EAAiB,kBAAkBrB,EAAqB,CAAE,KAAM,CAAC,CAAE,CAAC,CAAC,EACrEyB,EAAuB,kBAAkB,CACvC,gBAAiBX,EAAuB,GAC1C,CAAC,EAEDQ,EAAiB,kBAAkB,CACjC,WAAY,IAAI,WAAW,CAAC,CAAC,CAAC,EAC9B,eAAgB,CAAE,eAAgB,EAAG,QAAS,IAAI,UAAa,EAC/D,UAAW,OACX,cAAe,CAAE,aAAc,GAAI,MAAO,GAAI,SAAU,EAAG,CAC7D,CAAC,EACDC,EAAmB,kBACjBhB,EACEP,EAAqB,CAAE,MAAO,IAAIK,EAAuB,QAAQ,CAAE,CAAC,CACtE,CACF,EACA,MAAM4B,EAAM,IAAI,WAAW,CAAC,GAAI,CAAC,EACjCT,EAAS,kBAAkBxB,EAAqB,CAAE,KAAMO,EAAK0B,CAAG,CAAE,CAAC,CAAC,EAEpE,MAAMF,EAAS,IAAIf,EAA4B,CAC7C,MAAO,CACL,eAAgBC,EAChB,YAAaC,EACb,YAAa,GACb,QAAS,CAAC,EACV,cAAeC,CACjB,CACF,CAAC,EACDP,EAAG,MAAMmB,EAAQ,qBAAqB,EAAE,gBAAgBL,EAAY,CAAC,EAErE,MAAMM,EAAW,CAEf,CACE,kBAAmB,CACjB,wBAAyB1B,EAAwB,IACnD,EACA,OAAQL,EAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyBK,EAAwB,IACnD,EACA,OAAQL,EAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyBK,EAAwB,IACnD,EACA,OAAQL,EAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyBK,EAAwB,IACnD,EACA,OAAQL,EAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyBK,EAAwB,eACnD,EACA,OAAQL,EAAmB,OAC7B,EAEA,CAAE,OAAQgC,EAAK,OAAQhC,EAAmB,SAAU,CACtD,EAMAY,EAKEkB,EAAQC,EAAUZ,EAAS,CAAE,OAAQO,EAAS,QAASC,CAAO,CAAC,CACnE,CAAC,CAAC,EAEJjB,EAAG,mCAA+B,IAChC,IAAI,QAAc,CAACgB,EAASC,IAAW,CACrCR,EAAQ,sBAAsB,gBAAgB,CAC5C,iBAAkBjB,EAAuB,0BACzC,aAAcC,EAAa,UAC3B,cAAe,CAAC,EAChB,WAAY,CAAE,KAAM,SAAU,QAAS,OAAQ,EAC/C,cAAeF,EAAc,OAC7B,0BAA2B,EAC7B,CAAC,EAEDmB,EAAiB,kBAAkBrB,EAAqB,CAAE,KAAM,CAAC,CAAE,CAAC,CAAC,EACrEyB,EAAuB,kBAAkB,CACvC,gBAAiBX,EAAuB,GAC1C,CAAC,EAEDQ,EAAiB,kBAAkB,IAAIjB,EAAuB,QAAQ,CAAC,EAEvE,MAAM0B,EAAS,IAAIf,EAA4B,CAC7C,MAAO,CACL,eAAgBC,EAChB,YAAaC,EACb,YAAa,GACb,QAAS,CAAC,EACV,cAAeC,CACjB,CACF,CAAC,EACDP,EAAG,MAAMmB,EAAQ,qBAAqB,EAAE,gBAAgBL,EAAY,CAAC,EAErE,MAAMM,EAAW,CAEf,CACE,kBAAmB,CACjB,wBAAyB1B,EAAwB,IACnD,EACA,OAAQL,EAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyBK,EAAwB,IACnD,EACA,OAAQL,EAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyBK,EAAwB,IACnD,EACA,OAAQL,EAAmB,OAC7B,EAEA,CACE,MAAO,OAAO,SAAS,EACvB,OAAQA,EAAmB,KAC7B,CACF,EAMAY,EAKEkB,EAAQC,EAAUZ,EAAS,CAAE,OAAQO,EAAS,QAASC,CAAO,CAAC,CACnE,CAAC,CAAC,CACN,CAAC",
6
+ "names": ["CommandResultFactory", "DeviceActionStatus", "DeviceModelId", "DeviceSessionStateType", "DeviceStatus", "InvalidStatusWordError", "UserInteractionRequired", "Just", "Nothing", "beforeEach", "describe", "it", "vi", "testDeviceActionStates", "SolanaTransactionTypes", "makeDeviceActionInternalApiMock", "SignTransactionDeviceAction", "defaultDerivation", "exampleTx", "contextModuleStub", "apiMock", "getAppConfigMock", "buildContextMock", "provideContextMock", "signMock", "inspectTransactionMock", "extractDeps", "resolve", "reject", "ctx", "signature", "action", "expected", "sig"]
7
7
  }
@@ -1,2 +1,2 @@
1
- const e=vi.fn(),n=vi.fn(),t=vi.fn(),i=vi.fn(),c=vi.fn(),o=vi.fn(),s=vi.fn(),a=vi.fn();function r(){return{sendApdu:e,sendCommand:n,getDeviceSessionState:t,getDeviceSessionStateObservable:i,setDeviceSessionState:c,getManagerApiService:o,getSecureChannelService:s,disableRefresher:a}}export{r as makeDeviceActionInternalApiMock};
1
+ function e(){return{sendApdu:vi.fn(),sendCommand:vi.fn().mockResolvedValue(void 0),getDeviceModel:vi.fn(),getDeviceSessionState:vi.fn(),getDeviceSessionStateObservable:vi.fn(),setDeviceSessionState:vi.fn(),getManagerApiService:vi.fn(),getSecureChannelService:vi.fn(),disableRefresher:vi.fn()}}export{e as makeDeviceActionInternalApiMock};
2
2
  //# sourceMappingURL=makeInternalApi.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/internal/app-binder/device-action/__test-utils__/makeInternalApi.ts"],
4
- "sourcesContent": ["import { type InternalApi } from \"@ledgerhq/device-management-kit\";\nimport { type Mocked } from \"vitest\";\n\nconst sendApduMock = vi.fn();\nconst sendCommandMock = vi.fn();\nconst apiGetDeviceSessionStateMock = vi.fn();\nconst apiGetDeviceSessionStateObservableMock = vi.fn();\nconst setDeviceSessionStateMock = vi.fn();\nconst getManagerApiServiceMock = vi.fn();\nconst getSecureChannelServiceMock = vi.fn();\nconst disableRefresherMock = vi.fn();\n\nexport function makeDeviceActionInternalApiMock(): Mocked<InternalApi> {\n return {\n sendApdu: sendApduMock,\n sendCommand: sendCommandMock,\n getDeviceSessionState: apiGetDeviceSessionStateMock,\n getDeviceSessionStateObservable: apiGetDeviceSessionStateObservableMock,\n setDeviceSessionState: setDeviceSessionStateMock,\n getManagerApiService: getManagerApiServiceMock,\n getSecureChannelService: getSecureChannelServiceMock,\n disableRefresher: disableRefresherMock,\n };\n}\n"],
5
- "mappings": "AAGA,MAAMA,EAAe,GAAG,GAAG,EACrBC,EAAkB,GAAG,GAAG,EACxBC,EAA+B,GAAG,GAAG,EACrCC,EAAyC,GAAG,GAAG,EAC/CC,EAA4B,GAAG,GAAG,EAClCC,EAA2B,GAAG,GAAG,EACjCC,EAA8B,GAAG,GAAG,EACpCC,EAAuB,GAAG,GAAG,EAE5B,SAASC,GAAuD,CACrE,MAAO,CACL,SAAUR,EACV,YAAaC,EACb,sBAAuBC,EACvB,gCAAiCC,EACjC,sBAAuBC,EACvB,qBAAsBC,EACtB,wBAAyBC,EACzB,iBAAkBC,CACpB,CACF",
6
- "names": ["sendApduMock", "sendCommandMock", "apiGetDeviceSessionStateMock", "apiGetDeviceSessionStateObservableMock", "setDeviceSessionStateMock", "getManagerApiServiceMock", "getSecureChannelServiceMock", "disableRefresherMock", "makeDeviceActionInternalApiMock"]
4
+ "sourcesContent": ["import { type InternalApi } from \"@ledgerhq/device-management-kit\";\nimport { type Mocked } from \"vitest\";\n\nexport function makeDeviceActionInternalApiMock(): Mocked<InternalApi> {\n return {\n sendApdu: vi.fn(),\n sendCommand: vi.fn().mockResolvedValue(undefined),\n getDeviceModel: vi.fn(),\n getDeviceSessionState: vi.fn(),\n getDeviceSessionStateObservable: vi.fn(),\n setDeviceSessionState: vi.fn(),\n getManagerApiService: vi.fn(),\n getSecureChannelService: vi.fn(),\n disableRefresher: vi.fn(),\n };\n}\n"],
5
+ "mappings": "AAGO,SAASA,GAAuD,CACrE,MAAO,CACL,SAAU,GAAG,GAAG,EAChB,YAAa,GAAG,GAAG,EAAE,kBAAkB,MAAS,EAChD,eAAgB,GAAG,GAAG,EACtB,sBAAuB,GAAG,GAAG,EAC7B,gCAAiC,GAAG,GAAG,EACvC,sBAAuB,GAAG,GAAG,EAC7B,qBAAsB,GAAG,GAAG,EAC5B,wBAAyB,GAAG,GAAG,EAC/B,iBAAkB,GAAG,GAAG,CAC1B,CACF",
6
+ "names": ["makeDeviceActionInternalApiMock"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{ContainerModule as o}from"inversify";import{appBinderTypes as i}from"../../app-binder/di/appBinderTypes";import{SolanaAppBinder as r}from"../../app-binder/SolanaAppBinder";const B=()=>new o((n,p,e,t,d,a,m)=>{n(i.AppBinder).to(r)});export{B as appBinderModuleFactory};
1
+ import{ContainerModule as p}from"inversify";import{appBinderTypes as r}from"../../app-binder/di/appBinderTypes";import{SolanaAppBinder as e}from"../../app-binder/SolanaAppBinder";const a=()=>new p(({bind:o})=>{o(r.AppBinder).to(e)});export{a as appBinderModuleFactory};
2
2
  //# sourceMappingURL=appBinderModule.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/di/appBinderModule.ts"],
4
- "sourcesContent": ["import { ContainerModule } from \"inversify\";\n\nimport { appBinderTypes } from \"@internal/app-binder/di/appBinderTypes\";\nimport { SolanaAppBinder } from \"@internal/app-binder/SolanaAppBinder\";\n\nexport const appBinderModuleFactory = () =>\n new ContainerModule(\n (\n bind,\n _unbind,\n _isBound,\n _rebind,\n _unbindAsync,\n _onActivation,\n _onDeactivation,\n ) => {\n bind(appBinderTypes.AppBinder).to(SolanaAppBinder);\n },\n );\n"],
5
- "mappings": "AAAA,OAAS,mBAAAA,MAAuB,YAEhC,OAAS,kBAAAC,MAAsB,yCAC/B,OAAS,mBAAAC,MAAuB,uCAEzB,MAAMC,EAAyB,IACpC,IAAIH,EACF,CACEI,EACAC,EACAC,EACAC,EACAC,EACAC,EACAC,IACG,CACHN,EAAKH,EAAe,SAAS,EAAE,GAAGC,CAAe,CACnD,CACF",
6
- "names": ["ContainerModule", "appBinderTypes", "SolanaAppBinder", "appBinderModuleFactory", "bind", "_unbind", "_isBound", "_rebind", "_unbindAsync", "_onActivation", "_onDeactivation"]
4
+ "sourcesContent": ["import { ContainerModule } from \"inversify\";\n\nimport { appBinderTypes } from \"@internal/app-binder/di/appBinderTypes\";\nimport { SolanaAppBinder } from \"@internal/app-binder/SolanaAppBinder\";\n\nexport const appBinderModuleFactory = () =>\n new ContainerModule(({ bind }) => {\n bind(appBinderTypes.AppBinder).to(SolanaAppBinder);\n });\n"],
5
+ "mappings": "AAAA,OAAS,mBAAAA,MAAuB,YAEhC,OAAS,kBAAAC,MAAsB,yCAC/B,OAAS,mBAAAC,MAAuB,uCAEzB,MAAMC,EAAyB,IACpC,IAAIH,EAAgB,CAAC,CAAE,KAAAI,CAAK,IAAM,CAChCA,EAAKH,EAAe,SAAS,EAAE,GAAGC,CAAe,CACnD,CAAC",
6
+ "names": ["ContainerModule", "appBinderTypes", "SolanaAppBinder", "appBinderModuleFactory", "bind"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{Container as r}from"inversify";import{appBinderModuleFactory as t}from"./appBinderModule";describe("appBinderModule",()=>{describe("Default",()=>{let o,e;beforeEach(()=>{e=t(),o=new r,o.load(e)}),it("should return appBinder module",()=>{expect(e).toBeDefined()})})});
1
+ import{Container as r}from"inversify";import{appBinderModuleFactory as t}from"./appBinderModule";describe("appBinderModule",()=>{describe("Default",()=>{let o,e;beforeEach(()=>{e=t(),o=new r,o.loadSync(e)}),it("should return appBinder module",()=>{expect(e).toBeDefined()})})});
2
2
  //# sourceMappingURL=appBinderModule.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/di/appBinderModule.test.ts"],
4
- "sourcesContent": ["import { Container } from \"inversify\";\n\nimport { appBinderModuleFactory } from \"./appBinderModule\";\n\ndescribe(\"appBinderModule\", () => {\n describe(\"Default\", () => {\n let container: Container;\n let mod: ReturnType<typeof appBinderModuleFactory>;\n beforeEach(() => {\n mod = appBinderModuleFactory();\n container = new Container();\n container.load(mod);\n });\n\n it(\"should return appBinder module\", () => {\n expect(mod).toBeDefined();\n });\n });\n});\n"],
5
- "mappings": "AAAA,OAAS,aAAAA,MAAiB,YAE1B,OAAS,0BAAAC,MAA8B,oBAEvC,SAAS,kBAAmB,IAAM,CAChC,SAAS,UAAW,IAAM,CACxB,IAAIC,EACAC,EACJ,WAAW,IAAM,CACfA,EAAMF,EAAuB,EAC7BC,EAAY,IAAIF,EAChBE,EAAU,KAAKC,CAAG,CACpB,CAAC,EAED,GAAG,iCAAkC,IAAM,CACzC,OAAOA,CAAG,EAAE,YAAY,CAC1B,CAAC,CACH,CAAC,CACH,CAAC",
4
+ "sourcesContent": ["import { Container } from \"inversify\";\n\nimport { appBinderModuleFactory } from \"./appBinderModule\";\n\ndescribe(\"appBinderModule\", () => {\n describe(\"Default\", () => {\n let container: Container;\n let mod: ReturnType<typeof appBinderModuleFactory>;\n beforeEach(() => {\n mod = appBinderModuleFactory();\n container = new Container();\n container.loadSync(mod);\n });\n\n it(\"should return appBinder module\", () => {\n expect(mod).toBeDefined();\n });\n });\n});\n"],
5
+ "mappings": "AAAA,OAAS,aAAAA,MAAiB,YAE1B,OAAS,0BAAAC,MAA8B,oBAEvC,SAAS,kBAAmB,IAAM,CAChC,SAAS,UAAW,IAAM,CACxB,IAAIC,EACAC,EACJ,WAAW,IAAM,CACfA,EAAMF,EAAuB,EAC7BC,EAAY,IAAIF,EAChBE,EAAU,SAASC,CAAG,CACxB,CAAC,EAED,GAAG,iCAAkC,IAAM,CACzC,OAAOA,CAAG,EAAE,YAAY,CAC1B,CAAC,CACH,CAAC,CACH,CAAC",
6
6
  "names": ["Container", "appBinderModuleFactory", "container", "mod"]
7
7
  }
@@ -0,0 +1,2 @@
1
+ import{DeviceSessionStateType as t}from"@ledgerhq/device-management-kit";import{gt as s,gte as o}from"semver";class l{isCompatible=!0;version="0.0.1";modelId;constructor(e,i){if(this.modelId=e.deviceModelId,e.sessionStateType===t.Connected){this.isCompatible=!1;return}if(e.currentApp.name!=="Solana"){this.isCompatible=!1;return}e.currentApp.name==="Solana"?this.version=e.currentApp.version:this.version=i.version}withMinVersionInclusive(e){return o(this.version,e)||(this.isCompatible=!1),this}withMinVersionExclusive(e){return s(this.version,e)||(this.isCompatible=!1),this}excludeDeviceModel(e){return this.modelId===e&&(this.isCompatible=!1),this}check(){return this.isCompatible}}export{l as ApplicationChecker};
2
+ //# sourceMappingURL=ApplicationChecker.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/services/ApplicationChecker.ts"],
4
+ "sourcesContent": ["import {\n type DeviceModelId,\n type DeviceSessionState,\n DeviceSessionStateType,\n} from \"@ledgerhq/device-management-kit\";\nimport { gt, gte } from \"semver\";\n\nimport { type AppConfiguration } from \"@api/model/AppConfiguration\";\n\nexport class ApplicationChecker {\n private isCompatible: boolean = true;\n private version: string = \"0.0.1\";\n private modelId: DeviceModelId;\n\n constructor(deviceState: DeviceSessionState, appConfig: AppConfiguration) {\n this.modelId = deviceState.deviceModelId;\n\n // If device is not ready or app is unexpected, checker cannot be successful\n if (deviceState.sessionStateType === DeviceSessionStateType.Connected) {\n this.isCompatible = false;\n return;\n }\n if (deviceState.currentApp.name !== \"Solana\") {\n this.isCompatible = false;\n return;\n }\n if (deviceState.currentApp.name === \"Solana\") {\n this.version = deviceState.currentApp.version;\n } else {\n // Fallback on appConfig version if a plugin is running.\n // It won't contain release candidate suffix but it should be enough for that edge case.\n this.version = appConfig.version;\n }\n }\n\n withMinVersionInclusive(version: string): ApplicationChecker {\n if (!gte(this.version, version)) {\n this.isCompatible = false;\n }\n return this;\n }\n\n withMinVersionExclusive(version: string): ApplicationChecker {\n if (!gt(this.version, version)) {\n this.isCompatible = false;\n }\n return this;\n }\n\n excludeDeviceModel(modelId: DeviceModelId): ApplicationChecker {\n if (this.modelId === modelId) {\n this.isCompatible = false;\n }\n return this;\n }\n\n check(): boolean {\n return this.isCompatible;\n }\n}\n"],
5
+ "mappings": "AAAA,OAGE,0BAAAA,MACK,kCACP,OAAS,MAAAC,EAAI,OAAAC,MAAW,SAIjB,MAAMC,CAAmB,CACtB,aAAwB,GACxB,QAAkB,QAClB,QAER,YAAYC,EAAiCC,EAA6B,CAIxE,GAHA,KAAK,QAAUD,EAAY,cAGvBA,EAAY,mBAAqBJ,EAAuB,UAAW,CACrE,KAAK,aAAe,GACpB,MACF,CACA,GAAII,EAAY,WAAW,OAAS,SAAU,CAC5C,KAAK,aAAe,GACpB,MACF,CACIA,EAAY,WAAW,OAAS,SAClC,KAAK,QAAUA,EAAY,WAAW,QAItC,KAAK,QAAUC,EAAU,OAE7B,CAEA,wBAAwBC,EAAqC,CAC3D,OAAKJ,EAAI,KAAK,QAASI,CAAO,IAC5B,KAAK,aAAe,IAEf,IACT,CAEA,wBAAwBA,EAAqC,CAC3D,OAAKL,EAAG,KAAK,QAASK,CAAO,IAC3B,KAAK,aAAe,IAEf,IACT,CAEA,mBAAmBC,EAA4C,CAC7D,OAAI,KAAK,UAAYA,IACnB,KAAK,aAAe,IAEf,IACT,CAEA,OAAiB,CACf,OAAO,KAAK,YACd,CACF",
6
+ "names": ["DeviceSessionStateType", "gt", "gte", "ApplicationChecker", "deviceState", "appConfig", "version", "modelId"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{DeviceModelId as s,DeviceSessionStateType as o,DeviceStatus as i}from"@ledgerhq/device-management-kit";import{describe as r,expect as c,it as l}from"vitest";import{PublicKeyDisplayMode as u}from"../../../api/model/PublicKeyDisplayMode";import{ApplicationChecker as a}from"./ApplicationChecker";function d(e){return{version:e,blindSigningEnabled:!1,pubKeyDisplayMode:u.SHORT}}r("ApplicationChecker (Solana)",()=>{l("should pass check when on Solana app and in valid state",()=>{const e={sessionStateType:o.ReadyWithoutSecureChannel,deviceStatus:i.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.0"},deviceModelId:s.FLEX,isSecureConnectionAllowed:!1},n=d("1.4.0"),t=new a(e,n).check();c(t).toBe(!0)}),l("should reject if session state is Connected",()=>{const e={sessionStateType:o.Connected,deviceStatus:i.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.0"},deviceModelId:s.FLEX,isSecureConnectionAllowed:!1},n=d("1.4.0"),t=new a(e,n).check();c(t).toBe(!1)}),l("should reject if not Solana app",()=>{const e={sessionStateType:o.ReadyWithoutSecureChannel,deviceStatus:i.CONNECTED,installedApps:[],currentApp:{name:"Ethereum",version:"1.0.0"},deviceModelId:s.FLEX,isSecureConnectionAllowed:!1},n=d("1.0.0"),t=new a(e,n).check();c(t).toBe(!1)}),l("should pass with min version inclusive",()=>{const e={sessionStateType:o.ReadyWithoutSecureChannel,deviceStatus:i.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.0"},deviceModelId:s.FLEX,isSecureConnectionAllowed:!1},n=d("1.4.0"),t=new a(e,n).withMinVersionInclusive("1.3.0").check();c(t).toBe(!0)}),l("should reject with min version inclusive if version too low",()=>{const e={sessionStateType:o.ReadyWithoutSecureChannel,deviceStatus:i.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.3.0"},deviceModelId:s.FLEX,isSecureConnectionAllowed:!1},n=d("1.3.0"),t=new a(e,n).withMinVersionInclusive("1.4.0").check();c(t).toBe(!1)}),l("should pass with min version exclusive",()=>{const e={sessionStateType:o.ReadyWithoutSecureChannel,deviceStatus:i.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.0"},deviceModelId:s.FLEX,isSecureConnectionAllowed:!1},n=d("1.4.0"),t=new a(e,n).withMinVersionExclusive("1.3.0").check();c(t).toBe(!0)}),l("should reject with min version exclusive if equal",()=>{const e={sessionStateType:o.ReadyWithoutSecureChannel,deviceStatus:i.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.0"},deviceModelId:s.FLEX,isSecureConnectionAllowed:!1},n=d("1.4.0"),t=new a(e,n).withMinVersionExclusive("1.4.0").check();c(t).toBe(!1)}),l("should reject excluded device model",()=>{const e={sessionStateType:o.ReadyWithoutSecureChannel,deviceStatus:i.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.0"},deviceModelId:s.NANO_S,isSecureConnectionAllowed:!1},n=d("1.4.0"),t=new a(e,n).excludeDeviceModel(s.NANO_S).check();c(t).toBe(!1)}),l("should allow allowed device model",()=>{const e={sessionStateType:o.ReadyWithoutSecureChannel,deviceStatus:i.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.0"},deviceModelId:s.FLEX,isSecureConnectionAllowed:!1},n=d("1.4.0"),t=new a(e,n).excludeDeviceModel(s.NANO_S).check();c(t).toBe(!0)})});
2
+ //# sourceMappingURL=ApplicationChecker.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/services/ApplicationChecker.test.ts"],
4
+ "sourcesContent": ["import {\n DeviceModelId,\n DeviceSessionStateType,\n DeviceStatus,\n} from \"@ledgerhq/device-management-kit\";\nimport { describe, expect, it } from \"vitest\";\n\nimport { type AppConfiguration } from \"@api/model/AppConfiguration\";\nimport { PublicKeyDisplayMode } from \"@api/model/PublicKeyDisplayMode\";\n\nimport { ApplicationChecker } from \"./ApplicationChecker\";\n\nfunction createAppConfig(version: string): AppConfiguration {\n return {\n version,\n blindSigningEnabled: false,\n pubKeyDisplayMode: PublicKeyDisplayMode.SHORT,\n };\n}\n\ndescribe(\"ApplicationChecker (Solana)\", () => {\n it(\"should pass check when on Solana app and in valid state\", () => {\n // given\n const state = {\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n };\n const config = createAppConfig(\"1.4.0\");\n\n // when\n const result = new ApplicationChecker(state, config).check();\n\n // then\n expect(result).toBe(true);\n });\n\n it(\"should reject if session state is Connected\", () => {\n // given\n const state = {\n sessionStateType: DeviceSessionStateType.Connected,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n };\n const config = createAppConfig(\"1.4.0\");\n\n // when\n const result = new ApplicationChecker(state, config).check();\n\n // then\n expect(result).toBe(false);\n });\n\n it(\"should reject if not Solana app\", () => {\n // given\n const state = {\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Ethereum\", version: \"1.0.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n };\n const config = createAppConfig(\"1.0.0\");\n // when\n const result = new ApplicationChecker(state, config).check();\n\n // then\n expect(result).toBe(false);\n });\n\n it(\"should pass with min version inclusive\", () => {\n // given\n const state = {\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n };\n const config = createAppConfig(\"1.4.0\");\n\n // when\n const result = new ApplicationChecker(state, config)\n .withMinVersionInclusive(\"1.3.0\")\n .check();\n\n // then\n expect(result).toBe(true);\n });\n\n it(\"should reject with min version inclusive if version too low\", () => {\n // given\n const state = {\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.3.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n };\n const config = createAppConfig(\"1.3.0\");\n\n // when\n const result = new ApplicationChecker(state, config)\n .withMinVersionInclusive(\"1.4.0\")\n .check();\n\n // then\n expect(result).toBe(false);\n });\n\n it(\"should pass with min version exclusive\", () => {\n // given\n const state = {\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n };\n const config = createAppConfig(\"1.4.0\");\n\n // when\n const result = new ApplicationChecker(state, config)\n .withMinVersionExclusive(\"1.3.0\")\n .check();\n\n // then\n expect(result).toBe(true);\n });\n\n it(\"should reject with min version exclusive if equal\", () => {\n // given\n const state = {\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n };\n const config = createAppConfig(\"1.4.0\");\n\n // when\n const result = new ApplicationChecker(state, config)\n .withMinVersionExclusive(\"1.4.0\")\n .check();\n\n // then\n expect(result).toBe(false);\n });\n\n it(\"should reject excluded device model\", () => {\n // given\n const state = {\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.0\" },\n deviceModelId: DeviceModelId.NANO_S,\n isSecureConnectionAllowed: false,\n };\n const config = createAppConfig(\"1.4.0\");\n\n // when\n const result = new ApplicationChecker(state, config)\n .excludeDeviceModel(DeviceModelId.NANO_S)\n .check();\n\n // then\n expect(result).toBe(false);\n });\n\n it(\"should allow allowed device model\", () => {\n // given\n const state = {\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.0\" },\n deviceModelId: DeviceModelId.FLEX,\n isSecureConnectionAllowed: false,\n };\n const config = createAppConfig(\"1.4.0\");\n\n // when\n const result = new ApplicationChecker(state, config)\n .excludeDeviceModel(DeviceModelId.NANO_S)\n .check();\n\n // then\n expect(result).toBe(true);\n });\n});\n"],
5
+ "mappings": "AAAA,OACE,iBAAAA,EACA,0BAAAC,EACA,gBAAAC,MACK,kCACP,OAAS,YAAAC,EAAU,UAAAC,EAAQ,MAAAC,MAAU,SAGrC,OAAS,wBAAAC,MAA4B,kCAErC,OAAS,sBAAAC,MAA0B,uBAEnC,SAASC,EAAgBC,EAAmC,CAC1D,MAAO,CACL,QAAAA,EACA,oBAAqB,GACrB,kBAAmBH,EAAqB,KAC1C,CACF,CAEAH,EAAS,8BAA+B,IAAM,CAC5CE,EAAG,0DAA2D,IAAM,CAElE,MAAMK,EAAQ,CACZ,iBAAkBT,EAAuB,0BACzC,aAAcC,EAAa,UAC3B,cAAe,CAAC,EAChB,WAAY,CAAE,KAAM,SAAU,QAAS,OAAQ,EAC/C,cAAeF,EAAc,KAC7B,0BAA2B,EAC7B,EACMW,EAASH,EAAgB,OAAO,EAGhCI,EAAS,IAAIL,EAAmBG,EAAOC,CAAM,EAAE,MAAM,EAG3DP,EAAOQ,CAAM,EAAE,KAAK,EAAI,CAC1B,CAAC,EAEDP,EAAG,8CAA+C,IAAM,CAEtD,MAAMK,EAAQ,CACZ,iBAAkBT,EAAuB,UACzC,aAAcC,EAAa,UAC3B,cAAe,CAAC,EAChB,WAAY,CAAE,KAAM,SAAU,QAAS,OAAQ,EAC/C,cAAeF,EAAc,KAC7B,0BAA2B,EAC7B,EACMW,EAASH,EAAgB,OAAO,EAGhCI,EAAS,IAAIL,EAAmBG,EAAOC,CAAM,EAAE,MAAM,EAG3DP,EAAOQ,CAAM,EAAE,KAAK,EAAK,CAC3B,CAAC,EAEDP,EAAG,kCAAmC,IAAM,CAE1C,MAAMK,EAAQ,CACZ,iBAAkBT,EAAuB,0BACzC,aAAcC,EAAa,UAC3B,cAAe,CAAC,EAChB,WAAY,CAAE,KAAM,WAAY,QAAS,OAAQ,EACjD,cAAeF,EAAc,KAC7B,0BAA2B,EAC7B,EACMW,EAASH,EAAgB,OAAO,EAEhCI,EAAS,IAAIL,EAAmBG,EAAOC,CAAM,EAAE,MAAM,EAG3DP,EAAOQ,CAAM,EAAE,KAAK,EAAK,CAC3B,CAAC,EAEDP,EAAG,yCAA0C,IAAM,CAEjD,MAAMK,EAAQ,CACZ,iBAAkBT,EAAuB,0BACzC,aAAcC,EAAa,UAC3B,cAAe,CAAC,EAChB,WAAY,CAAE,KAAM,SAAU,QAAS,OAAQ,EAC/C,cAAeF,EAAc,KAC7B,0BAA2B,EAC7B,EACMW,EAASH,EAAgB,OAAO,EAGhCI,EAAS,IAAIL,EAAmBG,EAAOC,CAAM,EAChD,wBAAwB,OAAO,EAC/B,MAAM,EAGTP,EAAOQ,CAAM,EAAE,KAAK,EAAI,CAC1B,CAAC,EAEDP,EAAG,8DAA+D,IAAM,CAEtE,MAAMK,EAAQ,CACZ,iBAAkBT,EAAuB,0BACzC,aAAcC,EAAa,UAC3B,cAAe,CAAC,EAChB,WAAY,CAAE,KAAM,SAAU,QAAS,OAAQ,EAC/C,cAAeF,EAAc,KAC7B,0BAA2B,EAC7B,EACMW,EAASH,EAAgB,OAAO,EAGhCI,EAAS,IAAIL,EAAmBG,EAAOC,CAAM,EAChD,wBAAwB,OAAO,EAC/B,MAAM,EAGTP,EAAOQ,CAAM,EAAE,KAAK,EAAK,CAC3B,CAAC,EAEDP,EAAG,yCAA0C,IAAM,CAEjD,MAAMK,EAAQ,CACZ,iBAAkBT,EAAuB,0BACzC,aAAcC,EAAa,UAC3B,cAAe,CAAC,EAChB,WAAY,CAAE,KAAM,SAAU,QAAS,OAAQ,EAC/C,cAAeF,EAAc,KAC7B,0BAA2B,EAC7B,EACMW,EAASH,EAAgB,OAAO,EAGhCI,EAAS,IAAIL,EAAmBG,EAAOC,CAAM,EAChD,wBAAwB,OAAO,EAC/B,MAAM,EAGTP,EAAOQ,CAAM,EAAE,KAAK,EAAI,CAC1B,CAAC,EAEDP,EAAG,oDAAqD,IAAM,CAE5D,MAAMK,EAAQ,CACZ,iBAAkBT,EAAuB,0BACzC,aAAcC,EAAa,UAC3B,cAAe,CAAC,EAChB,WAAY,CAAE,KAAM,SAAU,QAAS,OAAQ,EAC/C,cAAeF,EAAc,KAC7B,0BAA2B,EAC7B,EACMW,EAASH,EAAgB,OAAO,EAGhCI,EAAS,IAAIL,EAAmBG,EAAOC,CAAM,EAChD,wBAAwB,OAAO,EAC/B,MAAM,EAGTP,EAAOQ,CAAM,EAAE,KAAK,EAAK,CAC3B,CAAC,EAEDP,EAAG,sCAAuC,IAAM,CAE9C,MAAMK,EAAQ,CACZ,iBAAkBT,EAAuB,0BACzC,aAAcC,EAAa,UAC3B,cAAe,CAAC,EAChB,WAAY,CAAE,KAAM,SAAU,QAAS,OAAQ,EAC/C,cAAeF,EAAc,OAC7B,0BAA2B,EAC7B,EACMW,EAASH,EAAgB,OAAO,EAGhCI,EAAS,IAAIL,EAAmBG,EAAOC,CAAM,EAChD,mBAAmBX,EAAc,MAAM,EACvC,MAAM,EAGTI,EAAOQ,CAAM,EAAE,KAAK,EAAK,CAC3B,CAAC,EAEDP,EAAG,oCAAqC,IAAM,CAE5C,MAAMK,EAAQ,CACZ,iBAAkBT,EAAuB,0BACzC,aAAcC,EAAa,UAC3B,cAAe,CAAC,EAChB,WAAY,CAAE,KAAM,SAAU,QAAS,OAAQ,EAC/C,cAAeF,EAAc,KAC7B,0BAA2B,EAC7B,EACMW,EAASH,EAAgB,OAAO,EAGhCI,EAAS,IAAIL,EAAmBG,EAAOC,CAAM,EAChD,mBAAmBX,EAAc,MAAM,EACvC,MAAM,EAGTI,EAAOQ,CAAM,EAAE,KAAK,EAAI,CAC1B,CAAC,CACH,CAAC",
6
+ "names": ["DeviceModelId", "DeviceSessionStateType", "DeviceStatus", "describe", "expect", "it", "PublicKeyDisplayMode", "ApplicationChecker", "createAppConfig", "version", "state", "config", "result"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{ASSOCIATED_TOKEN_PROGRAM_ID as m,createTransferCheckedInstruction as A,getAssociatedTokenAddressSync as b,TOKEN_PROGRAM_ID as f}from"@solana/spl-token";import{PublicKey as s,SystemProgram as w,Transaction as T}from"@solana/web3.js";const d={USDC:{mint:new s("EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v"),decimals:6}};class D{generateUsdcTransaction(e,n,t,i=1){return this.generateSplTokenTransaction(e,n,d.USDC.mint.toBase58(),t,d.USDC.decimals,i)}generateSplTokenTransaction(e,n,t,i,a,c=1){const r=new s(e),o=new s(n),u=new s(t),p=b(u,r,!1,f,m),S=b(u,o,!1,f,m),y=BigInt(Math.round(i*10**a)),g=new T({recentBlockhash:"a3PD566oU2nE9JHwuC897aaT7ispdqaQ63Si6jzyKAg",feePayer:r});for(let l=0;l<c;l++)g.add(A(p,u,S,r,y,a,[]));return g.signatures=[{publicKey:r,signature:null}],this.toBase64(g.serializeMessage())}generatePlainSolanaTransaction(e,n,t,i=1){const a=new s(e),c=new s(n),r=new T({recentBlockhash:"a3PD566oU2nE9JHwuC897aaT7ispdqaQ63Si6jzyKAg",feePayer:a});for(let o=0;o<i;o++)r.add(w.transfer({fromPubkey:a,toPubkey:c,lamports:t}));return r.signatures=[{publicKey:a,signature:null}],this.toBase64(r.serializeMessage())}toBase64(e){let n="";for(const t of e){if(typeof t!="number")throw new Error("Invalid byte value");n+=String.fromCharCode(t)}try{return btoa(n)}catch{return Buffer.from(e).toString("base64")}}}export{d as COIN_DATA,D as GenerateSolanaTransaction};
2
+ //# sourceMappingURL=GenerateSolanaTransaction.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/services/GenerateSolanaTransaction.ts"],
4
+ "sourcesContent": ["import {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n createTransferCheckedInstruction,\n getAssociatedTokenAddressSync,\n TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport { PublicKey, SystemProgram, Transaction } from \"@solana/web3.js\";\n\nexport const COIN_DATA = {\n USDC: {\n mint: new PublicKey(\"EPjFWdd5AufqSSqeM2qN1xzybapC8G4wEGGkZwyTDt1v\"),\n decimals: 6,\n },\n};\n\nexport class GenerateSolanaTransaction {\n public generateUsdcTransaction(\n feePayerKey: string,\n recipientKey: string,\n usdcAmount: number,\n numberOfTransfers: number = 1,\n ): string {\n return this.generateSplTokenTransaction(\n feePayerKey,\n recipientKey,\n COIN_DATA.USDC.mint.toBase58(),\n usdcAmount,\n COIN_DATA.USDC.decimals,\n numberOfTransfers,\n );\n }\n\n public generateSplTokenTransaction(\n feePayerKey: string,\n recipientKey: string,\n mintAddress: string,\n amountInTokens: number,\n decimals: number,\n numberOfTransfers: number = 1,\n ): string {\n const feePayer = new PublicKey(feePayerKey);\n const recipient = new PublicKey(recipientKey);\n const mint = new PublicKey(mintAddress);\n\n const sourceATA = getAssociatedTokenAddressSync(\n mint,\n feePayer,\n false,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n const destATA = getAssociatedTokenAddressSync(\n mint,\n recipient,\n false,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const amount = BigInt(Math.round(amountInTokens * 10 ** decimals));\n\n const tx = new Transaction({\n // hardcoded as transaction won't be broadcasted but only used for testing\n recentBlockhash: \"a3PD566oU2nE9JHwuC897aaT7ispdqaQ63Si6jzyKAg\",\n feePayer,\n });\n for (let i = 0; i < numberOfTransfers; i++) {\n tx.add(\n createTransferCheckedInstruction(\n sourceATA,\n mint,\n destATA,\n feePayer,\n amount,\n decimals,\n [],\n ),\n );\n }\n\n tx.signatures = [{ publicKey: feePayer, signature: null }];\n\n return this.toBase64(tx.serializeMessage());\n }\n\n public generatePlainSolanaTransaction(\n feePayerKey: string,\n recipientKey: string,\n lamports: number,\n numberOfTransactions: number = 1,\n ): string {\n const feePayer = new PublicKey(feePayerKey);\n const recipient = new PublicKey(recipientKey);\n\n const tx = new Transaction({\n // hardcoded as transaction won't be broadcasted but only used for testing\n recentBlockhash: \"a3PD566oU2nE9JHwuC897aaT7ispdqaQ63Si6jzyKAg\",\n feePayer,\n });\n for (let i = 0; i < numberOfTransactions; i++) {\n tx.add(\n SystemProgram.transfer({\n fromPubkey: feePayer,\n toPubkey: recipient,\n lamports,\n }),\n );\n }\n tx.signatures = [{ publicKey: feePayer, signature: null }];\n return this.toBase64(tx.serializeMessage());\n }\n\n private toBase64(bytes: Uint8Array): string {\n let bin = \"\";\n for (const b of bytes) {\n if (typeof b !== \"number\") throw new Error(\"Invalid byte value\");\n bin += String.fromCharCode(b);\n }\n try {\n return btoa(bin);\n } catch {\n return Buffer.from(bytes).toString(\"base64\");\n }\n }\n}\n"],
5
+ "mappings": "AAAA,OACE,+BAAAA,EACA,oCAAAC,EACA,iCAAAC,EACA,oBAAAC,MACK,oBACP,OAAS,aAAAC,EAAW,iBAAAC,EAAe,eAAAC,MAAmB,kBAE/C,MAAMC,EAAY,CACvB,KAAM,CACJ,KAAM,IAAIH,EAAU,8CAA8C,EAClE,SAAU,CACZ,CACF,EAEO,MAAMI,CAA0B,CAC9B,wBACLC,EACAC,EACAC,EACAC,EAA4B,EACpB,CACR,OAAO,KAAK,4BACVH,EACAC,EACAH,EAAU,KAAK,KAAK,SAAS,EAC7BI,EACAJ,EAAU,KAAK,SACfK,CACF,CACF,CAEO,4BACLH,EACAC,EACAG,EACAC,EACAC,EACAH,EAA4B,EACpB,CACR,MAAMI,EAAW,IAAIZ,EAAUK,CAAW,EACpCQ,EAAY,IAAIb,EAAUM,CAAY,EACtCQ,EAAO,IAAId,EAAUS,CAAW,EAEhCM,EAAYjB,EAChBgB,EACAF,EACA,GACAb,EACAH,CACF,EACMoB,EAAUlB,EACdgB,EACAD,EACA,GACAd,EACAH,CACF,EAEMqB,EAAS,OAAO,KAAK,MAAMP,EAAiB,IAAMC,CAAQ,CAAC,EAE3DO,EAAK,IAAIhB,EAAY,CAEzB,gBAAiB,8CACjB,SAAAU,CACF,CAAC,EACD,QAASO,EAAI,EAAGA,EAAIX,EAAmBW,IACrCD,EAAG,IACDrB,EACEkB,EACAD,EACAE,EACAJ,EACAK,EACAN,EACA,CAAC,CACH,CACF,EAGF,OAAAO,EAAG,WAAa,CAAC,CAAE,UAAWN,EAAU,UAAW,IAAK,CAAC,EAElD,KAAK,SAASM,EAAG,iBAAiB,CAAC,CAC5C,CAEO,+BACLb,EACAC,EACAc,EACAC,EAA+B,EACvB,CACR,MAAMT,EAAW,IAAIZ,EAAUK,CAAW,EACpCQ,EAAY,IAAIb,EAAUM,CAAY,EAEtCY,EAAK,IAAIhB,EAAY,CAEzB,gBAAiB,8CACjB,SAAAU,CACF,CAAC,EACD,QAASO,EAAI,EAAGA,EAAIE,EAAsBF,IACxCD,EAAG,IACDjB,EAAc,SAAS,CACrB,WAAYW,EACZ,SAAUC,EACV,SAAAO,CACF,CAAC,CACH,EAEF,OAAAF,EAAG,WAAa,CAAC,CAAE,UAAWN,EAAU,UAAW,IAAK,CAAC,EAClD,KAAK,SAASM,EAAG,iBAAiB,CAAC,CAC5C,CAEQ,SAASI,EAA2B,CAC1C,IAAIC,EAAM,GACV,UAAWC,KAAKF,EAAO,CACrB,GAAI,OAAOE,GAAM,SAAU,MAAM,IAAI,MAAM,oBAAoB,EAC/DD,GAAO,OAAO,aAAaC,CAAC,CAC9B,CACA,GAAI,CACF,OAAO,KAAKD,CAAG,CACjB,MAAQ,CACN,OAAO,OAAO,KAAKD,CAAK,EAAE,SAAS,QAAQ,CAC7C,CACF,CACF",
6
+ "names": ["ASSOCIATED_TOKEN_PROGRAM_ID", "createTransferCheckedInstruction", "getAssociatedTokenAddressSync", "TOKEN_PROGRAM_ID", "PublicKey", "SystemProgram", "Transaction", "COIN_DATA", "GenerateSolanaTransaction", "feePayerKey", "recipientKey", "usdcAmount", "numberOfTransfers", "mintAddress", "amountInTokens", "decimals", "feePayer", "recipient", "mint", "sourceATA", "destATA", "amount", "tx", "i", "lamports", "numberOfTransactions", "bytes", "bin", "b"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{ASSOCIATED_TOKEN_PROGRAM_ID as d,getAssociatedTokenAddressSync as S,TOKEN_PROGRAM_ID as p}from"@solana/spl-token";import{Keypair as B,Message as b,SystemProgram as I}from"@solana/web3.js";import{describe as U,expect as e,it as K}from"vitest";import{COIN_DATA as m,GenerateSolanaTransaction as g}from"./GenerateSolanaTransaction";U("GenerateSolanaTransaction",()=>{const y=B.generate(),T=B.generate(),c=y.publicKey.toBase58(),r=T.publicKey.toBase58();K("generateUsdcTransaction should equal generateSplTokenTransaction with USDC constants",()=>{const s=new g,n=s.generateUsdcTransaction(c,r,2.5,3),a=s.generateSplTokenTransaction(c,r,m.USDC.mint.toBase58(),2.5,m.USDC.decimals,3);e(n).toBe(a)}),K("generateSplTokenTransaction emits correct SPL-Token TransferChecked instructions",()=>{const s=new g,n=m.USDC.mint,a=m.USDC.decimals,f=1.25,l=2,o=s.generateSplTokenTransaction(c,r,n.toBase58(),f,a,l),i=Uint8Array.from(Buffer.from(o,"base64")),t=b.from(i);e(t.instructions).toHaveLength(l);const P=S(n,y.publicKey,!1,p,d),A=S(n,T.publicKey,!1,p,d);for(const u of t.instructions){const D=t.accountKeys[u.programIdIndex];e(D.equals(p)).toBe(!0),e(t.accountKeys[u.accounts[0]].equals(P)).toBe(!0),e(t.accountKeys[u.accounts[1]].equals(n)).toBe(!0),e(t.accountKeys[u.accounts[2]].equals(A)).toBe(!0),e(t.accountKeys[u.accounts[3]].equals(y.publicKey)).toBe(!0)}}),K("generatePlainSolanaTransaction emits correct SystemProgram.transfer instructions",()=>{const s=new g,n=1e3,a=3,f=s.generatePlainSolanaTransaction(c,r,n,a),l=Uint8Array.from(Buffer.from(f,"base64")),o=b.from(l);e(o.instructions).toHaveLength(a);for(const i of o.instructions){const t=o.accountKeys[i.programIdIndex];e(t.equals(I.programId)).toBe(!0),e(o.accountKeys[i.accounts[0]].toBase58()).toBe(c),e(o.accountKeys[i.accounts[1]].toBase58()).toBe(r)}})});
2
+ //# sourceMappingURL=GenerateSolanaTransaction.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/services/GenerateSolanaTransaction.test.ts"],
4
+ "sourcesContent": ["import {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n getAssociatedTokenAddressSync,\n TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport {\n Keypair,\n Message,\n type PublicKey,\n SystemProgram,\n} from \"@solana/web3.js\";\nimport { describe, expect, it } from \"vitest\";\n\nimport {\n COIN_DATA,\n GenerateSolanaTransaction,\n} from \"./GenerateSolanaTransaction\";\n\ndescribe(\"GenerateSolanaTransaction\", () => {\n const feePayer = Keypair.generate();\n const recipient = Keypair.generate();\n const feePayerKey = feePayer.publicKey.toBase58();\n const recipientKey = recipient.publicKey.toBase58();\n\n it(\"generateUsdcTransaction should equal generateSplTokenTransaction with USDC constants\", () => {\n // given\n const gen = new GenerateSolanaTransaction();\n const txA = gen.generateUsdcTransaction(feePayerKey, recipientKey, 2.5, 3);\n\n // when\n const txB = gen.generateSplTokenTransaction(\n feePayerKey,\n recipientKey,\n COIN_DATA.USDC.mint.toBase58(),\n 2.5,\n COIN_DATA.USDC.decimals,\n 3,\n );\n\n // then\n expect(txA).toBe(txB);\n });\n\n it(\"generateSplTokenTransaction emits correct SPL-Token TransferChecked instructions\", () => {\n // given\n const gen = new GenerateSolanaTransaction();\n const mint = COIN_DATA.USDC.mint;\n const decimals = COIN_DATA.USDC.decimals;\n const amount = 1.25;\n const transfers = 2;\n\n // when\n const b64 = gen.generateSplTokenTransaction(\n feePayerKey,\n recipientKey,\n mint.toBase58(),\n amount,\n decimals,\n transfers,\n );\n\n const uint8Array = Uint8Array.from(Buffer.from(b64, \"base64\"));\n const msg = Message.from(uint8Array);\n\n // then\n expect(msg.instructions).toHaveLength(transfers);\n\n const sourceAta = getAssociatedTokenAddressSync(\n mint,\n feePayer.publicKey,\n false,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n const destAta = getAssociatedTokenAddressSync(\n mint,\n recipient.publicKey,\n false,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n for (const ix of msg.instructions) {\n // program must be the SPL-Token program\n const pid = msg.accountKeys[ix.programIdIndex]!;\n expect(pid.equals(TOKEN_PROGRAM_ID)).toBe(true);\n\n // first account is source ATA, second is mint, third is dest ATA\n expect(\n (msg.accountKeys[ix.accounts[0]!] as PublicKey).equals(sourceAta),\n ).toBe(true);\n expect((msg.accountKeys[ix.accounts[1]!] as PublicKey).equals(mint)).toBe(\n true,\n );\n expect(\n (msg.accountKeys[ix.accounts[2]!] as PublicKey).equals(destAta),\n ).toBe(true);\n\n // feePayer must sign\n expect(\n (msg.accountKeys[ix.accounts[3]!] as PublicKey).equals(\n feePayer.publicKey,\n ),\n ).toBe(true);\n }\n });\n\n it(\"generatePlainSolanaTransaction emits correct SystemProgram.transfer instructions\", () => {\n // given\n const gen = new GenerateSolanaTransaction();\n const lamports = 1_000;\n const ops = 3;\n\n // when\n const b64 = gen.generatePlainSolanaTransaction(\n feePayerKey,\n recipientKey,\n lamports,\n ops,\n );\n const uint8Array = Uint8Array.from(Buffer.from(b64, \"base64\"));\n const msg = Message.from(uint8Array);\n\n // then\n expect(msg.instructions).toHaveLength(ops);\n\n for (const ix of msg.instructions) {\n // program must be SystemProgram\n const pid = msg.accountKeys[ix.programIdIndex]!;\n expect(pid.equals(SystemProgram.programId)).toBe(true);\n\n // accounts: [fromPubkey, toPubkey]\n expect((msg.accountKeys[ix.accounts[0]!] as PublicKey).toBase58()).toBe(\n feePayerKey,\n );\n expect((msg.accountKeys[ix.accounts[1]!] as PublicKey).toBase58()).toBe(\n recipientKey,\n );\n }\n });\n});\n"],
5
+ "mappings": "AAAA,OACE,+BAAAA,EACA,iCAAAC,EACA,oBAAAC,MACK,oBACP,OACE,WAAAC,EACA,WAAAC,EAEA,iBAAAC,MACK,kBACP,OAAS,YAAAC,EAAU,UAAAC,EAAQ,MAAAC,MAAU,SAErC,OACE,aAAAC,EACA,6BAAAC,MACK,8BAEPJ,EAAS,4BAA6B,IAAM,CAC1C,MAAMK,EAAWR,EAAQ,SAAS,EAC5BS,EAAYT,EAAQ,SAAS,EAC7BU,EAAcF,EAAS,UAAU,SAAS,EAC1CG,EAAeF,EAAU,UAAU,SAAS,EAElDJ,EAAG,uFAAwF,IAAM,CAE/F,MAAMO,EAAM,IAAIL,EACVM,EAAMD,EAAI,wBAAwBF,EAAaC,EAAc,IAAK,CAAC,EAGnEG,EAAMF,EAAI,4BACdF,EACAC,EACAL,EAAU,KAAK,KAAK,SAAS,EAC7B,IACAA,EAAU,KAAK,SACf,CACF,EAGAF,EAAOS,CAAG,EAAE,KAAKC,CAAG,CACtB,CAAC,EAEDT,EAAG,mFAAoF,IAAM,CAE3F,MAAMO,EAAM,IAAIL,EACVQ,EAAOT,EAAU,KAAK,KACtBU,EAAWV,EAAU,KAAK,SAC1BW,EAAS,KACTC,EAAY,EAGZC,EAAMP,EAAI,4BACdF,EACAC,EACAI,EAAK,SAAS,EACdE,EACAD,EACAE,CACF,EAEME,EAAa,WAAW,KAAK,OAAO,KAAKD,EAAK,QAAQ,CAAC,EACvDE,EAAMpB,EAAQ,KAAKmB,CAAU,EAGnChB,EAAOiB,EAAI,YAAY,EAAE,aAAaH,CAAS,EAE/C,MAAMI,EAAYxB,EAChBiB,EACAP,EAAS,UACT,GACAT,EACAF,CACF,EACM0B,EAAUzB,EACdiB,EACAN,EAAU,UACV,GACAV,EACAF,CACF,EAEA,UAAW2B,KAAMH,EAAI,aAAc,CAEjC,MAAMI,EAAMJ,EAAI,YAAYG,EAAG,cAAc,EAC7CpB,EAAOqB,EAAI,OAAO1B,CAAgB,CAAC,EAAE,KAAK,EAAI,EAG9CK,EACGiB,EAAI,YAAYG,EAAG,SAAS,CAAC,CAAE,EAAgB,OAAOF,CAAS,CAClE,EAAE,KAAK,EAAI,EACXlB,EAAQiB,EAAI,YAAYG,EAAG,SAAS,CAAC,CAAE,EAAgB,OAAOT,CAAI,CAAC,EAAE,KACnE,EACF,EACAX,EACGiB,EAAI,YAAYG,EAAG,SAAS,CAAC,CAAE,EAAgB,OAAOD,CAAO,CAChE,EAAE,KAAK,EAAI,EAGXnB,EACGiB,EAAI,YAAYG,EAAG,SAAS,CAAC,CAAE,EAAgB,OAC9ChB,EAAS,SACX,CACF,EAAE,KAAK,EAAI,CACb,CACF,CAAC,EAEDH,EAAG,mFAAoF,IAAM,CAE3F,MAAMO,EAAM,IAAIL,EACVmB,EAAW,IACXC,EAAM,EAGNR,EAAMP,EAAI,+BACdF,EACAC,EACAe,EACAC,CACF,EACMP,EAAa,WAAW,KAAK,OAAO,KAAKD,EAAK,QAAQ,CAAC,EACvDE,EAAMpB,EAAQ,KAAKmB,CAAU,EAGnChB,EAAOiB,EAAI,YAAY,EAAE,aAAaM,CAAG,EAEzC,UAAWH,KAAMH,EAAI,aAAc,CAEjC,MAAMI,EAAMJ,EAAI,YAAYG,EAAG,cAAc,EAC7CpB,EAAOqB,EAAI,OAAOvB,EAAc,SAAS,CAAC,EAAE,KAAK,EAAI,EAGrDE,EAAQiB,EAAI,YAAYG,EAAG,SAAS,CAAC,CAAE,EAAgB,SAAS,CAAC,EAAE,KACjEd,CACF,EACAN,EAAQiB,EAAI,YAAYG,EAAG,SAAS,CAAC,CAAE,EAAgB,SAAS,CAAC,EAAE,KACjEb,CACF,CACF,CACF,CAAC,CACH,CAAC",
6
+ "names": ["ASSOCIATED_TOKEN_PROGRAM_ID", "getAssociatedTokenAddressSync", "TOKEN_PROGRAM_ID", "Keypair", "Message", "SystemProgram", "describe", "expect", "it", "COIN_DATA", "GenerateSolanaTransaction", "feePayer", "recipient", "feePayerKey", "recipientKey", "gen", "txA", "txB", "mint", "decimals", "amount", "transfers", "b64", "uint8Array", "msg", "sourceAta", "destAta", "ix", "pid", "lamports", "ops"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{ASSOCIATED_TOKEN_PROGRAM_ID as m,decodeInitializeAccountInstruction as p,decodeTransferCheckedInstruction as I,decodeTransferInstruction as T,TOKEN_2022_PROGRAM_ID as A,TOKEN_PROGRAM_ID as f,TokenInstruction as y}from"@solana/spl-token";import{Transaction as g,TransactionInstruction as K,VersionedMessage as k,VersionedTransaction as b}from"@solana/web3.js";import{Buffer as l}from"buffer";var P=(a=>(a.STANDARD="Standard",a.SPL="SPL",a))(P||{});class D{constructor(s){this.rawTransactionBytes=s}inspectTransactionType(){try{const s=this.normaliseMessage(this.rawTransactionBytes);for(const a of s.compiledInstructions){const r=s.allKeys[a.programIdIndex];if(!r)continue;if(r.equals(m)){const t=a.accountKeyIndexes.map(n=>s.allKeys[n]).filter(Boolean),c=t[1],e=t[3];if(c&&e)return{transactionType:"SPL",data:{createATA:{address:c.toBase58(),mintAddress:e.toBase58()}}};continue}if(!(r.equals(f)||r.equals(A)))continue;const o=new K({programId:r,keys:a.accountKeyIndexes.map(t=>{if(!s.allKeys[t])throw new Error(`TransactionInspector: missing key at index ${t} in allKeys`);return{pubkey:s.allKeys[t],isSigner:!1,isWritable:!1}}),data:l.from(a.data)}),u=o.data[0];try{switch(u){case y.Transfer:{const{keys:{destination:t}}=T(o);return{transactionType:"SPL",data:{tokenAddress:t.pubkey.toBase58()}}}case y.TransferChecked:{const{keys:{destination:t,mint:c}}=I(o);return{transactionType:"SPL",data:{tokenAddress:t.pubkey.toBase58(),mintAddress:c.pubkey.toBase58()}}}case y.InitializeAccount:{const{keys:{account:t,mint:c}}=p(o);return{transactionType:"SPL",data:{createATA:{address:t.pubkey.toBase58(),mintAddress:c.pubkey.toBase58()}}}}default:break}}catch{continue}}return{transactionType:"Standard",data:{}}}catch{return{transactionType:"Standard",data:{}}}}normaliseMessage(s){const a=this.tryDeserialiseVersioned(s);if(a){const e=a.message;let n;return typeof e.getAccountKeys=="function"?n=e.getAccountKeys().keySegments().flat():n=[...e.staticAccountKeys],{compiledInstructions:e.compiledInstructions.map(i=>({programIdIndex:i.programIdIndex,accountKeyIndexes:Array.from(i.accountKeyIndexes??[]),data:i.data instanceof Uint8Array?i.data:l.from(i.data??[])})),allKeys:n}}const r=g.from(s),d=new Map,o=e=>{if(!e)return;const n=e.toBase58();d.has(n)||d.set(n,e)};o(r.feePayer??null);for(const e of r.instructions){o(e.programId);for(const n of e.keys)o(n.pubkey)}const u=Array.from(d.values()),t=new Map(u.map((e,n)=>[e.toBase58(),n]));return{compiledInstructions:r.instructions.map(e=>({programIdIndex:t.get(e.programId.toBase58())??-1,accountKeyIndexes:e.keys.map(n=>t.get(n.pubkey.toBase58())??-1),data:e.data})),allKeys:u}}tryDeserialiseVersioned(s){try{return b.deserialize(s)}catch{try{return{message:k.deserialize(s)}}catch{return null}}}}export{P as SolanaTransactionTypes,D as TransactionInspector};
2
+ //# sourceMappingURL=TransactionInspector.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/services/TransactionInspector.ts"],
4
+ "sourcesContent": ["import {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n decodeInitializeAccountInstruction,\n decodeTransferCheckedInstruction,\n decodeTransferInstruction,\n TOKEN_2022_PROGRAM_ID,\n TOKEN_PROGRAM_ID,\n TokenInstruction,\n} from \"@solana/spl-token\";\nimport {\n type PublicKey,\n Transaction,\n TransactionInstruction,\n VersionedMessage,\n VersionedTransaction,\n} from \"@solana/web3.js\";\nimport { Buffer } from \"buffer\";\n\nexport enum SolanaTransactionTypes {\n STANDARD = \"Standard\",\n SPL = \"SPL\",\n}\n\nexport interface TxInspectorResult {\n transactionType: SolanaTransactionTypes;\n data: {\n tokenAddress?: string;\n mintAddress?: string;\n createATA?: {\n address: string;\n mintAddress: string;\n };\n };\n}\n\ntype NormalizedCompiledIx = {\n programIdIndex: number;\n accountKeyIndexes: number[];\n data: Uint8Array;\n};\n\ntype NormalizedMessage = {\n compiledInstructions: NormalizedCompiledIx[];\n allKeys: PublicKey[];\n};\n\ntype LoadedAddresses = { writable: PublicKey[]; readonly: PublicKey[] };\n\nexport class TransactionInspector {\n /**\n * @param rawTransactionBytes - the raw tx bytes (legacy or v0)\n */\n constructor(private readonly rawTransactionBytes: Uint8Array) {}\n\n public inspectTransactionType(): TxInspectorResult {\n try {\n const message = this.normaliseMessage(this.rawTransactionBytes);\n\n for (const ixMeta of message.compiledInstructions) {\n const programId = message.allKeys[ixMeta.programIdIndex];\n if (!programId) continue;\n\n // Associated Token Account (ATA) Program: detect ATA creation\n if (programId.equals(ASSOCIATED_TOKEN_PROGRAM_ID)) {\n // expected accounts: [payer, ata, owner, mint, systemProgram, tokenProgram, rent?]\n const accountPks = ixMeta.accountKeyIndexes\n .map((i) => message.allKeys[i])\n .filter(Boolean) as PublicKey[];\n const ataPk = accountPks[1];\n const mintPk = accountPks[3];\n if (ataPk && mintPk) {\n return {\n transactionType: SolanaTransactionTypes.SPL,\n data: {\n createATA: {\n address: ataPk.toBase58(),\n mintAddress: mintPk.toBase58(),\n },\n },\n };\n }\n continue;\n }\n\n // Token Program (classic or 2022)\n const isTokenProgram =\n programId.equals(TOKEN_PROGRAM_ID) ||\n programId.equals(TOKEN_2022_PROGRAM_ID);\n if (!isTokenProgram) continue;\n\n // minimal TransactionInstruction for the decoders\n const instruction = new TransactionInstruction({\n programId,\n keys: ixMeta.accountKeyIndexes.map((i) => {\n if (!message.allKeys[i]) {\n throw new Error(\n `TransactionInspector: missing key at index ${i} in allKeys`,\n );\n }\n return {\n pubkey: message.allKeys[i],\n isSigner: false,\n isWritable: false,\n };\n }),\n data: Buffer.from(ixMeta.data),\n });\n\n const instructionType = instruction.data[0];\n\n try {\n switch (instructionType) {\n case TokenInstruction.Transfer: {\n const {\n keys: { destination },\n } = decodeTransferInstruction(instruction);\n return {\n transactionType: SolanaTransactionTypes.SPL,\n data: { tokenAddress: destination.pubkey.toBase58() },\n };\n }\n case TokenInstruction.TransferChecked: {\n const {\n keys: { destination, mint },\n } = decodeTransferCheckedInstruction(instruction);\n return {\n transactionType: SolanaTransactionTypes.SPL,\n data: {\n tokenAddress: destination.pubkey.toBase58(),\n mintAddress: mint.pubkey.toBase58(),\n },\n };\n }\n case TokenInstruction.InitializeAccount: {\n // InitializeAccount != ATA creation, ATA is via the Associated Token Account Program above.\n const {\n keys: { account, mint },\n } = decodeInitializeAccountInstruction(instruction);\n return {\n transactionType: SolanaTransactionTypes.SPL,\n data: {\n createATA: {\n address: account.pubkey.toBase58(),\n mintAddress: mint.pubkey.toBase58(),\n },\n },\n };\n }\n default:\n // not a token instruction we care about\u2014keep scanning.\n break;\n }\n } catch {\n // if a decoder throws (bad match), keep scanning other instructions.\n continue;\n }\n }\n\n return { transactionType: SolanaTransactionTypes.STANDARD, data: {} };\n } catch {\n return { transactionType: SolanaTransactionTypes.STANDARD, data: {} };\n }\n }\n\n /**\n * normalise any tx (legacy or v0) into { compiledInstructions, allKeys }.\n * if LUT accounts are provided, looked-up keys are included in allKeys.\n */\n private normaliseMessage(rawBytes: Uint8Array): NormalizedMessage {\n const vtx = this.tryDeserialiseVersioned(rawBytes);\n if (vtx) {\n const msg = vtx.message as VersionedMessage & {\n getAccountKeys?: (opts?: {\n accountKeysFromLookups?: LoadedAddresses;\n }) => {\n staticAccountKeys: PublicKey[];\n accountKeysFromLookups?: LoadedAddresses;\n keySegments: () => PublicKey[][];\n };\n compiledInstructions: Array<{\n programIdIndex: number;\n accountKeyIndexes?: number[];\n accounts?: number[];\n data: Uint8Array | string | number[];\n }>;\n staticAccountKeys: PublicKey[];\n };\n\n // build the full key array in the exact index order used by compiledInstructions\n let allKeys: PublicKey[];\n if (typeof msg.getAccountKeys === \"function\") {\n const mak = msg.getAccountKeys();\n allKeys = mak.keySegments().flat();\n } else {\n // very old builds: fall back to concatenation (same order)\n allKeys = [...msg.staticAccountKeys];\n }\n\n const compiledInstructions: NormalizedCompiledIx[] =\n msg.compiledInstructions.map((ix) => ({\n programIdIndex: ix.programIdIndex,\n accountKeyIndexes: Array.from(ix.accountKeyIndexes ?? []),\n data:\n ix.data instanceof Uint8Array\n ? ix.data\n : Buffer.from(ix.data ?? []),\n }));\n\n return { compiledInstructions, allKeys };\n }\n\n // legacy fallback\n const legacy = Transaction.from(rawBytes);\n\n const allKeyMap = new Map<string, PublicKey>();\n const add = (pk?: PublicKey | null) => {\n if (!pk) return;\n const k = pk.toBase58();\n if (!allKeyMap.has(k)) allKeyMap.set(k, pk);\n };\n\n add(legacy.feePayer ?? null);\n for (const ix of legacy.instructions) {\n add(ix.programId);\n for (const k of ix.keys) add(k.pubkey);\n }\n const allKeys = Array.from(allKeyMap.values());\n const indexByB58 = new Map(allKeys.map((pk, i) => [pk.toBase58(), i]));\n\n const compiledInstructions: NormalizedCompiledIx[] =\n legacy.instructions.map((ix) => ({\n programIdIndex: indexByB58.get(ix.programId.toBase58()) ?? -1,\n accountKeyIndexes: ix.keys.map(\n (k) => indexByB58.get(k.pubkey.toBase58()) ?? -1,\n ),\n data: ix.data,\n }));\n\n return { compiledInstructions, allKeys };\n }\n\n private tryDeserialiseVersioned(\n rawBytes: Uint8Array,\n ): VersionedTransaction | null {\n try {\n return VersionedTransaction.deserialize(rawBytes);\n } catch {\n try {\n const msg = VersionedMessage.deserialize(rawBytes);\n // wrap in a dummy VersionedTransaction-like shape just for uniform handling\n return { message: msg } as VersionedTransaction;\n } catch {\n return null;\n }\n }\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["ASSOCIATED_TOKEN_PROGRAM_ID", "decodeInitializeAccountInstruction", "decodeTransferCheckedInstruction", "decodeTransferInstruction", "TOKEN_2022_PROGRAM_ID", "TOKEN_PROGRAM_ID", "TokenInstruction", "Transaction", "TransactionInstruction", "VersionedMessage", "VersionedTransaction", "Buffer", "SolanaTransactionTypes", "TransactionInspector", "rawTransactionBytes", "message", "ixMeta", "programId", "accountPks", "i", "ataPk", "mintPk", "instruction", "instructionType", "destination", "mint", "account", "rawBytes", "vtx", "msg", "allKeys", "ix", "legacy", "allKeyMap", "add", "pk", "k", "indexByB58"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{createInitializeAccountInstruction as b,createTransferCheckedInstruction as A,createTransferInstruction as f,TOKEN_PROGRAM_ID as u}from"@solana/spl-token";import{Keypair as a,SystemProgram as g,Transaction as y}from"@solana/web3.js";import m from"bs58";import{describe as K,expect as o,it as i}from"vitest";import{SolanaTransactionTypes as p,TransactionInspector as l}from"./TransactionInspector";const d=m.encode(new Uint8Array(32).fill(1));K("TransactionInspector",()=>{i("falls back to STANDARD for a plain SystemProgram transfer",()=>{const e=a.generate(),s=a.generate().publicKey,n=new y().add(g.transfer({fromPubkey:e.publicKey,toPubkey:s,lamports:1e3}));n.recentBlockhash=d,n.feePayer=e.publicKey,n.sign(e);const c=n.serialize(),t=new l(c).inspectTransactionType();o(t.transactionType).toBe(p.STANDARD),o(t.data).toEqual({})}),i("detects an SPL Transfer and returns the destination address",()=>{const e=a.generate(),s=a.generate().publicKey,n=a.generate().publicKey,c=e.publicKey,t=new y().add(f(s,n,c,42n,[],u));t.recentBlockhash=d,t.feePayer=e.publicKey,t.sign(e);const r=new l(t.serialize()).inspectTransactionType();o(r.transactionType).toBe(p.SPL),o(r.data.tokenAddress).toBe(n.toBase58())}),i("detects an SPL TransferChecked and returns the destination address",()=>{const e=a.generate(),s=a.generate().publicKey,n=a.generate().publicKey,c=a.generate().publicKey,t=e.publicKey,r=new y().add(A(n,s,c,t,123n,0,[],u));r.recentBlockhash=d,r.feePayer=e.publicKey,r.sign(e);const T=new l(r.serialize()).inspectTransactionType();o(T.transactionType).toBe(p.SPL),o(T.data.tokenAddress).toBe(c.toBase58())}),i("detects an SPL InitializeAccount and returns the new ATA and mint",()=>{const e=a.generate(),s=a.generate().publicKey,n=a.generate().publicKey,c=e.publicKey,t=new y().add(b(n,s,c,u));t.recentBlockhash=d,t.feePayer=e.publicKey,t.sign(e);const r=new l(t.serialize()).inspectTransactionType();o(r.transactionType).toBe(p.SPL),o(r.data.createATA).toEqual({address:n.toBase58(),mintAddress:s.toBase58()})}),i("falls back to STANDARD if the payload is unparseable",()=>{const e=new Uint8Array([0,1,2,3,4,5]),s=new l(e).inspectTransactionType();o(s.transactionType).toBe(p.STANDARD),o(s.data).toEqual({})})});
2
+ //# sourceMappingURL=TransactionInspector.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/services/TransactionInspector.test.ts"],
4
+ "sourcesContent": ["import {\n createInitializeAccountInstruction,\n createTransferCheckedInstruction,\n createTransferInstruction,\n TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport { Keypair, SystemProgram, Transaction } from \"@solana/web3.js\";\nimport bs58 from \"bs58\";\nimport { describe, expect, it } from \"vitest\";\n\nimport {\n SolanaTransactionTypes,\n TransactionInspector,\n} from \"./TransactionInspector\";\n\nconst DUMMY_BLOCKHASH = bs58.encode(new Uint8Array(32).fill(1));\n\ndescribe(\"TransactionInspector\", () => {\n it(\"falls back to STANDARD for a plain SystemProgram transfer\", () => {\n const payer = Keypair.generate();\n const dest = Keypair.generate().publicKey;\n\n const tx = new Transaction().add(\n SystemProgram.transfer({\n fromPubkey: payer.publicKey,\n toPubkey: dest,\n lamports: 1_000,\n }),\n );\n tx.recentBlockhash = DUMMY_BLOCKHASH;\n tx.feePayer = payer.publicKey;\n tx.sign(payer);\n\n const raw = tx.serialize();\n const result = new TransactionInspector(raw).inspectTransactionType();\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.STANDARD);\n expect(result.data).toEqual({});\n });\n\n it(\"detects an SPL Transfer and returns the destination address\", () => {\n const payer = Keypair.generate();\n const source = Keypair.generate().publicKey;\n const destination = Keypair.generate().publicKey;\n const owner = payer.publicKey;\n\n const tx = new Transaction().add(\n createTransferInstruction(\n source,\n destination,\n owner,\n 42n,\n [],\n TOKEN_PROGRAM_ID,\n ),\n );\n tx.recentBlockhash = DUMMY_BLOCKHASH;\n tx.feePayer = payer.publicKey;\n tx.sign(payer);\n\n const result = new TransactionInspector(\n tx.serialize(),\n ).inspectTransactionType();\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.tokenAddress).toBe(destination.toBase58());\n });\n\n it(\"detects an SPL TransferChecked and returns the destination address\", () => {\n const payer = Keypair.generate();\n const mint = Keypair.generate().publicKey;\n const source = Keypair.generate().publicKey;\n const destination = Keypair.generate().publicKey;\n const owner = payer.publicKey;\n\n const tx = new Transaction().add(\n createTransferCheckedInstruction(\n source,\n mint,\n destination,\n owner,\n 123n,\n 0,\n [],\n TOKEN_PROGRAM_ID,\n ),\n );\n tx.recentBlockhash = DUMMY_BLOCKHASH;\n tx.feePayer = payer.publicKey;\n tx.sign(payer);\n\n const result = new TransactionInspector(\n tx.serialize(),\n ).inspectTransactionType();\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.tokenAddress).toBe(destination.toBase58());\n });\n\n it(\"detects an SPL InitializeAccount and returns the new ATA and mint\", () => {\n const payer = Keypair.generate();\n const mint = Keypair.generate().publicKey;\n const newAccount = Keypair.generate().publicKey;\n const owner = payer.publicKey;\n\n const tx = new Transaction().add(\n createInitializeAccountInstruction(\n newAccount,\n mint,\n owner,\n TOKEN_PROGRAM_ID,\n ),\n );\n tx.recentBlockhash = DUMMY_BLOCKHASH;\n tx.feePayer = payer.publicKey;\n tx.sign(payer);\n\n const result = new TransactionInspector(\n tx.serialize(),\n ).inspectTransactionType();\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.createATA).toEqual({\n address: newAccount.toBase58(),\n mintAddress: mint.toBase58(),\n });\n });\n\n it(\"falls back to STANDARD if the payload is unparseable\", () => {\n const garbage = new Uint8Array([0, 1, 2, 3, 4, 5]);\n const result = new TransactionInspector(garbage).inspectTransactionType();\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.STANDARD);\n expect(result.data).toEqual({});\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["createInitializeAccountInstruction", "createTransferCheckedInstruction", "createTransferInstruction", "TOKEN_PROGRAM_ID", "Keypair", "SystemProgram", "Transaction", "bs58", "describe", "expect", "it", "SolanaTransactionTypes", "TransactionInspector", "DUMMY_BLOCKHASH", "payer", "dest", "tx", "raw", "result", "source", "destination", "owner", "mint", "newAccount", "garbage"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{isSuccessCommandResult as i}from"@ledgerhq/device-management-kit";import{GetChallengeCommand as s}from"../../app-binder/command/GetChallengeCommand";class u{constructor(o,e){this.api=o;this.args=e}async run(){const{contextModule:o,options:e}=this.args,a=this.api.getDeviceSessionState();let n;const r=await this.api.sendCommand(new s);return i(r)&&(n=r.data.challenge),(await o.getSolanaContext({deviceModelId:a.deviceModelId,tokenAddress:e.tokenAddress,challenge:n,createATA:e.createATA})).caseOf({Left:t=>{throw t},Right:t=>({challenge:n,descriptor:t.descriptor,addressResult:{tokenAccount:t.tokenAccount,owner:t.owner,contract:t.contract},calCertificate:t.certificate})})}}export{u as BuildTransactionContextTask};
2
+ //# sourceMappingURL=BuildTransactionContextTask.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/task/BuildTransactionContextTask.ts"],
4
+ "sourcesContent": ["import {\n type ContextModule,\n type PkiCertificate,\n} from \"@ledgerhq/context-module\";\nimport {\n type InternalApi,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type TransactionOptions } from \"@api/model/TransactionOptions\";\nimport { GetChallengeCommand } from \"@internal/app-binder/command/GetChallengeCommand\";\n\nexport type SolanaBuildContextResult = {\n challenge: string | undefined;\n addressResult: {\n tokenAccount: string;\n owner: string;\n contract: string;\n };\n calCertificate: PkiCertificate;\n descriptor: Uint8Array;\n};\n\nexport type BuildTransactionContextTaskArgs = {\n readonly contextModule: ContextModule;\n readonly options: TransactionOptions;\n};\n\nexport class BuildTransactionContextTask {\n constructor(\n private readonly api: InternalApi,\n private readonly args: BuildTransactionContextTaskArgs,\n ) {}\n\n async run(): Promise<SolanaBuildContextResult> {\n const { contextModule, options } = this.args;\n const deviceState = this.api.getDeviceSessionState();\n\n // get challenge\n let challenge: string | undefined;\n const challengeRes = await this.api.sendCommand(new GetChallengeCommand());\n if (isSuccessCommandResult(challengeRes)) {\n challenge = challengeRes.data.challenge;\n }\n\n // get Solana context\n const contextResult = await contextModule.getSolanaContext({\n deviceModelId: deviceState.deviceModelId,\n tokenAddress: options.tokenAddress,\n challenge,\n createATA: options.createATA,\n });\n\n return contextResult.caseOf({\n Left: (err) => {\n throw err;\n },\n Right: (ctx) => {\n return {\n challenge,\n descriptor: ctx.descriptor,\n addressResult: {\n tokenAccount: ctx.tokenAccount,\n owner: ctx.owner,\n contract: ctx.contract,\n },\n calCertificate: ctx.certificate,\n };\n },\n });\n }\n}\n"],
5
+ "mappings": "AAIA,OAEE,0BAAAA,MACK,kCAGP,OAAS,uBAAAC,MAA2B,mDAkB7B,MAAMC,CAA4B,CACvC,YACmBC,EACAC,EACjB,CAFiB,SAAAD,EACA,UAAAC,CAChB,CAEH,MAAM,KAAyC,CAC7C,KAAM,CAAE,cAAAC,EAAe,QAAAC,CAAQ,EAAI,KAAK,KAClCC,EAAc,KAAK,IAAI,sBAAsB,EAGnD,IAAIC,EACJ,MAAMC,EAAe,MAAM,KAAK,IAAI,YAAY,IAAIR,CAAqB,EACzE,OAAID,EAAuBS,CAAY,IACrCD,EAAYC,EAAa,KAAK,YAIV,MAAMJ,EAAc,iBAAiB,CACzD,cAAeE,EAAY,cAC3B,aAAcD,EAAQ,aACtB,UAAAE,EACA,UAAWF,EAAQ,SACrB,CAAC,GAEoB,OAAO,CAC1B,KAAOI,GAAQ,CACb,MAAMA,CACR,EACA,MAAQC,IACC,CACL,UAAAH,EACA,WAAYG,EAAI,WAChB,cAAe,CACb,aAAcA,EAAI,aAClB,MAAOA,EAAI,MACX,SAAUA,EAAI,QAChB,EACA,eAAgBA,EAAI,WACtB,EAEJ,CAAC,CACH,CACF",
6
+ "names": ["isSuccessCommandResult", "GetChallengeCommand", "BuildTransactionContextTask", "api", "args", "contextModule", "options", "deviceState", "challenge", "challengeRes", "err", "ctx"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{CommandResultStatus as u,DeviceModelId as l}from"@ledgerhq/device-management-kit";import{Left as f,Right as m}from"purify-ts";import{beforeEach as C,describe as k,expect as n,it as r,vi as t}from"vitest";import{GetChallengeCommand as A}from"../../app-binder/command/GetChallengeCommand";import{BuildTransactionContextTask as d}from"./BuildTransactionContextTask";const a={getSolanaContext:t.fn(),getContext:t.fn(),getContexts:t.fn(),getTypedDataFilters:t.fn(),getWeb3Checks:t.fn()},i={contextModule:a,options:{tokenAddress:"someAddress",createATA:void 0}},e={descriptor:new Uint8Array([1,2,3]),tokenAccount:"someTokenAccount",owner:"someOwner",contract:"someContract",certificate:{payload:new Uint8Array([170,187]),keyUsageNumber:1}};let o;k("BuildTransactionContextTask",()=>{C(()=>{t.resetAllMocks(),o={getDeviceSessionState:t.fn().mockReturnValue({deviceModelId:l.NANO_X}),sendCommand:t.fn().mockResolvedValue({status:u.Success,data:{challenge:"someChallenge"}})}}),r("returns context successfully when challenge command succeeds",async()=>{a.getSolanaContext.mockResolvedValue(m(e));const s=await new d(o,i).run();n(o.sendCommand).toHaveBeenCalledWith(n.any(A)),n(a.getSolanaContext).toHaveBeenCalledWith({deviceModelId:l.NANO_X,tokenAddress:"someAddress",challenge:"someChallenge",createATA:void 0}),n(s).toEqual({challenge:"someChallenge",descriptor:e.descriptor,calCertificate:e.certificate,addressResult:{tokenAccount:e.tokenAccount,owner:e.owner,contract:e.contract}})}),r("returns context when challenge command fails",async()=>{o.sendCommand.mockResolvedValue({status:u.Error,data:{}}),a.getSolanaContext.mockResolvedValue(m(e));const s=await new d(o,i).run();n(a.getSolanaContext).toHaveBeenCalledWith({deviceModelId:l.NANO_X,tokenAddress:"someAddress",challenge:void 0,createATA:void 0}),n(s).toEqual({challenge:void 0,descriptor:e.descriptor,calCertificate:e.certificate,addressResult:{tokenAccount:e.tokenAccount,owner:e.owner,contract:e.contract}})}),r("throws if getSolanaContext returns Left",async()=>{const c=new Error("Solana context failure");a.getSolanaContext.mockResolvedValue(f(c));const s=new d(o,i);await n(s.run()).rejects.toThrow("Solana context failure")})});
2
+ //# sourceMappingURL=BuildTransactionContextTask.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/task/BuildTransactionContextTask.test.ts"],
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n CommandResultStatus,\n DeviceModelId,\n type InternalApi,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { GetChallengeCommand } from \"@internal/app-binder/command/GetChallengeCommand\";\n\nimport {\n BuildTransactionContextTask,\n type SolanaBuildContextResult,\n} from \"./BuildTransactionContextTask\";\n\nconst contextModuleMock: ContextModule = {\n getSolanaContext: vi.fn(),\n getContext: vi.fn(),\n getContexts: vi.fn(),\n getTypedDataFilters: vi.fn(),\n getWeb3Checks: vi.fn(),\n};\n\nconst defaultArgs = {\n contextModule: contextModuleMock,\n options: {\n tokenAddress: \"someAddress\",\n createATA: undefined,\n },\n};\n\nconst domainSolanaPayload = {\n descriptor: new Uint8Array([1, 2, 3]),\n tokenAccount: \"someTokenAccount\",\n owner: \"someOwner\",\n contract: \"someContract\",\n certificate: { payload: new Uint8Array([0xaa, 0xbb]), keyUsageNumber: 1 },\n} as const;\n\nlet apiMock: InternalApi;\n\ndescribe(\"BuildTransactionContextTask\", () => {\n beforeEach(() => {\n vi.resetAllMocks();\n\n apiMock = {\n getDeviceSessionState: vi\n .fn()\n .mockReturnValue({ deviceModelId: DeviceModelId.NANO_X }),\n sendCommand: vi.fn().mockResolvedValue({\n status: CommandResultStatus.Success,\n data: { challenge: \"someChallenge\" },\n }),\n } as unknown as InternalApi;\n });\n\n it(\"returns context successfully when challenge command succeeds\", async () => {\n (contextModuleMock.getSolanaContext as any).mockResolvedValue(\n Right(domainSolanaPayload),\n );\n\n const task = new BuildTransactionContextTask(apiMock, defaultArgs);\n const result = await task.run();\n\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n expect.any(GetChallengeCommand),\n );\n\n expect(contextModuleMock.getSolanaContext).toHaveBeenCalledWith({\n deviceModelId: DeviceModelId.NANO_X,\n tokenAddress: \"someAddress\",\n challenge: \"someChallenge\",\n createATA: undefined,\n });\n\n expect(result).toEqual<SolanaBuildContextResult>({\n challenge: \"someChallenge\",\n descriptor: domainSolanaPayload.descriptor,\n calCertificate: domainSolanaPayload.certificate,\n addressResult: {\n tokenAccount: domainSolanaPayload.tokenAccount,\n owner: domainSolanaPayload.owner,\n contract: domainSolanaPayload.contract,\n },\n });\n });\n\n it(\"returns context when challenge command fails\", async () => {\n (apiMock.sendCommand as any).mockResolvedValue({\n status: CommandResultStatus.Error,\n data: {},\n });\n (contextModuleMock.getSolanaContext as any).mockResolvedValue(\n Right(domainSolanaPayload),\n );\n\n const task = new BuildTransactionContextTask(apiMock, defaultArgs);\n const result = await task.run();\n\n expect(contextModuleMock.getSolanaContext).toHaveBeenCalledWith({\n deviceModelId: DeviceModelId.NANO_X,\n tokenAddress: \"someAddress\",\n challenge: undefined,\n createATA: undefined,\n });\n\n expect(result).toEqual<SolanaBuildContextResult>({\n challenge: undefined,\n descriptor: domainSolanaPayload.descriptor,\n calCertificate: domainSolanaPayload.certificate,\n addressResult: {\n tokenAccount: domainSolanaPayload.tokenAccount,\n owner: domainSolanaPayload.owner,\n contract: domainSolanaPayload.contract,\n },\n });\n });\n\n it(\"throws if getSolanaContext returns Left\", async () => {\n const error = new Error(\"Solana context failure\");\n (contextModuleMock.getSolanaContext as any).mockResolvedValue(Left(error));\n\n const task = new BuildTransactionContextTask(apiMock, defaultArgs);\n\n await expect(task.run()).rejects.toThrow(\"Solana context failure\");\n });\n});\n"],
5
+ "mappings": "AAIA,OACE,uBAAAA,EACA,iBAAAC,MAEK,kCACP,OAAS,QAAAC,EAAM,SAAAC,MAAa,YAC5B,OAAS,cAAAC,EAAY,YAAAC,EAAU,UAAAC,EAAQ,MAAAC,EAAI,MAAAC,MAAU,SAErD,OAAS,uBAAAC,MAA2B,mDAEpC,OACE,+BAAAC,MAEK,gCAEP,MAAMC,EAAmC,CACvC,iBAAkBH,EAAG,GAAG,EACxB,WAAYA,EAAG,GAAG,EAClB,YAAaA,EAAG,GAAG,EACnB,oBAAqBA,EAAG,GAAG,EAC3B,cAAeA,EAAG,GAAG,CACvB,EAEMI,EAAc,CAClB,cAAeD,EACf,QAAS,CACP,aAAc,cACd,UAAW,MACb,CACF,EAEME,EAAsB,CAC1B,WAAY,IAAI,WAAW,CAAC,EAAG,EAAG,CAAC,CAAC,EACpC,aAAc,mBACd,MAAO,YACP,SAAU,eACV,YAAa,CAAE,QAAS,IAAI,WAAW,CAAC,IAAM,GAAI,CAAC,EAAG,eAAgB,CAAE,CAC1E,EAEA,IAAIC,EAEJT,EAAS,8BAA+B,IAAM,CAC5CD,EAAW,IAAM,CACfI,EAAG,cAAc,EAEjBM,EAAU,CACR,sBAAuBN,EACpB,GAAG,EACH,gBAAgB,CAAE,cAAeP,EAAc,MAAO,CAAC,EAC1D,YAAaO,EAAG,GAAG,EAAE,kBAAkB,CACrC,OAAQR,EAAoB,QAC5B,KAAM,CAAE,UAAW,eAAgB,CACrC,CAAC,CACH,CACF,CAAC,EAEDO,EAAG,+DAAgE,SAAY,CAC5EI,EAAkB,iBAAyB,kBAC1CR,EAAMU,CAAmB,CAC3B,EAGA,MAAME,EAAS,MADF,IAAIL,EAA4BI,EAASF,CAAW,EACvC,IAAI,EAE9BN,EAAOQ,EAAQ,WAAW,EAAE,qBAC1BR,EAAO,IAAIG,CAAmB,CAChC,EAEAH,EAAOK,EAAkB,gBAAgB,EAAE,qBAAqB,CAC9D,cAAeV,EAAc,OAC7B,aAAc,cACd,UAAW,gBACX,UAAW,MACb,CAAC,EAEDK,EAAOS,CAAM,EAAE,QAAkC,CAC/C,UAAW,gBACX,WAAYF,EAAoB,WAChC,eAAgBA,EAAoB,YACpC,cAAe,CACb,aAAcA,EAAoB,aAClC,MAAOA,EAAoB,MAC3B,SAAUA,EAAoB,QAChC,CACF,CAAC,CACH,CAAC,EAEDN,EAAG,+CAAgD,SAAY,CAC5DO,EAAQ,YAAoB,kBAAkB,CAC7C,OAAQd,EAAoB,MAC5B,KAAM,CAAC,CACT,CAAC,EACAW,EAAkB,iBAAyB,kBAC1CR,EAAMU,CAAmB,CAC3B,EAGA,MAAME,EAAS,MADF,IAAIL,EAA4BI,EAASF,CAAW,EACvC,IAAI,EAE9BN,EAAOK,EAAkB,gBAAgB,EAAE,qBAAqB,CAC9D,cAAeV,EAAc,OAC7B,aAAc,cACd,UAAW,OACX,UAAW,MACb,CAAC,EAEDK,EAAOS,CAAM,EAAE,QAAkC,CAC/C,UAAW,OACX,WAAYF,EAAoB,WAChC,eAAgBA,EAAoB,YACpC,cAAe,CACb,aAAcA,EAAoB,aAClC,MAAOA,EAAoB,MAC3B,SAAUA,EAAoB,QAChC,CACF,CAAC,CACH,CAAC,EAEDN,EAAG,0CAA2C,SAAY,CACxD,MAAMS,EAAQ,IAAI,MAAM,wBAAwB,EAC/CL,EAAkB,iBAAyB,kBAAkBT,EAAKc,CAAK,CAAC,EAEzE,MAAMC,EAAO,IAAIP,EAA4BI,EAASF,CAAW,EAEjE,MAAMN,EAAOW,EAAK,IAAI,CAAC,EAAE,QAAQ,QAAQ,wBAAwB,CACnE,CAAC,CACH,CAAC",
6
+ "names": ["CommandResultStatus", "DeviceModelId", "Left", "Right", "beforeEach", "describe", "expect", "it", "vi", "GetChallengeCommand", "BuildTransactionContextTask", "contextModuleMock", "defaultArgs", "domainSolanaPayload", "apiMock", "result", "error", "task"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{isSuccessCommandResult as a}from"@ledgerhq/device-management-kit";import{Nothing as n}from"purify-ts";import{ProvideTLVDescriptorCommand as p}from"../../app-binder/command/ProvideTLVDescriptorCommand";import{ProvideTrustedNamePKICommand as s}from"../../app-binder/command/ProvideTrustedNamePKICommand";class C{constructor(t,o){this.api=t;this.context=o}async run(){const{descriptor:t,certificate:o}=this.context,{payload:i}=o,r=await this.api.sendCommand(new s({pkiBlob:i}));if(!a(r))throw r;const e=await this.api.sendCommand(new p({payload:t}));if(!a(e))throw e;return n}}export{C as ProvideSolanaTransactionContextTask};
2
+ //# sourceMappingURL=ProvideTransactionContextTask.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/task/ProvideTransactionContextTask.ts"],
4
+ "sourcesContent": ["import { type PkiCertificate } from \"@ledgerhq/context-module\";\nimport {\n type CommandErrorResult,\n type InternalApi,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\nimport { type Maybe, Nothing } from \"purify-ts\";\n\nimport { ProvideTLVDescriptorCommand } from \"@internal/app-binder/command/ProvideTLVDescriptorCommand\";\nimport { ProvideTrustedNamePKICommand } from \"@internal/app-binder/command/ProvideTrustedNamePKICommand\";\nimport { type SolanaAppErrorCodes } from \"@internal/app-binder/command/utils/SolanaApplicationErrors\";\n\nexport type SolanaContextForDevice = {\n descriptor: Uint8Array;\n certificate: PkiCertificate;\n};\n\nexport class ProvideSolanaTransactionContextTask {\n constructor(\n private readonly api: InternalApi,\n private readonly context: SolanaContextForDevice,\n ) {}\n\n async run(): Promise<Maybe<CommandErrorResult<SolanaAppErrorCodes>>> {\n const { descriptor, certificate } = this.context;\n const { payload: certificatePayload } = certificate;\n\n // send CAL certificate + signature\n const pkiResult = await this.api.sendCommand(\n new ProvideTrustedNamePKICommand({\n pkiBlob: certificatePayload,\n }),\n );\n if (!isSuccessCommandResult(pkiResult)) {\n throw pkiResult;\n }\n\n // send signed TLV descriptor\n const tlvResult = await this.api.sendCommand(\n new ProvideTLVDescriptorCommand({ payload: descriptor }),\n );\n if (!isSuccessCommandResult(tlvResult)) {\n throw tlvResult;\n }\n\n return Nothing;\n }\n}\n"],
5
+ "mappings": "AACA,OAGE,0BAAAA,MACK,kCACP,OAAqB,WAAAC,MAAe,YAEpC,OAAS,+BAAAC,MAAmC,2DAC5C,OAAS,gCAAAC,MAAoC,4DAQtC,MAAMC,CAAoC,CAC/C,YACmBC,EACAC,EACjB,CAFiB,SAAAD,EACA,aAAAC,CAChB,CAEH,MAAM,KAA+D,CACnE,KAAM,CAAE,WAAAC,EAAY,YAAAC,CAAY,EAAI,KAAK,QACnC,CAAE,QAASC,CAAmB,EAAID,EAGlCE,EAAY,MAAM,KAAK,IAAI,YAC/B,IAAIP,EAA6B,CAC/B,QAASM,CACX,CAAC,CACH,EACA,GAAI,CAACT,EAAuBU,CAAS,EACnC,MAAMA,EAIR,MAAMC,EAAY,MAAM,KAAK,IAAI,YAC/B,IAAIT,EAA4B,CAAE,QAASK,CAAW,CAAC,CACzD,EACA,GAAI,CAACP,EAAuBW,CAAS,EACnC,MAAMA,EAGR,OAAOV,CACT,CACF",
6
+ "names": ["isSuccessCommandResult", "Nothing", "ProvideTLVDescriptorCommand", "ProvideTrustedNamePKICommand", "ProvideSolanaTransactionContextTask", "api", "context", "descriptor", "certificate", "certificatePayload", "pkiResult", "tlvResult"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{CommandResultFactory as r}from"@ledgerhq/device-management-kit";import{Maybe as k,Nothing as y}from"purify-ts";import{beforeEach as v,describe as x,expect as o,it as m,vi as p}from"vitest";import{ProvideTLVDescriptorCommand as w}from"../../app-binder/command/ProvideTLVDescriptorCommand";import{ProvideTrustedNamePKICommand as T}from"../../app-binder/command/ProvideTrustedNamePKICommand";import{ProvideSolanaTransactionContextTask as c}from"./ProvideTransactionContextTask";x("ProvideSolanaTransactionContextTask",()=>{let e,t;const d=Uint8Array.from([170,170,170]),l={payload:Uint8Array.from([222,173,190,239,222,173,190,239])},i={_tag:"SomeError",errorCode:0,message:"SomeError"};v(()=>{p.resetAllMocks(),e={sendCommand:p.fn()},t={descriptor:d,certificate:l}}),m("returns Nothing when both commands succeed",async()=>{const a=r({data:k.of(null)});e.sendCommand.mockResolvedValue(a);const s=await new c(e,t).run();o(e.sendCommand).toHaveBeenCalledTimes(2);const u=e.sendCommand.mock.calls[0];o(u).toBeDefined();const C=u[0];o(C).toBeInstanceOf(T),o(C.args.pkiBlob).toStrictEqual(l.payload);const f=e.sendCommand.mock.calls[1][0];o(f).toBeInstanceOf(w),o(f.args.payload).toStrictEqual(d),o(s).toStrictEqual(y)}),m("throws error if PKI command fails",async()=>{const a=r({error:i});e.sendCommand.mockResolvedValueOnce(a);const n=new c(e,t);await o(n.run()).rejects.toBe(a),o(e.sendCommand).toHaveBeenCalledTimes(1)}),m("throws error if TLV command fails",async()=>{const a=r({data:k.of(null)}),n=r({error:i});e.sendCommand.mockResolvedValueOnce(a).mockResolvedValueOnce(n);const s=new c(e,t);await o(s.run()).rejects.toBe(n),o(e.sendCommand).toHaveBeenCalledTimes(2)})});
2
+ //# sourceMappingURL=ProvideTransactionContextTask.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/task/ProvideTransactionContextTask.test.ts"],
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { CommandResultFactory } from \"@ledgerhq/device-management-kit\";\nimport { Maybe, Nothing } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, type Mock, vi } from \"vitest\";\n\nimport { ProvideTLVDescriptorCommand } from \"@internal/app-binder/command/ProvideTLVDescriptorCommand\";\nimport { ProvideTrustedNamePKICommand } from \"@internal/app-binder/command/ProvideTrustedNamePKICommand\";\n\nimport {\n ProvideSolanaTransactionContextTask,\n type SolanaContextForDevice,\n} from \"./ProvideTransactionContextTask\";\n\ndescribe(\"ProvideSolanaTransactionContextTask\", () => {\n let fakeApi: { sendCommand: Mock };\n let context: SolanaContextForDevice;\n\n const dummyDescriptor = Uint8Array.from([0xaa, 0xaa, 0xaa]);\n const dummyCertificate: any = {\n payload: Uint8Array.from([0xde, 0xad, 0xbe, 0xef, 0xde, 0xad, 0xbe, 0xef]),\n };\n\n const mockError = { _tag: \"SomeError\", errorCode: 0, message: \"SomeError\" };\n\n beforeEach(() => {\n vi.resetAllMocks();\n fakeApi = {\n sendCommand: vi.fn(),\n };\n context = {\n descriptor: dummyDescriptor,\n certificate: dummyCertificate,\n };\n });\n\n it(\"returns Nothing when both commands succeed\", async () => {\n // given\n const successResult = CommandResultFactory({ data: Maybe.of(null) });\n fakeApi.sendCommand.mockResolvedValue(successResult);\n\n const task = new ProvideSolanaTransactionContextTask(\n fakeApi as unknown as any,\n context,\n );\n\n // when\n const result = await task.run();\n\n // then\n expect(fakeApi.sendCommand).toHaveBeenCalledTimes(2);\n\n const firstCallCall = fakeApi.sendCommand.mock.calls[0];\n expect(firstCallCall).toBeDefined();\n const firstCallArg = firstCallCall![0];\n expect(firstCallArg).toBeInstanceOf(ProvideTrustedNamePKICommand);\n expect(\n (firstCallArg as ProvideTrustedNamePKICommand).args.pkiBlob,\n ).toStrictEqual(dummyCertificate.payload);\n\n const secondCallArg = fakeApi.sendCommand.mock.calls[1]![0]!;\n expect(secondCallArg).toBeInstanceOf(ProvideTLVDescriptorCommand);\n expect(\n (secondCallArg as ProvideTLVDescriptorCommand).args.payload,\n ).toStrictEqual(dummyDescriptor);\n\n expect(result).toStrictEqual(Nothing);\n });\n\n it(\"throws error if PKI command fails\", async () => {\n const errorResult = CommandResultFactory({ error: mockError });\n fakeApi.sendCommand.mockResolvedValueOnce(errorResult);\n\n const task = new ProvideSolanaTransactionContextTask(\n fakeApi as unknown as any,\n context,\n );\n\n await expect(task.run()).rejects.toBe(errorResult);\n expect(fakeApi.sendCommand).toHaveBeenCalledTimes(1);\n });\n\n it(\"throws error if TLV command fails\", async () => {\n const successResult = CommandResultFactory({ data: Maybe.of(null) });\n const tlvErrorResult = CommandResultFactory({ error: mockError });\n\n fakeApi.sendCommand\n .mockResolvedValueOnce(successResult)\n .mockResolvedValueOnce(tlvErrorResult);\n\n const task = new ProvideSolanaTransactionContextTask(\n fakeApi as unknown as any,\n context,\n );\n\n await expect(task.run()).rejects.toBe(tlvErrorResult);\n expect(fakeApi.sendCommand).toHaveBeenCalledTimes(2);\n });\n});\n"],
5
+ "mappings": "AAGA,OAAS,wBAAAA,MAA4B,kCACrC,OAAS,SAAAC,EAAO,WAAAC,MAAe,YAC/B,OAAS,cAAAC,EAAY,YAAAC,EAAU,UAAAC,EAAQ,MAAAC,EAAe,MAAAC,MAAU,SAEhE,OAAS,+BAAAC,MAAmC,2DAC5C,OAAS,gCAAAC,MAAoC,4DAE7C,OACE,uCAAAC,MAEK,kCAEPN,EAAS,sCAAuC,IAAM,CACpD,IAAIO,EACAC,EAEJ,MAAMC,EAAkB,WAAW,KAAK,CAAC,IAAM,IAAM,GAAI,CAAC,EACpDC,EAAwB,CAC5B,QAAS,WAAW,KAAK,CAAC,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,IAAM,GAAI,CAAC,CAC3E,EAEMC,EAAY,CAAE,KAAM,YAAa,UAAW,EAAG,QAAS,WAAY,EAE1EZ,EAAW,IAAM,CACfI,EAAG,cAAc,EACjBI,EAAU,CACR,YAAaJ,EAAG,GAAG,CACrB,EACAK,EAAU,CACR,WAAYC,EACZ,YAAaC,CACf,CACF,CAAC,EAEDR,EAAG,6CAA8C,SAAY,CAE3D,MAAMU,EAAgBhB,EAAqB,CAAE,KAAMC,EAAM,GAAG,IAAI,CAAE,CAAC,EACnEU,EAAQ,YAAY,kBAAkBK,CAAa,EAQnD,MAAMC,EAAS,MANF,IAAIP,EACfC,EACAC,CACF,EAG0B,IAAI,EAG9BP,EAAOM,EAAQ,WAAW,EAAE,sBAAsB,CAAC,EAEnD,MAAMO,EAAgBP,EAAQ,YAAY,KAAK,MAAM,CAAC,EACtDN,EAAOa,CAAa,EAAE,YAAY,EAClC,MAAMC,EAAeD,EAAe,CAAC,EACrCb,EAAOc,CAAY,EAAE,eAAeV,CAA4B,EAChEJ,EACGc,EAA8C,KAAK,OACtD,EAAE,cAAcL,EAAiB,OAAO,EAExC,MAAMM,EAAgBT,EAAQ,YAAY,KAAK,MAAM,CAAC,EAAG,CAAC,EAC1DN,EAAOe,CAAa,EAAE,eAAeZ,CAA2B,EAChEH,EACGe,EAA8C,KAAK,OACtD,EAAE,cAAcP,CAAe,EAE/BR,EAAOY,CAAM,EAAE,cAAcf,CAAO,CACtC,CAAC,EAEDI,EAAG,oCAAqC,SAAY,CAClD,MAAMe,EAAcrB,EAAqB,CAAE,MAAOe,CAAU,CAAC,EAC7DJ,EAAQ,YAAY,sBAAsBU,CAAW,EAErD,MAAMC,EAAO,IAAIZ,EACfC,EACAC,CACF,EAEA,MAAMP,EAAOiB,EAAK,IAAI,CAAC,EAAE,QAAQ,KAAKD,CAAW,EACjDhB,EAAOM,EAAQ,WAAW,EAAE,sBAAsB,CAAC,CACrD,CAAC,EAEDL,EAAG,oCAAqC,SAAY,CAClD,MAAMU,EAAgBhB,EAAqB,CAAE,KAAMC,EAAM,GAAG,IAAI,CAAE,CAAC,EAC7DsB,EAAiBvB,EAAqB,CAAE,MAAOe,CAAU,CAAC,EAEhEJ,EAAQ,YACL,sBAAsBK,CAAa,EACnC,sBAAsBO,CAAc,EAEvC,MAAMD,EAAO,IAAIZ,EACfC,EACAC,CACF,EAEA,MAAMP,EAAOiB,EAAK,IAAI,CAAC,EAAE,QAAQ,KAAKC,CAAc,EACpDlB,EAAOM,EAAQ,WAAW,EAAE,sBAAsB,CAAC,CACrD,CAAC,CACH,CAAC",
6
+ "names": ["CommandResultFactory", "Maybe", "Nothing", "beforeEach", "describe", "expect", "it", "vi", "ProvideTLVDescriptorCommand", "ProvideTrustedNamePKICommand", "ProvideSolanaTransactionContextTask", "fakeApi", "context", "dummyDescriptor", "dummyCertificate", "mockError", "successResult", "result", "firstCallCall", "firstCallArg", "secondCallArg", "errorResult", "task", "tlvErrorResult"]
7
+ }
@@ -1,2 +1,2 @@
1
- import{APDU_MAX_PAYLOAD as d,ByteArrayBuilder as s,CommandResultFactory as u,InvalidStatusWordError as m}from"@ledgerhq/device-management-kit";import{DerivationPathUtils as g}from"@ledgerhq/signer-utils";import{SignOffChainMessageCommand as l}from"../../app-binder/command/SignOffChainMessageCommand";class b{constructor(t,e){this.api=t;this.args=e}async run(){const{sendingData:t,derivationPath:e}=this.args,n=this._buildApduCommand(this._buildFullMessage(t),g.splitPath(e));return n.length>d?u({error:new m("The APDU command exceeds the maximum allowable size (255 bytes)")}):await this.api.sendCommand(new l({message:n}))}_buildFullMessage(t){return new s().add8BitUIntToData(255).addAsciiStringToData("solana offchain").add16BitUIntToData(0).add16BitUIntToData(t.length,!1).addBufferToData(t).build()}_buildApduCommand(t,e){const r=e.length,a=new s(t.length+1+1+r*4);return a.add8BitUIntToData(1),a.add8BitUIntToData(r),e.forEach(o=>{const i=new Uint8Array(4);new DataView(i.buffer).setUint32(0,o,!1),a.addBufferToData(i)}),a.addBufferToData(t),a.build()}}export{b as SendSignMessageTask};
1
+ import{APDU_MAX_PAYLOAD as f,ByteArrayBuilder as m,CommandResultFactory as r,InvalidStatusWordError as i}from"@ledgerhq/device-management-kit";import{DerivationPathUtils as g}from"@ledgerhq/signer-utils";import l from"bs58";import{GetPubKeyCommand as p}from"../../app-binder/command/GetPubKeyCommand";import{SignOffChainMessageCommand as c}from"../../app-binder/command/SignOffChainMessageCommand";const y=65535;class U{constructor(e,t){this.api=e;this.args=t}async run(){const{sendingData:e,derivationPath:t}=this.args;if(e.length===0)return r({error:new i("Message cannot be empty")});if(e.length>y)return r({error:new i(`Message too long: ${e.length} bytes (max is 65535)`)});const d=g.splitPath(t),o=await this.api.sendCommand(new p({derivationPath:t,checkOnDevice:!1}));if(!("data"in o))return r({error:new i("Error getting public key from device")});const s=l.decode(o.data),a=this._buildFullMessage(e,s),n=this._buildApduCommand(a,d);return n.length>f?r({error:new i("The APDU command exceeds the maximum allowable size (255 bytes)")}):this.api.sendCommand(new c({message:n}))}_buildFullMessage(e,t){return new m().add8BitUIntToData(255).addAsciiStringToData("solana offchain").add8BitUIntToData(0).addBufferToData(new Uint8Array(32)).add8BitUIntToData(0).add8BitUIntToData(1).addBufferToData(t).add8BitUIntToData(e.length&255).add8BitUIntToData(e.length>>8&255).addBufferToData(e).build()}_buildApduCommand(e,t){const s=t.length*4,a=new m(e.length+1+1+s);return a.add8BitUIntToData(1),a.add8BitUIntToData(t.length),t.forEach(n=>{const u=new Uint8Array(4);new DataView(u.buffer).setUint32(0,n,!1),a.addBufferToData(u)}),a.addBufferToData(e),a.build()}}export{y as MAX_MESSAGE_LENGTH,U as SendSignMessageTask};
2
2
  //# sourceMappingURL=SendSignMessageTask.js.map