@ledgerhq/device-signer-kit-solana 1.4.1 → 1.5.1

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 (95) hide show
  1. package/README.md +3 -0
  2. package/lib/cjs/api/app-binder/SignTransactionDeviceActionTypes.js +1 -1
  3. package/lib/cjs/api/app-binder/SignTransactionDeviceActionTypes.js.map +3 -3
  4. package/lib/cjs/api/model/TransactionResolutionContext.js +1 -1
  5. package/lib/cjs/api/model/TransactionResolutionContext.js.map +1 -1
  6. package/lib/cjs/internal/DefaultSignerSolana.js.map +2 -2
  7. package/lib/cjs/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.js +2 -0
  8. package/lib/cjs/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.js.map +7 -0
  9. package/lib/cjs/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.test.js +2 -0
  10. package/lib/cjs/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.test.js.map +7 -0
  11. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.js +1 -1
  12. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.js.map +3 -3
  13. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.test.js +1 -1
  14. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.test.js.map +3 -3
  15. package/lib/cjs/internal/app-binder/services/TransactionInspector.js +1 -1
  16. package/lib/cjs/internal/app-binder/services/TransactionInspector.js.map +3 -3
  17. package/lib/cjs/internal/app-binder/services/TransactionInspector.test.js +1 -1
  18. package/lib/cjs/internal/app-binder/services/TransactionInspector.test.js.map +2 -2
  19. package/lib/cjs/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.js +2 -0
  20. package/lib/cjs/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.js.map +7 -0
  21. package/lib/cjs/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.test.js +2 -0
  22. package/lib/cjs/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.test.js.map +7 -0
  23. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.js +1 -1
  24. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.js.map +2 -2
  25. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.test.js +1 -1
  26. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.test.js.map +3 -3
  27. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.js +1 -1
  28. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.js.map +3 -3
  29. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.test.js +1 -1
  30. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.test.js.map +3 -3
  31. package/lib/cjs/package.json +44 -40
  32. package/lib/esm/api/app-binder/SignTransactionDeviceActionTypes.js +1 -0
  33. package/lib/esm/api/app-binder/SignTransactionDeviceActionTypes.js.map +4 -4
  34. package/lib/esm/internal/DefaultSignerSolana.js.map +2 -2
  35. package/lib/esm/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.js +2 -0
  36. package/lib/esm/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.js.map +7 -0
  37. package/lib/esm/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.test.js +2 -0
  38. package/lib/esm/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.test.js.map +7 -0
  39. package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.js +1 -1
  40. package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.js.map +3 -3
  41. package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.test.js +1 -1
  42. package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.test.js.map +3 -3
  43. package/lib/esm/internal/app-binder/services/TransactionInspector.js +1 -1
  44. package/lib/esm/internal/app-binder/services/TransactionInspector.js.map +3 -3
  45. package/lib/esm/internal/app-binder/services/TransactionInspector.test.js +1 -1
  46. package/lib/esm/internal/app-binder/services/TransactionInspector.test.js.map +2 -2
  47. package/lib/esm/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.js +2 -0
  48. package/lib/esm/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.js.map +7 -0
  49. package/lib/esm/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.test.js +2 -0
  50. package/lib/esm/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.test.js.map +7 -0
  51. package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.js +1 -1
  52. package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.js.map +2 -2
  53. package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.test.js +1 -1
  54. package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.test.js.map +3 -3
  55. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.js +1 -1
  56. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.js.map +3 -3
  57. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.test.js +1 -1
  58. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.test.js.map +3 -3
  59. package/lib/esm/package.json +44 -40
  60. package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts +10 -0
  61. package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts.map +1 -1
  62. package/lib/types/api/model/TransactionResolutionContext.d.ts +2 -0
  63. package/lib/types/api/model/TransactionResolutionContext.d.ts.map +1 -1
  64. package/lib/types/internal/DefaultSignerSolana.d.ts +3 -0
  65. package/lib/types/internal/DefaultSignerSolana.d.ts.map +1 -1
  66. package/lib/types/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.d.ts +29 -0
  67. package/lib/types/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.d.ts.map +1 -0
  68. package/lib/types/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.test.d.ts +2 -0
  69. package/lib/types/internal/app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand.test.d.ts.map +1 -0
  70. package/lib/types/internal/app-binder/device-action/SignTransactionDeviceAction.d.ts +2 -2
  71. package/lib/types/internal/app-binder/device-action/SignTransactionDeviceAction.d.ts.map +1 -1
  72. package/lib/types/internal/app-binder/services/TransactionInspector.d.ts +7 -10
  73. package/lib/types/internal/app-binder/services/TransactionInspector.d.ts.map +1 -1
  74. package/lib/types/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.d.ts +8 -0
  75. package/lib/types/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.d.ts.map +1 -0
  76. package/lib/types/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.test.d.ts +2 -0
  77. package/lib/types/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.test.d.ts.map +1 -0
  78. package/lib/types/internal/app-binder/task/BuildTransactionContextTask.d.ts +4 -9
  79. package/lib/types/internal/app-binder/task/BuildTransactionContextTask.d.ts.map +1 -1
  80. package/lib/types/internal/app-binder/task/ProvideTransactionContextTask.d.ts +9 -5
  81. package/lib/types/internal/app-binder/task/ProvideTransactionContextTask.d.ts.map +1 -1
  82. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  83. package/package.json +38 -34
  84. package/lib/cjs/internal/app-binder/command/ProvideTrustedNamePKICommand.js +0 -2
  85. package/lib/cjs/internal/app-binder/command/ProvideTrustedNamePKICommand.js.map +0 -7
  86. package/lib/cjs/internal/app-binder/command/ProvideTrustedNamePKICommand.test.js +0 -2
  87. package/lib/cjs/internal/app-binder/command/ProvideTrustedNamePKICommand.test.js.map +0 -7
  88. package/lib/esm/internal/app-binder/command/ProvideTrustedNamePKICommand.js +0 -2
  89. package/lib/esm/internal/app-binder/command/ProvideTrustedNamePKICommand.js.map +0 -7
  90. package/lib/esm/internal/app-binder/command/ProvideTrustedNamePKICommand.test.js +0 -2
  91. package/lib/esm/internal/app-binder/command/ProvideTrustedNamePKICommand.test.js.map +0 -7
  92. package/lib/types/internal/app-binder/command/ProvideTrustedNamePKICommand.d.ts +0 -14
  93. package/lib/types/internal/app-binder/command/ProvideTrustedNamePKICommand.d.ts.map +0 -1
  94. package/lib/types/internal/app-binder/command/ProvideTrustedNamePKICommand.test.d.ts +0 -2
  95. package/lib/types/internal/app-binder/command/ProvideTrustedNamePKICommand.test.d.ts.map +0 -1
