@ledgerhq/device-signer-kit-solana 0.0.0-signer-eth-plugin-fix-20250331141239 → 0.0.0-transaction-unfunded-20250917151052

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 (311) 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/api/model/TransactionResolutionContext.js +2 -0
  23. package/lib/cjs/api/model/TransactionResolutionContext.js.map +7 -0
  24. package/lib/cjs/internal/DefaultSignerSolana.js +1 -1
  25. package/lib/cjs/internal/DefaultSignerSolana.js.map +3 -3
  26. package/lib/cjs/internal/DefaultSignerSolana.test.js +1 -1
  27. package/lib/cjs/internal/DefaultSignerSolana.test.js.map +3 -3
  28. package/lib/cjs/internal/DefaultSolanaTools.js +2 -0
  29. package/lib/cjs/internal/DefaultSolanaTools.js.map +7 -0
  30. package/lib/cjs/internal/DefaultSolanaTools.test.js +2 -0
  31. package/lib/cjs/internal/DefaultSolanaTools.test.js.map +7 -0
  32. package/lib/cjs/internal/app-binder/SolanaAppBinder.js +1 -1
  33. package/lib/cjs/internal/app-binder/SolanaAppBinder.js.map +3 -3
  34. package/lib/cjs/internal/app-binder/SolanaAppBinder.test.js +1 -1
  35. package/lib/cjs/internal/app-binder/SolanaAppBinder.test.js.map +3 -3
  36. package/lib/cjs/internal/app-binder/command/GetChallengeCommand.js +2 -0
  37. package/lib/cjs/internal/app-binder/command/GetChallengeCommand.js.map +7 -0
  38. package/lib/cjs/internal/app-binder/command/GetChallengeCommand.test.js +2 -0
  39. package/lib/cjs/internal/app-binder/command/GetChallengeCommand.test.js.map +7 -0
  40. package/lib/cjs/internal/app-binder/command/GetPubKeyCommand.js.map +2 -2
  41. package/lib/cjs/internal/app-binder/command/ProvideTLVDescriptorCommand.js +2 -0
  42. package/lib/cjs/internal/app-binder/command/ProvideTLVDescriptorCommand.js.map +7 -0
  43. package/lib/cjs/internal/app-binder/command/ProvideTLVDescriptorCommand.test.js +2 -0
  44. package/lib/cjs/internal/app-binder/command/ProvideTLVDescriptorCommand.test.js.map +7 -0
  45. package/lib/cjs/internal/app-binder/command/ProvideTrustedNamePKICommand.js +2 -0
  46. package/lib/cjs/internal/app-binder/command/ProvideTrustedNamePKICommand.js.map +7 -0
  47. package/lib/cjs/internal/app-binder/command/ProvideTrustedNamePKICommand.test.js +2 -0
  48. package/lib/cjs/internal/app-binder/command/ProvideTrustedNamePKICommand.test.js.map +7 -0
  49. package/lib/cjs/internal/app-binder/device-action/GenerateTransactionDeviceAction.js +2 -0
  50. package/lib/cjs/internal/app-binder/device-action/GenerateTransactionDeviceAction.js.map +7 -0
  51. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.js +1 -1
  52. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.js.map +3 -3
  53. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.test.js +1 -1
  54. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.test.js.map +3 -3
  55. package/lib/cjs/internal/app-binder/device-action/__test-utils__/makeInternalApi.js +1 -1
  56. package/lib/cjs/internal/app-binder/device-action/__test-utils__/makeInternalApi.js.map +3 -3
  57. package/lib/cjs/internal/app-binder/di/appBinderModule.js +1 -1
  58. package/lib/cjs/internal/app-binder/di/appBinderModule.js.map +3 -3
  59. package/lib/cjs/internal/app-binder/di/appBinderModule.test.js +1 -1
  60. package/lib/cjs/internal/app-binder/di/appBinderModule.test.js.map +2 -2
  61. package/lib/cjs/internal/app-binder/services/ApplicationChecker.js +2 -0
  62. package/lib/cjs/internal/app-binder/services/ApplicationChecker.js.map +7 -0
  63. package/lib/cjs/internal/app-binder/services/ApplicationChecker.test.js +2 -0
  64. package/lib/cjs/internal/app-binder/services/ApplicationChecker.test.js.map +7 -0
  65. package/lib/cjs/internal/app-binder/services/GenerateSolanaTransaction.js +2 -0
  66. package/lib/cjs/internal/app-binder/services/GenerateSolanaTransaction.js.map +7 -0
  67. package/lib/cjs/internal/app-binder/services/GenerateSolanaTransaction.test.js +2 -0
  68. package/lib/cjs/internal/app-binder/services/GenerateSolanaTransaction.test.js.map +7 -0
  69. package/lib/cjs/internal/app-binder/services/TransactionInspector.js +2 -0
  70. package/lib/cjs/internal/app-binder/services/TransactionInspector.js.map +7 -0
  71. package/lib/cjs/internal/app-binder/services/TransactionInspector.test.js +2 -0
  72. package/lib/cjs/internal/app-binder/services/TransactionInspector.test.js.map +7 -0
  73. package/lib/cjs/internal/app-binder/services/utils/transactionDecoders.js +2 -0
  74. package/lib/cjs/internal/app-binder/services/utils/transactionDecoders.js.map +7 -0
  75. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.js +2 -0
  76. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.js.map +7 -0
  77. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.test.js +2 -0
  78. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.test.js.map +7 -0
  79. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.js +2 -0
  80. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.js.map +7 -0
  81. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.test.js +2 -0
  82. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.test.js.map +7 -0
  83. package/lib/cjs/internal/app-binder/task/SendSignMessageTask.js +1 -1
  84. package/lib/cjs/internal/app-binder/task/SendSignMessageTask.js.map +3 -3
  85. package/lib/cjs/internal/app-binder/task/SendSignMessageTask.test.js +1 -1
  86. package/lib/cjs/internal/app-binder/task/SendSignMessageTask.test.js.map +3 -3
  87. package/lib/cjs/internal/di.js +1 -1
  88. package/lib/cjs/internal/di.js.map +3 -3
  89. package/lib/cjs/internal/externalTypes.js +1 -1
  90. package/lib/cjs/internal/externalTypes.js.map +2 -2
  91. package/lib/cjs/internal/use-cases/address/GetAddressUseCase.js +1 -1
  92. package/lib/cjs/internal/use-cases/address/GetAddressUseCase.js.map +2 -2
  93. package/lib/cjs/internal/use-cases/address/GetAddressUseCase.test.js +1 -1
  94. package/lib/cjs/internal/use-cases/address/GetAddressUseCase.test.js.map +2 -2
  95. package/lib/cjs/internal/use-cases/di/useCasesModule.js +1 -1
  96. package/lib/cjs/internal/use-cases/di/useCasesModule.js.map +3 -3
  97. package/lib/cjs/internal/use-cases/di/useCasesModule.test.js +1 -1
  98. package/lib/cjs/internal/use-cases/di/useCasesModule.test.js.map +2 -2
  99. package/lib/cjs/internal/use-cases/di/useCasesTypes.js +1 -1
  100. package/lib/cjs/internal/use-cases/di/useCasesTypes.js.map +2 -2
  101. package/lib/cjs/internal/use-cases/generateTransaction/GenerateTransactionUseCase.js +2 -0
  102. package/lib/cjs/internal/use-cases/generateTransaction/GenerateTransactionUseCase.js.map +7 -0
  103. package/lib/cjs/internal/use-cases/generateTransaction/GenerateTransactionUseCase.test.js +2 -0
  104. package/lib/cjs/internal/use-cases/generateTransaction/GenerateTransactionUseCase.test.js.map +7 -0
  105. package/lib/cjs/internal/use-cases/message/SignMessageUseCase.js +1 -1
  106. package/lib/cjs/internal/use-cases/message/SignMessageUseCase.js.map +3 -3
  107. package/lib/cjs/internal/use-cases/message/SignMessageUseCase.test.js +1 -1
  108. package/lib/cjs/internal/use-cases/message/SignMessageUseCase.test.js.map +2 -2
  109. package/lib/cjs/internal/use-cases/transaction/SignTransactionUseCase.js +1 -1
  110. package/lib/cjs/internal/use-cases/transaction/SignTransactionUseCase.js.map +3 -3
  111. package/lib/cjs/internal/use-cases/transaction/SignTransactionUseCase.test.js +1 -1
  112. package/lib/cjs/internal/use-cases/transaction/SignTransactionUseCase.test.js.map +3 -3
  113. package/lib/cjs/package.json +17 -12
  114. package/lib/esm/api/SignerSolanaBuilder.js +1 -1
  115. package/lib/esm/api/SignerSolanaBuilder.js.map +3 -3
  116. package/lib/esm/api/SolanaTools.js +1 -0
  117. package/lib/esm/api/SolanaTools.js.map +7 -0
  118. package/lib/esm/api/SolanaToolsBuilder.js +2 -0
  119. package/lib/esm/api/SolanaToolsBuilder.js.map +7 -0
  120. package/lib/esm/api/app-binder/GenerateTransactionDeviceActionTypes.js +1 -0
  121. package/lib/esm/api/app-binder/GenerateTransactionDeviceActionTypes.js.map +7 -0
  122. package/lib/esm/api/index.js +1 -1
  123. package/lib/esm/api/index.js.map +3 -3
  124. package/lib/esm/api/model/MessageOptions.js +1 -0
  125. package/lib/esm/api/model/MessageOptions.js.map +7 -0
  126. package/lib/esm/api/model/TransactionResolutionContext.js +1 -0
  127. package/lib/esm/api/model/TransactionResolutionContext.js.map +7 -0
  128. package/lib/esm/internal/DefaultSignerSolana.js +1 -1
  129. package/lib/esm/internal/DefaultSignerSolana.js.map +3 -3
  130. package/lib/esm/internal/DefaultSignerSolana.test.js +1 -1
  131. package/lib/esm/internal/DefaultSignerSolana.test.js.map +3 -3
  132. package/lib/esm/internal/DefaultSolanaTools.js +2 -0
  133. package/lib/esm/internal/DefaultSolanaTools.js.map +7 -0
  134. package/lib/esm/internal/DefaultSolanaTools.test.js +2 -0
  135. package/lib/esm/internal/DefaultSolanaTools.test.js.map +7 -0
  136. package/lib/esm/internal/app-binder/SolanaAppBinder.js +1 -1
  137. package/lib/esm/internal/app-binder/SolanaAppBinder.js.map +3 -3
  138. package/lib/esm/internal/app-binder/SolanaAppBinder.test.js +1 -1
  139. package/lib/esm/internal/app-binder/SolanaAppBinder.test.js.map +3 -3
  140. package/lib/esm/internal/app-binder/command/GetChallengeCommand.js +2 -0
  141. package/lib/esm/internal/app-binder/command/GetChallengeCommand.js.map +7 -0
  142. package/lib/esm/internal/app-binder/command/GetChallengeCommand.test.js +2 -0
  143. package/lib/esm/internal/app-binder/command/GetChallengeCommand.test.js.map +7 -0
  144. package/lib/esm/internal/app-binder/command/GetPubKeyCommand.js.map +2 -2
  145. package/lib/esm/internal/app-binder/command/ProvideTLVDescriptorCommand.js +2 -0
  146. package/lib/esm/internal/app-binder/command/ProvideTLVDescriptorCommand.js.map +7 -0
  147. package/lib/esm/internal/app-binder/command/ProvideTLVDescriptorCommand.test.js +2 -0
  148. package/lib/esm/internal/app-binder/command/ProvideTLVDescriptorCommand.test.js.map +7 -0
  149. package/lib/esm/internal/app-binder/command/ProvideTrustedNamePKICommand.js +2 -0
  150. package/lib/esm/internal/app-binder/command/ProvideTrustedNamePKICommand.js.map +7 -0
  151. package/lib/esm/internal/app-binder/command/ProvideTrustedNamePKICommand.test.js +2 -0
  152. package/lib/esm/internal/app-binder/command/ProvideTrustedNamePKICommand.test.js.map +7 -0
  153. package/lib/esm/internal/app-binder/device-action/GenerateTransactionDeviceAction.js +2 -0
  154. package/lib/esm/internal/app-binder/device-action/GenerateTransactionDeviceAction.js.map +7 -0
  155. package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.js +1 -1
  156. package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.js.map +3 -3
  157. package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.test.js +1 -1
  158. package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.test.js.map +3 -3
  159. package/lib/esm/internal/app-binder/device-action/__test-utils__/makeInternalApi.js +1 -1
  160. package/lib/esm/internal/app-binder/device-action/__test-utils__/makeInternalApi.js.map +3 -3
  161. package/lib/esm/internal/app-binder/di/appBinderModule.js +1 -1
  162. package/lib/esm/internal/app-binder/di/appBinderModule.js.map +3 -3
  163. package/lib/esm/internal/app-binder/di/appBinderModule.test.js +1 -1
  164. package/lib/esm/internal/app-binder/di/appBinderModule.test.js.map +2 -2
  165. package/lib/esm/internal/app-binder/services/ApplicationChecker.js +2 -0
  166. package/lib/esm/internal/app-binder/services/ApplicationChecker.js.map +7 -0
  167. package/lib/esm/internal/app-binder/services/ApplicationChecker.test.js +2 -0
  168. package/lib/esm/internal/app-binder/services/ApplicationChecker.test.js.map +7 -0
  169. package/lib/esm/internal/app-binder/services/GenerateSolanaTransaction.js +2 -0
  170. package/lib/esm/internal/app-binder/services/GenerateSolanaTransaction.js.map +7 -0
  171. package/lib/esm/internal/app-binder/services/GenerateSolanaTransaction.test.js +2 -0
  172. package/lib/esm/internal/app-binder/services/GenerateSolanaTransaction.test.js.map +7 -0
  173. package/lib/esm/internal/app-binder/services/TransactionInspector.js +2 -0
  174. package/lib/esm/internal/app-binder/services/TransactionInspector.js.map +7 -0
  175. package/lib/esm/internal/app-binder/services/TransactionInspector.test.js +2 -0
  176. package/lib/esm/internal/app-binder/services/TransactionInspector.test.js.map +7 -0
  177. package/lib/esm/internal/app-binder/services/utils/transactionDecoders.js +2 -0
  178. package/lib/esm/internal/app-binder/services/utils/transactionDecoders.js.map +7 -0
  179. package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.js +2 -0
  180. package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.js.map +7 -0
  181. package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.test.js +2 -0
  182. package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.test.js.map +7 -0
  183. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.js +2 -0
  184. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.js.map +7 -0
  185. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.test.js +2 -0
  186. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.test.js.map +7 -0
  187. package/lib/esm/internal/app-binder/task/SendSignMessageTask.js +1 -1
  188. package/lib/esm/internal/app-binder/task/SendSignMessageTask.js.map +3 -3
  189. package/lib/esm/internal/app-binder/task/SendSignMessageTask.test.js +1 -1
  190. package/lib/esm/internal/app-binder/task/SendSignMessageTask.test.js.map +3 -3
  191. package/lib/esm/internal/di.js +1 -1
  192. package/lib/esm/internal/di.js.map +3 -3
  193. package/lib/esm/internal/externalTypes.js +1 -1
  194. package/lib/esm/internal/externalTypes.js.map +2 -2
  195. package/lib/esm/internal/use-cases/address/GetAddressUseCase.js +1 -1
  196. package/lib/esm/internal/use-cases/address/GetAddressUseCase.js.map +2 -2
  197. package/lib/esm/internal/use-cases/address/GetAddressUseCase.test.js +1 -1
  198. package/lib/esm/internal/use-cases/address/GetAddressUseCase.test.js.map +2 -2
  199. package/lib/esm/internal/use-cases/di/useCasesModule.js +1 -1
  200. package/lib/esm/internal/use-cases/di/useCasesModule.js.map +3 -3
  201. package/lib/esm/internal/use-cases/di/useCasesModule.test.js +1 -1
  202. package/lib/esm/internal/use-cases/di/useCasesModule.test.js.map +2 -2
  203. package/lib/esm/internal/use-cases/di/useCasesTypes.js +1 -1
  204. package/lib/esm/internal/use-cases/di/useCasesTypes.js.map +2 -2
  205. package/lib/esm/internal/use-cases/generateTransaction/GenerateTransactionUseCase.js +2 -0
  206. package/lib/esm/internal/use-cases/generateTransaction/GenerateTransactionUseCase.js.map +7 -0
  207. package/lib/esm/internal/use-cases/generateTransaction/GenerateTransactionUseCase.test.js +2 -0
  208. package/lib/esm/internal/use-cases/generateTransaction/GenerateTransactionUseCase.test.js.map +7 -0
  209. package/lib/esm/internal/use-cases/message/SignMessageUseCase.js +1 -1
  210. package/lib/esm/internal/use-cases/message/SignMessageUseCase.js.map +3 -3
  211. package/lib/esm/internal/use-cases/message/SignMessageUseCase.test.js +1 -1
  212. package/lib/esm/internal/use-cases/message/SignMessageUseCase.test.js.map +2 -2
  213. package/lib/esm/internal/use-cases/transaction/SignTransactionUseCase.js +1 -1
  214. package/lib/esm/internal/use-cases/transaction/SignTransactionUseCase.js.map +3 -3
  215. package/lib/esm/internal/use-cases/transaction/SignTransactionUseCase.test.js +1 -1
  216. package/lib/esm/internal/use-cases/transaction/SignTransactionUseCase.test.js.map +3 -3
  217. package/lib/esm/package.json +17 -12
  218. package/lib/types/api/SignerSolana.d.ts +4 -3
  219. package/lib/types/api/SignerSolana.d.ts.map +1 -1
  220. package/lib/types/api/SignerSolanaBuilder.d.ts +12 -1
  221. package/lib/types/api/SignerSolanaBuilder.d.ts.map +1 -1
  222. package/lib/types/api/SolanaTools.d.ts +10 -0
  223. package/lib/types/api/SolanaTools.d.ts.map +1 -0
  224. package/lib/types/api/SolanaToolsBuilder.d.ts +39 -0
  225. package/lib/types/api/SolanaToolsBuilder.d.ts.map +1 -0
  226. package/lib/types/api/app-binder/GenerateTransactionDeviceActionTypes.d.ts +24 -0
  227. package/lib/types/api/app-binder/GenerateTransactionDeviceActionTypes.d.ts.map +1 -0
  228. package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts +11 -3
  229. package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts.map +1 -1
  230. package/lib/types/api/index.d.ts +3 -1
  231. package/lib/types/api/index.d.ts.map +1 -1
  232. package/lib/types/api/model/AddressOption.d.ts +1 -0
  233. package/lib/types/api/model/AddressOption.d.ts.map +1 -1
  234. package/lib/types/api/model/MessageOptions.d.ts +4 -0
  235. package/lib/types/api/model/MessageOptions.d.ts.map +1 -0
  236. package/lib/types/api/model/TransactionOptions.d.ts +6 -1
  237. package/lib/types/api/model/TransactionOptions.d.ts.map +1 -1
  238. package/lib/types/api/model/TransactionResolutionContext.d.ts +8 -0
  239. package/lib/types/api/model/TransactionResolutionContext.d.ts.map +1 -0
  240. package/lib/types/internal/DefaultSignerSolana.d.ts +7 -4
  241. package/lib/types/internal/DefaultSignerSolana.d.ts.map +1 -1
  242. package/lib/types/internal/DefaultSolanaTools.d.ts +20 -0
  243. package/lib/types/internal/DefaultSolanaTools.d.ts.map +1 -0
  244. package/lib/types/internal/DefaultSolanaTools.test.d.ts +2 -0
  245. package/lib/types/internal/DefaultSolanaTools.test.d.ts.map +1 -0
  246. package/lib/types/internal/app-binder/SolanaAppBinder.d.ts +12 -3
  247. package/lib/types/internal/app-binder/SolanaAppBinder.d.ts.map +1 -1
  248. package/lib/types/internal/app-binder/command/GetChallengeCommand.d.ts +11 -0
  249. package/lib/types/internal/app-binder/command/GetChallengeCommand.d.ts.map +1 -0
  250. package/lib/types/internal/app-binder/command/GetChallengeCommand.test.d.ts +2 -0
  251. package/lib/types/internal/app-binder/command/GetChallengeCommand.test.d.ts.map +1 -0
  252. package/lib/types/internal/app-binder/command/GetPubKeyCommand.d.ts +2 -3
  253. package/lib/types/internal/app-binder/command/GetPubKeyCommand.d.ts.map +1 -1
  254. package/lib/types/internal/app-binder/command/ProvideTLVDescriptorCommand.d.ts +13 -0
  255. package/lib/types/internal/app-binder/command/ProvideTLVDescriptorCommand.d.ts.map +1 -0
  256. package/lib/types/internal/app-binder/command/ProvideTLVDescriptorCommand.test.d.ts +2 -0
  257. package/lib/types/internal/app-binder/command/ProvideTLVDescriptorCommand.test.d.ts.map +1 -0
  258. package/lib/types/internal/app-binder/command/ProvideTrustedNamePKICommand.d.ts +13 -0
  259. package/lib/types/internal/app-binder/command/ProvideTrustedNamePKICommand.d.ts.map +1 -0
  260. package/lib/types/internal/app-binder/command/ProvideTrustedNamePKICommand.test.d.ts +2 -0
  261. package/lib/types/internal/app-binder/command/ProvideTrustedNamePKICommand.test.d.ts.map +1 -0
  262. package/lib/types/internal/app-binder/command/utils/SolanaApplicationErrors.d.ts.map +1 -1
  263. package/lib/types/internal/app-binder/device-action/GenerateTransactionDeviceAction.d.ts +23 -0
  264. package/lib/types/internal/app-binder/device-action/GenerateTransactionDeviceAction.d.ts.map +1 -0
  265. package/lib/types/internal/app-binder/device-action/SignTransactionDeviceAction.d.ts +18 -1
  266. package/lib/types/internal/app-binder/device-action/SignTransactionDeviceAction.d.ts.map +1 -1
  267. package/lib/types/internal/app-binder/device-action/__test-utils__/makeInternalApi.d.ts.map +1 -1
  268. package/lib/types/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.d.ts.map +1 -1
  269. package/lib/types/internal/app-binder/di/appBinderModule.d.ts.map +1 -1
  270. package/lib/types/internal/app-binder/services/ApplicationChecker.d.ts +13 -0
  271. package/lib/types/internal/app-binder/services/ApplicationChecker.d.ts.map +1 -0
  272. package/lib/types/internal/app-binder/services/ApplicationChecker.test.d.ts +2 -0
  273. package/lib/types/internal/app-binder/services/ApplicationChecker.test.d.ts.map +1 -0
  274. package/lib/types/internal/app-binder/services/GenerateSolanaTransaction.d.ts +14 -0
  275. package/lib/types/internal/app-binder/services/GenerateSolanaTransaction.d.ts.map +1 -0
  276. package/lib/types/internal/app-binder/services/GenerateSolanaTransaction.test.d.ts +2 -0
  277. package/lib/types/internal/app-binder/services/GenerateSolanaTransaction.test.d.ts.map +1 -0
  278. package/lib/types/internal/app-binder/services/TransactionInspector.d.ts +46 -0
  279. package/lib/types/internal/app-binder/services/TransactionInspector.d.ts.map +1 -0
  280. package/lib/types/internal/app-binder/services/TransactionInspector.test.d.ts +2 -0
  281. package/lib/types/internal/app-binder/services/TransactionInspector.test.d.ts.map +1 -0
  282. package/lib/types/internal/app-binder/services/utils/transactionDecoders.d.ts +23 -0
  283. package/lib/types/internal/app-binder/services/utils/transactionDecoders.d.ts.map +1 -0
  284. package/lib/types/internal/app-binder/task/BuildTransactionContextTask.d.ts +24 -0
  285. package/lib/types/internal/app-binder/task/BuildTransactionContextTask.d.ts.map +1 -0
  286. package/lib/types/internal/app-binder/task/BuildTransactionContextTask.test.d.ts +2 -0
  287. package/lib/types/internal/app-binder/task/BuildTransactionContextTask.test.d.ts.map +1 -0
  288. package/lib/types/internal/app-binder/task/ProvideTransactionContextTask.d.ts +15 -0
  289. package/lib/types/internal/app-binder/task/ProvideTransactionContextTask.d.ts.map +1 -0
  290. package/lib/types/internal/app-binder/task/ProvideTransactionContextTask.test.d.ts +2 -0
  291. package/lib/types/internal/app-binder/task/ProvideTransactionContextTask.test.d.ts.map +1 -0
  292. package/lib/types/internal/app-binder/task/SendSignMessageTask.d.ts +7 -0
  293. package/lib/types/internal/app-binder/task/SendSignMessageTask.d.ts.map +1 -1
  294. package/lib/types/internal/di.d.ts +3 -1
  295. package/lib/types/internal/di.d.ts.map +1 -1
  296. package/lib/types/internal/externalTypes.d.ts +1 -0
  297. package/lib/types/internal/externalTypes.d.ts.map +1 -1
  298. package/lib/types/internal/use-cases/address/GetAddressUseCase.d.ts.map +1 -1
  299. package/lib/types/internal/use-cases/di/useCasesModule.d.ts.map +1 -1
  300. package/lib/types/internal/use-cases/di/useCasesTypes.d.ts +1 -0
  301. package/lib/types/internal/use-cases/di/useCasesTypes.d.ts.map +1 -1
  302. package/lib/types/internal/use-cases/generateTransaction/GenerateTransactionUseCase.d.ts +10 -0
  303. package/lib/types/internal/use-cases/generateTransaction/GenerateTransactionUseCase.d.ts.map +1 -0
  304. package/lib/types/internal/use-cases/generateTransaction/GenerateTransactionUseCase.test.d.ts +2 -0
  305. package/lib/types/internal/use-cases/generateTransaction/GenerateTransactionUseCase.test.d.ts.map +1 -0
  306. package/lib/types/internal/use-cases/message/SignMessageUseCase.d.ts +2 -1
  307. package/lib/types/internal/use-cases/message/SignMessageUseCase.d.ts.map +1 -1
  308. package/lib/types/internal/use-cases/transaction/SignTransactionUseCase.d.ts +2 -2
  309. package/lib/types/internal/use-cases/transaction/SignTransactionUseCase.d.ts.map +1 -1
  310. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  311. package/package.json +19 -14
