@ledgerhq/device-signer-kit-solana 0.0.0-safe-20250917153142 → 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 (231) hide show
  1. package/README.md +113 -24
  2. package/lib/cjs/api/SignerSolana.js +1 -1
  3. package/lib/cjs/api/SignerSolana.js.map +1 -1
  4. package/lib/cjs/api/SolanaTools.js +1 -1
  5. package/lib/cjs/api/SolanaTools.js.map +1 -1
  6. package/lib/cjs/api/app-binder/SignMessageDeviceActionTypes.js.map +1 -1
  7. package/lib/cjs/api/app-binder/SignTransactionDeviceActionTypes.js +1 -1
  8. package/lib/cjs/api/app-binder/SignTransactionDeviceActionTypes.js.map +3 -3
  9. package/lib/cjs/api/index.js +1 -1
  10. package/lib/cjs/api/index.js.map +1 -1
  11. package/lib/cjs/api/model/SolanaTransactionOptionalConfig.js +2 -0
  12. package/lib/cjs/api/model/SolanaTransactionOptionalConfig.js.map +7 -0
  13. package/lib/cjs/api/model/TransactionResolutionContext.js +2 -0
  14. package/lib/cjs/api/model/TransactionResolutionContext.js.map +7 -0
  15. package/lib/cjs/internal/DefaultSignerSolana.js +1 -1
  16. package/lib/cjs/internal/DefaultSignerSolana.js.map +3 -3
  17. package/lib/cjs/internal/app-binder/SolanaAppBinder.js +1 -1
  18. package/lib/cjs/internal/app-binder/SolanaAppBinder.js.map +2 -2
  19. package/lib/cjs/internal/app-binder/SolanaAppBinder.test.js +1 -1
  20. package/lib/cjs/internal/app-binder/SolanaAppBinder.test.js.map +2 -2
  21. package/lib/cjs/internal/app-binder/command/GetAppConfigurationCommand.js +1 -1
  22. package/lib/cjs/internal/app-binder/command/GetAppConfigurationCommand.js.map +2 -2
  23. package/lib/cjs/internal/app-binder/command/GetAppConfigurationCommand.test.js +1 -1
  24. package/lib/cjs/internal/app-binder/command/GetAppConfigurationCommand.test.js.map +2 -2
  25. package/lib/cjs/internal/app-binder/command/GetChallengeCommand.js +1 -1
  26. package/lib/cjs/internal/app-binder/command/GetChallengeCommand.js.map +2 -2
  27. package/lib/cjs/internal/app-binder/command/GetChallengeCommand.test.js +1 -1
  28. package/lib/cjs/internal/app-binder/command/GetChallengeCommand.test.js.map +2 -2
  29. package/lib/cjs/internal/app-binder/command/GetPubKeyCommand.js +1 -1
  30. package/lib/cjs/internal/app-binder/command/GetPubKeyCommand.js.map +3 -3
  31. package/lib/cjs/internal/app-binder/command/GetPubKeyCommand.test.js +1 -1
  32. package/lib/cjs/internal/app-binder/command/GetPubKeyCommand.test.js.map +2 -2
  33. package/lib/cjs/internal/app-binder/command/ProvideTLVDescriptorCommand.js +1 -1
  34. package/lib/cjs/internal/app-binder/command/ProvideTLVDescriptorCommand.js.map +2 -2
  35. package/lib/cjs/internal/app-binder/command/ProvideTLVDescriptorCommand.test.js +1 -1
  36. package/lib/cjs/internal/app-binder/command/ProvideTLVDescriptorCommand.test.js.map +2 -2
  37. package/lib/cjs/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.js +2 -0
  38. package/lib/cjs/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.js.map +7 -0
  39. package/lib/cjs/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.test.js +2 -0
  40. package/lib/cjs/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.test.js.map +7 -0
  41. package/lib/cjs/internal/app-binder/command/SignOffChainMessageCommand.js +1 -1
  42. package/lib/cjs/internal/app-binder/command/SignOffChainMessageCommand.js.map +3 -3
  43. package/lib/cjs/internal/app-binder/command/SignOffChainMessageCommand.test.js +1 -1
  44. package/lib/cjs/internal/app-binder/command/SignOffChainMessageCommand.test.js.map +3 -3
  45. package/lib/cjs/internal/app-binder/command/SignTransactionCommand.js +1 -1
  46. package/lib/cjs/internal/app-binder/command/SignTransactionCommand.js.map +3 -3
  47. package/lib/cjs/internal/app-binder/command/SignTransactionCommand.test.js +1 -1
  48. package/lib/cjs/internal/app-binder/command/SignTransactionCommand.test.js.map +3 -3
  49. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.js +1 -1
  50. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.js.map +3 -3
  51. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.test.js +1 -1
  52. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.test.js.map +3 -3
  53. package/lib/cjs/internal/app-binder/services/GenerateSolanaTransaction.test.js.map +3 -3
  54. package/lib/cjs/internal/app-binder/services/TransactionInspector.js +1 -1
  55. package/lib/cjs/internal/app-binder/services/TransactionInspector.js.map +3 -3
  56. package/lib/cjs/internal/app-binder/services/TransactionInspector.test.js +1 -1
  57. package/lib/cjs/internal/app-binder/services/TransactionInspector.test.js.map +3 -3
  58. package/lib/cjs/internal/app-binder/services/bs58Encoder.js +2 -0
  59. package/lib/cjs/internal/app-binder/services/bs58Encoder.js.map +7 -0
  60. package/lib/cjs/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.js +2 -0
  61. package/lib/cjs/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.js.map +7 -0
  62. package/lib/cjs/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.test.js +2 -0
  63. package/lib/cjs/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.test.js.map +7 -0
  64. package/lib/cjs/internal/app-binder/services/utils/transactionDecoders.js +2 -0
  65. package/lib/cjs/internal/app-binder/services/utils/transactionDecoders.js.map +7 -0
  66. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.js +1 -1
  67. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.js.map +2 -2
  68. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.test.js +1 -1
  69. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.test.js.map +3 -3
  70. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.js +1 -1
  71. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.js.map +3 -3
  72. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.test.js +1 -1
  73. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.test.js.map +3 -3
  74. package/lib/cjs/internal/app-binder/task/SendSignMessageTask.js +1 -1
  75. package/lib/cjs/internal/app-binder/task/SendSignMessageTask.js.map +3 -3
  76. package/lib/cjs/internal/app-binder/task/SendSignMessageTask.test.js +3 -1
  77. package/lib/cjs/internal/app-binder/task/SendSignMessageTask.test.js.map +3 -3
  78. package/lib/cjs/internal/use-cases/transaction/SignTransactionUseCase.js +1 -1
  79. package/lib/cjs/internal/use-cases/transaction/SignTransactionUseCase.js.map +3 -3
  80. package/lib/cjs/internal/use-cases/transaction/SignTransactionUseCase.test.js +1 -1
  81. package/lib/cjs/internal/use-cases/transaction/SignTransactionUseCase.test.js.map +2 -2
  82. package/lib/cjs/package.json +44 -40
  83. package/lib/esm/api/app-binder/SignTransactionDeviceActionTypes.js +1 -0
  84. package/lib/esm/api/app-binder/SignTransactionDeviceActionTypes.js.map +4 -4
  85. package/lib/esm/api/index.js +1 -1
  86. package/lib/esm/api/index.js.map +1 -1
  87. package/lib/esm/api/model/SolanaTransactionOptionalConfig.js +1 -0
  88. package/lib/esm/api/model/TransactionResolutionContext.js +2 -0
  89. package/lib/esm/api/model/TransactionResolutionContext.js.map +7 -0
  90. package/lib/esm/internal/DefaultSignerSolana.js +1 -1
  91. package/lib/esm/internal/DefaultSignerSolana.js.map +3 -3
  92. package/lib/esm/internal/app-binder/SolanaAppBinder.js +1 -1
  93. package/lib/esm/internal/app-binder/SolanaAppBinder.js.map +2 -2
  94. package/lib/esm/internal/app-binder/SolanaAppBinder.test.js +1 -1
  95. package/lib/esm/internal/app-binder/SolanaAppBinder.test.js.map +2 -2
  96. package/lib/esm/internal/app-binder/command/GetAppConfigurationCommand.js +1 -1
  97. package/lib/esm/internal/app-binder/command/GetAppConfigurationCommand.js.map +2 -2
  98. package/lib/esm/internal/app-binder/command/GetAppConfigurationCommand.test.js +1 -1
  99. package/lib/esm/internal/app-binder/command/GetAppConfigurationCommand.test.js.map +2 -2
  100. package/lib/esm/internal/app-binder/command/GetChallengeCommand.js +1 -1
  101. package/lib/esm/internal/app-binder/command/GetChallengeCommand.js.map +2 -2
  102. package/lib/esm/internal/app-binder/command/GetChallengeCommand.test.js +1 -1
  103. package/lib/esm/internal/app-binder/command/GetChallengeCommand.test.js.map +2 -2
  104. package/lib/esm/internal/app-binder/command/GetPubKeyCommand.js +1 -1
  105. package/lib/esm/internal/app-binder/command/GetPubKeyCommand.js.map +3 -3
  106. package/lib/esm/internal/app-binder/command/GetPubKeyCommand.test.js +1 -1
  107. package/lib/esm/internal/app-binder/command/GetPubKeyCommand.test.js.map +2 -2
  108. package/lib/esm/internal/app-binder/command/ProvideTLVDescriptorCommand.js +1 -1
  109. package/lib/esm/internal/app-binder/command/ProvideTLVDescriptorCommand.js.map +2 -2
  110. package/lib/esm/internal/app-binder/command/ProvideTLVDescriptorCommand.test.js +1 -1
  111. package/lib/esm/internal/app-binder/command/ProvideTLVDescriptorCommand.test.js.map +2 -2
  112. package/lib/esm/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.js +2 -0
  113. package/lib/esm/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.js.map +7 -0
  114. package/lib/esm/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.test.js +2 -0
  115. package/lib/esm/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.test.js.map +7 -0
  116. package/lib/esm/internal/app-binder/command/SignOffChainMessageCommand.js +1 -1
  117. package/lib/esm/internal/app-binder/command/SignOffChainMessageCommand.js.map +3 -3
  118. package/lib/esm/internal/app-binder/command/SignOffChainMessageCommand.test.js +1 -1
  119. package/lib/esm/internal/app-binder/command/SignOffChainMessageCommand.test.js.map +3 -3
  120. package/lib/esm/internal/app-binder/command/SignTransactionCommand.js +1 -1
  121. package/lib/esm/internal/app-binder/command/SignTransactionCommand.js.map +3 -3
  122. package/lib/esm/internal/app-binder/command/SignTransactionCommand.test.js +1 -1
  123. package/lib/esm/internal/app-binder/command/SignTransactionCommand.test.js.map +3 -3
  124. package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.js +1 -1
  125. package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.js.map +3 -3
  126. package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.test.js +1 -1
  127. package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.test.js.map +3 -3
  128. package/lib/esm/internal/app-binder/services/GenerateSolanaTransaction.test.js.map +3 -3
  129. package/lib/esm/internal/app-binder/services/TransactionInspector.js +1 -1
  130. package/lib/esm/internal/app-binder/services/TransactionInspector.js.map +3 -3
  131. package/lib/esm/internal/app-binder/services/TransactionInspector.test.js +1 -1
  132. package/lib/esm/internal/app-binder/services/TransactionInspector.test.js.map +3 -3
  133. package/lib/esm/internal/app-binder/services/bs58Encoder.js +2 -0
  134. package/lib/esm/internal/app-binder/services/bs58Encoder.js.map +7 -0
  135. package/lib/esm/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.js +2 -0
  136. package/lib/esm/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.js.map +7 -0
  137. package/lib/esm/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.test.js +2 -0
  138. package/lib/esm/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.test.js.map +7 -0
  139. package/lib/esm/internal/app-binder/services/utils/transactionDecoders.js +2 -0
  140. package/lib/esm/internal/app-binder/services/utils/transactionDecoders.js.map +7 -0
  141. package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.js +1 -1
  142. package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.js.map +2 -2
  143. package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.test.js +1 -1
  144. package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.test.js.map +3 -3
  145. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.js +1 -1
  146. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.js.map +3 -3
  147. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.test.js +1 -1
  148. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.test.js.map +3 -3
  149. package/lib/esm/internal/app-binder/task/SendSignMessageTask.js +1 -1
  150. package/lib/esm/internal/app-binder/task/SendSignMessageTask.js.map +3 -3
  151. package/lib/esm/internal/app-binder/task/SendSignMessageTask.test.js +3 -1
  152. package/lib/esm/internal/app-binder/task/SendSignMessageTask.test.js.map +3 -3
  153. package/lib/esm/internal/use-cases/transaction/SignTransactionUseCase.js +1 -1
  154. package/lib/esm/internal/use-cases/transaction/SignTransactionUseCase.js.map +3 -3
  155. package/lib/esm/internal/use-cases/transaction/SignTransactionUseCase.test.js +1 -1
  156. package/lib/esm/internal/use-cases/transaction/SignTransactionUseCase.test.js.map +2 -2
  157. package/lib/esm/package.json +44 -40
  158. package/lib/types/api/SignerSolana.d.ts +2 -2
  159. package/lib/types/api/SignerSolana.d.ts.map +1 -1
  160. package/lib/types/api/SolanaTools.d.ts +1 -2
  161. package/lib/types/api/SolanaTools.d.ts.map +1 -1
  162. package/lib/types/api/app-binder/SignMessageDeviceActionTypes.d.ts +3 -2
  163. package/lib/types/api/app-binder/SignMessageDeviceActionTypes.d.ts.map +1 -1
  164. package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts +12 -1
  165. package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts.map +1 -1
  166. package/lib/types/api/index.d.ts +1 -1
  167. package/lib/types/api/index.d.ts.map +1 -1
  168. package/lib/types/api/model/SolanaTransactionOptionalConfig.d.ts +7 -0
  169. package/lib/types/api/model/SolanaTransactionOptionalConfig.d.ts.map +1 -0
  170. package/lib/types/api/model/TransactionResolutionContext.d.ts +15 -0
  171. package/lib/types/api/model/TransactionResolutionContext.d.ts.map +1 -0
  172. package/lib/types/internal/DefaultSignerSolana.d.ts +293 -1
  173. package/lib/types/internal/DefaultSignerSolana.d.ts.map +1 -1
  174. package/lib/types/internal/app-binder/SolanaAppBinder.d.ts +2 -1
  175. package/lib/types/internal/app-binder/SolanaAppBinder.d.ts.map +1 -1
  176. package/lib/types/internal/app-binder/command/GetAppConfigurationCommand.d.ts +1 -0
  177. package/lib/types/internal/app-binder/command/GetAppConfigurationCommand.d.ts.map +1 -1
  178. package/lib/types/internal/app-binder/command/GetChallengeCommand.d.ts +1 -0
  179. package/lib/types/internal/app-binder/command/GetChallengeCommand.d.ts.map +1 -1
  180. package/lib/types/internal/app-binder/command/GetPubKeyCommand.d.ts +4 -1
  181. package/lib/types/internal/app-binder/command/GetPubKeyCommand.d.ts.map +1 -1
  182. package/lib/types/internal/app-binder/command/ProvideTLVDescriptorCommand.d.ts +1 -0
  183. package/lib/types/internal/app-binder/command/ProvideTLVDescriptorCommand.d.ts.map +1 -1
  184. package/lib/types/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.d.ts +29 -0
  185. package/lib/types/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.d.ts.map +1 -0
  186. package/lib/types/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.test.d.ts +2 -0
  187. package/lib/types/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.test.d.ts.map +1 -0
  188. package/lib/types/internal/app-binder/command/SignOffChainMessageCommand.d.ts +14 -9
  189. package/lib/types/internal/app-binder/command/SignOffChainMessageCommand.d.ts.map +1 -1
  190. package/lib/types/internal/app-binder/command/SignTransactionCommand.d.ts +3 -0
  191. package/lib/types/internal/app-binder/command/SignTransactionCommand.d.ts.map +1 -1
  192. package/lib/types/internal/app-binder/device-action/SignTransactionDeviceAction.d.ts +5 -2
  193. package/lib/types/internal/app-binder/device-action/SignTransactionDeviceAction.d.ts.map +1 -1
  194. package/lib/types/internal/app-binder/services/TransactionInspector.d.ts +24 -11
  195. package/lib/types/internal/app-binder/services/TransactionInspector.d.ts.map +1 -1
  196. package/lib/types/internal/app-binder/services/bs58Encoder.d.ts +9 -0
  197. package/lib/types/internal/app-binder/services/bs58Encoder.d.ts.map +1 -0
  198. package/lib/types/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.d.ts +8 -0
  199. package/lib/types/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.d.ts.map +1 -0
  200. package/lib/types/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.test.d.ts +2 -0
  201. package/lib/types/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.test.d.ts.map +1 -0
  202. package/lib/types/internal/app-binder/services/utils/transactionDecoders.d.ts +14 -0
  203. package/lib/types/internal/app-binder/services/utils/transactionDecoders.d.ts.map +1 -0
  204. package/lib/types/internal/app-binder/task/BuildTransactionContextTask.d.ts +6 -11
  205. package/lib/types/internal/app-binder/task/BuildTransactionContextTask.d.ts.map +1 -1
  206. package/lib/types/internal/app-binder/task/ProvideTransactionContextTask.d.ts +9 -5
  207. package/lib/types/internal/app-binder/task/ProvideTransactionContextTask.d.ts.map +1 -1
  208. package/lib/types/internal/app-binder/task/SendSignMessageTask.d.ts +22 -6
  209. package/lib/types/internal/app-binder/task/SendSignMessageTask.d.ts.map +1 -1
  210. package/lib/types/internal/use-cases/transaction/SignTransactionUseCase.d.ts +2 -3
  211. package/lib/types/internal/use-cases/transaction/SignTransactionUseCase.d.ts.map +1 -1
  212. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  213. package/package.json +37 -33
  214. package/lib/cjs/api/model/TransactionOptions.js +0 -2
  215. package/lib/cjs/api/model/TransactionOptions.js.map +0 -7
  216. package/lib/cjs/internal/app-binder/command/ProvideTrustedNamePKICommand.js +0 -2
  217. package/lib/cjs/internal/app-binder/command/ProvideTrustedNamePKICommand.js.map +0 -7
  218. package/lib/cjs/internal/app-binder/command/ProvideTrustedNamePKICommand.test.js +0 -2
  219. package/lib/cjs/internal/app-binder/command/ProvideTrustedNamePKICommand.test.js.map +0 -7
  220. package/lib/esm/api/model/TransactionOptions.js +0 -1
  221. package/lib/esm/internal/app-binder/command/ProvideTrustedNamePKICommand.js +0 -2
  222. package/lib/esm/internal/app-binder/command/ProvideTrustedNamePKICommand.js.map +0 -7
  223. package/lib/esm/internal/app-binder/command/ProvideTrustedNamePKICommand.test.js +0 -2
  224. package/lib/esm/internal/app-binder/command/ProvideTrustedNamePKICommand.test.js.map +0 -7
  225. package/lib/types/api/model/TransactionOptions.d.ts +0 -8
  226. package/lib/types/api/model/TransactionOptions.d.ts.map +0 -1
  227. package/lib/types/internal/app-binder/command/ProvideTrustedNamePKICommand.d.ts +0 -13
  228. package/lib/types/internal/app-binder/command/ProvideTrustedNamePKICommand.d.ts.map +0 -1
  229. package/lib/types/internal/app-binder/command/ProvideTrustedNamePKICommand.test.d.ts +0 -2
  230. package/lib/types/internal/app-binder/command/ProvideTrustedNamePKICommand.test.d.ts.map +0 -1
  231. /package/lib/esm/api/model/{TransactionOptions.js.map → SolanaTransactionOptionalConfig.js.map} +0 -0
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/device-action/SignTransactionDeviceAction.ts"],
4
- "sourcesContent": ["import {\n type CommandErrorResult,\n type CommandResult,\n type DeviceActionStateMachine,\n DeviceModelId,\n type InternalApi,\n isSuccessCommandResult,\n OpenAppDeviceAction,\n type StateMachineTypes,\n UnknownDAError,\n UserInteractionRequired,\n XStateDeviceAction,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, type Maybe, Right } from \"purify-ts\";\nimport { assign, fromPromise, setup } from \"xstate\";\n\nimport {\n type SignTransactionDAError,\n type SignTransactionDAInput,\n type SignTransactionDAIntermediateValue,\n type SignTransactionDAInternalState,\n type SignTransactionDAOutput,\n} from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { type AppConfiguration } from \"@api/model/AppConfiguration\";\nimport { type Signature } from \"@api/model/Signature\";\nimport { GetAppConfigurationCommand } from \"@internal/app-binder/command/GetAppConfigurationCommand\";\nimport { SignTransactionCommand } from \"@internal/app-binder/command/SignTransactionCommand\";\nimport { type SolanaAppErrorCodes } from \"@internal/app-binder/command/utils/SolanaApplicationErrors\";\nimport { ApplicationChecker } from \"@internal/app-binder/services/ApplicationChecker\";\nimport {\n SolanaTransactionTypes,\n TransactionInspector,\n type TxInspectorResult,\n} from \"@internal/app-binder/services/TransactionInspector\";\nimport {\n BuildTransactionContextTask,\n type BuildTransactionContextTaskArgs,\n type SolanaBuildContextResult,\n} from \"@internal/app-binder/task/BuildTransactionContextTask\";\nimport {\n ProvideSolanaTransactionContextTask,\n type SolanaContextForDevice,\n} from \"@internal/app-binder/task/ProvideTransactionContextTask\";\nimport { SignDataTask } from \"@internal/app-binder/task/SendSignDataTask\";\n\nexport type MachineDependencies = {\n readonly getAppConfig: () => Promise<\n CommandResult<AppConfiguration, SolanaAppErrorCodes>\n >;\n readonly buildContext: (arg0: {\n input: BuildTransactionContextTaskArgs;\n }) => Promise<SolanaBuildContextResult>;\n readonly provideContext: (arg0: {\n input: SolanaContextForDevice;\n }) => Promise<Maybe<CommandErrorResult<SolanaAppErrorCodes>>>;\n readonly inspectTransaction: (arg0: {\n serializedTransaction: Uint8Array;\n }) => Promise<TxInspectorResult>;\n readonly signTransaction: (arg0: {\n input: {\n derivationPath: string;\n serializedTransaction: Uint8Array;\n };\n }) => Promise<\n CommandResult<Maybe<Signature | SolanaAppErrorCodes>, SolanaAppErrorCodes>\n >;\n};\n\nexport class SignTransactionDeviceAction extends XStateDeviceAction<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n> {\n makeStateMachine(\n internalApi: InternalApi,\n ): DeviceActionStateMachine<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n > {\n type types = StateMachineTypes<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n >;\n\n const {\n signTransaction,\n getAppConfig,\n buildContext,\n provideContext,\n inspectTransaction,\n } = this.extractDependencies(internalApi);\n\n return setup({\n types: {\n input: {} as types[\"input\"],\n context: {} as types[\"context\"],\n output: {} as types[\"output\"],\n },\n actors: {\n openAppStateMachine: new OpenAppDeviceAction({\n input: { appName: \"Solana\" },\n }).makeStateMachine(internalApi),\n getAppConfig: fromPromise(getAppConfig),\n inspectTransaction: fromPromise(\n ({ input }: { input: SignTransactionDAInput }) =>\n inspectTransaction({ serializedTransaction: input.transaction }),\n ),\n buildContext: fromPromise(buildContext),\n provideContext: fromPromise(provideContext),\n signTransaction: fromPromise(signTransaction),\n },\n guards: {\n noInternalError: ({ context }) => context._internalState.error === null,\n skipOpenApp: ({ context }) => context.input.skipOpenApp,\n isSPLSupported: ({ context }) =>\n new ApplicationChecker(\n internalApi.getDeviceSessionState(),\n context._internalState.appConfig!,\n )\n .withMinVersionExclusive(\"1.4.0\")\n .excludeDeviceModel(DeviceModelId.NANO_S)\n .check(),\n isAnSPLTransaction: ({ context }) =>\n context._internalState.inspectorResult?.transactionType ===\n SolanaTransactionTypes.SPL,\n },\n actions: {\n assignErrorFromEvent: assign({\n _internalState: (_) => ({\n ..._.context._internalState,\n error: new UnknownDAError(\n _.event[\"error\"] instanceof Error\n ? _.event[\"error\"].message\n : String(_.event[\"error\"]),\n ),\n }),\n }),\n },\n }).createMachine({\n /** @xstate-layout N4IgpgJg5mDOIC5QGUCWUB2AVATgQw1jwGMAXVAewwBEwA3VYsAQTMowDoBJDVcvADbJSeUmADEAbQAMAXUSgADhVh92CkAA9EARgDsAZg4AOPdL37pAFj1WArACYANCACeuh4Y46dxgGzSBnZ6AQZ6dgC+ES5omLgERGxUtAxMrORU3Lz8QiJiUjrySCDKqhkYGtoI+kam5pY29s5uujrSxhzSAJw+AcZWplZ+BlEx6Nj4hCTlKYwsSZwA8opgGMyKirNpC+IQVGAcqBh0FADWBxQraxvComAAsiQAFkdgMkVKKmpUlYjhOhw7F0bAYrAN9HZrC53NV2lZAV1AnYrGEul0wpFoiBYhMEtN2Ft5uUOABhJ5gYinZardabehzdLsABKcAArgJSFI5BpSt8KsUqjoDDoHJ0ug5jAY6jowbZoa0ZYDpHYfA59A47H4BqNseN4lMFoTGZkyRSqVdaUaFizYOzOZJCjyvuVftVhaLuhKpWYZY15QhjADpH4HAMQ0FzOEujqcfrEjN6dtiQBxMCkWkkqgAM3Qu32h2OZwOMHTG0zGBzUHeTrK6gFukDeg4fj04Slwbavis-pFAw4en6wSGfmRXWMMb1k3jBMTRPYHFTpcU5cr4jAOBwFBwHEUAlEWa3AFsOCWM9n0NXiryXfXqo3m627O2-J3+j20RwHIjhiHPAOrIEE5xFO+LJLOxqcIuZ4VugNp2qalJch8JTOnWoBVA4njwv0OiOFYaohNIwY9p4HR+GiGrGNYAEOEEQG4gaCapHOmRQWW55QHBHIIacBTIdeaFaIgmG2CYVi4aGBEBMRLQIKCQY6F0QIigY0iKdGWKxiBhrgQsWSwCsZBxqBGB5hgBxHCc5wFgZFKkMZCyXp8tY-LeEr4f2yKmGOwyGF0JHkRwYQGORxj+C2fgtvRDlMQyek8LZRnaeUa4bluO57qQB44MeRyJfZyXsE5KEufy6HCf0orhAMeg+cF-myfYXSfjYtgiphiLIn40WFWBzEQRwzBZmIOAJYZ9rcleqGueVcmYUYtFdC2spSphPYih0QxLX4gbCqCdiYmMwF4jp-V6UNI1jXZfE1nyroGPNn4GEttggsYa2yUK0iilYSkorRaqqQYIyaZOJ2xUm84XeuV1kFIDj8dNZVCXNtFPS9K3vc0MLSRwXQhFqkZKYpOg9eDM5ncSABCrKoAIEDlmImicns5kFlZBwAEa0-TjNgMzxUCTNKNhDYn5jqpA6guJB3rWjNiOARX74-YZOMRTcXUzzDNUEznLrpu267vuR4cNzdM6xgeuC0j922E2X6SuYkpgrhdj+hYzUONY-QK8Y4o7Wr059Zr84AAqbgwEBgHzzNmRZhbWYokeoNHsekDbpWuvhYWAp4in9Pj4r2OtWr9p4yIE-0YXjqDx3qyHkOZBHFBRzHuv8-raVG5l2XHsnrep+3Vud5nd23jnHSOJ7he1aG7uyf40h48Dr3CgdAGHbq9fBzQunEi3bfp1xpA8Uht03rNCvYQO3T+IMIbrRYJhLUC3syvtQcmVaB8p2nHfMxPmfB0iMs4T2qiYW+PkH7Y10ERUUkUHBam9GqZEIMjoMV3j-ecWlyZUHjuzIsHBVA7xMmPS+KNHCSiCsCMEAQfRjhIgObwL4vwahJqwr+p1Q6ZFwQ3UyBt0rGyyqbEhmCyGTWcuPWaVCjDPTBEMcwalGGfRFMvf2cIBwqk1L4LhEMWKcD4bvIB5JELkMElUYIyJvDBEijYF8wweyqQ6OYAIkJhT6DClvIx39944LBvwkxZobpTTATIiBuECb2J0I4z6SCEEFzsO9NErZAxRCxBgCg0d4DFB8dwpuyMhbIyqAAWj8P6Epdg8ZohqbUmpX49EawKVkNQghbhiAvhYxA+EArwnIm0b6SC1JmG8QErBfjMjUmuHSSmgkin3QOs2bo5hHDbXEjoHswZl5fkUphAZ-gkGNMbgY0kpjzQ0g2NgqgJ9OnC0FERZerZES7X2Z4dawZOiPjaMYTUoUjl71maxNM0FKy3OKboSEP0RQ+HCFY-GsDqioI4DVAI3skn-FGaQ-JJy2LLg4kEykYLXTew1J0B6L5HCr1qgYJh2yLAqnaL4XCwN-lXM4LDAqeDCm2zckMKpMSVK-RbCFZUJEnzIuGe-GqIRSZ13Ediga0NRqEHGkS28qkdotQOWGQMxgSKIhMH0A6oIgieAcKyiZnAaYW3Tmq2a0sqnkWRJqAYalgx6E2QazxIq1IDCBhawFnBD5D1taE6RIs-rNlWU+HwQRIrlNUe0Zs1cJTKk1GYbqcqYpNJOcG-+I9AFsm4mcu1KMwRKRMFjcILZgw-NLkYIYpgQqBkhHoUMAaeGGLGSZUtVRfr2G8PjKiwIwiYQRe1JsT4-rPVwuib6Hbml5PKAS04vbECjkeb9SlkklINRhCKD8Wpfb+13WqTNGDs3HIGsgVkxAmCwByVIihlixzwlahiFUQo926FUthX0iJ8K-Xmguk5ABRbua6EBAn6Mi1sH7Y3foQIYJsQR1n42VEKRw6SIhAA */\n id: \"SignTransactionDeviceAction\",\n initial: \"InitialState\",\n context: ({ input }) => ({\n input,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n _internalState: {\n error: null,\n signature: null,\n appConfig: null,\n solanaTransactionContext: null,\n inspectorResult: null,\n },\n }),\n states: {\n InitialState: {\n always: [\n { target: \"GetAppConfig\", guard: \"skipOpenApp\" },\n { target: \"OpenAppDeviceAction\" },\n ],\n },\n OpenAppDeviceAction: {\n exit: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n invoke: {\n id: \"openAppStateMachine\",\n src: \"openAppStateMachine\",\n input: () => ({ appName: \"Solana\" }),\n onSnapshot: {\n actions: assign({\n intermediateValue: ({ event }) =>\n event.snapshot.context.intermediateValue,\n }),\n },\n onDone: {\n target: \"CheckOpenAppDeviceActionResult\",\n actions: assign({\n _internalState: ({ event, context }) =>\n event.output.caseOf({\n Right: () => context._internalState,\n Left: (error) => ({\n ...context._internalState,\n error,\n }),\n }),\n }),\n },\n },\n },\n CheckOpenAppDeviceActionResult: {\n always: [\n { target: \"GetAppConfig\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n GetAppConfig: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n invoke: {\n id: \"getAppConfig\",\n src: \"getAppConfig\",\n onDone: {\n target: \"GetAppConfigResultCheck\",\n actions: assign({\n _internalState: ({ event, context }) =>\n isSuccessCommandResult(event.output)\n ? {\n ...context._internalState,\n appConfig: event.output.data,\n }\n : { ...context._internalState, error: event.output.error },\n }),\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n GetAppConfigResultCheck: {\n always: [\n { target: \"InspectTransaction\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n InspectTransaction: {\n invoke: {\n id: \"inspectTransaction\",\n src: \"inspectTransaction\",\n input: ({ context }) => ({\n ...context.input,\n serializedTransaction: context.input.transaction,\n }),\n onDone: {\n target: \"AfterInspect\",\n actions: assign({\n _internalState: ({ context, event }) => ({\n ...context._internalState,\n inspectorResult: event.output,\n }),\n }),\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n AfterInspect: {\n always: [\n { target: \"BuildContext\", guard: \"isAnSPLTransaction\" },\n { target: \"SignTransaction\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n BuildContext: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n invoke: {\n id: \"buildContext\",\n src: \"buildContext\",\n input: ({ context }) => {\n const inspectorData =\n context._internalState.inspectorResult?.data;\n return {\n contextModule: context.input.contextModule,\n options: {\n tokenAddress: inspectorData?.tokenAddress,\n createATA: inspectorData?.createATA,\n },\n };\n },\n onDone: {\n target: \"ProvideContext\",\n actions: [\n assign({\n _internalState: ({ event, context }) => ({\n ...context._internalState,\n solanaTransactionContext: {\n descriptor: event.output.descriptor,\n certificate: event.output.calCertificate,\n tokenAccount: event.output.addressResult.tokenAccount,\n owner: event.output.addressResult.owner,\n contract: event.output.addressResult.contract,\n },\n }),\n }),\n ],\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n ProvideContext: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n invoke: {\n id: \"provideContext\",\n src: \"provideContext\",\n input: ({ context }) => {\n if (!context._internalState.solanaTransactionContext) {\n throw new UnknownDAError(\n \"Solana transaction context is not available\",\n );\n }\n return context._internalState.solanaTransactionContext;\n },\n onDone: {\n target: \"ProvideContextResultCheck\",\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n ProvideContextResultCheck: {\n always: [\n { target: \"SignTransaction\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n SignTransaction: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n },\n }),\n exit: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n }),\n invoke: {\n id: \"signTransaction\",\n src: \"signTransaction\",\n input: ({ context }) => {\n return {\n derivationPath: context.input.derivationPath,\n serializedTransaction: context.input.transaction,\n };\n },\n onDone: {\n target: \"SignTransactionResultCheck\",\n actions: [\n assign({\n _internalState: ({ event, context }) => {\n if (!isSuccessCommandResult(event.output))\n return {\n ...context._internalState,\n error: event.output.error,\n };\n\n const data = event.output.data.extract();\n if (\n event.output.data.isJust() &&\n data instanceof Uint8Array\n )\n return {\n ...context._internalState,\n signature: data,\n };\n\n return {\n ...context._internalState,\n error: new UnknownDAError(\"No Signature available\"),\n };\n },\n }),\n ],\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n SignTransactionResultCheck: {\n always: [\n { guard: \"noInternalError\", target: \"Success\" },\n { target: \"Error\" },\n ],\n },\n Success: { type: \"final\" },\n Error: { type: \"final\" },\n },\n output: ({ context }) =>\n context._internalState.signature\n ? Right(context._internalState.signature)\n : Left(\n context._internalState.error ||\n new UnknownDAError(`No error or signature available`),\n ),\n });\n }\n\n extractDependencies(internalApi: InternalApi): MachineDependencies {\n const getAppConfig = async () =>\n internalApi.sendCommand(new GetAppConfigurationCommand());\n\n const buildContext = async (arg0: {\n input: BuildTransactionContextTaskArgs;\n }) => new BuildTransactionContextTask(internalApi, arg0.input).run();\n\n const provideContext = async (arg0: { input: SolanaContextForDevice }) =>\n new ProvideSolanaTransactionContextTask(internalApi, arg0.input).run();\n\n const inspectTransaction = async (arg0: {\n serializedTransaction: Uint8Array;\n }) =>\n Promise.resolve(\n new TransactionInspector(\n arg0.serializedTransaction,\n ).inspectTransactionType(),\n );\n\n const signTransaction = async (arg0: {\n input: {\n derivationPath: string;\n serializedTransaction: Uint8Array;\n };\n }) =>\n new SignDataTask(internalApi, {\n commandFactory: (args) =>\n new SignTransactionCommand({\n serializedTransaction: args.chunkedData,\n more: args.more,\n extend: args.extend,\n }),\n derivationPath: arg0.input.derivationPath,\n sendingData: arg0.input.serializedTransaction,\n }).run();\n\n return {\n getAppConfig,\n buildContext,\n provideContext,\n signTransaction,\n inspectTransaction,\n };\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["DeviceModelId", "isSuccessCommandResult", "OpenAppDeviceAction", "UnknownDAError", "UserInteractionRequired", "XStateDeviceAction", "Left", "Right", "assign", "fromPromise", "setup", "GetAppConfigurationCommand", "SignTransactionCommand", "ApplicationChecker", "SolanaTransactionTypes", "TransactionInspector", "BuildTransactionContextTask", "ProvideSolanaTransactionContextTask", "SignDataTask", "SignTransactionDeviceAction", "internalApi", "signTransaction", "getAppConfig", "buildContext", "provideContext", "inspectTransaction", "input", "context", "_", "event", "error", "inspectorData", "data", "arg0", "args"]
4
+ "sourcesContent": ["import {\n type CommandErrorResult,\n type CommandResult,\n type DeviceActionStateMachine,\n DeviceModelId,\n type InternalApi,\n isSuccessCommandResult,\n OpenAppDeviceAction,\n type StateMachineTypes,\n UnknownDAError,\n UserInteractionRequired,\n XStateDeviceAction,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, type Maybe, Right } from \"purify-ts\";\nimport { assign, fromPromise, setup } from \"xstate\";\n\nimport {\n type SignTransactionDAError,\n type SignTransactionDAInput,\n type SignTransactionDAIntermediateValue,\n type SignTransactionDAInternalState,\n type SignTransactionDAOutput,\n signTransactionDAStateSteps,\n} from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { type AppConfiguration } from \"@api/model/AppConfiguration\";\nimport { type Signature } from \"@api/model/Signature\";\nimport {\n type TransactionResolutionContext,\n type UserInputType,\n} from \"@api/model/TransactionResolutionContext\";\nimport { GetAppConfigurationCommand } from \"@internal/app-binder/command/GetAppConfigurationCommand\";\nimport { SignTransactionCommand } from \"@internal/app-binder/command/SignTransactionCommand\";\nimport { type SolanaAppErrorCodes } from \"@internal/app-binder/command/utils/SolanaApplicationErrors\";\nimport { ApplicationChecker } from \"@internal/app-binder/services/ApplicationChecker\";\nimport {\n SolanaTransactionTypes,\n TransactionInspector,\n} from \"@internal/app-binder/services/TransactionInspector\";\nimport { type TxInspectorResult } from \"@internal/app-binder/services/TransactionInspector\";\nimport {\n BuildTransactionContextTask,\n type BuildTransactionContextTaskArgs,\n type SolanaBuildContextResult,\n} from \"@internal/app-binder/task/BuildTransactionContextTask\";\nimport {\n ProvideSolanaTransactionContextTask,\n type ProvideSolanaTransactionContextTaskContext,\n} from \"@internal/app-binder/task/ProvideTransactionContextTask\";\nimport { SignDataTask } from \"@internal/app-binder/task/SendSignDataTask\";\n\nexport type MachineDependencies = {\n readonly getAppConfig: () => Promise<\n CommandResult<AppConfiguration, SolanaAppErrorCodes>\n >;\n readonly buildContext: (arg0: {\n input: BuildTransactionContextTaskArgs;\n }) => Promise<SolanaBuildContextResult>;\n readonly provideContext: (arg0: {\n input: ProvideSolanaTransactionContextTaskContext;\n }) => Promise<Maybe<CommandErrorResult<SolanaAppErrorCodes>>>;\n readonly inspectTransaction: (arg0: {\n serializedTransaction: Uint8Array;\n resolutionContext?: TransactionResolutionContext;\n rpcUrl?: string;\n }) => Promise<TxInspectorResult>;\n readonly signTransaction: (arg0: {\n input: {\n derivationPath: string;\n serializedTransaction: Uint8Array;\n };\n }) => Promise<\n CommandResult<Maybe<Signature | SolanaAppErrorCodes>, SolanaAppErrorCodes>\n >;\n};\n\nexport class SignTransactionDeviceAction extends XStateDeviceAction<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n> {\n makeStateMachine(\n internalApi: InternalApi,\n ): DeviceActionStateMachine<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n > {\n type types = StateMachineTypes<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n >;\n\n const {\n signTransaction,\n getAppConfig,\n buildContext,\n provideContext,\n inspectTransaction,\n } = this.extractDependencies(internalApi);\n\n return setup({\n types: {\n input: {} as types[\"input\"],\n context: {} as types[\"context\"],\n output: {} as types[\"output\"],\n },\n actors: {\n openAppStateMachine: new OpenAppDeviceAction({\n input: { appName: \"Solana\" },\n }).makeStateMachine(internalApi),\n\n getAppConfig: fromPromise(getAppConfig),\n inspectTransaction: fromPromise(\n ({\n input,\n }: {\n input: {\n serializedTransaction: Uint8Array;\n resolutionContext?: TransactionResolutionContext;\n rpcUrl?: string;\n };\n }) =>\n inspectTransaction({\n serializedTransaction: input.serializedTransaction,\n resolutionContext: input.resolutionContext,\n rpcUrl: input.rpcUrl,\n }),\n ),\n buildContext: fromPromise(buildContext),\n provideContext: fromPromise(provideContext),\n signTransaction: fromPromise(signTransaction),\n },\n guards: {\n noInternalError: ({ context }) => context._internalState.error === null,\n skipOpenApp: ({ context }) =>\n context.input.transactionOptions?.skipOpenApp || false,\n isSPLSupported: ({ context }) =>\n new ApplicationChecker(\n internalApi.getDeviceSessionState(),\n context._internalState.appConfig!,\n )\n .withMinVersionExclusive(\"1.4.0\")\n .excludeDeviceModel(DeviceModelId.NANO_S)\n .check(),\n isAnSPLTransaction: ({ context }) =>\n context._internalState.inspectorResult?.transactionType ===\n SolanaTransactionTypes.SPL,\n shouldSkipInspection: ({ context }) =>\n context._internalState.error === null &&\n !!context.input.transactionOptions?.transactionResolutionContext,\n },\n actions: {\n assignErrorFromEvent: assign({\n _internalState: (_) => ({\n ..._.context._internalState,\n error: new UnknownDAError(\n _.event[\"error\"] instanceof Error\n ? _.event[\"error\"].message\n : String(_.event[\"error\"]),\n ),\n }),\n }),\n },\n }).createMachine({\n /** @xstate-layout N4IgpgJg5mDOIC5QGUCWUB2AVATgQw1jwGMAXVAewwBEwA3VYsAQTMowDoBJDVcvADbJSeUmADEAbQAMAXUSgADhVh92CkAA9EARgDsAZg4AOAJzSAbNNOmATNZ0AWPRYA0IAJ67bLjgcfW-hYArNIGpsGOAL5R7miYuAREbFS0DEys5FTcvPxCImJSOvJIIMqqWRga2gj6RmaW1nYOzm6eujqdHNbWPsE6DXq2MXHo2PiEJJVpjCwpnADyimAYzIqKMxnz4hBUYByoGHQUANb7FMur68KiYACyJAAWh2AyJUoqalTViHrBthxbP5-I5HMZjH9gm0vLVpBCOBYnI5bBY9NI4RZjCMQPFxkkpuxNnNKhwAMKPMDEE5LFZrDb0WaZdgAJTgAFcBKQpHINOUvlVSjUdAZhX5HAY9JLbMEDAZMXp3DDOvoOKEXIZgsZ9JrorEcWNEpN5kSmdlyZTqZc6Sb5qzYByuZJirzPpUfrURUZgZKhjK5RDFYgtRxHDZTKCJZjEXosXrcYbktMGVsSQBxMCkOmkqgAM3QOz2ByOp32MEz62zGDzUDeLoq6kFui1plVpgMEIs9kldlsgdq0oBYU6xmkAwh0mCwWx8YmicJyeJ7A46fLikr1fEYBwOAoOA4igEohzu4Athwy1nc+ha6U+W7G7Vm632y4u3oe32dDYOGHzDLLMYEootOBqzgSqQLqanArpeVboHaDrmlS3LvGUroNqANS2D4eh+H8fSvl+eiOJ+tjBnYyKohY5hAtIuqjAkYHGpB8zLhmsHVghnJIScRSoXeGFaIg2GSnh-x-IRpjEX2-g6D+LigqioIyo4kQgYx+LMeki7ZDwsDLGQCbgRgBYYPshzHGcRb6ZSpBGfMN4fPW3wPmRqk-tR6KOE4Oids4pFDAiUmYjYI5gu26l4kaSbaVBOQ2YZTGVJu267vuh6kMeOBnocCV2Ul7COWhzkCphwnGO5pieXRPl+Qq7QII4Vghgp0jqqpOiRfZMWMqxzA5mIOB6QZjo8re6EuWVCAGCJ3SdtRAwxqOvYNZ0IohiEETBKYgHBHowpdQVEGxX1A1bsNtl8XW-LujNPhzSipiLSOOgrUqBgThw752GidHvpqBiHZpPUpku-WDRdZBSLY-ETaVQnTbNliPc9y19lYAKqbY4ZPa9XbDHGoHA-OJ0kgAQmyqACBAlZiJoXK7GZRaWfsABGlPU7TYD00VAmTQjEr9CYr3il+6JOJ+r0WKqQzmDNvk6P8sYMVFc7Hb15MczTVB01yW47nuB5HqeHDs1T2sYLrvNw7dfxyVqtii+Yo4kQ1QzSD+-w7VJIrGCEgOExp0UkxrS4AAo7gwEBgFz9OmeZxZWYokeoNHsekNbJXusibZfQMARO09b0dKiJjGCi6JkdtthOEDwfq6D2QRxQUcxzr3N66lhsZVlZ7Jy3qdt5bHeZzdD450Y+0VXRIo2K9fZ+wCdgRCKvkRPNddqzQLEks3rfp1xpA8Sh133lNrQe-K7ZURjiuS383Shk1fqK8Bgeq8ZNq7ynaft-Th-HydLDLO48XCXwhNfFwt9gifi8j+CcNhsbaklJ1d+3UQ6N04DOYmVB47MxLBwVQQct6jzPgjJWLYIT-DottbyOhSLBjBBERWmp5rGCnGgo629SZLmwfXEy+s0pG0yibIhH8HJjScmPKaFCTD4RoeGToksgQhgQTKCqkJHab0-jvXhRN+EAIpMhUhgkah7URICUIbVpA13FE9T8q8-DlxCJ2Jwjt2HaK0qHbIfCt6GItFdcaICZEuDktKdEaJbHhHoatFEwQnHSmIlJUMM1dR6gwBQaO8BSi+J0Tw-mfN4Y1AALTQkQMU+Jv4qm-gsKpTxIMdKcB4GoQQNwxCn1MYgZEpFMQcH0FjbCgECYq3QQ3RpHAaRXHpPk+GhTbpQkBMCZEnRtpDBCLAiwXoAhVR0BEtqeh6kYPGTxSZ1pdFUEPh0-mQpK7dEVhYaiGiXoGEltYMU1hPJi1WYcsZcUYIVivFAK5RTdChEcICEI5cwT7VUpqUiAwETEXbE0CE4JUEjK4V-Jc-y1yAv8VSYF7p7D3UiGicUyyXA7QCpPcxyItRDCcAczhODuHeKaYQEaozZk21ck1YwgIpK+QCOiJ6VVSILKUtjOe21NkBwxSyrF2RwbnQ5bZQlD4PqBWRoYNqwoXmxPDCGR2q8dq7WVvqYheS2UcApubdO6qpr+FCH0gItT7A2CsJEWBuca6aietQ7y-wfmsswRwPeg97VBOkQLCILYXBKzCJOF8ksujfW8nYKwU96IWvEQ0uK4bf7D3-uybiRiTgOoRqpUciLFb7T9GYSWDyy4oi1G1J6dTmX8MVVg-RW8K01FDELKwP0rHOFBKRD6X0bBNQeaEWeFhg3do4Lk20Jaj5lv7YgSIUkTBkQnB9FJe0HFhEBIrLU4IDCRBFou85WC2TECYLAbJUiyFmMQX0oYOEa751du9OECTMQyn+AEDh8qu23o4AAUS7puhA207AfpEgyn9fZDAtllH7awSaJTghiDEIAA */\n id: \"SignTransactionDeviceAction\",\n initial: \"InitialState\",\n context: ({ input }) => ({\n input,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.OPEN_APP,\n },\n _internalState: {\n error: null,\n signature: null,\n appConfig: null,\n solanaTransactionContext: null,\n inspectorResult: null,\n },\n }),\n states: {\n InitialState: {\n always: [\n { target: \"GetAppConfig\", guard: \"skipOpenApp\" },\n { target: \"OpenAppDeviceAction\" },\n ],\n },\n OpenAppDeviceAction: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.OPEN_APP,\n }),\n }),\n invoke: {\n id: \"openAppStateMachine\",\n src: \"openAppStateMachine\",\n input: () => ({ appName: \"Solana\" }),\n onSnapshot: {\n actions: assign({\n intermediateValue: ({ event }) => ({\n ...event.snapshot.context.intermediateValue,\n step: signTransactionDAStateSteps.OPEN_APP,\n }),\n }),\n },\n onDone: {\n target: \"CheckOpenAppDeviceActionResult\",\n actions: assign({\n _internalState: ({ event, context }) =>\n event.output.caseOf({\n Right: () => context._internalState,\n Left: (error) => ({\n ...context._internalState,\n error,\n }),\n }),\n }),\n },\n },\n },\n CheckOpenAppDeviceActionResult: {\n always: [\n { target: \"GetAppConfig\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n GetAppConfig: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.GET_APP_CONFIG,\n }),\n }),\n invoke: {\n id: \"getAppConfig\",\n src: \"getAppConfig\",\n onDone: {\n target: \"GetAppConfigResultCheck\",\n actions: assign({\n _internalState: ({ event, context }) =>\n isSuccessCommandResult(event.output)\n ? {\n ...context._internalState,\n appConfig: event.output.data,\n }\n : { ...context._internalState, error: event.output.error },\n }),\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n GetAppConfigResultCheck: {\n always: [\n { target: \"InspectTransaction\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n InspectTransaction: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.INSPECT_TRANSACTION,\n }),\n }),\n invoke: {\n id: \"inspectTransaction\",\n src: \"inspectTransaction\",\n\n input: ({ context }) => ({\n serializedTransaction: context.input.transaction,\n resolutionContext:\n context.input.transactionOptions?.transactionResolutionContext,\n rpcUrl: context.input.transactionOptions?.solanaRPCURL,\n }),\n onDone: {\n target: \"AfterInspect\",\n actions: assign({\n _internalState: ({ context, event }) => ({\n ...context._internalState,\n inspectorResult: event.output,\n }),\n }),\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n AfterInspect: {\n always: [\n { target: \"BuildContext\", guard: \"isAnSPLTransaction\" },\n { target: \"SignTransaction\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n BuildContext: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.BUILD_TRANSACTION_CONTEXT,\n }),\n }),\n invoke: {\n id: \"buildContext\",\n src: \"buildContext\",\n input: ({ context }) => {\n const inspectorData =\n context._internalState.inspectorResult?.data;\n return {\n contextModule: context.input.contextModule,\n options: {\n tokenAddress: inspectorData?.tokenAddress,\n createATA: inspectorData?.createATA,\n tokenInternalId:\n context.input.transactionOptions\n ?.transactionResolutionContext?.tokenInternalId,\n templateId:\n context.input.transactionOptions\n ?.transactionResolutionContext?.templateId,\n },\n };\n },\n onDone: {\n target: \"ProvideContext\",\n actions: [\n assign({\n _internalState: ({ event, context }) => ({\n ...context._internalState,\n solanaTransactionContext: {\n tlvDescriptor: event.output.tlvDescriptor,\n trustedNamePKICertificate:\n event.output.trustedNamePKICertificate,\n loadersResults: event.output.loadersResults,\n },\n }),\n }),\n ],\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n ProvideContext: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.PROVIDE_TRANSACTION_CONTEXT,\n }),\n }),\n invoke: {\n id: \"provideContext\",\n src: \"provideContext\",\n input: ({ context }) => {\n if (!context._internalState.solanaTransactionContext) {\n throw new UnknownDAError(\n \"Solana transaction context is not available\",\n );\n }\n return {\n ...context._internalState.solanaTransactionContext,\n transactionBytes: context.input.transaction,\n };\n },\n onDone: {\n target: \"ProvideContextResultCheck\",\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n ProvideContextResultCheck: {\n always: [\n { target: \"SignTransaction\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n SignTransaction: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n step: signTransactionDAStateSteps.SIGN_TRANSACTION,\n },\n }),\n invoke: {\n id: \"signTransaction\",\n src: \"signTransaction\",\n input: ({ context }) => {\n return {\n derivationPath: context.input.derivationPath,\n serializedTransaction: context.input.transaction,\n userInputType:\n context.input.transactionOptions?.transactionResolutionContext\n ?.userInputType,\n };\n },\n onDone: {\n target: \"SignTransactionResultCheck\",\n actions: [\n assign({\n _internalState: ({ event, context }) => {\n if (!isSuccessCommandResult(event.output))\n return {\n ...context._internalState,\n error: event.output.error,\n };\n\n const data = event.output.data.extract();\n if (\n event.output.data.isJust() &&\n data instanceof Uint8Array\n )\n return {\n ...context._internalState,\n signature: data,\n };\n\n return {\n ...context._internalState,\n error: new UnknownDAError(\"No Signature available\"),\n };\n },\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.SIGN_TRANSACTION,\n },\n }),\n ],\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n SignTransactionResultCheck: {\n always: [\n { guard: \"noInternalError\", target: \"Success\" },\n { target: \"Error\" },\n ],\n },\n Success: { type: \"final\" },\n Error: { type: \"final\" },\n },\n output: ({ context }) =>\n context._internalState.signature\n ? Right(context._internalState.signature)\n : Left(\n context._internalState.error ||\n new UnknownDAError(`No error or signature available`),\n ),\n });\n }\n\n extractDependencies(internalApi: InternalApi): MachineDependencies {\n const getAppConfig = async () =>\n internalApi.sendCommand(new GetAppConfigurationCommand());\n\n const buildContext = async (arg0: {\n input: BuildTransactionContextTaskArgs;\n }) => new BuildTransactionContextTask(internalApi, arg0.input).run();\n\n const provideContext = async (arg0: {\n input: ProvideSolanaTransactionContextTaskContext;\n }) =>\n new ProvideSolanaTransactionContextTask(internalApi, arg0.input).run();\n\n const inspectTransaction = async (arg0: {\n serializedTransaction: Uint8Array;\n resolutionContext?: TransactionResolutionContext;\n rpcUrl?: string;\n }) =>\n Promise.resolve(\n new TransactionInspector(arg0.rpcUrl).inspectTransactionType(\n arg0.serializedTransaction,\n arg0.resolutionContext?.tokenAddress,\n arg0.resolutionContext?.createATA,\n ),\n );\n\n const signTransaction = async (arg0: {\n input: {\n derivationPath: string;\n serializedTransaction: Uint8Array;\n userInputType?: UserInputType;\n };\n }) =>\n new SignDataTask(internalApi, {\n commandFactory: (args) =>\n new SignTransactionCommand({\n serializedTransaction: args.chunkedData,\n more: args.more,\n extend: args.extend,\n userInputType: arg0.input.userInputType,\n }),\n derivationPath: arg0.input.derivationPath,\n sendingData: arg0.input.serializedTransaction,\n }).run();\n\n return {\n getAppConfig,\n buildContext,\n provideContext,\n signTransaction,\n inspectTransaction,\n };\n }\n}\n"],
5
+ "mappings": "AAAA,OAIE,iBAAAA,EAEA,0BAAAC,EACA,uBAAAC,EAEA,kBAAAC,EACA,2BAAAC,EACA,sBAAAC,MACK,kCACP,OAAS,QAAAC,EAAkB,SAAAC,MAAa,YACxC,OAAS,UAAAC,EAAQ,eAAAC,EAAa,SAAAC,MAAa,SAE3C,OAME,+BAAAC,MACK,mDAOP,OAAS,8BAAAC,MAAkC,0DAC3C,OAAS,0BAAAC,MAA8B,sDAEvC,OAAS,sBAAAC,MAA0B,mDACnC,OACE,0BAAAC,EACA,wBAAAC,MACK,qDAEP,OACE,+BAAAC,MAGK,wDACP,OACE,uCAAAC,MAEK,0DACP,OAAS,gBAAAC,MAAoB,6CA2BtB,MAAMC,UAAoCf,CAM/C,CACA,iBACEgB,EAOA,CASA,KAAM,CACJ,gBAAAC,EACA,aAAAC,EACA,aAAAC,EACA,eAAAC,EACA,mBAAAC,CACF,EAAI,KAAK,oBAAoBL,CAAW,EAExC,OAAOX,EAAM,CACX,MAAO,CACL,MAAO,CAAC,EACR,QAAS,CAAC,EACV,OAAQ,CAAC,CACX,EACA,OAAQ,CACN,oBAAqB,IAAIR,EAAoB,CAC3C,MAAO,CAAE,QAAS,QAAS,CAC7B,CAAC,EAAE,iBAAiBmB,CAAW,EAE/B,aAAcZ,EAAYc,CAAY,EACtC,mBAAoBd,EAClB,CAAC,CACC,MAAAkB,CACF,IAOED,EAAmB,CACjB,sBAAuBC,EAAM,sBAC7B,kBAAmBA,EAAM,kBACzB,OAAQA,EAAM,MAChB,CAAC,CACL,EACA,aAAclB,EAAYe,CAAY,EACtC,eAAgBf,EAAYgB,CAAc,EAC1C,gBAAiBhB,EAAYa,CAAe,CAC9C,EACA,OAAQ,CACN,gBAAiB,CAAC,CAAE,QAAAM,CAAQ,IAAMA,EAAQ,eAAe,QAAU,KACnE,YAAa,CAAC,CAAE,QAAAA,CAAQ,IACtBA,EAAQ,MAAM,oBAAoB,aAAe,GACnD,eAAgB,CAAC,CAAE,QAAAA,CAAQ,IACzB,IAAId,EACFO,EAAY,sBAAsB,EAClCO,EAAQ,eAAe,SACzB,EACG,wBAAwB,OAAO,EAC/B,mBAAmB5B,EAAc,MAAM,EACvC,MAAM,EACX,mBAAoB,CAAC,CAAE,QAAA4B,CAAQ,IAC7BA,EAAQ,eAAe,iBAAiB,kBACxCb,EAAuB,IACzB,qBAAsB,CAAC,CAAE,QAAAa,CAAQ,IAC/BA,EAAQ,eAAe,QAAU,MACjC,CAAC,CAACA,EAAQ,MAAM,oBAAoB,4BACxC,EACA,QAAS,CACP,qBAAsBpB,EAAO,CAC3B,eAAiBqB,IAAO,CACtB,GAAGA,EAAE,QAAQ,eACb,MAAO,IAAI1B,EACT0B,EAAE,MAAM,iBAAoB,MACxBA,EAAE,MAAM,MAAS,QACjB,OAAOA,EAAE,MAAM,KAAQ,CAC7B,CACF,EACF,CAAC,CACH,CACF,CAAC,EAAE,cAAc,CAEf,GAAI,8BACJ,QAAS,eACT,QAAS,CAAC,CAAE,MAAAF,CAAM,KAAO,CACvB,MAAAA,EACA,kBAAmB,CACjB,wBAAyBvB,EAAwB,KACjD,KAAMO,EAA4B,QACpC,EACA,eAAgB,CACd,MAAO,KACP,UAAW,KACX,UAAW,KACX,yBAA0B,KAC1B,gBAAiB,IACnB,CACF,GACA,OAAQ,CACN,aAAc,CACZ,OAAQ,CACN,CAAE,OAAQ,eAAgB,MAAO,aAAc,EAC/C,CAAE,OAAQ,qBAAsB,CAClC,CACF,EACA,oBAAqB,CACnB,MAAOH,EAAO,CACZ,kBAAmB,KAAO,CACxB,wBAAyBJ,EAAwB,KACjD,KAAMO,EAA4B,QACpC,EACF,CAAC,EACD,OAAQ,CACN,GAAI,sBACJ,IAAK,sBACL,MAAO,KAAO,CAAE,QAAS,QAAS,GAClC,WAAY,CACV,QAASH,EAAO,CACd,kBAAmB,CAAC,CAAE,MAAAsB,CAAM,KAAO,CACjC,GAAGA,EAAM,SAAS,QAAQ,kBAC1B,KAAMnB,EAA4B,QACpC,EACF,CAAC,CACH,EACA,OAAQ,CACN,OAAQ,iCACR,QAASH,EAAO,CACd,eAAgB,CAAC,CAAE,MAAAsB,EAAO,QAAAF,CAAQ,IAChCE,EAAM,OAAO,OAAO,CAClB,MAAO,IAAMF,EAAQ,eACrB,KAAOG,IAAW,CAChB,GAAGH,EAAQ,eACX,MAAAG,CACF,EACF,CAAC,CACL,CAAC,CACH,CACF,CACF,EACA,+BAAgC,CAC9B,OAAQ,CACN,CAAE,OAAQ,eAAgB,MAAO,iBAAkB,EACnD,CAAE,OAAQ,OAAQ,CACpB,CACF,EACA,aAAc,CACZ,MAAOvB,EAAO,CACZ,kBAAmB,KAAO,CACxB,wBAAyBJ,EAAwB,KACjD,KAAMO,EAA4B,cACpC,EACF,CAAC,EACD,OAAQ,CACN,GAAI,eACJ,IAAK,eACL,OAAQ,CACN,OAAQ,0BACR,QAASH,EAAO,CACd,eAAgB,CAAC,CAAE,MAAAsB,EAAO,QAAAF,CAAQ,IAChC3B,EAAuB6B,EAAM,MAAM,EAC/B,CACE,GAAGF,EAAQ,eACX,UAAWE,EAAM,OAAO,IAC1B,EACA,CAAE,GAAGF,EAAQ,eAAgB,MAAOE,EAAM,OAAO,KAAM,CAC/D,CAAC,CACH,EACA,QAAS,CACP,OAAQ,QACR,QAAS,sBACX,CACF,CACF,EACA,wBAAyB,CACvB,OAAQ,CACN,CAAE,OAAQ,qBAAsB,MAAO,iBAAkB,EACzD,CAAE,OAAQ,OAAQ,CACpB,CACF,EACA,mBAAoB,CAClB,MAAOtB,EAAO,CACZ,kBAAmB,KAAO,CACxB,wBAAyBJ,EAAwB,KACjD,KAAMO,EAA4B,mBACpC,EACF,CAAC,EACD,OAAQ,CACN,GAAI,qBACJ,IAAK,qBAEL,MAAO,CAAC,CAAE,QAAAiB,CAAQ,KAAO,CACvB,sBAAuBA,EAAQ,MAAM,YACrC,kBACEA,EAAQ,MAAM,oBAAoB,6BACpC,OAAQA,EAAQ,MAAM,oBAAoB,YAC5C,GACA,OAAQ,CACN,OAAQ,eACR,QAASpB,EAAO,CACd,eAAgB,CAAC,CAAE,QAAAoB,EAAS,MAAAE,CAAM,KAAO,CACvC,GAAGF,EAAQ,eACX,gBAAiBE,EAAM,MACzB,EACF,CAAC,CACH,EACA,QAAS,CACP,OAAQ,QACR,QAAS,sBACX,CACF,CACF,EACA,aAAc,CACZ,OAAQ,CACN,CAAE,OAAQ,eAAgB,MAAO,oBAAqB,EACtD,CAAE,OAAQ,kBAAmB,MAAO,iBAAkB,EACtD,CAAE,OAAQ,OAAQ,CACpB,CACF,EACA,aAAc,CACZ,MAAOtB,EAAO,CACZ,kBAAmB,KAAO,CACxB,wBAAyBJ,EAAwB,KACjD,KAAMO,EAA4B,yBACpC,EACF,CAAC,EACD,OAAQ,CACN,GAAI,eACJ,IAAK,eACL,MAAO,CAAC,CAAE,QAAAiB,CAAQ,IAAM,CACtB,MAAMI,EACJJ,EAAQ,eAAe,iBAAiB,KAC1C,MAAO,CACL,cAAeA,EAAQ,MAAM,cAC7B,QAAS,CACP,aAAcI,GAAe,aAC7B,UAAWA,GAAe,UAC1B,gBACEJ,EAAQ,MAAM,oBACV,8BAA8B,gBACpC,WACEA,EAAQ,MAAM,oBACV,8BAA8B,UACtC,CACF,CACF,EACA,OAAQ,CACN,OAAQ,iBACR,QAAS,CACPpB,EAAO,CACL,eAAgB,CAAC,CAAE,MAAAsB,EAAO,QAAAF,CAAQ,KAAO,CACvC,GAAGA,EAAQ,eACX,yBAA0B,CACxB,cAAeE,EAAM,OAAO,cAC5B,0BACEA,EAAM,OAAO,0BACf,eAAgBA,EAAM,OAAO,cAC/B,CACF,EACF,CAAC,CACH,CACF,EACA,QAAS,CACP,OAAQ,QACR,QAAS,sBACX,CACF,CACF,EACA,eAAgB,CACd,MAAOtB,EAAO,CACZ,kBAAmB,KAAO,CACxB,wBAAyBJ,EAAwB,KACjD,KAAMO,EAA4B,2BACpC,EACF,CAAC,EACD,OAAQ,CACN,GAAI,iBACJ,IAAK,iBACL,MAAO,CAAC,CAAE,QAAAiB,CAAQ,IAAM,CACtB,GAAI,CAACA,EAAQ,eAAe,yBAC1B,MAAM,IAAIzB,EACR,6CACF,EAEF,MAAO,CACL,GAAGyB,EAAQ,eAAe,yBAC1B,iBAAkBA,EAAQ,MAAM,WAClC,CACF,EACA,OAAQ,CACN,OAAQ,2BACV,EACA,QAAS,CACP,OAAQ,QACR,QAAS,sBACX,CACF,CACF,EACA,0BAA2B,CACzB,OAAQ,CACN,CAAE,OAAQ,kBAAmB,MAAO,iBAAkB,EACtD,CAAE,OAAQ,OAAQ,CACpB,CACF,EACA,gBAAiB,CACf,MAAOpB,EAAO,CACZ,kBAAmB,CACjB,wBAAyBJ,EAAwB,gBACjD,KAAMO,EAA4B,gBACpC,CACF,CAAC,EACD,OAAQ,CACN,GAAI,kBACJ,IAAK,kBACL,MAAO,CAAC,CAAE,QAAAiB,CAAQ,KACT,CACL,eAAgBA,EAAQ,MAAM,eAC9B,sBAAuBA,EAAQ,MAAM,YACrC,cACEA,EAAQ,MAAM,oBAAoB,8BAC9B,aACR,GAEF,OAAQ,CACN,OAAQ,6BACR,QAAS,CACPpB,EAAO,CACL,eAAgB,CAAC,CAAE,MAAAsB,EAAO,QAAAF,CAAQ,IAAM,CACtC,GAAI,CAAC3B,EAAuB6B,EAAM,MAAM,EACtC,MAAO,CACL,GAAGF,EAAQ,eACX,MAAOE,EAAM,OAAO,KACtB,EAEF,MAAMG,EAAOH,EAAM,OAAO,KAAK,QAAQ,EACvC,OACEA,EAAM,OAAO,KAAK,OAAO,GACzBG,aAAgB,WAET,CACL,GAAGL,EAAQ,eACX,UAAWK,CACb,EAEK,CACL,GAAGL,EAAQ,eACX,MAAO,IAAIzB,EAAe,wBAAwB,CACpD,CACF,EACA,kBAAmB,CACjB,wBAAyBC,EAAwB,KACjD,KAAMO,EAA4B,gBACpC,CACF,CAAC,CACH,CACF,EACA,QAAS,CACP,OAAQ,QACR,QAAS,sBACX,CACF,CACF,EACA,2BAA4B,CAC1B,OAAQ,CACN,CAAE,MAAO,kBAAmB,OAAQ,SAAU,EAC9C,CAAE,OAAQ,OAAQ,CACpB,CACF,EACA,QAAS,CAAE,KAAM,OAAQ,EACzB,MAAO,CAAE,KAAM,OAAQ,CACzB,EACA,OAAQ,CAAC,CAAE,QAAAiB,CAAQ,IACjBA,EAAQ,eAAe,UACnBrB,EAAMqB,EAAQ,eAAe,SAAS,EACtCtB,EACEsB,EAAQ,eAAe,OACrB,IAAIzB,EAAe,iCAAiC,CACxD,CACR,CAAC,CACH,CAEA,oBAAoBkB,EAA+C,CA6CjE,MAAO,CACL,aA7CmB,SACnBA,EAAY,YAAY,IAAIT,CAA4B,EA6CxD,aA3CmB,MAAOsB,GAEtB,IAAIjB,EAA4BI,EAAaa,EAAK,KAAK,EAAE,IAAI,EA0CjE,eAxCqB,MAAOA,GAG5B,IAAIhB,EAAoCG,EAAaa,EAAK,KAAK,EAAE,IAAI,EAsCrE,gBAvBsB,MAAOA,GAO7B,IAAIf,EAAaE,EAAa,CAC5B,eAAiBc,GACf,IAAItB,EAAuB,CACzB,sBAAuBsB,EAAK,YAC5B,KAAMA,EAAK,KACX,OAAQA,EAAK,OACb,cAAeD,EAAK,MAAM,aAC5B,CAAC,EACH,eAAgBA,EAAK,MAAM,eAC3B,YAAaA,EAAK,MAAM,qBAC1B,CAAC,EAAE,IAAI,EAOP,mBArCyB,MAAOA,GAKhC,QAAQ,QACN,IAAIlB,EAAqBkB,EAAK,MAAM,EAAE,uBACpCA,EAAK,sBACLA,EAAK,mBAAmB,aACxBA,EAAK,mBAAmB,SAC1B,CACF,CA2BF,CACF,CACF",
6
+ "names": ["DeviceModelId", "isSuccessCommandResult", "OpenAppDeviceAction", "UnknownDAError", "UserInteractionRequired", "XStateDeviceAction", "Left", "Right", "assign", "fromPromise", "setup", "signTransactionDAStateSteps", "GetAppConfigurationCommand", "SignTransactionCommand", "ApplicationChecker", "SolanaTransactionTypes", "TransactionInspector", "BuildTransactionContextTask", "ProvideSolanaTransactionContextTask", "SignDataTask", "SignTransactionDeviceAction", "internalApi", "signTransaction", "getAppConfig", "buildContext", "provideContext", "inspectTransaction", "input", "context", "_", "event", "error", "inspectorData", "data", "arg0", "args"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{CommandResultFactory as o,DeviceActionStatus as e,DeviceModelId as g,DeviceSessionStateType as v,DeviceStatus as y,InvalidStatusWordError as C,UserInteractionRequired as t}from"@ledgerhq/device-management-kit";import{Just as T,Nothing as N}from"purify-ts";import{beforeEach as P,describe as w,it as D,vi as n}from"vitest";import{testDeviceActionStates as f}from"../../app-binder/device-action/__test-utils__/testDeviceActionStates";import{SolanaTransactionTypes as m}from"../../app-binder/services/TransactionInspector";import{makeDeviceActionInternalApiMock as E}from"./__test-utils__/makeInternalApi";import{SignTransactionDeviceAction as k}from"./SignTransactionDeviceAction";const V="44'/501'/0'/0'",x=new Uint8Array([222,173,190,239]),I={getSolanaContext:n.fn(),getFieldContext:n.fn(),getContexts:n.fn(),getTypedDataFilters:n.fn(),getWeb3Checks:n.fn()};let r,u,d,A,S,l;function R(){return{getAppConfig:u,buildContext:d,provideContext:A,signTransaction:S,inspectTransaction:l}}w("SignTransactionDeviceAction (Solana)",()=>{P(()=>{r=E(),u=n.fn(),d=n.fn(),A=n.fn(),S=n.fn(),l=n.fn().mockResolvedValue({transactionType:m.SPL,data:{tokenAddress:null,createATA:!1}})}),D("happy path (skip open): getAppConfig -> inspect -> build -> provide -> sign",()=>new Promise((s,c)=>{r.getDeviceSessionState.mockReturnValue({sessionStateType:v.ReadyWithoutSecureChannel,deviceStatus:y.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:g.NANO_X,isSecureConnectionAllowed:!0}),u.mockResolvedValue(o({data:{}})),l.mockResolvedValue({transactionType:m.SPL});const a={descriptor:new Uint8Array([1]),calCertificate:{keyUsageNumber:0,payload:new Uint8Array([1])},challenge:void 0,addressResult:{tokenAccount:"",owner:"",contract:""}};d.mockResolvedValue(a),A.mockResolvedValue(N);const i=new Uint8Array([170,187]);S.mockResolvedValue(o({data:T(i)}));const p=new k({input:{derivationPath:V,transaction:x,skipOpenApp:!0,options:{},contextModule:I}});n.spyOn(p,"extractDependencies").mockReturnValue(R());const U=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.SignTransaction},status:e.Pending},{output:i,status:e.Completed}];f(p,U,r,{onDone:s,onError:c})})),D("failure in provideContext still signs",()=>new Promise((s,c)=>{r.getDeviceSessionState.mockReturnValue({sessionStateType:v.ReadyWithoutSecureChannel,deviceStatus:y.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:g.NANO_X,isSecureConnectionAllowed:!0}),u.mockResolvedValue(o({data:{}})),l.mockResolvedValue({transactionType:m.SPL}),d.mockResolvedValue({descriptor:new Uint8Array([2]),calCertificate:{keyUsageNumber:0,payload:new Uint8Array},challenge:void 0,addressResult:{tokenAccount:"",owner:"",contract:""}}),A.mockResolvedValue(T(o({error:new C("ctxErr")})));const a=new Uint8Array([254]);S.mockResolvedValue(o({data:T(a)}));const i=new k({input:{derivationPath:V,transaction:x,skipOpenApp:!0,options:{},contextModule:I}});n.spyOn(i,"extractDependencies").mockReturnValue(R());const p=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.SignTransaction},status:e.Pending},{output:a,status:e.Completed}];f(i,p,r,{onDone:s,onError:c})})),D("buildContext throws \u2192 error",()=>new Promise((s,c)=>{r.getDeviceSessionState.mockReturnValue({sessionStateType:v.ReadyWithoutSecureChannel,deviceStatus:y.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:g.NANO_X,isSecureConnectionAllowed:!0}),u.mockResolvedValue(o({data:{}})),l.mockResolvedValue({transactionType:m.SPL}),d.mockRejectedValue(new C("bldErr"));const a=new k({input:{derivationPath:V,transaction:x,skipOpenApp:!0,options:{},contextModule:I}});n.spyOn(a,"extractDependencies").mockReturnValue(R());const i=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{error:expect.anything(),status:e.Error}];f(a,i,r,{onDone:s,onError:c})}))});
1
+ import{CommandResultFactory as c,DeviceActionStatus as e,DeviceModelId as I,DeviceSessionStateType as N,DeviceStatus as g,InvalidStatusWordError as U,UserInteractionRequired as t}from"@ledgerhq/device-management-kit";import{Just as y,Nothing as E}from"purify-ts";import{beforeEach as _,describe as w,it as v,vi as i}from"vitest";import{signTransactionDAStateSteps as n}from"../../../api/app-binder/SignTransactionDeviceActionTypes";import{UserInputType as f}from"../../../api/model/TransactionResolutionContext";import{testDeviceActionStates as C}from"../../app-binder/device-action/__test-utils__/testDeviceActionStates";import{SolanaTransactionTypes as S}from"../../app-binder/services/TransactionInspector";import{makeDeviceActionInternalApiMock as M}from"./__test-utils__/makeInternalApi";import{SignTransactionDeviceAction as D}from"./SignTransactionDeviceAction";const R="44'/501'/0'/0'",V=new Uint8Array([222,173,190,239]),k={getSolanaContext:i.fn()};let o,l,A,m,p,T;function P(){return{getAppConfig:l,buildContext:A,provideContext:m,signTransaction:p,inspectTransaction:T}}w("SignTransactionDeviceAction (Solana)",()=>{_(()=>{o=M(),l=i.fn(),A=i.fn(),m=i.fn(),p=i.fn(),T=i.fn().mockResolvedValue({transactionType:S.SPL,data:{tokenAddress:null,createATA:!1}})}),v("happy path (skip open): getAppConfig -> inspect -> build -> provide -> sign",()=>new Promise((u,s)=>{o.getDeviceSessionState.mockReturnValue({sessionStateType:N.ReadyWithoutSecureChannel,deviceStatus:g.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:I.NANO_X,isSecureConnectionAllowed:!0}),l.mockResolvedValue(c({data:{}})),T.mockResolvedValue({transactionType:S.SPL});const r={tlvDescriptor:new Uint8Array([1]),trustedNamePKICertificate:{keyUsageNumber:0,payload:new Uint8Array([1])},loadersResults:[]};A.mockResolvedValue(r),m.mockResolvedValue(E);const a=new Uint8Array([170,187]);p.mockResolvedValue(c({data:y(a)}));const d=new D({input:{derivationPath:R,transaction:V,transactionOptions:{skipOpenApp:!0},contextModule:k}});i.spyOn(d,"extractDependencies").mockReturnValue(P());const O=[{intermediateValue:{requiredUserInteraction:t.None,step:n.GET_APP_CONFIG},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None,step:n.INSPECT_TRANSACTION},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None,step:n.BUILD_TRANSACTION_CONTEXT},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None,step:n.PROVIDE_TRANSACTION_CONTEXT},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.SignTransaction,step:n.SIGN_TRANSACTION},status:e.Pending},{output:a,status:e.Completed}];C(d,O,o,{onDone:u,onError:s})})),v("forwards userInputType to signTransaction dependency",()=>new Promise((u,s)=>{o.getDeviceSessionState.mockReturnValue({sessionStateType:N.ReadyWithoutSecureChannel,deviceStatus:g.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:I.NANO_X,isSecureConnectionAllowed:!0}),l.mockResolvedValue(c({data:{}})),T.mockResolvedValue({transactionType:S.SPL});const r={tlvDescriptor:new Uint8Array([1]),trustedNamePKICertificate:{keyUsageNumber:0,payload:new Uint8Array([1])},loadersResults:[]};A.mockResolvedValue(r),m.mockResolvedValue(E);const a=new Uint8Array([170,187]);p.mockResolvedValue(c({data:y(a)}));const d=new D({input:{derivationPath:R,transaction:V,transactionOptions:{skipOpenApp:!0,transactionResolutionContext:{userInputType:f.ata}},contextModule:k}});i.spyOn(d,"extractDependencies").mockReturnValue(P());const O=[{intermediateValue:{requiredUserInteraction:t.None,step:n.GET_APP_CONFIG},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None,step:n.INSPECT_TRANSACTION},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None,step:n.BUILD_TRANSACTION_CONTEXT},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None,step:n.PROVIDE_TRANSACTION_CONTEXT},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.SignTransaction,step:n.SIGN_TRANSACTION},status:e.Pending},{output:a,status:e.Completed}];C(d,O,o,{onDone:()=>{try{expect(p).toHaveBeenCalledTimes(1);const x=p.mock.calls[0][0];expect(x.input.userInputType).toBe(f.ata),u()}catch(x){s(x)}},onError:s})})),v("failure in provideContext still signs",()=>new Promise((u,s)=>{o.getDeviceSessionState.mockReturnValue({sessionStateType:N.ReadyWithoutSecureChannel,deviceStatus:g.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:I.NANO_X,isSecureConnectionAllowed:!0}),l.mockResolvedValue(c({data:{}})),T.mockResolvedValue({transactionType:S.SPL}),A.mockResolvedValue({descriptor:new Uint8Array([2]),trustedNamePKICertificate:{keyUsageNumber:0,payload:new Uint8Array},challenge:void 0,addressResult:{tokenAccount:"",owner:"",contract:""},loadersResults:[]}),m.mockResolvedValue(y(c({error:new U("ctxErr")})));const r=new Uint8Array([254]);p.mockResolvedValue(c({data:y(r)}));const a=new D({input:{derivationPath:R,transaction:V,transactionOptions:{skipOpenApp:!0},contextModule:k}});i.spyOn(a,"extractDependencies").mockReturnValue(P());const d=[{intermediateValue:{requiredUserInteraction:t.None,step:n.GET_APP_CONFIG},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None,step:n.INSPECT_TRANSACTION},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None,step:n.BUILD_TRANSACTION_CONTEXT},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None,step:n.PROVIDE_TRANSACTION_CONTEXT},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.SignTransaction,step:n.SIGN_TRANSACTION},status:e.Pending},{output:r,status:e.Completed}];C(a,d,o,{onDone:u,onError:s})})),v("buildContext throws \u2192 error",()=>new Promise((u,s)=>{o.getDeviceSessionState.mockReturnValue({sessionStateType:N.ReadyWithoutSecureChannel,deviceStatus:g.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:I.NANO_X,isSecureConnectionAllowed:!0}),l.mockResolvedValue(c({data:{}})),T.mockResolvedValue({transactionType:S.SPL}),A.mockRejectedValue(new U("bldErr"));const r=new D({input:{derivationPath:R,transaction:V,transactionOptions:{skipOpenApp:!0},contextModule:k}});i.spyOn(r,"extractDependencies").mockReturnValue(P());const a=[{intermediateValue:{requiredUserInteraction:t.None,step:n.GET_APP_CONFIG},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None,step:n.INSPECT_TRANSACTION},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None,step:n.BUILD_TRANSACTION_CONTEXT},status:e.Pending},{error:expect.anything(),status:e.Error}];C(r,a,o,{onDone:u,onError:s})}))});
2
2
  //# sourceMappingURL=SignTransactionDeviceAction.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/device-action/SignTransactionDeviceAction.test.ts"],