@@ -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 { type TransactionResolutionContext } from \"@api/model/TransactionResolutionContext\";\nimport { GetAppConfigurationCommand } from \"@internal/app-binder/command/GetAppConfigurationCommand\";\nimport { SignTransactionCommand } from \"@internal/app-binder/command/SignTransactionCommand\";\nimport { type SolanaAppErrorCodes } from \"@internal/app-binder/command/utils/SolanaApplicationErrors\";\nimport { ApplicationChecker } from \"@internal/app-binder/services/ApplicationChecker\";\nimport {\n SolanaTransactionTypes,\n TransactionInspector,\n} from \"@internal/app-binder/services/TransactionInspector\";\nimport { type TxInspectorResult } from \"@internal/app-binder/services/TransactionInspector\";\nimport {\n BuildTransactionContextTask,\n type BuildTransactionContextTaskArgs,\n type SolanaBuildContextResult,\n} from \"@internal/app-binder/task/BuildTransactionContextTask\";\nimport {\n ProvideSolanaTransactionContextTask,\n type SolanaContextForDevice,\n} from \"@internal/app-binder/task/ProvideTransactionContextTask\";\nimport { SignDataTask } from \"@internal/app-binder/task/SendSignDataTask\";\n\nexport type MachineDependencies = {\n readonly getAppConfig: () => Promise<\n CommandResult<AppConfiguration, SolanaAppErrorCodes>\n >;\n readonly buildContext: (arg0: {\n input: BuildTransactionContextTaskArgs;\n }) => Promise<SolanaBuildContextResult>;\n readonly provideContext: (arg0: {\n input: SolanaContextForDevice;\n }) => Promise<Maybe<CommandErrorResult<SolanaAppErrorCodes>>>;\n readonly inspectTransaction: (arg0: {\n serializedTransaction: Uint8Array;\n resolutionContext?: TransactionResolutionContext;\n rpcUrl?: string;\n }) => Promise<TxInspectorResult>;\n readonly signTransaction: (arg0: {\n input: {\n derivationPath: string;\n serializedTransaction: Uint8Array;\n };\n }) => Promise<\n CommandResult<Maybe<Signature | SolanaAppErrorCodes>, SolanaAppErrorCodes>\n >;\n};\n\nexport class SignTransactionDeviceAction extends XStateDeviceAction<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n> {\n makeStateMachine(\n internalApi: InternalApi,\n ): DeviceActionStateMachine<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n > {\n type types = StateMachineTypes<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n >;\n\n const {\n signTransaction,\n getAppConfig,\n buildContext,\n provideContext,\n inspectTransaction,\n } = this.extractDependencies(internalApi);\n\n return setup({\n types: {\n input: {} as types[\"input\"],\n context: {} as types[\"context\"],\n output: {} as types[\"output\"],\n },\n actors: {\n openAppStateMachine: new OpenAppDeviceAction({\n input: { appName: \"Solana\" },\n }).makeStateMachine(internalApi),\n\n getAppConfig: fromPromise(getAppConfig),\n inspectTransaction: fromPromise(\n ({\n input,\n }: {\n input: {\n serializedTransaction: Uint8Array;\n resolutionContext?: TransactionResolutionContext;\n rpcUrl?: string;\n };\n }) =>\n inspectTransaction({\n serializedTransaction: input.serializedTransaction,\n resolutionContext: input.resolutionContext,\n rpcUrl: input.rpcUrl,\n }),\n ),\n buildContext: fromPromise(buildContext),\n provideContext: fromPromise(provideContext),\n signTransaction: fromPromise(signTransaction),\n },\n guards: {\n noInternalError: ({ context }) => context._internalState.error === null,\n skipOpenApp: ({ context }) =>\n context.input.transactionOptions?.skipOpenApp || false,\n isSPLSupported: ({ context }) =>\n new ApplicationChecker(\n internalApi.getDeviceSessionState(),\n context._internalState.appConfig!,\n )\n .withMinVersionExclusive(\"1.4.0\")\n .excludeDeviceModel(DeviceModelId.NANO_S)\n .check(),\n isAnSPLTransaction: ({ context }) =>\n context._internalState.inspectorResult?.transactionType ===\n SolanaTransactionTypes.SPL,\n shouldSkipInspection: ({ context }) =>\n context._internalState.error === null &&\n !!context.input.transactionOptions?.transactionResolutionContext,\n },\n actions: {\n assignErrorFromEvent: assign({\n _internalState: (_) => ({\n ..._.context._internalState,\n error: new UnknownDAError(\n _.event[\"error\"] instanceof Error\n ? _.event[\"error\"].message\n : String(_.event[\"error\"]),\n ),\n }),\n }),\n },\n }).createMachine({\n /** @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 },\n _internalState: {\n error: null,\n signature: null,\n appConfig: null,\n solanaTransactionContext: null,\n inspectorResult: null,\n },\n }),\n states: {\n InitialState: {\n always: [\n { target: \"GetAppConfig\", guard: \"skipOpenApp\" },\n { target: \"OpenAppDeviceAction\" },\n ],\n },\n OpenAppDeviceAction: {\n exit: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n invoke: {\n id: \"openAppStateMachine\",\n src: \"openAppStateMachine\",\n input: () => ({ appName: \"Solana\" }),\n onSnapshot: {\n actions: assign({\n intermediateValue: ({ event }) =>\n event.snapshot.context.intermediateValue,\n }),\n },\n onDone: {\n target: \"CheckOpenAppDeviceActionResult\",\n actions: assign({\n _internalState: ({ event, context }) =>\n event.output.caseOf({\n Right: () => context._internalState,\n Left: (error) => ({\n ...context._internalState,\n error,\n }),\n }),\n }),\n },\n },\n },\n CheckOpenAppDeviceActionResult: {\n always: [\n { target: \"GetAppConfig\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n GetAppConfig: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n invoke: {\n id: \"getAppConfig\",\n src: \"getAppConfig\",\n onDone: {\n target: \"GetAppConfigResultCheck\",\n actions: assign({\n _internalState: ({ event, context }) =>\n isSuccessCommandResult(event.output)\n ? {\n ...context._internalState,\n appConfig: event.output.data,\n }\n : { ...context._internalState, error: event.output.error },\n }),\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n GetAppConfigResultCheck: {\n always: [\n { target: \"InspectTransaction\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n InspectTransaction: {\n invoke: {\n id: \"inspectTransaction\",\n src: \"inspectTransaction\",\n\n input: ({ context }) => ({\n serializedTransaction: context.input.transaction,\n resolutionContext:\n context.input.transactionOptions?.transactionResolutionContext,\n rpcUrl: context.input.transactionOptions?.solanaRPCURL,\n }),\n onDone: {\n target: \"AfterInspect\",\n actions: assign({\n _internalState: ({ context, event }) => ({\n ...context._internalState,\n inspectorResult: event.output,\n }),\n }),\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n AfterInspect: {\n always: [\n { target: \"BuildContext\", guard: \"isAnSPLTransaction\" },\n { target: \"SignTransaction\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n BuildContext: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n invoke: {\n id: \"buildContext\",\n src: \"buildContext\",\n input: ({ context }) => {\n const inspectorData =\n context._internalState.inspectorResult?.data;\n return {\n contextModule: context.input.contextModule,\n options: {\n tokenAddress: inspectorData?.tokenAddress,\n createATA: inspectorData?.createATA,\n },\n };\n },\n onDone: {\n target: \"ProvideContext\",\n actions: [\n assign({\n _internalState: ({ event, context }) => ({\n ...context._internalState,\n solanaTransactionContext: {\n descriptor: event.output.descriptor,\n certificate: event.output.calCertificate,\n tokenAccount: event.output.addressResult.tokenAccount,\n owner: event.output.addressResult.owner,\n contract: event.output.addressResult.contract,\n },\n }),\n }),\n ],\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n ProvideContext: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n invoke: {\n id: \"provideContext\",\n src: \"provideContext\",\n input: ({ context }) => {\n if (!context._internalState.solanaTransactionContext) {\n throw new UnknownDAError(\n \"Solana transaction context is not available\",\n );\n }\n return context._internalState.solanaTransactionContext;\n },\n onDone: {\n target: \"ProvideContextResultCheck\",\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n ProvideContextResultCheck: {\n always: [\n { target: \"SignTransaction\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n SignTransaction: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n },\n }),\n exit: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n }),\n invoke: {\n id: \"signTransaction\",\n src: \"signTransaction\",\n input: ({ context }) => {\n return {\n derivationPath: context.input.derivationPath,\n serializedTransaction: context.input.transaction,\n };\n },\n onDone: {\n target: \"SignTransactionResultCheck\",\n actions: [\n assign({\n _internalState: ({ event, context }) => {\n if (!isSuccessCommandResult(event.output))\n return {\n ...context._internalState,\n error: event.output.error,\n };\n\n const data = event.output.data.extract();\n if (\n event.output.data.isJust() &&\n data instanceof Uint8Array\n )\n return {\n ...context._internalState,\n signature: data,\n };\n\n return {\n ...context._internalState,\n error: new UnknownDAError(\"No Signature available\"),\n };\n },\n }),\n ],\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n SignTransactionResultCheck: {\n always: [\n { guard: \"noInternalError\", target: \"Success\" },\n { target: \"Error\" },\n ],\n },\n Success: { type: \"final\" },\n Error: { type: \"final\" },\n },\n output: ({ context }) =>\n context._internalState.signature\n ? Right(context._internalState.signature)\n : Left(\n context._internalState.error ||\n new UnknownDAError(`No error or signature available`),\n ),\n });\n }\n\n extractDependencies(internalApi: InternalApi): MachineDependencies {\n const getAppConfig = async () =>\n internalApi.sendCommand(new GetAppConfigurationCommand());\n\n const buildContext = async (arg0: {\n input: BuildTransactionContextTaskArgs;\n }) => new BuildTransactionContextTask(internalApi, arg0.input).run();\n\n const provideContext = async (arg0: { input: SolanaContextForDevice }) =>\n new ProvideSolanaTransactionContextTask(internalApi, arg0.input).run();\n\n const inspectTransaction = async (arg0: {\n serializedTransaction: Uint8Array;\n resolutionContext?: TransactionResolutionContext;\n rpcUrl?: string;\n }) =>\n Promise.resolve(\n new TransactionInspector(\n arg0.serializedTransaction,\n arg0.resolutionContext?.tokenAddress,\n arg0.resolutionContext?.createATA,\n arg0.rpcUrl,\n ).inspectTransactionType(),\n );\n\n const signTransaction = async (arg0: {\n input: {\n derivationPath: string;\n serializedTransaction: Uint8Array;\n };\n }) =>\n new SignDataTask(internalApi, {\n commandFactory: (args) =>\n new SignTransactionCommand({\n serializedTransaction: args.chunkedData,\n more: args.more,\n extend: args.extend,\n }),\n derivationPath: arg0.input.derivationPath,\n sendingData: arg0.input.serializedTransaction,\n }).run();\n\n return {\n getAppConfig,\n buildContext,\n provideContext,\n signTransaction,\n inspectTransaction,\n };\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["DeviceModelId", "isSuccessCommandResult", "OpenAppDeviceAction", "UnknownDAError", "UserInteractionRequired", "XStateDeviceAction", "Left", "Right", "assign", "fromPromise", "setup", "GetAppConfigurationCommand", "SignTransactionCommand", "ApplicationChecker", "SolanaTransactionTypes", "TransactionInspector", "BuildTransactionContextTask", "ProvideSolanaTransactionContextTask", "SignDataTask", "SignTransactionDeviceAction", "internalApi", "signTransaction", "getAppConfig", "buildContext", "provideContext", "inspectTransaction", "input", "context", "_", "event", "error", "inspectorData", "data", "arg0", "args"]
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 { type TransactionResolutionContext } from \"@api/model/TransactionResolutionContext\";\nimport { GetAppConfigurationCommand } from \"@internal/app-binder/command/GetAppConfigurationCommand\";\nimport { SignTransactionCommand } from \"@internal/app-binder/command/SignTransactionCommand\";\nimport { type SolanaAppErrorCodes } from \"@internal/app-binder/command/utils/SolanaApplicationErrors\";\nimport { ApplicationChecker } from \"@internal/app-binder/services/ApplicationChecker\";\nimport {\n SolanaTransactionTypes,\n TransactionInspector,\n} from \"@internal/app-binder/services/TransactionInspector\";\nimport { type TxInspectorResult } from \"@internal/app-binder/services/TransactionInspector\";\nimport {\n BuildTransactionContextTask,\n type BuildTransactionContextTaskArgs,\n type SolanaBuildContextResult,\n} from \"@internal/app-binder/task/BuildTransactionContextTask\";\nimport {\n ProvideSolanaTransactionContextTask,\n type 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 };\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 };\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", "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 w,describe as P,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()};let r,u,d,A,S,l;function R(){return{getAppConfig:u,buildContext:d,provideContext:A,signTransaction:S,inspectTransaction:l}}P("SignTransactionDeviceAction (Solana)",()=>{w(()=>{r=E(),u=n.fn(),d=n.fn(),A=n.fn(),S=n.fn(),l=n.fn().mockResolvedValue({transactionType:m.SPL,data:{tokenAddress:null,createATA:!1}})}),D("happy path (skip open): getAppConfig -> inspect -> build -> provide -> sign",()=>new Promise((s,c)=>{r.getDeviceSessionState.mockReturnValue({sessionStateType:v.ReadyWithoutSecureChannel,deviceStatus:y.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:g.NANO_X,isSecureConnectionAllowed:!0}),u.mockResolvedValue(o({data:{}})),l.mockResolvedValue({transactionType:m.SPL});const a={descriptor:new Uint8Array([1]),calCertificate:{keyUsageNumber:0,payload:new Uint8Array([1])},challenge:void 0,addressResult:{tokenAccount:"",owner:"",contract:""}};d.mockResolvedValue(a),A.mockResolvedValue(N);const i=new Uint8Array([170,187]);S.mockResolvedValue(o({data:T(i)}));const p=new k({input:{derivationPath:V,transaction:x,transactionOptions:{skipOpenApp:!0},contextModule:I}});n.spyOn(p,"extractDependencies").mockReturnValue(R());const U=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.SignTransaction},status:e.Pending},{output:i,status:e.Completed}];f(p,U,r,{onDone:s,onError:c})})),D("failure in provideContext still signs",()=>new Promise((s,c)=>{r.getDeviceSessionState.mockReturnValue({sessionStateType:v.ReadyWithoutSecureChannel,deviceStatus:y.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:g.NANO_X,isSecureConnectionAllowed:!0}),u.mockResolvedValue(o({data:{}})),l.mockResolvedValue({transactionType:m.SPL}),d.mockResolvedValue({descriptor:new Uint8Array([2]),calCertificate:{keyUsageNumber:0,payload:new Uint8Array},challenge:void 0,addressResult:{tokenAccount:"",owner:"",contract:""}}),A.mockResolvedValue(T(o({error:new C("ctxErr")})));const a=new Uint8Array([254]);S.mockResolvedValue(o({data:T(a)}));const i=new k({input:{derivationPath:V,transaction:x,transactionOptions:{skipOpenApp:!0},contextModule:I}});n.spyOn(i,"extractDependencies").mockReturnValue(R());const p=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.SignTransaction},status:e.Pending},{output:a,status:e.Completed}];f(i,p,r,{onDone:s,onError:c})})),D("buildContext throws \u2192 error",()=>new Promise((s,c)=>{r.getDeviceSessionState.mockReturnValue({sessionStateType:v.ReadyWithoutSecureChannel,deviceStatus:y.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:g.NANO_X,isSecureConnectionAllowed:!0}),u.mockResolvedValue(o({data:{}})),l.mockResolvedValue({transactionType:m.SPL}),d.mockRejectedValue(new C("bldErr"));const a=new k({input:{derivationPath:V,transaction:x,transactionOptions:{skipOpenApp:!0},contextModule:I}});n.spyOn(a,"extractDependencies").mockReturnValue(R());const i=[{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.None},status:e.Pending},{error:expect.anything(),status:e.Error}];f(a,i,r,{onDone:s,onError:c})}))});
1
+ import{CommandResultFactory as s,DeviceActionStatus as e,DeviceModelId as g,DeviceSessionStateType as N,DeviceStatus as I,InvalidStatusWordError as x,UserInteractionRequired as t}from"@ledgerhq/device-management-kit";import{Just as v,Nothing as E}from"purify-ts";import{beforeEach as O,describe as U,it as D,vi as a}from"vitest";import{signTransactionDAStateSteps as n}from"../../../api/app-binder/SignTransactionDeviceActionTypes";import{testDeviceActionStates as y}from"../../app-binder/device-action/__test-utils__/testDeviceActionStates";import{SolanaTransactionTypes as T}from"../../app-binder/services/TransactionInspector";import{makeDeviceActionInternalApiMock as _}from"./__test-utils__/makeInternalApi";import{SignTransactionDeviceAction as C}from"./SignTransactionDeviceAction";const R="44'/501'/0'/0'",V=new Uint8Array([222,173,190,239]),f={getSolanaContext:a.fn()};let o,d,p,S,m,l;function k(){return{getAppConfig:d,buildContext:p,provideContext:S,signTransaction:m,inspectTransaction:l}}U("SignTransactionDeviceAction (Solana)",()=>{O(()=>{o=_(),d=a.fn(),p=a.fn(),S=a.fn(),m=a.fn(),l=a.fn().mockResolvedValue({transactionType:T.SPL,data:{tokenAddress:null,createATA:!1}})}),D("happy path (skip open): getAppConfig -> inspect -> build -> provide -> sign",()=>new Promise((c,u)=>{o.getDeviceSessionState.mockReturnValue({sessionStateType:N.ReadyWithoutSecureChannel,deviceStatus:I.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:g.NANO_X,isSecureConnectionAllowed:!0}),d.mockResolvedValue(s({data:{}})),l.mockResolvedValue({transactionType:T.SPL});const i={tlvDescriptor:new Uint8Array([1]),trustedNamePKICertificate:{keyUsageNumber:0,payload:new Uint8Array([1])},loadersResults:[]};p.mockResolvedValue(i),S.mockResolvedValue(E);const r=new Uint8Array([170,187]);m.mockResolvedValue(s({data:v(r)}));const A=new C({input:{derivationPath:R,transaction:V,transactionOptions:{skipOpenApp:!0},contextModule:f}});a.spyOn(A,"extractDependencies").mockReturnValue(k());const P=[{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}];y(A,P,o,{onDone:c,onError:u})})),D("failure in provideContext still signs",()=>new Promise((c,u)=>{o.getDeviceSessionState.mockReturnValue({sessionStateType:N.ReadyWithoutSecureChannel,deviceStatus:I.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:g.NANO_X,isSecureConnectionAllowed:!0}),d.mockResolvedValue(s({data:{}})),l.mockResolvedValue({transactionType:T.SPL}),p.mockResolvedValue({descriptor:new Uint8Array([2]),trustedNamePKICertificate:{keyUsageNumber:0,payload:new Uint8Array},challenge:void 0,addressResult:{tokenAccount:"",owner:"",contract:""},loadersResults:[]}),S.mockResolvedValue(v(s({error:new x("ctxErr")})));const i=new Uint8Array([254]);m.mockResolvedValue(s({data:v(i)}));const r=new C({input:{derivationPath:R,transaction:V,transactionOptions:{skipOpenApp:!0},contextModule:f}});a.spyOn(r,"extractDependencies").mockReturnValue(k());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},{intermediateValue:{requiredUserInteraction:t.None,step:n.PROVIDE_TRANSACTION_CONTEXT},status:e.Pending},{intermediateValue:{requiredUserInteraction:t.SignTransaction,step:n.SIGN_TRANSACTION},status:e.Pending},{output:i,status:e.Completed}];y(r,A,o,{onDone:c,onError:u})})),D("buildContext throws \u2192 error",()=>new Promise((c,u)=>{o.getDeviceSessionState.mockReturnValue({sessionStateType:N.ReadyWithoutSecureChannel,deviceStatus:I.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:g.NANO_X,isSecureConnectionAllowed:!0}),d.mockResolvedValue(s({data:{}})),l.mockResolvedValue({transactionType:T.SPL}),p.mockRejectedValue(new x("bldErr"));const i=new C({input:{derivationPath:R,transaction:V,transactionOptions:{skipOpenApp:!0},contextModule:f}});a.spyOn(i,"extractDependencies").mockReturnValue(k());const r=[{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}];y(i,r,o,{onDone:c,onError:u})}))});
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} 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 descriptor: new Uint8Array([1]),\n calCertificate: { keyUsageNumber: 0, payload: new Uint8Array([0x01]) },\n challenge: undefined,\n addressResult: { tokenAccount: \"\", owner: \"\", contract: \"\" },\n };\n buildContextMock.mockResolvedValue(ctx);\n provideContextMock.mockResolvedValue(Nothing);\n\n const signature = new Uint8Array([0xaa, 0xbb]);\n signMock.mockResolvedValue(\n CommandResultFactory({ data: Just(signature) }),\n );\n\n const action = new SignTransactionDeviceAction({\n input: {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n transactionOptions: { skipOpenApp: true },\n contextModule: contextModuleStub,\n } as SignTransactionDAInput,\n });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n\n const expected = [\n // getAppConfig\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // inspectTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // buildContext\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // provideContext\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // signTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n },\n status: DeviceActionStatus.Pending,\n },\n // success\n { output: signature, status: DeviceActionStatus.Completed },\n ] as DeviceActionState<\n Uint8Array,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[];\n\n testDeviceActionStates<\n Uint8Array,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >(action, expected, apiMock, { onDone: resolve, onError: reject });\n }));\n\n it(\"failure in provideContext still signs\", () =>\n new Promise<void>((resolve, reject) => {\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.1\" },\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: true,\n });\n\n getAppConfigMock.mockResolvedValue(CommandResultFactory({ data: {} }));\n inspectTransactionMock.mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n });\n\n buildContextMock.mockResolvedValue({\n descriptor: new Uint8Array([2]),\n calCertificate: { keyUsageNumber: 0, payload: new Uint8Array() },\n challenge: undefined,\n addressResult: { tokenAccount: \"\", owner: \"\", contract: \"\" },\n });\n provideContextMock.mockResolvedValue(\n Just(\n CommandResultFactory({ error: new InvalidStatusWordError(\"ctxErr\") }),\n ),\n );\n const sig = new Uint8Array([0xfe]);\n signMock.mockResolvedValue(CommandResultFactory({ data: Just(sig) }));\n\n const action = new SignTransactionDeviceAction({\n input: {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n transactionOptions: { skipOpenApp: true },\n contextModule: contextModuleStub,\n } as SignTransactionDAInput,\n });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n\n const expected = [\n // getAppConfig\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // inspectTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // buildContext\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // provideContext (returns error but continues)\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // signTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n },\n status: DeviceActionStatus.Pending,\n },\n // success\n { output: sig, status: DeviceActionStatus.Completed },\n ] as DeviceActionState<\n Uint8Array,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[];\n\n testDeviceActionStates<\n Uint8Array,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >(action, expected, apiMock, { onDone: resolve, onError: reject });\n }));\n\n it(\"buildContext throws \u2192 error\", () =>\n new Promise<void>((resolve, reject) => {\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.1\" },\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: true,\n });\n\n getAppConfigMock.mockResolvedValue(CommandResultFactory({ data: {} }));\n inspectTransactionMock.mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n });\n\n buildContextMock.mockRejectedValue(new InvalidStatusWordError(\"bldErr\"));\n\n const action = new SignTransactionDeviceAction({\n input: {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n transactionOptions: { skipOpenApp: true },\n contextModule: contextModuleStub,\n } as SignTransactionDAInput,\n });\n vi.spyOn(action, \"extractDependencies\").mockReturnValue(extractDeps());\n\n const expected = [\n // getAppConfig\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // inspectTransaction\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // buildContext (throws)\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n status: DeviceActionStatus.Pending,\n },\n // error raised from buildContext\n {\n error: expect.anything() as unknown as SignTransactionDAError,\n status: DeviceActionStatus.Error,\n },\n ] as DeviceActionState<\n Uint8Array,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >[];\n\n testDeviceActionStates<\n Uint8Array,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n >(action, expected, apiMock, { onDone: resolve, onError: reject });\n }));\n});\n"],
5
- "mappings": "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",
6
- "names": ["CommandResultFactory", "DeviceActionStatus", "DeviceModelId", "DeviceSessionStateType", "DeviceStatus", "InvalidStatusWordError", "UserInteractionRequired", "Just", "Nothing", "beforeEach", "describe", "it", "vi", "testDeviceActionStates", "SolanaTransactionTypes", "makeDeviceActionInternalApiMock", "SignTransactionDeviceAction", "defaultDerivation", "exampleTx", "contextModuleStub", "apiMock", "getAppConfigMock", "buildContextMock", "provideContextMock", "signMock", "inspectTransactionMock", "extractDeps", "resolve", "reject", "ctx", "signature", "action", "expected", "sig"]
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 { 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(\"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: [], // <-- include it\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": "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",
6
+ "names": ["CommandResultFactory", "DeviceActionStatus", "DeviceModelId", "DeviceSessionStateType", "DeviceStatus", "InvalidStatusWordError", "UserInteractionRequired", "Just", "Nothing", "beforeEach", "describe", "it", "vi", "signTransactionDAStateSteps", "testDeviceActionStates", "SolanaTransactionTypes", "makeDeviceActionInternalApiMock", "SignTransactionDeviceAction", "defaultDerivation", "exampleTx", "contextModuleStub", "apiMock", "getAppConfigMock", "buildContextMock", "provideContextMock", "signMock", "inspectTransactionMock", "extractDeps", "resolve", "reject", "ctx", "signature", "action", "expected", "sig"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{ASSOCIATED_TOKEN_PROGRAM_ID as I,TOKEN_2022_PROGRAM_ID as g,TOKEN_PROGRAM_ID as K}from"@solana/spl-token";import{Connection as b,Transaction as x,TransactionInstruction as P,VersionedMessage as k,VersionedTransaction as S}from"@solana/web3.js";import{Buffer as p}from"buffer";import{DECODERS as L}from"../../app-binder/services/utils/transactionDecoders";var h=(r=>(r.STANDARD="Standard",r.SPL="SPL",r))(h||{});const R="https://api.mainnet-beta.solana.com/",D=c=>new b(c,{commitment:"confirmed"}),m=c=>!!c&&(c.equals(I)||c.equals(K)||c.equals(g));class N{constructor(n,r,t,o){this.rawTransactionBytes=n;this.tokenAddress=r;this.createATA=t;this.injectedRPCURL=o}async inspectTransactionType(){try{const n=await this.normaliseMessage(this.rawTransactionBytes);if(this.tokenAddress||this.createATA)return{transactionType:n.compiledInstructions.some(a=>m(n.allKeys[a.programIdIndex]))?"SPL":"Standard",data:{...this.tokenAddress?{tokenAddress:this.tokenAddress}:{},...this.createATA?{createATA:this.createATA}:{}}};let r=!1,t={};for(const o of n.compiledInstructions){const a=n.allKeys[o.programIdIndex];if(!a)continue;m(a)&&(r=!0);const u=o.accountKeyIndexes.map(e=>n.allKeys[e]).filter(e=>!!e),d=new P({programId:a,keys:u.map(e=>({pubkey:e,isSigner:!1,isWritable:!1})),data:p.from(o.data)}),l={programId:a,ixMeta:o,message:n,instruction:d};for(const e of L){if(!e.when(l))continue;const s=e.decode(l);s&&(s.createATA&&!t.createATA?t={...t,createATA:s.createATA}:s.tokenAddress&&!t.tokenAddress&&!t.createATA&&(t={...t,tokenAddress:s.tokenAddress}))}}return t.createATA?{transactionType:"SPL",data:t}:t.tokenAddress?{transactionType:"SPL",data:t}:r?{transactionType:"SPL",data:{}}:{transactionType:"Standard",data:{}}}catch{return{transactionType:"Standard",data:{}}}}async normaliseMessage(n){const r=this.tryDeserialiseVersioned(n);if(r){const e=r.message,s=await this.resolveLookedUpAddressesFromMessage(e),A=[...e.staticAccountKeys,...s?.writable??[],...s?.readonly??[]];return{compiledInstructions:e.compiledInstructions.map(i=>{const f=i,T=Array.from(f.accounts??i.accountKeyIndexes??[]);let y;return i.data instanceof Uint8Array?y=i.data:typeof i.data=="string"?y=p.from(i.data,"base64"):y=Uint8Array.from(i.data??[]),{programIdIndex:i.programIdIndex,accountKeyIndexes:T,data:y}}),allKeys:A}}const t=x.from(n),o=new Map,a=e=>{if(!e)return;const s=e.toBase58();o.has(s)||o.set(s,e)};a(t.feePayer??null);for(const e of t.instructions){a(e.programId);for(const s of e.keys)a(s.pubkey)}const u=Array.from(o.values()),d=new Map(u.map((e,s)=>[e.toBase58(),s]));return{compiledInstructions:t.instructions.map(e=>({programIdIndex:d.get(e.programId.toBase58())??-1,accountKeyIndexes:e.keys.map(s=>d.get(s.pubkey.toBase58())??-1),data:e.data})),allKeys:u}}tryDeserialiseVersioned(n){try{return S.deserialize(n)}catch{try{return{message:k.deserialize(n)}}catch{return null}}}async resolveLookedUpAddressesFromMessage(n){const r=n.addressTableLookups??[];if(!r.length)return;const t=[],o=[];for(const a of r){const d=(await D(this.injectedRPCURL||R).getAddressLookupTable(a.accountKey)).value;if(!d)continue;const l=d.state.addresses;for(const e of a.writableIndexes??[]){const s=l[e];s&&t.push(s)}for(const e of a.readonlyIndexes??[]){const s=l[e];s&&o.push(s)}}return{writable:t,readonly:o}}}export{h as SolanaTransactionTypes,N as TransactionInspector};
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 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 RPC_URL = \"https://api.mainnet-beta.solana.com/\";\n\nconst defaultConnection = (rpcUrl: string) =>\n new Connection(rpcUrl, { commitment: \"confirmed\" });\n\nconst isSPLProgramId = (pid: PublicKey | undefined) =>\n !!pid &&\n (pid.equals(ASSOCIATED_TOKEN_PROGRAM_ID) ||\n pid.equals(TOKEN_PROGRAM_ID) ||\n pid.equals(TOKEN_2022_PROGRAM_ID));\n\nexport class TransactionInspector {\n constructor(\n private readonly rawTransactionBytes: Uint8Array,\n private readonly tokenAddress?: string | undefined,\n private readonly createATA?:\n | {\n address: string;\n mintAddress: string;\n }\n | undefined,\n private readonly injectedRPCURL?: string | undefined,\n ) {}\n\n public async inspectTransactionType(): Promise<TxInspectorResult> {\n try {\n const message = await this.normaliseMessage(this.rawTransactionBytes);\n\n // fast path when transaction resolution is provided\n if (this.tokenAddress || this.createATA) {\n const looksSPL = message.compiledInstructions.some((instruction) =>\n isSPLProgramId(message.allKeys[instruction.programIdIndex]),\n );\n return {\n transactionType: looksSPL\n ? SolanaTransactionTypes.SPL\n : SolanaTransactionTypes.STANDARD,\n data: {\n ...(this.tokenAddress ? { tokenAddress: this.tokenAddress } : {}),\n ...(this.createATA ? { createATA: this.createATA } : {}),\n },\n };\n }\n\n // accumulate best data across all instructions\n let sawSPL = false;\n let best: TxInspectorResult[\"data\"] = {};\n\n for (const ixMeta of message.compiledInstructions) {\n const programId = message.allKeys[ixMeta.programIdIndex];\n if (!programId) continue; // unresolved index, skip\n if (isSPLProgramId(programId)) sawSPL = true;\n\n const resolvedKeys = ixMeta.accountKeyIndexes\n .map((i) => message.allKeys[i])\n .filter((k): k is PublicKey => !!k);\n\n const instruction = new TransactionInstruction({\n programId,\n keys: resolvedKeys.map((pk) => ({\n pubkey: pk,\n isSigner: false,\n isWritable: false,\n })),\n data: Buffer.from(ixMeta.data),\n });\n\n const ctx: IxContext = { programId, ixMeta, message, instruction };\n\n for (const decoder of DECODERS) {\n if (!decoder.when(ctx)) continue;\n const data = decoder.decode(ctx);\n if (!data) continue;\n\n // prefer createATA (needed when destination ATA doesn\u2019t exist yet)\n if (data.createATA && !best.createATA) {\n best = { ...best, createATA: data.createATA };\n } else if (\n data.tokenAddress &&\n !best.tokenAddress &&\n !best.createATA\n ) {\n best = { ...best, tokenAddress: data.tokenAddress };\n }\n }\n }\n\n if (best.createATA)\n return { transactionType: SolanaTransactionTypes.SPL, data: best };\n\n if (best.tokenAddress)\n return { transactionType: SolanaTransactionTypes.SPL, data: best };\n\n if (sawSPL)\n return { transactionType: SolanaTransactionTypes.SPL, data: {} }; // we should 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 private async normaliseMessage(\n rawBytes: Uint8Array,\n ): Promise<NormalizedMessage> {\n const versionedTX = this.tryDeserialiseVersioned(rawBytes);\n\n if (versionedTX) {\n const msg = versionedTX.message as VersionedMessage & {\n getAccountKeys?: (options?: {\n accountKeysFromLookups?: LoadedAddresses;\n }) => {\n staticAccountKeys: PublicKey[];\n accountKeysFromLookups?: LoadedAddresses;\n keySegments: () => PublicKey[][];\n };\n compiledInstructions: Array<{\n programIdIndex: number;\n accountKeyIndexes?: number[]; // legacy field name\n accounts?: number[]; // v0 field name\n data: Uint8Array | string | number[];\n }>;\n staticAccountKeys: PublicKey[];\n };\n\n const lookedUp = await this.resolveLookedUpAddressesFromMessage(msg);\n\n const allKeys: PublicKey[] = [\n ...msg.staticAccountKeys,\n ...(lookedUp?.writable ?? []),\n ...(lookedUp?.readonly ?? []),\n ];\n\n const compiledInstructions: NormalizedCompiledIx[] =\n msg.compiledInstructions.map((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 tryDeserialiseVersioned(\n rawBytes: Uint8Array,\n ): VersionedTransaction | null {\n try {\n return VersionedTransaction.deserialize(rawBytes);\n } catch {\n try {\n const msg = VersionedMessage.deserialize(rawBytes);\n return { message: msg } as VersionedTransaction;\n } catch {\n return null;\n }\n }\n }\n\n /**\n * For v0, fetch looked-up addresses from ALT(s) via the connection\n */\n private async resolveLookedUpAddressesFromMessage(\n msg: VersionedMessage,\n ): Promise<LoadedAddresses | undefined> {\n const lookups = msg.addressTableLookups ?? [];\n if (!lookups.length) return;\n\n const writable: PublicKey[] = [];\n const readonly: PublicKey[] = [];\n\n for (const lu of lookups) {\n const res = await defaultConnection(\n this.injectedRPCURL || RPC_URL,\n ).getAddressLookupTable(lu.accountKey);\n const table = res.value;\n if (!table) continue;\n const addrs = table.state.addresses;\n\n for (const i of lu.writableIndexes ?? []) {\n const pk = addrs[i];\n if (pk) writable.push(pk);\n }\n for (const i of lu.readonlyIndexes ?? []) {\n const pk = addrs[i];\n if (pk) readonly.push(pk);\n }\n }\n\n return { writable, readonly };\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["ASSOCIATED_TOKEN_PROGRAM_ID", "TOKEN_2022_PROGRAM_ID", "TOKEN_PROGRAM_ID", "Connection", "Transaction", "TransactionInstruction", "VersionedMessage", "VersionedTransaction", "Buffer", "DECODERS", "SolanaTransactionTypes", "RPC_URL", "defaultConnection", "rpcUrl", "isSPLProgramId", "pid", "TransactionInspector", "rawTransactionBytes", "tokenAddress", "createATA", "injectedRPCURL", "message", "instruction", "sawSPL", "best", "ixMeta", "programId", "resolvedKeys", "i", "k", "pk", "ctx", "decoder", "data", "rawBytes", "versionedTX", "msg", "lookedUp", "allKeys", "ixWithAccounts", "accountKeyIndexes", "legacy", "allKeyMap", "add", "pubkey", "key", "indexByB58", "lookups", "writable", "readonly", "lu", "table", "addrs"]
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{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(s).inspectTransactionType();r(c.transactionType).toBe(d.STANDARD),r(c.data).toEqual({})}),u("detects an SPL Transfer and returns the destination address",async()=>{const e=t.generate(),n=t.generate().publicKey,a=t.generate().publicKey,s=g(n,a,e.publicKey,42n,[],l),{raw:c}=y([s],[e],e),o=await new p(c).inspectTransactionType();r(o.transactionType).toBe(d.SPL),r(o.data.tokenAddress).toBe(a.toBase58())}),u("detects an SPL TransferChecked and returns the destination address",async()=>{const e=t.generate(),n=t.generate().publicKey,a=t.generate().publicKey,s=t.generate().publicKey,c=I(a,n,s,e.publicKey,123n,0,[],l),{raw:o}=y([c],[e],e),i=await new p(o).inspectTransactionType();r(i.transactionType).toBe(d.SPL),r(i.data.tokenAddress).toBe(s.toBase58())}),u("detects InitializeAccount and returns the new account and mint",async()=>{const e=t.generate(),n=t.generate().publicKey,a=t.generate().publicKey,s=t.generate().publicKey,c=P(a,n,s,l),{raw:o}=y([c],[e],e),i=await new p(o).inspectTransactionType();r(i.transactionType).toBe(d.SPL),r(i.data.createATA).toEqual({address:a.toBase58(),mintAddress:n.toBase58()})}),u("detects InitializeAccount2 and returns the new account and mint",async()=>{const e=t.generate(),n=t.generate().publicKey,a=t.generate().publicKey,s=t.generate().publicKey,c=S(a,n,s,l),{raw:o}=y([c],[e],e),i=await new p(o).inspectTransactionType();r(i.transactionType).toBe(d.SPL),r(i.data.createATA).toEqual({address:a.toBase58(),mintAddress:n.toBase58()})}),u("detects InitializeAccount3 and returns the new account and mint",async()=>{const e=t.generate(),n=t.generate().publicKey,a=t.generate().publicKey,s=f(a,n,l),{raw:c}=y([s],[e],e),o=await new p(c).inspectTransactionType();r(o.transactionType).toBe(d.SPL),r(o.data.createATA).toEqual({address:a.toBase58(),mintAddress:n.toBase58()})}),u("detects ATA creation via Associated Token Program (classic TOKEN program)",async()=>{const e=t.generate(),n=t.generate().publicKey,a=t.generate().publicKey,s=b(a,n,!0,l,A),c=w(e.publicKey,s,n,a,l,A),{raw:o}=y([c],[e],e),i=await new p(o).inspectTransactionType();r(i.transactionType).toBe(d.SPL),r(i.data.createATA).toEqual({address:n.toBase58(),mintAddress:a.toBase58()})}),u("detects ATA creation via Associated Token Program (TOKEN-2022 program)",async()=>{const e=t.generate(),n=t.generate().publicKey,a=t.generate().publicKey,s=b(a,n,!0,B,A),c=w(e.publicKey,s,n,a,B,A),{raw:o}=y([c],[e],e),i=await new p(o).inspectTransactionType();r(i.transactionType).toBe(d.SPL),r(i.data.createATA).toEqual({address:n.toBase58(),mintAddress:a.toBase58()})}),u("detects CloseAccount and returns the closed token account",async()=>{const e=t.generate(),n=t.generate().publicKey,a=t.generate().publicKey,s=m(n,a,e.publicKey),{raw:c}=y([s],[e],e),o=await new p(c).inspectTransactionType();r(o.transactionType).toBe(d.SPL),r(o.data.tokenAddress).toBe(n.toBase58())}),u("detects SyncNative and returns the WSOL account",async()=>{const e=t.generate(),n=t.generate().publicKey,a=k(n,l),{raw:s}=y([a],[e],e),c=await new p(s).inspectTransactionType();r(c.transactionType).toBe(d.SPL),r(c.data.tokenAddress).toBe(n.toBase58())}),u("marks transaction as SPL even if decoders can't parse (last-resort SPL by program id)",async()=>{const e=t.generate(),n=new E({programId:l,keys:[],data:Buffer.from([])}),{raw:a}=y([n],[e],e),s=await new p(a).inspectTransactionType();r(s.transactionType).toBe(d.SPL),r(s.data).toEqual({})}),u("falls back to STANDARD if the payload is unparseable",async()=>{const e=new Uint8Array([171,173,190,239]),n=await new p(e).inspectTransactionType();r(n.transactionType).toBe(d.STANDARD),r(n.data).toEqual({})}),u("fast path: tokenAddress override + SPL instruction, SPL and returns override",async()=>{const e=t.generate(),n=t.generate().publicKey,a=t.generate().publicKey,s=g(n,a,e.publicKey,1n,[],l),{raw:c}=y([s],[e],e),o=t.generate().publicKey.toBase58(),i=await new p(c,o).inspectTransactionType();r(i.transactionType).toBe(d.SPL),r(i.data.tokenAddress).toBe(o)}),u("fast path: createATA override + ATA instruction, SPL and returns override",async()=>{const e=t.generate(),n=t.generate().publicKey,a=t.generate().publicKey,s=b(a,n,!0,l,A),c=w(e.publicKey,s,n,a,l,A),{raw:o}=y([c],[e],e),i={address:t.generate().publicKey.toBase58(),mintAddress:t.generate().publicKey.toBase58()},T=await new p(o,void 0,i).inspectTransactionType();r(T.transactionType).toBe(d.SPL),r(T.data.createATA).toEqual(i)}),u("fast path: both overrides + SPL instruction, SPL and returns both",async()=>{const e=t.generate(),n=t.generate().publicKey,a=t.generate().publicKey,s=g(n,a,e.publicKey,7n,[],l),{raw:c}=y([s],[e],e),o=t.generate().publicKey.toBase58(),i={address:t.generate().publicKey.toBase58(),mintAddress:t.generate().publicKey.toBase58()},T=await new p(c,o,i).inspectTransactionType();r(T.transactionType).toBe(d.SPL),r(T.data.tokenAddress).toBe(o),r(T.data.createATA).toEqual(i)})});
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
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/services/TransactionInspector.test.ts"],
4
- "sourcesContent": ["import {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n createAssociatedTokenAccountInstruction,\n createCloseAccountInstruction,\n createInitializeAccount2Instruction,\n createInitializeAccount3Instruction,\n createInitializeAccountInstruction,\n createSyncNativeInstruction,\n createTransferCheckedInstruction,\n createTransferInstruction,\n getAssociatedTokenAddressSync,\n TOKEN_2022_PROGRAM_ID,\n TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport {\n Keypair,\n SystemProgram,\n Transaction,\n TransactionInstruction,\n} from \"@solana/web3.js\";\nimport { describe, expect, it } from \"vitest\";\n\nimport { DefaultBs58Encoder } from \"@internal/app-binder/services/bs58Encoder\";\n\nimport {\n SolanaTransactionTypes,\n TransactionInspector,\n} from \"./TransactionInspector\";\n\nconst DUMMY_BLOCKHASH = DefaultBs58Encoder.encode(\n new Uint8Array(32).fill(0xaa),\n);\n\nfunction makeSignedRawTx(\n ixs: TransactionInstruction[],\n signers: Keypair[],\n feePayer?: Keypair,\n) {\n const payer = feePayer ?? signers[0] ?? Keypair.generate();\n const tx = new Transaction();\n tx.recentBlockhash = DUMMY_BLOCKHASH;\n tx.feePayer = payer.publicKey;\n tx.add(...ixs);\n const seen = new Set<string>();\n const uniqueSigners = [payer, ...signers].filter((kp) => {\n const k = kp.publicKey.toBase58();\n if (seen.has(k)) return false;\n seen.add(k);\n return true;\n });\n\n tx.sign(...uniqueSigners);\n return { raw: tx.serialize(), payer };\n}\n\ndescribe(\"TransactionInspector\", () => {\n it(\"falls back to STANDARD for a plain SystemProgram transfer\", async () => {\n // given\n const payer = Keypair.generate();\n const dest = Keypair.generate().publicKey;\n\n const instruction = SystemProgram.transfer({\n fromPubkey: payer.publicKey,\n toPubkey: dest,\n lamports: 1_000,\n });\n\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n // when\n const result = await new TransactionInspector(raw).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.STANDARD);\n expect(result.data).toEqual({});\n });\n\n it(\"detects an SPL Transfer and returns the destination address\", async () => {\n // given\n const owner = Keypair.generate();\n const source = Keypair.generate().publicKey;\n const destination = Keypair.generate().publicKey;\n\n const instruction = createTransferInstruction(\n source,\n destination,\n owner.publicKey,\n 42n,\n [],\n TOKEN_PROGRAM_ID,\n );\n\n const { raw } = makeSignedRawTx([instruction], [owner], owner);\n\n // when\n const result = await new TransactionInspector(raw).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.tokenAddress).toBe(destination.toBase58());\n });\n\n it(\"detects an SPL TransferChecked and returns the destination address\", async () => {\n // given\n const owner = Keypair.generate();\n const mint = Keypair.generate().publicKey;\n const source = Keypair.generate().publicKey;\n const destination = Keypair.generate().publicKey;\n\n const instruction = createTransferCheckedInstruction(\n source,\n mint,\n destination,\n owner.publicKey,\n 123n,\n 0,\n [],\n TOKEN_PROGRAM_ID,\n );\n\n const { raw } = makeSignedRawTx([instruction], [owner], owner);\n\n // when\n const result = await new TransactionInspector(raw).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.tokenAddress).toBe(destination.toBase58());\n });\n\n it(\"detects InitializeAccount and returns the new account and mint\", async () => {\n // given\n const payer = Keypair.generate();\n const mint = Keypair.generate().publicKey;\n const newAccount = Keypair.generate().publicKey;\n const owner = Keypair.generate().publicKey;\n\n const instruction = createInitializeAccountInstruction(\n newAccount,\n mint,\n owner,\n TOKEN_PROGRAM_ID,\n );\n\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n // when\n const result = await new TransactionInspector(raw).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.createATA).toEqual({\n address: newAccount.toBase58(),\n mintAddress: mint.toBase58(),\n });\n });\n\n it(\"detects InitializeAccount2 and returns the new account and mint\", async () => {\n // given\n const payer = Keypair.generate();\n const mint = Keypair.generate().publicKey;\n const newAccount = Keypair.generate().publicKey;\n const owner = Keypair.generate().publicKey;\n\n const instruction = createInitializeAccount2Instruction(\n newAccount,\n mint,\n owner,\n TOKEN_PROGRAM_ID,\n );\n\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n // when\n const result = await new TransactionInspector(raw).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.createATA).toEqual({\n address: newAccount.toBase58(),\n mintAddress: mint.toBase58(),\n });\n });\n\n it(\"detects InitializeAccount3 and returns the new account and mint\", async () => {\n // given\n const payer = Keypair.generate();\n const mint = Keypair.generate().publicKey;\n const newAccount = Keypair.generate().publicKey;\n\n const instruction = createInitializeAccount3Instruction(\n newAccount,\n mint,\n TOKEN_PROGRAM_ID,\n );\n\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n // when\n const result = await new TransactionInspector(raw).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.createATA).toEqual({\n address: newAccount.toBase58(),\n mintAddress: mint.toBase58(),\n });\n });\n\n it(\"detects ATA creation via Associated Token Program (classic TOKEN program)\", async () => {\n // given\n const payer = Keypair.generate();\n const owner = Keypair.generate().publicKey;\n const mint = Keypair.generate().publicKey;\n const ata = getAssociatedTokenAddressSync(\n mint,\n owner,\n true,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const instruction = createAssociatedTokenAccountInstruction(\n payer.publicKey,\n ata,\n owner,\n mint,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n // when\n const result = await new TransactionInspector(raw).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.createATA).toEqual({\n address: owner.toBase58(),\n mintAddress: mint.toBase58(),\n });\n });\n\n it(\"detects ATA creation via Associated Token Program (TOKEN-2022 program)\", async () => {\n // given\n const payer = Keypair.generate();\n const owner = Keypair.generate().publicKey;\n const mint = Keypair.generate().publicKey;\n const ata22 = getAssociatedTokenAddressSync(\n mint,\n owner,\n true,\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const instruction = createAssociatedTokenAccountInstruction(\n payer.publicKey,\n ata22,\n owner,\n mint,\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n // when\n const result = await new TransactionInspector(raw).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.createATA).toEqual({\n address: owner.toBase58(),\n mintAddress: mint.toBase58(),\n });\n });\n\n it(\"detects CloseAccount and returns the closed token account\", async () => {\n // given\n const owner = Keypair.generate();\n const account = Keypair.generate().publicKey;\n const dest = Keypair.generate().publicKey;\n\n const instruction = createCloseAccountInstruction(\n account,\n dest,\n owner.publicKey,\n );\n\n const { raw } = makeSignedRawTx([instruction], [owner], owner);\n\n // when\n const result = await new TransactionInspector(raw).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.tokenAddress).toBe(account.toBase58());\n });\n\n it(\"detects SyncNative and returns the WSOL account\", async () => {\n // given\n const payer = Keypair.generate();\n const account = Keypair.generate().publicKey;\n\n const instruction = createSyncNativeInstruction(account, TOKEN_PROGRAM_ID);\n\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n // when\n const result = await new TransactionInspector(raw).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.tokenAddress).toBe(account.toBase58());\n });\n\n it(\"marks transaction as SPL even if decoders can't parse (last-resort SPL by program id)\", async () => {\n // given\n const payer = Keypair.generate();\n const bogusIx = new TransactionInstruction({\n programId: TOKEN_PROGRAM_ID,\n keys: [],\n data: Buffer.from([]),\n });\n\n const { raw } = makeSignedRawTx([bogusIx], [payer], payer);\n\n // when\n const result = await new TransactionInspector(raw).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data).toEqual({});\n });\n\n it(\"falls back to STANDARD if the payload is unparseable\", async () => {\n // given\n const garbage = new Uint8Array([0xab, 0xad, 0xbe, 0xef]);\n\n // when\n const result = await new TransactionInspector(\n garbage,\n ).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.STANDARD);\n expect(result.data).toEqual({});\n });\n\n it(\"fast path: tokenAddress override + SPL instruction, SPL and returns override\", async () => {\n // given\n const owner = Keypair.generate();\n const source = Keypair.generate().publicKey;\n const destination = Keypair.generate().publicKey;\n\n const instruction = createTransferInstruction(\n source,\n destination,\n owner.publicKey,\n 1n,\n [],\n TOKEN_PROGRAM_ID,\n );\n const { raw } = makeSignedRawTx([instruction], [owner], owner);\n\n const overrideToken = Keypair.generate().publicKey.toBase58();\n\n // when\n const result = await new TransactionInspector(\n raw,\n overrideToken,\n ).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.tokenAddress).toBe(overrideToken);\n });\n\n it(\"fast path: createATA override + ATA instruction, SPL and returns override\", async () => {\n // given\n const payer = Keypair.generate();\n const owner = Keypair.generate().publicKey;\n const mint = Keypair.generate().publicKey;\n const ata = getAssociatedTokenAddressSync(\n mint,\n owner,\n true,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const instruction = createAssociatedTokenAccountInstruction(\n payer.publicKey,\n ata,\n owner,\n mint,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n const overrideATA = {\n address: Keypair.generate().publicKey.toBase58(),\n mintAddress: Keypair.generate().publicKey.toBase58(),\n };\n\n // when\n const result = await new TransactionInspector(\n raw,\n undefined,\n overrideATA,\n ).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.createATA).toEqual(overrideATA);\n });\n\n it(\"fast path: both overrides + SPL instruction, SPL and returns both\", async () => {\n // given\n const owner = Keypair.generate();\n const source = Keypair.generate().publicKey;\n const destination = Keypair.generate().publicKey;\n\n const instruction = createTransferInstruction(\n source,\n destination,\n owner.publicKey,\n 7n,\n [],\n TOKEN_PROGRAM_ID,\n );\n const { raw } = makeSignedRawTx([instruction], [owner], owner);\n\n const tokenOverride = Keypair.generate().publicKey.toBase58();\n const ataOverride = {\n address: Keypair.generate().publicKey.toBase58(),\n mintAddress: Keypair.generate().publicKey.toBase58(),\n };\n\n // when\n const result = await new TransactionInspector(\n raw,\n tokenOverride,\n ataOverride,\n ).inspectTransactionType();\n\n // then\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.tokenAddress).toBe(tokenOverride);\n expect(result.data.createATA).toEqual(ataOverride);\n });\n});\n"],
5
- "mappings": "AAAA,OACE,+BAAAA,EACA,2CAAAC,EACA,iCAAAC,EACA,uCAAAC,EACA,uCAAAC,EACA,sCAAAC,EACA,+BAAAC,EACA,oCAAAC,EACA,6BAAAC,EACA,iCAAAC,EACA,yBAAAC,EACA,oBAAAC,MACK,oBACP,OACE,WAAAC,EACA,iBAAAC,EACA,eAAAC,EACA,0BAAAC,MACK,kBACP,OAAS,YAAAC,EAAU,UAAAC,EAAQ,MAAAC,MAAU,SAErC,OAAS,sBAAAC,MAA0B,4CAEnC,OACE,0BAAAC,EACA,wBAAAC,MACK,yBAEP,MAAMC,EAAkBH,EAAmB,OACzC,IAAI,WAAW,EAAE,EAAE,KAAK,GAAI,CAC9B,EAEA,SAASI,EACPC,EACAC,EACAC,EACA,CACA,MAAMC,EAAQD,GAAYD,EAAQ,CAAC,GAAKb,EAAQ,SAAS,EACnDgB,EAAK,IAAId,EACfc,EAAG,gBAAkBN,EACrBM,EAAG,SAAWD,EAAM,UACpBC,EAAG,IAAI,GAAGJ,CAAG,EACb,MAAMK,EAAO,IAAI,IACXC,EAAgB,CAACH,EAAO,GAAGF,CAAO,EAAE,OAAQM,GAAO,CACvD,MAAMC,EAAID,EAAG,UAAU,SAAS,EAChC,OAAIF,EAAK,IAAIG,CAAC,EAAU,IACxBH,EAAK,IAAIG,CAAC,EACH,GACT,CAAC,EAED,OAAAJ,EAAG,KAAK,GAAGE,CAAa,EACjB,CAAE,IAAKF,EAAG,UAAU,EAAG,MAAAD,CAAM,CACtC,CAEAX,EAAS,uBAAwB,IAAM,CACrCE,EAAG,4DAA6D,SAAY,CAE1E,MAAMS,EAAQf,EAAQ,SAAS,EACzBqB,EAAOrB,EAAQ,SAAS,EAAE,UAE1BsB,EAAcrB,EAAc,SAAS,CACzC,WAAYc,EAAM,UAClB,SAAUM,EACV,SAAU,GACZ,CAAC,EAEK,CAAE,IAAAE,CAAI,EAAIZ,EAAgB,CAACW,CAAW,EAAG,CAACP,CAAK,EAAGA,CAAK,EAGvDS,EAAS,MAAM,IAAIf,EAAqBc,CAAG,EAAE,uBAAuB,EAG1ElB,EAAOmB,EAAO,eAAe,EAAE,KAAKhB,EAAuB,QAAQ,EACnEH,EAAOmB,EAAO,IAAI,EAAE,QAAQ,CAAC,CAAC,CAChC,CAAC,EAEDlB,EAAG,8DAA+D,SAAY,CAE5E,MAAMmB,EAAQzB,EAAQ,SAAS,EACzB0B,EAAS1B,EAAQ,SAAS,EAAE,UAC5B2B,EAAc3B,EAAQ,SAAS,EAAE,UAEjCsB,EAAc1B,EAClB8B,EACAC,EACAF,EAAM,UACN,IACA,CAAC,EACD1B,CACF,EAEM,CAAE,IAAAwB,CAAI,EAAIZ,EAAgB,CAACW,CAAW,EAAG,CAACG,CAAK,EAAGA,CAAK,EAGvDD,EAAS,MAAM,IAAIf,EAAqBc,CAAG,EAAE,uBAAuB,EAG1ElB,EAAOmB,EAAO,eAAe,EAAE,KAAKhB,EAAuB,GAAG,EAC9DH,EAAOmB,EAAO,KAAK,YAAY,EAAE,KAAKG,EAAY,SAAS,CAAC,CAC9D,CAAC,EAEDrB,EAAG,qEAAsE,SAAY,CAEnF,MAAMmB,EAAQzB,EAAQ,SAAS,EACzB4B,EAAO5B,EAAQ,SAAS,EAAE,UAC1B0B,EAAS1B,EAAQ,SAAS,EAAE,UAC5B2B,EAAc3B,EAAQ,SAAS,EAAE,UAEjCsB,EAAc3B,EAClB+B,EACAE,EACAD,EACAF,EAAM,UACN,KACA,EACA,CAAC,EACD1B,CACF,EAEM,CAAE,IAAAwB,CAAI,EAAIZ,EAAgB,CAACW,CAAW,EAAG,CAACG,CAAK,EAAGA,CAAK,EAGvDD,EAAS,MAAM,IAAIf,EAAqBc,CAAG,EAAE,uBAAuB,EAG1ElB,EAAOmB,EAAO,eAAe,EAAE,KAAKhB,EAAuB,GAAG,EAC9DH,EAAOmB,EAAO,KAAK,YAAY,EAAE,KAAKG,EAAY,SAAS,CAAC,CAC9D,CAAC,EAEDrB,EAAG,iEAAkE,SAAY,CAE/E,MAAMS,EAAQf,EAAQ,SAAS,EACzB4B,EAAO5B,EAAQ,SAAS,EAAE,UAC1B6B,EAAa7B,EAAQ,SAAS,EAAE,UAChCyB,EAAQzB,EAAQ,SAAS,EAAE,UAE3BsB,EAAc7B,EAClBoC,EACAD,EACAH,EACA1B,CACF,EAEM,CAAE,IAAAwB,CAAI,EAAIZ,EAAgB,CAACW,CAAW,EAAG,CAACP,CAAK,EAAGA,CAAK,EAGvDS,EAAS,MAAM,IAAIf,EAAqBc,CAAG,EAAE,uBAAuB,EAG1ElB,EAAOmB,EAAO,eAAe,EAAE,KAAKhB,EAAuB,GAAG,EAC9DH,EAAOmB,EAAO,KAAK,SAAS,EAAE,QAAQ,CACpC,QAASK,EAAW,SAAS,EAC7B,YAAaD,EAAK,SAAS,CAC7B,CAAC,CACH,CAAC,EAEDtB,EAAG,kEAAmE,SAAY,CAEhF,MAAMS,EAAQf,EAAQ,SAAS,EACzB4B,EAAO5B,EAAQ,SAAS,EAAE,UAC1B6B,EAAa7B,EAAQ,SAAS,EAAE,UAChCyB,EAAQzB,EAAQ,SAAS,EAAE,UAE3BsB,EAAc/B,EAClBsC,EACAD,EACAH,EACA1B,CACF,EAEM,CAAE,IAAAwB,CAAI,EAAIZ,EAAgB,CAACW,CAAW,EAAG,CAACP,CAAK,EAAGA,CAAK,EAGvDS,EAAS,MAAM,IAAIf,EAAqBc,CAAG,EAAE,uBAAuB,EAG1ElB,EAAOmB,EAAO,eAAe,EAAE,KAAKhB,EAAuB,GAAG,EAC9DH,EAAOmB,EAAO,KAAK,SAAS,EAAE,QAAQ,CACpC,QAASK,EAAW,SAAS,EAC7B,YAAaD,EAAK,SAAS,CAC7B,CAAC,CACH,CAAC,EAEDtB,EAAG,kEAAmE,SAAY,CAEhF,MAAMS,EAAQf,EAAQ,SAAS,EACzB4B,EAAO5B,EAAQ,SAAS,EAAE,UAC1B6B,EAAa7B,EAAQ,SAAS,EAAE,UAEhCsB,EAAc9B,EAClBqC,EACAD,EACA7B,CACF,EAEM,CAAE,IAAAwB,CAAI,EAAIZ,EAAgB,CAACW,CAAW,EAAG,CAACP,CAAK,EAAGA,CAAK,EAGvDS,EAAS,MAAM,IAAIf,EAAqBc,CAAG,EAAE,uBAAuB,EAG1ElB,EAAOmB,EAAO,eAAe,EAAE,KAAKhB,EAAuB,GAAG,EAC9DH,EAAOmB,EAAO,KAAK,SAAS,EAAE,QAAQ,CACpC,QAASK,EAAW,SAAS,EAC7B,YAAaD,EAAK,SAAS,CAC7B,CAAC,CACH,CAAC,EAEDtB,EAAG,4EAA6E,SAAY,CAE1F,MAAMS,EAAQf,EAAQ,SAAS,EACzByB,EAAQzB,EAAQ,SAAS,EAAE,UAC3B4B,EAAO5B,EAAQ,SAAS,EAAE,UAC1B8B,EAAMjC,EACV+B,EACAH,EACA,GACA1B,EACAX,CACF,EAEMkC,EAAcjC,EAClB0B,EAAM,UACNe,EACAL,EACAG,EACA7B,EACAX,CACF,EAEM,CAAE,IAAAmC,CAAI,EAAIZ,EAAgB,CAACW,CAAW,EAAG,CAACP,CAAK,EAAGA,CAAK,EAGvDS,EAAS,MAAM,IAAIf,EAAqBc,CAAG,EAAE,uBAAuB,EAG1ElB,EAAOmB,EAAO,eAAe,EAAE,KAAKhB,EAAuB,GAAG,EAC9DH,EAAOmB,EAAO,KAAK,SAAS,EAAE,QAAQ,CACpC,QAASC,EAAM,SAAS,EACxB,YAAaG,EAAK,SAAS,CAC7B,CAAC,CACH,CAAC,EAEDtB,EAAG,yEAA0E,SAAY,CAEvF,MAAMS,EAAQf,EAAQ,SAAS,EACzByB,EAAQzB,EAAQ,SAAS,EAAE,UAC3B4B,EAAO5B,EAAQ,SAAS,EAAE,UAC1B+B,EAAQlC,EACZ+B,EACAH,EACA,GACA3B,EACAV,CACF,EAEMkC,EAAcjC,EAClB0B,EAAM,UACNgB,EACAN,EACAG,EACA9B,EACAV,CACF,EAEM,CAAE,IAAAmC,CAAI,EAAIZ,EAAgB,CAACW,CAAW,EAAG,CAACP,CAAK,EAAGA,CAAK,EAGvDS,EAAS,MAAM,IAAIf,EAAqBc,CAAG,EAAE,uBAAuB,EAG1ElB,EAAOmB,EAAO,eAAe,EAAE,KAAKhB,EAAuB,GAAG,EAC9DH,EAAOmB,EAAO,KAAK,SAAS,EAAE,QAAQ,CACpC,QAASC,EAAM,SAAS,EACxB,YAAaG,EAAK,SAAS,CAC7B,CAAC,CACH,CAAC,EAEDtB,EAAG,4DAA6D,SAAY,CAE1E,MAAMmB,EAAQzB,EAAQ,SAAS,EACzBgC,EAAUhC,EAAQ,SAAS,EAAE,UAC7BqB,EAAOrB,EAAQ,SAAS,EAAE,UAE1BsB,EAAchC,EAClB0C,EACAX,EACAI,EAAM,SACR,EAEM,CAAE,IAAAF,CAAI,EAAIZ,EAAgB,CAACW,CAAW,EAAG,CAACG,CAAK,EAAGA,CAAK,EAGvDD,EAAS,MAAM,IAAIf,EAAqBc,CAAG,EAAE,uBAAuB,EAG1ElB,EAAOmB,EAAO,eAAe,EAAE,KAAKhB,EAAuB,GAAG,EAC9DH,EAAOmB,EAAO,KAAK,YAAY,EAAE,KAAKQ,EAAQ,SAAS,CAAC,CAC1D,CAAC,EAED1B,EAAG,kDAAmD,SAAY,CAEhE,MAAMS,EAAQf,EAAQ,SAAS,EACzBgC,EAAUhC,EAAQ,SAAS,EAAE,UAE7BsB,EAAc5B,EAA4BsC,EAASjC,CAAgB,EAEnE,CAAE,IAAAwB,CAAI,EAAIZ,EAAgB,CAACW,CAAW,EAAG,CAACP,CAAK,EAAGA,CAAK,EAGvDS,EAAS,MAAM,IAAIf,EAAqBc,CAAG,EAAE,uBAAuB,EAG1ElB,EAAOmB,EAAO,eAAe,EAAE,KAAKhB,EAAuB,GAAG,EAC9DH,EAAOmB,EAAO,KAAK,YAAY,EAAE,KAAKQ,EAAQ,SAAS,CAAC,CAC1D,CAAC,EAED1B,EAAG,wFAAyF,SAAY,CAEtG,MAAMS,EAAQf,EAAQ,SAAS,EACzBiC,EAAU,IAAI9B,EAAuB,CACzC,UAAWJ,EACX,KAAM,CAAC,EACP,KAAM,OAAO,KAAK,CAAC,CAAC,CACtB,CAAC,EAEK,CAAE,IAAAwB,CAAI,EAAIZ,EAAgB,CAACsB,CAAO,EAAG,CAAClB,CAAK,EAAGA,CAAK,EAGnDS,EAAS,MAAM,IAAIf,EAAqBc,CAAG,EAAE,uBAAuB,EAG1ElB,EAAOmB,EAAO,eAAe,EAAE,KAAKhB,EAAuB,GAAG,EAC9DH,EAAOmB,EAAO,IAAI,EAAE,QAAQ,CAAC,CAAC,CAChC,CAAC,EAEDlB,EAAG,uDAAwD,SAAY,CAErE,MAAM4B,EAAU,IAAI,WAAW,CAAC,IAAM,IAAM,IAAM,GAAI,CAAC,EAGjDV,EAAS,MAAM,IAAIf,EACvByB,CACF,EAAE,uBAAuB,EAGzB7B,EAAOmB,EAAO,eAAe,EAAE,KAAKhB,EAAuB,QAAQ,EACnEH,EAAOmB,EAAO,IAAI,EAAE,QAAQ,CAAC,CAAC,CAChC,CAAC,EAEDlB,EAAG,+EAAgF,SAAY,CAE7F,MAAMmB,EAAQzB,EAAQ,SAAS,EACzB0B,EAAS1B,EAAQ,SAAS,EAAE,UAC5B2B,EAAc3B,EAAQ,SAAS,EAAE,UAEjCsB,EAAc1B,EAClB8B,EACAC,EACAF,EAAM,UACN,GACA,CAAC,EACD1B,CACF,EACM,CAAE,IAAAwB,CAAI,EAAIZ,EAAgB,CAACW,CAAW,EAAG,CAACG,CAAK,EAAGA,CAAK,EAEvDU,EAAgBnC,EAAQ,SAAS,EAAE,UAAU,SAAS,EAGtDwB,EAAS,MAAM,IAAIf,EACvBc,EACAY,CACF,EAAE,uBAAuB,EAGzB9B,EAAOmB,EAAO,eAAe,EAAE,KAAKhB,EAAuB,GAAG,EAC9DH,EAAOmB,EAAO,KAAK,YAAY,EAAE,KAAKW,CAAa,CACrD,CAAC,EAED7B,EAAG,4EAA6E,SAAY,CAE1F,MAAMS,EAAQf,EAAQ,SAAS,EACzByB,EAAQzB,EAAQ,SAAS,EAAE,UAC3B4B,EAAO5B,EAAQ,SAAS,EAAE,UAC1B8B,EAAMjC,EACV+B,EACAH,EACA,GACA1B,EACAX,CACF,EAEMkC,EAAcjC,EAClB0B,EAAM,UACNe,EACAL,EACAG,EACA7B,EACAX,CACF,EACM,CAAE,IAAAmC,CAAI,EAAIZ,EAAgB,CAACW,CAAW,EAAG,CAACP,CAAK,EAAGA,CAAK,EAEvDqB,EAAc,CAClB,QAASpC,EAAQ,SAAS,EAAE,UAAU,SAAS,EAC/C,YAAaA,EAAQ,SAAS,EAAE,UAAU,SAAS,CACrD,EAGMwB,EAAS,MAAM,IAAIf,EACvBc,EACA,OACAa,CACF,EAAE,uBAAuB,EAGzB/B,EAAOmB,EAAO,eAAe,EAAE,KAAKhB,EAAuB,GAAG,EAC9DH,EAAOmB,EAAO,KAAK,SAAS,EAAE,QAAQY,CAAW,CACnD,CAAC,EAED9B,EAAG,oEAAqE,SAAY,CAElF,MAAMmB,EAAQzB,EAAQ,SAAS,EACzB0B,EAAS1B,EAAQ,SAAS,EAAE,UAC5B2B,EAAc3B,EAAQ,SAAS,EAAE,UAEjCsB,EAAc1B,EAClB8B,EACAC,EACAF,EAAM,UACN,GACA,CAAC,EACD1B,CACF,EACM,CAAE,IAAAwB,CAAI,EAAIZ,EAAgB,CAACW,CAAW,EAAG,CAACG,CAAK,EAAGA,CAAK,EAEvDY,EAAgBrC,EAAQ,SAAS,EAAE,UAAU,SAAS,EACtDsC,EAAc,CAClB,QAAStC,EAAQ,SAAS,EAAE,UAAU,SAAS,EAC/C,YAAaA,EAAQ,SAAS,EAAE,UAAU,SAAS,CACrD,EAGMwB,EAAS,MAAM,IAAIf,EACvBc,EACAc,EACAC,CACF,EAAE,uBAAuB,EAGzBjC,EAAOmB,EAAO,eAAe,EAAE,KAAKhB,EAAuB,GAAG,EAC9DH,EAAOmB,EAAO,KAAK,YAAY,EAAE,KAAKa,CAAa,EACnDhC,EAAOmB,EAAO,KAAK,SAAS,EAAE,QAAQc,CAAW,CACnD,CAAC,CACH,CAAC",
4
+ "sourcesContent": ["import {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n createAssociatedTokenAccountInstruction,\n createCloseAccountInstruction,\n createInitializeAccount2Instruction,\n createInitializeAccount3Instruction,\n createInitializeAccountInstruction,\n createSyncNativeInstruction,\n createTransferCheckedInstruction,\n createTransferInstruction,\n getAssociatedTokenAddressSync,\n TOKEN_2022_PROGRAM_ID,\n TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport {\n Keypair,\n SystemProgram,\n Transaction,\n TransactionInstruction,\n} from \"@solana/web3.js\";\nimport { describe, expect, it } from \"vitest\";\n\nimport { DefaultBs58Encoder } from \"@internal/app-binder/services/bs58Encoder\";\n\nimport {\n SolanaTransactionTypes,\n TransactionInspector,\n} from \"./TransactionInspector\";\n\nconst DUMMY_BLOCKHASH = DefaultBs58Encoder.encode(\n new Uint8Array(32).fill(0xaa),\n);\n\nfunction makeSignedRawTx(\n ixs: TransactionInstruction[],\n signers: Keypair[],\n feePayer?: Keypair,\n) {\n const payer = feePayer ?? signers[0] ?? Keypair.generate();\n const tx = new Transaction();\n tx.recentBlockhash = DUMMY_BLOCKHASH;\n tx.feePayer = payer.publicKey;\n tx.add(...ixs);\n const seen = new Set<string>();\n const uniqueSigners = [payer, ...signers].filter((kp) => {\n const k = kp.publicKey.toBase58();\n if (seen.has(k)) return false;\n seen.add(k);\n return true;\n });\n\n tx.sign(...uniqueSigners);\n return { raw: tx.serialize(), payer };\n}\n\ndescribe(\"TransactionInspector\", () => {\n it(\"falls back to STANDARD for a plain SystemProgram transfer\", async () => {\n const payer = Keypair.generate();\n const dest = Keypair.generate().publicKey;\n\n const instruction = SystemProgram.transfer({\n fromPubkey: payer.publicKey,\n toPubkey: dest,\n lamports: 1_000,\n });\n\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n const result = await new TransactionInspector().inspectTransactionType(raw);\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.STANDARD);\n expect(result.data).toEqual({});\n });\n\n it(\"detects an SPL Transfer and returns the destination address\", async () => {\n const owner = Keypair.generate();\n const source = Keypair.generate().publicKey;\n const destination = Keypair.generate().publicKey;\n\n const instruction = createTransferInstruction(\n source,\n destination,\n owner.publicKey,\n 42n,\n [],\n TOKEN_PROGRAM_ID,\n );\n\n const { raw } = makeSignedRawTx([instruction], [owner], owner);\n\n const result = await new TransactionInspector().inspectTransactionType(raw);\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.tokenAddress).toBe(destination.toBase58());\n });\n\n it(\"detects an SPL TransferChecked and returns the destination address\", async () => {\n const owner = Keypair.generate();\n const mint = Keypair.generate().publicKey;\n const source = Keypair.generate().publicKey;\n const destination = Keypair.generate().publicKey;\n\n const instruction = createTransferCheckedInstruction(\n source,\n mint,\n destination,\n owner.publicKey,\n 123n,\n 0,\n [],\n TOKEN_PROGRAM_ID,\n );\n\n const { raw } = makeSignedRawTx([instruction], [owner], owner);\n\n const result = await new TransactionInspector().inspectTransactionType(raw);\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.tokenAddress).toBe(destination.toBase58());\n });\n\n it(\"detects InitializeAccount and returns the new account and mint\", async () => {\n const payer = Keypair.generate();\n const mint = Keypair.generate().publicKey;\n const newAccount = Keypair.generate().publicKey;\n const owner = Keypair.generate().publicKey;\n\n const instruction = createInitializeAccountInstruction(\n newAccount,\n mint,\n owner,\n TOKEN_PROGRAM_ID,\n );\n\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n const result = await new TransactionInspector().inspectTransactionType(raw);\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.createATA).toEqual({\n address: newAccount.toBase58(),\n mintAddress: mint.toBase58(),\n });\n });\n\n it(\"detects InitializeAccount2 and returns the new account and mint\", async () => {\n const payer = Keypair.generate();\n const mint = Keypair.generate().publicKey;\n const newAccount = Keypair.generate().publicKey;\n const owner = Keypair.generate().publicKey;\n\n const instruction = createInitializeAccount2Instruction(\n newAccount,\n mint,\n owner,\n TOKEN_PROGRAM_ID,\n );\n\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n const result = await new TransactionInspector().inspectTransactionType(raw);\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.createATA).toEqual({\n address: newAccount.toBase58(),\n mintAddress: mint.toBase58(),\n });\n });\n\n it(\"detects InitializeAccount3 and returns the new account and mint\", async () => {\n const payer = Keypair.generate();\n const mint = Keypair.generate().publicKey;\n const newAccount = Keypair.generate().publicKey;\n\n const instruction = createInitializeAccount3Instruction(\n newAccount,\n mint,\n TOKEN_PROGRAM_ID,\n );\n\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n const result = await new TransactionInspector().inspectTransactionType(raw);\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.createATA).toEqual({\n address: newAccount.toBase58(),\n mintAddress: mint.toBase58(),\n });\n });\n\n it(\"detects ATA creation via Associated Token Program (classic TOKEN program)\", async () => {\n const payer = Keypair.generate();\n const owner = Keypair.generate().publicKey;\n const mint = Keypair.generate().publicKey;\n const ata = getAssociatedTokenAddressSync(\n mint,\n owner,\n true,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const instruction = createAssociatedTokenAccountInstruction(\n payer.publicKey,\n ata,\n owner,\n mint,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n const result = await new TransactionInspector().inspectTransactionType(raw);\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.createATA).toEqual({\n address: owner.toBase58(),\n mintAddress: mint.toBase58(),\n });\n });\n\n it(\"detects ATA creation via Associated Token Program (TOKEN-2022 program)\", async () => {\n const payer = Keypair.generate();\n const owner = Keypair.generate().publicKey;\n const mint = Keypair.generate().publicKey;\n const ata22 = getAssociatedTokenAddressSync(\n mint,\n owner,\n true,\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const instruction = createAssociatedTokenAccountInstruction(\n payer.publicKey,\n ata22,\n owner,\n mint,\n TOKEN_2022_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n const result = await new TransactionInspector().inspectTransactionType(raw);\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.createATA).toEqual({\n address: owner.toBase58(),\n mintAddress: mint.toBase58(),\n });\n });\n\n it(\"detects CloseAccount and returns the closed token account\", async () => {\n const owner = Keypair.generate();\n const account = Keypair.generate().publicKey;\n const dest = Keypair.generate().publicKey;\n\n const instruction = createCloseAccountInstruction(\n account,\n dest,\n owner.publicKey,\n );\n\n const { raw } = makeSignedRawTx([instruction], [owner], owner);\n\n const result = await new TransactionInspector().inspectTransactionType(raw);\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.tokenAddress).toBe(account.toBase58());\n });\n\n it(\"detects SyncNative and returns the WSOL account\", async () => {\n const payer = Keypair.generate();\n const account = Keypair.generate().publicKey;\n\n const instruction = createSyncNativeInstruction(account, TOKEN_PROGRAM_ID);\n\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n const result = await new TransactionInspector().inspectTransactionType(raw);\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.tokenAddress).toBe(account.toBase58());\n });\n\n it(\"marks transaction as SPL even if decoders can't parse (last-resort SPL by program id)\", async () => {\n const payer = Keypair.generate();\n const bogusIx = new TransactionInstruction({\n programId: TOKEN_PROGRAM_ID,\n keys: [],\n data: Buffer.from([]),\n });\n\n const { raw } = makeSignedRawTx([bogusIx], [payer], payer);\n\n const result = await new TransactionInspector().inspectTransactionType(raw);\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data).toEqual({});\n });\n\n it(\"falls back to STANDARD if the payload is unparseable\", async () => {\n const garbage = new Uint8Array([0xab, 0xad, 0xbe, 0xef]);\n\n const result = await new TransactionInspector().inspectTransactionType(\n garbage,\n );\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.STANDARD);\n expect(result.data).toEqual({});\n });\n\n it(\"fast path: tokenAddress override + SPL instruction, SPL and returns override\", async () => {\n const owner = Keypair.generate();\n const source = Keypair.generate().publicKey;\n const destination = Keypair.generate().publicKey;\n\n const instruction = createTransferInstruction(\n source,\n destination,\n owner.publicKey,\n 1n,\n [],\n TOKEN_PROGRAM_ID,\n );\n const { raw } = makeSignedRawTx([instruction], [owner], owner);\n\n const overrideToken = Keypair.generate().publicKey.toBase58();\n\n const result = await new TransactionInspector().inspectTransactionType(\n raw,\n overrideToken, // tokenAddress override\n );\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.tokenAddress).toBe(overrideToken);\n });\n\n it(\"fast path: createATA override + ATA instruction, SPL and returns override\", async () => {\n const payer = Keypair.generate();\n const owner = Keypair.generate().publicKey;\n const mint = Keypair.generate().publicKey;\n const ata = getAssociatedTokenAddressSync(\n mint,\n owner,\n true,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n\n const instruction = createAssociatedTokenAccountInstruction(\n payer.publicKey,\n ata,\n owner,\n mint,\n TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n const { raw } = makeSignedRawTx([instruction], [payer], payer);\n\n const overrideATA = {\n address: Keypair.generate().publicKey.toBase58(),\n mintAddress: Keypair.generate().publicKey.toBase58(),\n };\n\n const result = await new TransactionInspector().inspectTransactionType(\n raw,\n undefined, // no tokenAddress override\n overrideATA, // createATA override\n );\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.createATA).toEqual(overrideATA);\n });\n\n it(\"fast path: both overrides + SPL instruction, SPL and returns both\", async () => {\n const owner = Keypair.generate();\n const source = Keypair.generate().publicKey;\n const destination = Keypair.generate().publicKey;\n\n const instruction = createTransferInstruction(\n source,\n destination,\n owner.publicKey,\n 7n,\n [],\n TOKEN_PROGRAM_ID,\n );\n const { raw } = makeSignedRawTx([instruction], [owner], owner);\n\n const tokenOverride = Keypair.generate().publicKey.toBase58();\n const ataOverride = {\n address: Keypair.generate().publicKey.toBase58(),\n mintAddress: Keypair.generate().publicKey.toBase58(),\n };\n\n const result = await new TransactionInspector().inspectTransactionType(\n raw,\n tokenOverride,\n ataOverride,\n );\n\n expect(result.transactionType).toBe(SolanaTransactionTypes.SPL);\n expect(result.data.tokenAddress).toBe(tokenOverride);\n expect(result.data.createATA).toEqual(ataOverride);\n });\n});\n"],
5
+ "mappings": "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",
6
6
  "names": ["ASSOCIATED_TOKEN_PROGRAM_ID", "createAssociatedTokenAccountInstruction", "createCloseAccountInstruction", "createInitializeAccount2Instruction", "createInitializeAccount3Instruction", "createInitializeAccountInstruction", "createSyncNativeInstruction", "createTransferCheckedInstruction", "createTransferInstruction", "getAssociatedTokenAddressSync", "TOKEN_2022_PROGRAM_ID", "TOKEN_PROGRAM_ID", "Keypair", "SystemProgram", "Transaction", "TransactionInstruction", "describe", "expect", "it", "DefaultBs58Encoder", "SolanaTransactionTypes", "TransactionInspector", "DUMMY_BLOCKHASH", "makeSignedRawTx", "ixs", "signers", "feePayer", "payer", "tx", "seen", "uniqueSigners", "kp", "k", "dest", "instruction", "raw", "result", "owner", "source", "destination", "mint", "newAccount", "ata", "ata22", "account", "bogusIx", "garbage", "overrideToken", "overrideATA", "tokenOverride", "ataOverride"]
