@ledgerhq/device-signer-kit-solana 0.0.0-signer-eth-plugin-fix-20250331141239 → 0.0.0-sol-signer-20251203164116

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 (377) hide show
  1. package/README.md +116 -23
  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/SignMessageDeviceActionTypes.js.map +1 -1
  13. package/lib/cjs/api/app-binder/SignTransactionDeviceActionTypes.js +1 -1
  14. package/lib/cjs/api/app-binder/SignTransactionDeviceActionTypes.js.map +3 -3
  15. package/lib/cjs/api/index.js +1 -1
  16. package/lib/cjs/api/index.js.map +3 -3
  17. package/lib/cjs/api/model/AddressOption.js +1 -1
  18. package/lib/cjs/api/model/AddressOption.js.map +1 -1
  19. package/lib/cjs/api/model/MessageOptions.js +2 -0
  20. package/lib/cjs/api/model/MessageOptions.js.map +7 -0
  21. package/lib/cjs/api/model/SolanaTransactionOptionalConfig.js +2 -0
  22. package/lib/cjs/api/model/SolanaTransactionOptionalConfig.js.map +7 -0
  23. package/lib/cjs/api/model/TransactionResolutionContext.js +2 -0
  24. package/lib/cjs/api/model/TransactionResolutionContext.js.map +7 -0
  25. package/lib/cjs/internal/DefaultSignerSolana.js +1 -1
  26. package/lib/cjs/internal/DefaultSignerSolana.js.map +3 -3
  27. package/lib/cjs/internal/DefaultSignerSolana.test.js +1 -1
  28. package/lib/cjs/internal/DefaultSignerSolana.test.js.map +3 -3
  29. package/lib/cjs/internal/DefaultSolanaTools.js +2 -0
  30. package/lib/cjs/internal/DefaultSolanaTools.js.map +7 -0
  31. package/lib/cjs/internal/DefaultSolanaTools.test.js +2 -0
  32. package/lib/cjs/internal/DefaultSolanaTools.test.js.map +7 -0
  33. package/lib/cjs/internal/app-binder/SolanaAppBinder.js +1 -1
  34. package/lib/cjs/internal/app-binder/SolanaAppBinder.js.map +3 -3
  35. package/lib/cjs/internal/app-binder/SolanaAppBinder.test.js +1 -1
  36. package/lib/cjs/internal/app-binder/SolanaAppBinder.test.js.map +3 -3
  37. package/lib/cjs/internal/app-binder/command/GetAppConfigurationCommand.js +1 -1
  38. package/lib/cjs/internal/app-binder/command/GetAppConfigurationCommand.js.map +2 -2
  39. package/lib/cjs/internal/app-binder/command/GetAppConfigurationCommand.test.js +1 -1
  40. package/lib/cjs/internal/app-binder/command/GetAppConfigurationCommand.test.js.map +2 -2
  41. package/lib/cjs/internal/app-binder/command/GetChallengeCommand.js +2 -0
  42. package/lib/cjs/internal/app-binder/command/GetChallengeCommand.js.map +7 -0
  43. package/lib/cjs/internal/app-binder/command/GetChallengeCommand.test.js +2 -0
  44. package/lib/cjs/internal/app-binder/command/GetChallengeCommand.test.js.map +7 -0
  45. package/lib/cjs/internal/app-binder/command/GetPubKeyCommand.js +1 -1
  46. package/lib/cjs/internal/app-binder/command/GetPubKeyCommand.js.map +3 -3
  47. package/lib/cjs/internal/app-binder/command/GetPubKeyCommand.test.js +1 -1
  48. package/lib/cjs/internal/app-binder/command/GetPubKeyCommand.test.js.map +2 -2
  49. package/lib/cjs/internal/app-binder/command/ProvideTLVDescriptorCommand.js +2 -0
  50. package/lib/cjs/internal/app-binder/command/ProvideTLVDescriptorCommand.js.map +7 -0
  51. package/lib/cjs/internal/app-binder/command/ProvideTLVDescriptorCommand.test.js +2 -0
  52. package/lib/cjs/internal/app-binder/command/ProvideTLVDescriptorCommand.test.js.map +7 -0
  53. package/lib/cjs/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.js +2 -0
  54. package/lib/cjs/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.js.map +7 -0
  55. package/lib/cjs/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.test.js +2 -0
  56. package/lib/cjs/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.test.js.map +7 -0
  57. package/lib/cjs/internal/app-binder/command/SignOffChainMessageCommand.js +1 -1
  58. package/lib/cjs/internal/app-binder/command/SignOffChainMessageCommand.js.map +3 -3
  59. package/lib/cjs/internal/app-binder/command/SignOffChainMessageCommand.test.js +1 -1
  60. package/lib/cjs/internal/app-binder/command/SignOffChainMessageCommand.test.js.map +3 -3
  61. package/lib/cjs/internal/app-binder/command/SignTransactionCommand.js +1 -1
  62. package/lib/cjs/internal/app-binder/command/SignTransactionCommand.js.map +3 -3
  63. package/lib/cjs/internal/app-binder/command/SignTransactionCommand.test.js +1 -1
  64. package/lib/cjs/internal/app-binder/command/SignTransactionCommand.test.js.map +3 -3
  65. package/lib/cjs/internal/app-binder/device-action/GenerateTransactionDeviceAction.js +2 -0
  66. package/lib/cjs/internal/app-binder/device-action/GenerateTransactionDeviceAction.js.map +7 -0
  67. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.js +1 -1
  68. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.js.map +3 -3
  69. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.test.js +1 -1
  70. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.test.js.map +3 -3
  71. package/lib/cjs/internal/app-binder/device-action/__test-utils__/makeInternalApi.js +1 -1
  72. package/lib/cjs/internal/app-binder/device-action/__test-utils__/makeInternalApi.js.map +3 -3
  73. package/lib/cjs/internal/app-binder/di/appBinderModule.js +1 -1
  74. package/lib/cjs/internal/app-binder/di/appBinderModule.js.map +3 -3
  75. package/lib/cjs/internal/app-binder/di/appBinderModule.test.js +1 -1
  76. package/lib/cjs/internal/app-binder/di/appBinderModule.test.js.map +2 -2
  77. package/lib/cjs/internal/app-binder/services/ApplicationChecker.js +2 -0
  78. package/lib/cjs/internal/app-binder/services/ApplicationChecker.js.map +7 -0
  79. package/lib/cjs/internal/app-binder/services/ApplicationChecker.test.js +2 -0
  80. package/lib/cjs/internal/app-binder/services/ApplicationChecker.test.js.map +7 -0
  81. package/lib/cjs/internal/app-binder/services/GenerateSolanaTransaction.js +2 -0
  82. package/lib/cjs/internal/app-binder/services/GenerateSolanaTransaction.js.map +7 -0
  83. package/lib/cjs/internal/app-binder/services/GenerateSolanaTransaction.test.js +2 -0
  84. package/lib/cjs/internal/app-binder/services/GenerateSolanaTransaction.test.js.map +7 -0
  85. package/lib/cjs/internal/app-binder/services/TransactionInspector.js +2 -0
  86. package/lib/cjs/internal/app-binder/services/TransactionInspector.js.map +7 -0
  87. package/lib/cjs/internal/app-binder/services/TransactionInspector.test.js +2 -0
  88. package/lib/cjs/internal/app-binder/services/TransactionInspector.test.js.map +7 -0
  89. package/lib/cjs/internal/app-binder/services/bs58Encoder.js +2 -0
  90. package/lib/cjs/internal/app-binder/services/bs58Encoder.js.map +7 -0
  91. package/lib/cjs/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.js +2 -0
  92. package/lib/cjs/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.js.map +7 -0
  93. package/lib/cjs/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.test.js +2 -0
  94. package/lib/cjs/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.test.js.map +7 -0
  95. package/lib/cjs/internal/app-binder/services/utils/transactionDecoders.js +2 -0
  96. package/lib/cjs/internal/app-binder/services/utils/transactionDecoders.js.map +7 -0
  97. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.js +2 -0
  98. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.js.map +7 -0
  99. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.test.js +2 -0
  100. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.test.js.map +7 -0
  101. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.js +2 -0
  102. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.js.map +7 -0
  103. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.test.js +2 -0
  104. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.test.js.map +7 -0
  105. package/lib/cjs/internal/app-binder/task/SendSignMessageTask.js +1 -1
  106. package/lib/cjs/internal/app-binder/task/SendSignMessageTask.js.map +3 -3
  107. package/lib/cjs/internal/app-binder/task/SendSignMessageTask.test.js +3 -1
  108. package/lib/cjs/internal/app-binder/task/SendSignMessageTask.test.js.map +3 -3
  109. package/lib/cjs/internal/di.js +1 -1
  110. package/lib/cjs/internal/di.js.map +3 -3
  111. package/lib/cjs/internal/externalTypes.js +1 -1
  112. package/lib/cjs/internal/externalTypes.js.map +2 -2
  113. package/lib/cjs/internal/use-cases/address/GetAddressUseCase.js +1 -1
  114. package/lib/cjs/internal/use-cases/address/GetAddressUseCase.js.map +2 -2
  115. package/lib/cjs/internal/use-cases/address/GetAddressUseCase.test.js +1 -1
  116. package/lib/cjs/internal/use-cases/address/GetAddressUseCase.test.js.map +2 -2
  117. package/lib/cjs/internal/use-cases/di/useCasesModule.js +1 -1
  118. package/lib/cjs/internal/use-cases/di/useCasesModule.js.map +3 -3
  119. package/lib/cjs/internal/use-cases/di/useCasesModule.test.js +1 -1
  120. package/lib/cjs/internal/use-cases/di/useCasesModule.test.js.map +2 -2
  121. package/lib/cjs/internal/use-cases/di/useCasesTypes.js +1 -1
  122. package/lib/cjs/internal/use-cases/di/useCasesTypes.js.map +2 -2
  123. package/lib/cjs/internal/use-cases/generateTransaction/GenerateTransactionUseCase.js +2 -0
  124. package/lib/cjs/internal/use-cases/generateTransaction/GenerateTransactionUseCase.js.map +7 -0
  125. package/lib/cjs/internal/use-cases/generateTransaction/GenerateTransactionUseCase.test.js +2 -0
  126. package/lib/cjs/internal/use-cases/generateTransaction/GenerateTransactionUseCase.test.js.map +7 -0
  127. package/lib/cjs/internal/use-cases/message/SignMessageUseCase.js +1 -1
  128. package/lib/cjs/internal/use-cases/message/SignMessageUseCase.js.map +3 -3
  129. package/lib/cjs/internal/use-cases/message/SignMessageUseCase.test.js +1 -1
  130. package/lib/cjs/internal/use-cases/message/SignMessageUseCase.test.js.map +2 -2
  131. package/lib/cjs/internal/use-cases/transaction/SignTransactionUseCase.js +1 -1
  132. package/lib/cjs/internal/use-cases/transaction/SignTransactionUseCase.js.map +3 -3
  133. package/lib/cjs/internal/use-cases/transaction/SignTransactionUseCase.test.js +1 -1
  134. package/lib/cjs/internal/use-cases/transaction/SignTransactionUseCase.test.js.map +3 -3
  135. package/lib/cjs/package.json +45 -36
  136. package/lib/esm/api/SignerSolanaBuilder.js +1 -1
  137. package/lib/esm/api/SignerSolanaBuilder.js.map +3 -3
  138. package/lib/esm/api/SolanaTools.js +1 -0
  139. package/lib/esm/api/SolanaToolsBuilder.js +2 -0
  140. package/lib/esm/api/SolanaToolsBuilder.js.map +7 -0
  141. package/lib/esm/api/app-binder/GenerateTransactionDeviceActionTypes.js +1 -0
  142. package/lib/esm/api/app-binder/GenerateTransactionDeviceActionTypes.js.map +7 -0
  143. package/lib/esm/api/app-binder/SignTransactionDeviceActionTypes.js +1 -0
  144. package/lib/esm/api/app-binder/SignTransactionDeviceActionTypes.js.map +4 -4
  145. package/lib/esm/api/index.js +1 -1
  146. package/lib/esm/api/index.js.map +3 -3
  147. package/lib/esm/api/model/MessageOptions.js +1 -0
  148. package/lib/esm/api/model/MessageOptions.js.map +7 -0
  149. package/lib/esm/api/model/SolanaTransactionOptionalConfig.js +1 -0
  150. package/lib/esm/api/model/SolanaTransactionOptionalConfig.js.map +7 -0
  151. package/lib/esm/api/model/TransactionResolutionContext.js +2 -0
  152. package/lib/esm/api/model/TransactionResolutionContext.js.map +7 -0
  153. package/lib/esm/internal/DefaultSignerSolana.js +1 -1
  154. package/lib/esm/internal/DefaultSignerSolana.js.map +3 -3
  155. package/lib/esm/internal/DefaultSignerSolana.test.js +1 -1
  156. package/lib/esm/internal/DefaultSignerSolana.test.js.map +3 -3
  157. package/lib/esm/internal/DefaultSolanaTools.js +2 -0
  158. package/lib/esm/internal/DefaultSolanaTools.js.map +7 -0
  159. package/lib/esm/internal/DefaultSolanaTools.test.js +2 -0
  160. package/lib/esm/internal/DefaultSolanaTools.test.js.map +7 -0
  161. package/lib/esm/internal/app-binder/SolanaAppBinder.js +1 -1
  162. package/lib/esm/internal/app-binder/SolanaAppBinder.js.map +3 -3
  163. package/lib/esm/internal/app-binder/SolanaAppBinder.test.js +1 -1
  164. package/lib/esm/internal/app-binder/SolanaAppBinder.test.js.map +3 -3
  165. package/lib/esm/internal/app-binder/command/GetAppConfigurationCommand.js +1 -1
  166. package/lib/esm/internal/app-binder/command/GetAppConfigurationCommand.js.map +2 -2
  167. package/lib/esm/internal/app-binder/command/GetAppConfigurationCommand.test.js +1 -1
  168. package/lib/esm/internal/app-binder/command/GetAppConfigurationCommand.test.js.map +2 -2
  169. package/lib/esm/internal/app-binder/command/GetChallengeCommand.js +2 -0
  170. package/lib/esm/internal/app-binder/command/GetChallengeCommand.js.map +7 -0
  171. package/lib/esm/internal/app-binder/command/GetChallengeCommand.test.js +2 -0
  172. package/lib/esm/internal/app-binder/command/GetChallengeCommand.test.js.map +7 -0
  173. package/lib/esm/internal/app-binder/command/GetPubKeyCommand.js +1 -1
  174. package/lib/esm/internal/app-binder/command/GetPubKeyCommand.js.map +3 -3
  175. package/lib/esm/internal/app-binder/command/GetPubKeyCommand.test.js +1 -1
  176. package/lib/esm/internal/app-binder/command/GetPubKeyCommand.test.js.map +2 -2
  177. package/lib/esm/internal/app-binder/command/ProvideTLVDescriptorCommand.js +2 -0
  178. package/lib/esm/internal/app-binder/command/ProvideTLVDescriptorCommand.js.map +7 -0
  179. package/lib/esm/internal/app-binder/command/ProvideTLVDescriptorCommand.test.js +2 -0
  180. package/lib/esm/internal/app-binder/command/ProvideTLVDescriptorCommand.test.js.map +7 -0
  181. package/lib/esm/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.js +2 -0
  182. package/lib/esm/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.js.map +7 -0
  183. package/lib/esm/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.test.js +2 -0
  184. package/lib/esm/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.test.js.map +7 -0
  185. package/lib/esm/internal/app-binder/command/SignOffChainMessageCommand.js +1 -1
  186. package/lib/esm/internal/app-binder/command/SignOffChainMessageCommand.js.map +3 -3
  187. package/lib/esm/internal/app-binder/command/SignOffChainMessageCommand.test.js +1 -1
  188. package/lib/esm/internal/app-binder/command/SignOffChainMessageCommand.test.js.map +3 -3
  189. package/lib/esm/internal/app-binder/command/SignTransactionCommand.js +1 -1
  190. package/lib/esm/internal/app-binder/command/SignTransactionCommand.js.map +3 -3
  191. package/lib/esm/internal/app-binder/command/SignTransactionCommand.test.js +1 -1
  192. package/lib/esm/internal/app-binder/command/SignTransactionCommand.test.js.map +3 -3
  193. package/lib/esm/internal/app-binder/device-action/GenerateTransactionDeviceAction.js +2 -0
  194. package/lib/esm/internal/app-binder/device-action/GenerateTransactionDeviceAction.js.map +7 -0
  195. package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.js +1 -1
  196. package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.js.map +3 -3
  197. package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.test.js +1 -1
  198. package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.test.js.map +3 -3
  199. package/lib/esm/internal/app-binder/device-action/__test-utils__/makeInternalApi.js +1 -1
  200. package/lib/esm/internal/app-binder/device-action/__test-utils__/makeInternalApi.js.map +3 -3
  201. package/lib/esm/internal/app-binder/di/appBinderModule.js +1 -1
  202. package/lib/esm/internal/app-binder/di/appBinderModule.js.map +3 -3
  203. package/lib/esm/internal/app-binder/di/appBinderModule.test.js +1 -1
  204. package/lib/esm/internal/app-binder/di/appBinderModule.test.js.map +2 -2
  205. package/lib/esm/internal/app-binder/services/ApplicationChecker.js +2 -0
  206. package/lib/esm/internal/app-binder/services/ApplicationChecker.js.map +7 -0
  207. package/lib/esm/internal/app-binder/services/ApplicationChecker.test.js +2 -0
  208. package/lib/esm/internal/app-binder/services/ApplicationChecker.test.js.map +7 -0
  209. package/lib/esm/internal/app-binder/services/GenerateSolanaTransaction.js +2 -0
  210. package/lib/esm/internal/app-binder/services/GenerateSolanaTransaction.js.map +7 -0
  211. package/lib/esm/internal/app-binder/services/GenerateSolanaTransaction.test.js +2 -0
  212. package/lib/esm/internal/app-binder/services/GenerateSolanaTransaction.test.js.map +7 -0
  213. package/lib/esm/internal/app-binder/services/TransactionInspector.js +2 -0
  214. package/lib/esm/internal/app-binder/services/TransactionInspector.js.map +7 -0
  215. package/lib/esm/internal/app-binder/services/TransactionInspector.test.js +2 -0
  216. package/lib/esm/internal/app-binder/services/TransactionInspector.test.js.map +7 -0
  217. package/lib/esm/internal/app-binder/services/bs58Encoder.js +2 -0
  218. package/lib/esm/internal/app-binder/services/bs58Encoder.js.map +7 -0
  219. package/lib/esm/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.js +2 -0
  220. package/lib/esm/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.js.map +7 -0
  221. package/lib/esm/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.test.js +2 -0
  222. package/lib/esm/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.test.js.map +7 -0
  223. package/lib/esm/internal/app-binder/services/utils/transactionDecoders.js +2 -0
  224. package/lib/esm/internal/app-binder/services/utils/transactionDecoders.js.map +7 -0
  225. package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.js +2 -0
  226. package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.js.map +7 -0
  227. package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.test.js +2 -0
  228. package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.test.js.map +7 -0
  229. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.js +2 -0
  230. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.js.map +7 -0
  231. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.test.js +2 -0
  232. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.test.js.map +7 -0
  233. package/lib/esm/internal/app-binder/task/SendSignMessageTask.js +1 -1
  234. package/lib/esm/internal/app-binder/task/SendSignMessageTask.js.map +3 -3
  235. package/lib/esm/internal/app-binder/task/SendSignMessageTask.test.js +3 -1
  236. package/lib/esm/internal/app-binder/task/SendSignMessageTask.test.js.map +3 -3
  237. package/lib/esm/internal/di.js +1 -1
  238. package/lib/esm/internal/di.js.map +3 -3
  239. package/lib/esm/internal/externalTypes.js +1 -1
  240. package/lib/esm/internal/externalTypes.js.map +2 -2
  241. package/lib/esm/internal/use-cases/address/GetAddressUseCase.js +1 -1
  242. package/lib/esm/internal/use-cases/address/GetAddressUseCase.js.map +2 -2
  243. package/lib/esm/internal/use-cases/address/GetAddressUseCase.test.js +1 -1
  244. package/lib/esm/internal/use-cases/address/GetAddressUseCase.test.js.map +2 -2
  245. package/lib/esm/internal/use-cases/di/useCasesModule.js +1 -1
  246. package/lib/esm/internal/use-cases/di/useCasesModule.js.map +3 -3
  247. package/lib/esm/internal/use-cases/di/useCasesModule.test.js +1 -1
  248. package/lib/esm/internal/use-cases/di/useCasesModule.test.js.map +2 -2
  249. package/lib/esm/internal/use-cases/di/useCasesTypes.js +1 -1
  250. package/lib/esm/internal/use-cases/di/useCasesTypes.js.map +2 -2
  251. package/lib/esm/internal/use-cases/generateTransaction/GenerateTransactionUseCase.js +2 -0
  252. package/lib/esm/internal/use-cases/generateTransaction/GenerateTransactionUseCase.js.map +7 -0
  253. package/lib/esm/internal/use-cases/generateTransaction/GenerateTransactionUseCase.test.js +2 -0
  254. package/lib/esm/internal/use-cases/generateTransaction/GenerateTransactionUseCase.test.js.map +7 -0
  255. package/lib/esm/internal/use-cases/message/SignMessageUseCase.js +1 -1
  256. package/lib/esm/internal/use-cases/message/SignMessageUseCase.js.map +3 -3
  257. package/lib/esm/internal/use-cases/message/SignMessageUseCase.test.js +1 -1
  258. package/lib/esm/internal/use-cases/message/SignMessageUseCase.test.js.map +2 -2
  259. package/lib/esm/internal/use-cases/transaction/SignTransactionUseCase.js +1 -1
  260. package/lib/esm/internal/use-cases/transaction/SignTransactionUseCase.js.map +3 -3
  261. package/lib/esm/internal/use-cases/transaction/SignTransactionUseCase.test.js +1 -1
  262. package/lib/esm/internal/use-cases/transaction/SignTransactionUseCase.test.js.map +3 -3
  263. package/lib/esm/package.json +45 -36
  264. package/lib/types/api/SignerSolana.d.ts +4 -3
  265. package/lib/types/api/SignerSolana.d.ts.map +1 -1
  266. package/lib/types/api/SignerSolanaBuilder.d.ts +12 -1
  267. package/lib/types/api/SignerSolanaBuilder.d.ts.map +1 -1
  268. package/lib/types/api/SolanaTools.d.ts +10 -0
  269. package/lib/types/api/SolanaTools.d.ts.map +1 -0
  270. package/lib/types/api/SolanaToolsBuilder.d.ts +39 -0
  271. package/lib/types/api/SolanaToolsBuilder.d.ts.map +1 -0
  272. package/lib/types/api/app-binder/GenerateTransactionDeviceActionTypes.d.ts +24 -0
  273. package/lib/types/api/app-binder/GenerateTransactionDeviceActionTypes.d.ts.map +1 -0
  274. package/lib/types/api/app-binder/SignMessageDeviceActionTypes.d.ts +3 -2
  275. package/lib/types/api/app-binder/SignMessageDeviceActionTypes.d.ts.map +1 -1
  276. package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts +21 -3
  277. package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts.map +1 -1
  278. package/lib/types/api/index.d.ts +4 -1
  279. package/lib/types/api/index.d.ts.map +1 -1
  280. package/lib/types/api/model/AddressOption.d.ts +1 -0
  281. package/lib/types/api/model/AddressOption.d.ts.map +1 -1
  282. package/lib/types/api/model/MessageOptions.d.ts +4 -0
  283. package/lib/types/api/model/MessageOptions.d.ts.map +1 -0
  284. package/lib/types/api/model/SolanaTransactionOptionalConfig.d.ts +7 -0
  285. package/lib/types/api/model/SolanaTransactionOptionalConfig.d.ts.map +1 -0
  286. package/lib/types/api/model/TransactionResolutionContext.d.ts +15 -0
  287. package/lib/types/api/model/TransactionResolutionContext.d.ts.map +1 -0
  288. package/lib/types/internal/DefaultSignerSolana.d.ts +298 -4
  289. package/lib/types/internal/DefaultSignerSolana.d.ts.map +1 -1
  290. package/lib/types/internal/DefaultSolanaTools.d.ts +20 -0
  291. package/lib/types/internal/DefaultSolanaTools.d.ts.map +1 -0
  292. package/lib/types/internal/DefaultSolanaTools.test.d.ts +2 -0
  293. package/lib/types/internal/DefaultSolanaTools.test.d.ts.map +1 -0
  294. package/lib/types/internal/app-binder/SolanaAppBinder.d.ts +12 -3
  295. package/lib/types/internal/app-binder/SolanaAppBinder.d.ts.map +1 -1
  296. package/lib/types/internal/app-binder/command/GetAppConfigurationCommand.d.ts +1 -0
  297. package/lib/types/internal/app-binder/command/GetAppConfigurationCommand.d.ts.map +1 -1
  298. package/lib/types/internal/app-binder/command/GetChallengeCommand.d.ts +12 -0
  299. package/lib/types/internal/app-binder/command/GetChallengeCommand.d.ts.map +1 -0
  300. package/lib/types/internal/app-binder/command/GetChallengeCommand.test.d.ts +2 -0
  301. package/lib/types/internal/app-binder/command/GetChallengeCommand.test.d.ts.map +1 -0
  302. package/lib/types/internal/app-binder/command/GetPubKeyCommand.d.ts +6 -4
  303. package/lib/types/internal/app-binder/command/GetPubKeyCommand.d.ts.map +1 -1
  304. package/lib/types/internal/app-binder/command/ProvideTLVDescriptorCommand.d.ts +14 -0
  305. package/lib/types/internal/app-binder/command/ProvideTLVDescriptorCommand.d.ts.map +1 -0
  306. package/lib/types/internal/app-binder/command/ProvideTLVDescriptorCommand.test.d.ts +2 -0
  307. package/lib/types/internal/app-binder/command/ProvideTLVDescriptorCommand.test.d.ts.map +1 -0
  308. package/lib/types/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.d.ts +29 -0
  309. package/lib/types/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.d.ts.map +1 -0
  310. package/lib/types/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.test.d.ts +2 -0
  311. package/lib/types/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.test.d.ts.map +1 -0
  312. package/lib/types/internal/app-binder/command/SignOffChainMessageCommand.d.ts +14 -9
  313. package/lib/types/internal/app-binder/command/SignOffChainMessageCommand.d.ts.map +1 -1
  314. package/lib/types/internal/app-binder/command/SignTransactionCommand.d.ts +3 -0
  315. package/lib/types/internal/app-binder/command/SignTransactionCommand.d.ts.map +1 -1
  316. package/lib/types/internal/app-binder/command/utils/SolanaApplicationErrors.d.ts.map +1 -1
  317. package/lib/types/internal/app-binder/device-action/GenerateTransactionDeviceAction.d.ts +23 -0
  318. package/lib/types/internal/app-binder/device-action/GenerateTransactionDeviceAction.d.ts.map +1 -0
  319. package/lib/types/internal/app-binder/device-action/SignTransactionDeviceAction.d.ts +18 -1
  320. package/lib/types/internal/app-binder/device-action/SignTransactionDeviceAction.d.ts.map +1 -1
  321. package/lib/types/internal/app-binder/device-action/__test-utils__/makeInternalApi.d.ts.map +1 -1
  322. package/lib/types/internal/app-binder/device-action/__test-utils__/setupOpenAppDAMock.d.ts.map +1 -1
  323. package/lib/types/internal/app-binder/di/appBinderModule.d.ts.map +1 -1
  324. package/lib/types/internal/app-binder/services/ApplicationChecker.d.ts +13 -0
  325. package/lib/types/internal/app-binder/services/ApplicationChecker.d.ts.map +1 -0
  326. package/lib/types/internal/app-binder/services/ApplicationChecker.test.d.ts +2 -0
  327. package/lib/types/internal/app-binder/services/ApplicationChecker.test.d.ts.map +1 -0
  328. package/lib/types/internal/app-binder/services/GenerateSolanaTransaction.d.ts +14 -0
  329. package/lib/types/internal/app-binder/services/GenerateSolanaTransaction.d.ts.map +1 -0
  330. package/lib/types/internal/app-binder/services/GenerateSolanaTransaction.test.d.ts +2 -0
  331. package/lib/types/internal/app-binder/services/GenerateSolanaTransaction.test.d.ts.map +1 -0
  332. package/lib/types/internal/app-binder/services/TransactionInspector.d.ts +43 -0
  333. package/lib/types/internal/app-binder/services/TransactionInspector.d.ts.map +1 -0
  334. package/lib/types/internal/app-binder/services/TransactionInspector.test.d.ts +2 -0
  335. package/lib/types/internal/app-binder/services/TransactionInspector.test.d.ts.map +1 -0
  336. package/lib/types/internal/app-binder/services/bs58Encoder.d.ts +9 -0
  337. package/lib/types/internal/app-binder/services/bs58Encoder.d.ts.map +1 -0
  338. package/lib/types/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.d.ts +8 -0
  339. package/lib/types/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.d.ts.map +1 -0
  340. package/lib/types/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.test.d.ts +2 -0
  341. package/lib/types/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.test.d.ts.map +1 -0
  342. package/lib/types/internal/app-binder/services/utils/transactionDecoders.d.ts +14 -0
  343. package/lib/types/internal/app-binder/services/utils/transactionDecoders.d.ts.map +1 -0
  344. package/lib/types/internal/app-binder/task/BuildTransactionContextTask.d.ts +19 -0
  345. package/lib/types/internal/app-binder/task/BuildTransactionContextTask.d.ts.map +1 -0
  346. package/lib/types/internal/app-binder/task/BuildTransactionContextTask.test.d.ts +2 -0
  347. package/lib/types/internal/app-binder/task/BuildTransactionContextTask.test.d.ts.map +1 -0
  348. package/lib/types/internal/app-binder/task/ProvideTransactionContextTask.d.ts +19 -0
  349. package/lib/types/internal/app-binder/task/ProvideTransactionContextTask.d.ts.map +1 -0
  350. package/lib/types/internal/app-binder/task/ProvideTransactionContextTask.test.d.ts +2 -0
  351. package/lib/types/internal/app-binder/task/ProvideTransactionContextTask.test.d.ts.map +1 -0
  352. package/lib/types/internal/app-binder/task/SendSignMessageTask.d.ts +26 -3
  353. package/lib/types/internal/app-binder/task/SendSignMessageTask.d.ts.map +1 -1
  354. package/lib/types/internal/di.d.ts +3 -1
  355. package/lib/types/internal/di.d.ts.map +1 -1
  356. package/lib/types/internal/externalTypes.d.ts +1 -0
  357. package/lib/types/internal/externalTypes.d.ts.map +1 -1
  358. package/lib/types/internal/use-cases/address/GetAddressUseCase.d.ts.map +1 -1
  359. package/lib/types/internal/use-cases/di/useCasesModule.d.ts.map +1 -1
  360. package/lib/types/internal/use-cases/di/useCasesTypes.d.ts +1 -0
  361. package/lib/types/internal/use-cases/di/useCasesTypes.d.ts.map +1 -1
  362. package/lib/types/internal/use-cases/generateTransaction/GenerateTransactionUseCase.d.ts +10 -0
  363. package/lib/types/internal/use-cases/generateTransaction/GenerateTransactionUseCase.d.ts.map +1 -0
  364. package/lib/types/internal/use-cases/generateTransaction/GenerateTransactionUseCase.test.d.ts +2 -0
  365. package/lib/types/internal/use-cases/generateTransaction/GenerateTransactionUseCase.test.d.ts.map +1 -0
  366. package/lib/types/internal/use-cases/message/SignMessageUseCase.d.ts +2 -1
  367. package/lib/types/internal/use-cases/message/SignMessageUseCase.d.ts.map +1 -1
  368. package/lib/types/internal/use-cases/transaction/SignTransactionUseCase.d.ts +2 -2
  369. package/lib/types/internal/use-cases/transaction/SignTransactionUseCase.d.ts.map +1 -1
  370. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  371. package/package.json +43 -34
  372. package/lib/cjs/api/model/TransactionOptions.js +0 -2
  373. package/lib/cjs/api/model/TransactionOptions.js.map +0 -7
  374. package/lib/esm/api/model/TransactionOptions.js +0 -1
  375. package/lib/types/api/model/TransactionOptions.d.ts +0 -2
  376. package/lib/types/api/model/TransactionOptions.d.ts.map +0 -1
  377. /package/lib/esm/api/{model/TransactionOptions.js.map → SolanaTools.js.map} +0 -0
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/services/TransactionInspector.test.ts"],
4
+ "sourcesContent": ["import {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n createAssociatedTokenAccountInstruction,\n createCloseAccountInstruction,\n createInitializeAccount2Instruction,\n createInitializeAccount3Instruction,\n createInitializeAccountInstruction,\n createSyncNativeInstruction,\n createTransferCheckedInstruction,\n createTransferInstruction,\n getAssociatedTokenAddressSync,\n TOKEN_2022_PROGRAM_ID,\n TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport {\n Keypair,\n SystemProgram,\n Transaction,\n TransactionInstruction,\n} from \"@solana/web3.js\";\nimport { describe, expect, it } from \"vitest\";\n\nimport { DefaultBs58Encoder } from \"@internal/app-binder/services/bs58Encoder\";\n\nimport {\n SolanaTransactionTypes,\n TransactionInspector,\n} from \"./TransactionInspector\";\n\nconst DUMMY_BLOCKHASH = DefaultBs58Encoder.encode(\n new Uint8Array(32).fill(0xaa),\n);\n\nfunction makeSignedRawTx(\n ixs: TransactionInstruction[],\n signers: Keypair[],\n feePayer?: Keypair,\n) {\n const payer = feePayer ?? signers[0] ?? Keypair.generate();\n const tx = new Transaction();\n tx.recentBlockhash = DUMMY_BLOCKHASH;\n tx.feePayer = payer.publicKey;\n tx.add(...ixs);\n const seen = new Set<string>();\n const uniqueSigners = [payer, ...signers].filter((kp) => {\n const k = kp.publicKey.toBase58();\n if (seen.has(k)) return false;\n seen.add(k);\n return true;\n });\n\n tx.sign(...uniqueSigners);\n return { raw: tx.serialize(), payer };\n}\n\ndescribe(\"TransactionInspector\", () => {\n it(\"falls back to STANDARD for a plain SystemProgram transfer\", async () => {\n const payer = Keypair.generate();\n const dest = Keypair.generate().publicKey;\n\n const instruction = SystemProgram.transfer({\n fromPubkey: payer.publicKey,\n toPubkey: dest,\n lamports: 1_000,\n });\n\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n const result = await new TransactionInspector().inspectTransactionType(raw);\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.STANDARD);\n expect(result.data).toEqual({});\n });\n\n it(\"detects an SPL Transfer and returns the destination address\", async () => {\n const owner = Keypair.generate();\n const source = Keypair.generate().publicKey;\n const destination = Keypair.generate().publicKey;\n\n const instruction = createTransferInstruction(\n source,\n destination,\n owner.publicKey,\n 42n,\n [],\n TOKEN_PROGRAM_ID,\n );\n\n const { raw } = makeSignedRawTx([instruction], [owner], owner);\n\n const result = await new TransactionInspector().inspectTransactionType(raw);\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.tokenAddress).toBe(destination.toBase58());\n });\n\n it(\"detects an SPL TransferChecked and returns the destination address\", async () => {\n const owner = Keypair.generate();\n const mint = Keypair.generate().publicKey;\n const source = Keypair.generate().publicKey;\n const destination = Keypair.generate().publicKey;\n\n const instruction = createTransferCheckedInstruction(\n source,\n mint,\n destination,\n owner.publicKey,\n 123n,\n 0,\n [],\n TOKEN_PROGRAM_ID,\n );\n\n const { raw } = makeSignedRawTx([instruction], [owner], owner);\n\n const result = await new TransactionInspector().inspectTransactionType(raw);\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.tokenAddress).toBe(destination.toBase58());\n });\n\n it(\"detects InitializeAccount and returns the new account and mint\", async () => {\n const payer = Keypair.generate();\n const mint = Keypair.generate().publicKey;\n const newAccount = Keypair.generate().publicKey;\n const owner = Keypair.generate().publicKey;\n\n const instruction = createInitializeAccountInstruction(\n newAccount,\n mint,\n owner,\n TOKEN_PROGRAM_ID,\n );\n\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n const result = await new TransactionInspector().inspectTransactionType(raw);\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.createATA).toEqual({\n address: newAccount.toBase58(),\n mintAddress: mint.toBase58(),\n });\n });\n\n it(\"detects InitializeAccount2 and returns the new account and mint\", async () => {\n const payer = Keypair.generate();\n const mint = Keypair.generate().publicKey;\n const newAccount = Keypair.generate().publicKey;\n const owner = Keypair.generate().publicKey;\n\n const instruction = createInitializeAccount2Instruction(\n newAccount,\n mint,\n owner,\n TOKEN_PROGRAM_ID,\n );\n\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n const result = await new TransactionInspector().inspectTransactionType(raw);\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.createATA).toEqual({\n address: newAccount.toBase58(),\n mintAddress: mint.toBase58(),\n });\n });\n\n it(\"detects InitializeAccount3 and returns the new account and mint\", async () => {\n const payer = Keypair.generate();\n const mint = Keypair.generate().publicKey;\n const newAccount = Keypair.generate().publicKey;\n\n const instruction = createInitializeAccount3Instruction(\n newAccount,\n mint,\n TOKEN_PROGRAM_ID,\n );\n\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n const result = await new TransactionInspector().inspectTransactionType(raw);\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.createATA).toEqual({\n address: newAccount.toBase58(),\n mintAddress: mint.toBase58(),\n });\n });\n\n it(\"detects ATA creation via Associated Token Program (classic TOKEN program)\", async () => {\n const payer = Keypair.generate();\n const owner = Keypair.generate().publicKey;\n const mint = Keypair.generate().publicKey;\n const ata = getAssociatedTokenAddressSync(\n mint,\n owner,\n true,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const instruction = createAssociatedTokenAccountInstruction(\n payer.publicKey,\n ata,\n owner,\n mint,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n const result = await new TransactionInspector().inspectTransactionType(raw);\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.createATA).toEqual({\n address: owner.toBase58(),\n mintAddress: mint.toBase58(),\n });\n });\n\n it(\"detects ATA creation via Associated Token Program (TOKEN-2022 program)\", async () => {\n const payer = Keypair.generate();\n const owner = Keypair.generate().publicKey;\n const mint = Keypair.generate().publicKey;\n const ata22 = getAssociatedTokenAddressSync(\n mint,\n owner,\n true,\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const instruction = createAssociatedTokenAccountInstruction(\n payer.publicKey,\n ata22,\n owner,\n mint,\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n const result = await new TransactionInspector().inspectTransactionType(raw);\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.createATA).toEqual({\n address: owner.toBase58(),\n mintAddress: mint.toBase58(),\n });\n });\n\n it(\"detects CloseAccount and returns the closed token account\", async () => {\n const owner = Keypair.generate();\n const account = Keypair.generate().publicKey;\n const dest = Keypair.generate().publicKey;\n\n const instruction = createCloseAccountInstruction(\n account,\n dest,\n owner.publicKey,\n );\n\n const { raw } = makeSignedRawTx([instruction], [owner], owner);\n\n const result = await new TransactionInspector().inspectTransactionType(raw);\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.tokenAddress).toBe(account.toBase58());\n });\n\n it(\"detects SyncNative and returns the WSOL account\", async () => {\n const payer = Keypair.generate();\n const account = Keypair.generate().publicKey;\n\n const instruction = createSyncNativeInstruction(account, TOKEN_PROGRAM_ID);\n\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n const result = await new TransactionInspector().inspectTransactionType(raw);\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.tokenAddress).toBe(account.toBase58());\n });\n\n it(\"marks transaction as SPL even if decoders can't parse (last-resort SPL by program id)\", async () => {\n const payer = Keypair.generate();\n const bogusIx = new TransactionInstruction({\n programId: TOKEN_PROGRAM_ID,\n keys: [],\n data: Buffer.from([]),\n });\n\n const { raw } = makeSignedRawTx([bogusIx], [payer], payer);\n\n const result = await new TransactionInspector().inspectTransactionType(raw);\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data).toEqual({});\n });\n\n it(\"falls back to STANDARD if the payload is unparseable\", async () => {\n const garbage = new Uint8Array([0xab, 0xad, 0xbe, 0xef]);\n\n const result = await new TransactionInspector().inspectTransactionType(\n garbage,\n );\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.STANDARD);\n expect(result.data).toEqual({});\n });\n\n it(\"fast path: tokenAddress override + SPL instruction, SPL and returns override\", async () => {\n const owner = Keypair.generate();\n const source = Keypair.generate().publicKey;\n const destination = Keypair.generate().publicKey;\n\n const instruction = createTransferInstruction(\n source,\n destination,\n owner.publicKey,\n 1n,\n [],\n TOKEN_PROGRAM_ID,\n );\n const { raw } = makeSignedRawTx([instruction], [owner], owner);\n\n const overrideToken = Keypair.generate().publicKey.toBase58();\n\n const result = await new TransactionInspector().inspectTransactionType(\n raw,\n overrideToken, // tokenAddress override\n );\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.tokenAddress).toBe(overrideToken);\n });\n\n it(\"fast path: createATA override + ATA instruction, SPL and returns override\", async () => {\n const payer = Keypair.generate();\n const owner = Keypair.generate().publicKey;\n const mint = Keypair.generate().publicKey;\n const ata = getAssociatedTokenAddressSync(\n mint,\n owner,\n true,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const instruction = createAssociatedTokenAccountInstruction(\n payer.publicKey,\n ata,\n owner,\n mint,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n const overrideATA = {\n address: Keypair.generate().publicKey.toBase58(),\n mintAddress: Keypair.generate().publicKey.toBase58(),\n };\n\n const result = await new TransactionInspector().inspectTransactionType(\n raw,\n undefined, // no tokenAddress override\n overrideATA, // createATA override\n );\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.createATA).toEqual(overrideATA);\n });\n\n it(\"fast path: both overrides + SPL instruction, SPL and returns both\", async () => {\n const owner = Keypair.generate();\n const source = Keypair.generate().publicKey;\n const destination = Keypair.generate().publicKey;\n\n const instruction = createTransferInstruction(\n source,\n destination,\n owner.publicKey,\n 7n,\n [],\n TOKEN_PROGRAM_ID,\n );\n const { raw } = makeSignedRawTx([instruction], [owner], owner);\n\n const tokenOverride = Keypair.generate().publicKey.toBase58();\n const ataOverride = {\n address: Keypair.generate().publicKey.toBase58(),\n mintAddress: Keypair.generate().publicKey.toBase58(),\n };\n\n const result = await new TransactionInspector().inspectTransactionType(\n raw,\n tokenOverride,\n ataOverride,\n );\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.tokenAddress).toBe(tokenOverride);\n expect(result.data.createATA).toEqual(ataOverride);\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["ASSOCIATED_TOKEN_PROGRAM_ID", "createAssociatedTokenAccountInstruction", "createCloseAccountInstruction", "createInitializeAccount2Instruction", "createInitializeAccount3Instruction", "createInitializeAccountInstruction", "createSyncNativeInstruction", "createTransferCheckedInstruction", "createTransferInstruction", "getAssociatedTokenAddressSync", "TOKEN_2022_PROGRAM_ID", "TOKEN_PROGRAM_ID", "Keypair", "SystemProgram", "Transaction", "TransactionInstruction", "describe", "expect", "it", "DefaultBs58Encoder", "SolanaTransactionTypes", "TransactionInspector", "DUMMY_BLOCKHASH", "makeSignedRawTx", "ixs", "signers", "feePayer", "payer", "tx", "seen", "uniqueSigners", "kp", "k", "dest", "instruction", "raw", "result", "owner", "source", "destination", "mint", "newAccount", "ata", "ata22", "account", "bogusIx", "garbage", "overrideToken", "overrideATA", "tokenOverride", "ataOverride"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import r from"bs58";class d{static encode(e){return r.encode(e)}static decode(e){return r.decode(e)}}export{d as DefaultBs58Encoder};
2
+ //# sourceMappingURL=bs58Encoder.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/services/bs58Encoder.ts"],
4
+ "sourcesContent": ["import bs58 from \"bs58\";\n\nexport interface Bs58Encoder {\n encode(data: Uint8Array): string;\n decode(encoded: string): Uint8Array;\n}\n\nexport class DefaultBs58Encoder {\n static encode(data: Uint8Array): string {\n return bs58.encode(data);\n }\n static decode(encoded: string): Uint8Array {\n return bs58.decode(encoded);\n }\n}\n"],
5
+ "mappings": "AAAA,OAAOA,MAAU,OAOV,MAAMC,CAAmB,CAC9B,OAAO,OAAOC,EAA0B,CACtC,OAAOF,EAAK,OAAOE,CAAI,CACzB,CACA,OAAO,OAAOC,EAA6B,CACzC,OAAOH,EAAK,OAAOG,CAAO,CAC5B,CACF",
6
+ "names": ["bs58", "DefaultBs58Encoder", "data", "encoded"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{TransactionInspector as r}from"../../../app-binder/services/TransactionInspector";class o{static async normaliseMessage(e){return r.normaliseMessage(e)}}export{o as DefaultSolanaMessageNormaliser};
2
+ //# sourceMappingURL=DefaultSolanaMessageNormaliser.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.ts"],
4
+ "sourcesContent": ["import type { NormalizedMessage } from \"@internal/app-binder/services/TransactionInspector\";\nimport { TransactionInspector } from \"@internal/app-binder/services/TransactionInspector\";\n\nexport interface SolanaMessageNormaliserConstructor {\n normaliseMessage(rawBytes: Uint8Array): Promise<NormalizedMessage>;\n}\n\nexport class DefaultSolanaMessageNormaliser {\n static async normaliseMessage(\n rawBytes: Uint8Array,\n ): Promise<NormalizedMessage> {\n return TransactionInspector.normaliseMessage(rawBytes);\n }\n}\n"],
5
+ "mappings": "AACA,OAAS,wBAAAA,MAA4B,qDAM9B,MAAMC,CAA+B,CAC1C,aAAa,iBACXC,EAC4B,CAC5B,OAAOF,EAAqB,iBAAiBE,CAAQ,CACvD,CACF",
6
+ "names": ["TransactionInspector", "DefaultSolanaMessageNormaliser", "rawBytes"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{Keypair as l,SystemProgram as m,Transaction as b}from"@solana/web3.js";import f from"bs58";import{describe as P,expect as a,it as g}from"vitest";import{DefaultSolanaMessageNormaliser as d}from"./DefaultSolanaMessageNormaliser";const I=f.encode(new Uint8Array(32).fill(170));function K(t,s,u){const n=u??s[0]??l.generate(),o=new b;o.recentBlockhash=I,o.feePayer=n.publicKey,o.add(...t);const e=new Set,r=[n,...s].filter(c=>{const i=c.publicKey.toBase58();return e.has(i)?!1:(e.add(i),!0)});return o.sign(...r),{raw:o.serialize(),payer:n}}P("DefaultSolanaMessageNormaliser",()=>{g("normalises a legacy tx with multiple SystemProgram.transfer instructions preserving order",async()=>{const t=l.generate(),s=[l.generate(),l.generate(),l.generate()],u=1234,n=s.map(r=>m.transfer({fromPubkey:t.publicKey,toPubkey:r.publicKey,lamports:u})),{raw:o}=K(n,[t],t),e=await d.normaliseMessage(o);a(e.compiledInstructions).toHaveLength(n.length);for(let r=0;r<n.length;r++){const c=e.compiledInstructions[r],i=e.allKeys[c.programIdIndex];a(i.equals(m.programId)).toBe(!0);const p=c.accountKeyIndexes.map(y=>e.allKeys[y]);a(p[0].equals(t.publicKey)).toBe(!0),a(p[1].equals(s[r].publicKey)).toBe(!0),a(c.data instanceof Uint8Array).toBe(!0),a(c.data.length).toBeGreaterThan(0)}}),g("can be used via the SolanaMessageNormaliserConstructor interface",async()=>{const t=l.generate(),s=l.generate(),u=m.transfer({fromPubkey:t.publicKey,toPubkey:s.publicKey,lamports:1e3}),{raw:n}=K([u],[t],t),e=await d.normaliseMessage(n);a(e.compiledInstructions).toHaveLength(1);const r=e.compiledInstructions[0],c=e.allKeys[r.programIdIndex];a(c.equals(m.programId)).toBe(!0);const i=r.accountKeyIndexes.map(p=>e.allKeys[p]);a(i[0].equals(t.publicKey)).toBe(!0),a(i[1].equals(s.publicKey)).toBe(!0)}),g("handles single-instruction tx and preserves indices mapping",async()=>{const t=l.generate(),s=l.generate(),n=m.transfer({fromPubkey:t.publicKey,toPubkey:s.publicKey,lamports:5}),{raw:o}=K([n],[t],t),e=await d.normaliseMessage(o);a(Array.isArray(e.allKeys)).toBe(!0),a(e.allKeys.length).toBeGreaterThanOrEqual(3);const r=e.compiledInstructions[0],c=e.allKeys[r.programIdIndex];a(c.equals(m.programId)).toBe(!0);const[i,p]=r.accountKeyIndexes.map(y=>e.allKeys[y]);a(i.equals(t.publicKey)).toBe(!0),a(p.equals(s.publicKey)).toBe(!0)})});
2
+ //# sourceMappingURL=DefaultSolanaMessageNormaliser.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.test.ts"],
4
+ "sourcesContent": ["import {\n Keypair,\n type PublicKey,\n SystemProgram,\n Transaction,\n} from \"@solana/web3.js\";\nimport bs58 from \"bs58\";\nimport { describe, expect, it } from \"vitest\";\n\nimport {\n DefaultSolanaMessageNormaliser,\n type SolanaMessageNormaliserConstructor,\n} from \"./DefaultSolanaMessageNormaliser\";\n\nconst DUMMY_BLOCKHASH = bs58.encode(new Uint8Array(32).fill(0xaa));\n\nfunction makeSignedRawTx(\n instructions: Parameters<Transaction[\"add\"]>[0][],\n signers: Keypair[],\n feePayer?: Keypair,\n) {\n const payer = feePayer ?? signers[0] ?? Keypair.generate();\n const tx = new Transaction();\n tx.recentBlockhash = DUMMY_BLOCKHASH;\n tx.feePayer = payer.publicKey;\n tx.add(...instructions);\n\n // unique signers: fee payer first\n const seen = new Set<string>();\n const uniq = [payer, ...signers].filter((kp) => {\n const k = kp.publicKey.toBase58();\n if (seen.has(k)) return false;\n seen.add(k);\n return true;\n });\n\n tx.sign(...uniq);\n return { raw: tx.serialize(), payer };\n}\n\ndescribe(\"DefaultSolanaMessageNormaliser\", () => {\n it(\"normalises a legacy tx with multiple SystemProgram.transfer instructions preserving order\", async () => {\n // given\n const payer = Keypair.generate();\n const recipients = [\n Keypair.generate(),\n Keypair.generate(),\n Keypair.generate(),\n ];\n const lamports = 1234;\n\n const instructions = recipients.map((r) =>\n SystemProgram.transfer({\n fromPubkey: payer.publicKey,\n toPubkey: r.publicKey,\n lamports,\n }),\n );\n\n const { raw } = makeSignedRawTx(instructions, [payer], payer);\n\n // when\n const msg = await DefaultSolanaMessageNormaliser.normaliseMessage(raw);\n\n // then\n // same number of compiled instructions\n expect(msg.compiledInstructions).toHaveLength(instructions.length);\n\n for (let i = 0; i < instructions.length; i++) {\n const compiled = msg.compiledInstructions[i]!;\n const programId = msg.allKeys[compiled.programIdIndex]!;\n // program resolves to SystemProgram\n expect(programId.equals(SystemProgram.programId)).toBe(true);\n\n // accounts resolve to [from, to] in order\n const accounts = compiled.accountKeyIndexes.map(\n (idx) => msg.allKeys[idx]!,\n );\n expect((accounts[0] as PublicKey).equals(payer.publicKey)).toBe(true);\n expect((accounts[1] as PublicKey).equals(recipients[i]!.publicKey)).toBe(\n true,\n );\n\n // data is present (SystemProgram.transfer has non-empty data)\n expect(compiled.data instanceof Uint8Array).toBe(true);\n expect(compiled.data.length).toBeGreaterThan(0);\n }\n });\n\n it(\"can be used via the SolanaMessageNormaliserConstructor interface\", async () => {\n // given\n const payer = Keypair.generate();\n const recipient = Keypair.generate();\n const instruction = SystemProgram.transfer({\n fromPubkey: payer.publicKey,\n toPubkey: recipient.publicKey,\n lamports: 1_000,\n });\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n // when (note: using the class as a static 'constructor-like' value)\n const Normaliser: SolanaMessageNormaliserConstructor =\n DefaultSolanaMessageNormaliser;\n const msg = await Normaliser.normaliseMessage(raw);\n\n // then\n expect(msg.compiledInstructions).toHaveLength(1);\n const compiled = msg.compiledInstructions[0]!;\n const programId = msg.allKeys[compiled.programIdIndex]!;\n expect(programId.equals(SystemProgram.programId)).toBe(true);\n\n const accounts = compiled.accountKeyIndexes.map((i) => msg.allKeys[i]!);\n expect((accounts[0] as PublicKey).equals(payer.publicKey)).toBe(true);\n expect((accounts[1] as PublicKey).equals(recipient.publicKey)).toBe(true);\n });\n\n it(\"handles single-instruction tx and preserves indices mapping\", async () => {\n // given\n const payer = Keypair.generate();\n const recipient = Keypair.generate();\n const lamports = 5;\n\n const instruction = SystemProgram.transfer({\n fromPubkey: payer.publicKey,\n toPubkey: recipient.publicKey,\n lamports,\n });\n\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n // when\n const msg = await DefaultSolanaMessageNormaliser.normaliseMessage(raw);\n\n // then\n expect(Array.isArray(msg.allKeys)).toBe(true);\n expect(msg.allKeys.length).toBeGreaterThanOrEqual(3);\n\n const compiled = msg.compiledInstructions[0]!;\n const resolvedPid = msg.allKeys[compiled.programIdIndex]!;\n expect(resolvedPid.equals(SystemProgram.programId)).toBe(true);\n\n const [fromPk, toPk] = compiled.accountKeyIndexes.map(\n (i) => msg.allKeys[i]!,\n );\n expect((fromPk as PublicKey).equals(payer.publicKey)).toBe(true);\n expect((toPk as PublicKey).equals(recipient.publicKey)).toBe(true);\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["Keypair", "SystemProgram", "Transaction", "bs58", "describe", "expect", "it", "DefaultSolanaMessageNormaliser", "DUMMY_BLOCKHASH", "makeSignedRawTx", "instructions", "signers", "feePayer", "payer", "tx", "seen", "uniq", "kp", "k", "recipients", "lamports", "raw", "msg", "i", "compiled", "programId", "accounts", "idx", "recipient", "instruction", "resolvedPid", "fromPk", "toPk"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{ASSOCIATED_TOKEN_PROGRAM_ID as l,decodeBurnCheckedInstruction as p,decodeBurnInstruction as B,decodeCloseAccountInstruction as T,decodeFreezeAccountInstruction as h,decodeInitializeAccount2Instruction as f,decodeInitializeAccount3Instruction as w,decodeInitializeAccountInstruction as x,decodeInitializeImmutableOwnerInstruction as q,decodeSyncNativeInstruction as P,decodeThawAccountInstruction as C,decodeTransferCheckedInstruction as K,decodeTransferCheckedWithFeeInstruction as R,decodeTransferInstruction as O,getAssociatedTokenAddressSync as _,TOKEN_2022_PROGRAM_ID as u,TOKEN_PROGRAM_ID as i}from"@solana/spl-token";import{SystemProgram as z,SYSVAR_RENT_PUBKEY as N}from"@solana/web3.js";const c=e=>e.equals(i)||e.equals(u),o=e=>{try{return e()}catch{return null}},g=[{when:({programId:e})=>e.equals(l),decode:({ixMeta:e,message:s})=>{const n=e.accountKeyIndexes??[],d=t=>n[t]!==void 0?s.allKeys[n[t]]??null:null,a=d(1),r=d(3);if(!a||!r)return null;const y=n.map(t=>s.allKeys[t]).filter(t=>!!t),A=y.find(t=>t.equals(u))??y.find(t=>t.equals(i))??null,b=t=>t.equals(z.programId)||t.equals(i)||t.equals(u)||t.equals(l)||t.equals(N),I=y.filter(t=>!b(t)&&!t.equals(a)&&!t.equals(r)),k=(t,m)=>_(r,t,!0,m,l);if(A){for(const t of I)if(k(t,A).equals(a))return{createATA:{address:t.toBase58(),mintAddress:r.toBase58()}}}for(const t of I){if(k(t,i).equals(a))return{createATA:{address:t.toBase58(),mintAddress:r.toBase58()}};if(k(t,u).equals(a))return{createATA:{address:t.toBase58(),mintAddress:r.toBase58()}}}return null}},{when:({programId:e})=>e.equals(u),decode:({instruction:e,programId:s})=>o(()=>{const{keys:{destination:n}}=R(e,s);return{tokenAddress:n.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:s})=>o(()=>{const{keys:{destination:n}}=O(e,s);return{tokenAddress:n.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:s})=>o(()=>{const{keys:{destination:n}}=K(e,s);return{tokenAddress:n.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:s})=>o(()=>{const{keys:{account:n,mint:d}}=x(e,s);return{createATA:{address:n.pubkey.toBase58(),mintAddress:d.pubkey.toBase58()}}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:s})=>o(()=>{const{keys:{account:n,mint:d}}=f(e,s);return{createATA:{address:n.pubkey.toBase58(),mintAddress:d.pubkey.toBase58()}}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:s})=>o(()=>{const{keys:{account:n,mint:d}}=w(e,s);return{createATA:{address:n.pubkey.toBase58(),mintAddress:d.pubkey.toBase58()}}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:s})=>o(()=>{const{keys:{account:n}}=q(e,s);return{tokenAddress:n.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:s})=>o(()=>{const{keys:{account:n}}=T(e,s);return{tokenAddress:n.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:s})=>o(()=>{const{keys:{account:n}}=P(e,s);return{tokenAddress:n.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:s})=>o(()=>{const{keys:{account:n}}=p(e,s);return{tokenAddress:n.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:s})=>o(()=>{const{keys:{account:n}}=B(e,s);return{tokenAddress:n.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:s})=>o(()=>{const{keys:{account:n}}=h(e,s);return{tokenAddress:n.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:s})=>o(()=>{const{keys:{account:n}}=C(e,s);return{tokenAddress:n.pubkey.toBase58()}})},{when:({programId:e})=>e.equals(l)||e.equals(i)||e.equals(u),decode:()=>null}];export{g as DECODERS};
2
+ //# sourceMappingURL=transactionDecoders.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/internal/app-binder/services/utils/transactionDecoders.ts"],
4
+ "sourcesContent": ["import {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n decodeBurnCheckedInstruction,\n decodeBurnInstruction,\n decodeCloseAccountInstruction,\n decodeFreezeAccountInstruction,\n decodeInitializeAccount2Instruction,\n decodeInitializeAccount3Instruction,\n decodeInitializeAccountInstruction,\n decodeInitializeImmutableOwnerInstruction,\n decodeSyncNativeInstruction,\n decodeThawAccountInstruction,\n decodeTransferCheckedInstruction,\n decodeTransferCheckedWithFeeInstruction,\n decodeTransferInstruction,\n getAssociatedTokenAddressSync,\n TOKEN_2022_PROGRAM_ID,\n TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport {\n type PublicKey,\n SystemProgram,\n SYSVAR_RENT_PUBKEY,\n type TransactionInstruction,\n} from \"@solana/web3.js\";\n\nimport {\n type NormalizedCompiledIx,\n type NormalizedMessage,\n type TxInspectorResult,\n} from \"@internal/app-binder/services/TransactionInspector\";\n\nexport type IxContext = {\n programId: PublicKey;\n ixMeta: NormalizedCompiledIx;\n message: NormalizedMessage;\n instruction: TransactionInstruction;\n};\n\nexport type Decoder = {\n when: (ctx: IxContext) => boolean;\n decode: (ctx: IxContext) => TxInspectorResult[\"data\"] | null;\n};\n\nconst isTokenProgramId = (pid: PublicKey) =>\n pid.equals(TOKEN_PROGRAM_ID) || pid.equals(TOKEN_2022_PROGRAM_ID);\n\nconst safe = <T>(fn: () => T): T | null => {\n try {\n return fn();\n } catch {\n return null;\n }\n};\n\nexport const DECODERS: Decoder[] = [\n // ATA creation (with derivation fallback)\n {\n when: ({ programId }) => programId.equals(ASSOCIATED_TOKEN_PROGRAM_ID),\n decode: ({ ixMeta, message }) => {\n const indexes = ixMeta.accountKeyIndexes ?? [];\n const byIndexes = (n: number) =>\n indexes[n] !== undefined ? (message.allKeys[indexes[n]] ?? null) : null;\n\n // canonical ATA instruction layout: [payer, ata, owner, mint, system, tokenProgram, rent?]\n const ataPk = byIndexes(1);\n const mintPk = byIndexes(3);\n if (!ataPk || !mintPk) return null;\n\n const accs = indexes\n .map((i) => message.allKeys[i])\n .filter((k): k is PublicKey => !!k);\n\n // prefer token-2022 if present among instruction accounts, else token classic\n const tokenProgInIx =\n accs.find((pk) => pk.equals(TOKEN_2022_PROGRAM_ID)) ??\n accs.find((pk) => pk.equals(TOKEN_PROGRAM_ID)) ??\n null;\n\n const isProgramOrSysvar = (pk: PublicKey) =>\n pk.equals(SystemProgram.programId) ||\n pk.equals(TOKEN_PROGRAM_ID) ||\n pk.equals(TOKEN_2022_PROGRAM_ID) ||\n pk.equals(ASSOCIATED_TOKEN_PROGRAM_ID) ||\n pk.equals(SYSVAR_RENT_PUBKEY);\n\n // candidate owners: exclude programs/sysvars, the ATA itself, and the mint\n const ownerCandidates = accs.filter(\n (pk) =>\n !isProgramOrSysvar(pk) && !pk.equals(ataPk) && !pk.equals(mintPk),\n );\n\n const derive = (owner: PublicKey, tokenProg: PublicKey) =>\n getAssociatedTokenAddressSync(\n mintPk,\n owner,\n true, // allowOwnerOffCurve\n tokenProg,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n // try with the token program actually referenced in the instruction (if any)\n if (tokenProgInIx) {\n for (const owner of ownerCandidates) {\n if (derive(owner, tokenProgInIx).equals(ataPk)) {\n return {\n createATA: {\n address: owner.toBase58(),\n mintAddress: mintPk.toBase58(),\n },\n };\n }\n }\n }\n\n // fallback: try both classic and 2022 (covers odd wrappers/missing program acct)\n for (const owner of ownerCandidates) {\n const dClassic = derive(owner, TOKEN_PROGRAM_ID);\n if (dClassic.equals(ataPk)) {\n return {\n createATA: {\n address: owner.toBase58(),\n mintAddress: mintPk.toBase58(),\n },\n };\n }\n const d22 = derive(owner, TOKEN_2022_PROGRAM_ID);\n if (d22.equals(ataPk)) {\n return {\n createATA: {\n address: owner.toBase58(),\n mintAddress: mintPk.toBase58(),\n },\n };\n }\n }\n return null;\n },\n },\n\n // Token-2022 fee\u2019d transfer\n {\n when: ({ programId }) => programId.equals(TOKEN_2022_PROGRAM_ID),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { destination },\n } = decodeTransferCheckedWithFeeInstruction(instruction, programId);\n return {\n tokenAddress: destination.pubkey.toBase58(),\n };\n }),\n },\n\n // Transfers\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { destination },\n } = decodeTransferInstruction(instruction, programId);\n return { tokenAddress: destination.pubkey.toBase58() };\n }),\n },\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { destination },\n } = decodeTransferCheckedInstruction(instruction, programId);\n return {\n tokenAddress: destination.pubkey.toBase58(),\n };\n }),\n },\n\n // Account init\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account, mint },\n } = decodeInitializeAccountInstruction(instruction, programId);\n return {\n createATA: {\n address: account.pubkey.toBase58(),\n mintAddress: mint.pubkey.toBase58(),\n },\n };\n }),\n },\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account, mint },\n } = decodeInitializeAccount2Instruction(instruction, programId);\n return {\n createATA: {\n address: account.pubkey.toBase58(),\n mintAddress: mint.pubkey.toBase58(),\n },\n };\n }),\n },\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account, mint },\n } = decodeInitializeAccount3Instruction(instruction, programId);\n return {\n createATA: {\n address: account.pubkey.toBase58(),\n mintAddress: mint.pubkey.toBase58(),\n },\n };\n }),\n },\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account },\n } = decodeInitializeImmutableOwnerInstruction(instruction, programId);\n return { tokenAddress: account.pubkey.toBase58() };\n }),\n },\n\n // Lifecycle / WSOL\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account },\n } = decodeCloseAccountInstruction(instruction, programId);\n return { tokenAddress: account.pubkey.toBase58() };\n }),\n },\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account },\n } = decodeSyncNativeInstruction(instruction, programId);\n return { tokenAddress: account.pubkey.toBase58() };\n }),\n },\n\n // Mint / Burn\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account },\n } = decodeBurnCheckedInstruction(instruction, programId);\n return {\n tokenAddress: account.pubkey.toBase58(),\n };\n }),\n },\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account },\n } = decodeBurnInstruction(instruction, programId);\n return {\n tokenAddress: account.pubkey.toBase58(),\n };\n }),\n },\n\n // Freeze / Thaw\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account },\n } = decodeFreezeAccountInstruction(instruction, programId);\n return {\n tokenAddress: account.pubkey.toBase58(),\n };\n }),\n },\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account },\n } = decodeThawAccountInstruction(instruction, programId);\n return {\n tokenAddress: account.pubkey.toBase58(),\n };\n }),\n },\n\n // LAST-RESORT: tag as SPL by program id only (when decoders can't run)\n {\n when: ({ programId }) =>\n programId.equals(ASSOCIATED_TOKEN_PROGRAM_ID) ||\n programId.equals(TOKEN_PROGRAM_ID) ||\n programId.equals(TOKEN_2022_PROGRAM_ID),\n decode: () => null,\n },\n];\n"],
5
+ "mappings": "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",
6
+ "names": ["ASSOCIATED_TOKEN_PROGRAM_ID", "decodeBurnCheckedInstruction", "decodeBurnInstruction", "decodeCloseAccountInstruction", "decodeFreezeAccountInstruction", "decodeInitializeAccount2Instruction", "decodeInitializeAccount3Instruction", "decodeInitializeAccountInstruction", "decodeInitializeImmutableOwnerInstruction", "decodeSyncNativeInstruction", "decodeThawAccountInstruction", "decodeTransferCheckedInstruction", "decodeTransferCheckedWithFeeInstruction", "decodeTransferInstruction", "getAssociatedTokenAddressSync", "TOKEN_2022_PROGRAM_ID", "TOKEN_PROGRAM_ID", "SystemProgram", "SYSVAR_RENT_PUBKEY", "isTokenProgramId", "pid", "safe", "fn", "DECODERS", "programId", "ixMeta", "message", "indexes", "byIndexes", "n", "ataPk", "mintPk", "accs", "i", "k", "tokenProgInIx", "pk", "isProgramOrSysvar", "ownerCandidates", "derive", "owner", "tokenProg", "instruction", "destination", "account", "mint"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{isSuccessCommandResult as s}from"@ledgerhq/device-management-kit";import{GetChallengeCommand as i}from"../../app-binder/command/GetChallengeCommand";class p{constructor(o,t){this.api=o;this.args=t}async run(){const{contextModule:o,options:t}=this.args,r=this.api.getDeviceSessionState();let a;const n=await this.api.sendCommand(new i);return s(n)&&(a=n.data.challenge),(await o.getSolanaContext({deviceModelId:r.deviceModelId,tokenAddress:t.tokenAddress,challenge:a,createATA:t.createATA,tokenInternalId:t.tokenInternalId,templateId:t.templateId})).caseOf({Left:e=>{throw e},Right:e=>({tlvDescriptor:e.tlvDescriptor,trustedNamePKICertificate:e.trustedNamePKICertificate,loadersResults:e.loadersResults})})}}export{p as BuildTransactionContextTask};
2
+ //# sourceMappingURL=BuildTransactionContextTask.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/task/BuildTransactionContextTask.ts"],
4
+ "sourcesContent": ["import {\n type ContextModule,\n type PkiCertificate,\n type SolanaContextLoaderResults,\n} from \"@ledgerhq/context-module\";\nimport {\n type InternalApi,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type TransactionResolutionContext } from \"@api/model/TransactionResolutionContext\";\nimport { GetChallengeCommand } from \"@internal/app-binder/command/GetChallengeCommand\";\n\nexport type SolanaBuildContextResult = {\n trustedNamePKICertificate: PkiCertificate;\n tlvDescriptor: Uint8Array;\n loadersResults: SolanaContextLoaderResults;\n};\n\nexport type BuildTransactionContextTaskArgs = {\n readonly contextModule: ContextModule;\n readonly options: TransactionResolutionContext;\n};\n\nexport class BuildTransactionContextTask {\n constructor(\n private readonly api: InternalApi,\n private readonly args: BuildTransactionContextTaskArgs,\n ) {}\n\n async run(): Promise<SolanaBuildContextResult> {\n const { contextModule, options } = this.args;\n const deviceState = this.api.getDeviceSessionState();\n\n // get challenge\n let challenge: string | undefined;\n const challengeRes = await this.api.sendCommand(new GetChallengeCommand());\n if (isSuccessCommandResult(challengeRes)) {\n challenge = challengeRes.data.challenge;\n }\n\n // get Solana context\n const contextResult = await contextModule.getSolanaContext({\n deviceModelId: deviceState.deviceModelId,\n tokenAddress: options.tokenAddress,\n challenge,\n createATA: options.createATA,\n tokenInternalId: options.tokenInternalId,\n templateId: options.templateId,\n });\n\n return contextResult.caseOf({\n Left: (err) => {\n throw err;\n },\n Right: (ctx) => {\n return {\n tlvDescriptor: ctx.tlvDescriptor,\n trustedNamePKICertificate: ctx.trustedNamePKICertificate,\n loadersResults: ctx.loadersResults,\n };\n },\n });\n }\n}\n"],
5
+ "mappings": "AAKA,OAEE,0BAAAA,MACK,kCAGP,OAAS,uBAAAC,MAA2B,mDAa7B,MAAMC,CAA4B,CACvC,YACmBC,EACAC,EACjB,CAFiB,SAAAD,EACA,UAAAC,CAChB,CAEH,MAAM,KAAyC,CAC7C,KAAM,CAAE,cAAAC,EAAe,QAAAC,CAAQ,EAAI,KAAK,KAClCC,EAAc,KAAK,IAAI,sBAAsB,EAGnD,IAAIC,EACJ,MAAMC,EAAe,MAAM,KAAK,IAAI,YAAY,IAAIR,CAAqB,EACzE,OAAID,EAAuBS,CAAY,IACrCD,EAAYC,EAAa,KAAK,YAIV,MAAMJ,EAAc,iBAAiB,CACzD,cAAeE,EAAY,cAC3B,aAAcD,EAAQ,aACtB,UAAAE,EACA,UAAWF,EAAQ,UACnB,gBAAiBA,EAAQ,gBACzB,WAAYA,EAAQ,UACtB,CAAC,GAEoB,OAAO,CAC1B,KAAOI,GAAQ,CACb,MAAMA,CACR,EACA,MAAQC,IACC,CACL,cAAeA,EAAI,cACnB,0BAA2BA,EAAI,0BAC/B,eAAgBA,EAAI,cACtB,EAEJ,CAAC,CACH,CACF",
6
+ "names": ["isSuccessCommandResult", "GetChallengeCommand", "BuildTransactionContextTask", "api", "args", "contextModule", "options", "deviceState", "challenge", "challengeRes", "err", "ctx"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{CommandResultStatus as u,DeviceModelId as r}from"@ledgerhq/device-management-kit";import{Left as C,Right as m}from"purify-ts";import{beforeEach as f,describe as x,expect as e,it as d,vi as s}from"vitest";import{GetChallengeCommand as k}from"../../app-binder/command/GetChallengeCommand";import{BuildTransactionContextTask as c}from"./BuildTransactionContextTask";const n={getSolanaContext:s.fn()},i={contextModule:n,options:{tokenAddress:"someAddress",createATA:void 0}},t={tlvDescriptor:new Uint8Array([1,2,3]),trustedNamePKICertificate:{payload:new Uint8Array([170,187]),keyUsageNumber:1},loadersResults:[]};let a;x("BuildTransactionContextTask",()=>{f(()=>{s.resetAllMocks(),a={getDeviceSessionState:s.fn().mockReturnValue({deviceModelId:r.NANO_X}),sendCommand:s.fn().mockResolvedValue({status:u.Success,data:{challenge:"someChallenge"}})}}),d("returns context successfully when challenge command succeeds",async()=>{n.getSolanaContext.mockResolvedValue(m(t));const o=await new c(a,i).run();e(a.sendCommand).toHaveBeenCalledWith(e.any(k)),e(n.getSolanaContext).toHaveBeenCalledWith({deviceModelId:r.NANO_X,tokenAddress:"someAddress",challenge:"someChallenge",createATA:void 0}),e(o).toEqual({tlvDescriptor:t.tlvDescriptor,trustedNamePKICertificate:t.trustedNamePKICertificate,loadersResults:[]})}),d("returns context when challenge command fails (challenge undefined)",async()=>{a.sendCommand.mockResolvedValue({status:u.Error,data:{}}),n.getSolanaContext.mockResolvedValue(m(t));const o=await new c(a,i).run();e(n.getSolanaContext).toHaveBeenCalledWith({deviceModelId:r.NANO_X,tokenAddress:"someAddress",challenge:void 0,createATA:void 0}),e(o).toEqual({tlvDescriptor:t.tlvDescriptor,trustedNamePKICertificate:t.trustedNamePKICertificate,loadersResults:[]})}),d("throws if getSolanaContext returns Left",async()=>{const l=new Error("Solana context failure");n.getSolanaContext.mockResolvedValue(C(l));const o=new c(a,i);await e(o.run()).rejects.toThrow("Solana context failure")})});
2
+ //# sourceMappingURL=BuildTransactionContextTask.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/task/BuildTransactionContextTask.test.ts"],
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n CommandResultStatus,\n DeviceModelId,\n type InternalApi,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { GetChallengeCommand } from \"@internal/app-binder/command/GetChallengeCommand\";\n\nimport {\n BuildTransactionContextTask,\n type SolanaBuildContextResult,\n} from \"./BuildTransactionContextTask\";\n\nconst contextModuleMock: ContextModule = {\n getSolanaContext: vi.fn(),\n} as unknown as ContextModule;\n\nconst defaultArgs = {\n contextModule: contextModuleMock,\n options: {\n tokenAddress: \"someAddress\",\n createATA: undefined,\n },\n};\n\nconst solanaContextRightPayload = {\n tlvDescriptor: new Uint8Array([1, 2, 3]),\n trustedNamePKICertificate: {\n payload: new Uint8Array([0xaa, 0xbb]),\n keyUsageNumber: 1,\n },\n loadersResults: [], // required by the task's return type\n} as const;\n\nlet apiMock: InternalApi;\n\ndescribe(\"BuildTransactionContextTask\", () => {\n beforeEach(() => {\n vi.resetAllMocks();\n\n apiMock = {\n getDeviceSessionState: vi\n .fn()\n .mockReturnValue({ deviceModelId: DeviceModelId.NANO_X }),\n sendCommand: vi.fn().mockResolvedValue({\n status: CommandResultStatus.Success,\n data: { challenge: \"someChallenge\" },\n }),\n } as unknown as InternalApi;\n });\n\n it(\"returns context successfully when challenge command succeeds\", async () => {\n (contextModuleMock.getSolanaContext as any).mockResolvedValue(\n Right(solanaContextRightPayload),\n );\n\n const task = new BuildTransactionContextTask(apiMock, defaultArgs);\n const result = await task.run();\n\n // challenge is fetched\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n expect.any(GetChallengeCommand),\n );\n\n // getSolanaContext called with challenge\n expect(contextModuleMock.getSolanaContext).toHaveBeenCalledWith({\n deviceModelId: DeviceModelId.NANO_X,\n tokenAddress: \"someAddress\",\n challenge: \"someChallenge\",\n createATA: undefined,\n });\n\n // matches SolanaBuildContextResult shape\n expect(result).toEqual<SolanaBuildContextResult>({\n tlvDescriptor: solanaContextRightPayload.tlvDescriptor,\n trustedNamePKICertificate:\n solanaContextRightPayload.trustedNamePKICertificate,\n loadersResults: [],\n });\n });\n\n it(\"returns context when challenge command fails (challenge undefined)\", async () => {\n (apiMock.sendCommand as any).mockResolvedValue({\n status: CommandResultStatus.Error,\n data: {},\n });\n (contextModuleMock.getSolanaContext as any).mockResolvedValue(\n Right(solanaContextRightPayload),\n );\n\n const task = new BuildTransactionContextTask(apiMock, defaultArgs);\n const result = await task.run();\n\n // getSolanaContext called without challenge\n expect(contextModuleMock.getSolanaContext).toHaveBeenCalledWith({\n deviceModelId: DeviceModelId.NANO_X,\n tokenAddress: \"someAddress\",\n challenge: undefined,\n createATA: undefined,\n });\n\n expect(result).toEqual<SolanaBuildContextResult>({\n tlvDescriptor: solanaContextRightPayload.tlvDescriptor,\n trustedNamePKICertificate:\n solanaContextRightPayload.trustedNamePKICertificate,\n loadersResults: [],\n });\n });\n\n it(\"throws if getSolanaContext returns Left\", async () => {\n const error = new Error(\"Solana context failure\");\n (contextModuleMock.getSolanaContext as any).mockResolvedValue(Left(error));\n\n const task = new BuildTransactionContextTask(apiMock, defaultArgs);\n\n await expect(task.run()).rejects.toThrow(\"Solana context failure\");\n });\n});\n"],
5
+ "mappings": "AAIA,OACE,uBAAAA,EACA,iBAAAC,MAEK,kCACP,OAAS,QAAAC,EAAM,SAAAC,MAAa,YAC5B,OAAS,cAAAC,EAAY,YAAAC,EAAU,UAAAC,EAAQ,MAAAC,EAAI,MAAAC,MAAU,SAErD,OAAS,uBAAAC,MAA2B,mDAEpC,OACE,+BAAAC,MAEK,gCAEP,MAAMC,EAAmC,CACvC,iBAAkBH,EAAG,GAAG,CAC1B,EAEMI,EAAc,CAClB,cAAeD,EACf,QAAS,CACP,aAAc,cACd,UAAW,MACb,CACF,EAEME,EAA4B,CAChC,cAAe,IAAI,WAAW,CAAC,EAAG,EAAG,CAAC,CAAC,EACvC,0BAA2B,CACzB,QAAS,IAAI,WAAW,CAAC,IAAM,GAAI,CAAC,EACpC,eAAgB,CAClB,EACA,eAAgB,CAAC,CACnB,EAEA,IAAIC,EAEJT,EAAS,8BAA+B,IAAM,CAC5CD,EAAW,IAAM,CACfI,EAAG,cAAc,EAEjBM,EAAU,CACR,sBAAuBN,EACpB,GAAG,EACH,gBAAgB,CAAE,cAAeP,EAAc,MAAO,CAAC,EAC1D,YAAaO,EAAG,GAAG,EAAE,kBAAkB,CACrC,OAAQR,EAAoB,QAC5B,KAAM,CAAE,UAAW,eAAgB,CACrC,CAAC,CACH,CACF,CAAC,EAEDO,EAAG,+DAAgE,SAAY,CAC5EI,EAAkB,iBAAyB,kBAC1CR,EAAMU,CAAyB,CACjC,EAGA,MAAME,EAAS,MADF,IAAIL,EAA4BI,EAASF,CAAW,EACvC,IAAI,EAG9BN,EAAOQ,EAAQ,WAAW,EAAE,qBAC1BR,EAAO,IAAIG,CAAmB,CAChC,EAGAH,EAAOK,EAAkB,gBAAgB,EAAE,qBAAqB,CAC9D,cAAeV,EAAc,OAC7B,aAAc,cACd,UAAW,gBACX,UAAW,MACb,CAAC,EAGDK,EAAOS,CAAM,EAAE,QAAkC,CAC/C,cAAeF,EAA0B,cACzC,0BACEA,EAA0B,0BAC5B,eAAgB,CAAC,CACnB,CAAC,CACH,CAAC,EAEDN,EAAG,qEAAsE,SAAY,CAClFO,EAAQ,YAAoB,kBAAkB,CAC7C,OAAQd,EAAoB,MAC5B,KAAM,CAAC,CACT,CAAC,EACAW,EAAkB,iBAAyB,kBAC1CR,EAAMU,CAAyB,CACjC,EAGA,MAAME,EAAS,MADF,IAAIL,EAA4BI,EAASF,CAAW,EACvC,IAAI,EAG9BN,EAAOK,EAAkB,gBAAgB,EAAE,qBAAqB,CAC9D,cAAeV,EAAc,OAC7B,aAAc,cACd,UAAW,OACX,UAAW,MACb,CAAC,EAEDK,EAAOS,CAAM,EAAE,QAAkC,CAC/C,cAAeF,EAA0B,cACzC,0BACEA,EAA0B,0BAC5B,eAAgB,CAAC,CACnB,CAAC,CACH,CAAC,EAEDN,EAAG,0CAA2C,SAAY,CACxD,MAAMS,EAAQ,IAAI,MAAM,wBAAwB,EAC/CL,EAAkB,iBAAyB,kBAAkBT,EAAKc,CAAK,CAAC,EAEzE,MAAMC,EAAO,IAAIP,EAA4BI,EAASF,CAAW,EAEjE,MAAMN,EAAOW,EAAK,IAAI,CAAC,EAAE,QAAQ,QAAQ,wBAAwB,CACnE,CAAC,CACH,CAAC",
6
+ "names": ["CommandResultStatus", "DeviceModelId", "Left", "Right", "beforeEach", "describe", "expect", "it", "vi", "GetChallengeCommand", "BuildTransactionContextTask", "contextModuleMock", "defaultArgs", "solanaContextRightPayload", "apiMock", "result", "error", "task"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{SolanaContextTypes as s}from"@ledgerhq/context-module";import{isSuccessCommandResult as u,LoadCertificateCommand as m}from"@ledgerhq/device-management-kit";import{Nothing as C}from"purify-ts";import{ProvideTLVTransactionInstructionDescriptorCommand as c}from"../../app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand";import{ProvideTLVDescriptorCommand as f}from"../../app-binder/command/ProvideTLVDescriptorCommand";import{DefaultSolanaMessageNormaliser as y}from"../../app-binder/services/utils/DefaultSolanaMessageNormaliser";const S="test";class A{constructor(o,t,e=y){this.api=o;this.context=t;this.normaliser=e}async run(){const{tlvDescriptor:o,trustedNamePKICertificate:t,loadersResults:e,transactionBytes:r}=this.context;await this.api.sendCommand(new m({certificate:t.payload,keyUsage:t.keyUsageNumber})),await this.api.sendCommand(new f({payload:o}));for(const i of e)switch(i.type){case s.SOLANA_TOKEN:{const a=e.find(n=>n.type===s.SOLANA_TOKEN);a&&await this.provideTokenMetadataContext(a);break}case s.SOLANA_LIFI:{const a=e.find(n=>n.type===s.SOLANA_LIFI);a&&await this.provideSwapContext(a,r);break}case s.ERROR:break;default:break}return C}async provideTokenMetadataContext(o){const{payload:t,certificate:e}=o;if(t&&e){const r=await this.api.sendCommand(new m({certificate:e.payload,keyUsage:e.keyUsageNumber}));if(!u(r))throw new Error("[SignerSolana] ProvideSolanaTransactionContextTask: Failed to send tokenMetadataCertificate to device, latest firmware version required");await this.api.sendCommand(new c({kind:"descriptor",dataHex:t.solanaTokenDescriptor.data,signatureHex:t.solanaTokenDescriptor.signature,isFirstMessage:!0,swapSignatureTag:!1}))}}async provideSwapContext(o,t){const e=o.payload;if(e){const r=await this.normaliser.normaliseMessage(t);for(const[i,a]of r.compiledInstructions.entries()){const p=r.allKeys[a.programIdIndex]?.toBase58(),d=p?e[p]:void 0,l=d&&d.signatures[S];d&&l?await this.api.sendCommand(new c({kind:"descriptor",dataHex:d.data,signatureHex:l,isFirstMessage:i===0,swapSignatureTag:!0})):await this.api.sendCommand(new c({kind:"empty",isFirstMessage:i===0,swapSignatureTag:!0}))}}}}export{A as ProvideSolanaTransactionContextTask,S as SWAP_MODE};
2
+ //# sourceMappingURL=ProvideTransactionContextTask.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/task/ProvideTransactionContextTask.ts"],
4
+ "sourcesContent": ["import {\n SolanaContextTypes,\n type SolanaLifiContextSuccess,\n type SolanaTokenContextSuccess,\n} from \"@ledgerhq/context-module\";\nimport {\n type CommandErrorResult,\n type InternalApi,\n isSuccessCommandResult,\n LoadCertificateCommand,\n} from \"@ledgerhq/device-management-kit\";\nimport { type Maybe, Nothing } from \"purify-ts\";\n\nimport { ProvideTLVTransactionInstructionDescriptorCommand } from \"@internal/app-binder//command/ProvideTLVTransactionInstructionDescriptorCommand\";\nimport { ProvideTLVDescriptorCommand } from \"@internal/app-binder/command/ProvideTLVDescriptorCommand\";\nimport { type SolanaAppErrorCodes } from \"@internal/app-binder/command/utils/SolanaApplicationErrors\";\nimport {\n DefaultSolanaMessageNormaliser,\n type SolanaMessageNormaliserConstructor,\n} from \"@internal/app-binder/services/utils/DefaultSolanaMessageNormaliser\";\n\nimport { type SolanaBuildContextResult } from \"./BuildTransactionContextTask\";\n\nexport const SWAP_MODE = \"test\";\n\nexport type ProvideSolanaTransactionContextTaskContext =\n SolanaBuildContextResult & {\n transactionBytes: Uint8Array;\n };\n\nexport class ProvideSolanaTransactionContextTask {\n constructor(\n private readonly api: InternalApi,\n private readonly context: ProvideSolanaTransactionContextTaskContext,\n private readonly normaliser: SolanaMessageNormaliserConstructor = DefaultSolanaMessageNormaliser,\n ) {}\n\n async run(): Promise<Maybe<CommandErrorResult<SolanaAppErrorCodes>>> {\n const {\n tlvDescriptor,\n trustedNamePKICertificate,\n loadersResults,\n transactionBytes,\n } = this.context;\n\n // --------------------------------------------------------------------\n // providing default solana context\n\n // send PKI certificate + signature\n await this.api.sendCommand(\n new LoadCertificateCommand({\n certificate: trustedNamePKICertificate.payload,\n keyUsage: trustedNamePKICertificate.keyUsageNumber,\n }),\n );\n\n // send signed descriptor\n await this.api.sendCommand(\n new ProvideTLVDescriptorCommand({ payload: tlvDescriptor }),\n );\n\n // --------------------------------------------------------------------\n // providing optional solana context via context module loaders results\n\n for (const loaderResult of loadersResults) {\n switch (loaderResult.type) {\n // always resolve SOLANA_TOKEN first\n case SolanaContextTypes.SOLANA_TOKEN: {\n const tokenMetadataResult = loadersResults.find(\n (res) => res.type === SolanaContextTypes.SOLANA_TOKEN,\n );\n if (tokenMetadataResult) {\n await this.provideTokenMetadataContext(tokenMetadataResult);\n }\n break;\n }\n\n case SolanaContextTypes.SOLANA_LIFI: {\n const lifiDescriptorListResult = loadersResults.find(\n (res) => res.type === SolanaContextTypes.SOLANA_LIFI,\n );\n if (lifiDescriptorListResult) {\n await this.provideSwapContext(\n lifiDescriptorListResult,\n transactionBytes,\n );\n }\n break;\n }\n\n case SolanaContextTypes.ERROR: {\n break;\n }\n\n default: {\n break;\n }\n }\n }\n\n return Nothing;\n }\n\n private async provideTokenMetadataContext(\n tokenMetadataResult: SolanaTokenContextSuccess,\n ): Promise<void> {\n const {\n payload: tokenMetadataPayload,\n certificate: tokenMetadataCertificate,\n } = tokenMetadataResult;\n\n if (tokenMetadataPayload && tokenMetadataCertificate) {\n // send token metadata certificate\n const tokenMetadataCertificateToDeviceResult = await this.api.sendCommand(\n new LoadCertificateCommand({\n certificate: tokenMetadataCertificate.payload,\n keyUsage: tokenMetadataCertificate.keyUsageNumber,\n }),\n );\n if (!isSuccessCommandResult(tokenMetadataCertificateToDeviceResult)) {\n // IMPORTANT, TO BE MAPPED TO LatestFirmwareVersionRequired(\"LatestFirmwareVersionRequired\") ERROR\n throw new Error(\n \"[SignerSolana] ProvideSolanaTransactionContextTask: Failed to send tokenMetadataCertificate to device, latest firmware version required\",\n );\n }\n\n // send token metadata signed descriptor\n await this.api.sendCommand(\n new ProvideTLVTransactionInstructionDescriptorCommand({\n kind: \"descriptor\",\n dataHex: tokenMetadataPayload.solanaTokenDescriptor.data,\n signatureHex: tokenMetadataPayload.solanaTokenDescriptor.signature,\n // token metadata is a single chunk, so this is always the first message\n isFirstMessage: true,\n swapSignatureTag: false,\n }),\n );\n }\n }\n\n private async provideSwapContext(\n lifiDescriptorListResult: SolanaLifiContextSuccess,\n transactionBytes: Uint8Array,\n ): Promise<void> {\n const lifiDescriptors = lifiDescriptorListResult.payload;\n\n if (lifiDescriptors) {\n const message = await this.normaliser.normaliseMessage(transactionBytes);\n\n for (const [\n index,\n instruction,\n ] of message.compiledInstructions.entries()) {\n const programId = message.allKeys[instruction.programIdIndex];\n const programIdStr = programId?.toBase58();\n const descriptor = programIdStr\n ? lifiDescriptors[programIdStr]\n : undefined;\n\n const sigHex = descriptor && descriptor.signatures[SWAP_MODE];\n\n if (descriptor && sigHex) {\n await this.api.sendCommand(\n new ProvideTLVTransactionInstructionDescriptorCommand({\n kind: \"descriptor\",\n dataHex: descriptor.data,\n signatureHex: sigHex,\n isFirstMessage: index === 0,\n swapSignatureTag: true,\n }),\n );\n } else {\n await this.api.sendCommand(\n new ProvideTLVTransactionInstructionDescriptorCommand({\n kind: \"empty\",\n isFirstMessage: index === 0,\n swapSignatureTag: true,\n }),\n );\n }\n }\n }\n }\n}\n"],
5
+ "mappings": "AAAA,OACE,sBAAAA,MAGK,2BACP,OAGE,0BAAAC,EACA,0BAAAC,MACK,kCACP,OAAqB,WAAAC,MAAe,YAEpC,OAAS,qDAAAC,MAAyD,kFAClE,OAAS,+BAAAC,MAAmC,2DAE5C,OACE,kCAAAC,MAEK,qEAIA,MAAMC,EAAY,OAOlB,MAAMC,CAAoC,CAC/C,YACmBC,EACAC,EACAC,EAAiDL,EAClE,CAHiB,SAAAG,EACA,aAAAC,EACA,gBAAAC,CAChB,CAEH,MAAM,KAA+D,CACnE,KAAM,CACJ,cAAAC,EACA,0BAAAC,EACA,eAAAC,EACA,iBAAAC,CACF,EAAI,KAAK,QAMT,MAAM,KAAK,IAAI,YACb,IAAIb,EAAuB,CACzB,YAAaW,EAA0B,QACvC,SAAUA,EAA0B,cACtC,CAAC,CACH,EAGA,MAAM,KAAK,IAAI,YACb,IAAIR,EAA4B,CAAE,QAASO,CAAc,CAAC,CAC5D,EAKA,UAAWI,KAAgBF,EACzB,OAAQE,EAAa,KAAM,CAEzB,KAAKhB,EAAmB,aAAc,CACpC,MAAMiB,EAAsBH,EAAe,KACxCI,GAAQA,EAAI,OAASlB,EAAmB,YAC3C,EACIiB,GACF,MAAM,KAAK,4BAA4BA,CAAmB,EAE5D,KACF,CAEA,KAAKjB,EAAmB,YAAa,CACnC,MAAMmB,EAA2BL,EAAe,KAC7CI,GAAQA,EAAI,OAASlB,EAAmB,WAC3C,EACImB,GACF,MAAM,KAAK,mBACTA,EACAJ,CACF,EAEF,KACF,CAEA,KAAKf,EAAmB,MACtB,MAGF,QACE,KAEJ,CAGF,OAAOG,CACT,CAEA,MAAc,4BACZc,EACe,CACf,KAAM,CACJ,QAASG,EACT,YAAaC,CACf,EAAIJ,EAEJ,GAAIG,GAAwBC,EAA0B,CAEpD,MAAMC,EAAyC,MAAM,KAAK,IAAI,YAC5D,IAAIpB,EAAuB,CACzB,YAAamB,EAAyB,QACtC,SAAUA,EAAyB,cACrC,CAAC,CACH,EACA,GAAI,CAACpB,EAAuBqB,CAAsC,EAEhE,MAAM,IAAI,MACR,yIACF,EAIF,MAAM,KAAK,IAAI,YACb,IAAIlB,EAAkD,CACpD,KAAM,aACN,QAASgB,EAAqB,sBAAsB,KACpD,aAAcA,EAAqB,sBAAsB,UAEzD,eAAgB,GAChB,iBAAkB,EACpB,CAAC,CACH,CACF,CACF,CAEA,MAAc,mBACZD,EACAJ,EACe,CACf,MAAMQ,EAAkBJ,EAAyB,QAEjD,GAAII,EAAiB,CACnB,MAAMC,EAAU,MAAM,KAAK,WAAW,iBAAiBT,CAAgB,EAEvE,SAAW,CACTU,EACAC,CACF,IAAKF,EAAQ,qBAAqB,QAAQ,EAAG,CAE3C,MAAMG,EADYH,EAAQ,QAAQE,EAAY,cAAc,GAC5B,SAAS,EACnCE,EAAaD,EACfJ,EAAgBI,CAAY,EAC5B,OAEEE,EAASD,GAAcA,EAAW,WAAWrB,CAAS,EAExDqB,GAAcC,EAChB,MAAM,KAAK,IAAI,YACb,IAAIzB,EAAkD,CACpD,KAAM,aACN,QAASwB,EAAW,KACpB,aAAcC,EACd,eAAgBJ,IAAU,EAC1B,iBAAkB,EACpB,CAAC,CACH,EAEA,MAAM,KAAK,IAAI,YACb,IAAIrB,EAAkD,CACpD,KAAM,QACN,eAAgBqB,IAAU,EAC1B,iBAAkB,EACpB,CAAC,CACH,CAEJ,CACF,CACF,CACF",
6
+ "names": ["SolanaContextTypes", "isSuccessCommandResult", "LoadCertificateCommand", "Nothing", "ProvideTLVTransactionInstructionDescriptorCommand", "ProvideTLVDescriptorCommand", "DefaultSolanaMessageNormaliser", "SWAP_MODE", "ProvideSolanaTransactionContextTask", "api", "context", "normaliser", "tlvDescriptor", "trustedNamePKICertificate", "loadersResults", "transactionBytes", "loaderResult", "tokenMetadataResult", "res", "lifiDescriptorListResult", "tokenMetadataPayload", "tokenMetadataCertificate", "tokenMetadataCertificateToDeviceResult", "lifiDescriptors", "message", "index", "instruction", "programIdStr", "descriptor", "sigHex"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{SolanaContextTypes as g}from"@ledgerhq/context-module";import{CommandResultFactory as j,LoadCertificateCommand as x}from"@ledgerhq/device-management-kit";import{ASSOCIATED_TOKEN_PROGRAM_ID as V,createAssociatedTokenAccountInstruction as W,createTransferInstruction as Y,getAssociatedTokenAddressSync as X,TOKEN_PROGRAM_ID as K}from"@solana/spl-token";import{Keypair as k,PublicKey as z,SystemProgram as N,Transaction as ee,TransactionInstruction as J,TransactionMessage as ae,VersionedTransaction as se}from"@solana/web3.js";import te from"bs58";import{Buffer as Q}from"buffer";import{Nothing as w}from"purify-ts";import{beforeEach as ne,describe as U,expect as e,it as f,vi as F}from"vitest";import{ProvideTLVDescriptorCommand as q}from"../../app-binder/command/ProvideTLVDescriptorCommand";import{ProvideTLVTransactionInstructionDescriptorCommand as B}from"../../app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand";import{DefaultSolanaMessageNormaliser as G}from"../../app-binder/services/utils/DefaultSolanaMessageNormaliser";import{ProvideSolanaTransactionContextTask as O,SWAP_MODE as R}from"./ProvideTransactionContextTask";const $=te.encode(new Uint8Array(32).fill(170));function oe(a,s,u){const l=u??s[0]??k.generate(),y=new ee;y.recentBlockhash=$,y.feePayer=l.publicKey,y.add(...a);const p=new Set,c=[l,...s].filter(t=>{const o=t.publicKey.toBase58();return p.has(o)?!1:(p.add(o),!0)});return y.sign(...c),{raw:y.serialize(),payer:l}}function Z(a,s,u){const l=u??s[0]??k.generate(),y=new ae({payerKey:l.publicKey,recentBlockhash:$,instructions:a}).compileToV0Message(),p=new se(y);return p.sign([l,...s]),{raw:p.serialize(),payer:l}}const S=a=>({toBase58:()=>a}),E=a=>({normaliseMessage:F.fn(async()=>a)});U("ProvideSolanaTransactionContextTask (merged)",()=>{let a;const s=j({data:void 0}),u={payload:new Uint8Array([240,202,204,26]),keyUsageNumber:1},l=new Uint8Array([170,187,204]),y={payload:new Uint8Array([240,202,204,26]),keyUsageNumber:2},p={data:"f0cacc1a",signature:"01020304"},c="f0cacc1a";ne(()=>{F.resetAllMocks(),a={sendCommand:F.fn()}}),U("basic context",()=>{f("sends PKI certificate then TLV descriptor and returns Nothing (no loaders results)",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s);const t={trustedNamePKICertificate:u,tlvDescriptor:l,loadersResults:[],transactionBytes:new Uint8Array([240])},m=await new O(a,t).run();e(a.sendCommand).toHaveBeenCalledTimes(2);const r=a.sendCommand.mock.calls[0][0];e(r).toBeInstanceOf(x),e(r.args.certificate).toStrictEqual(u.payload),e(r.args.keyUsage).toBe(u.keyUsageNumber);const i=a.sendCommand.mock.calls[1][0];e(i).toBeInstanceOf(q),e(i.args.payload).toStrictEqual(l),e(m).toStrictEqual(w)}),f("propagates a rejection thrown by InternalApi.sendCommand",async()=>{a.sendCommand.mockRejectedValueOnce(new Error("oupsy"));const t={trustedNamePKICertificate:u,tlvDescriptor:l,loadersResults:[],transactionBytes:new Uint8Array([202])},o=new O(a,t);await e(o.run()).rejects.toThrow("oupsy"),e(a.sendCommand).toHaveBeenCalledTimes(1)}),f("ignores SolanaContextTypes.ERROR entries (no extra APDUs beyond base context)",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s);const t=[{type:g.ERROR,error:{message:"err"}}],o={trustedNamePKICertificate:u,tlvDescriptor:l,loadersResults:t,transactionBytes:new Uint8Array([26])},r=await new O(a,o).run();e(r).toStrictEqual(w),e(a.sendCommand).toHaveBeenCalledTimes(2),e(a.sendCommand.mock.calls[0][0]).toBeInstanceOf(x),e(a.sendCommand.mock.calls[1][0]).toBeInstanceOf(q)})}),U("basic context + token",()=>{f("when token metadata present, sends token certificate then TLV transaction-instruction descriptor",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s);const t=[{type:g.SOLANA_TOKEN,payload:{solanaTokenDescriptor:p},certificate:y}],o={trustedNamePKICertificate:u,tlvDescriptor:l,loadersResults:t,transactionBytes:new Uint8Array([26])},r=await new O(a,o).run();e(a.sendCommand).toHaveBeenCalledTimes(4);const i=a.sendCommand.mock.calls[2][0];e(i).toBeInstanceOf(x),e(i.args.certificate).toStrictEqual(y.payload),e(i.args.keyUsage).toBe(y.keyUsageNumber);const d=a.sendCommand.mock.calls[3][0];e(d).toBeInstanceOf(B),e(d.args.kind).toBe("descriptor"),e(d.args.dataHex).toBe(p.data),e(d.args.signatureHex).toBe(p.signature),e(d.args.isFirstMessage).toBe(!0),e(d.args.swapSignatureTag).toBe(!1),e(r).toStrictEqual(w)}),f("does not send token commands if token payload is missing",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s);const t=[{type:g.SOLANA_TOKEN,payload:void 0,certificate:y}],o={trustedNamePKICertificate:u,tlvDescriptor:l,loadersResults:t,transactionBytes:new Uint8Array([240])},r=await new O(a,o).run();e(a.sendCommand).toHaveBeenCalledTimes(2),e(r).toStrictEqual(w)}),f("does not send token commands if token certificate is missing",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s);const t=[{type:g.SOLANA_TOKEN,payload:{solanaTokenDescriptor:p},certificate:void 0}],o={trustedNamePKICertificate:u,tlvDescriptor:l,loadersResults:t,transactionBytes:new Uint8Array([202])},r=await new O(a,o).run();e(a.sendCommand).toHaveBeenCalledTimes(2),e(r).toStrictEqual(w)}),f("throws a mapped error when sending token certificate returns a CommandErrorResult",async()=>{const t=j({error:{_tag:"SomeError",errorCode:27264,message:"bad"}});a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(t);const o=[{type:g.SOLANA_TOKEN,payload:{solanaTokenDescriptor:p},certificate:y}],m={trustedNamePKICertificate:u,tlvDescriptor:l,loadersResults:o,transactionBytes:new Uint8Array([204])},r=new O(a,m);await e(r.run()).rejects.toThrow("[SignerSolana] ProvideSolanaTransactionContextTask: Failed to send tokenMetadataCertificate to device, latest firmware version required"),e(a.sendCommand).toHaveBeenCalledTimes(3);const i=a.sendCommand.mock.calls[2][0];e(i).toBeInstanceOf(x)}),f("does not send swap APDUs when SOLANA_LIFI context is missing (token present)",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s);const t=[{type:g.SOLANA_TOKEN,payload:{solanaTokenDescriptor:p},certificate:y}],o={trustedNamePKICertificate:u,tlvDescriptor:l,loadersResults:t,transactionBytes:new Uint8Array([26])},r=await new O(a,o,{normaliseMessage:F.fn()}).run();e(r).toStrictEqual(w),e(a.sendCommand).toHaveBeenCalledTimes(4),e(a.sendCommand.mock.calls[0][0]).toBeInstanceOf(x),e(a.sendCommand.mock.calls[1][0]).toBeInstanceOf(q),e(a.sendCommand.mock.calls[2][0]).toBeInstanceOf(x);const i=a.sendCommand.mock.calls[3][0];e(i).toBeInstanceOf(B),e(i.args.swapSignatureTag).toBe(!1),e(i.args.isFirstMessage).toBe(!0)})}),U("basic context + token + lifi",()=>{f("sends one APDU per instruction in order (descriptor/empty/descriptor) after base + token are sent",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValue(s);const t={compiledInstructions:[{programIdIndex:0},{programIdIndex:1},{programIdIndex:2}],allKeys:[S("A_PID"),S("B_PID"),S("C_PID")]},o=E(t),m=[{type:g.SOLANA_TOKEN,payload:{solanaTokenDescriptor:p},certificate:y},{type:g.SOLANA_LIFI,payload:{A_PID:{data:c,signatures:{[R]:c}},C_PID:{data:c,signatures:{[R]:c}}}}],r={trustedNamePKICertificate:u,tlvDescriptor:l,loadersResults:m,transactionBytes:new Uint8Array([240])},d=await new O(a,r,o).run();e(d).toStrictEqual(w),e(a.sendCommand).toHaveBeenCalledTimes(7);const n=a.sendCommand.mock.calls[4][0];e(n).toBeInstanceOf(B),e(n.args.kind).toBe("descriptor"),e(n.args.dataHex).toBe(c),e(n.args.signatureHex).toBe(c),e(n.args.isFirstMessage).toBe(!0),e(n.args.swapSignatureTag).toBe(!0);const T=a.sendCommand.mock.calls[5][0];e(T).toBeInstanceOf(B),e(T.args.kind).toBe("empty"),e(T.args.isFirstMessage).toBe(!1),e(T.args.swapSignatureTag).toBe(!0);const A=a.sendCommand.mock.calls[6][0];e(A).toBeInstanceOf(B),e(A.args.kind).toBe("descriptor"),e(A.args.dataHex).toBe(c),e(A.args.signatureHex).toBe(c),e(A.args.isFirstMessage).toBe(!1),e(A.args.swapSignatureTag).toBe(!0),e(o.normaliseMessage).toHaveBeenCalledOnce()}),f("sends empty when descriptor exists but signatures[SWAP_MODE] is missing",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValue(s);const t={compiledInstructions:[{programIdIndex:0}],allKeys:[S("ONLY_PID")]},o=E(t),m=[{type:g.SOLANA_TOKEN,payload:{solanaTokenDescriptor:p},certificate:y},{type:g.SOLANA_LIFI,payload:{ONLY_PID:{data:c,signatures:{}}}}],r={trustedNamePKICertificate:u,tlvDescriptor:l,loadersResults:m,transactionBytes:new Uint8Array([202])},d=await new O(a,r,o).run();e(d).toStrictEqual(w),e(a.sendCommand).toHaveBeenCalledTimes(5);const n=a.sendCommand.mock.calls[4][0];e(n).toBeInstanceOf(B),e(n.args.kind).toBe("empty"),e(n.args.isFirstMessage).toBe(!0),e(n.args.swapSignatureTag).toBe(!0)}),f("sends empty when programId is missing for an instruction",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValue(s);const t={compiledInstructions:[{programIdIndex:5}],allKeys:[S("X")]},o=E(t),m=[{type:g.SOLANA_TOKEN,payload:{solanaTokenDescriptor:p},certificate:y},{type:g.SOLANA_LIFI,payload:{}}],r={trustedNamePKICertificate:u,tlvDescriptor:l,loadersResults:m,transactionBytes:new Uint8Array([204])},d=await new O(a,r,o).run();e(d).toStrictEqual(w),e(a.sendCommand).toHaveBeenCalledTimes(5);const n=a.sendCommand.mock.calls[4][0];e(n).toBeInstanceOf(B),e(n.args.kind).toBe("empty"),e(n.args.isFirstMessage).toBe(!0),e(n.args.swapSignatureTag).toBe(!0)}),f("propagates a rejection thrown by InternalApi.sendCommand on the second swap APDU (after base + token succeed)",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockRejectedValueOnce(new Error("err"));const t={compiledInstructions:[{programIdIndex:0},{programIdIndex:1},{programIdIndex:2}],allKeys:[S("A_PID"),S("B_PID"),S("C_PID")]},o=E(t),m=[{type:g.SOLANA_TOKEN,payload:{solanaTokenDescriptor:p},certificate:y},{type:g.SOLANA_LIFI,payload:{A_PID:{data:c,signatures:{[R]:c}},C_PID:{data:c,signatures:{[R]:c}}}}],r={trustedNamePKICertificate:u,tlvDescriptor:l,loadersResults:m,transactionBytes:new Uint8Array([26])},i=new O(a,r,o);await e(i.run()).rejects.toThrow("err"),e(a.sendCommand).toHaveBeenCalledTimes(6);const d=a.sendCommand.mock.calls[4][0];e(d).toBeInstanceOf(B),e(d.args.kind).toBe("descriptor"),e(d.args.isFirstMessage).toBe(!0),e(d.args.swapSignatureTag).toBe(!0);const n=a.sendCommand.mock.calls[5][0];e(n).toBeInstanceOf(B),e(n.args.kind).toBe("empty"),e(n.args.isFirstMessage).toBe(!1),e(n.args.swapSignatureTag).toBe(!0)}),f("uses signatures[SWAP_MODE] specifically when present",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValue(s);const t={compiledInstructions:[{programIdIndex:0}],allKeys:[S("SIG_PID")]},o=E(t),m=[{type:g.SOLANA_TOKEN,payload:{solanaTokenDescriptor:p},certificate:y},{type:g.SOLANA_LIFI,payload:{SIG_PID:{data:c,signatures:{prod:"deadbeef",[R]:c}}}}],r={trustedNamePKICertificate:u,tlvDescriptor:l,loadersResults:m,transactionBytes:new Uint8Array([240])},d=await new O(a,r,o).run();e(d).toStrictEqual(w),e(a.sendCommand).toHaveBeenCalledTimes(5);const n=a.sendCommand.mock.calls[4][0];e(n).toBeInstanceOf(B),e(n.args.kind).toBe("descriptor"),e(n.args.dataHex).toBe(c),e(n.args.signatureHex).toBe(c),e(n.args.isFirstMessage).toBe(!0),e(n.args.swapSignatureTag).toBe(!0)}),f("parses a real *legacy* tx via DefaultSolanaMessageNormaliser and preserves APDU order (descriptor, empty, descriptor) after base + token",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValue(s);const t=k.generate(),o=k.generate().publicKey,m=N.transfer({fromPubkey:t.publicKey,toPubkey:o,lamports:1234}),r=k.generate(),i=k.generate().publicKey,d=k.generate().publicKey,n=Y(i,d,r.publicKey,42n,[],K),T=new z("MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr"),A=new J({programId:T,keys:[],data:Q.from("hi")}),{raw:P}=oe([m,n,A],[t,r],t),D=N.programId.toBase58(),_=T.toBase58(),b=[{type:g.SOLANA_TOKEN,payload:{solanaTokenDescriptor:p},certificate:y},{type:g.SOLANA_LIFI,payload:{[D]:{data:c,signatures:{[R]:c}},[_]:{data:c,signatures:{[R]:c}}}}],M={trustedNamePKICertificate:u,tlvDescriptor:l,loadersResults:b,transactionBytes:P},L=await new O(a,M,G).run();e(L).toStrictEqual(w),e(a.sendCommand).toHaveBeenCalledTimes(7);const v=a.sendCommand.mock.calls[4][0];e(v.args.kind).toBe("descriptor"),e(v.args.isFirstMessage).toBe(!0),e(v.args.swapSignatureTag).toBe(!0);const I=a.sendCommand.mock.calls[5][0];e(I.args.kind).toBe("empty"),e(I.args.isFirstMessage).toBe(!1),e(I.args.swapSignatureTag).toBe(!0);const C=a.sendCommand.mock.calls[6][0];e(C.args.kind).toBe("descriptor"),e(C.args.isFirstMessage).toBe(!1),e(C.args.swapSignatureTag).toBe(!0)}),f("parses a real *v0* tx via DefaultSolanaMessageNormaliser (no ALTs) and preserves APDU order (descriptor, descriptor, empty) after base + token",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValue(s);const t=k.generate(),o=k.generate().publicKey,m=N.transfer({fromPubkey:t.publicKey,toPubkey:o,lamports:5678}),r=k.generate().publicKey,i=k.generate().publicKey,d=X(i,r,!0,K,V),n=W(t.publicKey,d,r,i,K,V),T=new z("MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr"),A=new J({programId:T,keys:[],data:Q.from("hello")}),{raw:P}=Z([m,n,A],[],t),D=N.programId.toBase58(),_=V.toBase58(),b=[{type:g.SOLANA_TOKEN,payload:{solanaTokenDescriptor:p},certificate:y},{type:g.SOLANA_LIFI,payload:{[D]:{data:c,signatures:{[R]:c}},[_]:{data:c,signatures:{[R]:c}}}}],M={trustedNamePKICertificate:u,tlvDescriptor:l,loadersResults:b,transactionBytes:P},L=await new O(a,M,G).run();e(L).toEqual(w),e(a.sendCommand).toHaveBeenCalledTimes(7);const v=a.sendCommand.mock.calls[4][0];e(v).toBeInstanceOf(B),e(v.args.kind).toBe("descriptor"),e(v.args.isFirstMessage).toBe(!0),e(v.args.swapSignatureTag).toBe(!0);const I=a.sendCommand.mock.calls[5][0];e(I).toBeInstanceOf(B),e(I.args.kind).toBe("descriptor"),e(I.args.isFirstMessage).toBe(!1),e(I.args.swapSignatureTag).toBe(!0);const C=a.sendCommand.mock.calls[6][0];e(C).toBeInstanceOf(B),e(C.args.kind).toBe("empty"),e(C.args.isFirstMessage).toBe(!1),e(C.args.swapSignatureTag).toBe(!0)}),f("parses a real *v0* tx via DefaultSolanaMessageNormaliser and preserves APDU order System, createATA, token transfer (descriptor, descriptor, empty) after base + token",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValue(s);const t=k.generate(),o=k.generate().publicKey,m=N.transfer({fromPubkey:t.publicKey,toPubkey:o,lamports:7777}),r=k.generate(),i=k.generate().publicKey,d=k.generate().publicKey,n=X(i,d,!0,K,V),T=W(t.publicKey,n,d,i,K,V),A=k.generate().publicKey,P=Y(A,n,r.publicKey,9n,[],K),{raw:D}=Z([m,T,P],[r],t),_=N.programId.toBase58(),b=V.toBase58(),M=[{type:g.SOLANA_TOKEN,payload:{solanaTokenDescriptor:p},certificate:y},{type:g.SOLANA_LIFI,payload:{[_]:{data:c,signatures:{[R]:c}},[b]:{data:c,signatures:{[R]:c}}}}],h={trustedNamePKICertificate:u,tlvDescriptor:l,loadersResults:M,transactionBytes:D},v=await new O(a,h,G).run();e(v).toEqual(w),e(a.sendCommand).toHaveBeenCalledTimes(7);const I=a.sendCommand.mock.calls[4][0];e(I).toBeInstanceOf(B),e(I.args.kind).toBe("descriptor"),e(I.args.isFirstMessage).toBe(!0),e(I.args.swapSignatureTag).toBe(!0);const C=a.sendCommand.mock.calls[5][0];e(C).toBeInstanceOf(B),e(C.args.kind).toBe("descriptor"),e(C.args.isFirstMessage).toBe(!1),e(C.args.swapSignatureTag).toBe(!0);const H=a.sendCommand.mock.calls[6][0];e(H).toBeInstanceOf(B),e(H.args.kind).toBe("empty"),e(H.args.isFirstMessage).toBe(!1),e(H.args.swapSignatureTag).toBe(!0)})})});
2
+ //# sourceMappingURL=ProvideTransactionContextTask.test.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../src/internal/app-binder/task/ProvideTransactionContextTask.test.ts"],
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-unsafe-assignment */\n/* eslint-disable @typescript-eslint/no-explicit-any */\n/* eslint-disable @typescript-eslint/require-await */\n/* eslint-disable @typescript-eslint/no-unsafe-return */\n\nimport { SolanaContextTypes } from \"@ledgerhq/context-module\";\nimport {\n CommandResultFactory,\n LoadCertificateCommand,\n} from \"@ledgerhq/device-management-kit\";\nimport {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n createAssociatedTokenAccountInstruction,\n createTransferInstruction,\n getAssociatedTokenAddressSync,\n TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport {\n Keypair,\n PublicKey,\n SystemProgram,\n Transaction,\n TransactionInstruction,\n TransactionMessage,\n VersionedTransaction,\n} from \"@solana/web3.js\";\nimport bs58 from \"bs58\";\nimport { Buffer } from \"buffer\";\nimport { Nothing } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, type Mock, vi } from \"vitest\";\n\nimport { ProvideTLVDescriptorCommand } from \"@internal/app-binder/command/ProvideTLVDescriptorCommand\";\nimport { ProvideTLVTransactionInstructionDescriptorCommand } from \"@internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand\";\nimport { DefaultSolanaMessageNormaliser } from \"@internal/app-binder/services/utils/DefaultSolanaMessageNormaliser\";\n\nimport {\n ProvideSolanaTransactionContextTask,\n SWAP_MODE,\n} from \"./ProvideTransactionContextTask\";\n\nconst DUMMY_BLOCKHASH = bs58.encode(new Uint8Array(32).fill(0xaa));\n\nfunction makeSignedRawLegacy(\n ixs: TransactionInstruction[],\n signers: Keypair[],\n feePayer?: Keypair,\n) {\n const payer = feePayer ?? signers[0] ?? Keypair.generate();\n const tx = new Transaction();\n tx.recentBlockhash = DUMMY_BLOCKHASH;\n tx.feePayer = payer.publicKey;\n tx.add(...ixs);\n const seen = new Set<string>();\n const uniq = [payer, ...signers].filter((kp) => {\n const k = kp.publicKey.toBase58();\n if (seen.has(k)) return false;\n seen.add(k);\n return true;\n });\n tx.sign(...uniq);\n return { raw: tx.serialize(), payer };\n}\n\nfunction makeSignedRawV0(\n ixs: TransactionInstruction[],\n signers: Keypair[],\n feePayer?: Keypair,\n) {\n const payer = feePayer ?? signers[0] ?? Keypair.generate();\n const messageV0 = new TransactionMessage({\n payerKey: payer.publicKey,\n recentBlockhash: DUMMY_BLOCKHASH,\n instructions: ixs,\n }).compileToV0Message(); // no ALTs -> offline-safe\n\n const vtx = new VersionedTransaction(messageV0);\n vtx.sign([payer, ...signers]);\n return { raw: vtx.serialize(), payer };\n}\n\nconst makeKey = (base58: string) => ({ toBase58: () => base58 });\n\nconst buildNormaliser = (message: any) =>\n ({\n normaliseMessage: vi.fn(async () => message),\n }) as const;\n\ndescribe(\"ProvideSolanaTransactionContextTask (merged)\", () => {\n let api: { sendCommand: Mock };\n const success = CommandResultFactory({ data: undefined });\n\n const baseCert = {\n payload: new Uint8Array([0xf0, 0xca, 0xcc, 0x1a]),\n keyUsageNumber: 1,\n } as const;\n const tlvDescriptor = new Uint8Array([0xaa, 0xbb, 0xcc]);\n\n const tokenCert = {\n payload: new Uint8Array([0xf0, 0xca, 0xcc, 0x1a]),\n keyUsageNumber: 2,\n } as const;\n\n const tokenDescriptor = {\n data: \"f0cacc1a\",\n signature: \"01020304\",\n } as const;\n\n const SIG = \"f0cacc1a\";\n\n beforeEach(() => {\n vi.resetAllMocks();\n api = {\n sendCommand: vi.fn(),\n };\n });\n\n // basic context\n describe(\"basic context\", () => {\n it(\"sends PKI certificate then TLV descriptor and returns Nothing (no loaders results)\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // LoadCertificateCommand (trusted name PKI)\n .mockResolvedValueOnce(success); // ProvideTLVDescriptorCommand\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults: [],\n transactionBytes: new Uint8Array([0xf0]), // unused in this path\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n );\n\n // when\n const result = await task.run();\n\n // then\n expect(api.sendCommand).toHaveBeenCalledTimes(2);\n\n const first = api.sendCommand.mock.calls[0]![0]!;\n expect(first).toBeInstanceOf(LoadCertificateCommand);\n expect(first.args.certificate).toStrictEqual(baseCert.payload);\n expect(first.args.keyUsage).toBe(baseCert.keyUsageNumber);\n\n const second = api.sendCommand.mock.calls[1]![0]!;\n expect(second).toBeInstanceOf(ProvideTLVDescriptorCommand);\n expect(second.args.payload).toStrictEqual(tlvDescriptor);\n\n expect(result).toStrictEqual(Nothing);\n });\n\n it(\"propagates a rejection thrown by InternalApi.sendCommand\", async () => {\n // given\n api.sendCommand.mockRejectedValueOnce(new Error(\"oupsy\"));\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults: [],\n transactionBytes: new Uint8Array([0xca]),\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n );\n\n await expect(task.run()).rejects.toThrow(\"oupsy\");\n expect(api.sendCommand).toHaveBeenCalledTimes(1);\n });\n\n it(\"ignores SolanaContextTypes.ERROR entries (no extra APDUs beyond base context)\", async () => {\n // given: include an ERROR loader which should be ignored\n api.sendCommand\n .mockResolvedValueOnce(success) // PKI\n .mockResolvedValueOnce(success); // TLV\n\n const loadersResults = [\n { type: SolanaContextTypes.ERROR, error: { message: \"err\" } as any },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0x1a]),\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n );\n\n const result = await task.run();\n\n expect(result).toStrictEqual(Nothing);\n expect(api.sendCommand).toHaveBeenCalledTimes(2);\n expect(api.sendCommand.mock.calls[0]![0]!).toBeInstanceOf(\n LoadCertificateCommand,\n );\n expect(api.sendCommand.mock.calls[1]![0]!).toBeInstanceOf(\n ProvideTLVDescriptorCommand,\n );\n });\n });\n\n // basic context + token metadata\n\n describe(\"basic context + token\", () => {\n it(\"when token metadata present, sends token certificate then TLV transaction-instruction descriptor\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI certificate\n .mockResolvedValueOnce(success) // TLV descriptor\n .mockResolvedValueOnce(success) // token metadata certificate\n .mockResolvedValueOnce(success); // token descriptor via TLVTransactionInstructionDescriptor\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: {\n solanaTokenDescriptor: tokenDescriptor,\n },\n certificate: tokenCert,\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0x1a]), // unused in this path\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n );\n\n // when\n const result = await task.run();\n\n // then\n expect(api.sendCommand).toHaveBeenCalledTimes(4);\n\n const third = api.sendCommand.mock.calls[2]![0]!;\n expect(third).toBeInstanceOf(LoadCertificateCommand);\n expect(third.args.certificate).toStrictEqual(tokenCert.payload);\n expect(third.args.keyUsage).toBe(tokenCert.keyUsageNumber);\n\n const fourth = api.sendCommand.mock.calls[3]![0]!;\n expect(fourth).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(fourth.args.kind).toBe(\"descriptor\");\n expect(fourth.args.dataHex).toBe(tokenDescriptor.data);\n expect(fourth.args.signatureHex).toBe(tokenDescriptor.signature);\n expect(fourth.args.isFirstMessage).toBe(true);\n expect(fourth.args.swapSignatureTag).toBe(false);\n\n expect(result).toStrictEqual(Nothing);\n });\n\n it(\"does not send token commands if token payload is missing\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // PKI\n .mockResolvedValueOnce(success); // TLV\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: undefined,\n certificate: tokenCert,\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0xf0]),\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n );\n\n // when\n const result = await task.run();\n\n // then\n expect(api.sendCommand).toHaveBeenCalledTimes(2);\n expect(result).toStrictEqual(Nothing);\n });\n\n it(\"does not send token commands if token certificate is missing\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // PKI\n .mockResolvedValueOnce(success); // TLV\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: undefined,\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0xca]),\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n );\n\n // when\n const result = await task.run();\n\n // then\n expect(api.sendCommand).toHaveBeenCalledTimes(2);\n expect(result).toStrictEqual(Nothing);\n });\n\n it(\"throws a mapped error when sending token certificate returns a CommandErrorResult\", async () => {\n // given\n const errorResult = CommandResultFactory({\n error: { _tag: \"SomeError\", errorCode: 0x6a80, message: \"bad\" },\n });\n\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(errorResult); // token certificate -> error\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0xcc]),\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n );\n\n // when + then\n await expect(task.run()).rejects.toThrow(\n \"[SignerSolana] ProvideSolanaTransactionContextTask: Failed to send tokenMetadataCertificate to device, latest firmware version required\",\n );\n\n // ensure the TLVTransactionInstructionDescriptor was NOT attempted\n expect(api.sendCommand).toHaveBeenCalledTimes(3);\n const third = api.sendCommand.mock.calls[2]![0]!;\n expect(third).toBeInstanceOf(LoadCertificateCommand);\n });\n\n it(\"does not send swap APDUs when SOLANA_LIFI context is missing (token present)\", async () => {\n // given: base + token succeed, but no LIFI in loadersResults\n api.sendCommand\n .mockResolvedValueOnce(success) // PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(success) // token cert\n .mockResolvedValueOnce(success); // token TLVTransactionInstructionDescriptor\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n // no SOLANA_LIFI entry\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0x1a]),\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n { normaliseMessage: vi.fn() } as any,\n );\n\n const result = await task.run();\n\n expect(result).toStrictEqual(Nothing);\n // 2 base + 2 token only\n expect(api.sendCommand).toHaveBeenCalledTimes(4);\n expect(api.sendCommand.mock.calls[0]![0]!).toBeInstanceOf(\n LoadCertificateCommand,\n );\n expect(api.sendCommand.mock.calls[1]![0]!).toBeInstanceOf(\n ProvideTLVDescriptorCommand,\n );\n expect(api.sendCommand.mock.calls[2]![0]!).toBeInstanceOf(\n LoadCertificateCommand,\n );\n const tokenCmd = api.sendCommand.mock.calls[3]![0]!;\n expect(tokenCmd).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(tokenCmd.args.swapSignatureTag).toBe(false);\n expect(tokenCmd.args.isFirstMessage).toBe(true);\n });\n });\n\n // basic context + token + lifi (swap)\n describe(\"basic context + token + lifi\", () => {\n it(\"sends one APDU per instruction in order (descriptor/empty/descriptor) after base + token are sent\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(success) // token cert\n .mockResolvedValueOnce(success) // token TLVTransactionInstructionDescriptor\n .mockResolvedValue(success); // swap APDUs\n\n const message = {\n compiledInstructions: [\n { programIdIndex: 0 },\n { programIdIndex: 1 },\n { programIdIndex: 2 },\n ],\n allKeys: [makeKey(\"A_PID\"), makeKey(\"B_PID\"), makeKey(\"C_PID\")],\n };\n const normaliser = buildNormaliser(message);\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n {\n type: SolanaContextTypes.SOLANA_LIFI,\n payload: {\n A_PID: { data: SIG, signatures: { [SWAP_MODE]: SIG } },\n // B missing -> empty\n C_PID: { data: SIG, signatures: { [SWAP_MODE]: SIG } },\n },\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0xf0]),\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n normaliser as any,\n );\n\n // when\n const result = await task.run();\n\n // then\n expect(result).toStrictEqual(Nothing);\n // 2 base + 2 token + 3 swap\n expect(api.sendCommand).toHaveBeenCalledTimes(7);\n\n // swap calls start at index 4\n const c0 = api.sendCommand.mock.calls[4]![0]!;\n expect(c0).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c0.args.kind).toBe(\"descriptor\");\n expect(c0.args.dataHex).toBe(SIG);\n expect(c0.args.signatureHex).toBe(SIG);\n expect(c0.args.isFirstMessage).toBe(true);\n expect(c0.args.swapSignatureTag).toBe(true);\n\n const c1 = api.sendCommand.mock.calls[5]![0]!;\n expect(c1).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c1.args.kind).toBe(\"empty\");\n expect(c1.args.isFirstMessage).toBe(false);\n expect(c1.args.swapSignatureTag).toBe(true);\n\n const c2 = api.sendCommand.mock.calls[6]![0]!;\n expect(c2).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c2.args.kind).toBe(\"descriptor\");\n expect(c2.args.dataHex).toBe(SIG);\n expect(c2.args.signatureHex).toBe(SIG);\n expect(c2.args.isFirstMessage).toBe(false);\n expect(c2.args.swapSignatureTag).toBe(true);\n\n expect((normaliser as any).normaliseMessage).toHaveBeenCalledOnce();\n });\n\n it(\"sends empty when descriptor exists but signatures[SWAP_MODE] is missing\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(success) // token cert\n .mockResolvedValueOnce(success) // token TLVTransactionInstructionDescriptor\n .mockResolvedValue(success);\n\n const message = {\n compiledInstructions: [{ programIdIndex: 0 }],\n allKeys: [makeKey(\"ONLY_PID\")],\n };\n const normaliser = buildNormaliser(message);\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n {\n type: SolanaContextTypes.SOLANA_LIFI,\n payload: {\n ONLY_PID: {\n data: SIG,\n signatures: {\n // no [SWAP_MODE] key\n },\n },\n },\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0xca]),\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n normaliser as any,\n );\n\n const result = await task.run();\n\n expect(result).toStrictEqual(Nothing);\n // 2 base + 2 token + 1 swap\n expect(api.sendCommand).toHaveBeenCalledTimes(5);\n\n const c0 = api.sendCommand.mock.calls[4]![0]!;\n expect(c0).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c0.args.kind).toBe(\"empty\");\n expect(c0.args.isFirstMessage).toBe(true);\n expect(c0.args.swapSignatureTag).toBe(true);\n });\n\n it(\"sends empty when programId is missing for an instruction\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(success) // token cert\n .mockResolvedValueOnce(success) // token TLVTransactionInstructionDescriptor\n .mockResolvedValue(success);\n\n const message = {\n compiledInstructions: [{ programIdIndex: 5 }], // out-of-range\n allKeys: [makeKey(\"X\")],\n };\n const normaliser = buildNormaliser(message);\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n { type: SolanaContextTypes.SOLANA_LIFI, payload: {} },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0xcc]),\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n normaliser as any,\n );\n\n const result = await task.run();\n\n expect(result).toStrictEqual(Nothing);\n // 2 base + 2 token + 1 swap\n expect(api.sendCommand).toHaveBeenCalledTimes(5);\n\n const c0 = api.sendCommand.mock.calls[4]![0]!;\n expect(c0).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c0.args.kind).toBe(\"empty\");\n expect(c0.args.isFirstMessage).toBe(true);\n expect(c0.args.swapSignatureTag).toBe(true);\n });\n\n it(\"propagates a rejection thrown by InternalApi.sendCommand on the second swap APDU (after base + token succeed)\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(success) // token cert\n .mockResolvedValueOnce(success) // token TLVTransactionInstructionDescriptor\n .mockResolvedValueOnce(success) // 1st swap ok\n .mockRejectedValueOnce(new Error(\"err\")); // 2nd swap fails\n\n const message = {\n compiledInstructions: [\n { programIdIndex: 0 }, // descriptor\n { programIdIndex: 1 }, // empty -> rejects\n { programIdIndex: 2 }, // not reached\n ],\n allKeys: [makeKey(\"A_PID\"), makeKey(\"B_PID\"), makeKey(\"C_PID\")],\n };\n const normaliser = buildNormaliser(message);\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n {\n type: SolanaContextTypes.SOLANA_LIFI,\n payload: {\n A_PID: { data: SIG, signatures: { [SWAP_MODE]: SIG } },\n // B missing -> empty\n C_PID: { data: SIG, signatures: { [SWAP_MODE]: SIG } },\n },\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0x1a]),\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n normaliser as any,\n );\n\n await expect(task.run()).rejects.toThrow(\"err\");\n // 2 base + 2 token + 2 swap (failed on 2nd)\n expect(api.sendCommand).toHaveBeenCalledTimes(6);\n\n const c0 = api.sendCommand.mock.calls[4]![0]!;\n expect(c0).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c0.args.kind).toBe(\"descriptor\");\n expect(c0.args.isFirstMessage).toBe(true);\n expect(c0.args.swapSignatureTag).toBe(true);\n\n const c1 = api.sendCommand.mock.calls[5]![0]!;\n expect(c1).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c1.args.kind).toBe(\"empty\");\n expect(c1.args.isFirstMessage).toBe(false);\n expect(c1.args.swapSignatureTag).toBe(true);\n });\n\n it(\"uses signatures[SWAP_MODE] specifically when present\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(success) // token cert\n .mockResolvedValueOnce(success) // token TLVTransactionInstructionDescriptor\n .mockResolvedValue(success);\n\n const message = {\n compiledInstructions: [{ programIdIndex: 0 }],\n allKeys: [makeKey(\"SIG_PID\")],\n };\n const normaliser = buildNormaliser(message);\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n {\n type: SolanaContextTypes.SOLANA_LIFI,\n payload: {\n SIG_PID: {\n data: SIG,\n signatures: { prod: \"deadbeef\", [SWAP_MODE]: SIG },\n },\n },\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: new Uint8Array([0xf0]),\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n normaliser as any,\n );\n\n const result = await task.run();\n\n expect(result).toStrictEqual(Nothing);\n // 2 base + 2 token + 1 swap\n expect(api.sendCommand).toHaveBeenCalledTimes(5);\n\n const c0 = api.sendCommand.mock.calls[4]![0]!;\n expect(c0).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c0.args.kind).toBe(\"descriptor\");\n expect(c0.args.dataHex).toBe(SIG);\n expect(c0.args.signatureHex).toBe(SIG);\n expect(c0.args.isFirstMessage).toBe(true);\n expect(c0.args.swapSignatureTag).toBe(true);\n });\n\n it(\"parses a real *legacy* tx via DefaultSolanaMessageNormaliser and preserves APDU order (descriptor, empty, descriptor) after base + token\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(success) // token cert\n .mockResolvedValueOnce(success) // token TLVTransactionInstructionDescriptor\n .mockResolvedValue(success);\n\n const payer = Keypair.generate();\n const dest1 = Keypair.generate().publicKey;\n const ix1 = SystemProgram.transfer({\n fromPubkey: payer.publicKey,\n toPubkey: dest1,\n lamports: 1234,\n });\n\n const owner = Keypair.generate();\n const srcToken = Keypair.generate().publicKey;\n const dstToken = Keypair.generate().publicKey;\n const ix2 = createTransferInstruction(\n srcToken,\n dstToken,\n owner.publicKey,\n 42n,\n [],\n TOKEN_PROGRAM_ID,\n );\n\n const MEMO_PROGRAM_ID = new PublicKey(\n \"MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr\",\n );\n const ix3 = new TransactionInstruction({\n programId: MEMO_PROGRAM_ID,\n keys: [],\n data: Buffer.from(\"hi\"),\n });\n\n const { raw } = makeSignedRawLegacy(\n [ix1, ix2, ix3],\n [payer, owner],\n payer,\n );\n\n const SYSTEM_PID = SystemProgram.programId.toBase58();\n const MEMO_PID = MEMO_PROGRAM_ID.toBase58();\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n {\n type: SolanaContextTypes.SOLANA_LIFI,\n payload: {\n [SYSTEM_PID]: { data: SIG, signatures: { [SWAP_MODE]: SIG } },\n // Tokenkeg missing -> empty\n [MEMO_PID]: { data: SIG, signatures: { [SWAP_MODE]: SIG } },\n },\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: raw,\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as unknown as any,\n context as any,\n DefaultSolanaMessageNormaliser as any,\n );\n\n const result = await task.run();\n\n expect(result).toStrictEqual(Nothing);\n // 2 base + 2 token + 3 swap\n expect(api.sendCommand).toHaveBeenCalledTimes(7);\n\n const c0 = api.sendCommand.mock.calls[4]![0]!;\n expect(c0.args.kind).toBe(\"descriptor\");\n expect(c0.args.isFirstMessage).toBe(true);\n expect(c0.args.swapSignatureTag).toBe(true);\n\n const c1 = api.sendCommand.mock.calls[5]![0]!;\n expect(c1.args.kind).toBe(\"empty\");\n expect(c1.args.isFirstMessage).toBe(false);\n expect(c1.args.swapSignatureTag).toBe(true);\n\n const c2 = api.sendCommand.mock.calls[6]![0]!;\n expect(c2.args.kind).toBe(\"descriptor\");\n expect(c2.args.isFirstMessage).toBe(false);\n expect(c2.args.swapSignatureTag).toBe(true);\n });\n\n it(\"parses a real *v0* tx via DefaultSolanaMessageNormaliser (no ALTs) and preserves APDU order (descriptor, descriptor, empty) after base + token\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(success) // token cert\n .mockResolvedValueOnce(success) // token TLVTransactionInstructionDescriptor\n .mockResolvedValue(success);\n\n const payer = Keypair.generate();\n const sysDest = Keypair.generate().publicKey;\n const sysIx = SystemProgram.transfer({\n fromPubkey: payer.publicKey,\n toPubkey: sysDest,\n lamports: 5_678,\n });\n\n const owner = Keypair.generate().publicKey;\n const mint = Keypair.generate().publicKey;\n const ata = getAssociatedTokenAddressSync(\n mint,\n owner,\n true,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n const ataIx = createAssociatedTokenAccountInstruction(\n payer.publicKey,\n ata,\n owner,\n mint,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const MEMO_PROGRAM_ID = new PublicKey(\n \"MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr\",\n );\n const memoIx = new TransactionInstruction({\n programId: MEMO_PROGRAM_ID,\n keys: [],\n data: Buffer.from(\"hello\"),\n });\n\n // IMPORTANT: sign only with the payer (no PublicKey in signers array)\n const { raw } = makeSignedRawV0([sysIx, ataIx, memoIx], [], payer);\n\n const SYSTEM_PID = SystemProgram.programId.toBase58();\n const ATA_PID = ASSOCIATED_TOKEN_PROGRAM_ID.toBase58();\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n {\n type: SolanaContextTypes.SOLANA_LIFI,\n payload: {\n [SYSTEM_PID]: { data: SIG, signatures: { [SWAP_MODE]: SIG } },\n [ATA_PID]: { data: SIG, signatures: { [SWAP_MODE]: SIG } },\n // Memo intentionally missing -> empty\n },\n },\n ];\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: raw,\n };\n\n const task = new ProvideSolanaTransactionContextTask(\n api as any,\n context as any,\n DefaultSolanaMessageNormaliser as any,\n );\n\n const res = await task.run();\n\n expect(res).toEqual(Nothing);\n // 2 base + 2 token + 3 swap\n expect(api.sendCommand).toHaveBeenCalledTimes(7);\n\n const c0 = api.sendCommand.mock.calls[4]![0]!;\n expect(c0).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c0.args.kind).toBe(\"descriptor\"); // System\n expect(c0.args.isFirstMessage).toBe(true);\n expect(c0.args.swapSignatureTag).toBe(true);\n\n const c1 = api.sendCommand.mock.calls[5]![0]!;\n expect(c1).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c1.args.kind).toBe(\"descriptor\"); // ATA\n expect(c1.args.isFirstMessage).toBe(false);\n expect(c1.args.swapSignatureTag).toBe(true);\n\n const c2 = api.sendCommand.mock.calls[6]![0]!;\n expect(c2).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c2.args.kind).toBe(\"empty\"); // Memo missing\n expect(c2.args.isFirstMessage).toBe(false);\n expect(c2.args.swapSignatureTag).toBe(true);\n });\n\n it(\"parses a real *v0* tx via DefaultSolanaMessageNormaliser and preserves APDU order System, createATA, token transfer (descriptor, descriptor, empty) after base + token\", async () => {\n // given\n api.sendCommand\n .mockResolvedValueOnce(success) // base PKI\n .mockResolvedValueOnce(success) // TLV\n .mockResolvedValueOnce(success) // token cert\n .mockResolvedValueOnce(success) // token TLVTransactionInstructionDescriptor\n .mockResolvedValue(success); // swap APDUs\n\n const payer = Keypair.generate();\n\n const sysDest = Keypair.generate().publicKey;\n const sysIx = SystemProgram.transfer({\n fromPubkey: payer.publicKey,\n toPubkey: sysDest,\n lamports: 7_777,\n });\n\n const tokenOwner = Keypair.generate(); // owner of the source SPL token account (signer)\n const mint = Keypair.generate().publicKey;\n\n const recipientOwner = Keypair.generate().publicKey; // unfunded account (no ATA yet)\n const recipientATA = getAssociatedTokenAddressSync(\n mint,\n recipientOwner,\n true,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const createAtaIx = createAssociatedTokenAccountInstruction(\n payer.publicKey, // funder\n recipientATA, // ata to be created\n recipientOwner, // owner of the ATA\n mint,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const srcTokenAcc = Keypair.generate().publicKey; // pretend this is an existing token account\n const transferIx = createTransferInstruction(\n srcTokenAcc,\n recipientATA,\n tokenOwner.publicKey, // authority of srcTokenAcc (we will sign with tokenOwner)\n 9n,\n [],\n TOKEN_PROGRAM_ID,\n );\n\n // sign v0 with payer + tokenOwner (NO PublicKey objects in the signers array)\n const { raw } = makeSignedRawV0(\n [sysIx, createAtaIx, transferIx],\n [tokenOwner],\n payer,\n );\n\n const SYSTEM_PID = SystemProgram.programId.toBase58();\n const ATA_PID = ASSOCIATED_TOKEN_PROGRAM_ID.toBase58();\n\n const loadersResults = [\n {\n type: SolanaContextTypes.SOLANA_TOKEN,\n payload: { solanaTokenDescriptor: tokenDescriptor },\n certificate: tokenCert,\n },\n {\n type: SolanaContextTypes.SOLANA_LIFI,\n payload: {\n [SYSTEM_PID]: { data: SIG, signatures: { [SWAP_MODE]: SIG } },\n [ATA_PID]: { data: SIG, signatures: { [SWAP_MODE]: SIG } },\n // Token Program intentionally missing -> \"empty\"\n },\n },\n ];\n\n const context = {\n trustedNamePKICertificate: baseCert,\n tlvDescriptor,\n loadersResults,\n transactionBytes: raw,\n };\n\n // when\n const task = new ProvideSolanaTransactionContextTask(\n api as any,\n context as any,\n DefaultSolanaMessageNormaliser as any,\n );\n\n const res = await task.run();\n\n // then\n expect(res).toEqual(Nothing);\n // 2 base + 2 token + 3 swap\n expect(api.sendCommand).toHaveBeenCalledTimes(7);\n\n // swap calls start at index 4\n const c0 = api.sendCommand.mock.calls[4]![0]!;\n expect(c0).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c0.args.kind).toBe(\"descriptor\"); // System\n expect(c0.args.isFirstMessage).toBe(true);\n expect(c0.args.swapSignatureTag).toBe(true);\n\n const c1 = api.sendCommand.mock.calls[5]![0]!;\n expect(c1).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c1.args.kind).toBe(\"descriptor\"); // ATA\n expect(c1.args.isFirstMessage).toBe(false);\n expect(c1.args.swapSignatureTag).toBe(true);\n\n const c2 = api.sendCommand.mock.calls[6]![0]!;\n expect(c2).toBeInstanceOf(\n ProvideTLVTransactionInstructionDescriptorCommand,\n );\n expect(c2.args.kind).toBe(\"empty\"); // Token Program missing\n expect(c2.args.isFirstMessage).toBe(false);\n expect(c2.args.swapSignatureTag).toBe(true);\n });\n });\n});\n"],
5
+ "mappings": "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",
6
+ "names": ["SolanaContextTypes", "CommandResultFactory", "LoadCertificateCommand", "ASSOCIATED_TOKEN_PROGRAM_ID", "createAssociatedTokenAccountInstruction", "createTransferInstruction", "getAssociatedTokenAddressSync", "TOKEN_PROGRAM_ID", "Keypair", "PublicKey", "SystemProgram", "Transaction", "TransactionInstruction", "TransactionMessage", "VersionedTransaction", "bs58", "Buffer", "Nothing", "beforeEach", "describe", "expect", "it", "vi", "ProvideTLVDescriptorCommand", "ProvideTLVTransactionInstructionDescriptorCommand", "DefaultSolanaMessageNormaliser", "ProvideSolanaTransactionContextTask", "SWAP_MODE", "DUMMY_BLOCKHASH", "makeSignedRawLegacy", "ixs", "signers", "feePayer", "payer", "tx", "seen", "uniq", "kp", "k", "makeSignedRawV0", "messageV0", "vtx", "makeKey", "base58", "buildNormaliser", "message", "api", "success", "baseCert", "tlvDescriptor", "tokenCert", "tokenDescriptor", "SIG", "context", "result", "first", "second", "task", "loadersResults", "third", "fourth", "errorResult", "tokenCmd", "normaliser", "c0", "c1", "c2", "dest1", "ix1", "owner", "srcToken", "dstToken", "ix2", "MEMO_PROGRAM_ID", "ix3", "raw", "SYSTEM_PID", "MEMO_PID", "sysDest", "sysIx", "mint", "ata", "ataIx", "memoIx", "ATA_PID", "res", "tokenOwner", "recipientOwner", "recipientATA", "createAtaIx", "srcTokenAcc", "transferIx"]
7
+ }
@@ -1,2 +1,2 @@
1
- import{APDU_MAX_PAYLOAD as d,ByteArrayBuilder as s,CommandResultFactory as u,InvalidStatusWordError as m}from"@ledgerhq/device-management-kit";import{DerivationPathUtils as g}from"@ledgerhq/signer-utils";import{SignOffChainMessageCommand as l}from"../../app-binder/command/SignOffChainMessageCommand";class b{constructor(t,e){this.api=t;this.args=e}async run(){const{sendingData:t,derivationPath:e}=this.args,n=this._buildApduCommand(this._buildFullMessage(t),g.splitPath(e));return n.length>d?u({error:new m("The APDU command exceeds the maximum allowable size (255 bytes)")}):await this.api.sendCommand(new l({message:n}))}_buildFullMessage(t){return new s().add8BitUIntToData(255).addAsciiStringToData("solana offchain").add16BitUIntToData(0).add16BitUIntToData(t.length,!1).addBufferToData(t).build()}_buildApduCommand(t,e){const r=e.length,a=new s(t.length+1+1+r*4);return a.add8BitUIntToData(1),a.add8BitUIntToData(r),e.forEach(o=>{const i=new Uint8Array(4);new DataView(i.buffer).setUint32(0,o,!1),a.addBufferToData(i)}),a.addBufferToData(t),a.build()}}export{b as SendSignMessageTask};
1
+ import{ByteArrayBuilder as g,CommandResultFactory as i,InvalidStatusWordError as s,isSuccessCommandResult as h}from"@ledgerhq/device-management-kit";import{DerivationPathUtils as I}from"@ledgerhq/signer-utils";import{GetPubKeyCommand as S}from"../../app-binder/command/GetPubKeyCommand";import{SignOffChainMessageCommand as b}from"../../app-binder/command/SignOffChainMessageCommand";import{DefaultBs58Encoder as U}from"../../app-binder/services/bs58Encoder";import{SendCommandInChunksTask as T}from"./SendCommandInChunksTask";const R=15*1024,v=1280,m=40,E=8,D=R-m-E,p=v-m-E,u=65515,w=126,B=32,M=10;var F=(n=>(n[n.Ascii=0]="Ascii",n[n.Utf8=1]="Utf8",n[n.Utf8LongV0=2]="Utf8LongV0",n))(F||{});const A=u;class V{constructor(t,e,n=U){this.api=t;this.args=e;this.bs58Encoder=n}async run(){const{sendingData:t,derivationPath:e}=this.args;if(t.length===0)return i({error:new s("Message cannot be empty")});if(t.length>A)return i({error:new s(`Message too long: ${t.length} bytes (max is ${A})`)});const n=I.splitPath(e),r=await this.api.sendCommand(new S({derivationPath:e,checkOnDevice:!1}));if(!("data"in r))return i({error:new s("Error getting public key from device")});const a=this.bs58Encoder.decode(r.data),f=this._buildFullMessage(t,a,!1),_=this._buildApduCommand(f,n),d=await this._sendInChunks(_);if(h(d))try{const o=this._buildEnvelopeBase58(d.data,f);return i({data:{signature:o}})}catch(o){return i({error:new s(o instanceof Error?o.message:String(o))})}const C="error"in d?d.error:void 0;if(this._isInvalidOffchainHeaderError(C)){if(t.length>p)return d;const o=this._buildFullMessage(t,a,!0),y=this._buildApduCommand(o,n),c=await this._sendInChunks(y);if(h(c))try{const l=this._buildEnvelopeBase58(c.data,o);return i({data:{signature:l}})}catch(l){return i({error:new s(l instanceof Error?l.message:String(l))})}return c}return d}_isUTF8(t){try{return new TextDecoder("utf-8",{fatal:!0}).decode(t),!0}catch{return!1}}_findMessageFormat(t,e){const n=e?p:D;if(t.length<=n){if(this._isPrintableASCII(t,e))return 0;if(this._isUTF8(t))return 1}else if(t.length<=u){if(this._isUTF8(t))return 2}else throw new s(`Message too long: ${t.length} bytes (max is ${u})`);return 0}_isPrintableASCII(t,e){for(let n=0;n<t.length;n++){const r=t[n];if(!(!e&&r===M)&&(r<B||r>w))return!1}return!0}_buildFullMessage(t,e,n){const r=this._findMessageFormat(t,n),a=new g;return a.add8BitUIntToData(255).addAsciiStringToData("solana offchain"),a.add8BitUIntToData(0),n||a.addBufferToData(new Uint8Array(32)),a.add8BitUIntToData(r),n||(a.add8BitUIntToData(1),a.addBufferToData(e)),a.add8BitUIntToData(t.length&255),a.add8BitUIntToData(t.length>>8&255),a.addBufferToData(t),a.build()}_isInvalidOffchainHeaderError(t){if(!t||typeof t!="object")return!1;const e=t,n=e._tag,r=e.errorCode;return typeof n=="string"&&typeof r=="string"&&r.toLowerCase()==="6a81"}_buildApduCommand(t,e){const n=new g(2+e.length*4+t.length);return n.add8BitUIntToData(1),n.add8BitUIntToData(e.length),e.forEach(r=>n.add32BitUIntToData(r)),n.addBufferToData(t),n.build()}async _sendInChunks(t){const e=n=>new b(n);return await new T(this.api,{data:t,commandFactory:e}).run()}_buildEnvelopeBase58(t,e){if(t.length!==64)throw new s(`Invalid signature length: ${t.length} (expected 64)`);const n=Uint8Array.of(1),r=new Uint8Array(n.length+t.length+e.length);return r.set(n,0),r.set(t,n.length),r.set(e,n.length+t.length),this.bs58Encoder.encode(r)}}export{A as MAX_MESSAGE_LENGTH,F as MessageFormat,V as SendSignMessageTask};
2
2
  //# sourceMappingURL=SendSignMessageTask.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/task/SendSignMessageTask.ts"],