4
- "sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n CommandResultFactory,\n type DeviceActionState,\n DeviceActionStatus,\n DeviceModelId,\n DeviceSessionStateType,\n DeviceStatus,\n InvalidStatusWordError,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { Just, Nothing } from \"purify-ts\";\nimport { beforeEach, describe, it, vi } from \"vitest\";\n\nimport {\n type SignTransactionDAError,\n type SignTransactionDAInput,\n type SignTransactionDAIntermediateValue,\n} from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { testDeviceActionStates } from \"@internal/app-binder/device-action/__test-utils__/testDeviceActionStates\";\nimport { SolanaTransactionTypes } from \"@internal/app-binder/services/TransactionInspector\";\nimport { type SolanaBuildContextResult } from \"@internal/app-binder/task/BuildTransactionContextTask\";\n\nimport { makeDeviceActionInternalApiMock } from \"./__test-utils__/makeInternalApi\";\nimport { SignTransactionDeviceAction } from \"./SignTransactionDeviceAction\";\n\nconst defaultDerivation = \"44'/501'/0'/0'\";\nconst exampleTx = new Uint8Array([0xde, 0xad, 0xbe, 0xef]);\n\nconst contextModuleStub: ContextModule = {\n getSolanaContext: vi.fn(),\n getFieldContext: vi.fn(),\n getContexts: vi.fn(),\n getTypedDataFilters: vi.fn(),\n getWeb3Checks: vi.fn(),\n};\n\nlet apiMock: ReturnType<typeof makeDeviceActionInternalApiMock>;\nlet getAppConfigMock: ReturnType<typeof vi.fn>;\nlet buildContextMock: ReturnType<typeof vi.fn>;\nlet provideContextMock: ReturnType<typeof vi.fn>;\nlet signMock: ReturnType<typeof vi.fn>;\nlet inspectTransactionMock: ReturnType<typeof vi.fn>;\n\nfunction extractDeps() {\n return {\n getAppConfig: getAppConfigMock,\n buildContext: buildContextMock,\n provideContext: provideContextMock,\n signTransaction: signMock,\n inspectTransaction: inspectTransactionMock,\n };\n}\n\ndescribe(\"SignTransactionDeviceAction (Solana)\", () => {\n beforeEach(() => {\n apiMock = makeDeviceActionInternalApiMock();\n getAppConfigMock = vi.fn();\n buildContextMock = vi.fn();\n provideContextMock = vi.fn();\n signMock = vi.fn();\n inspectTransactionMock = vi.fn().mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n data: { tokenAddress: null, createATA: false },\n });\n });\n\n it(\"happy path (skip open): getAppConfig -> inspect -> build -> provide -> sign\", () =>\n new Promise<void>((resolve, reject) => {\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.1\" },\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: true,\n });\n\n getAppConfigMock.mockResolvedValue(CommandResultFactory({ data: {} }));\n inspectTransactionMock.mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n });\n\n const ctx: SolanaBuildContextResult = {\n descriptor: new Uint8Array([1]),\n calCertificate: { keyUsageNumber: 0, payload: new Uint8Array([0x01]) },\n challenge: undefined,\n addressResult: { tokenAccount: \"\", owner: \"\", contract: \"\" },\n };\n buildContextMock.mockResolvedValue(ctx);\n provideContextMock.mockResolvedValue(Nothing);\n\n const signature = new Uint8Array([0xaa, 0xbb]);\n signMock.mockResolvedValue(\n CommandResultFactory({ data: Just(signature) }),\n );\n\n const action = new SignTransactionDeviceAction({\n input: {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n skipOpenApp: true, // always skip open\n options: {},\n contextModule: contextModuleStub,\n } as SignTransactionDAInput,\n });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n\n const expected = [\n // getAppConfig\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // inspectTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // buildContext\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // provideContext\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // signTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n },\n status: DeviceActionStatus.Pending,\n },\n // success\n { output: signature, status: DeviceActionStatus.Completed },\n ] as DeviceActionState<\n Uint8Array,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[];\n\n testDeviceActionStates<\n Uint8Array,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >(action, expected, apiMock, { onDone: resolve, onError: reject });\n }));\n\n it(\"failure in provideContext still signs\", () =>\n new Promise<void>((resolve, reject) => {\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.1\" },\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: true,\n });\n\n getAppConfigMock.mockResolvedValue(CommandResultFactory({ data: {} }));\n inspectTransactionMock.mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n });\n\n buildContextMock.mockResolvedValue({\n descriptor: new Uint8Array([2]),\n calCertificate: { keyUsageNumber: 0, payload: new Uint8Array() },\n challenge: undefined,\n addressResult: { tokenAccount: \"\", owner: \"\", contract: \"\" },\n });\n provideContextMock.mockResolvedValue(\n Just(\n CommandResultFactory({ error: new InvalidStatusWordError(\"ctxErr\") }),\n ),\n );\n const sig = new Uint8Array([0xfe]);\n signMock.mockResolvedValue(CommandResultFactory({ data: Just(sig) }));\n\n const action = new SignTransactionDeviceAction({\n input: {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n skipOpenApp: true,\n options: {},\n contextModule: contextModuleStub,\n } as SignTransactionDAInput,\n });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n\n const expected = [\n // getAppConfig\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // inspectTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // buildContext\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // provideContext (returns error but continues)\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // signTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n },\n status: DeviceActionStatus.Pending,\n },\n // success\n { output: sig, status: DeviceActionStatus.Completed },\n ] as DeviceActionState<\n Uint8Array,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[];\n\n testDeviceActionStates<\n Uint8Array,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >(action, expected, apiMock, { onDone: resolve, onError: reject });\n }));\n\n it(\"buildContext throws \u2192 error\", () =>\n new Promise<void>((resolve, reject) => {\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.1\" },\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: true,\n });\n\n getAppConfigMock.mockResolvedValue(CommandResultFactory({ data: {} }));\n inspectTransactionMock.mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n });\n\n buildContextMock.mockRejectedValue(new InvalidStatusWordError(\"bldErr\"));\n\n const action = new SignTransactionDeviceAction({\n input: {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n skipOpenApp: true,\n options: {},\n contextModule: contextModuleStub,\n } as SignTransactionDAInput,\n });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n\n const expected = [\n // getAppConfig\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // inspectTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // buildContext (throws)\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // error raised from buildContext\n {\n error: expect.anything() as unknown as SignTransactionDAError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n Uint8Array,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[];\n\n testDeviceActionStates<\n Uint8Array,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >(action, expected, apiMock, { onDone: resolve, onError: reject });\n }));\n});\n"],
5
- "mappings": "AACA,OACE,wBAAAA,EAEA,sBAAAC,EACA,iBAAAC,EACA,0BAAAC,EACA,gBAAAC,EACA,0BAAAC,EACA,2BAAAC,MACK,kCACP,OAAS,QAAAC,EAAM,WAAAC,MAAe,YAC9B,OAAS,cAAAC,EAAY,YAAAC,EAAU,MAAAC,EAAI,MAAAC,MAAU,SAO7C,OAAS,0BAAAC,MAA8B,2EACvC,OAAS,0BAAAC,MAA8B,qDAGvC,OAAS,mCAAAC,MAAuC,mCAChD,OAAS,+BAAAC,MAAmC,gCAE5C,MAAMC,EAAoB,iBACpBC,EAAY,IAAI,WAAW,CAAC,IAAM,IAAM,IAAM,GAAI,CAAC,EAEnDC,EAAmC,CACvC,iBAAkBP,EAAG,GAAG,EACxB,gBAAiBA,EAAG,GAAG,EACvB,YAAaA,EAAG,GAAG,EACnB,oBAAqBA,EAAG,GAAG,EAC3B,cAAeA,EAAG,GAAG,CACvB,EAEA,IAAIQ,EACAC,EACAC,EACAC,EACAC,EACAC,EAEJ,SAASC,GAAc,CACrB,MAAO,CACL,aAAcL,EACd,aAAcC,EACd,eAAgBC,EAChB,gBAAiBC,EACjB,mBAAoBC,CACtB,CACF,CAEAf,EAAS,uCAAwC,IAAM,CACrDD,EAAW,IAAM,CACfW,EAAUL,EAAgC,EAC1CM,EAAmBT,EAAG,GAAG,EACzBU,EAAmBV,EAAG,GAAG,EACzBW,EAAqBX,EAAG,GAAG,EAC3BY,EAAWZ,EAAG,GAAG,EACjBa,EAAyBb,EAAG,GAAG,EAAE,kBAAkB,CACjD,gBAAiBE,EAAuB,IACxC,KAAM,CAAE,aAAc,KAAM,UAAW,EAAM,CAC/C,CAAC,CACH,CAAC,EAEDH,EAAG,8EAA+E,IAChF,IAAI,QAAc,CAACgB,EAASC,IAAW,CACrCR,EAAQ,sBAAsB,gBAAgB,CAC5C,iBAAkBjB,EAAuB,0BACzC,aAAcC,EAAa,UAC3B,cAAe,CAAC,EAChB,WAAY,CAAE,KAAM,SAAU,QAAS,OAAQ,EAC/C,cAAeF,EAAc,OAC7B,0BAA2B,EAC7B,CAAC,EAEDmB,EAAiB,kBAAkBrB,EAAqB,CAAE,KAAM,CAAC,CAAE,CAAC,CAAC,EACrEyB,EAAuB,kBAAkB,CACvC,gBAAiBX,EAAuB,GAC1C,CAAC,EAED,MAAMe,EAAgC,CACpC,WAAY,IAAI,WAAW,CAAC,CAAC,CAAC,EAC9B,eAAgB,CAAE,eAAgB,EAAG,QAAS,IAAI,WAAW,CAAC,CAAI,CAAC,CAAE,EACrE,UAAW,OACX,cAAe,CAAE,aAAc,GAAI,MAAO,GAAI,SAAU,EAAG,CAC7D,EACAP,EAAiB,kBAAkBO,CAAG,EACtCN,EAAmB,kBAAkBf,CAAO,EAE5C,MAAMsB,EAAY,IAAI,WAAW,CAAC,IAAM,GAAI,CAAC,EAC7CN,EAAS,kBACPxB,EAAqB,CAAE,KAAMO,EAAKuB,CAAS,CAAE,CAAC,CAChD,EAEA,MAAMC,EAAS,IAAIf,EAA4B,CAC7C,MAAO,CACL,eAAgBC,EAChB,YAAaC,EACb,YAAa,GACb,QAAS,CAAC,EACV,cAAeC,CACjB,CACF,CAAC,EACDP,EAAG,MAAMmB,EAAQ,qBAAqB,EAAE,gBAAgBL,EAAY,CAAC,EAErE,MAAMM,EAAW,CAEf,CACE,kBAAmB,CACjB,wBAAyB1B,EAAwB,IACnD,EACA,OAAQL,EAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyBK,EAAwB,IACnD,EACA,OAAQL,EAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyBK,EAAwB,IACnD,EACA,OAAQL,EAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyBK,EAAwB,IACnD,EACA,OAAQL,EAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyBK,EAAwB,eACnD,EACA,OAAQL,EAAmB,OAC7B,EAEA,CAAE,OAAQ6B,EAAW,OAAQ7B,EAAmB,SAAU,CAC5D,EAMAY,EAKEkB,EAAQC,EAAUZ,EAAS,CAAE,OAAQO,EAAS,QAASC,CAAO,CAAC,CACnE,CAAC,CAAC,EAEJjB,EAAG,wCAAyC,IAC1C,IAAI,QAAc,CAACgB,EAASC,IAAW,CACrCR,EAAQ,sBAAsB,gBAAgB,CAC5C,iBAAkBjB,EAAuB,0BACzC,aAAcC,EAAa,UAC3B,cAAe,CAAC,EAChB,WAAY,CAAE,KAAM,SAAU,QAAS,OAAQ,EAC/C,cAAeF,EAAc,OAC7B,0BAA2B,EAC7B,CAAC,EAEDmB,EAAiB,kBAAkBrB,EAAqB,CAAE,KAAM,CAAC,CAAE,CAAC,CAAC,EACrEyB,EAAuB,kBAAkB,CACvC,gBAAiBX,EAAuB,GAC1C,CAAC,EAEDQ,EAAiB,kBAAkB,CACjC,WAAY,IAAI,WAAW,CAAC,CAAC,CAAC,EAC9B,eAAgB,CAAE,eAAgB,EAAG,QAAS,IAAI,UAAa,EAC/D,UAAW,OACX,cAAe,CAAE,aAAc,GAAI,MAAO,GAAI,SAAU,EAAG,CAC7D,CAAC,EACDC,EAAmB,kBACjBhB,EACEP,EAAqB,CAAE,MAAO,IAAIK,EAAuB,QAAQ,CAAE,CAAC,CACtE,CACF,EACA,MAAM4B,EAAM,IAAI,WAAW,CAAC,GAAI,CAAC,EACjCT,EAAS,kBAAkBxB,EAAqB,CAAE,KAAMO,EAAK0B,CAAG,CAAE,CAAC,CAAC,EAEpE,MAAMF,EAAS,IAAIf,EAA4B,CAC7C,MAAO,CACL,eAAgBC,EAChB,YAAaC,EACb,YAAa,GACb,QAAS,CAAC,EACV,cAAeC,CACjB,CACF,CAAC,EACDP,EAAG,MAAMmB,EAAQ,qBAAqB,EAAE,gBAAgBL,EAAY,CAAC,EAErE,MAAMM,EAAW,CAEf,CACE,kBAAmB,CACjB,wBAAyB1B,EAAwB,IACnD,EACA,OAAQL,EAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyBK,EAAwB,IACnD,EACA,OAAQL,EAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyBK,EAAwB,IACnD,EACA,OAAQL,EAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyBK,EAAwB,IACnD,EACA,OAAQL,EAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyBK,EAAwB,eACnD,EACA,OAAQL,EAAmB,OAC7B,EAEA,CAAE,OAAQgC,EAAK,OAAQhC,EAAmB,SAAU,CACtD,EAMAY,EAKEkB,EAAQC,EAAUZ,EAAS,CAAE,OAAQO,EAAS,QAASC,CAAO,CAAC,CACnE,CAAC,CAAC,EAEJjB,EAAG,mCAA+B,IAChC,IAAI,QAAc,CAACgB,EAASC,IAAW,CACrCR,EAAQ,sBAAsB,gBAAgB,CAC5C,iBAAkBjB,EAAuB,0BACzC,aAAcC,EAAa,UAC3B,cAAe,CAAC,EAChB,WAAY,CAAE,KAAM,SAAU,QAAS,OAAQ,EAC/C,cAAeF,EAAc,OAC7B,0BAA2B,EAC7B,CAAC,EAEDmB,EAAiB,kBAAkBrB,EAAqB,CAAE,KAAM,CAAC,CAAE,CAAC,CAAC,EACrEyB,EAAuB,kBAAkB,CACvC,gBAAiBX,EAAuB,GAC1C,CAAC,EAEDQ,EAAiB,kBAAkB,IAAIjB,EAAuB,QAAQ,CAAC,EAEvE,MAAM0B,EAAS,IAAIf,EAA4B,CAC7C,MAAO,CACL,eAAgBC,EAChB,YAAaC,EACb,YAAa,GACb,QAAS,CAAC,EACV,cAAeC,CACjB,CACF,CAAC,EACDP,EAAG,MAAMmB,EAAQ,qBAAqB,EAAE,gBAAgBL,EAAY,CAAC,EAErE,MAAMM,EAAW,CAEf,CACE,kBAAmB,CACjB,wBAAyB1B,EAAwB,IACnD,EACA,OAAQL,EAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyBK,EAAwB,IACnD,EACA,OAAQL,EAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyBK,EAAwB,IACnD,EACA,OAAQL,EAAmB,OAC7B,EAEA,CACE,MAAO,OAAO,SAAS,EACvB,OAAQA,EAAmB,KAC7B,CACF,EAMAY,EAKEkB,EAAQC,EAAUZ,EAAS,CAAE,OAAQO,EAAS,QAASC,CAAO,CAAC,CACnE,CAAC,CAAC,CACN,CAAC",
6
- "names": ["CommandResultFactory", "DeviceActionStatus", "DeviceModelId", "DeviceSessionStateType", "DeviceStatus", "InvalidStatusWordError", "UserInteractionRequired", "Just", "Nothing", "beforeEach", "describe", "it", "vi", "testDeviceActionStates", "SolanaTransactionTypes", "makeDeviceActionInternalApiMock", "SignTransactionDeviceAction", "defaultDerivation", "exampleTx", "contextModuleStub", "apiMock", "getAppConfigMock", "buildContextMock", "provideContextMock", "signMock", "inspectTransactionMock", "extractDeps", "resolve", "reject", "ctx", "signature", "action", "expected", "sig"]
4
+ "sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n CommandResultFactory,\n type DeviceActionState,\n DeviceActionStatus,\n DeviceModelId,\n DeviceSessionStateType,\n DeviceStatus,\n InvalidStatusWordError,\n UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\nimport { Just, Nothing } from \"purify-ts\";\nimport { beforeEach, describe, it, vi } from \"vitest\";\n\nimport {\n type SignTransactionDAError,\n type SignTransactionDAInput,\n type SignTransactionDAIntermediateValue,\n signTransactionDAStateSteps,\n} from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { UserInputType } from \"@api/model/TransactionResolutionContext\";\nimport { testDeviceActionStates } from \"@internal/app-binder/device-action/__test-utils__/testDeviceActionStates\";\nimport { SolanaTransactionTypes } from \"@internal/app-binder/services/TransactionInspector\";\nimport { type SolanaBuildContextResult } from \"@internal/app-binder/task/BuildTransactionContextTask\";\n\nimport { makeDeviceActionInternalApiMock } from \"./__test-utils__/makeInternalApi\";\nimport { SignTransactionDeviceAction } from \"./SignTransactionDeviceAction\";\n\nconst defaultDerivation = \"44'/501'/0'/0'\";\nconst exampleTx = new Uint8Array([0xde, 0xad, 0xbe, 0xef]);\n\nconst contextModuleStub: ContextModule = {\n getSolanaContext: vi.fn(),\n} as unknown as ContextModule;\n\nlet apiMock: ReturnType<typeof makeDeviceActionInternalApiMock>;\nlet getAppConfigMock: ReturnType<typeof vi.fn>;\nlet buildContextMock: ReturnType<typeof vi.fn>;\nlet provideContextMock: ReturnType<typeof vi.fn>;\nlet signMock: ReturnType<typeof vi.fn>;\nlet inspectTransactionMock: ReturnType<typeof vi.fn>;\n\nfunction extractDeps() {\n return {\n getAppConfig: getAppConfigMock,\n buildContext: buildContextMock,\n provideContext: provideContextMock,\n signTransaction: signMock,\n inspectTransaction: inspectTransactionMock,\n };\n}\n\ndescribe(\"SignTransactionDeviceAction (Solana)\", () => {\n beforeEach(() => {\n apiMock = makeDeviceActionInternalApiMock();\n getAppConfigMock = vi.fn();\n buildContextMock = vi.fn();\n provideContextMock = vi.fn();\n signMock = vi.fn();\n inspectTransactionMock = vi.fn().mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n data: { tokenAddress: null, createATA: false },\n });\n });\n\n it(\"happy path (skip open): getAppConfig -> inspect -> build -> provide -> sign\", () =>\n new Promise<void>((resolve, reject) => {\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.1\" },\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: true,\n });\n\n getAppConfigMock.mockResolvedValue(CommandResultFactory({ data: {} }));\n inspectTransactionMock.mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n });\n\n const ctx: SolanaBuildContextResult = {\n tlvDescriptor: new Uint8Array([1]),\n trustedNamePKICertificate: {\n keyUsageNumber: 0,\n payload: new Uint8Array([0x01]),\n },\n loadersResults: [],\n };\n buildContextMock.mockResolvedValue(ctx);\n provideContextMock.mockResolvedValue(Nothing);\n\n const signature = new Uint8Array([0xaa, 0xbb]);\n signMock.mockResolvedValue(\n CommandResultFactory({ data: Just(signature) }),\n );\n\n const action = new SignTransactionDeviceAction({\n input: {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n transactionOptions: { skipOpenApp: true },\n contextModule: contextModuleStub,\n } as SignTransactionDAInput,\n });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n\n const expected = [\n // getAppConfig\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n // inspectTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.INSPECT_TRANSACTION,\n },\n status: DeviceActionStatus.Pending,\n },\n // buildContext\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.BUILD_TRANSACTION_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // provideContext\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.PROVIDE_TRANSACTION_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // signTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n step: signTransactionDAStateSteps.SIGN_TRANSACTION,\n },\n status: DeviceActionStatus.Pending,\n },\n // success\n { output: signature, status: DeviceActionStatus.Completed },\n ] as DeviceActionState<\n Uint8Array,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[];\n\n testDeviceActionStates<\n Uint8Array,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >(action, expected, apiMock, { onDone: resolve, onError: reject });\n }));\n\n it(\"forwards userInputType to signTransaction dependency\", () =>\n new Promise<void>((resolve, reject) => {\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.1\" },\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: true,\n });\n\n getAppConfigMock.mockResolvedValue(CommandResultFactory({ data: {} }));\n inspectTransactionMock.mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n });\n\n const ctx: SolanaBuildContextResult = {\n tlvDescriptor: new Uint8Array([1]),\n trustedNamePKICertificate: {\n keyUsageNumber: 0,\n payload: new Uint8Array([0x01]),\n },\n loadersResults: [],\n };\n buildContextMock.mockResolvedValue(ctx);\n provideContextMock.mockResolvedValue(Nothing);\n\n const signature = new Uint8Array([0xaa, 0xbb]);\n signMock.mockResolvedValue(\n CommandResultFactory({ data: Just(signature) }),\n );\n\n const action = new SignTransactionDeviceAction({\n input: {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n transactionOptions: {\n skipOpenApp: true,\n transactionResolutionContext: {\n // Only care about userInputType for this test\n userInputType: UserInputType.ata,\n },\n },\n contextModule: contextModuleStub,\n } as SignTransactionDAInput,\n });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n\n const expected = [\n // getAppConfig\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n // inspectTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.INSPECT_TRANSACTION,\n },\n status: DeviceActionStatus.Pending,\n },\n // buildContext\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.BUILD_TRANSACTION_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // provideContext\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.PROVIDE_TRANSACTION_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // signTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n step: signTransactionDAStateSteps.SIGN_TRANSACTION,\n },\n status: DeviceActionStatus.Pending,\n },\n // success\n { output: signature, status: DeviceActionStatus.Completed },\n ] as DeviceActionState<\n Uint8Array,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[];\n\n testDeviceActionStates<\n Uint8Array,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >(action, expected, apiMock, {\n onDone: () => {\n try {\n expect(signMock).toHaveBeenCalledTimes(1);\n const callArg = signMock.mock.calls[0]![0] as {\n input: { userInputType: UserInputType };\n };\n expect(callArg.input.userInputType).toBe(UserInputType.ata);\n resolve();\n } catch (e) {\n reject(e);\n }\n },\n onError: reject,\n });\n }));\n\n it(\"failure in provideContext still signs\", () =>\n new Promise<void>((resolve, reject) => {\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.1\" },\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: true,\n });\n\n getAppConfigMock.mockResolvedValue(CommandResultFactory({ data: {} }));\n inspectTransactionMock.mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n });\n\n buildContextMock.mockResolvedValue({\n descriptor: new Uint8Array([2]),\n trustedNamePKICertificate: {\n keyUsageNumber: 0,\n payload: new Uint8Array(),\n },\n challenge: undefined,\n addressResult: { tokenAccount: \"\", owner: \"\", contract: \"\" },\n loadersResults: [],\n });\n provideContextMock.mockResolvedValue(\n Just(\n CommandResultFactory({ error: new InvalidStatusWordError(\"ctxErr\") }),\n ),\n );\n const sig = new Uint8Array([0xfe]);\n signMock.mockResolvedValue(CommandResultFactory({ data: Just(sig) }));\n\n const action = new SignTransactionDeviceAction({\n input: {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n transactionOptions: { skipOpenApp: true },\n contextModule: contextModuleStub,\n } as SignTransactionDAInput,\n });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n\n const expected = [\n // getAppConfig\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n // inspectTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.INSPECT_TRANSACTION,\n },\n status: DeviceActionStatus.Pending,\n },\n // buildContext\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.BUILD_TRANSACTION_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // provideContext (returns error but continues)\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.PROVIDE_TRANSACTION_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // signTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n step: signTransactionDAStateSteps.SIGN_TRANSACTION,\n },\n status: DeviceActionStatus.Pending,\n },\n // success\n { output: sig, status: DeviceActionStatus.Completed },\n ] as DeviceActionState<\n Uint8Array,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[];\n\n testDeviceActionStates<\n Uint8Array,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >(action, expected, apiMock, { onDone: resolve, onError: reject });\n }));\n\n it(\"buildContext throws \u2192 error\", () =>\n new Promise<void>((resolve, reject) => {\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.1\" },\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: true,\n });\n\n getAppConfigMock.mockResolvedValue(CommandResultFactory({ data: {} }));\n inspectTransactionMock.mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n });\n\n buildContextMock.mockRejectedValue(new InvalidStatusWordError(\"bldErr\"));\n\n const action = new SignTransactionDeviceAction({\n input: {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n transactionOptions: { skipOpenApp: true },\n contextModule: contextModuleStub,\n } as SignTransactionDAInput,\n });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n\n const expected = [\n // getAppConfig\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.GET_APP_CONFIG,\n },\n status: DeviceActionStatus.Pending,\n },\n // inspectTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.INSPECT_TRANSACTION,\n },\n status: DeviceActionStatus.Pending,\n },\n // buildContext (throws)\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.BUILD_TRANSACTION_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // error raised from buildContext\n {\n error: expect.anything() as unknown as SignTransactionDAError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n Uint8Array,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[];\n\n testDeviceActionStates<\n Uint8Array,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >(action, expected, apiMock, { onDone: resolve, onError: reject });\n }));\n});\n"],
5
+ "mappings": "AACA,OACE,wBAAAA,EAEA,sBAAAC,EACA,iBAAAC,EACA,0BAAAC,EACA,gBAAAC,EACA,0BAAAC,EACA,2BAAAC,MACK,kCACP,OAAS,QAAAC,EAAM,WAAAC,MAAe,YAC9B,OAAS,cAAAC,EAAY,YAAAC,EAAU,MAAAC,EAAI,MAAAC,MAAU,SAE7C,OAIE,+BAAAC,MACK,mDACP,OAAS,iBAAAC,MAAqB,0CAC9B,OAAS,0BAAAC,MAA8B,2EACvC,OAAS,0BAAAC,MAA8B,qDAGvC,OAAS,mCAAAC,MAAuC,mCAChD,OAAS,+BAAAC,MAAmC,gCAE5C,MAAMC,EAAoB,iBACpBC,EAAY,IAAI,WAAW,CAAC,IAAM,IAAM,IAAM,GAAI,CAAC,EAEnDC,EAAmC,CACvC,iBAAkBT,EAAG,GAAG,CAC1B,EAEA,IAAIU,EACAC,EACAC,EACAC,EACAC,EACAC,EAEJ,SAASC,GAAc,CACrB,MAAO,CACL,aAAcL,EACd,aAAcC,EACd,eAAgBC,EAChB,gBAAiBC,EACjB,mBAAoBC,CACtB,CACF,CAEAjB,EAAS,uCAAwC,IAAM,CACrDD,EAAW,IAAM,CACfa,EAAUL,EAAgC,EAC1CM,EAAmBX,EAAG,GAAG,EACzBY,EAAmBZ,EAAG,GAAG,EACzBa,EAAqBb,EAAG,GAAG,EAC3Bc,EAAWd,EAAG,GAAG,EACjBe,EAAyBf,EAAG,GAAG,EAAE,kBAAkB,CACjD,gBAAiBI,EAAuB,IACxC,KAAM,CAAE,aAAc,KAAM,UAAW,EAAM,CAC/C,CAAC,CACH,CAAC,EAEDL,EAAG,8EAA+E,IAChF,IAAI,QAAc,CAACkB,EAASC,IAAW,CACrCR,EAAQ,sBAAsB,gBAAgB,CAC5C,iBAAkBnB,EAAuB,0BACzC,aAAcC,EAAa,UAC3B,cAAe,CAAC,EAChB,WAAY,CAAE,KAAM,SAAU,QAAS,OAAQ,EAC/C,cAAeF,EAAc,OAC7B,0BAA2B,EAC7B,CAAC,EAEDqB,EAAiB,kBAAkBvB,EAAqB,CAAE,KAAM,CAAC,CAAE,CAAC,CAAC,EACrE2B,EAAuB,kBAAkB,CACvC,gBAAiBX,EAAuB,GAC1C,CAAC,EAED,MAAMe,EAAgC,CACpC,cAAe,IAAI,WAAW,CAAC,CAAC,CAAC,EACjC,0BAA2B,CACzB,eAAgB,EAChB,QAAS,IAAI,WAAW,CAAC,CAAI,CAAC,CAChC,EACA,eAAgB,CAAC,CACnB,EACAP,EAAiB,kBAAkBO,CAAG,EACtCN,EAAmB,kBAAkBjB,CAAO,EAE5C,MAAMwB,EAAY,IAAI,WAAW,CAAC,IAAM,GAAI,CAAC,EAC7CN,EAAS,kBACP1B,EAAqB,CAAE,KAAMO,EAAKyB,CAAS,CAAE,CAAC,CAChD,EAEA,MAAMC,EAAS,IAAIf,EAA4B,CAC7C,MAAO,CACL,eAAgBC,EAChB,YAAaC,EACb,mBAAoB,CAAE,YAAa,EAAK,EACxC,cAAeC,CACjB,CACF,CAAC,EACDT,EAAG,MAAMqB,EAAQ,qBAAqB,EAAE,gBAAgBL,EAAY,CAAC,EAErE,MAAMM,EAAW,CAEf,CACE,kBAAmB,CACjB,wBAAyB5B,EAAwB,KACjD,KAAMO,EAA4B,cACpC,EACA,OAAQZ,EAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyBK,EAAwB,KACjD,KAAMO,EAA4B,mBACpC,EACA,OAAQZ,EAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyBK,EAAwB,KACjD,KAAMO,EAA4B,yBACpC,EACA,OAAQZ,EAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyBK,EAAwB,KACjD,KAAMO,EAA4B,2BACpC,EACA,OAAQZ,EAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyBK,EAAwB,gBACjD,KAAMO,EAA4B,gBACpC,EACA,OAAQZ,EAAmB,OAC7B,EAEA,CAAE,OAAQ+B,EAAW,OAAQ/B,EAAmB,SAAU,CAC5D,EAMAc,EAKEkB,EAAQC,EAAUZ,EAAS,CAAE,OAAQO,EAAS,QAASC,CAAO,CAAC,CACnE,CAAC,CAAC,EAEJnB,EAAG,uDAAwD,IACzD,IAAI,QAAc,CAACkB,EAASC,IAAW,CACrCR,EAAQ,sBAAsB,gBAAgB,CAC5C,iBAAkBnB,EAAuB,0BACzC,aAAcC,EAAa,UAC3B,cAAe,CAAC,EAChB,WAAY,CAAE,KAAM,SAAU,QAAS,OAAQ,EAC/C,cAAeF,EAAc,OAC7B,0BAA2B,EAC7B,CAAC,EAEDqB,EAAiB,kBAAkBvB,EAAqB,CAAE,KAAM,CAAC,CAAE,CAAC,CAAC,EACrE2B,EAAuB,kBAAkB,CACvC,gBAAiBX,EAAuB,GAC1C,CAAC,EAED,MAAMe,EAAgC,CACpC,cAAe,IAAI,WAAW,CAAC,CAAC,CAAC,EACjC,0BAA2B,CACzB,eAAgB,EAChB,QAAS,IAAI,WAAW,CAAC,CAAI,CAAC,CAChC,EACA,eAAgB,CAAC,CACnB,EACAP,EAAiB,kBAAkBO,CAAG,EACtCN,EAAmB,kBAAkBjB,CAAO,EAE5C,MAAMwB,EAAY,IAAI,WAAW,CAAC,IAAM,GAAI,CAAC,EAC7CN,EAAS,kBACP1B,EAAqB,CAAE,KAAMO,EAAKyB,CAAS,CAAE,CAAC,CAChD,EAEA,MAAMC,EAAS,IAAIf,EAA4B,CAC7C,MAAO,CACL,eAAgBC,EAChB,YAAaC,EACb,mBAAoB,CAClB,YAAa,GACb,6BAA8B,CAE5B,cAAeN,EAAc,GAC/B,CACF,EACA,cAAeO,CACjB,CACF,CAAC,EACDT,EAAG,MAAMqB,EAAQ,qBAAqB,EAAE,gBAAgBL,EAAY,CAAC,EAErE,MAAMM,EAAW,CAEf,CACE,kBAAmB,CACjB,wBAAyB5B,EAAwB,KACjD,KAAMO,EAA4B,cACpC,EACA,OAAQZ,EAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyBK,EAAwB,KACjD,KAAMO,EAA4B,mBACpC,EACA,OAAQZ,EAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyBK,EAAwB,KACjD,KAAMO,EAA4B,yBACpC,EACA,OAAQZ,EAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyBK,EAAwB,KACjD,KAAMO,EAA4B,2BACpC,EACA,OAAQZ,EAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyBK,EAAwB,gBACjD,KAAMO,EAA4B,gBACpC,EACA,OAAQZ,EAAmB,OAC7B,EAEA,CAAE,OAAQ+B,EAAW,OAAQ/B,EAAmB,SAAU,CAC5D,EAMAc,EAKEkB,EAAQC,EAAUZ,EAAS,CAC3B,OAAQ,IAAM,CACZ,GAAI,CACF,OAAOI,CAAQ,EAAE,sBAAsB,CAAC,EACxC,MAAMS,EAAUT,EAAS,KAAK,MAAM,CAAC,EAAG,CAAC,EAGzC,OAAOS,EAAQ,MAAM,aAAa,EAAE,KAAKrB,EAAc,GAAG,EAC1De,EAAQ,CACV,OAASO,EAAG,CACVN,EAAOM,CAAC,CACV,CACF,EACA,QAASN,CACX,CAAC,CACH,CAAC,CAAC,EAEJnB,EAAG,wCAAyC,IAC1C,IAAI,QAAc,CAACkB,EAASC,IAAW,CACrCR,EAAQ,sBAAsB,gBAAgB,CAC5C,iBAAkBnB,EAAuB,0BACzC,aAAcC,EAAa,UAC3B,cAAe,CAAC,EAChB,WAAY,CAAE,KAAM,SAAU,QAAS,OAAQ,EAC/C,cAAeF,EAAc,OAC7B,0BAA2B,EAC7B,CAAC,EAEDqB,EAAiB,kBAAkBvB,EAAqB,CAAE,KAAM,CAAC,CAAE,CAAC,CAAC,EACrE2B,EAAuB,kBAAkB,CACvC,gBAAiBX,EAAuB,GAC1C,CAAC,EAEDQ,EAAiB,kBAAkB,CACjC,WAAY,IAAI,WAAW,CAAC,CAAC,CAAC,EAC9B,0BAA2B,CACzB,eAAgB,EAChB,QAAS,IAAI,UACf,EACA,UAAW,OACX,cAAe,CAAE,aAAc,GAAI,MAAO,GAAI,SAAU,EAAG,EAC3D,eAAgB,CAAC,CACnB,CAAC,EACDC,EAAmB,kBACjBlB,EACEP,EAAqB,CAAE,MAAO,IAAIK,EAAuB,QAAQ,CAAE,CAAC,CACtE,CACF,EACA,MAAMgC,EAAM,IAAI,WAAW,CAAC,GAAI,CAAC,EACjCX,EAAS,kBAAkB1B,EAAqB,CAAE,KAAMO,EAAK8B,CAAG,CAAE,CAAC,CAAC,EAEpE,MAAMJ,EAAS,IAAIf,EAA4B,CAC7C,MAAO,CACL,eAAgBC,EAChB,YAAaC,EACb,mBAAoB,CAAE,YAAa,EAAK,EACxC,cAAeC,CACjB,CACF,CAAC,EACDT,EAAG,MAAMqB,EAAQ,qBAAqB,EAAE,gBAAgBL,EAAY,CAAC,EAErE,MAAMM,EAAW,CAEf,CACE,kBAAmB,CACjB,wBAAyB5B,EAAwB,KACjD,KAAMO,EAA4B,cACpC,EACA,OAAQZ,EAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyBK,EAAwB,KACjD,KAAMO,EAA4B,mBACpC,EACA,OAAQZ,EAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyBK,EAAwB,KACjD,KAAMO,EAA4B,yBACpC,EACA,OAAQZ,EAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyBK,EAAwB,KACjD,KAAMO,EAA4B,2BACpC,EACA,OAAQZ,EAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyBK,EAAwB,gBACjD,KAAMO,EAA4B,gBACpC,EACA,OAAQZ,EAAmB,OAC7B,EAEA,CAAE,OAAQoC,EAAK,OAAQpC,EAAmB,SAAU,CACtD,EAMAc,EAKEkB,EAAQC,EAAUZ,EAAS,CAAE,OAAQO,EAAS,QAASC,CAAO,CAAC,CACnE,CAAC,CAAC,EAEJnB,EAAG,mCAA+B,IAChC,IAAI,QAAc,CAACkB,EAASC,IAAW,CACrCR,EAAQ,sBAAsB,gBAAgB,CAC5C,iBAAkBnB,EAAuB,0BACzC,aAAcC,EAAa,UAC3B,cAAe,CAAC,EAChB,WAAY,CAAE,KAAM,SAAU,QAAS,OAAQ,EAC/C,cAAeF,EAAc,OAC7B,0BAA2B,EAC7B,CAAC,EAEDqB,EAAiB,kBAAkBvB,EAAqB,CAAE,KAAM,CAAC,CAAE,CAAC,CAAC,EACrE2B,EAAuB,kBAAkB,CACvC,gBAAiBX,EAAuB,GAC1C,CAAC,EAEDQ,EAAiB,kBAAkB,IAAInB,EAAuB,QAAQ,CAAC,EAEvE,MAAM4B,EAAS,IAAIf,EAA4B,CAC7C,MAAO,CACL,eAAgBC,EAChB,YAAaC,EACb,mBAAoB,CAAE,YAAa,EAAK,EACxC,cAAeC,CACjB,CACF,CAAC,EACDT,EAAG,MAAMqB,EAAQ,qBAAqB,EAAE,gBAAgBL,EAAY,CAAC,EAErE,MAAMM,EAAW,CAEf,CACE,kBAAmB,CACjB,wBAAyB5B,EAAwB,KACjD,KAAMO,EAA4B,cACpC,EACA,OAAQZ,EAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyBK,EAAwB,KACjD,KAAMO,EAA4B,mBACpC,EACA,OAAQZ,EAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyBK,EAAwB,KACjD,KAAMO,EAA4B,yBACpC,EACA,OAAQZ,EAAmB,OAC7B,EAEA,CACE,MAAO,OAAO,SAAS,EACvB,OAAQA,EAAmB,KAC7B,CACF,EAMAc,EAKEkB,EAAQC,EAAUZ,EAAS,CAAE,OAAQO,EAAS,QAASC,CAAO,CAAC,CACnE,CAAC,CAAC,CACN,CAAC",
6
+ "names": ["CommandResultFactory", "DeviceActionStatus", "DeviceModelId", "DeviceSessionStateType", "DeviceStatus", "InvalidStatusWordError", "UserInteractionRequired", "Just", "Nothing", "beforeEach", "describe", "it", "vi", "signTransactionDAStateSteps", "UserInputType", "testDeviceActionStates", "SolanaTransactionTypes", "makeDeviceActionInternalApiMock", "SignTransactionDeviceAction", "defaultDerivation", "exampleTx", "contextModuleStub", "apiMock", "getAppConfigMock", "buildContextMock", "provideContextMock", "signMock", "inspectTransactionMock", "extractDeps", "resolve", "reject", "ctx", "signature", "action", "expected", "callArg", "e", "sig"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/services/GenerateSolanaTransaction.test.ts"],
4
- "sourcesContent": ["import {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n getAssociatedTokenAddressSync,\n TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport {\n Keypair,\n Message,\n type PublicKey,\n SystemProgram,\n} from \"@solana/web3.js\";\nimport { describe, expect, it } from \"vitest\";\n\nimport {\n COIN_DATA,\n GenerateSolanaTransaction,\n} from \"./GenerateSolanaTransaction\";\n\ndescribe(\"GenerateSolanaTransaction\", () => {\n const feePayer = Keypair.generate();\n const recipient = Keypair.generate();\n const feePayerKey = feePayer.publicKey.toBase58();\n const recipientKey = recipient.publicKey.toBase58();\n\n it(\"generateUsdcTransaction should equal generateSplTokenTransaction with USDC constants\", () => {\n // given\n const gen = new GenerateSolanaTransaction();\n const txA = gen.generateUsdcTransaction(feePayerKey, recipientKey, 2.5, 3);\n\n // when\n const txB = gen.generateSplTokenTransaction(\n feePayerKey,\n recipientKey,\n COIN_DATA.USDC.mint.toBase58(),\n 2.5,\n COIN_DATA.USDC.decimals,\n 3,\n );\n\n // then\n expect(txA).toBe(txB);\n });\n\n it(\"generateSplTokenTransaction emits correct SPL-Token TransferChecked instructions\", () => {\n // given\n const gen = new GenerateSolanaTransaction();\n const mint = COIN_DATA.USDC.mint;\n const decimals = COIN_DATA.USDC.decimals;\n const amount = 1.25;\n const transfers = 2;\n\n // when\n const b64 = gen.generateSplTokenTransaction(\n feePayerKey,\n recipientKey,\n mint.toBase58(),\n amount,\n decimals,\n transfers,\n );\n\n const uint8Array = Uint8Array.from(Buffer.from(b64, \"base64\"));\n const msg = Message.from(uint8Array);\n\n // then\n expect(msg.instructions).toHaveLength(transfers);\n\n const sourceAta = getAssociatedTokenAddressSync(\n mint,\n feePayer.publicKey,\n false,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n const destAta = getAssociatedTokenAddressSync(\n mint,\n recipient.publicKey,\n false,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n for (const ix of msg.instructions) {\n // program must be the SPL-Token program\n const pid = msg.accountKeys[ix.programIdIndex]!;\n expect(pid.equals(TOKEN_PROGRAM_ID)).toBe(true);\n\n // first account is source ATA, second is mint, third is dest ATA\n expect(\n (msg.accountKeys[ix.accounts[0]!] as PublicKey).equals(sourceAta),\n ).toBe(true);\n expect((msg.accountKeys[ix.accounts[1]!] as PublicKey).equals(mint)).toBe(\n true,\n );\n expect(\n (msg.accountKeys[ix.accounts[2]!] as PublicKey).equals(destAta),\n ).toBe(true);\n\n // feePayer must sign\n expect(\n (msg.accountKeys[ix.accounts[3]!] as PublicKey).equals(\n feePayer.publicKey,\n ),\n ).toBe(true);\n }\n });\n\n it(\"generatePlainSolanaTransaction emits correct SystemProgram.transfer instructions\", () => {\n // given\n const gen = new GenerateSolanaTransaction();\n const lamports = 1_000;\n const ops = 3;\n\n // when\n const b64 = gen.generatePlainSolanaTransaction(\n feePayerKey,\n recipientKey,\n lamports,\n ops,\n );\n const uint8Array = Uint8Array.from(Buffer.from(b64, \"base64\"));\n const msg = Message.from(uint8Array);\n\n // then\n expect(msg.instructions).toHaveLength(ops);\n\n for (const ix of msg.instructions) {\n // program must be SystemProgram\n const pid = msg.accountKeys[ix.programIdIndex]!;\n expect(pid.equals(SystemProgram.programId)).toBe(true);\n\n // accounts: [fromPubkey, toPubkey]\n expect((msg.accountKeys[ix.accounts[0]!] as PublicKey).toBase58()).toBe(\n feePayerKey,\n );\n expect((msg.accountKeys[ix.accounts[1]!] as PublicKey).toBase58()).toBe(\n recipientKey,\n );\n }\n });\n});\n"],
5
- "mappings": "AAAA,OACE,+BAAAA,EACA,iCAAAC,EACA,oBAAAC,MACK,oBACP,OACE,WAAAC,EACA,WAAAC,EAEA,iBAAAC,MACK,kBACP,OAAS,YAAAC,EAAU,UAAAC,EAAQ,MAAAC,MAAU,SAErC,OACE,aAAAC,EACA,6BAAAC,MACK,8BAEPJ,EAAS,4BAA6B,IAAM,CAC1C,MAAMK,EAAWR,EAAQ,SAAS,EAC5BS,EAAYT,EAAQ,SAAS,EAC7BU,EAAcF,EAAS,UAAU,SAAS,EAC1CG,EAAeF,EAAU,UAAU,SAAS,EAElDJ,EAAG,uFAAwF,IAAM,CAE/F,MAAMO,EAAM,IAAIL,EACVM,EAAMD,EAAI,wBAAwBF,EAAaC,EAAc,IAAK,CAAC,EAGnEG,EAAMF,EAAI,4BACdF,EACAC,EACAL,EAAU,KAAK,KAAK,SAAS,EAC7B,IACAA,EAAU,KAAK,SACf,CACF,EAGAF,EAAOS,CAAG,EAAE,KAAKC,CAAG,CACtB,CAAC,EAEDT,EAAG,mFAAoF,IAAM,CAE3F,MAAMO,EAAM,IAAIL,EACVQ,EAAOT,EAAU,KAAK,KACtBU,EAAWV,EAAU,KAAK,SAC1BW,EAAS,KACTC,EAAY,EAGZC,EAAMP,EAAI,4BACdF,EACAC,EACAI,EAAK,SAAS,EACdE,EACAD,EACAE,CACF,EAEME,EAAa,WAAW,KAAK,OAAO,KAAKD,EAAK,QAAQ,CAAC,EACvDE,EAAMpB,EAAQ,KAAKmB,CAAU,EAGnChB,EAAOiB,EAAI,YAAY,EAAE,aAAaH,CAAS,EAE/C,MAAMI,EAAYxB,EAChBiB,EACAP,EAAS,UACT,GACAT,EACAF,CACF,EACM0B,EAAUzB,EACdiB,EACAN,EAAU,UACV,GACAV,EACAF,CACF,EAEA,UAAW2B,KAAMH,EAAI,aAAc,CAEjC,MAAMI,EAAMJ,EAAI,YAAYG,EAAG,cAAc,EAC7CpB,EAAOqB,EAAI,OAAO1B,CAAgB,CAAC,EAAE,KAAK,EAAI,EAG9CK,EACGiB,EAAI,YAAYG,EAAG,SAAS,CAAC,CAAE,EAAgB,OAAOF,CAAS,CAClE,EAAE,KAAK,EAAI,EACXlB,EAAQiB,EAAI,YAAYG,EAAG,SAAS,CAAC,CAAE,EAAgB,OAAOT,CAAI,CAAC,EAAE,KACnE,EACF,EACAX,EACGiB,EAAI,YAAYG,EAAG,SAAS,CAAC,CAAE,EAAgB,OAAOD,CAAO,CAChE,EAAE,KAAK,EAAI,EAGXnB,EACGiB,EAAI,YAAYG,EAAG,SAAS,CAAC,CAAE,EAAgB,OAC9ChB,EAAS,SACX,CACF,EAAE,KAAK,EAAI,CACb,CACF,CAAC,EAEDH,EAAG,mFAAoF,IAAM,CAE3F,MAAMO,EAAM,IAAIL,EACVmB,EAAW,IACXC,EAAM,EAGNR,EAAMP,EAAI,+BACdF,EACAC,EACAe,EACAC,CACF,EACMP,EAAa,WAAW,KAAK,OAAO,KAAKD,EAAK,QAAQ,CAAC,EACvDE,EAAMpB,EAAQ,KAAKmB,CAAU,EAGnChB,EAAOiB,EAAI,YAAY,EAAE,aAAaM,CAAG,EAEzC,UAAWH,KAAMH,EAAI,aAAc,CAEjC,MAAMI,EAAMJ,EAAI,YAAYG,EAAG,cAAc,EAC7CpB,EAAOqB,EAAI,OAAOvB,EAAc,SAAS,CAAC,EAAE,KAAK,EAAI,EAGrDE,EAAQiB,EAAI,YAAYG,EAAG,SAAS,CAAC,CAAE,EAAgB,SAAS,CAAC,EAAE,KACjEd,CACF,EACAN,EAAQiB,EAAI,YAAYG,EAAG,SAAS,CAAC,CAAE,EAAgB,SAAS,CAAC,EAAE,KACjEb,CACF,CACF,CACF,CAAC,CACH,CAAC",
6
- "names": ["ASSOCIATED_TOKEN_PROGRAM_ID", "getAssociatedTokenAddressSync", "TOKEN_PROGRAM_ID", "Keypair", "Message", "SystemProgram", "describe", "expect", "it", "COIN_DATA", "GenerateSolanaTransaction", "feePayer", "recipient", "feePayerKey", "recipientKey", "gen", "txA", "txB", "mint", "decimals", "amount", "transfers", "b64", "uint8Array", "msg", "sourceAta", "destAta", "ix", "pid", "lamports", "ops"]
4
+ "sourcesContent": ["import {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n getAssociatedTokenAddressSync,\n TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport {\n Keypair,\n Message,\n type PublicKey,\n SystemProgram,\n} from \"@solana/web3.js\";\nimport { describe, expect, it } from \"vitest\";\n\nimport {\n COIN_DATA,\n GenerateSolanaTransaction,\n} from \"./GenerateSolanaTransaction\";\n\ndescribe(\"GenerateSolanaTransaction\", () => {\n const feePayer = Keypair.generate();\n const recipient = Keypair.generate();\n const feePayerKey = feePayer.publicKey.toBase58();\n const recipientKey = recipient.publicKey.toBase58();\n\n it(\"generateUsdcTransaction should equal generateSplTokenTransaction with USDC constants\", () => {\n // given\n const gen = new GenerateSolanaTransaction();\n const txA = gen.generateUsdcTransaction(feePayerKey, recipientKey, 2.5, 3);\n\n // when\n const txB = gen.generateSplTokenTransaction(\n feePayerKey,\n recipientKey,\n COIN_DATA.USDC.mint.toBase58(),\n 2.5,\n COIN_DATA.USDC.decimals,\n 3,\n );\n\n // then\n expect(txA).toBe(txB);\n });\n\n it(\"generateSplTokenTransaction emits correct SPL-Token TransferChecked instructions\", () => {\n // given\n const gen = new GenerateSolanaTransaction();\n const mint = COIN_DATA.USDC.mint;\n const decimals = COIN_DATA.USDC.decimals;\n const amount = 1.25;\n const transfers = 2;\n\n // when\n const b64 = gen.generateSplTokenTransaction(\n feePayerKey,\n recipientKey,\n mint.toBase58(),\n amount,\n decimals,\n transfers,\n );\n\n const uint8Array = Uint8Array.from(Buffer.from(b64, \"base64\"));\n const msg = Message.from(uint8Array);\n\n // then\n expect(msg.instructions).toHaveLength(transfers);\n\n const sourceAta = getAssociatedTokenAddressSync(\n mint,\n feePayer.publicKey,\n false,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n const destAta = getAssociatedTokenAddressSync(\n mint,\n recipient.publicKey,\n false,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n for (const instruction of msg.instructions) {\n // program must be the SPL-Token program\n const pid = msg.accountKeys[instruction.programIdIndex]!;\n expect(pid.equals(TOKEN_PROGRAM_ID)).toBe(true);\n\n // first account is source ATA, second is mint, third is dest ATA\n expect(\n (msg.accountKeys[instruction.accounts[0]!] as PublicKey).equals(\n sourceAta,\n ),\n ).toBe(true);\n expect(\n (msg.accountKeys[instruction.accounts[1]!] as PublicKey).equals(mint),\n ).toBe(true);\n expect(\n (msg.accountKeys[instruction.accounts[2]!] as PublicKey).equals(\n destAta,\n ),\n ).toBe(true);\n\n // feePayer must sign\n expect(\n (msg.accountKeys[instruction.accounts[3]!] as PublicKey).equals(\n feePayer.publicKey,\n ),\n ).toBe(true);\n }\n });\n\n it(\"generatePlainSolanaTransaction emits correct SystemProgram.transfer instructions\", () => {\n // given\n const gen = new GenerateSolanaTransaction();\n const lamports = 1_000;\n const ops = 3;\n\n // when\n const b64 = gen.generatePlainSolanaTransaction(\n feePayerKey,\n recipientKey,\n lamports,\n ops,\n );\n const uint8Array = Uint8Array.from(Buffer.from(b64, \"base64\"));\n const msg = Message.from(uint8Array);\n\n // then\n expect(msg.instructions).toHaveLength(ops);\n\n for (const instruction of msg.instructions) {\n // program must be SystemProgram\n const pid = msg.accountKeys[instruction.programIdIndex]!;\n expect(pid.equals(SystemProgram.programId)).toBe(true);\n\n // accounts: [fromPubkey, toPubkey]\n expect(\n (msg.accountKeys[instruction.accounts[0]!] as PublicKey).toBase58(),\n ).toBe(feePayerKey);\n expect(\n (msg.accountKeys[instruction.accounts[1]!] as PublicKey).toBase58(),\n ).toBe(recipientKey);\n }\n });\n});\n"],
5
+ "mappings": "AAAA,OACE,+BAAAA,EACA,iCAAAC,EACA,oBAAAC,MACK,oBACP,OACE,WAAAC,EACA,WAAAC,EAEA,iBAAAC,MACK,kBACP,OAAS,YAAAC,EAAU,UAAAC,EAAQ,MAAAC,MAAU,SAErC,OACE,aAAAC,EACA,6BAAAC,MACK,8BAEPJ,EAAS,4BAA6B,IAAM,CAC1C,MAAMK,EAAWR,EAAQ,SAAS,EAC5BS,EAAYT,EAAQ,SAAS,EAC7BU,EAAcF,EAAS,UAAU,SAAS,EAC1CG,EAAeF,EAAU,UAAU,SAAS,EAElDJ,EAAG,uFAAwF,IAAM,CAE/F,MAAMO,EAAM,IAAIL,EACVM,EAAMD,EAAI,wBAAwBF,EAAaC,EAAc,IAAK,CAAC,EAGnEG,EAAMF,EAAI,4BACdF,EACAC,EACAL,EAAU,KAAK,KAAK,SAAS,EAC7B,IACAA,EAAU,KAAK,SACf,CACF,EAGAF,EAAOS,CAAG,EAAE,KAAKC,CAAG,CACtB,CAAC,EAEDT,EAAG,mFAAoF,IAAM,CAE3F,MAAMO,EAAM,IAAIL,EACVQ,EAAOT,EAAU,KAAK,KACtBU,EAAWV,EAAU,KAAK,SAC1BW,EAAS,KACTC,EAAY,EAGZC,EAAMP,EAAI,4BACdF,EACAC,EACAI,EAAK,SAAS,EACdE,EACAD,EACAE,CACF,EAEME,EAAa,WAAW,KAAK,OAAO,KAAKD,EAAK,QAAQ,CAAC,EACvDE,EAAMpB,EAAQ,KAAKmB,CAAU,EAGnChB,EAAOiB,EAAI,YAAY,EAAE,aAAaH,CAAS,EAE/C,MAAMI,EAAYxB,EAChBiB,EACAP,EAAS,UACT,GACAT,EACAF,CACF,EACM0B,EAAUzB,EACdiB,EACAN,EAAU,UACV,GACAV,EACAF,CACF,EAEA,UAAW2B,KAAeH,EAAI,aAAc,CAE1C,MAAMI,EAAMJ,EAAI,YAAYG,EAAY,cAAc,EACtDpB,EAAOqB,EAAI,OAAO1B,CAAgB,CAAC,EAAE,KAAK,EAAI,EAG9CK,EACGiB,EAAI,YAAYG,EAAY,SAAS,CAAC,CAAE,EAAgB,OACvDF,CACF,CACF,EAAE,KAAK,EAAI,EACXlB,EACGiB,EAAI,YAAYG,EAAY,SAAS,CAAC,CAAE,EAAgB,OAAOT,CAAI,CACtE,EAAE,KAAK,EAAI,EACXX,EACGiB,EAAI,YAAYG,EAAY,SAAS,CAAC,CAAE,EAAgB,OACvDD,CACF,CACF,EAAE,KAAK,EAAI,EAGXnB,EACGiB,EAAI,YAAYG,EAAY,SAAS,CAAC,CAAE,EAAgB,OACvDhB,EAAS,SACX,CACF,EAAE,KAAK,EAAI,CACb,CACF,CAAC,EAEDH,EAAG,mFAAoF,IAAM,CAE3F,MAAMO,EAAM,IAAIL,EACVmB,EAAW,IACXC,EAAM,EAGNR,EAAMP,EAAI,+BACdF,EACAC,EACAe,EACAC,CACF,EACMP,EAAa,WAAW,KAAK,OAAO,KAAKD,EAAK,QAAQ,CAAC,EACvDE,EAAMpB,EAAQ,KAAKmB,CAAU,EAGnChB,EAAOiB,EAAI,YAAY,EAAE,aAAaM,CAAG,EAEzC,UAAWH,KAAeH,EAAI,aAAc,CAE1C,MAAMI,EAAMJ,EAAI,YAAYG,EAAY,cAAc,EACtDpB,EAAOqB,EAAI,OAAOvB,EAAc,SAAS,CAAC,EAAE,KAAK,EAAI,EAGrDE,EACGiB,EAAI,YAAYG,EAAY,SAAS,CAAC,CAAE,EAAgB,SAAS,CACpE,EAAE,KAAKd,CAAW,EAClBN,EACGiB,EAAI,YAAYG,EAAY,SAAS,CAAC,CAAE,EAAgB,SAAS,CACpE,EAAE,KAAKb,CAAY,CACrB,CACF,CAAC,CACH,CAAC",
6
+ "names": ["ASSOCIATED_TOKEN_PROGRAM_ID", "getAssociatedTokenAddressSync", "TOKEN_PROGRAM_ID", "Keypair", "Message", "SystemProgram", "describe", "expect", "it", "COIN_DATA", "GenerateSolanaTransaction", "feePayer", "recipient", "feePayerKey", "recipientKey", "gen", "txA", "txB", "mint", "decimals", "amount", "transfers", "b64", "uint8Array", "msg", "sourceAta", "destAta", "instruction", "pid", "lamports", "ops"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{ASSOCIATED_TOKEN_PROGRAM_ID as m,decodeInitializeAccountInstruction as p,decodeTransferCheckedInstruction as I,decodeTransferInstruction as T,TOKEN_2022_PROGRAM_ID as A,TOKEN_PROGRAM_ID as f,TokenInstruction as y}from"@solana/spl-token";import{Transaction as g,TransactionInstruction as K,VersionedMessage as k,VersionedTransaction as b}from"@solana/web3.js";import{Buffer as l}from"buffer";var P=(a=>(a.STANDARD="Standard",a.SPL="SPL",a))(P||{});class D{constructor(s){this.rawTransactionBytes=s}inspectTransactionType(){try{const s=this.normaliseMessage(this.rawTransactionBytes);for(const a of s.compiledInstructions){const r=s.allKeys[a.programIdIndex];if(!r)continue;if(r.equals(m)){const t=a.accountKeyIndexes.map(n=>s.allKeys[n]).filter(Boolean),c=t[1],e=t[3];if(c&&e)return{transactionType:"SPL",data:{createATA:{address:c.toBase58(),mintAddress:e.toBase58()}}};continue}if(!(r.equals(f)||r.equals(A)))continue;const o=new K({programId:r,keys:a.accountKeyIndexes.map(t=>{if(!s.allKeys[t])throw new Error(`TransactionInspector: missing key at index ${t} in allKeys`);return{pubkey:s.allKeys[t],isSigner:!1,isWritable:!1}}),data:l.from(a.data)}),u=o.data[0];try{switch(u){case y.Transfer:{const{keys:{destination:t}}=T(o);return{transactionType:"SPL",data:{tokenAddress:t.pubkey.toBase58()}}}case y.TransferChecked:{const{keys:{destination:t,mint:c}}=I(o);return{transactionType:"SPL",data:{tokenAddress:t.pubkey.toBase58(),mintAddress:c.pubkey.toBase58()}}}case y.InitializeAccount:{const{keys:{account:t,mint:c}}=p(o);return{transactionType:"SPL",data:{createATA:{address:t.pubkey.toBase58(),mintAddress:c.pubkey.toBase58()}}}}default:break}}catch{continue}}return{transactionType:"Standard",data:{}}}catch{return{transactionType:"Standard",data:{}}}}normaliseMessage(s){const a=this.tryDeserialiseVersioned(s);if(a){const e=a.message;let n;return typeof e.getAccountKeys=="function"?n=e.getAccountKeys().keySegments().flat():n=[...e.staticAccountKeys],{compiledInstructions:e.compiledInstructions.map(i=>({programIdIndex:i.programIdIndex,accountKeyIndexes:Array.from(i.accountKeyIndexes??[]),data:i.data instanceof Uint8Array?i.data:l.from(i.data??[])})),allKeys:n}}const r=g.from(s),d=new Map,o=e=>{if(!e)return;const n=e.toBase58();d.has(n)||d.set(n,e)};o(r.feePayer??null);for(const e of r.instructions){o(e.programId);for(const n of e.keys)o(n.pubkey)}const u=Array.from(d.values()),t=new Map(u.map((e,n)=>[e.toBase58(),n]));return{compiledInstructions:r.instructions.map(e=>({programIdIndex:t.get(e.programId.toBase58())??-1,accountKeyIndexes:e.keys.map(n=>t.get(n.pubkey.toBase58())??-1),data:e.data})),allKeys:u}}tryDeserialiseVersioned(s){try{return b.deserialize(s)}catch{try{return{message:k.deserialize(s)}}catch{return null}}}}export{P as SolanaTransactionTypes,D as TransactionInspector};
1
+ import{ASSOCIATED_TOKEN_PROGRAM_ID as P,TOKEN_2022_PROGRAM_ID as b,TOKEN_PROGRAM_ID as x}from"@solana/spl-token";import{Connection as S,Transaction as k,TransactionInstruction as L,VersionedMessage as R,VersionedTransaction as D}from"@solana/web3.js";import{Buffer as g}from"buffer";import{DECODERS as M}from"../../app-binder/services/utils/transactionDecoders";var U=(a=>(a.STANDARD="Standard",a.SPL="SPL",a))(U||{});const C="https://api.mainnet-beta.solana.com/",N=y=>new S(y,{commitment:"confirmed"}),I=y=>!!y&&(y.equals(P)||y.equals(x)||y.equals(b));class A{RPCURL;constructor(r){this.RPCURL=r}async inspectTransactionType(r,a,c){try{const n=await A.normaliseMessage(r,this.RPCURL||C);if(a||c)return{transactionType:n.compiledInstructions.some(o=>I(n.allKeys[o.programIdIndex]))?"SPL":"Standard",data:{...a?{tokenAddress:a}:{},...c?{createATA:c}:{}}};let d=!1,t={};for(const l of n.compiledInstructions){const o=n.allKeys[l.programIdIndex];if(!o)continue;I(o)&&(d=!0);const p=l.accountKeyIndexes.map(i=>n.allKeys[i]).filter(i=>!!i),e=new L({programId:o,keys:p.map(i=>({pubkey:i,isSigner:!1,isWritable:!1})),data:g.from(l.data)}),s={programId:o,ixMeta:l,message:n,instruction:e};for(const i of M){if(!i.when(s))continue;const m=i.decode(s);m&&(m.createATA&&!t.createATA?t={...t,createATA:m.createATA}:m.tokenAddress&&!t.tokenAddress&&!t.createATA&&(t={...t,tokenAddress:m.tokenAddress}))}}return t.createATA?{transactionType:"SPL",data:t}:t.tokenAddress?{transactionType:"SPL",data:t}:d?{transactionType:"SPL",data:{}}:{transactionType:"Standard",data:{}}}catch{return{transactionType:"Standard",data:{}}}}static async normaliseMessage(r,a){const c=A.tryDeserialiseVersioned(r);if(c){const e=c.message,s=a?await A.resolveLookedUpAddressesFromMessage(e,a):void 0,i=[...e.staticAccountKeys,...s?.writable??[],...s?.readonly??[]];return{compiledInstructions:e.compiledInstructions.map(u=>{const T=u,K=Array.from(T.accounts??u.accountKeyIndexes??[]);let f;return u.data instanceof Uint8Array?f=u.data:typeof u.data=="string"?f=g.from(u.data,"base64"):f=Uint8Array.from(u.data??[]),{programIdIndex:u.programIdIndex,accountKeyIndexes:K,data:f}}),allKeys:i}}const n=k.from(r),d=new Map,t=e=>{if(!e)return;const s=e.toBase58();d.has(s)||d.set(s,e)};t(n.feePayer??null);for(const e of n.instructions){t(e.programId);for(const s of e.keys)t(s.pubkey)}const l=Array.from(d.values()),o=new Map(l.map((e,s)=>[e.toBase58(),s]));return{compiledInstructions:n.instructions.map(e=>({programIdIndex:o.get(e.programId.toBase58())??-1,accountKeyIndexes:e.keys.map(s=>o.get(s.pubkey.toBase58())??-1),data:e.data})),allKeys:l}}static tryDeserialiseVersioned(r){try{return D.deserialize(r)}catch{try{return{message:R.deserialize(r)}}catch{return null}}}static async resolveLookedUpAddressesFromMessage(r,a){const c=r.addressTableLookups??[];if(!c.length)return;const n=[],d=[];for(const t of c){const o=(await N(a).getAddressLookupTable(t.accountKey)).value;if(!o)continue;const p=o.state.addresses;for(const e of t.writableIndexes??[]){const s=p[e];s&&n.push(s)}for(const e of t.readonlyIndexes??[]){const s=p[e];s&&d.push(s)}}return{writable:n,readonly:d}}}export{U as SolanaTransactionTypes,A as TransactionInspector};
2
2
  //# sourceMappingURL=TransactionInspector.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/services/TransactionInspector.ts"],
4
- "sourcesContent": ["import {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n decodeInitializeAccountInstruction,\n decodeTransferCheckedInstruction,\n decodeTransferInstruction,\n TOKEN_2022_PROGRAM_ID,\n TOKEN_PROGRAM_ID,\n TokenInstruction,\n} from \"@solana/spl-token\";\nimport {\n type PublicKey,\n Transaction,\n TransactionInstruction,\n VersionedMessage,\n VersionedTransaction,\n} from \"@solana/web3.js\";\nimport { Buffer } from \"buffer\";\n\nexport enum SolanaTransactionTypes {\n STANDARD = \"Standard\",\n SPL = \"SPL\",\n}\n\nexport interface TxInspectorResult {\n transactionType: SolanaTransactionTypes;\n data: {\n tokenAddress?: string;\n mintAddress?: string;\n createATA?: {\n address: string;\n mintAddress: string;\n };\n };\n}\n\ntype NormalizedCompiledIx = {\n programIdIndex: number;\n accountKeyIndexes: number[];\n data: Uint8Array;\n};\n\ntype NormalizedMessage = {\n compiledInstructions: NormalizedCompiledIx[];\n allKeys: PublicKey[];\n};\n\ntype LoadedAddresses = { writable: PublicKey[]; readonly: PublicKey[] };\n\nexport class TransactionInspector {\n /**\n * @param rawTransactionBytes - the raw tx bytes (legacy or v0)\n */\n constructor(private readonly rawTransactionBytes: Uint8Array) {}\n\n public inspectTransactionType(): TxInspectorResult {\n try {\n const message = this.normaliseMessage(this.rawTransactionBytes);\n\n for (const ixMeta of message.compiledInstructions) {\n const programId = message.allKeys[ixMeta.programIdIndex];\n if (!programId) continue;\n\n // Associated Token Account (ATA) Program: detect ATA creation\n if (programId.equals(ASSOCIATED_TOKEN_PROGRAM_ID)) {\n // expected accounts: [payer, ata, owner, mint, systemProgram, tokenProgram, rent?]\n const accountPks = ixMeta.accountKeyIndexes\n .map((i) => message.allKeys[i])\n .filter(Boolean) as PublicKey[];\n const ataPk = accountPks[1];\n const mintPk = accountPks[3];\n if (ataPk && mintPk) {\n return {\n transactionType: SolanaTransactionTypes.SPL,\n data: {\n createATA: {\n address: ataPk.toBase58(),\n mintAddress: mintPk.toBase58(),\n },\n },\n };\n }\n continue;\n }\n\n // Token Program (classic or 2022)\n const isTokenProgram =\n programId.equals(TOKEN_PROGRAM_ID) ||\n programId.equals(TOKEN_2022_PROGRAM_ID);\n if (!isTokenProgram) continue;\n\n // minimal TransactionInstruction for the decoders\n const instruction = new TransactionInstruction({\n programId,\n keys: ixMeta.accountKeyIndexes.map((i) => {\n if (!message.allKeys[i]) {\n throw new Error(\n `TransactionInspector: missing key at index ${i} in allKeys`,\n );\n }\n return {\n pubkey: message.allKeys[i],\n isSigner: false,\n isWritable: false,\n };\n }),\n data: Buffer.from(ixMeta.data),\n });\n\n const instructionType = instruction.data[0];\n\n try {\n switch (instructionType) {\n case TokenInstruction.Transfer: {\n const {\n keys: { destination },\n } = decodeTransferInstruction(instruction);\n return {\n transactionType: SolanaTransactionTypes.SPL,\n data: { tokenAddress: destination.pubkey.toBase58() },\n };\n }\n case TokenInstruction.TransferChecked: {\n const {\n keys: { destination, mint },\n } = decodeTransferCheckedInstruction(instruction);\n return {\n transactionType: SolanaTransactionTypes.SPL,\n data: {\n tokenAddress: destination.pubkey.toBase58(),\n mintAddress: mint.pubkey.toBase58(),\n },\n };\n }\n case TokenInstruction.InitializeAccount: {\n // InitializeAccount != ATA creation, ATA is via the Associated Token Account Program above.\n const {\n keys: { account, mint },\n } = decodeInitializeAccountInstruction(instruction);\n return {\n transactionType: SolanaTransactionTypes.SPL,\n data: {\n createATA: {\n address: account.pubkey.toBase58(),\n mintAddress: mint.pubkey.toBase58(),\n },\n },\n };\n }\n default:\n // not a token instruction we care about\u2014keep scanning.\n break;\n }\n } catch {\n // if a decoder throws (bad match), keep scanning other instructions.\n continue;\n }\n }\n\n return { transactionType: SolanaTransactionTypes.STANDARD, data: {} };\n } catch {\n return { transactionType: SolanaTransactionTypes.STANDARD, data: {} };\n }\n }\n\n /**\n * normalise any tx (legacy or v0) into { compiledInstructions, allKeys }.\n * if LUT accounts are provided, looked-up keys are included in allKeys.\n */\n private normaliseMessage(rawBytes: Uint8Array): NormalizedMessage {\n const vtx = this.tryDeserialiseVersioned(rawBytes);\n if (vtx) {\n const msg = vtx.message as VersionedMessage & {\n getAccountKeys?: (opts?: {\n accountKeysFromLookups?: LoadedAddresses;\n }) => {\n staticAccountKeys: PublicKey[];\n accountKeysFromLookups?: LoadedAddresses;\n keySegments: () => PublicKey[][];\n };\n compiledInstructions: Array<{\n programIdIndex: number;\n accountKeyIndexes?: number[];\n accounts?: number[];\n data: Uint8Array | string | number[];\n }>;\n staticAccountKeys: PublicKey[];\n };\n\n // build the full key array in the exact index order used by compiledInstructions\n let allKeys: PublicKey[];\n if (typeof msg.getAccountKeys === \"function\") {\n const mak = msg.getAccountKeys();\n allKeys = mak.keySegments().flat();\n } else {\n // very old builds: fall back to concatenation (same order)\n allKeys = [...msg.staticAccountKeys];\n }\n\n const compiledInstructions: NormalizedCompiledIx[] =\n msg.compiledInstructions.map((ix) => ({\n programIdIndex: ix.programIdIndex,\n accountKeyIndexes: Array.from(ix.accountKeyIndexes ?? []),\n data:\n ix.data instanceof Uint8Array\n ? ix.data\n : Buffer.from(ix.data ?? []),\n }));\n\n return { compiledInstructions, allKeys };\n }\n\n // legacy fallback\n const legacy = Transaction.from(rawBytes);\n\n const allKeyMap = new Map<string, PublicKey>();\n const add = (pk?: PublicKey | null) => {\n if (!pk) return;\n const k = pk.toBase58();\n if (!allKeyMap.has(k)) allKeyMap.set(k, pk);\n };\n\n add(legacy.feePayer ?? null);\n for (const ix of legacy.instructions) {\n add(ix.programId);\n for (const k of ix.keys) add(k.pubkey);\n }\n const allKeys = Array.from(allKeyMap.values());\n const indexByB58 = new Map(allKeys.map((pk, i) => [pk.toBase58(), i]));\n\n const compiledInstructions: NormalizedCompiledIx[] =\n legacy.instructions.map((ix) => ({\n programIdIndex: indexByB58.get(ix.programId.toBase58()) ?? -1,\n accountKeyIndexes: ix.keys.map(\n (k) => indexByB58.get(k.pubkey.toBase58()) ?? -1,\n ),\n data: ix.data,\n }));\n\n return { compiledInstructions, allKeys };\n }\n\n private tryDeserialiseVersioned(\n rawBytes: Uint8Array,\n ): VersionedTransaction | null {\n try {\n return VersionedTransaction.deserialize(rawBytes);\n } catch {\n try {\n const msg = VersionedMessage.deserialize(rawBytes);\n // wrap in a dummy VersionedTransaction-like shape just for uniform handling\n return { message: msg } as VersionedTransaction;\n } catch {\n return null;\n }\n }\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["ASSOCIATED_TOKEN_PROGRAM_ID", "decodeInitializeAccountInstruction", "decodeTransferCheckedInstruction", "decodeTransferInstruction", "TOKEN_2022_PROGRAM_ID", "TOKEN_PROGRAM_ID", "TokenInstruction", "Transaction", "TransactionInstruction", "VersionedMessage", "VersionedTransaction", "Buffer", "SolanaTransactionTypes", "TransactionInspector", "rawTransactionBytes", "message", "ixMeta", "programId", "accountPks", "i", "ataPk", "mintPk", "instruction", "instructionType", "destination", "mint", "account", "rawBytes", "vtx", "msg", "allKeys", "ix", "legacy", "allKeyMap", "add", "pk", "k", "indexByB58"]
4
+ "sourcesContent": ["import {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n TOKEN_2022_PROGRAM_ID,\n TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport {\n Connection,\n type PublicKey,\n Transaction,\n TransactionInstruction,\n VersionedMessage,\n VersionedTransaction,\n} from \"@solana/web3.js\";\nimport { Buffer } from \"buffer\";\n\nimport {\n DECODERS,\n type IxContext,\n} from \"@internal/app-binder/services/utils/transactionDecoders\";\n\nexport enum SolanaTransactionTypes {\n STANDARD = \"Standard\",\n SPL = \"SPL\",\n}\n\nexport type NormalizedCompiledIx = {\n programIdIndex: number;\n accountKeyIndexes: number[];\n data: Uint8Array;\n};\n\nexport type NormalizedMessage = {\n compiledInstructions: NormalizedCompiledIx[];\n allKeys: PublicKey[];\n};\n\nexport type TxInspectorResult = {\n transactionType: SolanaTransactionTypes;\n data: {\n tokenAddress?: string;\n createATA?: { address: string; mintAddress: string };\n };\n};\n\ntype LoadedAddresses = { writable: PublicKey[]; readonly: PublicKey[] };\n\nconst DEFAULT_RPC_URL = \"https://api.mainnet-beta.solana.com/\";\n\nconst defaultConnection = (rpcUrl: string) =>\n new Connection(rpcUrl, { commitment: \"confirmed\" });\n\nconst isSPLProgramId = (pid: PublicKey | undefined) =>\n !!pid &&\n (pid.equals(ASSOCIATED_TOKEN_PROGRAM_ID) ||\n pid.equals(TOKEN_PROGRAM_ID) ||\n pid.equals(TOKEN_2022_PROGRAM_ID));\n\nexport class TransactionInspector {\n private readonly RPCURL: string | undefined;\n constructor(injectedRPCURL?: string | undefined) {\n this.RPCURL = injectedRPCURL;\n }\n\n public async inspectTransactionType(\n rawTransactionBytes: Uint8Array,\n tokenAddress?: string | undefined,\n createATA?:\n | {\n address: string;\n mintAddress: string;\n }\n | undefined,\n ): Promise<TxInspectorResult> {\n try {\n const message = await TransactionInspector.normaliseMessage(\n rawTransactionBytes,\n this.RPCURL || DEFAULT_RPC_URL,\n );\n\n // fast path when transaction resolution is provided\n if (tokenAddress || createATA) {\n const looksSPL = message.compiledInstructions.some((instruction) =>\n isSPLProgramId(message.allKeys[instruction.programIdIndex]),\n );\n return {\n transactionType: looksSPL\n ? SolanaTransactionTypes.SPL\n : SolanaTransactionTypes.STANDARD,\n data: {\n ...(tokenAddress ? { tokenAddress: tokenAddress } : {}),\n ...(createATA ? { createATA: createATA } : {}),\n },\n };\n }\n\n // accumulate best data across all instructions\n let sawSPL = false;\n let best: TxInspectorResult[\"data\"] = {};\n\n for (const ixMeta of message.compiledInstructions) {\n const programId = message.allKeys[ixMeta.programIdIndex];\n if (!programId) continue; // unresolved index, skip\n if (isSPLProgramId(programId)) sawSPL = true;\n\n const resolvedKeys = ixMeta.accountKeyIndexes\n .map((i) => message.allKeys[i])\n .filter((k): k is PublicKey => !!k);\n\n const instruction = new TransactionInstruction({\n programId,\n keys: resolvedKeys.map((pk) => ({\n pubkey: pk,\n isSigner: false,\n isWritable: false,\n })),\n data: Buffer.from(ixMeta.data),\n });\n\n const ctx: IxContext = { programId, ixMeta, message, instruction };\n\n for (const decoder of DECODERS) {\n if (!decoder.when(ctx)) continue;\n const data = decoder.decode(ctx);\n if (!data) continue;\n\n // prefer createATA (needed when destination ATA doesn\u2019t exist yet)\n if (data.createATA && !best.createATA) {\n best = { ...best, createATA: data.createATA };\n } else if (\n data.tokenAddress &&\n !best.tokenAddress &&\n !best.createATA\n ) {\n best = { ...best, tokenAddress: data.tokenAddress };\n }\n }\n }\n\n if (best.createATA)\n return { transactionType: SolanaTransactionTypes.SPL, data: best };\n\n if (best.tokenAddress)\n return { transactionType: SolanaTransactionTypes.SPL, data: best };\n\n if (sawSPL)\n return { transactionType: SolanaTransactionTypes.SPL, data: {} }; // we should never reach here, in case we do tx will fall back to blind sign\n\n return { transactionType: SolanaTransactionTypes.STANDARD, data: {} };\n } catch {\n return { transactionType: SolanaTransactionTypes.STANDARD, data: {} };\n }\n }\n\n /**\n * Normalise any tx (legacy or v0) into { compiledInstructions, allKeys }.\n * For v0, auto-fetch looked-up addresses from ALT(s) via the connection.\n */\n static async normaliseMessage(\n rawBytes: Uint8Array,\n rpcURL?: string,\n ): Promise<NormalizedMessage> {\n const versionedTX = TransactionInspector.tryDeserialiseVersioned(rawBytes);\n\n if (versionedTX) {\n const msg = versionedTX.message as VersionedMessage & {\n getAccountKeys?: (options?: {\n accountKeysFromLookups?: LoadedAddresses;\n }) => {\n staticAccountKeys: PublicKey[];\n accountKeysFromLookups?: LoadedAddresses;\n keySegments: () => PublicKey[][];\n };\n compiledInstructions: Array<{\n programIdIndex: number;\n accountKeyIndexes?: number[]; // legacy field name\n accounts?: number[]; // v0 field name\n data: Uint8Array | string | number[];\n }>;\n staticAccountKeys: PublicKey[];\n };\n\n const lookedUp = rpcURL\n ? await TransactionInspector.resolveLookedUpAddressesFromMessage(\n msg,\n rpcURL,\n )\n : undefined;\n\n const allKeys: PublicKey[] = [\n ...msg.staticAccountKeys,\n ...(lookedUp?.writable ?? []),\n ...(lookedUp?.readonly ?? []),\n ];\n\n const compiledInstructions: NormalizedCompiledIx[] =\n msg.compiledInstructions.map((instruction) => {\n const ixWithAccounts = instruction as typeof instruction & {\n accounts?: number[];\n };\n\n const accountKeyIndexes = Array.from(\n ixWithAccounts.accounts ?? instruction.accountKeyIndexes ?? [],\n ) as number[];\n\n let data: Uint8Array;\n if (instruction.data instanceof Uint8Array) {\n data = instruction.data;\n } else if (typeof instruction.data === \"string\") {\n data = Buffer.from(instruction.data, \"base64\"); // v0 encodes instruction data as base64\n } else {\n data = Uint8Array.from(instruction.data ?? []);\n }\n\n return {\n programIdIndex: instruction.programIdIndex,\n accountKeyIndexes,\n data,\n };\n });\n\n return { compiledInstructions, allKeys };\n }\n\n // legacy (no ALTs)\n const legacy = Transaction.from(rawBytes);\n\n const allKeyMap = new Map<string, PublicKey>();\n\n const add = (pubkey?: PublicKey | null) => {\n if (!pubkey) return;\n const key = pubkey.toBase58();\n if (!allKeyMap.has(key)) allKeyMap.set(key, pubkey);\n };\n\n add(legacy.feePayer ?? null);\n\n for (const instruction of legacy.instructions) {\n add(instruction.programId);\n for (const key of instruction.keys) add(key.pubkey);\n }\n\n const allKeys = Array.from(allKeyMap.values());\n const indexByB58 = new Map(allKeys.map((pk, i) => [pk.toBase58(), i]));\n\n const compiledInstructions: NormalizedCompiledIx[] =\n legacy.instructions.map((instruction) => ({\n programIdIndex: indexByB58.get(instruction.programId.toBase58()) ?? -1,\n accountKeyIndexes: instruction.keys.map(\n (key) => indexByB58.get(key.pubkey.toBase58()) ?? -1,\n ),\n data: instruction.data,\n }));\n\n return { compiledInstructions, allKeys };\n }\n\n private static tryDeserialiseVersioned(\n rawBytes: Uint8Array,\n ): VersionedTransaction | null {\n try {\n return VersionedTransaction.deserialize(rawBytes);\n } catch {\n try {\n const msg = VersionedMessage.deserialize(rawBytes);\n return { message: msg } as VersionedTransaction;\n } catch {\n return null;\n }\n }\n }\n\n /**\n * For v0, fetch looked-up addresses from ALT(s) via the connection\n */\n private static async resolveLookedUpAddressesFromMessage(\n msg: VersionedMessage,\n rpcURL: string,\n ): Promise<LoadedAddresses | undefined> {\n const lookups = msg.addressTableLookups ?? [];\n if (!lookups.length) return;\n\n const writable: PublicKey[] = [];\n const readonly: PublicKey[] = [];\n\n for (const lu of lookups) {\n const res = await defaultConnection(rpcURL).getAddressLookupTable(\n lu.accountKey,\n );\n const table = res.value;\n if (!table) continue;\n const addrs = table.state.addresses;\n\n for (const i of lu.writableIndexes ?? []) {\n const pk = addrs[i];\n if (pk) writable.push(pk);\n }\n for (const i of lu.readonlyIndexes ?? []) {\n const pk = addrs[i];\n if (pk) readonly.push(pk);\n }\n }\n\n return { writable, readonly };\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["ASSOCIATED_TOKEN_PROGRAM_ID", "TOKEN_2022_PROGRAM_ID", "TOKEN_PROGRAM_ID", "Connection", "Transaction", "TransactionInstruction", "VersionedMessage", "VersionedTransaction", "Buffer", "DECODERS", "SolanaTransactionTypes", "DEFAULT_RPC_URL", "defaultConnection", "rpcUrl", "isSPLProgramId", "pid", "TransactionInspector", "injectedRPCURL", "rawTransactionBytes", "tokenAddress", "createATA", "message", "instruction", "sawSPL", "best", "ixMeta", "programId", "resolvedKeys", "k", "pk", "ctx", "decoder", "data", "rawBytes", "rpcURL", "versionedTX", "msg", "lookedUp", "allKeys", "ixWithAccounts", "accountKeyIndexes", "legacy", "allKeyMap", "add", "pubkey", "key", "indexByB58", "i", "lookups", "writable", "readonly", "lu", "table", "addrs"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{createInitializeAccountInstruction as b,createTransferCheckedInstruction as A,createTransferInstruction as f,TOKEN_PROGRAM_ID as u}from"@solana/spl-token";import{Keypair as a,SystemProgram as g,Transaction as y}from"@solana/web3.js";import m from"bs58";import{describe as K,expect as o,it as i}from"vitest";import{SolanaTransactionTypes as p,TransactionInspector as l}from"./TransactionInspector";const d=m.encode(new Uint8Array(32).fill(1));K("TransactionInspector",()=>{i("falls back to STANDARD for a plain SystemProgram transfer",()=>{const e=a.generate(),s=a.generate().publicKey,n=new y().add(g.transfer({fromPubkey:e.publicKey,toPubkey:s,lamports:1e3}));n.recentBlockhash=d,n.feePayer=e.publicKey,n.sign(e);const c=n.serialize(),t=new l(c).inspectTransactionType();o(t.transactionType).toBe(p.STANDARD),o(t.data).toEqual({})}),i("detects an SPL Transfer and returns the destination address",()=>{const e=a.generate(),s=a.generate().publicKey,n=a.generate().publicKey,c=e.publicKey,t=new y().add(f(s,n,c,42n,[],u));t.recentBlockhash=d,t.feePayer=e.publicKey,t.sign(e);const r=new l(t.serialize()).inspectTransactionType();o(r.transactionType).toBe(p.SPL),o(r.data.tokenAddress).toBe(n.toBase58())}),i("detects an SPL TransferChecked and returns the destination address",()=>{const e=a.generate(),s=a.generate().publicKey,n=a.generate().publicKey,c=a.generate().publicKey,t=e.publicKey,r=new y().add(A(n,s,c,t,123n,0,[],u));r.recentBlockhash=d,r.feePayer=e.publicKey,r.sign(e);const T=new l(r.serialize()).inspectTransactionType();o(T.transactionType).toBe(p.SPL),o(T.data.tokenAddress).toBe(c.toBase58())}),i("detects an SPL InitializeAccount and returns the new ATA and mint",()=>{const e=a.generate(),s=a.generate().publicKey,n=a.generate().publicKey,c=e.publicKey,t=new y().add(b(n,s,c,u));t.recentBlockhash=d,t.feePayer=e.publicKey,t.sign(e);const r=new l(t.serialize()).inspectTransactionType();o(r.transactionType).toBe(p.SPL),o(r.data.createATA).toEqual({address:n.toBase58(),mintAddress:s.toBase58()})}),i("falls back to STANDARD if the payload is unparseable",()=>{const e=new Uint8Array([0,1,2,3,4,5]),s=new l(e).inspectTransactionType();o(s.transactionType).toBe(p.STANDARD),o(s.data).toEqual({})})});
1
+ import{ASSOCIATED_TOKEN_PROGRAM_ID as A,createAssociatedTokenAccountInstruction as w,createCloseAccountInstruction as m,createInitializeAccount2Instruction as S,createInitializeAccount3Instruction as f,createInitializeAccountInstruction as P,createSyncNativeInstruction as k,createTransferCheckedInstruction as I,createTransferInstruction as g,getAssociatedTokenAddressSync as b,TOKEN_2022_PROGRAM_ID as B,TOKEN_PROGRAM_ID as l}from"@solana/spl-token";import{Keypair as t,SystemProgram as L,Transaction as h,TransactionInstruction as E}from"@solana/web3.js";import{describe as v,expect as r,it as u}from"vitest";import{DefaultBs58Encoder as D}from"../../app-binder/services/bs58Encoder";import{SolanaTransactionTypes as d,TransactionInspector as p}from"./TransactionInspector";const O=D.encode(new Uint8Array(32).fill(170));function y(e,n,a){const s=a??n[0]??t.generate(),c=new h;c.recentBlockhash=O,c.feePayer=s.publicKey,c.add(...e);const o=new Set,i=[s,...n].filter(T=>{const K=T.publicKey.toBase58();return o.has(K)?!1:(o.add(K),!0)});return c.sign(...i),{raw:c.serialize(),payer:s}}v("TransactionInspector",()=>{u("falls back to STANDARD for a plain SystemProgram transfer",async()=>{const e=t.generate(),n=t.generate().publicKey,a=L.transfer({fromPubkey:e.publicKey,toPubkey:n,lamports:1e3}),{raw:s}=y([a],[e],e),c=await new p().inspectTransactionType(s);r(c.transactionType).toBe(d.STANDARD),r(c.data).toEqual({})}),u("detects an SPL Transfer and returns the destination address",async()=>{const e=t.generate(),n=t.generate().publicKey,a=t.generate().publicKey,s=g(n,a,e.publicKey,42n,[],l),{raw:c}=y([s],[e],e),o=await new p().inspectTransactionType(c);r(o.transactionType).toBe(d.SPL),r(o.data.tokenAddress).toBe(a.toBase58())}),u("detects an SPL TransferChecked and returns the destination address",async()=>{const e=t.generate(),n=t.generate().publicKey,a=t.generate().publicKey,s=t.generate().publicKey,c=I(a,n,s,e.publicKey,123n,0,[],l),{raw:o}=y([c],[e],e),i=await new p().inspectTransactionType(o);r(i.transactionType).toBe(d.SPL),r(i.data.tokenAddress).toBe(s.toBase58())}),u("detects InitializeAccount and returns the new account and mint",async()=>{const e=t.generate(),n=t.generate().publicKey,a=t.generate().publicKey,s=t.generate().publicKey,c=P(a,n,s,l),{raw:o}=y([c],[e],e),i=await new p().inspectTransactionType(o);r(i.transactionType).toBe(d.SPL),r(i.data.createATA).toEqual({address:a.toBase58(),mintAddress:n.toBase58()})}),u("detects InitializeAccount2 and returns the new account and mint",async()=>{const e=t.generate(),n=t.generate().publicKey,a=t.generate().publicKey,s=t.generate().publicKey,c=S(a,n,s,l),{raw:o}=y([c],[e],e),i=await new p().inspectTransactionType(o);r(i.transactionType).toBe(d.SPL),r(i.data.createATA).toEqual({address:a.toBase58(),mintAddress:n.toBase58()})}),u("detects InitializeAccount3 and returns the new account and mint",async()=>{const e=t.generate(),n=t.generate().publicKey,a=t.generate().publicKey,s=f(a,n,l),{raw:c}=y([s],[e],e),o=await new p().inspectTransactionType(c);r(o.transactionType).toBe(d.SPL),r(o.data.createATA).toEqual({address:a.toBase58(),mintAddress:n.toBase58()})}),u("detects ATA creation via Associated Token Program (classic TOKEN program)",async()=>{const e=t.generate(),n=t.generate().publicKey,a=t.generate().publicKey,s=b(a,n,!0,l,A),c=w(e.publicKey,s,n,a,l,A),{raw:o}=y([c],[e],e),i=await new p().inspectTransactionType(o);r(i.transactionType).toBe(d.SPL),r(i.data.createATA).toEqual({address:n.toBase58(),mintAddress:a.toBase58()})}),u("detects ATA creation via Associated Token Program (TOKEN-2022 program)",async()=>{const e=t.generate(),n=t.generate().publicKey,a=t.generate().publicKey,s=b(a,n,!0,B,A),c=w(e.publicKey,s,n,a,B,A),{raw:o}=y([c],[e],e),i=await new p().inspectTransactionType(o);r(i.transactionType).toBe(d.SPL),r(i.data.createATA).toEqual({address:n.toBase58(),mintAddress:a.toBase58()})}),u("detects CloseAccount and returns the closed token account",async()=>{const e=t.generate(),n=t.generate().publicKey,a=t.generate().publicKey,s=m(n,a,e.publicKey),{raw:c}=y([s],[e],e),o=await new p().inspectTransactionType(c);r(o.transactionType).toBe(d.SPL),r(o.data.tokenAddress).toBe(n.toBase58())}),u("detects SyncNative and returns the WSOL account",async()=>{const e=t.generate(),n=t.generate().publicKey,a=k(n,l),{raw:s}=y([a],[e],e),c=await new p().inspectTransactionType(s);r(c.transactionType).toBe(d.SPL),r(c.data.tokenAddress).toBe(n.toBase58())}),u("marks transaction as SPL even if decoders can't parse (last-resort SPL by program id)",async()=>{const e=t.generate(),n=new E({programId:l,keys:[],data:Buffer.from([])}),{raw:a}=y([n],[e],e),s=await new p().inspectTransactionType(a);r(s.transactionType).toBe(d.SPL),r(s.data).toEqual({})}),u("falls back to STANDARD if the payload is unparseable",async()=>{const e=new Uint8Array([171,173,190,239]),n=await new p().inspectTransactionType(e);r(n.transactionType).toBe(d.STANDARD),r(n.data).toEqual({})}),u("fast path: tokenAddress override + SPL instruction, SPL and returns override",async()=>{const e=t.generate(),n=t.generate().publicKey,a=t.generate().publicKey,s=g(n,a,e.publicKey,1n,[],l),{raw:c}=y([s],[e],e),o=t.generate().publicKey.toBase58(),i=await new p().inspectTransactionType(c,o);r(i.transactionType).toBe(d.SPL),r(i.data.tokenAddress).toBe(o)}),u("fast path: createATA override + ATA instruction, SPL and returns override",async()=>{const e=t.generate(),n=t.generate().publicKey,a=t.generate().publicKey,s=b(a,n,!0,l,A),c=w(e.publicKey,s,n,a,l,A),{raw:o}=y([c],[e],e),i={address:t.generate().publicKey.toBase58(),mintAddress:t.generate().publicKey.toBase58()},T=await new p().inspectTransactionType(o,void 0,i);r(T.transactionType).toBe(d.SPL),r(T.data.createATA).toEqual(i)}),u("fast path: both overrides + SPL instruction, SPL and returns both",async()=>{const e=t.generate(),n=t.generate().publicKey,a=t.generate().publicKey,s=g(n,a,e.publicKey,7n,[],l),{raw:c}=y([s],[e],e),o=t.generate().publicKey.toBase58(),i={address:t.generate().publicKey.toBase58(),mintAddress:t.generate().publicKey.toBase58()},T=await new p().inspectTransactionType(c,o,i);r(T.transactionType).toBe(d.SPL),r(T.data.tokenAddress).toBe(o),r(T.data.createATA).toEqual(i)})});
2
2
  //# sourceMappingURL=TransactionInspector.test.js.map