7
7
  }
@@ -0,0 +1,2 @@
1
+ import{TransactionInspector as r}from"../../../app-binder/services/TransactionInspector";class o{static async normaliseMessage(e){return r.normaliseMessage(e)}}export{o as DefaultSolanaMessageNormaliser};
2
+ //# sourceMappingURL=DefaultSolanaMessageNormaliser.js.map
@@ -0,0 +1,7 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../../../../../../src/internal/app-binder/services/utils/DefaultSolanaMessageNormaliser.ts"],
4
+ "sourcesContent": ["import type { NormalizedMessage } from \"@internal/app-binder/services/TransactionInspector\";\nimport { TransactionInspector } from \"@internal/app-binder/services/TransactionInspector\";\n\nexport interface SolanaMessageNormaliserConstructor {\n normaliseMessage(rawBytes: Uint8Array): Promise<NormalizedMessage>;\n}\n\nexport class DefaultSolanaMessageNormaliser {\n static async normaliseMessage(\n rawBytes: Uint8Array,\n ): Promise<NormalizedMessage> {\n return TransactionInspector.normaliseMessage(rawBytes);\n }\n}\n"],
5
+ "mappings": "AACA,OAAS,wBAAAA,MAA4B,qDAM9B,MAAMC,CAA+B,CAC1C,aAAa,iBACXC,EAC4B,CAC5B,OAAOF,EAAqB,iBAAiBE,CAAQ,CACvD,CACF",
6
+ "names": ["TransactionInspector", "DefaultSolanaMessageNormaliser", "rawBytes"]
7
+ }
@@ -0,0 +1,2 @@
1
+ import{Keypair as l,SystemProgram as m,Transaction as b}from"@solana/web3.js";import f from"bs58";import{describe as P,expect as a,it as g}from"vitest";import{DefaultSolanaMessageNormaliser as d}from"./DefaultSolanaMessageNormaliser";const I=f.encode(new Uint8Array(32).fill(170));function K(t,s,u){const n=u??s[0]??l.generate(),o=new b;o.recentBlockhash=I,o.feePayer=n.publicKey,o.add(...t);const e=new Set,r=[n,...s].filter(c=>{const i=c.publicKey.toBase58();return e.has(i)?!1:(e.add(i),!0)});return o.sign(...r),{raw:o.serialize(),payer:n}}P("DefaultSolanaMessageNormaliser",()=>{g("normalises a legacy tx with multiple SystemProgram.transfer instructions preserving order",async()=>{const t=l.generate(),s=[l.generate(),l.generate(),l.generate()],u=1234,n=s.map(r=>m.transfer({fromPubkey:t.publicKey,toPubkey:r.publicKey,lamports:u})),{raw:o}=K(n,[t],t),e=await d.normaliseMessage(o);a(e.compiledInstructions).toHaveLength(n.length);for(let r=0;r<n.length;r++){const c=e.compiledInstructions[r],i=e.allKeys[c.programIdIndex];a(i.equals(m.programId)).toBe(!0);const p=c.accountKeyIndexes.map(y=>e.allKeys[y]);a(p[0].equals(t.publicKey)).toBe(!0),a(p[1].equals(s[r].publicKey)).toBe(!0),a(c.data instanceof Uint8Array).toBe(!0),a(c.data.length).toBeGreaterThan(0)}}),g("can be used via the SolanaMessageNormaliserConstructor interface",async()=>{const t=l.generate(),s=l.generate(),u=m.transfer({fromPubkey:t.publicKey,toPubkey:s.publicKey,lamports:1e3}),{raw:n}=K([u],[t],t),e=await d.normaliseMessage(n);a(e.compiledInstructions).toHaveLength(1);const r=e.compiledInstructions[0],c=e.allKeys[r.programIdIndex];a(c.equals(m.programId)).toBe(!0);const i=r.accountKeyIndexes.map(p=>e.allKeys[p]);a(i[0].equals(t.publicKey)).toBe(!0),a(i[1].equals(s.publicKey)).toBe(!0)}),g("handles single-instruction tx and preserves indices mapping",async()=>{const t=l.generate(),s=l.generate(),n=m.transfer({fromPubkey:t.publicKey,toPubkey:s.publicKey,lamports:5}),{raw:o}=K([n],[t],t),e=await d.normaliseMessage(o);a(Array.isArray(e.allKeys)).toBe(!0),a(e.allKeys.length).toBeGreaterThanOrEqual(3);const r=e.compiledInstructions[0],c=e.allKeys[r.programIdIndex];a(c.equals(m.programId)).toBe(!0);const[i,p]=r.accountKeyIndexes.map(y=>e.allKeys[y]);a(i.equals(t.publicKey)).toBe(!0),a(p.equals(s.publicKey)).toBe(!0)})});
2
+ //# sourceMappingURL=DefaultSolanaMessageNormaliser.test.js.map