@@ -1,2 +1,2 @@
1
- import{isSuccessCommandResult as c,OpenAppDeviceAction as p,UnknownDAError as s,UserInteractionRequired as r,XStateDeviceAction as u}from"@ledgerhq/device-management-kit";import{Left as S,Right as l}from"purify-ts";import{assign as e,fromPromise as g,setup as d}from"xstate";import{SignTransactionCommand as A}from"../../app-binder/command/SignTransactionCommand";import{SignDataTask as m}from"../../app-binder/task/SendSignDataTask";class E extends u{makeStateMachine(a){const{signTransaction:i}=this.extractDependencies(a);return d({types:{input:{},context:{},output:{}},actors:{openAppStateMachine:new p({input:{appName:"Solana"}}).makeStateMachine(a),signTransaction:g(i)},guards:{noInternalError:({context:n})=>n._internalState.error===null},actions:{assignErrorFromEvent:e({_internalState:n=>({...n.context._internalState,error:n.event.error})})}}).createMachine({id:"SignTransactionDeviceAction",initial:"OpenAppDeviceAction",context:({input:n})=>({input:n,intermediateValue:{requiredUserInteraction:r.None},_internalState:{error:null,signature:null}}),states:{OpenAppDeviceAction:{exit:e({intermediateValue:{requiredUserInteraction:r.None}}),invoke:{id:"openAppStateMachine",input:{appName:"Solana"},src:"openAppStateMachine",onSnapshot:{actions:e({intermediateValue:n=>n.event.snapshot.context.intermediateValue})},onDone:{actions:e({_internalState:n=>n.event.output.caseOf({Right:()=>n.context._internalState,Left:t=>({...n.context._internalState,error:t})})}),target:"CheckOpenAppDeviceActionResult"}}},CheckOpenAppDeviceActionResult:{always:[{target:"SignTransaction",guard:"noInternalError"},"Error"]},SignTransaction:{entry:e({intermediateValue:{requiredUserInteraction:r.SignTransaction}}),exit:e({intermediateValue:{requiredUserInteraction:r.None}}),invoke:{id:"signTransaction",src:"signTransaction",input:({context:n})=>({derivationPath:n.input.derivationPath,serializedTransaction:n.input.transaction}),onDone:{target:"SignTransactionResultCheck",actions:[e({_internalState:({event:n,context:t})=>{if(!c(n.output))return{...t._internalState,error:n.output.error};const o=n.output.data.extract();return n.output.data.isJust()&&o instanceof Uint8Array?{...t._internalState,signature:o}:{...t._internalState,error:new s("No Signature available")}}})]},onError:{target:"Error",actions:"assignErrorFromEvent"}}},SignTransactionResultCheck:{always:[{guard:"noInternalError",target:"Success"},{target:"Error"}]},Success:{type:"final"},Error:{type:"final"}},output:({context:n})=>n._internalState.signature?l(n._internalState.signature):S(n._internalState.error||new s("No error or signature available"))})}extractDependencies(a){return{signTransaction:async n=>new m(a,{commandFactory:t=>new A({serializedTransaction:t.chunkedData,more:t.more,extend:t.extend}),derivationPath:n.input.derivationPath,sendingData:n.input.serializedTransaction}).run()}}}export{E as SignTransactionDeviceAction};
1
+ import{DeviceModelId as S,isSuccessCommandResult as g,OpenAppDeviceAction as C,UnknownDAError as s,UserInteractionRequired as a,XStateDeviceAction as T}from"@ledgerhq/device-management-kit";import{Left as m,Right as A}from"purify-ts";import{assign as e,fromPromise as o,setup as y}from"xstate";import{GetAppConfigurationCommand as x}from"../../app-binder/command/GetAppConfigurationCommand";import{SignTransactionCommand as D}from"../../app-binder/command/SignTransactionCommand";import{ApplicationChecker as f}from"../../app-binder/services/ApplicationChecker";import{SolanaTransactionTypes as R,TransactionInspector as E}from"../../app-binder/services/TransactionInspector";import{BuildTransactionContextTask as v}from"../../app-binder/task/BuildTransactionContextTask";import{ProvideSolanaTransactionContextTask as I}from"../../app-binder/task/ProvideTransactionContextTask";import{SignDataTask as h}from"../../app-binder/task/SendSignDataTask";class N extends T{makeStateMachine(r){const{signTransaction:c,getAppConfig:p,buildContext:u,provideContext:l,inspectTransaction:d}=this.extractDependencies(r);return y({types:{input:{},context:{},output:{}},actors:{openAppStateMachine:new C({input:{appName:"Solana"}}).makeStateMachine(r),getAppConfig:o(p),inspectTransaction:o(({input:t})=>d({serializedTransaction:t.serializedTransaction,resolutionContext:t.resolutionContext,RPCURL:t.RPCURL})),buildContext:o(u),provideContext:o(l),signTransaction:o(c)},guards:{noInternalError:({context:t})=>t._internalState.error===null,skipOpenApp:({context:t})=>t.input.transactionOptions?.skipOpenApp||!1,isSPLSupported:({context:t})=>new f(r.getDeviceSessionState(),t._internalState.appConfig).withMinVersionExclusive("1.4.0").excludeDeviceModel(S.NANO_S).check(),isAnSPLTransaction:({context:t})=>t._internalState.inspectorResult?.transactionType===R.SPL,shouldSkipInspection:({context:t})=>t._internalState.error===null&&!!t.input.transactionOptions?.transactionResolutionContext},actions:{assignErrorFromEvent:e({_internalState:t=>({...t.context._internalState,error:new s(t.event.error instanceof Error?t.event.error.message:String(t.event.error))})})}}).createMachine({id:"SignTransactionDeviceAction",initial:"InitialState",context:({input:t})=>({input:t,intermediateValue:{requiredUserInteraction:a.None},_internalState:{error:null,signature:null,appConfig:null,solanaTransactionContext:null,inspectorResult:null}}),states:{InitialState:{always:[{target:"GetAppConfig",guard:"skipOpenApp"},{target:"OpenAppDeviceAction"}]},OpenAppDeviceAction:{exit:e({intermediateValue:()=>({requiredUserInteraction:a.None})}),invoke:{id:"openAppStateMachine",src:"openAppStateMachine",input:()=>({appName:"Solana"}),onSnapshot:{actions:e({intermediateValue:({event:t})=>t.snapshot.context.intermediateValue})},onDone:{target:"CheckOpenAppDeviceActionResult",actions:e({_internalState:({event:t,context:n})=>t.output.caseOf({Right:()=>n._internalState,Left:i=>({...n._internalState,error:i})})})}}},CheckOpenAppDeviceActionResult:{always:[{target:"GetAppConfig",guard:"noInternalError"},{target:"Error"}]},GetAppConfig:{entry:e({intermediateValue:()=>({requiredUserInteraction:a.None})}),invoke:{id:"getAppConfig",src:"getAppConfig",onDone:{target:"GetAppConfigResultCheck",actions:e({_internalState:({event:t,context:n})=>g(t.output)?{...n._internalState,appConfig:t.output.data}:{...n._internalState,error:t.output.error}})},onError:{target:"Error",actions:"assignErrorFromEvent"}}},GetAppConfigResultCheck:{always:[{target:"InspectTransaction",guard:"noInternalError"},{target:"Error"}]},InspectTransaction:{invoke:{id:"inspectTransaction",src:"inspectTransaction",input:({context:t})=>({serializedTransaction:t.input.transaction,resolutionContext:t.input.transactionOptions?.transactionResolutionContext,RPCURL:t.input.transactionOptions?.solanaRPCURL}),onDone:{target:"AfterInspect",actions:e({_internalState:({context:t,event:n})=>({...t._internalState,inspectorResult:n.output})})},onError:{target:"Error",actions:"assignErrorFromEvent"}}},AfterInspect:{always:[{target:"BuildContext",guard:"isAnSPLTransaction"},{target:"SignTransaction",guard:"noInternalError"},{target:"Error"}]},BuildContext:{entry:e({intermediateValue:()=>({requiredUserInteraction:a.None})}),invoke:{id:"buildContext",src:"buildContext",input:({context:t})=>{const n=t._internalState.inspectorResult?.data;return{contextModule:t.input.contextModule,options:{tokenAddress:n?.tokenAddress,createATA:n?.createATA}}},onDone:{target:"ProvideContext",actions:[e({_internalState:({event:t,context:n})=>({...n._internalState,solanaTransactionContext:{descriptor:t.output.descriptor,certificate:t.output.calCertificate,tokenAccount:t.output.addressResult.tokenAccount,owner:t.output.addressResult.owner,contract:t.output.addressResult.contract}})})]},onError:{target:"Error",actions:"assignErrorFromEvent"}}},ProvideContext:{entry:e({intermediateValue:()=>({requiredUserInteraction:a.None})}),invoke:{id:"provideContext",src:"provideContext",input:({context:t})=>{if(!t._internalState.solanaTransactionContext)throw new s("Solana transaction context is not available");return t._internalState.solanaTransactionContext},onDone:{target:"ProvideContextResultCheck"},onError:{target:"Error",actions:"assignErrorFromEvent"}}},ProvideContextResultCheck:{always:[{target:"SignTransaction",guard:"noInternalError"},{target:"Error"}]},SignTransaction:{entry:e({intermediateValue:{requiredUserInteraction:a.SignTransaction}}),exit:e({intermediateValue:{requiredUserInteraction:a.None}}),invoke:{id:"signTransaction",src:"signTransaction",input:({context:t})=>({derivationPath:t.input.derivationPath,serializedTransaction:t.input.transaction}),onDone:{target:"SignTransactionResultCheck",actions:[e({_internalState:({event:t,context:n})=>{if(!g(t.output))return{...n._internalState,error:t.output.error};const i=t.output.data.extract();return t.output.data.isJust()&&i instanceof Uint8Array?{...n._internalState,signature:i}:{...n._internalState,error:new s("No Signature available")}}})]},onError:{target:"Error",actions:"assignErrorFromEvent"}}},SignTransactionResultCheck:{always:[{guard:"noInternalError",target:"Success"},{target:"Error"}]},Success:{type:"final"},Error:{type:"final"}},output:({context:t})=>t._internalState.signature?A(t._internalState.signature):m(t._internalState.error||new s("No error or signature available"))})}extractDependencies(r){return{getAppConfig:async()=>r.sendCommand(new x),buildContext:async t=>new v(r,t.input).run(),provideContext:async t=>new I(r,t.input).run(),signTransaction:async t=>new h(r,{commandFactory:n=>new D({serializedTransaction:n.chunkedData,more:n.more,extend:n.extend}),derivationPath:t.input.derivationPath,sendingData:t.input.serializedTransaction}).run(),inspectTransaction:async t=>Promise.resolve(new E(t.serializedTransaction,t.resolutionContext?.tokenAddress,t.resolutionContext?.createATA,t.RPCURL).inspectTransactionType())}}}export{N as SignTransactionDeviceAction};
2
2
  //# sourceMappingURL=SignTransactionDeviceAction.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/device-action/SignTransactionDeviceAction.ts"],