4
- "sourcesContent": ["import {\n APDU_MAX_PAYLOAD,\n ByteArrayBuilder,\n type CommandResult,\n CommandResultFactory,\n type InternalApi,\n InvalidStatusWordError,\n} from \"@ledgerhq/device-management-kit\";\nimport { DerivationPathUtils } from \"@ledgerhq/signer-utils\";\n\nimport { type Signature } from \"@api/index\";\nimport { SignOffChainMessageCommand } from \"@internal/app-binder/command/SignOffChainMessageCommand\";\nimport { type SolanaAppErrorCodes } from \"@internal/app-binder/command/utils/SolanaApplicationErrors\";\n\nexport type SendSignMessageTaskArgs = {\n sendingData: Uint8Array;\n derivationPath: string;\n};\n\nexport type SendSignMessageTaskRunFunctionReturn = Promise<\n CommandResult<Signature, SolanaAppErrorCodes>\n>;\n\nexport class SendSignMessageTask {\n constructor(\n private api: InternalApi,\n private args: SendSignMessageTaskArgs,\n ) {}\n\n async run(): SendSignMessageTaskRunFunctionReturn {\n const { sendingData, derivationPath } = this.args;\n\n const commandBuffer = this._buildApduCommand(\n this._buildFullMessage(sendingData),\n DerivationPathUtils.splitPath(derivationPath),\n );\n\n if (commandBuffer.length > APDU_MAX_PAYLOAD) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\n \"The APDU command exceeds the maximum allowable size (255 bytes)\",\n ),\n });\n }\n\n return await this.api.sendCommand(\n new SignOffChainMessageCommand({\n message: commandBuffer,\n }),\n );\n }\n\n private _buildFullMessage(sendingData: Uint8Array): Uint8Array {\n return new ByteArrayBuilder()\n .add8BitUIntToData(0xff)\n .addAsciiStringToData(\"solana offchain\")\n .add16BitUIntToData(0)\n .add16BitUIntToData(sendingData.length, false)\n .addBufferToData(sendingData)\n .build();\n }\n\n private _buildApduCommand(\n fullMessage: Uint8Array,\n paths: number[],\n ): Uint8Array {\n const numberOfSigners = 1;\n const pathSize = 4;\n const signersCountSize = 1;\n const derivationsCountSize = 1;\n const numberOfDerivations = paths.length;\n const builder = new ByteArrayBuilder(\n fullMessage.length +\n signersCountSize +\n derivationsCountSize +\n numberOfDerivations * pathSize,\n );\n\n builder.add8BitUIntToData(numberOfSigners);\n builder.add8BitUIntToData(numberOfDerivations);\n\n paths.forEach((path) => {\n const buffer = new Uint8Array(4);\n const view = new DataView(buffer.buffer);\n view.setUint32(0, path, false);\n builder.addBufferToData(buffer);\n });\n\n builder.addBufferToData(fullMessage);\n return builder.build();\n }\n}\n"],
5
- "mappings": "AAAA,OACE,oBAAAA,EACA,oBAAAC,EAEA,wBAAAC,EAEA,0BAAAC,MACK,kCACP,OAAS,uBAAAC,MAA2B,yBAGpC,OAAS,8BAAAC,MAAkC,0DAYpC,MAAMC,CAAoB,CAC/B,YACUC,EACAC,EACR,CAFQ,SAAAD,EACA,UAAAC,CACP,CAEH,MAAM,KAA4C,CAChD,KAAM,CAAE,YAAAC,EAAa,eAAAC,CAAe,EAAI,KAAK,KAEvCC,EAAgB,KAAK,kBACzB,KAAK,kBAAkBF,CAAW,EAClCL,EAAoB,UAAUM,CAAc,CAC9C,EAEA,OAAIC,EAAc,OAASX,EAClBE,EAAqB,CAC1B,MAAO,IAAIC,EACT,iEACF,CACF,CAAC,EAGI,MAAM,KAAK,IAAI,YACpB,IAAIE,EAA2B,CAC7B,QAASM,CACX,CAAC,CACH,CACF,CAEQ,kBAAkBF,EAAqC,CAC7D,OAAO,IAAIR,EAAiB,EACzB,kBAAkB,GAAI,EACtB,qBAAqB,iBAAiB,EACtC,mBAAmB,CAAC,EACpB,mBAAmBQ,EAAY,OAAQ,EAAK,EAC5C,gBAAgBA,CAAW,EAC3B,MAAM,CACX,CAEQ,kBACNG,EACAC,EACY,CAKZ,MAAMC,EAAsBD,EAAM,OAC5BE,EAAU,IAAId,EAClBW,EAAY,OACV,EACA,EACAE,EAAsB,CAC1B,EAEA,OAAAC,EAAQ,kBAAkB,CAAe,EACzCA,EAAQ,kBAAkBD,CAAmB,EAE7CD,EAAM,QAASG,GAAS,CACtB,MAAMC,EAAS,IAAI,WAAW,CAAC,EAClB,IAAI,SAASA,EAAO,MAAM,EAClC,UAAU,EAAGD,EAAM,EAAK,EAC7BD,EAAQ,gBAAgBE,CAAM,CAChC,CAAC,EAEDF,EAAQ,gBAAgBH,CAAW,EAC5BG,EAAQ,MAAM,CACvB,CACF",
6
- "names": ["APDU_MAX_PAYLOAD", "ByteArrayBuilder", "CommandResultFactory", "InvalidStatusWordError", "DerivationPathUtils", "SignOffChainMessageCommand", "SendSignMessageTask", "api", "args", "sendingData", "derivationPath", "commandBuffer", "fullMessage", "paths", "numberOfDerivations", "builder", "path", "buffer"]
4
+ "sourcesContent": ["import {\n ByteArrayBuilder,\n type CommandResult,\n CommandResultFactory,\n type InternalApi,\n InvalidStatusWordError,\n isSuccessCommandResult,\n} from \"@ledgerhq/device-management-kit\";\nimport { DerivationPathUtils } from \"@ledgerhq/signer-utils\";\n\nimport { GetPubKeyCommand } from \"@internal/app-binder/command/GetPubKeyCommand\";\nimport {\n SignOffChainMessageCommand,\n type SignOffChainRawResponse,\n} from \"@internal/app-binder/command/SignOffChainMessageCommand\";\nimport { type SolanaAppErrorCodes } from \"@internal/app-binder/command/utils/SolanaApplicationErrors\";\nimport {\n type Bs58Encoder,\n DefaultBs58Encoder,\n} from \"@internal/app-binder/services/bs58Encoder\";\n\nimport {\n type CommandFactory,\n SendCommandInChunksTask,\n} from \"./SendCommandInChunksTask\";\n\nconst DEVICE_V0_PAYLOAD_CEILING = 15 * 1024; // 15360\nconst DEVICE_LEGACY_PAYLOAD_CEILING = 1280;\n\n// bytes reserved by app/header and transport\nconst RESERVED_HEADER_BYTES = 40;\nconst RESERVED_TRANSPORT_BYTES = 8;\n\n// derived usable body sizes\nconst OFFCHAINMSG_MAX_LEN =\n DEVICE_V0_PAYLOAD_CEILING - RESERVED_HEADER_BYTES - RESERVED_TRANSPORT_BYTES; // 15312\n\nconst LEGACY_OFFCHAINMSG_MAX_LEN =\n DEVICE_LEGACY_PAYLOAD_CEILING -\n RESERVED_HEADER_BYTES -\n RESERVED_TRANSPORT_BYTES; // 1232\n\n// device cap for v0 long UTF-8\nconst OFFCHAINMSG_MAX_V0_LEN = 65515;\n\nconst MAX_PRINTABLE_ASCII = 0x7e;\nconst MIN_PRINTABLE_ASCII = 0x20;\nconst LINE_FEED_ASCII = 0x0a;\n\nexport enum MessageFormat {\n Ascii = 0,\n Utf8 = 1,\n Utf8LongV0 = 2,\n}\n\nexport const MAX_MESSAGE_LENGTH = OFFCHAINMSG_MAX_V0_LEN;\n\nexport type SendSignMessageTaskArgs = {\n sendingData: Uint8Array;\n derivationPath: string;\n};\n\nexport type SendSignMessageTaskRunFunctionReturn = Promise<\n CommandResult<{ signature: string }, SolanaAppErrorCodes>\n>;\n\nexport class SendSignMessageTask {\n constructor(\n private api: InternalApi,\n private args: SendSignMessageTaskArgs,\n private readonly bs58Encoder: Bs58Encoder = DefaultBs58Encoder,\n ) {}\n\n async run(): SendSignMessageTaskRunFunctionReturn {\n const { sendingData, derivationPath } = this.args;\n\n if (sendingData.length === 0) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\"Message cannot be empty\"),\n });\n }\n if (sendingData.length > MAX_MESSAGE_LENGTH) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\n `Message too long: ${sendingData.length} bytes (max is ${MAX_MESSAGE_LENGTH})`,\n ),\n });\n }\n\n const paths = DerivationPathUtils.splitPath(derivationPath);\n\n const pubkeyResult = await this.api.sendCommand(\n new GetPubKeyCommand({ derivationPath, checkOnDevice: false }),\n );\n if (!(\"data\" in pubkeyResult)) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\n \"Error getting public key from device\",\n ),\n });\n }\n const signerPubkey = this.bs58Encoder.decode(pubkeyResult.data);\n\n // try v0 first\n const v0OCM = this._buildFullMessage(sendingData, signerPubkey, false);\n const v0Payload = this._buildApduCommand(v0OCM, paths);\n const v0Res = await this._sendInChunks(v0Payload);\n\n if (isSuccessCommandResult(v0Res)) {\n try {\n const sigB58 = this._buildEnvelopeBase58(v0Res.data, v0OCM);\n return CommandResultFactory({ data: { signature: sigB58 } });\n } catch (e) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\n e instanceof Error ? e.message : String(e),\n ),\n });\n }\n }\n\n // if the app says header invalid, try legacy\n const v0Error: unknown =\n \"error\" in v0Res ? (v0Res as { error: unknown }).error : undefined;\n\n if (this._isInvalidOffchainHeaderError(v0Error)) {\n if (sendingData.length > LEGACY_OFFCHAINMSG_MAX_LEN) {\n return v0Res;\n }\n\n const legacyOCM = this._buildFullMessage(sendingData, signerPubkey, true);\n const legacyPayload = this._buildApduCommand(legacyOCM, paths);\n const legacyRes = await this._sendInChunks(legacyPayload);\n\n if (isSuccessCommandResult(legacyRes)) {\n try {\n const sigB58 = this._buildEnvelopeBase58(legacyRes.data, legacyOCM);\n return CommandResultFactory({ data: { signature: sigB58 } });\n } catch (e) {\n return CommandResultFactory({\n error: new InvalidStatusWordError(\n e instanceof Error ? e.message : String(e),\n ),\n });\n }\n }\n return legacyRes;\n }\n\n return v0Res;\n }\n\n private _isUTF8(buf: Uint8Array): boolean {\n try {\n new TextDecoder(\"utf-8\", { fatal: true }).decode(buf);\n return true;\n } catch {\n return false;\n }\n }\n\n private _findMessageFormat(\n message: Uint8Array,\n isLegacy: boolean,\n ): MessageFormat {\n const maxLedgerLen = isLegacy\n ? LEGACY_OFFCHAINMSG_MAX_LEN\n : OFFCHAINMSG_MAX_LEN;\n\n if (message.length <= maxLedgerLen) {\n if (this._isPrintableASCII(message, isLegacy)) return MessageFormat.Ascii;\n if (this._isUTF8(message)) return MessageFormat.Utf8;\n } else if (message.length <= OFFCHAINMSG_MAX_V0_LEN) {\n if (this._isUTF8(message)) return MessageFormat.Utf8LongV0;\n } else {\n // unreachable if run() guards length\n throw new InvalidStatusWordError(\n `Message too long: ${message.length} bytes (max is ${OFFCHAINMSG_MAX_V0_LEN})`,\n );\n }\n // default to ASCII like legacy\n return MessageFormat.Ascii;\n }\n\n private _isPrintableASCII(buf: Uint8Array, isLegacy: boolean): boolean {\n for (let i = 0; i < buf.length; i++) {\n const ch: number = buf[i]!;\n if (!isLegacy && ch === LINE_FEED_ASCII) continue; // newline allowed only for non-legacy\n if (ch < MIN_PRINTABLE_ASCII || ch > MAX_PRINTABLE_ASCII) return false;\n }\n return true;\n }\n\n /**\n * build serialised off-chain message header + body\n * when `isLegacy` is true, build the short legacy header (no app-domain or signers).\n */\n private _buildFullMessage(\n messageBody: Uint8Array,\n signerPubkey: Uint8Array,\n isLegacy: boolean,\n ): Uint8Array {\n const format: MessageFormat = this._findMessageFormat(\n messageBody,\n isLegacy,\n );\n\n const builder = new ByteArrayBuilder();\n\n // signing domain: 0xFF + \"solana offchain\" (16 bytes)\n builder.add8BitUIntToData(0xff).addAsciiStringToData(\"solana offchain\");\n\n // header version = 0\n builder.add8BitUIntToData(0);\n\n if (!isLegacy) {\n // application domain = 32 zeros\n builder.addBufferToData(new Uint8Array(32));\n }\n\n // message format\n builder.add8BitUIntToData(format);\n\n if (!isLegacy) {\n // signer count = 1\n builder.add8BitUIntToData(1);\n // signer pubkey (32 bytes)\n builder.addBufferToData(signerPubkey);\n }\n\n // message length (LE, 2 bytes)\n builder.add8BitUIntToData(messageBody.length & 0xff);\n builder.add8BitUIntToData((messageBody.length >> 8) & 0xff);\n\n // message body\n builder.addBufferToData(messageBody);\n\n return builder.build();\n }\n\n // guard for the device\u2019s 0x6A81 \u201CInvalid off-chain message header\u201D error\n private _isInvalidOffchainHeaderError(\n e: unknown,\n ): e is { _tag: string; errorCode: string } {\n if (!e || typeof e !== \"object\") return false;\n const obj = e as Record<string, unknown>;\n const tag = obj[\"_tag\"];\n const code = obj[\"errorCode\"];\n return (\n typeof tag === \"string\" &&\n typeof code === \"string\" &&\n code.toLowerCase() === \"6a81\"\n );\n }\n\n /**\n * build APDU payload:\n * [signerCount=1][derivationsCount][each 4-byte index][OCM message]\n */\n private _buildApduCommand(\n fullMessage: Uint8Array,\n paths: number[],\n ): Uint8Array {\n const builder = new ByteArrayBuilder(\n 1 + 1 + paths.length * 4 + fullMessage.length,\n );\n\n builder.add8BitUIntToData(1); // number of signers\n builder.add8BitUIntToData(paths.length); // number of derivations\n paths.forEach((idx) => builder.add32BitUIntToData(idx)); // big-endian\n builder.addBufferToData(fullMessage);\n\n return builder.build(); // larger than 255 is ok, SendCommandInChunksTask will chunk it\n }\n\n // send APDU payload using chunk task, return raw 64-byte signature (last chunk)\n private async _sendInChunks(\n apduPayload: Uint8Array,\n ): Promise<CommandResult<SignOffChainRawResponse, SolanaAppErrorCodes>> {\n const commandFactory: CommandFactory<SignOffChainRawResponse> = (\n chunkArgs,\n ) => new SignOffChainMessageCommand(chunkArgs);\n\n return await new SendCommandInChunksTask<SignOffChainRawResponse>(\n this.api,\n {\n data: apduPayload,\n commandFactory,\n },\n ).run();\n }\n\n // build base58 OCM envelope: [signatureCount=1][signature(64)][serialized OCM]\n private _buildEnvelopeBase58(\n rawSignature: Uint8Array,\n serializedOCM: Uint8Array,\n ): string {\n if (rawSignature.length !== 64) {\n throw new InvalidStatusWordError(\n `Invalid signature length: ${rawSignature.length} (expected 64)`,\n );\n }\n const sigCount = Uint8Array.of(1);\n const envelope = new Uint8Array(\n sigCount.length + rawSignature.length + serializedOCM.length,\n );\n envelope.set(sigCount, 0);\n envelope.set(rawSignature, sigCount.length);\n envelope.set(serializedOCM, sigCount.length + rawSignature.length);\n return this.bs58Encoder.encode(envelope);\n }\n}\n"],
5
+ "mappings": "AAAA,OACE,oBAAAA,EAEA,wBAAAC,EAEA,0BAAAC,EACA,0BAAAC,MACK,kCACP,OAAS,uBAAAC,MAA2B,yBAEpC,OAAS,oBAAAC,MAAwB,gDACjC,OACE,8BAAAC,MAEK,0DAEP,OAEE,sBAAAC,MACK,4CAEP,OAEE,2BAAAC,MACK,4BAEP,MAAMC,EAA4B,GAAK,KACjCC,EAAgC,KAGhCC,EAAwB,GACxBC,EAA2B,EAG3BC,EACJJ,EAA4BE,EAAwBC,EAEhDE,EACJJ,EACAC,EACAC,EAGIG,EAAyB,MAEzBC,EAAsB,IACtBC,EAAsB,GACtBC,EAAkB,GAEjB,IAAKC,OACVA,IAAA,MAAQ,GAAR,QACAA,IAAA,KAAO,GAAP,OACAA,IAAA,WAAa,GAAb,aAHUA,OAAA,IAML,MAAMC,EAAqBL,EAW3B,MAAMM,CAAoB,CAC/B,YACUC,EACAC,EACSC,EAA2BjB,EAC5C,CAHQ,SAAAe,EACA,UAAAC,EACS,iBAAAC,CAChB,CAEH,MAAM,KAA4C,CAChD,KAAM,CAAE,YAAAC,EAAa,eAAAC,CAAe,EAAI,KAAK,KAE7C,GAAID,EAAY,SAAW,EACzB,OAAOxB,EAAqB,CAC1B,MAAO,IAAIC,EAAuB,yBAAyB,CAC7D,CAAC,EAEH,GAAIuB,EAAY,OAASL,EACvB,OAAOnB,EAAqB,CAC1B,MAAO,IAAIC,EACT,qBAAqBuB,EAAY,MAAM,kBAAkBL,CAAkB,GAC7E,CACF,CAAC,EAGH,MAAMO,EAAQvB,EAAoB,UAAUsB,CAAc,EAEpDE,EAAe,MAAM,KAAK,IAAI,YAClC,IAAIvB,EAAiB,CAAE,eAAAqB,EAAgB,cAAe,EAAM,CAAC,CAC/D,EACA,GAAI,EAAE,SAAUE,GACd,OAAO3B,EAAqB,CAC1B,MAAO,IAAIC,EACT,sCACF,CACF,CAAC,EAEH,MAAM2B,EAAe,KAAK,YAAY,OAAOD,EAAa,IAAI,EAGxDE,EAAQ,KAAK,kBAAkBL,EAAaI,EAAc,EAAK,EAC/DE,EAAY,KAAK,kBAAkBD,EAAOH,CAAK,EAC/CK,EAAQ,MAAM,KAAK,cAAcD,CAAS,EAEhD,GAAI5B,EAAuB6B,CAAK,EAC9B,GAAI,CACF,MAAMC,EAAS,KAAK,qBAAqBD,EAAM,KAAMF,CAAK,EAC1D,OAAO7B,EAAqB,CAAE,KAAM,CAAE,UAAWgC,CAAO,CAAE,CAAC,CAC7D,OAASC,EAAG,CACV,OAAOjC,EAAqB,CAC1B,MAAO,IAAIC,EACTgC,aAAa,MAAQA,EAAE,QAAU,OAAOA,CAAC,CAC3C,CACF,CAAC,CACH,CAIF,MAAMC,EACJ,UAAWH,EAASA,EAA6B,MAAQ,OAE3D,GAAI,KAAK,8BAA8BG,CAAO,EAAG,CAC/C,GAAIV,EAAY,OAASX,EACvB,OAAOkB,EAGT,MAAMI,EAAY,KAAK,kBAAkBX,EAAaI,EAAc,EAAI,EAClEQ,EAAgB,KAAK,kBAAkBD,EAAWT,CAAK,EACvDW,EAAY,MAAM,KAAK,cAAcD,CAAa,EAExD,GAAIlC,EAAuBmC,CAAS,EAClC,GAAI,CACF,MAAML,EAAS,KAAK,qBAAqBK,EAAU,KAAMF,CAAS,EAClE,OAAOnC,EAAqB,CAAE,KAAM,CAAE,UAAWgC,CAAO,CAAE,CAAC,CAC7D,OAASC,EAAG,CACV,OAAOjC,EAAqB,CAC1B,MAAO,IAAIC,EACTgC,aAAa,MAAQA,EAAE,QAAU,OAAOA,CAAC,CAC3C,CACF,CAAC,CACH,CAEF,OAAOI,CACT,CAEA,OAAON,CACT,CAEQ,QAAQO,EAA0B,CACxC,GAAI,CACF,WAAI,YAAY,QAAS,CAAE,MAAO,EAAK,CAAC,EAAE,OAAOA,CAAG,EAC7C,EACT,MAAQ,CACN,MAAO,EACT,CACF,CAEQ,mBACNC,EACAC,EACe,CACf,MAAMC,EAAeD,EACjB3B,EACAD,EAEJ,GAAI2B,EAAQ,QAAUE,EAAc,CAClC,GAAI,KAAK,kBAAkBF,EAASC,CAAQ,EAAG,MAAO,GACtD,GAAI,KAAK,QAAQD,CAAO,EAAG,MAAO,EACpC,SAAWA,EAAQ,QAAUzB,GAC3B,GAAI,KAAK,QAAQyB,CAAO,EAAG,MAAO,OAGlC,OAAM,IAAItC,EACR,qBAAqBsC,EAAQ,MAAM,kBAAkBzB,CAAsB,GAC7E,EAGF,MAAO,EACT,CAEQ,kBAAkBwB,EAAiBE,EAA4B,CACrE,QAASE,EAAI,EAAGA,EAAIJ,EAAI,OAAQI,IAAK,CACnC,MAAMC,EAAaL,EAAII,CAAC,EACxB,GAAI,GAACF,GAAYG,IAAO1B,KACpB0B,EAAK3B,GAAuB2B,EAAK5B,GAAqB,MAAO,EACnE,CACA,MAAO,EACT,CAMQ,kBACN6B,EACAhB,EACAY,EACY,CACZ,MAAMK,EAAwB,KAAK,mBACjCD,EACAJ,CACF,EAEMM,EAAU,IAAI/C,EAGpB,OAAA+C,EAAQ,kBAAkB,GAAI,EAAE,qBAAqB,iBAAiB,EAGtEA,EAAQ,kBAAkB,CAAC,EAEtBN,GAEHM,EAAQ,gBAAgB,IAAI,WAAW,EAAE,CAAC,EAI5CA,EAAQ,kBAAkBD,CAAM,EAE3BL,IAEHM,EAAQ,kBAAkB,CAAC,EAE3BA,EAAQ,gBAAgBlB,CAAY,GAItCkB,EAAQ,kBAAkBF,EAAY,OAAS,GAAI,EACnDE,EAAQ,kBAAmBF,EAAY,QAAU,EAAK,GAAI,EAG1DE,EAAQ,gBAAgBF,CAAW,EAE5BE,EAAQ,MAAM,CACvB,CAGQ,8BACNb,EAC0C,CAC1C,GAAI,CAACA,GAAK,OAAOA,GAAM,SAAU,MAAO,GACxC,MAAMc,EAAMd,EACNe,EAAMD,EAAI,KACVE,EAAOF,EAAI,UACjB,OACE,OAAOC,GAAQ,UACf,OAAOC,GAAS,UAChBA,EAAK,YAAY,IAAM,MAE3B,CAMQ,kBACNC,EACAxB,EACY,CACZ,MAAMoB,EAAU,IAAI/C,EAClB,EAAQ2B,EAAM,OAAS,EAAIwB,EAAY,MACzC,EAEA,OAAAJ,EAAQ,kBAAkB,CAAC,EAC3BA,EAAQ,kBAAkBpB,EAAM,MAAM,EACtCA,EAAM,QAASyB,GAAQL,EAAQ,mBAAmBK,CAAG,CAAC,EACtDL,EAAQ,gBAAgBI,CAAW,EAE5BJ,EAAQ,MAAM,CACvB,CAGA,MAAc,cACZM,EACsE,CACtE,MAAMC,EACJC,GACG,IAAIjD,EAA2BiD,CAAS,EAE7C,OAAO,MAAM,IAAI/C,EACf,KAAK,IACL,CACE,KAAM6C,EACN,eAAAC,CACF,CACF,EAAE,IAAI,CACR,CAGQ,qBACNE,EACAC,EACQ,CACR,GAAID,EAAa,SAAW,GAC1B,MAAM,IAAItD,EACR,6BAA6BsD,EAAa,MAAM,gBAClD,EAEF,MAAME,EAAW,WAAW,GAAG,CAAC,EAC1BC,EAAW,IAAI,WACnBD,EAAS,OAASF,EAAa,OAASC,EAAc,MACxD,EACA,OAAAE,EAAS,IAAID,EAAU,CAAC,EACxBC,EAAS,IAAIH,EAAcE,EAAS,MAAM,EAC1CC,EAAS,IAAIF,EAAeC,EAAS,OAASF,EAAa,MAAM,EAC1D,KAAK,YAAY,OAAOG,CAAQ,CACzC,CACF",
6
+ "names": ["ByteArrayBuilder", "CommandResultFactory", "InvalidStatusWordError", "isSuccessCommandResult", "DerivationPathUtils", "GetPubKeyCommand", "SignOffChainMessageCommand", "DefaultBs58Encoder", "SendCommandInChunksTask", "DEVICE_V0_PAYLOAD_CEILING", "DEVICE_LEGACY_PAYLOAD_CEILING", "RESERVED_HEADER_BYTES", "RESERVED_TRANSPORT_BYTES", "OFFCHAINMSG_MAX_LEN", "LEGACY_OFFCHAINMSG_MAX_LEN", "OFFCHAINMSG_MAX_V0_LEN", "MAX_PRINTABLE_ASCII", "MIN_PRINTABLE_ASCII", "LINE_FEED_ASCII", "MessageFormat", "MAX_MESSAGE_LENGTH", "SendSignMessageTask", "api", "args", "bs58Encoder", "sendingData", "derivationPath", "paths", "pubkeyResult", "signerPubkey", "v0OCM", "v0Payload", "v0Res", "sigB58", "e", "v0Error", "legacyOCM", "legacyPayload", "legacyRes", "buf", "message", "isLegacy", "maxLedgerLen", "i", "ch", "messageBody", "format", "builder", "obj", "tag", "code", "fullMessage", "idx", "apduPayload", "commandFactory", "chunkArgs", "rawSignature", "serializedOCM", "sigCount", "envelope"]
7
7
  }