4
- "sourcesContent": ["import {\n type CommandResult,\n type DeviceActionStateMachine,\n type InternalApi,\n isSuccessCommandResult,\n OpenAppDeviceAction,\n type StateMachineTypes,\n UnknownDAError,\n UserInteractionRequired,\n XStateDeviceAction,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, type Maybe, Right } from \"purify-ts\";\nimport { assign, fromPromise, setup } from \"xstate\";\n\nimport {\n type SignTransactionDAError,\n type SignTransactionDAInput,\n type SignTransactionDAIntermediateValue,\n type SignTransactionDAInternalState,\n type SignTransactionDAOutput,\n} from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { type Signature } from \"@api/model/Signature\";\nimport { SignTransactionCommand } from \"@internal/app-binder/command/SignTransactionCommand\";\nimport { type SolanaAppErrorCodes } from \"@internal/app-binder/command/utils/SolanaApplicationErrors\";\nimport { SignDataTask } from \"@internal/app-binder/task/SendSignDataTask\";\n\nexport type MachineDependencies = {\n readonly signTransaction: (arg0: {\n input: {\n derivationPath: string;\n serializedTransaction: Uint8Array;\n };\n }) => Promise<\n CommandResult<Maybe<Signature | SolanaAppErrorCodes>, SolanaAppErrorCodes>\n >;\n};\n\nexport class SignTransactionDeviceAction extends XStateDeviceAction<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n> {\n makeStateMachine(\n internalApi: InternalApi,\n ): DeviceActionStateMachine<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n > {\n type types = StateMachineTypes<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n >;\n\n const { signTransaction } = this.extractDependencies(internalApi);\n\n return setup({\n types: {\n input: {} as types[\"input\"],\n context: {} as types[\"context\"],\n output: {} as types[\"output\"],\n },\n actors: {\n openAppStateMachine: new OpenAppDeviceAction({\n input: { appName: \"Solana\" },\n }).makeStateMachine(internalApi),\n signTransaction: fromPromise(signTransaction),\n },\n guards: {\n noInternalError: ({ context }) => context._internalState.error === null,\n },\n actions: {\n assignErrorFromEvent: assign({\n _internalState: (_) => ({\n ..._.context._internalState,\n error: _.event[\"error\"], // NOTE: it should never happen, the error is not typed anymore here\n }),\n }),\n },\n }).createMachine({\n /** @xstate-layout N4IgpgJg5mDOIC5QGUCWUB2AVATgQw1jwGMAXVAewwBEwA3VYsAQTMowDoB5ABzA2Y8etBk1bkqAYghUwHVBjoUA1nIp8BQ5KTykwAWRIALBWADaABgC6iUDwqxUEjLZAAPRABYAzAHYOAJwAHABMFgCMnhYWUSFBvgA0IACeiEEAbOkcAKxBQQGeASG+3tmeISEAvpVJaJi4BERsVCKMLM2cAMJGYMTKvPyCwvRt4uwASnAArgA2pJKWNkgg9o7Orh4IAQEWHN7RvgGH2dne4UHhSakI+Vnpvtkh4eme2Udh3tW16Nj4hCTOVpiDocbq9foaIZA9rOSawWbzMzhJZ2BxOdgbRDbXb7CyHY6nc6XFJpcIcc6+OLebzxCoBbLhL4gOq-RoA9jQsZUDgAcTApG6eBmM34MGksnkihUchgAqMQpFGBgi1cq3RVExCEi+Q4nnO6RC3ji232QSuiBKZPCEQyZwsmSCNKZLIa-w6nJBfLlCtFYEkYBwOAoOA4PBmugAZsGALYcWWC4W+lXLNXrZabbUBXX6w3GgKm803eLk7ZBTwZF6Uz41Zk-V1NQEjYHODgAISmqBmEE6VD0bnmMgwcgUSlUHAARh2uz2MH3SMnUWsMenEOFtv5HhYghEdt5PPvC7ks2v89EAvdwuFDc6638GxymzD2G2p93e2B+-7A8HQ+HSFGcFjSdOzfWcP3naxVTRNNQAzdccjCbc1wsPcDxJBBfFeDgQneDJHgZAib3qO92RaR8uU4AAFIMGAgMAZzncUh0lUc5B4GjUDohjwIXFZoOXWDEBCU4sl8DJwl8Xxogsc8YkLTwxI4TDlMwjJfHSCwqhrF0SPdciQWoihaPo99PwDIMQzDSMY1DDiuNMiCUT4pcNRXBBhO8UTxMk6TZM8QsNO8PYCkpHwghOIIiNZN1G1EJ9uUM4zuP7OEETBPoFkglN+NcwSEFxHEtziB49wCYlrj3XZhM8e5HQiCJCii+tSJofSW0SziTLAlLpjmdLlAWZEoJclw3IKvYiviU5CnKxBsi3DhHT8fd7hwmk9ya3TYtGEEdLZDomOHKUx0cYj9ucXjUwE9xEFKHDyRCfcHhCF411m9zIiU88jXyQ4-CvTbzofOKKI4PaYvYL8LN-azAI4U7ovvKhLpy0a8ru49HoUx5XrKwtqSzfdSgeeILjKmJAYhsiQd228gaoVK+p6DKUZGzVvHghrNKNEoHn89CT2zHYyjOalPIB7S6ap1qaZbcGkYwRm5XBQanKu3KbvyznIm54o-DKQsscW0I3nSZ4TkKalqhrDAKDo+BlnllqPRg5z1TRzWAFp0kLb2OGkgPA4OSmFZd58Bk0YZZeu9WPc2cpCzLEJdRkix5oI-cQ+dtrn36iOoRzhnetIYb3c1dIy11alHWyTIzfSbJEnQvIgmw14t1KwpMOrb4zulsPuS9BNFRgUvXYzc4goZTzgntE980T3wySNPEJPCfZyg5rO9Oj7l2xA5KS+ytm3OeI5FoqGrMiiEofELSlCaJMpsXCx7t+25tnw6+zuqPxcy7chUNOgRHovHwuUbGh5iwETeHEBkcR7Tv2BjtdqdkupziVv1Me11NjFCwshTSKEGTqX5tceauwojiwkluNcb9JZ91DoXTgTsOjYI1psM4+YEKXniK9N4704itx2CUUI4UGTBC0r3RG2dd7MKlgrTBzNlBsLjrdXmCFHT6kiNsV4htPK6keDVFeW4UKZ3odIneKDnzICmMQJgsAHb-3Hl4J4VUXpFGrjEUohY1xZHCLXE4-j8zkIUkg6mVjuQAFFvw4BUZqco1psLuMNDSLx2RDzAMblePU9I7QvWrNUIAA */\n id: \"SignTransactionDeviceAction\",\n initial: \"OpenAppDeviceAction\",\n context: ({ input }) => {\n return {\n input,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n _internalState: {\n error: null,\n signature: null,\n },\n };\n },\n states: {\n OpenAppDeviceAction: {\n exit: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n }),\n invoke: {\n id: \"openAppStateMachine\",\n input: { appName: \"Solana\" },\n src: \"openAppStateMachine\",\n onSnapshot: {\n actions: assign({\n intermediateValue: (_) =>\n _.event.snapshot.context.intermediateValue,\n }),\n },\n onDone: {\n actions: assign({\n _internalState: (_) => {\n return _.event.output.caseOf<SignTransactionDAInternalState>({\n Right: () => _.context._internalState,\n Left: (error) => ({\n ..._.context._internalState,\n error,\n }),\n });\n },\n }),\n target: \"CheckOpenAppDeviceActionResult\",\n },\n },\n },\n CheckOpenAppDeviceActionResult: {\n always: [\n {\n target: \"SignTransaction\",\n guard: \"noInternalError\",\n },\n \"Error\",\n ],\n },\n SignTransaction: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n },\n }),\n exit: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n }),\n invoke: {\n id: \"signTransaction\",\n src: \"signTransaction\",\n input: ({ context }) => ({\n derivationPath: context.input.derivationPath,\n serializedTransaction: context.input.transaction,\n }),\n onDone: {\n target: \"SignTransactionResultCheck\",\n actions: [\n assign({\n _internalState: ({ event, context }) => {\n if (!isSuccessCommandResult(event.output))\n return {\n ...context._internalState,\n error: event.output.error,\n };\n\n const data = event.output.data.extract();\n if (\n event.output.data.isJust() &&\n data instanceof Uint8Array\n )\n return {\n ...context._internalState,\n signature: data,\n };\n\n return {\n ...context._internalState,\n error: new UnknownDAError(\"No Signature available\"),\n };\n },\n }),\n ],\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n SignTransactionResultCheck: {\n always: [\n { guard: \"noInternalError\", target: \"Success\" },\n { target: \"Error\" },\n ],\n },\n Success: {\n type: \"final\",\n },\n Error: {\n type: \"final\",\n },\n },\n output: ({ context }) =>\n context._internalState.signature\n ? Right(context._internalState.signature)\n : Left(\n context._internalState.error ||\n new UnknownDAError(\"No error or signature available\"),\n ),\n });\n }\n\n extractDependencies(internalApi: InternalApi): MachineDependencies {\n const signTransaction = async (arg0: {\n input: {\n derivationPath: string;\n serializedTransaction: Uint8Array;\n };\n }) => {\n return new SignDataTask(internalApi, {\n commandFactory: (args) =>\n new SignTransactionCommand({\n serializedTransaction: args.chunkedData,\n more: args.more,\n extend: args.extend,\n }),\n derivationPath: arg0.input.derivationPath,\n sendingData: arg0.input.serializedTransaction,\n }).run();\n };\n\n return {\n signTransaction,\n };\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["isSuccessCommandResult", "OpenAppDeviceAction", "UnknownDAError", "UserInteractionRequired", "XStateDeviceAction", "Left", "Right", "assign", "fromPromise", "setup", "SignTransactionCommand", "SignDataTask", "SignTransactionDeviceAction", "internalApi", "signTransaction", "context", "_", "input", "error", "event", "data", "arg0", "args"]
4
+ "sourcesContent": ["import {\n type CommandErrorResult,\n type CommandResult,\n type DeviceActionStateMachine,\n DeviceModelId,\n type InternalApi,\n isSuccessCommandResult,\n OpenAppDeviceAction,\n type StateMachineTypes,\n UnknownDAError,\n UserInteractionRequired,\n XStateDeviceAction,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, type Maybe, Right } from \"purify-ts\";\nimport { assign, fromPromise, setup } from \"xstate\";\n\nimport {\n type SignTransactionDAError,\n type SignTransactionDAInput,\n type SignTransactionDAIntermediateValue,\n type SignTransactionDAInternalState,\n type SignTransactionDAOutput,\n} from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { type AppConfiguration } from \"@api/model/AppConfiguration\";\nimport { type Signature } from \"@api/model/Signature\";\nimport { type TransactionResolutionContext } from \"@api/model/TransactionResolutionContext\";\nimport { GetAppConfigurationCommand } from \"@internal/app-binder/command/GetAppConfigurationCommand\";\nimport { SignTransactionCommand } from \"@internal/app-binder/command/SignTransactionCommand\";\nimport { type SolanaAppErrorCodes } from \"@internal/app-binder/command/utils/SolanaApplicationErrors\";\nimport { ApplicationChecker } from \"@internal/app-binder/services/ApplicationChecker\";\nimport {\n SolanaTransactionTypes,\n TransactionInspector,\n} from \"@internal/app-binder/services/TransactionInspector\";\nimport { type TxInspectorResult } from \"@internal/app-binder/services/TransactionInspector\";\nimport {\n BuildTransactionContextTask,\n type BuildTransactionContextTaskArgs,\n type SolanaBuildContextResult,\n} from \"@internal/app-binder/task/BuildTransactionContextTask\";\nimport {\n ProvideSolanaTransactionContextTask,\n type SolanaContextForDevice,\n} from \"@internal/app-binder/task/ProvideTransactionContextTask\";\nimport { SignDataTask } from \"@internal/app-binder/task/SendSignDataTask\";\n\nexport type MachineDependencies = {\n readonly getAppConfig: () => Promise<\n CommandResult<AppConfiguration, SolanaAppErrorCodes>\n >;\n readonly buildContext: (arg0: {\n input: BuildTransactionContextTaskArgs;\n }) => Promise<SolanaBuildContextResult>;\n readonly provideContext: (arg0: {\n input: SolanaContextForDevice;\n }) => Promise<Maybe<CommandErrorResult<SolanaAppErrorCodes>>>;\n readonly inspectTransaction: (arg0: {\n serializedTransaction: Uint8Array;\n resolutionContext?: TransactionResolutionContext;\n RPCURL?: string;\n }) => Promise<TxInspectorResult>;\n readonly signTransaction: (arg0: {\n input: {\n derivationPath: string;\n serializedTransaction: Uint8Array;\n };\n }) => Promise<\n CommandResult<Maybe<Signature | SolanaAppErrorCodes>, SolanaAppErrorCodes>\n >;\n};\n\nexport class SignTransactionDeviceAction extends XStateDeviceAction<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n> {\n makeStateMachine(\n internalApi: InternalApi,\n ): DeviceActionStateMachine<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n > {\n type types = StateMachineTypes<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n >;\n\n const {\n signTransaction,\n getAppConfig,\n buildContext,\n provideContext,\n inspectTransaction,\n } = this.extractDependencies(internalApi);\n\n return setup({\n types: {\n input: {} as types[\"input\"],\n context: {} as types[\"context\"],\n output: {} as types[\"output\"],\n },\n actors: {\n openAppStateMachine: new OpenAppDeviceAction({\n input: { appName: \"Solana\" },\n }).makeStateMachine(internalApi),\n\n getAppConfig: fromPromise(getAppConfig),\n inspectTransaction: fromPromise(\n ({\n input,\n }: {\n input: {\n serializedTransaction: Uint8Array;\n resolutionContext?: TransactionResolutionContext;\n RPCURL?: string;\n };\n }) =>\n inspectTransaction({\n serializedTransaction: input.serializedTransaction,\n resolutionContext: input.resolutionContext,\n RPCURL: input.RPCURL,\n }),\n ),\n buildContext: fromPromise(buildContext),\n provideContext: fromPromise(provideContext),\n signTransaction: fromPromise(signTransaction),\n },\n guards: {\n noInternalError: ({ context }) => context._internalState.error === null,\n skipOpenApp: ({ context }) =>\n context.input.transactionOptions?.skipOpenApp || false,\n isSPLSupported: ({ context }) =>\n new ApplicationChecker(\n internalApi.getDeviceSessionState(),\n context._internalState.appConfig!,\n )\n .withMinVersionExclusive(\"1.4.0\")\n .excludeDeviceModel(DeviceModelId.NANO_S)\n .check(),\n isAnSPLTransaction: ({ context }) =>\n context._internalState.inspectorResult?.transactionType ===\n SolanaTransactionTypes.SPL,\n shouldSkipInspection: ({ context }) =>\n context._internalState.error === null &&\n !!context.input.transactionOptions?.transactionResolutionContext,\n },\n actions: {\n assignErrorFromEvent: assign({\n _internalState: (_) => ({\n ..._.context._internalState,\n error: new UnknownDAError(\n _.event[\"error\"] instanceof Error\n ? _.event[\"error\"].message\n : String(_.event[\"error\"]),\n ),\n }),\n }),\n },\n }).createMachine({\n id: \"SignTransactionDeviceAction\",\n initial: \"InitialState\",\n context: ({ input }) => ({\n input,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n _internalState: {\n error: null,\n signature: null,\n appConfig: null,\n solanaTransactionContext: null,\n inspectorResult: null,\n },\n }),\n states: {\n InitialState: {\n always: [\n { target: \"GetAppConfig\", guard: \"skipOpenApp\" },\n { target: \"OpenAppDeviceAction\" },\n ],\n },\n OpenAppDeviceAction: {\n exit: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n invoke: {\n id: \"openAppStateMachine\",\n src: \"openAppStateMachine\",\n input: () => ({ appName: \"Solana\" }),\n onSnapshot: {\n actions: assign({\n intermediateValue: ({ event }) =>\n event.snapshot.context.intermediateValue,\n }),\n },\n onDone: {\n target: \"CheckOpenAppDeviceActionResult\",\n actions: assign({\n _internalState: ({ event, context }) =>\n event.output.caseOf({\n Right: () => context._internalState,\n Left: (error) => ({\n ...context._internalState,\n error,\n }),\n }),\n }),\n },\n },\n },\n CheckOpenAppDeviceActionResult: {\n always: [\n { target: \"GetAppConfig\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n GetAppConfig: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n invoke: {\n id: \"getAppConfig\",\n src: \"getAppConfig\",\n onDone: {\n target: \"GetAppConfigResultCheck\",\n actions: assign({\n _internalState: ({ event, context }) =>\n isSuccessCommandResult(event.output)\n ? {\n ...context._internalState,\n appConfig: event.output.data,\n }\n : { ...context._internalState, error: event.output.error },\n }),\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n GetAppConfigResultCheck: {\n always: [\n { target: \"InspectTransaction\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n InspectTransaction: {\n invoke: {\n id: \"inspectTransaction\",\n src: \"inspectTransaction\",\n\n input: ({ context }) => ({\n serializedTransaction: context.input.transaction,\n resolutionContext:\n context.input.transactionOptions?.transactionResolutionContext,\n RPCURL: context.input.transactionOptions?.solanaRPCURL,\n }),\n onDone: {\n target: \"AfterInspect\",\n actions: assign({\n _internalState: ({ context, event }) => ({\n ...context._internalState,\n inspectorResult: event.output,\n }),\n }),\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n AfterInspect: {\n always: [\n { target: \"BuildContext\", guard: \"isAnSPLTransaction\" },\n { target: \"SignTransaction\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n BuildContext: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n invoke: {\n id: \"buildContext\",\n src: \"buildContext\",\n input: ({ context }) => {\n const inspectorData =\n context._internalState.inspectorResult?.data;\n return {\n contextModule: context.input.contextModule,\n options: {\n tokenAddress: inspectorData?.tokenAddress,\n createATA: inspectorData?.createATA,\n },\n };\n },\n onDone: {\n target: \"ProvideContext\",\n actions: [\n assign({\n _internalState: ({ event, context }) => ({\n ...context._internalState,\n solanaTransactionContext: {\n descriptor: event.output.descriptor,\n certificate: event.output.calCertificate,\n tokenAccount: event.output.addressResult.tokenAccount,\n owner: event.output.addressResult.owner,\n contract: event.output.addressResult.contract,\n },\n }),\n }),\n ],\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n ProvideContext: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n invoke: {\n id: \"provideContext\",\n src: \"provideContext\",\n input: ({ context }) => {\n if (!context._internalState.solanaTransactionContext) {\n throw new UnknownDAError(\n \"Solana transaction context is not available\",\n );\n }\n return context._internalState.solanaTransactionContext;\n },\n onDone: {\n target: \"ProvideContextResultCheck\",\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n ProvideContextResultCheck: {\n always: [\n { target: \"SignTransaction\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n SignTransaction: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n },\n }),\n exit: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n }),\n invoke: {\n id: \"signTransaction\",\n src: \"signTransaction\",\n input: ({ context }) => {\n return {\n derivationPath: context.input.derivationPath,\n serializedTransaction: context.input.transaction,\n };\n },\n onDone: {\n target: \"SignTransactionResultCheck\",\n actions: [\n assign({\n _internalState: ({ event, context }) => {\n if (!isSuccessCommandResult(event.output))\n return {\n ...context._internalState,\n error: event.output.error,\n };\n\n const data = event.output.data.extract();\n if (\n event.output.data.isJust() &&\n data instanceof Uint8Array\n )\n return {\n ...context._internalState,\n signature: data,\n };\n\n return {\n ...context._internalState,\n error: new UnknownDAError(\"No Signature available\"),\n };\n },\n }),\n ],\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n SignTransactionResultCheck: {\n always: [\n { guard: \"noInternalError\", target: \"Success\" },\n { target: \"Error\" },\n ],\n },\n Success: { type: \"final\" },\n Error: { type: \"final\" },\n },\n output: ({ context }) =>\n context._internalState.signature\n ? Right(context._internalState.signature)\n : Left(\n context._internalState.error ||\n new UnknownDAError(`No error or signature available`),\n ),\n });\n }\n\n extractDependencies(internalApi: InternalApi): MachineDependencies {\n const getAppConfig = async () =>\n internalApi.sendCommand(new GetAppConfigurationCommand());\n\n const buildContext = async (arg0: {\n input: BuildTransactionContextTaskArgs;\n }) => new BuildTransactionContextTask(internalApi, arg0.input).run();\n\n const provideContext = async (arg0: { input: SolanaContextForDevice }) =>\n new ProvideSolanaTransactionContextTask(internalApi, arg0.input).run();\n\n const inspectTransaction = async (arg0: {\n serializedTransaction: Uint8Array;\n resolutionContext?: TransactionResolutionContext;\n RPCURL?: string;\n }) =>\n Promise.resolve(\n new TransactionInspector(\n arg0.serializedTransaction,\n arg0.resolutionContext?.tokenAddress,\n arg0.resolutionContext?.createATA,\n arg0.RPCURL,\n ).inspectTransactionType(),\n );\n\n const signTransaction = async (arg0: {\n input: {\n derivationPath: string;\n serializedTransaction: Uint8Array;\n };\n }) =>\n new SignDataTask(internalApi, {\n commandFactory: (args) =>\n new SignTransactionCommand({\n serializedTransaction: args.chunkedData,\n more: args.more,\n extend: args.extend,\n }),\n derivationPath: arg0.input.derivationPath,\n sendingData: arg0.input.serializedTransaction,\n }).run();\n\n return {\n getAppConfig,\n buildContext,\n provideContext,\n signTransaction,\n inspectTransaction,\n };\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["DeviceModelId", "isSuccessCommandResult", "OpenAppDeviceAction", "UnknownDAError", "UserInteractionRequired", "XStateDeviceAction", "Left", "Right", "assign", "fromPromise", "setup", "GetAppConfigurationCommand", "SignTransactionCommand", "ApplicationChecker", "SolanaTransactionTypes", "TransactionInspector", "BuildTransactionContextTask", "ProvideSolanaTransactionContextTask", "SignDataTask", "SignTransactionDeviceAction", "internalApi", "signTransaction", "getAppConfig", "buildContext", "provideContext", "inspectTransaction", "input", "context", "_", "event", "error", "inspectorData", "data", "arg0", "args"]
7
7
  }
@@ -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,transactionOptions:{skipOpenApp:!0},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,transactionOptions:{skipOpenApp:!0},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,transactionOptions:{skipOpenApp:!0},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 transactionOptions: { skipOpenApp: true },\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 transactionOptions: { skipOpenApp: true },\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 transactionOptions: { skipOpenApp: true },\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": "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",
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": "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",
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 I,TOKEN_2022_PROGRAM_ID as g,TOKEN_PROGRAM_ID as K}from"@solana/spl-token";import{Connection as b,Transaction as P,TransactionInstruction as k,VersionedMessage as x,VersionedTransaction as S}from"@solana/web3.js";import{Buffer as p}from"buffer";import{DECODERS as L}from"../../app-binder/services/utils/transactionDecoders";var h=(r=>(r.STANDARD="Standard",r.SPL="SPL",r))(h||{});const R="https://api.mainnet-beta.solana.com/",D=c=>new b(c,{commitment:"confirmed"}),m=c=>!!c&&(c.equals(I)||c.equals(K)||c.equals(g));class N{constructor(n,r,t,o){this.rawTransactionBytes=n;this.tokenAddress=r;this.createATA=t;this.injectedRPCURL=o}async inspectTransactionType(){try{const n=await this.normaliseMessage(this.rawTransactionBytes);if(this.tokenAddress||this.createATA)return{transactionType:n.compiledInstructions.some(a=>m(n.allKeys[a.programIdIndex]))?"SPL":"Standard",data:{...this.tokenAddress?{tokenAddress:this.tokenAddress}:{},...this.createATA?{createATA:this.createATA}:{}}};let r=!1,t={};for(const o of n.compiledInstructions){const a=n.allKeys[o.programIdIndex];if(!a)continue;m(a)&&(r=!0);const u=o.accountKeyIndexes.map(e=>n.allKeys[e]).filter(e=>!!e),d=new k({programId:a,keys:u.map(e=>({pubkey:e,isSigner:!1,isWritable:!1})),data:p.from(o.data)}),l={programId:a,ixMeta:o,message:n,instruction:d};for(const e of L){if(!e.when(l))continue;const s=e.decode(l);s&&(s.createATA&&!t.createATA?t={...t,createATA:s.createATA}:s.tokenAddress&&!t.tokenAddress&&!t.createATA&&(t={...t,tokenAddress:s.tokenAddress}))}}return t.createATA?{transactionType:"SPL",data:t}:t.tokenAddress?{transactionType:"SPL",data:t}:r?{transactionType:"SPL",data:{}}:{transactionType:"Standard",data:{}}}catch{return{transactionType:"Standard",data:{}}}}async normaliseMessage(n){const r=this.tryDeserialiseVersioned(n);if(r){const e=r.message,s=await this.resolveLookedUpAddressesFromMessage(e),A=[...e.staticAccountKeys,...s?.writable??[],...s?.readonly??[]];return{compiledInstructions:e.compiledInstructions.map(i=>{const f=i,T=Array.from(f.accounts??i.accountKeyIndexes??[]);let y;return i.data instanceof Uint8Array?y=i.data:typeof i.data=="string"?y=p.from(i.data,"base64"):y=Uint8Array.from(i.data??[]),{programIdIndex:i.programIdIndex,accountKeyIndexes:T,data:y}}),allKeys:A}}const t=P.from(n),o=new Map,a=e=>{if(!e)return;const s=e.toBase58();o.has(s)||o.set(s,e)};a(t.feePayer??null);for(const e of t.instructions){a(e.programId);for(const s of e.keys)a(s.pubkey)}const u=Array.from(o.values()),d=new Map(u.map((e,s)=>[e.toBase58(),s]));return{compiledInstructions:t.instructions.map(e=>({programIdIndex:d.get(e.programId.toBase58())??-1,accountKeyIndexes:e.keys.map(s=>d.get(s.pubkey.toBase58())??-1),data:e.data})),allKeys:u}}tryDeserialiseVersioned(n){try{return S.deserialize(n)}catch{try{return{message:x.deserialize(n)}}catch{return null}}}async resolveLookedUpAddressesFromMessage(n){const r=n.addressTableLookups??[];if(!r.length)return;const t=[],o=[];for(const a of r){const d=(await D(this.injectedRPCURL||R).getAddressLookupTable(a.accountKey)).value;if(!d)continue;const l=d.state.addresses;for(const e of a.writableIndexes??[]){const s=l[e];s&&t.push(s)}for(const e of a.readonlyIndexes??[]){const s=l[e];s&&o.push(s)}}return{writable:t,readonly:o}}}export{h as SolanaTransactionTypes,N 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 TOKEN_2022_PROGRAM_ID,\n TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport {\n Connection,\n type PublicKey,\n Transaction,\n TransactionInstruction,\n VersionedMessage,\n VersionedTransaction,\n} from \"@solana/web3.js\";\nimport { Buffer } from \"buffer\";\n\nimport {\n DECODERS,\n type IxContext,\n} from \"@internal/app-binder/services/utils/transactionDecoders\";\n\nexport enum SolanaTransactionTypes {\n STANDARD = \"Standard\",\n SPL = \"SPL\",\n}\n\nexport type NormalizedCompiledIx = {\n programIdIndex: number;\n accountKeyIndexes: number[];\n data: Uint8Array;\n};\n\nexport type NormalizedMessage = {\n compiledInstructions: NormalizedCompiledIx[];\n allKeys: PublicKey[];\n};\n\nexport interface TxInspectorResult {\n transactionType: SolanaTransactionTypes;\n data: {\n tokenAddress?: string;\n createATA?: { address: string; mintAddress: string };\n };\n}\n\ntype LoadedAddresses = { writable: PublicKey[]; readonly: PublicKey[] };\n\nconst RPC_URL = \"https://api.mainnet-beta.solana.com/\";\n\nconst defaultConnection = (RPCURL: string) =>\n new Connection(RPCURL, { commitment: \"confirmed\" });\n\nconst isSPLProgramId = (pid: PublicKey | undefined) =>\n !!pid &&\n (pid.equals(ASSOCIATED_TOKEN_PROGRAM_ID) ||\n pid.equals(TOKEN_PROGRAM_ID) ||\n pid.equals(TOKEN_2022_PROGRAM_ID));\n\nexport class TransactionInspector {\n constructor(\n private readonly rawTransactionBytes: Uint8Array,\n private readonly tokenAddress?: string | undefined,\n private readonly createATA?:\n | {\n address: string;\n mintAddress: string;\n }\n | undefined,\n private readonly injectedRPCURL?: string | undefined,\n ) {}\n\n public async inspectTransactionType(): Promise<TxInspectorResult> {\n try {\n const message = await this.normaliseMessage(this.rawTransactionBytes);\n\n // fast path when transaction resolution is provided\n if (this.tokenAddress || this.createATA) {\n const looksSPL = message.compiledInstructions.some((ix) =>\n isSPLProgramId(message.allKeys[ix.programIdIndex]),\n );\n return {\n transactionType: looksSPL\n ? SolanaTransactionTypes.SPL\n : SolanaTransactionTypes.STANDARD,\n data: {\n ...(this.tokenAddress ? { tokenAddress: this.tokenAddress } : {}),\n ...(this.createATA ? { createATA: this.createATA } : {}),\n },\n };\n }\n\n // accumulate best data across all instructions\n let sawSPL = false;\n let best: TxInspectorResult[\"data\"] = {};\n\n for (const ixMeta of message.compiledInstructions) {\n const programId = message.allKeys[ixMeta.programIdIndex];\n if (!programId) continue; // unresolved index, skip\n if (isSPLProgramId(programId)) sawSPL = true;\n\n const resolvedKeys = ixMeta.accountKeyIndexes\n .map((i) => message.allKeys[i])\n .filter((k): k is PublicKey => !!k);\n\n const instruction = new TransactionInstruction({\n programId,\n keys: resolvedKeys.map((pk) => ({\n pubkey: pk,\n isSigner: false,\n isWritable: false,\n })),\n data: Buffer.from(ixMeta.data),\n });\n\n const ctx: IxContext = { programId, ixMeta, message, instruction };\n\n for (const decoder of DECODERS) {\n if (!decoder.when(ctx)) continue;\n const data = decoder.decode(ctx);\n if (!data) continue;\n\n // prefer createATA (needed when destination ATA doesn\u2019t exist yet)\n if (data.createATA && !best.createATA) {\n best = { ...best, createATA: data.createATA };\n } else if (\n data.tokenAddress &&\n !best.tokenAddress &&\n !best.createATA\n ) {\n best = { ...best, tokenAddress: data.tokenAddress };\n }\n }\n }\n\n if (best.createATA)\n return { transactionType: SolanaTransactionTypes.SPL, data: best };\n\n if (best.tokenAddress)\n return { transactionType: SolanaTransactionTypes.SPL, data: best };\n\n if (sawSPL)\n return { transactionType: SolanaTransactionTypes.SPL, data: {} }; // we should nbever reach here, in case we do tx will fall back to blind sign\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 * For v0, auto-fetch looked-up addresses from ALT(s) via the connection.\n */\n private async normaliseMessage(\n rawBytes: Uint8Array,\n ): Promise<NormalizedMessage> {\n const versionedTX = this.tryDeserialiseVersioned(rawBytes);\n\n if (versionedTX) {\n const msg = versionedTX.message as VersionedMessage & {\n getAccountKeys?: (options?: {\n accountKeysFromLookups?: LoadedAddresses;\n }) => {\n staticAccountKeys: PublicKey[];\n accountKeysFromLookups?: LoadedAddresses;\n keySegments: () => PublicKey[][];\n };\n compiledInstructions: Array<{\n programIdIndex: number;\n accountKeyIndexes?: number[]; // legacy field name\n accounts?: number[]; // v0 field name\n data: Uint8Array | string | number[];\n }>;\n staticAccountKeys: PublicKey[];\n };\n\n const lookedUp = await this.resolveLookedUpAddressesFromMessage(msg);\n\n const allKeys: PublicKey[] = [\n ...msg.staticAccountKeys,\n ...(lookedUp?.writable ?? []),\n ...(lookedUp?.readonly ?? []),\n ];\n\n const compiledInstructions: NormalizedCompiledIx[] =\n msg.compiledInstructions.map((ix) => {\n const ixWithAccounts = ix as typeof ix & { accounts?: number[] };\n\n const accountKeyIndexes = Array.from(\n ixWithAccounts.accounts ?? ix.accountKeyIndexes ?? [],\n ) as number[];\n\n let data: Uint8Array;\n if (ix.data instanceof Uint8Array) {\n data = ix.data;\n } else if (typeof ix.data === \"string\") {\n data = Buffer.from(ix.data, \"base64\"); // v0 encodes instruction data as base64\n } else {\n data = Uint8Array.from(ix.data ?? []);\n }\n\n return {\n programIdIndex: ix.programIdIndex,\n accountKeyIndexes,\n data,\n };\n });\n\n return { compiledInstructions, allKeys };\n }\n\n // legacy (no ALTs)\n const legacy = Transaction.from(rawBytes);\n\n const allKeyMap = new Map<string, PublicKey>();\n\n const add = (pubkey?: PublicKey | null) => {\n if (!pubkey) return;\n const key = pubkey.toBase58();\n if (!allKeyMap.has(key)) allKeyMap.set(key, pubkey);\n };\n\n add(legacy.feePayer ?? null);\n\n for (const ix of legacy.instructions) {\n add(ix.programId);\n for (const key of ix.keys) add(key.pubkey);\n }\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 (key) => indexByB58.get(key.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 return { message: msg } as VersionedTransaction;\n } catch {\n return null;\n }\n }\n }\n\n /**\n * For v0, fetch looked-up addresses from ALT(s) via the connection\n */\n private async resolveLookedUpAddressesFromMessage(\n msg: VersionedMessage,\n ): Promise<LoadedAddresses | undefined> {\n const lookups = msg.addressTableLookups ?? [];\n if (!lookups.length) return;\n\n const writable: PublicKey[] = [];\n const readonly: PublicKey[] = [];\n\n for (const lu of lookups) {\n const res = await defaultConnection(\n this.injectedRPCURL || RPC_URL,\n ).getAddressLookupTable(lu.accountKey);\n const table = res.value;\n if (!table) continue;\n const addrs = table.state.addresses;\n\n for (const i of lu.writableIndexes ?? []) {\n const pk = addrs[i];\n if (pk) writable.push(pk);\n }\n for (const i of lu.readonlyIndexes ?? []) {\n const pk = addrs[i];\n if (pk) readonly.push(pk);\n }\n }\n\n return { writable, readonly };\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["ASSOCIATED_TOKEN_PROGRAM_ID", "TOKEN_2022_PROGRAM_ID", "TOKEN_PROGRAM_ID", "Connection", "Transaction", "TransactionInstruction", "VersionedMessage", "VersionedTransaction", "Buffer", "DECODERS", "SolanaTransactionTypes", "RPC_URL", "defaultConnection", "RPCURL", "isSPLProgramId", "pid", "TransactionInspector", "rawTransactionBytes", "tokenAddress", "createATA", "injectedRPCURL", "message", "ix", "sawSPL", "best", "ixMeta", "programId", "resolvedKeys", "i", "k", "instruction", "pk", "ctx", "decoder", "data", "rawBytes", "versionedTX", "msg", "lookedUp", "allKeys", "ixWithAccounts", "accountKeyIndexes", "legacy", "allKeyMap", "add", "pubkey", "key", "indexByB58", "lookups", "writable", "readonly", "lu", "table", "addrs"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{ASSOCIATED_TOKEN_PROGRAM_ID as A,createAssociatedTokenAccountInstruction as w,createCloseAccountInstruction as m,createInitializeAccount2Instruction as S,createInitializeAccount3Instruction as P,createInitializeAccountInstruction as f,createSyncNativeInstruction as k,createTransferCheckedInstruction as I,createTransferInstruction as g,getAssociatedTokenAddressSync as b,TOKEN_2022_PROGRAM_ID as B,TOKEN_PROGRAM_ID as l}from"@solana/spl-token";import{Keypair as t,SystemProgram as L,Transaction as x,TransactionInstruction as h}from"@solana/web3.js";import E from"bs58";import{describe as v,expect as r,it as u}from"vitest";import{SolanaTransactionTypes as d,TransactionInspector as p}from"./TransactionInspector";const D=E.encode(new Uint8Array(32).fill(170));function y(e,n,a){const s=a??n[0]??t.generate(),c=new x;c.recentBlockhash=D,c.feePayer=s.publicKey,c.add(...e);const o=new Set,i=[s,...n].filter(T=>{const K=T.publicKey.toBase58();return o.has(K)?!1:(o.add(K),!0)});return c.sign(...i),{raw:c.serialize(),payer:s}}v("TransactionInspector",()=>{u("falls back to STANDARD for a plain SystemProgram transfer",async()=>{const e=t.generate(),n=t.generate().publicKey,a=L.transfer({fromPubkey:e.publicKey,toPubkey:n,lamports:1e3}),{raw:s}=y([a],[e],e),c=await new p(s).inspectTransactionType();r(c.transactionType).toBe(d.STANDARD),r(c.data).toEqual({})}),u("detects an SPL Transfer and returns the destination address",async()=>{const e=t.generate(),n=t.generate().publicKey,a=t.generate().publicKey,s=g(n,a,e.publicKey,42n,[],l),{raw:c}=y([s],[e],e),o=await new p(c).inspectTransactionType();r(o.transactionType).toBe(d.SPL),r(o.data.tokenAddress).toBe(a.toBase58())}),u("detects an SPL TransferChecked and returns the destination address",async()=>{const e=t.generate(),n=t.generate().publicKey,a=t.generate().publicKey,s=t.generate().publicKey,c=I(a,n,s,e.publicKey,123n,0,[],l),{raw:o}=y([c],[e],e),i=await new p(o).inspectTransactionType();r(i.transactionType).toBe(d.SPL),r(i.data.tokenAddress).toBe(s.toBase58())}),u("detects InitializeAccount and returns the new account and mint",async()=>{const e=t.generate(),n=t.generate().publicKey,a=t.generate().publicKey,s=t.generate().publicKey,c=f(a,n,s,l),{raw:o}=y([c],[e],e),i=await new p(o).inspectTransactionType();r(i.transactionType).toBe(d.SPL),r(i.data.createATA).toEqual({address:a.toBase58(),mintAddress:n.toBase58()})}),u("detects InitializeAccount2 and returns the new account and mint",async()=>{const e=t.generate(),n=t.generate().publicKey,a=t.generate().publicKey,s=t.generate().publicKey,c=S(a,n,s,l),{raw:o}=y([c],[e],e),i=await new p(o).inspectTransactionType();r(i.transactionType).toBe(d.SPL),r(i.data.createATA).toEqual({address:a.toBase58(),mintAddress:n.toBase58()})}),u("detects InitializeAccount3 and returns the new account and mint",async()=>{const e=t.generate(),n=t.generate().publicKey,a=t.generate().publicKey,s=P(a,n,l),{raw:c}=y([s],[e],e),o=await new p(c).inspectTransactionType();r(o.transactionType).toBe(d.SPL),r(o.data.createATA).toEqual({address:a.toBase58(),mintAddress:n.toBase58()})}),u("detects ATA creation via Associated Token Program (classic TOKEN program)",async()=>{const e=t.generate(),n=t.generate().publicKey,a=t.generate().publicKey,s=b(a,n,!0,l,A),c=w(e.publicKey,s,n,a,l,A),{raw:o}=y([c],[e],e),i=await new p(o).inspectTransactionType();r(i.transactionType).toBe(d.SPL),r(i.data.createATA).toEqual({address:n.toBase58(),mintAddress:a.toBase58()})}),u("detects ATA creation via Associated Token Program (TOKEN-2022 program)",async()=>{const e=t.generate(),n=t.generate().publicKey,a=t.generate().publicKey,s=b(a,n,!0,B,A),c=w(e.publicKey,s,n,a,B,A),{raw:o}=y([c],[e],e),i=await new p(o).inspectTransactionType();r(i.transactionType).toBe(d.SPL),r(i.data.createATA).toEqual({address:n.toBase58(),mintAddress:a.toBase58()})}),u("detects CloseAccount and returns the closed token account",async()=>{const e=t.generate(),n=t.generate().publicKey,a=t.generate().publicKey,s=m(n,a,e.publicKey),{raw:c}=y([s],[e],e),o=await new p(c).inspectTransactionType();r(o.transactionType).toBe(d.SPL),r(o.data.tokenAddress).toBe(n.toBase58())}),u("detects SyncNative and returns the WSOL account",async()=>{const e=t.generate(),n=t.generate().publicKey,a=k(n,l),{raw:s}=y([a],[e],e),c=await new p(s).inspectTransactionType();r(c.transactionType).toBe(d.SPL),r(c.data.tokenAddress).toBe(n.toBase58())}),u("marks transaction as SPL even if decoders can't parse (last-resort SPL by program id)",async()=>{const e=t.generate(),n=new h({programId:l,keys:[],data:Buffer.from([])}),{raw:a}=y([n],[e],e),s=await new p(a).inspectTransactionType();r(s.transactionType).toBe(d.SPL),r(s.data).toEqual({})}),u("falls back to STANDARD if the payload is unparseable",async()=>{const e=new Uint8Array([171,173,190,239]),n=await new p(e).inspectTransactionType();r(n.transactionType).toBe(d.STANDARD),r(n.data).toEqual({})}),u("fast path: tokenAddress override + SPL instruction, SPL and returns override",async()=>{const e=t.generate(),n=t.generate().publicKey,a=t.generate().publicKey,s=g(n,a,e.publicKey,1n,[],l),{raw:c}=y([s],[e],e),o=t.generate().publicKey.toBase58(),i=await new p(c,o).inspectTransactionType();r(i.transactionType).toBe(d.SPL),r(i.data.tokenAddress).toBe(o)}),u("fast path: createATA override + ATA instruction, SPL and returns override",async()=>{const e=t.generate(),n=t.generate().publicKey,a=t.generate().publicKey,s=b(a,n,!0,l,A),c=w(e.publicKey,s,n,a,l,A),{raw:o}=y([c],[e],e),i={address:t.generate().publicKey.toBase58(),mintAddress:t.generate().publicKey.toBase58()},T=await new p(o,void 0,i).inspectTransactionType();r(T.transactionType).toBe(d.SPL),r(T.data.createATA).toEqual(i)}),u("fast path: both overrides + SPL instruction, SPL and returns both",async()=>{const e=t.generate(),n=t.generate().publicKey,a=t.generate().publicKey,s=g(n,a,e.publicKey,7n,[],l),{raw:c}=y([s],[e],e),o=t.generate().publicKey.toBase58(),i={address:t.generate().publicKey.toBase58(),mintAddress:t.generate().publicKey.toBase58()},T=await new p(c,o,i).inspectTransactionType();r(T.transactionType).toBe(d.SPL),r(T.data.tokenAddress).toBe(o),r(T.data.createATA).toEqual(i)})});
2
+ //# sourceMappingURL=TransactionInspector.test.js.map