@ledgerhq/device-signer-kit-solana 1.6.0 → 1.6.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 (71) hide show
  1. package/lib/cjs/api/SignerSolanaBuilder.js +1 -1
  2. package/lib/cjs/api/SignerSolanaBuilder.js.map +3 -3
  3. package/lib/cjs/api/SolanaToolsBuilder.js +1 -1
  4. package/lib/cjs/api/SolanaToolsBuilder.js.map +3 -3
  5. package/lib/cjs/api/app-binder/SignTransactionDeviceActionTypes.js +1 -1
  6. package/lib/cjs/api/app-binder/SignTransactionDeviceActionTypes.js.map +2 -2
  7. package/lib/cjs/internal/DefaultSignerSolana.test.js +1 -1
  8. package/lib/cjs/internal/DefaultSignerSolana.test.js.map +3 -3
  9. package/lib/cjs/internal/DefaultSolanaTools.test.js +1 -1
  10. package/lib/cjs/internal/DefaultSolanaTools.test.js.map +3 -3
  11. package/lib/cjs/internal/app-binder/SolanaAppBinder.js +1 -1
  12. package/lib/cjs/internal/app-binder/SolanaAppBinder.js.map +2 -2
  13. package/lib/cjs/internal/app-binder/SolanaAppBinder.test.js +1 -1
  14. package/lib/cjs/internal/app-binder/SolanaAppBinder.test.js.map +3 -3
  15. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.js +1 -1
  16. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.js.map +3 -3
  17. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.test.js +1 -1
  18. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.test.js.map +3 -3
  19. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.test.js +1 -1
  20. package/lib/cjs/internal/app-binder/task/BuildTransactionContextTask.test.js.map +3 -3
  21. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.test.js +1 -1
  22. package/lib/cjs/internal/app-binder/task/ProvideTransactionContextTask.test.js.map +3 -3
  23. package/lib/cjs/internal/di.js +1 -1
  24. package/lib/cjs/internal/di.js.map +3 -3
  25. package/lib/cjs/package.json +2 -2
  26. package/lib/esm/api/SignerSolanaBuilder.js +1 -1
  27. package/lib/esm/api/SignerSolanaBuilder.js.map +3 -3
  28. package/lib/esm/api/SolanaToolsBuilder.js +1 -1
  29. package/lib/esm/api/SolanaToolsBuilder.js.map +3 -3
  30. package/lib/esm/api/app-binder/SignTransactionDeviceActionTypes.js.map +2 -2
  31. package/lib/esm/internal/DefaultSignerSolana.test.js +1 -1
  32. package/lib/esm/internal/DefaultSignerSolana.test.js.map +3 -3
  33. package/lib/esm/internal/DefaultSolanaTools.test.js +1 -1
  34. package/lib/esm/internal/DefaultSolanaTools.test.js.map +3 -3
  35. package/lib/esm/internal/app-binder/SolanaAppBinder.js +1 -1
  36. package/lib/esm/internal/app-binder/SolanaAppBinder.js.map +2 -2
  37. package/lib/esm/internal/app-binder/SolanaAppBinder.test.js +1 -1
  38. package/lib/esm/internal/app-binder/SolanaAppBinder.test.js.map +3 -3
  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/task/BuildTransactionContextTask.test.js +1 -1
  44. package/lib/esm/internal/app-binder/task/BuildTransactionContextTask.test.js.map +3 -3
  45. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.test.js +1 -1
  46. package/lib/esm/internal/app-binder/task/ProvideTransactionContextTask.test.js.map +3 -3
  47. package/lib/esm/internal/di.js +1 -1
  48. package/lib/esm/internal/di.js.map +3 -3
  49. package/lib/esm/package.json +2 -2
  50. package/lib/types/api/SignerSolanaBuilder.d.ts.map +1 -1
  51. package/lib/types/api/SolanaToolsBuilder.d.ts.map +1 -1
  52. package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts +1 -2
  53. package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts.map +1 -1
  54. package/lib/types/internal/app-binder/SolanaAppBinder.d.ts.map +1 -1
  55. package/lib/types/internal/app-binder/device-action/SignTransactionDeviceAction.d.ts +7 -1
  56. package/lib/types/internal/app-binder/device-action/SignTransactionDeviceAction.d.ts.map +1 -1
  57. package/lib/types/internal/di.d.ts.map +1 -1
  58. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  59. package/package.json +7 -7
  60. package/lib/cjs/internal/app-binder/services/utils/NullLoggerPublisherService.js +0 -2
  61. package/lib/cjs/internal/app-binder/services/utils/NullLoggerPublisherService.js.map +0 -7
  62. package/lib/cjs/internal/app-binder/services/utils/NullLoggerPublisherService.test.js +0 -2
  63. package/lib/cjs/internal/app-binder/services/utils/NullLoggerPublisherService.test.js.map +0 -7
  64. package/lib/esm/internal/app-binder/services/utils/NullLoggerPublisherService.js +0 -2
  65. package/lib/esm/internal/app-binder/services/utils/NullLoggerPublisherService.js.map +0 -7
  66. package/lib/esm/internal/app-binder/services/utils/NullLoggerPublisherService.test.js +0 -2
  67. package/lib/esm/internal/app-binder/services/utils/NullLoggerPublisherService.test.js.map +0 -7
  68. package/lib/types/internal/app-binder/services/utils/NullLoggerPublisherService.d.ts +0 -3
  69. package/lib/types/internal/app-binder/services/utils/NullLoggerPublisherService.d.ts.map +0 -1
  70. package/lib/types/internal/app-binder/services/utils/NullLoggerPublisherService.test.d.ts +0 -2
  71. package/lib/types/internal/app-binder/services/utils/NullLoggerPublisherService.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 type LoggerPublisherService,\n OpenAppDeviceAction,\n type StateMachineTypes,\n UnknownDAError,\n UserInteractionRequired,\n XStateDeviceAction,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, type Maybe, Right } from \"purify-ts\";\nimport { assign, fromPromise, setup } from \"xstate\";\n\nimport {\n type SignTransactionDAError,\n type SignTransactionDAInput,\n type SignTransactionDAIntermediateValue,\n type SignTransactionDAInternalState,\n type SignTransactionDAOutput,\n signTransactionDAStateSteps,\n} from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { type AppConfiguration } from \"@api/model/AppConfiguration\";\nimport { type Signature } from \"@api/model/Signature\";\nimport {\n type TransactionResolutionContext,\n type UserInputType,\n} from \"@api/model/TransactionResolutionContext\";\nimport { GetAppConfigurationCommand } from \"@internal/app-binder/command/GetAppConfigurationCommand\";\nimport { SignTransactionCommand } from \"@internal/app-binder/command/SignTransactionCommand\";\nimport { type SolanaAppErrorCodes } from \"@internal/app-binder/command/utils/SolanaApplicationErrors\";\nimport { ApplicationChecker } from \"@internal/app-binder/services/ApplicationChecker\";\nimport {\n SolanaTransactionTypes,\n TransactionInspector,\n} from \"@internal/app-binder/services/TransactionInspector\";\nimport { type TxInspectorResult } from \"@internal/app-binder/services/TransactionInspector\";\nimport {\n BuildTransactionContextTask,\n type BuildTransactionContextTaskArgs,\n type SolanaBuildContextResult,\n} from \"@internal/app-binder/task/BuildTransactionContextTask\";\nimport {\n ProvideSolanaTransactionContextTask,\n type ProvideSolanaTransactionContextTaskArgs,\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: ProvideSolanaTransactionContextTaskArgs;\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 let loggerSingleton: LoggerPublisherService | undefined;\n\n const getLoggerInstance = (context: types[\"context\"]) => {\n if (!loggerSingleton) {\n const { loggerFactory } = context.input;\n loggerSingleton = loggerFactory(\"SignTransactionDeviceAction\");\n }\n\n return loggerSingleton;\n };\n\n return setup({\n types: {\n input: {} as types[\"input\"],\n context: {} as types[\"context\"],\n output: {} as types[\"output\"],\n },\n actors: {\n openAppStateMachine: new OpenAppDeviceAction({\n input: { appName: \"Solana\" },\n }).makeStateMachine(internalApi),\n getAppConfig: fromPromise(getAppConfig),\n inspectTransaction: fromPromise(\n ({\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 logInput: ({ context }, params: { step: string }) => {\n getLoggerInstance(context).debug(\n `[makeStateMachine] step ${params.step}`,\n {\n data: { input: context.input },\n },\n );\n },\n\n logInternalState: ({ context }, params: { step: string }) => {\n getLoggerInstance(context).debug(\n `[makeStateMachine] step ${params.step}`,\n {\n data: { internalState: context._internalState },\n },\n );\n },\n },\n }).createMachine({\n /** @xstate-layout N4IgpgJg5mDOIC5QGUCWUB2AVATgQw1jwGMAXVAewwBEwA3VYsAQTMowDoBJDVcvADbJSeUmADEAbQAMAXUSgADhVh92CkAA9EAJgCMADg4BWAGw7jAGhABPRHr3SA7Bx0BONwGYALNOPfvUz1jHQBfUOs0TFwCIjYqWgYmVnIqbl5+IRExKT15JBBlVVSMDW0EfSMzC2s7BDdvHQ5pby9ff0DgsIiQKOx8QhISxMYWeM4AeUUwDGZFRRHk8fEIKjAOVAw6CgBrdYpp2fnhUTAAWRIAC02wGXylFTUqMsQnN1MON2lzK1tEN0MJicOicTlMoM8LXe4Ui6H6sSG7EWYxKHAAwpcwMQdlMZnMFvRRil2AAlOAAVwEpCkcg0RSepQK5T0nmMRmkwR+tX+3iMgVM0mc+j0OgM3Vh0QGcWGhKWqIxWJxh3xyOJVDJsEp1MkeTpjxKLwQLLZzU5NT+CAMeg4rTcBneLN8bx8MN6cJig3GqvGHAA4mBSPi0VQAGboFZrDZbXbrGCB+bBjBhqB3PXFdRM+wGUzeVymaq-OqOMWfe0BHyeNxOPSmV19D3SpGylHsP0BoOh8NgHA4Cg4DiKASiEN9gC2HDjHaT6FTBXpBszRuzuZ0+a5Fr0Hk+HjL2YsLNMtZ69aliISzbVnH98cUieTGq1CuxNPuhX1GdA5R0nh0TRapgMJxC3sBwmgMMVwU8QC3l5Yw63dU8vQvH1ryne8KSpJ8dlyV95w-LRdB-P9AkA4CEB8a0qxzYwnE8H5jW8eDJQRJCkhbNIeFgaYyAbM8MAjDB1k2bY9ijLisVIXjxlnB502eRdRS+Dgc2+c0i2kBoODBUUDA0ytqyPCV4U9GU2MvdJxJ4xCSnEbte37QdhzHMTuMk6z2Bkt85MZT9dHtaRlN8dc6kCALvDBbwzA0jTwqApjjMbc8zJ9ZgQzEHBONcl80wZQ0fyCLSKyA7kjRZa1+UFYFQLFeKpNMokUrS7tMoknCcoXXzyNXa1aO8Txio3SFjC0jwfD8AIghCWr3KShrUVS9KWrIKQdFw995M6-KeqKsiBSaSLIUMYwvgaUFppY+q5VbAAhclUAECBEzETRqVWQSoxE9YACM7oep6wBezy8I2gjyKcbMbQMPqBqLBxPA4HxzD0RpaKhQy3WYkym2S1Fbvux6qGe6k7L7Ach1IEccHHH78f+wHaTndafNB-qId5aGyOBAK3GMQ7aM3KD9HOrHZqutIAAVewYCAwDp17I2EmMByl1AZbloGmcNPrRQRr5gpA8EOHA1daOghoDDg48EIu7G5tbSWKGl2XCYB4me1JxyKecxQVbVl36bW7ytZ-IxK1Usi90+dwaLtAWxT0YXEpoZDUQdp25YfTDMWfDWg8XcKeYR47+rIhwgOaVoxo6SbxQxhK+O9VPfedjAicz0gsLaxm886gvhtZLwYfsQVcz15HvzjoWrcxpPG9bE8baoAShOjUTVBnvjc9yxdeZ0XN-AAoejVXIxVx0vSqxrROG5T+frZF-iSYc8nKfHdf6+khnZO3zrd-3kij6gXhkFZGjhwpWhzNfVids0gLwfu3TuW8OqgxjsNNwlRAGeAcAjMUTgOQjwAryKBl12KcDgUnBB2dsI6kDj-FBbw0EYNLqufuuDpCsnATWRiroMAUBlvAAo5Cb443wsDZm5QAC0pgSpSOaIKeRCiFFOGIbbMWnAeBqEECcMQ7V8LlEaCVRwhs3heErCCSErR0ZCOgWojguIjgEhESDMRWtBSfHDiVMsrhRpmNRpYlRotSHoiofYlUt91QYVILokGzJ-zKVIiVBoAV3CmPQX46E08P4kPMqhBMnYoDRPEfYfwRhB6lyhMpH8wIALHQtpbIydVVFBNybefJlDFSFMNDoIUrhDCALAVpGsgpi6XysffWe4T1GEFco05xmsFLGBFJ8Q+5SnC5lMPlap3xBYGACcnJxnAFrNWmRJTpi4sE1kKhzQxIo3CDIFH4Lwoy9lzzSHjP6-sondzoeUHwUMjYinKV4XpDyRkGU8C8yZHA06qxbkTM5m0PC5muRuBwPUfFpIsRkhpM19kwM4DCv2rdXbtOxAi0GB0Pg7RuYeI2EEtkbLFLszJsy8W2Oscglx+c7QfFFICwxe8jAshNqubZTLIUHI4By0kkSsLkvKMYXeJhDGQnhvoY6e9FU82cGMjeNignIHJMQJgsABHf2QeUAUtKoYlxVdIUOEEPC0QuW4CV+KOAAFF3Y4HlYgK1HwbWAL3vDMwkVumRV0ofcI4QgA */\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 entry: [{ type: \"logInput\", params: { step: \"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: [\n assign({\n _internalState: ({ context, event }) => ({\n ...context._internalState,\n inspectorResult: event.output,\n }),\n }),\n {\n type: \"logInternalState\",\n params: { step: \"OnDoneInspectTransaction\" },\n },\n ],\n },\n onError: {\n target: \"SignTransaction\",\n },\n },\n },\n AfterInspect: {\n always: [\n { target: \"BuildContext\", guard: \"isAnSPLTransaction\" },\n { target: \"SignTransaction\" },\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 loggerFactory: context.input.loggerFactory,\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 type: \"logInternalState\",\n params: { step: \"OnDoneBuildContext\" },\n },\n ],\n },\n onError: {\n target: \"SignTransaction\",\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 loggerFactory: context.input.loggerFactory,\n };\n },\n onDone: {\n target: \"SignTransaction\",\n },\n onError: {\n target: \"SignTransaction\",\n },\n },\n },\n SignTransaction: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n step: signTransactionDAStateSteps.SIGN_TRANSACTION,\n },\n }),\n invoke: {\n id: \"signTransaction\",\n src: \"signTransaction\",\n input: ({ context }) => {\n return {\n derivationPath: context.input.derivationPath,\n serializedTransaction: context.input.transaction,\n userInputType:\n context.input.transactionOptions?.transactionResolutionContext\n ?.userInputType,\n };\n },\n onDone: {\n target: \"SignTransactionResultCheck\",\n actions: [\n assign({\n _internalState: ({ event, context }) => {\n if (!isSuccessCommandResult(event.output))\n return {\n ...context._internalState,\n error: event.output.error,\n };\n\n const data = event.output.data.extract();\n if (\n event.output.data.isJust() &&\n data instanceof Uint8Array\n )\n return {\n ...context._internalState,\n signature: data,\n };\n\n return {\n ...context._internalState,\n error: new UnknownDAError(\"No Signature available\"),\n };\n },\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.SIGN_TRANSACTION,\n },\n }),\n {\n type: \"logInternalState\",\n params: { step: \"OnDoneSignTransaction\" },\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: ProvideSolanaTransactionContextTaskArgs;\n }) =>\n new ProvideSolanaTransactionContextTask(internalApi, arg0.input).run();\n\n const inspectTransaction = async (arg0: {\n serializedTransaction: Uint8Array;\n resolutionContext?: TransactionResolutionContext;\n rpcUrl?: string;\n }) =>\n Promise.resolve(\n new TransactionInspector(arg0.rpcUrl).inspectTransactionType(\n arg0.serializedTransaction,\n arg0.resolutionContext?.tokenAddress,\n arg0.resolutionContext?.createATA,\n ),\n );\n\n const signTransaction = async (arg0: {\n input: {\n derivationPath: string;\n serializedTransaction: Uint8Array;\n userInputType?: UserInputType;\n };\n }) =>\n new SignDataTask(internalApi, {\n commandFactory: (args) =>\n new SignTransactionCommand({\n serializedTransaction: args.chunkedData,\n more: args.more,\n extend: args.extend,\n userInputType: arg0.input.userInputType,\n }),\n derivationPath: arg0.input.derivationPath,\n sendingData: arg0.input.serializedTransaction,\n }).run();\n\n return {\n getAppConfig,\n buildContext,\n provideContext,\n signTransaction,\n inspectTransaction,\n };\n }\n}\n"],
5
- "mappings": "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",
6
- "names": ["SignTransactionDeviceAction_exports", "__export", "SignTransactionDeviceAction", "__toCommonJS", "import_device_management_kit", "import_purify_ts", "import_xstate", "import_SignTransactionDeviceActionTypes", "import_GetAppConfigurationCommand", "import_SignTransactionCommand", "import_ApplicationChecker", "import_TransactionInspector", "import_BuildTransactionContextTask", "import_ProvideTransactionContextTask", "import_SendSignDataTask", "internalApi", "signTransaction", "getAppConfig", "buildContext", "provideContext", "inspectTransaction", "loggerSingleton", "getLoggerInstance", "context", "loggerFactory", "input", "_", "params", "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 type LoggerPublisherService,\n OpenAppDeviceAction,\n type StateMachineTypes,\n UnknownDAError,\n UserInteractionRequired,\n XStateDeviceAction,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, type Maybe, Right } from \"purify-ts\";\nimport { assign, fromPromise, setup } from \"xstate\";\n\nimport {\n type SignTransactionDAError,\n type SignTransactionDAInput,\n type SignTransactionDAIntermediateValue,\n type SignTransactionDAInternalState,\n type SignTransactionDAOutput,\n signTransactionDAStateSteps,\n} from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { type AppConfiguration } from \"@api/model/AppConfiguration\";\nimport { type Signature } from \"@api/model/Signature\";\nimport {\n type TransactionResolutionContext,\n type UserInputType,\n} from \"@api/model/TransactionResolutionContext\";\nimport { GetAppConfigurationCommand } from \"@internal/app-binder/command/GetAppConfigurationCommand\";\nimport { SignTransactionCommand } from \"@internal/app-binder/command/SignTransactionCommand\";\nimport { type SolanaAppErrorCodes } from \"@internal/app-binder/command/utils/SolanaApplicationErrors\";\nimport { ApplicationChecker } from \"@internal/app-binder/services/ApplicationChecker\";\nimport {\n SolanaTransactionTypes,\n TransactionInspector,\n} from \"@internal/app-binder/services/TransactionInspector\";\nimport { type TxInspectorResult } from \"@internal/app-binder/services/TransactionInspector\";\nimport {\n BuildTransactionContextTask,\n type BuildTransactionContextTaskArgs,\n type SolanaBuildContextResult,\n} from \"@internal/app-binder/task/BuildTransactionContextTask\";\nimport {\n ProvideSolanaTransactionContextTask,\n type ProvideSolanaTransactionContextTaskArgs,\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: ProvideSolanaTransactionContextTaskArgs;\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 private readonly _loggerFactory: (tag: string) => LoggerPublisherService;\n\n constructor(args: {\n input: SignTransactionDAInput;\n inspect?: boolean;\n loggerFactory: (tag: string) => LoggerPublisherService;\n }) {\n super({\n input: args.input,\n inspect: args.inspect,\n logger: args.loggerFactory(\"SignTransactionDeviceAction\"),\n });\n this._loggerFactory = args.loggerFactory;\n }\n\n makeStateMachine(\n internalApi: InternalApi,\n ): DeviceActionStateMachine<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n > {\n type types = StateMachineTypes<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n >;\n\n const {\n signTransaction,\n getAppConfig,\n buildContext,\n provideContext,\n inspectTransaction,\n } = this.extractDependencies(internalApi);\n\n return setup({\n types: {\n input: {} as types[\"input\"],\n context: {} as types[\"context\"],\n output: {} as types[\"output\"],\n },\n actors: {\n openAppStateMachine: new OpenAppDeviceAction({\n input: { appName: \"Solana\" },\n }).makeStateMachine(internalApi),\n getAppConfig: fromPromise(getAppConfig),\n inspectTransaction: fromPromise(\n ({\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 N4IgpgJg5mDOIC5QGUCWUB2AVATgQw1jwGMAXVAewwBEwA3VYsAQTMowDoBJDVcvADbJSeUmADEAbQAMAXUSgADhVh92CkAA9EAJgCMADg4BWAGw7jAGhABPRHr3SA7Bx0BONwGYALNOPfvUz1jHQBfUOs0TFwCIjYqWgYmVnIqbl5+IRExKT15JBBlVVSMDW0EfSMzC2s7BDdvHQ5pby9ff0DgsIiQKOx8QhISxMYWeM4AeUUwDGZFRRHk8fEIKjAOVAw6CgBrdYpp2fnhUTAAWRIAC02wGXylFTUqMsQnN1MON2lzK1tEN0MJicOicTlMoM8LXe4Ui6H6sSG7EWYxKHAAwpcwMQdlMZnMFvRRil2AAlOAAVwEpCkcg0RSepQK5T0nmMRmkwR+tX+3iMgVM0mc+j0OgM3Vh0QGcWGhKWqIxWJxh3xyOJVDJsEp1MkeTpjxKLwQLLZzU5NT+CAMeg4rTcBneLN8bx8MN6cJig3GqvGHAA4mBSPi0VQAGboFZrDZbXbrGCB+bBjBhqB3PXFdRM+wGUzeVymaq-OqOMWfe0BHyeNxOPSmV19D3SpGylHsP0BoOh8NgHA4Cg4DiKASiEN9gC2HDjHaT6FTBXpBszRuzuZ0+a5Fr0Hk+HjL2YsLNMtZ69aliISzbVnH98cUieTGq1CuxNPuhX1GdA5R0nh0TRapgMJxC3sBwmgMMVwU8QC3l5Yw63dU8vQvH1ryne8KSpJ8dlyV95w-LRdB-P9AkA4CEB8a0qxzYwnE8H5jW8eDJQRJCkhbNIeFgaYyAbM8MAjDB1k2bY9ijLisVIXjxlnB502eRdRS+Dgc2+c0i2kBoODBUUDA0ytqyPCV4U9GU2MvdJxJ4xCSnEbte37QdhzHMTuMk6z2Bkt85MZT9dHtaRlN8dc6kCALvDBbwzA0jTwqApjjMbc8zJ9ZgQzEHBONcl80wZQ0fyCLSKyA7kjRZa1+UFYFQLFeKpNMokUrS7tMoknCcoXXzyNXa1aO8Txio3SFjC0jwfD8AIghCWr3KShrUVS9KWrIKQdFw995M6-KeqKsiBSaSLIUMYwvgaUFppY+q5VbAAhclUAECBEzETRqVWQSoxE9YACM7oep6wBezy8I2gjyKcbMbQMPqBqLBxPA4HxzD0RpaKhQy3WYkym2S1Fbvux6qGe6k7L7Ach1IEccHHH78f+wHaTndafNB-qId5aGyOBAK3GMQ7aM3KD9HOrHZqutIAAVewYCAwDp17I2EmMByl1AZbloGmcNPrRQRr5gpA8EOHA1daOghoDDg48EIu7G5tbSWKGl2XCYB4me1JxyKecxQVbVl36bW7ytZ-IxK1Usi90+dwaLtAWxT0YXEpoZDUQdp25YfTDMWfDWg8XcKeYR47+rIhwgOaVoxo6SbxQxhK+O9VPfedjAicz0gsLaxm886gvhtZLwYfsQVcz15HvzjoWrcxpPG9bE8baoAShOjUTVBnvjc9yxdeZ0XN-AAoejVXIxVx0vSqxrROG5T+frZF-iSYc8nKfHdf6+khnZO3zrd-3kij6gXhkFZGjhwpWhzNfVids0gLwfu3TuW8OqgxjsNNwlRAGeAcAjMUTgOQjwAryKBl12KcDgUnBB2dsI6kDj-FBbw0EYNLqufuuDpCsnATWRiroMAUBlvAAo5Cb443wsDZm5QAC0pgSpSOaIKeRCiFFOGIbbMWnAeBqEECcMQ7V8LlEaCVRwhs3heErCCSErR0ZCOgWojguIjgEhESDMRWtBSfHDiVMsrhRpmNRpYlRotSHoiofYlUt91QYVILokGzJ-zKVIiVBoAV3CmPQX46E08P4kPMqhBMnYoDRPEfYfwRhB6lyhMpH8wIALHQtpbIydVVFBNybefJlDFSFMNDoIUrhDCALAVpGsgpi6XysffWe4T1GEFco05xmsFLGBFJ8Q+5SnC5lMPlap3xBYGACcnJxnAFrNWmRJTpi4sE1kKhzQxIo3CDIFH4Lwoy9lzzSHjP6-sondzoeUHwUMjYinKV4XpDyRkGU8C8yZHA06qxbkTM5m0PC5muRuBwPUfFpIsRkhpM19kwM4DCv2rdXbtOxAi0GB0Pg7RuYeI2EEtkbLFLszJsy8W2Oscglx+c7QfFFICwxe8jAshNqubZTLIUHI4By0kkSsLkvKMYXeJhDGQnhvoY6e9FU82cGMjeNignIHJMQJgsABHf2QeUAUtKoYlxVdIUOEEPC0QuW4CV+KOAAFF3Y4HlYgK1HwbWAL3vDMwkVumRV0ofcI4QgA */\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: \"SignTransaction\",\n },\n },\n },\n AfterInspect: {\n always: [\n { target: \"BuildContext\", guard: \"isAnSPLTransaction\" },\n { target: \"SignTransaction\" },\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 loggerFactory: this._loggerFactory,\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: 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 onError: {\n target: \"SignTransaction\",\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 loggerFactory: this._loggerFactory,\n };\n },\n onDone: {\n target: \"SignTransaction\",\n },\n onError: {\n target: \"SignTransaction\",\n },\n },\n },\n SignTransaction: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n step: signTransactionDAStateSteps.SIGN_TRANSACTION,\n },\n }),\n invoke: {\n id: \"signTransaction\",\n src: \"signTransaction\",\n input: ({ context }) => {\n return {\n derivationPath: context.input.derivationPath,\n serializedTransaction: context.input.transaction,\n userInputType:\n context.input.transactionOptions?.transactionResolutionContext\n ?.userInputType,\n };\n },\n onDone: {\n target: \"SignTransactionResultCheck\",\n actions: 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 (event.output.data.isJust() && data instanceof Uint8Array)\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 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: ProvideSolanaTransactionContextTaskArgs;\n }) =>\n new ProvideSolanaTransactionContextTask(internalApi, arg0.input).run();\n\n const inspectTransaction = async (arg0: {\n serializedTransaction: Uint8Array;\n resolutionContext?: TransactionResolutionContext;\n rpcUrl?: string;\n }) =>\n Promise.resolve(\n new TransactionInspector(arg0.rpcUrl).inspectTransactionType(\n arg0.serializedTransaction,\n arg0.resolutionContext?.tokenAddress,\n arg0.resolutionContext?.createATA,\n ),\n );\n\n const signTransaction = async (arg0: {\n input: {\n derivationPath: string;\n serializedTransaction: Uint8Array;\n userInputType?: UserInputType;\n };\n }) =>\n new SignDataTask(internalApi, {\n commandFactory: (args) =>\n new SignTransactionCommand({\n serializedTransaction: args.chunkedData,\n more: args.more,\n extend: args.extend,\n userInputType: arg0.input.userInputType,\n }),\n derivationPath: arg0.input.derivationPath,\n sendingData: arg0.input.serializedTransaction,\n }).run();\n\n return {\n getAppConfig,\n buildContext,\n provideContext,\n signTransaction,\n inspectTransaction,\n };\n }\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["SignTransactionDeviceAction_exports", "__export", "SignTransactionDeviceAction", "__toCommonJS", "import_device_management_kit", "import_purify_ts", "import_xstate", "import_SignTransactionDeviceActionTypes", "import_GetAppConfigurationCommand", "import_SignTransactionCommand", "import_ApplicationChecker", "import_TransactionInspector", "import_BuildTransactionContextTask", "import_ProvideTransactionContextTask", "import_SendSignDataTask", "args", "internalApi", "signTransaction", "getAppConfig", "buildContext", "provideContext", "inspectTransaction", "input", "context", "_", "event", "error", "inspectorData", "data", "arg0"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var e=require("@ledgerhq/device-management-kit"),u=require("purify-ts"),t=require("vitest"),n=require("../../../api/app-binder/SignTransactionDeviceActionTypes"),T=require("../../app-binder/device-action/__test-utils__/testDeviceActionStates"),m=require("../../app-binder/services/TransactionInspector"),R=require("./__test-utils__/makeInternalApi"),g=require("./SignTransactionDeviceAction");const I="44'/501'/0'/0'",v=new Uint8Array([222,173,190,239]),C={getSolanaContext:t.vi.fn()},P=()=>({debug:t.vi.fn(),info:t.vi.fn(),warn:t.vi.fn(),error:t.vi.fn(),subscribers:new Map}),D=t.vi.fn(()=>P());let o,A,d,N,l,S;function y(){return{getAppConfig:A,buildContext:d,provideContext:N,signTransaction:l,inspectTransaction:S}}(0,t.describe)("SignTransactionDeviceAction (Solana)",()=>{(0,t.beforeEach)(()=>{o=(0,R.makeDeviceActionInternalApiMock)(),A=t.vi.fn(),d=t.vi.fn(),N=t.vi.fn(),l=t.vi.fn(),S=t.vi.fn().mockResolvedValue({transactionType:m.SolanaTransactionTypes.SPL,data:{tokenAddress:null,createATA:!1}})}),(0,t.it)("happy path (skip open): getAppConfig -> inspect -> build -> provide -> sign",()=>new Promise((s,c)=>{o.getDeviceSessionState.mockReturnValue({sessionStateType:e.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:e.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:e.DeviceModelId.NANO_X,isSecureConnectionAllowed:!0}),A.mockResolvedValue((0,e.CommandResultFactory)({data:{}})),S.mockResolvedValue({transactionType:m.SolanaTransactionTypes.SPL});const a={tlvDescriptor:new Uint8Array([1]),trustedNamePKICertificate:{keyUsageNumber:0,payload:new Uint8Array([1])},loadersResults:[]};d.mockResolvedValue(a),N.mockResolvedValue(u.Nothing);const i=new Uint8Array([170,187]);l.mockResolvedValue((0,e.CommandResultFactory)({data:(0,u.Just)(i)}));const r={derivationPath:I,transaction:v,transactionOptions:{skipOpenApp:!0},contextModule:C,loggerFactory:D},p=new g.SignTransactionDeviceAction({input:r});t.vi.spyOn(p,"extractDependencies").mockReturnValue(y());const V=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:n.signTransactionDAStateSteps.GET_APP_CONFIG},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:n.signTransactionDAStateSteps.INSPECT_TRANSACTION},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:n.signTransactionDAStateSteps.BUILD_TRANSACTION_CONTEXT},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:n.signTransactionDAStateSteps.PROVIDE_TRANSACTION_CONTEXT},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.SignTransaction,step:n.signTransactionDAStateSteps.SIGN_TRANSACTION},status:e.DeviceActionStatus.Pending},{output:i,status:e.DeviceActionStatus.Completed}];(0,T.testDeviceActionStates)(p,V,o,{onDone:s,onError:c})})),(0,t.it)("inspectTransaction rejects, still signs (fallback)",()=>new Promise((s,c)=>{o.getDeviceSessionState.mockReturnValue({sessionStateType:e.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:e.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:e.DeviceModelId.NANO_X,isSecureConnectionAllowed:!0}),A.mockResolvedValue((0,e.CommandResultFactory)({data:{}})),S.mockRejectedValue(new e.InvalidStatusWordError("inspErr"));const a=new Uint8Array([17,34]);l.mockResolvedValue((0,e.CommandResultFactory)({data:(0,u.Just)(a)}));const i=new g.SignTransactionDeviceAction({input:{derivationPath:I,transaction:v,transactionOptions:{skipOpenApp:!0},contextModule:C,loggerFactory:D}});t.vi.spyOn(i,"extractDependencies").mockReturnValue(y());const r=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:n.signTransactionDAStateSteps.GET_APP_CONFIG},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:n.signTransactionDAStateSteps.INSPECT_TRANSACTION},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.SignTransaction,step:n.signTransactionDAStateSteps.SIGN_TRANSACTION},status:e.DeviceActionStatus.Pending},{output:a,status:e.DeviceActionStatus.Completed}];(0,T.testDeviceActionStates)(i,r,o,{onDone:()=>{expect(d).not.toHaveBeenCalled(),expect(N).not.toHaveBeenCalled(),s()},onError:c})})),(0,t.it)("buildContext throws, still signs (fallback)",()=>new Promise((s,c)=>{o.getDeviceSessionState.mockReturnValue({sessionStateType:e.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:e.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:e.DeviceModelId.NANO_X,isSecureConnectionAllowed:!0}),A.mockResolvedValue((0,e.CommandResultFactory)({data:{}})),S.mockResolvedValue({transactionType:m.SolanaTransactionTypes.SPL}),d.mockRejectedValue(new e.InvalidStatusWordError("bldErr"));const a=new Uint8Array([202,254]);l.mockResolvedValue((0,e.CommandResultFactory)({data:(0,u.Just)(a)}));const i=new g.SignTransactionDeviceAction({input:{derivationPath:I,transaction:v,transactionOptions:{skipOpenApp:!0},contextModule:C,loggerFactory:D}});t.vi.spyOn(i,"extractDependencies").mockReturnValue(y());const r=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:n.signTransactionDAStateSteps.GET_APP_CONFIG},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:n.signTransactionDAStateSteps.INSPECT_TRANSACTION},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:n.signTransactionDAStateSteps.BUILD_TRANSACTION_CONTEXT},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.SignTransaction,step:n.signTransactionDAStateSteps.SIGN_TRANSACTION},status:e.DeviceActionStatus.Pending},{output:a,status:e.DeviceActionStatus.Completed}];(0,T.testDeviceActionStates)(i,r,o,{onDone:s,onError:c})})),(0,t.it)("provideContext rejects, still signs (fallback)",()=>new Promise((s,c)=>{o.getDeviceSessionState.mockReturnValue({sessionStateType:e.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:e.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:e.DeviceModelId.NANO_X,isSecureConnectionAllowed:!0}),A.mockResolvedValue((0,e.CommandResultFactory)({data:{}})),S.mockResolvedValue({transactionType:m.SolanaTransactionTypes.SPL});const a={tlvDescriptor:new Uint8Array([1]),trustedNamePKICertificate:{keyUsageNumber:0,payload:new Uint8Array([2])},loadersResults:[]};d.mockResolvedValue(a),N.mockRejectedValue(new e.InvalidStatusWordError("provErr"));const i=new Uint8Array([51]);l.mockResolvedValue((0,e.CommandResultFactory)({data:(0,u.Just)(i)}));const r=new g.SignTransactionDeviceAction({input:{derivationPath:I,transaction:v,transactionOptions:{skipOpenApp:!0},contextModule:C,loggerFactory:D}});t.vi.spyOn(r,"extractDependencies").mockReturnValue(y());const p=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:n.signTransactionDAStateSteps.GET_APP_CONFIG},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:n.signTransactionDAStateSteps.INSPECT_TRANSACTION},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:n.signTransactionDAStateSteps.BUILD_TRANSACTION_CONTEXT},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:n.signTransactionDAStateSteps.PROVIDE_TRANSACTION_CONTEXT},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.SignTransaction,step:n.signTransactionDAStateSteps.SIGN_TRANSACTION},status:e.DeviceActionStatus.Pending},{output:i,status:e.DeviceActionStatus.Completed}];(0,T.testDeviceActionStates)(r,p,o,{onDone:()=>{expect(d).toHaveBeenCalledTimes(1),expect(N).toHaveBeenCalledTimes(1),expect(l).toHaveBeenCalledTimes(1),s()},onError:c})})),(0,t.it)("failure in provideContext still signs",()=>new Promise((s,c)=>{o.getDeviceSessionState.mockReturnValue({sessionStateType:e.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:e.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:e.DeviceModelId.NANO_X,isSecureConnectionAllowed:!0}),A.mockResolvedValue((0,e.CommandResultFactory)({data:{}})),S.mockResolvedValue({transactionType:m.SolanaTransactionTypes.SPL}),d.mockResolvedValue({tlvDescriptor:new Uint8Array([2]),trustedNamePKICertificate:{keyUsageNumber:0,payload:new Uint8Array},loadersResults:[]}),N.mockResolvedValue((0,u.Just)((0,e.CommandResultFactory)({error:new e.InvalidStatusWordError("ctxErr")})));const a=new Uint8Array([254]);l.mockResolvedValue((0,e.CommandResultFactory)({data:(0,u.Just)(a)}));const i={derivationPath:I,transaction:v,transactionOptions:{skipOpenApp:!0},contextModule:C,loggerFactory:D},r=new g.SignTransactionDeviceAction({input:i});t.vi.spyOn(r,"extractDependencies").mockReturnValue(y());const p=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:n.signTransactionDAStateSteps.GET_APP_CONFIG},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:n.signTransactionDAStateSteps.INSPECT_TRANSACTION},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:n.signTransactionDAStateSteps.BUILD_TRANSACTION_CONTEXT},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:n.signTransactionDAStateSteps.PROVIDE_TRANSACTION_CONTEXT},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.SignTransaction,step:n.signTransactionDAStateSteps.SIGN_TRANSACTION},status:e.DeviceActionStatus.Pending},{output:a,status:e.DeviceActionStatus.Completed}];(0,T.testDeviceActionStates)(r,p,o,{onDone:s,onError:c})})),(0,t.it)("buildContext throws \u2192 error",()=>new Promise((s,c)=>{o.getDeviceSessionState.mockReturnValue({sessionStateType:e.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:e.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:e.DeviceModelId.NANO_X,isSecureConnectionAllowed:!0}),A.mockResolvedValue((0,e.CommandResultFactory)({data:{}})),S.mockResolvedValue({transactionType:m.SolanaTransactionTypes.SPL}),d.mockRejectedValue(new e.InvalidStatusWordError("bldErr"));const a=new Uint8Array([171,205]);l.mockResolvedValue((0,e.CommandResultFactory)({data:(0,u.Just)(a)}));const i={derivationPath:I,transaction:v,transactionOptions:{skipOpenApp:!0},contextModule:C,loggerFactory:D},r=new g.SignTransactionDeviceAction({input:i});t.vi.spyOn(r,"extractDependencies").mockReturnValue(y());const p=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:n.signTransactionDAStateSteps.GET_APP_CONFIG},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:n.signTransactionDAStateSteps.INSPECT_TRANSACTION},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:n.signTransactionDAStateSteps.BUILD_TRANSACTION_CONTEXT},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.SignTransaction,step:n.signTransactionDAStateSteps.SIGN_TRANSACTION},status:e.DeviceActionStatus.Pending},{output:a,status:e.DeviceActionStatus.Completed}];(0,T.testDeviceActionStates)(r,p,o,{onDone:s,onError:c})}))});
1
+ "use strict";var e=require("@ledgerhq/device-management-kit"),u=require("purify-ts"),t=require("vitest"),n=require("../../../api/app-binder/SignTransactionDeviceActionTypes"),S=require("../../app-binder/device-action/__test-utils__/testDeviceActionStates"),m=require("../../app-binder/services/TransactionInspector"),R=require("./__test-utils__/makeInternalApi"),N=require("./SignTransactionDeviceAction");const I="44'/501'/0'/0'",v=new Uint8Array([222,173,190,239]),C=()=>({debug:t.vi.fn(),info:t.vi.fn(),warn:t.vi.fn(),error:t.vi.fn(),subscribers:[]}),D={getSolanaContext:t.vi.fn()};let o,A,d,g,l,T;function y(){return{getAppConfig:A,buildContext:d,provideContext:g,signTransaction:l,inspectTransaction:T}}(0,t.describe)("SignTransactionDeviceAction (Solana)",()=>{(0,t.beforeEach)(()=>{o=(0,R.makeDeviceActionInternalApiMock)(),A=t.vi.fn(),d=t.vi.fn(),g=t.vi.fn(),l=t.vi.fn(),T=t.vi.fn().mockResolvedValue({transactionType:m.SolanaTransactionTypes.SPL,data:{tokenAddress:null,createATA:!1}})}),(0,t.it)("happy path (skip open): getAppConfig -> inspect -> build -> provide -> sign",()=>new Promise((s,c)=>{o.getDeviceSessionState.mockReturnValue({sessionStateType:e.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:e.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:e.DeviceModelId.NANO_X,isSecureConnectionAllowed:!0}),A.mockResolvedValue((0,e.CommandResultFactory)({data:{}})),T.mockResolvedValue({transactionType:m.SolanaTransactionTypes.SPL});const a={tlvDescriptor:new Uint8Array([1]),trustedNamePKICertificate:{keyUsageNumber:0,payload:new Uint8Array([1])},loadersResults:[]};d.mockResolvedValue(a),g.mockResolvedValue(u.Nothing);const i=new Uint8Array([170,187]);l.mockResolvedValue((0,e.CommandResultFactory)({data:(0,u.Just)(i)}));const r={derivationPath:I,transaction:v,transactionOptions:{skipOpenApp:!0},contextModule:D},p=new N.SignTransactionDeviceAction({input:r,loggerFactory:C});t.vi.spyOn(p,"extractDependencies").mockReturnValue(y());const V=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:n.signTransactionDAStateSteps.GET_APP_CONFIG},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:n.signTransactionDAStateSteps.INSPECT_TRANSACTION},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:n.signTransactionDAStateSteps.BUILD_TRANSACTION_CONTEXT},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:n.signTransactionDAStateSteps.PROVIDE_TRANSACTION_CONTEXT},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.SignTransaction,step:n.signTransactionDAStateSteps.SIGN_TRANSACTION},status:e.DeviceActionStatus.Pending},{output:i,status:e.DeviceActionStatus.Completed}];(0,S.testDeviceActionStates)(p,V,o,{onDone:s,onError:c})})),(0,t.it)("inspectTransaction rejects, still signs (fallback)",()=>new Promise((s,c)=>{o.getDeviceSessionState.mockReturnValue({sessionStateType:e.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:e.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:e.DeviceModelId.NANO_X,isSecureConnectionAllowed:!0}),A.mockResolvedValue((0,e.CommandResultFactory)({data:{}})),T.mockRejectedValue(new e.InvalidStatusWordError("inspErr"));const a=new Uint8Array([17,34]);l.mockResolvedValue((0,e.CommandResultFactory)({data:(0,u.Just)(a)}));const i=new N.SignTransactionDeviceAction({input:{derivationPath:I,transaction:v,transactionOptions:{skipOpenApp:!0},contextModule:D},loggerFactory:C});t.vi.spyOn(i,"extractDependencies").mockReturnValue(y());const r=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:n.signTransactionDAStateSteps.GET_APP_CONFIG},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:n.signTransactionDAStateSteps.INSPECT_TRANSACTION},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.SignTransaction,step:n.signTransactionDAStateSteps.SIGN_TRANSACTION},status:e.DeviceActionStatus.Pending},{output:a,status:e.DeviceActionStatus.Completed}];(0,S.testDeviceActionStates)(i,r,o,{onDone:()=>{expect(d).not.toHaveBeenCalled(),expect(g).not.toHaveBeenCalled(),s()},onError:c})})),(0,t.it)("buildContext throws, still signs (fallback)",()=>new Promise((s,c)=>{o.getDeviceSessionState.mockReturnValue({sessionStateType:e.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:e.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:e.DeviceModelId.NANO_X,isSecureConnectionAllowed:!0}),A.mockResolvedValue((0,e.CommandResultFactory)({data:{}})),T.mockResolvedValue({transactionType:m.SolanaTransactionTypes.SPL}),d.mockRejectedValue(new e.InvalidStatusWordError("bldErr"));const a=new Uint8Array([202,254]);l.mockResolvedValue((0,e.CommandResultFactory)({data:(0,u.Just)(a)}));const i=new N.SignTransactionDeviceAction({input:{derivationPath:I,transaction:v,transactionOptions:{skipOpenApp:!0},contextModule:D},loggerFactory:C});t.vi.spyOn(i,"extractDependencies").mockReturnValue(y());const r=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:n.signTransactionDAStateSteps.GET_APP_CONFIG},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:n.signTransactionDAStateSteps.INSPECT_TRANSACTION},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:n.signTransactionDAStateSteps.BUILD_TRANSACTION_CONTEXT},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.SignTransaction,step:n.signTransactionDAStateSteps.SIGN_TRANSACTION},status:e.DeviceActionStatus.Pending},{output:a,status:e.DeviceActionStatus.Completed}];(0,S.testDeviceActionStates)(i,r,o,{onDone:s,onError:c})})),(0,t.it)("provideContext rejects, still signs (fallback)",()=>new Promise((s,c)=>{o.getDeviceSessionState.mockReturnValue({sessionStateType:e.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:e.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:e.DeviceModelId.NANO_X,isSecureConnectionAllowed:!0}),A.mockResolvedValue((0,e.CommandResultFactory)({data:{}})),T.mockResolvedValue({transactionType:m.SolanaTransactionTypes.SPL});const a={tlvDescriptor:new Uint8Array([1]),trustedNamePKICertificate:{keyUsageNumber:0,payload:new Uint8Array([2])},loadersResults:[]};d.mockResolvedValue(a),g.mockRejectedValue(new e.InvalidStatusWordError("provErr"));const i=new Uint8Array([51]);l.mockResolvedValue((0,e.CommandResultFactory)({data:(0,u.Just)(i)}));const r=new N.SignTransactionDeviceAction({input:{derivationPath:I,transaction:v,transactionOptions:{skipOpenApp:!0},contextModule:D},loggerFactory:C});t.vi.spyOn(r,"extractDependencies").mockReturnValue(y());const p=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:n.signTransactionDAStateSteps.GET_APP_CONFIG},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:n.signTransactionDAStateSteps.INSPECT_TRANSACTION},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:n.signTransactionDAStateSteps.BUILD_TRANSACTION_CONTEXT},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:n.signTransactionDAStateSteps.PROVIDE_TRANSACTION_CONTEXT},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.SignTransaction,step:n.signTransactionDAStateSteps.SIGN_TRANSACTION},status:e.DeviceActionStatus.Pending},{output:i,status:e.DeviceActionStatus.Completed}];(0,S.testDeviceActionStates)(r,p,o,{onDone:()=>{expect(d).toHaveBeenCalledTimes(1),expect(g).toHaveBeenCalledTimes(1),expect(l).toHaveBeenCalledTimes(1),s()},onError:c})})),(0,t.it)("failure in provideContext still signs",()=>new Promise((s,c)=>{o.getDeviceSessionState.mockReturnValue({sessionStateType:e.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:e.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:e.DeviceModelId.NANO_X,isSecureConnectionAllowed:!0}),A.mockResolvedValue((0,e.CommandResultFactory)({data:{}})),T.mockResolvedValue({transactionType:m.SolanaTransactionTypes.SPL}),d.mockResolvedValue({tlvDescriptor:new Uint8Array([2]),trustedNamePKICertificate:{keyUsageNumber:0,payload:new Uint8Array},loadersResults:[]}),g.mockResolvedValue((0,u.Just)((0,e.CommandResultFactory)({error:new e.InvalidStatusWordError("ctxErr")})));const a=new Uint8Array([254]);l.mockResolvedValue((0,e.CommandResultFactory)({data:(0,u.Just)(a)}));const i={derivationPath:I,transaction:v,transactionOptions:{skipOpenApp:!0},contextModule:D},r=new N.SignTransactionDeviceAction({input:i,loggerFactory:C});t.vi.spyOn(r,"extractDependencies").mockReturnValue(y());const p=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:n.signTransactionDAStateSteps.GET_APP_CONFIG},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:n.signTransactionDAStateSteps.INSPECT_TRANSACTION},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:n.signTransactionDAStateSteps.BUILD_TRANSACTION_CONTEXT},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:n.signTransactionDAStateSteps.PROVIDE_TRANSACTION_CONTEXT},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.SignTransaction,step:n.signTransactionDAStateSteps.SIGN_TRANSACTION},status:e.DeviceActionStatus.Pending},{output:a,status:e.DeviceActionStatus.Completed}];(0,S.testDeviceActionStates)(r,p,o,{onDone:s,onError:c})})),(0,t.it)("buildContext throws \u2192 error",()=>new Promise((s,c)=>{o.getDeviceSessionState.mockReturnValue({sessionStateType:e.DeviceSessionStateType.ReadyWithoutSecureChannel,deviceStatus:e.DeviceStatus.CONNECTED,installedApps:[],currentApp:{name:"Solana",version:"1.4.1"},deviceModelId:e.DeviceModelId.NANO_X,isSecureConnectionAllowed:!0}),A.mockResolvedValue((0,e.CommandResultFactory)({data:{}})),T.mockResolvedValue({transactionType:m.SolanaTransactionTypes.SPL}),d.mockRejectedValue(new e.InvalidStatusWordError("bldErr"));const a=new Uint8Array([171,205]);l.mockResolvedValue((0,e.CommandResultFactory)({data:(0,u.Just)(a)}));const i={derivationPath:I,transaction:v,transactionOptions:{skipOpenApp:!0},contextModule:D},r=new N.SignTransactionDeviceAction({input:i,loggerFactory:C});t.vi.spyOn(r,"extractDependencies").mockReturnValue(y());const p=[{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:n.signTransactionDAStateSteps.GET_APP_CONFIG},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:n.signTransactionDAStateSteps.INSPECT_TRANSACTION},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.None,step:n.signTransactionDAStateSteps.BUILD_TRANSACTION_CONTEXT},status:e.DeviceActionStatus.Pending},{intermediateValue:{requiredUserInteraction:e.UserInteractionRequired.SignTransaction,step:n.signTransactionDAStateSteps.SIGN_TRANSACTION},status:e.DeviceActionStatus.Pending},{output:a,status:e.DeviceActionStatus.Completed}];(0,S.testDeviceActionStates)(r,p,o,{onDone:s,onError:c})}))});
2
2
  //# sourceMappingURL=SignTransactionDeviceAction.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/device-action/SignTransactionDeviceAction.test.ts"],
4
- "sourcesContent": ["/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n CommandResultFactory,\n type DeviceActionState,\n DeviceActionStatus,\n DeviceModelId,\n DeviceSessionStateType,\n DeviceStatus,\n InvalidStatusWordError,\n type LoggerPublisherService,\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\nconst makeLoggerService = (): LoggerPublisherService =>\n ({\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: new Map(),\n }) as unknown as LoggerPublisherService;\n\nconst loggerFactoryStub: SignTransactionDAInput[\"loggerFactory\"] = vi.fn(() =>\n makeLoggerService(),\n);\n\nlet apiMock: ReturnType<typeof makeDeviceActionInternalApiMock>;\nlet getAppConfigMock: ReturnType<typeof vi.fn>;\nlet buildContextMock: ReturnType<typeof vi.fn>;\nlet provideContextMock: ReturnType<typeof vi.fn>;\nlet signMock: ReturnType<typeof vi.fn>;\nlet inspectTransactionMock: ReturnType<typeof vi.fn>;\n\nfunction extractDeps() {\n return {\n getAppConfig: getAppConfigMock,\n buildContext: buildContextMock,\n provideContext: provideContextMock,\n signTransaction: signMock,\n inspectTransaction: inspectTransactionMock,\n };\n}\n\ndescribe(\"SignTransactionDeviceAction (Solana)\", () => {\n beforeEach(() => {\n apiMock = makeDeviceActionInternalApiMock();\n getAppConfigMock = vi.fn();\n buildContextMock = vi.fn();\n provideContextMock = vi.fn();\n signMock = vi.fn();\n inspectTransactionMock = vi.fn().mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n data: { tokenAddress: null, createATA: false },\n });\n });\n\n it(\"happy path (skip open): getAppConfig -> inspect -> build -> provide -> sign\", () =>\n new Promise<void>((resolve, reject) => {\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.1\" },\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: true,\n });\n\n getAppConfigMock.mockResolvedValue(CommandResultFactory({ data: {} }));\n inspectTransactionMock.mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n });\n\n const ctx: SolanaBuildContextResult = {\n 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 input: SignTransactionDAInput = {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n transactionOptions: { skipOpenApp: true },\n contextModule: contextModuleStub,\n loggerFactory: loggerFactoryStub,\n };\n\n const action = new SignTransactionDeviceAction({ input });\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(\"inspectTransaction rejects, still signs (fallback)\", () =>\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\n // InspectTransaction fails, machine transitions to SignTransaction\n inspectTransactionMock.mockRejectedValue(\n new InvalidStatusWordError(\"inspErr\"),\n );\n\n const sig = new Uint8Array([0x11, 0x22]);\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 loggerFactory: loggerFactoryStub,\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 // signTransaction (fallback)\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(action, expected, apiMock, {\n onDone: () => {\n // we should not try to build/provide context if inspection failed\n expect(buildContextMock).not.toHaveBeenCalled();\n expect(provideContextMock).not.toHaveBeenCalled();\n resolve();\n },\n onError: reject,\n });\n }));\n\n it(\"buildContext throws, still signs (fallback)\", () =>\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 // BuildContext fails, machine transitions to SignTransaction\n buildContextMock.mockRejectedValue(new InvalidStatusWordError(\"bldErr\"));\n\n const sig = new Uint8Array([0xca, 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 loggerFactory: loggerFactoryStub,\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 (fails, but we still saw the pending step)\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.BUILD_TRANSACTION_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // signTransaction (fallback)\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(\"provideContext rejects, still signs (fallback)\", () =>\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([0x01]),\n trustedNamePKICertificate: {\n keyUsageNumber: 0,\n payload: new Uint8Array([0x02]),\n },\n loadersResults: [],\n };\n buildContextMock.mockResolvedValue(ctx);\n\n // ProvideContext rejects, machine transitions to SignTransaction\n provideContextMock.mockRejectedValue(\n new InvalidStatusWordError(\"provErr\"),\n );\n\n const sig = new Uint8Array([0x33]);\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 loggerFactory: loggerFactoryStub,\n },\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 (fallback)\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(action, expected, apiMock, {\n onDone: () => {\n expect(buildContextMock).toHaveBeenCalledTimes(1);\n expect(provideContextMock).toHaveBeenCalledTimes(1);\n expect(signMock).toHaveBeenCalledTimes(1);\n resolve();\n },\n onError: reject,\n });\n }));\n\n it(\"failure in provideContext still signs\", () =>\n new Promise<void>((resolve, reject) => {\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.1\" },\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: true,\n });\n\n getAppConfigMock.mockResolvedValue(CommandResultFactory({ data: {} }));\n inspectTransactionMock.mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n });\n\n buildContextMock.mockResolvedValue({\n tlvDescriptor: new Uint8Array([2]),\n trustedNamePKICertificate: {\n keyUsageNumber: 0,\n payload: new Uint8Array(),\n },\n loadersResults: [],\n });\n provideContextMock.mockResolvedValue(\n Just(\n CommandResultFactory({ error: new InvalidStatusWordError(\"ctxErr\") }),\n ),\n );\n const sig = new Uint8Array([0xfe]);\n signMock.mockResolvedValue(CommandResultFactory({ data: Just(sig) }));\n\n const input: SignTransactionDAInput = {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n transactionOptions: { skipOpenApp: true },\n contextModule: contextModuleStub,\n loggerFactory: loggerFactoryStub,\n };\n\n const action = new SignTransactionDeviceAction({ input });\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 sig = new Uint8Array([0xab, 0xcd]);\n signMock.mockResolvedValue(CommandResultFactory({ data: Just(sig) }));\n\n const input: SignTransactionDAInput = {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n transactionOptions: { skipOpenApp: true },\n contextModule: contextModuleStub,\n loggerFactory: loggerFactoryStub,\n };\n\n const action = new SignTransactionDeviceAction({ input });\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 // signTransaction (fallback)\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"],
5
- "mappings": "aAEA,IAAAA,EAUO,2CACPC,EAA8B,qBAC9BC,EAA6C,kBAE7CC,EAKO,4DACPC,EAAuC,oFACvCC,EAAuC,8DAGvCC,EAAgD,4CAChDC,EAA4C,yCAE5C,MAAMC,EAAoB,iBACpBC,EAAY,IAAI,WAAW,CAAC,IAAM,IAAM,IAAM,GAAI,CAAC,EAEnDC,EAAmC,CACvC,iBAAkB,KAAG,GAAG,CAC1B,EAEMC,EAAoB,KACvB,CACC,MAAO,KAAG,GAAG,EACb,KAAM,KAAG,GAAG,EACZ,KAAM,KAAG,GAAG,EACZ,MAAO,KAAG,GAAG,EACb,YAAa,IAAI,GACnB,GAEIC,EAA6D,KAAG,GAAG,IACvED,EAAkB,CACpB,EAEA,IAAIE,EACAC,EACAC,EACAC,EACAC,EACAC,EAEJ,SAASC,GAAc,CACrB,MAAO,CACL,aAAcL,EACd,aAAcC,EACd,eAAgBC,EAChB,gBAAiBC,EACjB,mBAAoBC,CACtB,CACF,IAEA,YAAS,uCAAwC,IAAM,IACrD,cAAW,IAAM,CACfL,KAAU,mCAAgC,EAC1CC,EAAmB,KAAG,GAAG,EACzBC,EAAmB,KAAG,GAAG,EACzBC,EAAqB,KAAG,GAAG,EAC3BC,EAAW,KAAG,GAAG,EACjBC,EAAyB,KAAG,GAAG,EAAE,kBAAkB,CACjD,gBAAiB,yBAAuB,IACxC,KAAM,CAAE,aAAc,KAAM,UAAW,EAAM,CAC/C,CAAC,CACH,CAAC,KAED,MAAG,8EAA+E,IAChF,IAAI,QAAc,CAACE,EAASC,IAAW,CACrCR,EAAQ,sBAAsB,gBAAgB,CAC5C,iBAAkB,yBAAuB,0BACzC,aAAc,eAAa,UAC3B,cAAe,CAAC,EAChB,WAAY,CAAE,KAAM,SAAU,QAAS,OAAQ,EAC/C,cAAe,gBAAc,OAC7B,0BAA2B,EAC7B,CAAC,EAEDC,EAAiB,qBAAkB,wBAAqB,CAAE,KAAM,CAAC,CAAE,CAAC,CAAC,EACrEI,EAAuB,kBAAkB,CACvC,gBAAiB,yBAAuB,GAC1C,CAAC,EAED,MAAMI,EAAgC,CACpC,cAAe,IAAI,WAAW,CAAC,CAAC,CAAC,EACjC,0BAA2B,CACzB,eAAgB,EAChB,QAAS,IAAI,WAAW,CAAC,CAAI,CAAC,CAChC,EACA,eAAgB,CAAC,CACnB,EACAP,EAAiB,kBAAkBO,CAAG,EACtCN,EAAmB,kBAAkB,SAAO,EAE5C,MAAMO,EAAY,IAAI,WAAW,CAAC,IAAM,GAAI,CAAC,EAC7CN,EAAS,qBACP,wBAAqB,CAAE,QAAM,QAAKM,CAAS,CAAE,CAAC,CAChD,EAEA,MAAMC,EAAgC,CACpC,eAAgBhB,EAChB,YAAaC,EACb,mBAAoB,CAAE,YAAa,EAAK,EACxC,cAAeC,EACf,cAAeE,CACjB,EAEMa,EAAS,IAAI,8BAA4B,CAAE,MAAAD,CAAM,CAAC,EACxD,KAAG,MAAMC,EAAQ,qBAAqB,EAAE,gBAAgBN,EAAY,CAAC,EAErE,MAAMO,EAAW,CAEf,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,8BAA4B,cACpC,EACA,OAAQ,qBAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,8BAA4B,mBACpC,EACA,OAAQ,qBAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,8BAA4B,yBACpC,EACA,OAAQ,qBAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,8BAA4B,2BACpC,EACA,OAAQ,qBAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,gBACjD,KAAM,8BAA4B,gBACpC,EACA,OAAQ,qBAAmB,OAC7B,EAEA,CAAE,OAAQH,EAAW,OAAQ,qBAAmB,SAAU,CAC5D,KAMA,0BAKEE,EAAQC,EAAUb,EAAS,CAAE,OAAQO,EAAS,QAASC,CAAO,CAAC,CACnE,CAAC,CAAC,KAEJ,MAAG,qDAAsD,IACvD,IAAI,QAAc,CAACD,EAASC,IAAW,CACrCR,EAAQ,sBAAsB,gBAAgB,CAC5C,iBAAkB,yBAAuB,0BACzC,aAAc,eAAa,UAC3B,cAAe,CAAC,EAChB,WAAY,CAAE,KAAM,SAAU,QAAS,OAAQ,EAC/C,cAAe,gBAAc,OAC7B,0BAA2B,EAC7B,CAAC,EAEDC,EAAiB,qBAAkB,wBAAqB,CAAE,KAAM,CAAC,CAAE,CAAC,CAAC,EAGrEI,EAAuB,kBACrB,IAAI,yBAAuB,SAAS,CACtC,EAEA,MAAMS,EAAM,IAAI,WAAW,CAAC,GAAM,EAAI,CAAC,EACvCV,EAAS,qBAAkB,wBAAqB,CAAE,QAAM,QAAKU,CAAG,CAAE,CAAC,CAAC,EAEpE,MAAMF,EAAS,IAAI,8BAA4B,CAC7C,MAAO,CACL,eAAgBjB,EAChB,YAAaC,EACb,mBAAoB,CAAE,YAAa,EAAK,EACxC,cAAeC,EACf,cAAeE,CACjB,CACF,CAAC,EACD,KAAG,MAAMa,EAAQ,qBAAqB,EAAE,gBAAgBN,EAAY,CAAC,EAErE,MAAMO,EAAW,CAEf,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,8BAA4B,cACpC,EACA,OAAQ,qBAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,8BAA4B,mBACpC,EACA,OAAQ,qBAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,gBACjD,KAAM,8BAA4B,gBACpC,EACA,OAAQ,qBAAmB,OAC7B,EAEA,CAAE,OAAQC,EAAK,OAAQ,qBAAmB,SAAU,CACtD,KAMA,0BAAuBF,EAAQC,EAAUb,EAAS,CAChD,OAAQ,IAAM,CAEZ,OAAOE,CAAgB,EAAE,IAAI,iBAAiB,EAC9C,OAAOC,CAAkB,EAAE,IAAI,iBAAiB,EAChDI,EAAQ,CACV,EACA,QAASC,CACX,CAAC,CACH,CAAC,CAAC,KAEJ,MAAG,8CAA+C,IAChD,IAAI,QAAc,CAACD,EAASC,IAAW,CACrCR,EAAQ,sBAAsB,gBAAgB,CAC5C,iBAAkB,yBAAuB,0BACzC,aAAc,eAAa,UAC3B,cAAe,CAAC,EAChB,WAAY,CAAE,KAAM,SAAU,QAAS,OAAQ,EAC/C,cAAe,gBAAc,OAC7B,0BAA2B,EAC7B,CAAC,EAEDC,EAAiB,qBAAkB,wBAAqB,CAAE,KAAM,CAAC,CAAE,CAAC,CAAC,EACrEI,EAAuB,kBAAkB,CACvC,gBAAiB,yBAAuB,GAC1C,CAAC,EAGDH,EAAiB,kBAAkB,IAAI,yBAAuB,QAAQ,CAAC,EAEvE,MAAMY,EAAM,IAAI,WAAW,CAAC,IAAM,GAAI,CAAC,EACvCV,EAAS,qBAAkB,wBAAqB,CAAE,QAAM,QAAKU,CAAG,CAAE,CAAC,CAAC,EAEpE,MAAMF,EAAS,IAAI,8BAA4B,CAC7C,MAAO,CACL,eAAgBjB,EAChB,YAAaC,EACb,mBAAoB,CAAE,YAAa,EAAK,EACxC,cAAeC,EACf,cAAeE,CACjB,CACF,CAAC,EACD,KAAG,MAAMa,EAAQ,qBAAqB,EAAE,gBAAgBN,EAAY,CAAC,EAErE,MAAMO,EAAW,CAEf,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,8BAA4B,cACpC,EACA,OAAQ,qBAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,8BAA4B,mBACpC,EACA,OAAQ,qBAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,8BAA4B,yBACpC,EACA,OAAQ,qBAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,gBACjD,KAAM,8BAA4B,gBACpC,EACA,OAAQ,qBAAmB,OAC7B,EAEA,CAAE,OAAQC,EAAK,OAAQ,qBAAmB,SAAU,CACtD,KAMA,0BAKEF,EAAQC,EAAUb,EAAS,CAAE,OAAQO,EAAS,QAASC,CAAO,CAAC,CACnE,CAAC,CAAC,KAEJ,MAAG,iDAAkD,IACnD,IAAI,QAAc,CAACD,EAASC,IAAW,CACrCR,EAAQ,sBAAsB,gBAAgB,CAC5C,iBAAkB,yBAAuB,0BACzC,aAAc,eAAa,UAC3B,cAAe,CAAC,EAChB,WAAY,CAAE,KAAM,SAAU,QAAS,OAAQ,EAC/C,cAAe,gBAAc,OAC7B,0BAA2B,EAC7B,CAAC,EAEDC,EAAiB,qBAAkB,wBAAqB,CAAE,KAAM,CAAC,CAAE,CAAC,CAAC,EACrEI,EAAuB,kBAAkB,CACvC,gBAAiB,yBAAuB,GAC1C,CAAC,EAED,MAAMI,EAAgC,CACpC,cAAe,IAAI,WAAW,CAAC,CAAI,CAAC,EACpC,0BAA2B,CACzB,eAAgB,EAChB,QAAS,IAAI,WAAW,CAAC,CAAI,CAAC,CAChC,EACA,eAAgB,CAAC,CACnB,EACAP,EAAiB,kBAAkBO,CAAG,EAGtCN,EAAmB,kBACjB,IAAI,yBAAuB,SAAS,CACtC,EAEA,MAAMW,EAAM,IAAI,WAAW,CAAC,EAAI,CAAC,EACjCV,EAAS,qBAAkB,wBAAqB,CAAE,QAAM,QAAKU,CAAG,CAAE,CAAC,CAAC,EAEpE,MAAMF,EAAS,IAAI,8BAA4B,CAC7C,MAAO,CACL,eAAgBjB,EAChB,YAAaC,EACb,mBAAoB,CAAE,YAAa,EAAK,EACxC,cAAeC,EACf,cAAeE,CACjB,CACF,CAAC,EACD,KAAG,MAAMa,EAAQ,qBAAqB,EAAE,gBAAgBN,EAAY,CAAC,EAErE,MAAMO,EAAW,CAEf,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,8BAA4B,cACpC,EACA,OAAQ,qBAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,8BAA4B,mBACpC,EACA,OAAQ,qBAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,8BAA4B,yBACpC,EACA,OAAQ,qBAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,8BAA4B,2BACpC,EACA,OAAQ,qBAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,gBACjD,KAAM,8BAA4B,gBACpC,EACA,OAAQ,qBAAmB,OAC7B,EAEA,CAAE,OAAQC,EAAK,OAAQ,qBAAmB,SAAU,CACtD,KAMA,0BAAuBF,EAAQC,EAAUb,EAAS,CAChD,OAAQ,IAAM,CACZ,OAAOE,CAAgB,EAAE,sBAAsB,CAAC,EAChD,OAAOC,CAAkB,EAAE,sBAAsB,CAAC,EAClD,OAAOC,CAAQ,EAAE,sBAAsB,CAAC,EACxCG,EAAQ,CACV,EACA,QAASC,CACX,CAAC,CACH,CAAC,CAAC,KAEJ,MAAG,wCAAyC,IAC1C,IAAI,QAAc,CAACD,EAASC,IAAW,CACrCR,EAAQ,sBAAsB,gBAAgB,CAC5C,iBAAkB,yBAAuB,0BACzC,aAAc,eAAa,UAC3B,cAAe,CAAC,EAChB,WAAY,CAAE,KAAM,SAAU,QAAS,OAAQ,EAC/C,cAAe,gBAAc,OAC7B,0BAA2B,EAC7B,CAAC,EAEDC,EAAiB,qBAAkB,wBAAqB,CAAE,KAAM,CAAC,CAAE,CAAC,CAAC,EACrEI,EAAuB,kBAAkB,CACvC,gBAAiB,yBAAuB,GAC1C,CAAC,EAEDH,EAAiB,kBAAkB,CACjC,cAAe,IAAI,WAAW,CAAC,CAAC,CAAC,EACjC,0BAA2B,CACzB,eAAgB,EAChB,QAAS,IAAI,UACf,EACA,eAAgB,CAAC,CACnB,CAAC,EACDC,EAAmB,qBACjB,WACE,wBAAqB,CAAE,MAAO,IAAI,yBAAuB,QAAQ,CAAE,CAAC,CACtE,CACF,EACA,MAAMW,EAAM,IAAI,WAAW,CAAC,GAAI,CAAC,EACjCV,EAAS,qBAAkB,wBAAqB,CAAE,QAAM,QAAKU,CAAG,CAAE,CAAC,CAAC,EAEpE,MAAMH,EAAgC,CACpC,eAAgBhB,EAChB,YAAaC,EACb,mBAAoB,CAAE,YAAa,EAAK,EACxC,cAAeC,EACf,cAAeE,CACjB,EAEMa,EAAS,IAAI,8BAA4B,CAAE,MAAAD,CAAM,CAAC,EACxD,KAAG,MAAMC,EAAQ,qBAAqB,EAAE,gBAAgBN,EAAY,CAAC,EAErE,MAAMO,EAAW,CAEf,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,8BAA4B,cACpC,EACA,OAAQ,qBAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,8BAA4B,mBACpC,EACA,OAAQ,qBAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,8BAA4B,yBACpC,EACA,OAAQ,qBAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,8BAA4B,2BACpC,EACA,OAAQ,qBAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,gBACjD,KAAM,8BAA4B,gBACpC,EACA,OAAQ,qBAAmB,OAC7B,EAEA,CAAE,OAAQC,EAAK,OAAQ,qBAAmB,SAAU,CACtD,KAMA,0BAKEF,EAAQC,EAAUb,EAAS,CAAE,OAAQO,EAAS,QAASC,CAAO,CAAC,CACnE,CAAC,CAAC,KAEJ,MAAG,mCAA+B,IAChC,IAAI,QAAc,CAACD,EAASC,IAAW,CACrCR,EAAQ,sBAAsB,gBAAgB,CAC5C,iBAAkB,yBAAuB,0BACzC,aAAc,eAAa,UAC3B,cAAe,CAAC,EAChB,WAAY,CAAE,KAAM,SAAU,QAAS,OAAQ,EAC/C,cAAe,gBAAc,OAC7B,0BAA2B,EAC7B,CAAC,EAEDC,EAAiB,qBAAkB,wBAAqB,CAAE,KAAM,CAAC,CAAE,CAAC,CAAC,EACrEI,EAAuB,kBAAkB,CACvC,gBAAiB,yBAAuB,GAC1C,CAAC,EAEDH,EAAiB,kBAAkB,IAAI,yBAAuB,QAAQ,CAAC,EAEvE,MAAMY,EAAM,IAAI,WAAW,CAAC,IAAM,GAAI,CAAC,EACvCV,EAAS,qBAAkB,wBAAqB,CAAE,QAAM,QAAKU,CAAG,CAAE,CAAC,CAAC,EAEpE,MAAMH,EAAgC,CACpC,eAAgBhB,EAChB,YAAaC,EACb,mBAAoB,CAAE,YAAa,EAAK,EACxC,cAAeC,EACf,cAAeE,CACjB,EAEMa,EAAS,IAAI,8BAA4B,CAAE,MAAAD,CAAM,CAAC,EACxD,KAAG,MAAMC,EAAQ,qBAAqB,EAAE,gBAAgBN,EAAY,CAAC,EAErE,MAAMO,EAAW,CAEf,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,8BAA4B,cACpC,EACA,OAAQ,qBAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,8BAA4B,mBACpC,EACA,OAAQ,qBAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,KACjD,KAAM,8BAA4B,yBACpC,EACA,OAAQ,qBAAmB,OAC7B,EAEA,CACE,kBAAmB,CACjB,wBAAyB,0BAAwB,gBACjD,KAAM,8BAA4B,gBACpC,EACA,OAAQ,qBAAmB,OAC7B,EAEA,CAAE,OAAQC,EAAK,OAAQ,qBAAmB,SAAU,CACtD,KAMA,0BAKEF,EAAQC,EAAUb,EAAS,CAAE,OAAQO,EAAS,QAASC,CAAO,CAAC,CACnE,CAAC,CAAC,CACN,CAAC",
6
- "names": ["import_device_management_kit", "import_purify_ts", "import_vitest", "import_SignTransactionDeviceActionTypes", "import_testDeviceActionStates", "import_TransactionInspector", "import_makeInternalApi", "import_SignTransactionDeviceAction", "defaultDerivation", "exampleTx", "contextModuleStub", "makeLoggerService", "loggerFactoryStub", "apiMock", "getAppConfigMock", "buildContextMock", "provideContextMock", "signMock", "inspectTransactionMock", "extractDeps", "resolve", "reject", "ctx", "signature", "input", "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 mockLoggerFactory = () => ({\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n});\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 input: SignTransactionDAInput = {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n transactionOptions: { skipOpenApp: true },\n contextModule: contextModuleStub,\n };\n\n const action = new SignTransactionDeviceAction({\n input,\n loggerFactory: mockLoggerFactory,\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(\"inspectTransaction rejects, still signs (fallback)\", () =>\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\n // InspectTransaction fails, machine transitions to SignTransaction\n inspectTransactionMock.mockRejectedValue(\n new InvalidStatusWordError(\"inspErr\"),\n );\n\n const sig = new Uint8Array([0x11, 0x22]);\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 },\n loggerFactory: mockLoggerFactory,\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 // signTransaction (fallback)\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(action, expected, apiMock, {\n onDone: () => {\n // we should not try to build/provide context if inspection failed\n expect(buildContextMock).not.toHaveBeenCalled();\n expect(provideContextMock).not.toHaveBeenCalled();\n resolve();\n },\n onError: reject,\n });\n }));\n\n it(\"buildContext throws, still signs (fallback)\", () =>\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 // BuildContext fails, machine transitions to SignTransaction\n buildContextMock.mockRejectedValue(new InvalidStatusWordError(\"bldErr\"));\n\n const sig = new Uint8Array([0xca, 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 },\n loggerFactory: mockLoggerFactory,\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 (fails, but we still saw the pending step)\n {\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n step: signTransactionDAStateSteps.BUILD_TRANSACTION_CONTEXT,\n },\n status: DeviceActionStatus.Pending,\n },\n // signTransaction (fallback)\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(\"provideContext rejects, still signs (fallback)\", () =>\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([0x01]),\n trustedNamePKICertificate: {\n keyUsageNumber: 0,\n payload: new Uint8Array([0x02]),\n },\n loadersResults: [],\n };\n buildContextMock.mockResolvedValue(ctx);\n\n // ProvideContext rejects, machine transitions to SignTransaction\n provideContextMock.mockRejectedValue(\n new InvalidStatusWordError(\"provErr\"),\n );\n\n const sig = new Uint8Array([0x33]);\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 },\n loggerFactory: mockLoggerFactory,\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 (fallback)\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(action, expected, apiMock, {\n onDone: () => {\n expect(buildContextMock).toHaveBeenCalledTimes(1);\n expect(provideContextMock).toHaveBeenCalledTimes(1);\n expect(signMock).toHaveBeenCalledTimes(1);\n resolve();\n },\n onError: reject,\n });\n }));\n\n it(\"failure in provideContext still signs\", () =>\n new Promise<void>((resolve, reject) => {\n apiMock.getDeviceSessionState.mockReturnValue({\n sessionStateType: DeviceSessionStateType.ReadyWithoutSecureChannel,\n deviceStatus: DeviceStatus.CONNECTED,\n installedApps: [],\n currentApp: { name: \"Solana\", version: \"1.4.1\" },\n deviceModelId: DeviceModelId.NANO_X,\n isSecureConnectionAllowed: true,\n });\n\n getAppConfigMock.mockResolvedValue(CommandResultFactory({ data: {} }));\n inspectTransactionMock.mockResolvedValue({\n transactionType: SolanaTransactionTypes.SPL,\n });\n\n buildContextMock.mockResolvedValue({\n tlvDescriptor: new Uint8Array([2]),\n trustedNamePKICertificate: {\n keyUsageNumber: 0,\n payload: new Uint8Array(),\n },\n loadersResults: [],\n });\n provideContextMock.mockResolvedValue(\n Just(\n CommandResultFactory({ error: new InvalidStatusWordError(\"ctxErr\") }),\n ),\n );\n const sig = new Uint8Array([0xfe]);\n signMock.mockResolvedValue(CommandResultFactory({ data: Just(sig) }));\n\n const input: SignTransactionDAInput = {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n transactionOptions: { skipOpenApp: true },\n contextModule: contextModuleStub,\n };\n\n const action = new SignTransactionDeviceAction({\n input,\n loggerFactory: mockLoggerFactory,\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 sig = new Uint8Array([0xab, 0xcd]);\n signMock.mockResolvedValue(CommandResultFactory({ data: Just(sig) }));\n\n const input: SignTransactionDAInput = {\n derivationPath: defaultDerivation,\n transaction: exampleTx,\n transactionOptions: { skipOpenApp: true },\n contextModule: contextModuleStub,\n };\n\n const action = new SignTransactionDeviceAction({\n input,\n loggerFactory: mockLoggerFactory,\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 // signTransaction (fallback)\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"],
5
+ "mappings": "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",
6
+ "names": ["import_device_management_kit", "import_purify_ts", "import_vitest", "import_SignTransactionDeviceActionTypes", "import_testDeviceActionStates", "import_TransactionInspector", "import_makeInternalApi", "import_SignTransactionDeviceAction", "defaultDerivation", "exampleTx", "mockLoggerFactory", "contextModuleStub", "apiMock", "getAppConfigMock", "buildContextMock", "provideContextMock", "signMock", "inspectTransactionMock", "extractDeps", "resolve", "reject", "ctx", "signature", "input", "action", "expected", "sig"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var o=require("@ledgerhq/device-management-kit"),n=require("purify-ts"),e=require("vitest"),i=require("../../app-binder/command/GetChallengeCommand"),u=require("../../app-binder/services/utils/NullLoggerPublisherService"),r=require("./BuildTransactionContextTask");const a={getSolanaContext:e.vi.fn()},d={contextModule:a,loggerFactory:u.NullLoggerPublisherService,options:{tokenAddress:"someAddress",createATA:void 0}},l={tlvDescriptor:new Uint8Array([1,2,3]),trustedNamePKICertificate:{payload:new Uint8Array([170,187]),keyUsageNumber:1},loadersResults:[]};let t;(0,e.describe)("BuildTransactionContextTask",()=>{(0,e.beforeEach)(()=>{e.vi.resetAllMocks(),t={getDeviceSessionState:e.vi.fn().mockReturnValue({deviceModelId:o.DeviceModelId.NANO_X}),sendCommand:e.vi.fn().mockResolvedValue({status:o.CommandResultStatus.Success,data:{challenge:"someChallenge"}})}}),(0,e.it)("returns context successfully when challenge command succeeds",async()=>{a.getSolanaContext.mockResolvedValue((0,n.Right)(l));const c=await new r.BuildTransactionContextTask(t,d).run();(0,e.expect)(t.sendCommand).toHaveBeenCalledWith(e.expect.any(i.GetChallengeCommand)),(0,e.expect)(a.getSolanaContext).toHaveBeenCalledWith({deviceModelId:o.DeviceModelId.NANO_X,tokenAddress:"someAddress",challenge:"someChallenge",createATA:void 0}),(0,e.expect)(c).toEqual({tlvDescriptor:l.tlvDescriptor,trustedNamePKICertificate:l.trustedNamePKICertificate,loadersResults:[]})}),(0,e.it)("throws if challenge command fails",async()=>{t.sendCommand.mockResolvedValue({status:o.CommandResultStatus.Error,data:{}}),a.getSolanaContext.mockResolvedValue((0,n.Right)(l));const s=new r.BuildTransactionContextTask(t,d);await(0,e.expect)(s.run()).rejects.toThrow("Failed to get challenge from device")}),(0,e.it)("throws if getSolanaContext returns Left",async()=>{const s=new Error("Solana context failure");a.getSolanaContext.mockResolvedValue((0,n.Left)(s));const c=new r.BuildTransactionContextTask(t,d);await(0,e.expect)(c.run()).rejects.toThrow("Solana context failure")})});
1
+ "use strict";var o=require("@ledgerhq/device-management-kit"),n=require("purify-ts"),e=require("vitest"),i=require("../../app-binder/command/GetChallengeCommand"),l=require("./BuildTransactionContextTask");const u=()=>({debug:e.vi.fn(),info:e.vi.fn(),warn:e.vi.fn(),error:e.vi.fn(),subscribers:[]}),a={getSolanaContext:e.vi.fn()},d={contextModule:a,loggerFactory:u,options:{tokenAddress:"someAddress",createATA:void 0}},r={tlvDescriptor:new Uint8Array([1,2,3]),trustedNamePKICertificate:{payload:new Uint8Array([170,187]),keyUsageNumber:1},loadersResults:[]};let t;(0,e.describe)("BuildTransactionContextTask",()=>{(0,e.beforeEach)(()=>{e.vi.resetAllMocks(),t={getDeviceSessionState:e.vi.fn().mockReturnValue({deviceModelId:o.DeviceModelId.NANO_X}),sendCommand:e.vi.fn().mockResolvedValue({status:o.CommandResultStatus.Success,data:{challenge:"someChallenge"}})}}),(0,e.it)("returns context successfully when challenge command succeeds",async()=>{a.getSolanaContext.mockResolvedValue((0,n.Right)(r));const c=await new l.BuildTransactionContextTask(t,d).run();(0,e.expect)(t.sendCommand).toHaveBeenCalledWith(e.expect.any(i.GetChallengeCommand)),(0,e.expect)(a.getSolanaContext).toHaveBeenCalledWith({deviceModelId:o.DeviceModelId.NANO_X,tokenAddress:"someAddress",challenge:"someChallenge",createATA:void 0}),(0,e.expect)(c).toEqual({tlvDescriptor:r.tlvDescriptor,trustedNamePKICertificate:r.trustedNamePKICertificate,loadersResults:[]})}),(0,e.it)("throws if challenge command fails",async()=>{t.sendCommand.mockResolvedValue({status:o.CommandResultStatus.Error,data:{}}),a.getSolanaContext.mockResolvedValue((0,n.Right)(r));const s=new l.BuildTransactionContextTask(t,d);await(0,e.expect)(s.run()).rejects.toThrow("Failed to get challenge from device")}),(0,e.it)("throws if getSolanaContext returns Left",async()=>{const s=new Error("Solana context failure");a.getSolanaContext.mockResolvedValue((0,n.Left)(s));const c=new l.BuildTransactionContextTask(t,d);await(0,e.expect)(c.run()).rejects.toThrow("Solana context failure")})});
2
2
  //# sourceMappingURL=BuildTransactionContextTask.test.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/task/BuildTransactionContextTask.test.ts"],
4
- "sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n CommandResultStatus,\n DeviceModelId,\n type InternalApi,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { GetChallengeCommand } from \"@internal/app-binder/command/GetChallengeCommand\";\nimport { NullLoggerPublisherService } from \"@internal/app-binder/services/utils/NullLoggerPublisherService\";\n\nimport {\n BuildTransactionContextTask,\n type SolanaBuildContextResult,\n} from \"./BuildTransactionContextTask\";\n\nconst contextModuleMock: ContextModule = {\n getSolanaContext: vi.fn(),\n} as unknown as ContextModule;\n\nconst defaultArgs = {\n contextModule: contextModuleMock,\n loggerFactory: NullLoggerPublisherService,\n options: {\n tokenAddress: \"someAddress\",\n createATA: undefined,\n },\n};\n\nconst solanaContextRightPayload = {\n tlvDescriptor: new Uint8Array([1, 2, 3]),\n trustedNamePKICertificate: {\n payload: new Uint8Array([0xaa, 0xbb]),\n keyUsageNumber: 1,\n },\n loadersResults: [], // required by the task's return type\n} as const;\n\nlet apiMock: InternalApi;\n\ndescribe(\"BuildTransactionContextTask\", () => {\n beforeEach(() => {\n vi.resetAllMocks();\n\n apiMock = {\n getDeviceSessionState: vi\n .fn()\n .mockReturnValue({ deviceModelId: DeviceModelId.NANO_X }),\n sendCommand: vi.fn().mockResolvedValue({\n status: CommandResultStatus.Success,\n data: { challenge: \"someChallenge\" },\n }),\n } as unknown as InternalApi;\n });\n\n it(\"returns context successfully when challenge command succeeds\", async () => {\n (contextModuleMock.getSolanaContext as any).mockResolvedValue(\n Right(solanaContextRightPayload),\n );\n\n const task = new BuildTransactionContextTask(apiMock, defaultArgs);\n const result = await task.run();\n\n // challenge is fetched\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n expect.any(GetChallengeCommand),\n );\n\n // getSolanaContext called with challenge\n expect(contextModuleMock.getSolanaContext).toHaveBeenCalledWith({\n deviceModelId: DeviceModelId.NANO_X,\n tokenAddress: \"someAddress\",\n challenge: \"someChallenge\",\n createATA: undefined,\n });\n\n // matches SolanaBuildContextResult shape\n expect(result).toEqual<SolanaBuildContextResult>({\n tlvDescriptor: solanaContextRightPayload.tlvDescriptor,\n trustedNamePKICertificate:\n solanaContextRightPayload.trustedNamePKICertificate,\n loadersResults: [],\n });\n });\n\n it(\"throws if challenge command fails\", async () => {\n (apiMock.sendCommand as any).mockResolvedValue({\n status: CommandResultStatus.Error,\n data: {},\n });\n (contextModuleMock.getSolanaContext as any).mockResolvedValue(\n Right(solanaContextRightPayload),\n );\n\n const task = new BuildTransactionContextTask(apiMock, defaultArgs);\n\n await expect(task.run()).rejects.toThrow(\n \"Failed to get challenge from device\",\n );\n });\n\n it(\"throws if getSolanaContext returns Left\", async () => {\n const error = new Error(\"Solana context failure\");\n (contextModuleMock.getSolanaContext as any).mockResolvedValue(Left(error));\n\n const task = new BuildTransactionContextTask(apiMock, defaultArgs);\n\n await expect(task.run()).rejects.toThrow(\"Solana context failure\");\n });\n});\n"],
5
- "mappings": "aAIA,IAAAA,EAIO,2CACPC,EAA4B,qBAC5BC,EAAqD,kBAErDC,EAAoC,4DACpCC,EAA2C,0EAE3CC,EAGO,yCAEP,MAAMC,EAAmC,CACvC,iBAAkB,KAAG,GAAG,CAC1B,EAEMC,EAAc,CAClB,cAAeD,EACf,cAAe,6BACf,QAAS,CACP,aAAc,cACd,UAAW,MACb,CACF,EAEME,EAA4B,CAChC,cAAe,IAAI,WAAW,CAAC,EAAG,EAAG,CAAC,CAAC,EACvC,0BAA2B,CACzB,QAAS,IAAI,WAAW,CAAC,IAAM,GAAI,CAAC,EACpC,eAAgB,CAClB,EACA,eAAgB,CAAC,CACnB,EAEA,IAAIC,KAEJ,YAAS,8BAA+B,IAAM,IAC5C,cAAW,IAAM,CACf,KAAG,cAAc,EAEjBA,EAAU,CACR,sBAAuB,KACpB,GAAG,EACH,gBAAgB,CAAE,cAAe,gBAAc,MAAO,CAAC,EAC1D,YAAa,KAAG,GAAG,EAAE,kBAAkB,CACrC,OAAQ,sBAAoB,QAC5B,KAAM,CAAE,UAAW,eAAgB,CACrC,CAAC,CACH,CACF,CAAC,KAED,MAAG,+DAAgE,SAAY,CAC5EH,EAAkB,iBAAyB,qBAC1C,SAAME,CAAyB,CACjC,EAGA,MAAME,EAAS,MADF,IAAI,8BAA4BD,EAASF,CAAW,EACvC,IAAI,KAG9B,UAAOE,EAAQ,WAAW,EAAE,qBAC1B,SAAO,IAAI,qBAAmB,CAChC,KAGA,UAAOH,EAAkB,gBAAgB,EAAE,qBAAqB,CAC9D,cAAe,gBAAc,OAC7B,aAAc,cACd,UAAW,gBACX,UAAW,MACb,CAAC,KAGD,UAAOI,CAAM,EAAE,QAAkC,CAC/C,cAAeF,EAA0B,cACzC,0BACEA,EAA0B,0BAC5B,eAAgB,CAAC,CACnB,CAAC,CACH,CAAC,KAED,MAAG,oCAAqC,SAAY,CACjDC,EAAQ,YAAoB,kBAAkB,CAC7C,OAAQ,sBAAoB,MAC5B,KAAM,CAAC,CACT,CAAC,EACAH,EAAkB,iBAAyB,qBAC1C,SAAME,CAAyB,CACjC,EAEA,MAAMG,EAAO,IAAI,8BAA4BF,EAASF,CAAW,EAEjE,QAAM,UAAOI,EAAK,IAAI,CAAC,EAAE,QAAQ,QAC/B,qCACF,CACF,CAAC,KAED,MAAG,0CAA2C,SAAY,CACxD,MAAMC,EAAQ,IAAI,MAAM,wBAAwB,EAC/CN,EAAkB,iBAAyB,qBAAkB,QAAKM,CAAK,CAAC,EAEzE,MAAMD,EAAO,IAAI,8BAA4BF,EAASF,CAAW,EAEjE,QAAM,UAAOI,EAAK,IAAI,CAAC,EAAE,QAAQ,QAAQ,wBAAwB,CACnE,CAAC,CACH,CAAC",
6
- "names": ["import_device_management_kit", "import_purify_ts", "import_vitest", "import_GetChallengeCommand", "import_NullLoggerPublisherService", "import_BuildTransactionContextTask", "contextModuleMock", "defaultArgs", "solanaContextRightPayload", "apiMock", "result", "task", "error"]
4
+ "sourcesContent": ["/* eslint-disable @typescript-eslint/no-unsafe-call */\n/* eslint-disable @typescript-eslint/no-unsafe-member-access */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { type ContextModule } from \"@ledgerhq/context-module\";\nimport {\n CommandResultStatus,\n DeviceModelId,\n type InternalApi,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, Right } from \"purify-ts\";\nimport { beforeEach, describe, expect, it, vi } from \"vitest\";\n\nimport { GetChallengeCommand } from \"@internal/app-binder/command/GetChallengeCommand\";\n\nimport {\n BuildTransactionContextTask,\n type SolanaBuildContextResult,\n} from \"./BuildTransactionContextTask\";\n\nconst mockLoggerFactory = () => ({\n debug: vi.fn(),\n info: vi.fn(),\n warn: vi.fn(),\n error: vi.fn(),\n subscribers: [],\n});\n\nconst contextModuleMock: ContextModule = {\n getSolanaContext: vi.fn(),\n} as unknown as ContextModule;\n\nconst defaultArgs = {\n contextModule: contextModuleMock,\n loggerFactory: mockLoggerFactory,\n options: {\n tokenAddress: \"someAddress\",\n createATA: undefined,\n },\n};\n\nconst solanaContextRightPayload = {\n tlvDescriptor: new Uint8Array([1, 2, 3]),\n trustedNamePKICertificate: {\n payload: new Uint8Array([0xaa, 0xbb]),\n keyUsageNumber: 1,\n },\n loadersResults: [], // required by the task's return type\n} as const;\n\nlet apiMock: InternalApi;\n\ndescribe(\"BuildTransactionContextTask\", () => {\n beforeEach(() => {\n vi.resetAllMocks();\n\n apiMock = {\n getDeviceSessionState: vi\n .fn()\n .mockReturnValue({ deviceModelId: DeviceModelId.NANO_X }),\n sendCommand: vi.fn().mockResolvedValue({\n status: CommandResultStatus.Success,\n data: { challenge: \"someChallenge\" },\n }),\n } as unknown as InternalApi;\n });\n\n it(\"returns context successfully when challenge command succeeds\", async () => {\n (contextModuleMock.getSolanaContext as any).mockResolvedValue(\n Right(solanaContextRightPayload),\n );\n\n const task = new BuildTransactionContextTask(apiMock, defaultArgs);\n const result = await task.run();\n\n // challenge is fetched\n expect(apiMock.sendCommand).toHaveBeenCalledWith(\n expect.any(GetChallengeCommand),\n );\n\n // getSolanaContext called with challenge\n expect(contextModuleMock.getSolanaContext).toHaveBeenCalledWith({\n deviceModelId: DeviceModelId.NANO_X,\n tokenAddress: \"someAddress\",\n challenge: \"someChallenge\",\n createATA: undefined,\n });\n\n // matches SolanaBuildContextResult shape\n expect(result).toEqual<SolanaBuildContextResult>({\n tlvDescriptor: solanaContextRightPayload.tlvDescriptor,\n trustedNamePKICertificate:\n solanaContextRightPayload.trustedNamePKICertificate,\n loadersResults: [],\n });\n });\n\n it(\"throws if challenge command fails\", async () => {\n (apiMock.sendCommand as any).mockResolvedValue({\n status: CommandResultStatus.Error,\n data: {},\n });\n (contextModuleMock.getSolanaContext as any).mockResolvedValue(\n Right(solanaContextRightPayload),\n );\n\n const task = new BuildTransactionContextTask(apiMock, defaultArgs);\n\n await expect(task.run()).rejects.toThrow(\n \"Failed to get challenge from device\",\n );\n });\n\n it(\"throws if getSolanaContext returns Left\", async () => {\n const error = new Error(\"Solana context failure\");\n (contextModuleMock.getSolanaContext as any).mockResolvedValue(Left(error));\n\n const task = new BuildTransactionContextTask(apiMock, defaultArgs);\n\n await expect(task.run()).rejects.toThrow(\"Solana context failure\");\n });\n});\n"],
5
+ "mappings": "aAIA,IAAAA,EAIO,2CACPC,EAA4B,qBAC5BC,EAAqD,kBAErDC,EAAoC,4DAEpCC,EAGO,yCAEP,MAAMC,EAAoB,KAAO,CAC/B,MAAO,KAAG,GAAG,EACb,KAAM,KAAG,GAAG,EACZ,KAAM,KAAG,GAAG,EACZ,MAAO,KAAG,GAAG,EACb,YAAa,CAAC,CAChB,GAEMC,EAAmC,CACvC,iBAAkB,KAAG,GAAG,CAC1B,EAEMC,EAAc,CAClB,cAAeD,EACf,cAAeD,EACf,QAAS,CACP,aAAc,cACd,UAAW,MACb,CACF,EAEMG,EAA4B,CAChC,cAAe,IAAI,WAAW,CAAC,EAAG,EAAG,CAAC,CAAC,EACvC,0BAA2B,CACzB,QAAS,IAAI,WAAW,CAAC,IAAM,GAAI,CAAC,EACpC,eAAgB,CAClB,EACA,eAAgB,CAAC,CACnB,EAEA,IAAIC,KAEJ,YAAS,8BAA+B,IAAM,IAC5C,cAAW,IAAM,CACf,KAAG,cAAc,EAEjBA,EAAU,CACR,sBAAuB,KACpB,GAAG,EACH,gBAAgB,CAAE,cAAe,gBAAc,MAAO,CAAC,EAC1D,YAAa,KAAG,GAAG,EAAE,kBAAkB,CACrC,OAAQ,sBAAoB,QAC5B,KAAM,CAAE,UAAW,eAAgB,CACrC,CAAC,CACH,CACF,CAAC,KAED,MAAG,+DAAgE,SAAY,CAC5EH,EAAkB,iBAAyB,qBAC1C,SAAME,CAAyB,CACjC,EAGA,MAAME,EAAS,MADF,IAAI,8BAA4BD,EAASF,CAAW,EACvC,IAAI,KAG9B,UAAOE,EAAQ,WAAW,EAAE,qBAC1B,SAAO,IAAI,qBAAmB,CAChC,KAGA,UAAOH,EAAkB,gBAAgB,EAAE,qBAAqB,CAC9D,cAAe,gBAAc,OAC7B,aAAc,cACd,UAAW,gBACX,UAAW,MACb,CAAC,KAGD,UAAOI,CAAM,EAAE,QAAkC,CAC/C,cAAeF,EAA0B,cACzC,0BACEA,EAA0B,0BAC5B,eAAgB,CAAC,CACnB,CAAC,CACH,CAAC,KAED,MAAG,oCAAqC,SAAY,CACjDC,EAAQ,YAAoB,kBAAkB,CAC7C,OAAQ,sBAAoB,MAC5B,KAAM,CAAC,CACT,CAAC,EACAH,EAAkB,iBAAyB,qBAC1C,SAAME,CAAyB,CACjC,EAEA,MAAMG,EAAO,IAAI,8BAA4BF,EAASF,CAAW,EAEjE,QAAM,UAAOI,EAAK,IAAI,CAAC,EAAE,QAAQ,QAC/B,qCACF,CACF,CAAC,KAED,MAAG,0CAA2C,SAAY,CACxD,MAAMC,EAAQ,IAAI,MAAM,wBAAwB,EAC/CN,EAAkB,iBAAyB,qBAAkB,QAAKM,CAAK,CAAC,EAEzE,MAAMD,EAAO,IAAI,8BAA4BF,EAASF,CAAW,EAEjE,QAAM,UAAOI,EAAK,IAAI,CAAC,EAAE,QAAQ,QAAQ,wBAAwB,CACnE,CAAC,CACH,CAAC",
6
+ "names": ["import_device_management_kit", "import_purify_ts", "import_vitest", "import_GetChallengeCommand", "import_BuildTransactionContextTask", "mockLoggerFactory", "contextModuleMock", "defaultArgs", "solanaContextRightPayload", "apiMock", "result", "task", "error"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var j=Object.create;var U=Object.defineProperty;var W=Object.getOwnPropertyDescriptor;var Y=Object.getOwnPropertyNames;var X=Object.getPrototypeOf,z=Object.prototype.hasOwnProperty;var J=(a,s,d,m)=>{if(s&&typeof s=="object"||typeof s=="function")for(let u of Y(s))!z.call(a,u)&&u!==d&&U(a,u,{get:()=>s[u],enumerable:!(m=W(s,u))||m.enumerable});return a};var Q=(a,s,d)=>(d=a!=null?j(X(a)):{},J(s||!a||!a.__esModule?U(d,"default",{value:a,enumerable:!0}):d,a));var k=require("@ledgerhq/context-module"),S=require("@ledgerhq/device-management-kit"),f=require("@solana/spl-token"),n=require("@solana/web3.js"),q=Q(require("bs58")),H=require("buffer"),C=require("purify-ts"),e=require("vitest"),E=require("../../app-binder/command/ProvideTLVDescriptorCommand"),O=require("../../app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand"),F=require("../../app-binder/services/utils/DefaultSolanaMessageNormaliser"),I=require("../../app-binder/services/utils/NullLoggerPublisherService"),l=require("./ProvideTransactionContextTask");const G=q.default.encode(new Uint8Array(32).fill(170));function Z(a,s,d){const m=d??s[0]??n.Keypair.generate(),u=new n.Transaction;u.recentBlockhash=G,u.feePayer=m.publicKey,u.add(...a);const B=new Set,i=[m,...s].filter(t=>{const r=t.publicKey.toBase58();return B.has(r)?!1:(B.add(r),!0)});return u.sign(...i),{raw:u.serialize(),payer:m}}function h(a,s,d){const m=d??s[0]??n.Keypair.generate(),u=new n.TransactionMessage({payerKey:m.publicKey,recentBlockhash:G,instructions:a}).compileToV0Message(),B=new n.VersionedTransaction(u);return B.sign([m,...s]),{raw:B.serialize(),payer:m}}const x=a=>({toBase58:()=>a}),_=a=>({normaliseMessage:e.vi.fn(async()=>a)});(0,e.describe)("ProvideSolanaTransactionContextTask (merged)",()=>{let a;const s=(0,S.CommandResultFactory)({data:void 0}),d={payload:new Uint8Array([240,202,204,26]),keyUsageNumber:1},m=new Uint8Array([170,187,204]),u={payload:new Uint8Array([240,202,204,26]),keyUsageNumber:2},B={data:"f0cacc1a",signature:"01020304"},i="f0cacc1a";(0,e.beforeEach)(()=>{e.vi.resetAllMocks(),a={sendCommand:e.vi.fn()}}),(0,e.describe)("basic context",()=>{(0,e.it)("sends PKI certificate then TLV descriptor and returns Nothing (no loaders results)",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s);const t={trustedNamePKICertificate:d,tlvDescriptor:m,loadersResults:[],transactionBytes:new Uint8Array([240]),loggerFactory:I.NullLoggerPublisherService},p=await new l.ProvideSolanaTransactionContextTask(a,t).run();(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(2);const c=a.sendCommand.mock.calls[0][0];(0,e.expect)(c).toBeInstanceOf(S.LoadCertificateCommand),(0,e.expect)(c.args.certificate).toStrictEqual(d.payload),(0,e.expect)(c.args.keyUsage).toBe(d.keyUsageNumber);const g=a.sendCommand.mock.calls[1][0];(0,e.expect)(g).toBeInstanceOf(E.ProvideTLVDescriptorCommand),(0,e.expect)(g.args.payload).toStrictEqual(m),(0,e.expect)(p).toStrictEqual(C.Nothing)}),(0,e.it)("propagates a rejection thrown by InternalApi.sendCommand",async()=>{a.sendCommand.mockRejectedValueOnce(new Error("oupsy"));const t={trustedNamePKICertificate:d,tlvDescriptor:m,loadersResults:[],transactionBytes:new Uint8Array([202]),loggerFactory:I.NullLoggerPublisherService},r=new l.ProvideSolanaTransactionContextTask(a,t);await(0,e.expect)(r.run()).rejects.toThrow("oupsy"),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(1)}),(0,e.it)("ignores SolanaContextTypes.ERROR entries (no extra APDUs beyond base context)",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s);const t=[{type:k.SolanaContextTypes.ERROR,error:{message:"err"}}],r={trustedNamePKICertificate:d,tlvDescriptor:m,loadersResults:t,transactionBytes:new Uint8Array([26]),loggerFactory:I.NullLoggerPublisherService},c=await new l.ProvideSolanaTransactionContextTask(a,r).run();(0,e.expect)(c).toStrictEqual(C.Nothing),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(2),(0,e.expect)(a.sendCommand.mock.calls[0][0]).toBeInstanceOf(S.LoadCertificateCommand),(0,e.expect)(a.sendCommand.mock.calls[1][0]).toBeInstanceOf(E.ProvideTLVDescriptorCommand)})}),(0,e.describe)("basic context + token",()=>{(0,e.it)("when token metadata present, sends token certificate then TLV transaction-instruction descriptor",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s);const t=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:B},certificate:u}],r={trustedNamePKICertificate:d,tlvDescriptor:m,loadersResults:t,transactionBytes:new Uint8Array([26]),loggerFactory:I.NullLoggerPublisherService},c=await new l.ProvideSolanaTransactionContextTask(a,r).run();(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(4);const g=a.sendCommand.mock.calls[2][0];(0,e.expect)(g).toBeInstanceOf(S.LoadCertificateCommand),(0,e.expect)(g.args.certificate).toStrictEqual(u.payload),(0,e.expect)(g.args.keyUsage).toBe(u.keyUsageNumber);const y=a.sendCommand.mock.calls[3][0];(0,e.expect)(y).toBeInstanceOf(O.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(y.args.kind).toBe("descriptor"),(0,e.expect)(y.args.dataHex).toBe(B.data),(0,e.expect)(y.args.signatureHex).toBe(B.signature),(0,e.expect)(y.args.isFirstMessage).toBe(!0),(0,e.expect)(y.args.swapSignatureTag).toBe(!1),(0,e.expect)(c).toStrictEqual(C.Nothing)}),(0,e.it)("does not send token commands if token payload is missing",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s);const t=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:void 0,certificate:u}],r={trustedNamePKICertificate:d,tlvDescriptor:m,loadersResults:t,transactionBytes:new Uint8Array([240]),loggerFactory:I.NullLoggerPublisherService},c=await new l.ProvideSolanaTransactionContextTask(a,r).run();(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(2),(0,e.expect)(c).toStrictEqual(C.Nothing)}),(0,e.it)("does not send token commands if token certificate is missing",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s);const t=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:B},certificate:void 0}],r={trustedNamePKICertificate:d,tlvDescriptor:m,loadersResults:t,transactionBytes:new Uint8Array([202]),loggerFactory:I.NullLoggerPublisherService},c=await new l.ProvideSolanaTransactionContextTask(a,r).run();(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(2),(0,e.expect)(c).toStrictEqual(C.Nothing)}),(0,e.it)("throws a mapped error when sending token certificate returns a CommandErrorResult",async()=>{const t=(0,S.CommandResultFactory)({error:{_tag:"SomeError",errorCode:27264,message:"bad"}});a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(t);const r=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:B},certificate:u}],p={trustedNamePKICertificate:d,tlvDescriptor:m,loadersResults:r,transactionBytes:new Uint8Array([204]),loggerFactory:I.NullLoggerPublisherService},c=new l.ProvideSolanaTransactionContextTask(a,p);await(0,e.expect)(c.run()).rejects.toThrow("[SignerSolana] ProvideSolanaTransactionContextTask: Failed to send tokenMetadataCertificate to device, latest firmware version required"),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(3);const g=a.sendCommand.mock.calls[2][0];(0,e.expect)(g).toBeInstanceOf(S.LoadCertificateCommand)}),(0,e.it)("does not send swap APDUs when SOLANA_LIFI context is missing (token present)",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s);const t=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:B},certificate:u}],r={trustedNamePKICertificate:d,tlvDescriptor:m,loadersResults:t,transactionBytes:new Uint8Array([26]),normaliser:{normaliseMessage:e.vi.fn()},loggerFactory:I.NullLoggerPublisherService},c=await new l.ProvideSolanaTransactionContextTask(a,r).run();(0,e.expect)(c).toStrictEqual(C.Nothing),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(4),(0,e.expect)(a.sendCommand.mock.calls[0][0]).toBeInstanceOf(S.LoadCertificateCommand),(0,e.expect)(a.sendCommand.mock.calls[1][0]).toBeInstanceOf(E.ProvideTLVDescriptorCommand),(0,e.expect)(a.sendCommand.mock.calls[2][0]).toBeInstanceOf(S.LoadCertificateCommand);const g=a.sendCommand.mock.calls[3][0];(0,e.expect)(g).toBeInstanceOf(O.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(g.args.swapSignatureTag).toBe(!1),(0,e.expect)(g.args.isFirstMessage).toBe(!0)})}),(0,e.describe)("basic context + token + lifi",()=>{(0,e.it)("sends one APDU per instruction in order (descriptor/empty/descriptor) after base + token are sent",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValue(s);const t={compiledInstructions:[{programIdIndex:0},{programIdIndex:1},{programIdIndex:2}],allKeys:[x("A_PID"),x("B_PID"),x("C_PID")]},r=_(t),p=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:B},certificate:u},{type:k.SolanaContextTypes.SOLANA_LIFI,payload:{A_PID:{data:i,signatures:{[l.SWAP_MODE]:i}},C_PID:{data:i,signatures:{[l.SWAP_MODE]:i}}}}],c={trustedNamePKICertificate:d,tlvDescriptor:m,loadersResults:p,transactionBytes:new Uint8Array([240]),normaliser:r,loggerFactory:I.NullLoggerPublisherService},y=await new l.ProvideSolanaTransactionContextTask(a,c).run();(0,e.expect)(y).toStrictEqual(C.Nothing),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(7);const o=a.sendCommand.mock.calls[4][0];(0,e.expect)(o).toBeInstanceOf(O.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(o.args.kind).toBe("descriptor"),(0,e.expect)(o.args.dataHex).toBe(i),(0,e.expect)(o.args.signatureHex).toBe(i),(0,e.expect)(o.args.isFirstMessage).toBe(!0),(0,e.expect)(o.args.swapSignatureTag).toBe(!0);const R=a.sendCommand.mock.calls[5][0];(0,e.expect)(R).toBeInstanceOf(O.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(R.args.kind).toBe("empty"),(0,e.expect)(R.args.isFirstMessage).toBe(!1),(0,e.expect)(R.args.swapSignatureTag).toBe(!0);const T=a.sendCommand.mock.calls[6][0];(0,e.expect)(T).toBeInstanceOf(O.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(T.args.kind).toBe("descriptor"),(0,e.expect)(T.args.dataHex).toBe(i),(0,e.expect)(T.args.signatureHex).toBe(i),(0,e.expect)(T.args.isFirstMessage).toBe(!1),(0,e.expect)(T.args.swapSignatureTag).toBe(!0),(0,e.expect)(r.normaliseMessage).toHaveBeenCalledOnce()}),(0,e.it)("sends empty when descriptor exists but signatures[SWAP_MODE] is missing",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValue(s);const t={compiledInstructions:[{programIdIndex:0}],allKeys:[x("ONLY_PID")]},r=_(t),p=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:B},certificate:u},{type:k.SolanaContextTypes.SOLANA_LIFI,payload:{ONLY_PID:{data:i,signatures:{}}}}],c={trustedNamePKICertificate:d,tlvDescriptor:m,loadersResults:p,transactionBytes:new Uint8Array([202]),normaliser:r,loggerFactory:I.NullLoggerPublisherService},y=await new l.ProvideSolanaTransactionContextTask(a,c).run();(0,e.expect)(y).toStrictEqual(C.Nothing),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(5);const o=a.sendCommand.mock.calls[4][0];(0,e.expect)(o).toBeInstanceOf(O.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(o.args.kind).toBe("empty"),(0,e.expect)(o.args.isFirstMessage).toBe(!0),(0,e.expect)(o.args.swapSignatureTag).toBe(!0)}),(0,e.it)("sends empty when programId is missing for an instruction",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValue(s);const t={compiledInstructions:[{programIdIndex:5}],allKeys:[x("X")]},r=_(t),p=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:B},certificate:u},{type:k.SolanaContextTypes.SOLANA_LIFI,payload:{}}],c={trustedNamePKICertificate:d,tlvDescriptor:m,loadersResults:p,transactionBytes:new Uint8Array([204]),normaliser:r,loggerFactory:I.NullLoggerPublisherService},y=await new l.ProvideSolanaTransactionContextTask(a,c).run();(0,e.expect)(y).toStrictEqual(C.Nothing),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(5);const o=a.sendCommand.mock.calls[4][0];(0,e.expect)(o).toBeInstanceOf(O.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(o.args.kind).toBe("empty"),(0,e.expect)(o.args.isFirstMessage).toBe(!0),(0,e.expect)(o.args.swapSignatureTag).toBe(!0)}),(0,e.it)("propagates a rejection thrown by InternalApi.sendCommand on the second swap APDU (after base + token succeed)",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockRejectedValueOnce(new Error("err"));const t={compiledInstructions:[{programIdIndex:0},{programIdIndex:1},{programIdIndex:2}],allKeys:[x("A_PID"),x("B_PID"),x("C_PID")]},r=_(t),p=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:B},certificate:u},{type:k.SolanaContextTypes.SOLANA_LIFI,payload:{A_PID:{data:i,signatures:{[l.SWAP_MODE]:i}},C_PID:{data:i,signatures:{[l.SWAP_MODE]:i}}}}],c={trustedNamePKICertificate:d,tlvDescriptor:m,loadersResults:p,transactionBytes:new Uint8Array([26]),normaliser:r,loggerFactory:I.NullLoggerPublisherService},g=new l.ProvideSolanaTransactionContextTask(a,c);await(0,e.expect)(g.run()).rejects.toThrow("err"),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(6);const y=a.sendCommand.mock.calls[4][0];(0,e.expect)(y).toBeInstanceOf(O.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(y.args.kind).toBe("descriptor"),(0,e.expect)(y.args.isFirstMessage).toBe(!0),(0,e.expect)(y.args.swapSignatureTag).toBe(!0);const o=a.sendCommand.mock.calls[5][0];(0,e.expect)(o).toBeInstanceOf(O.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(o.args.kind).toBe("empty"),(0,e.expect)(o.args.isFirstMessage).toBe(!1),(0,e.expect)(o.args.swapSignatureTag).toBe(!0)}),(0,e.it)("uses signatures[SWAP_MODE] specifically when present",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValue(s);const t={compiledInstructions:[{programIdIndex:0}],allKeys:[x("SIG_PID")]},r=_(t),p=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:B},certificate:u},{type:k.SolanaContextTypes.SOLANA_LIFI,payload:{SIG_PID:{data:i,signatures:{prod:"deadbeef",[l.SWAP_MODE]:i}}}}],c={trustedNamePKICertificate:d,tlvDescriptor:m,loadersResults:p,transactionBytes:new Uint8Array([240]),normaliser:r,loggerFactory:I.NullLoggerPublisherService},y=await new l.ProvideSolanaTransactionContextTask(a,c).run();(0,e.expect)(y).toStrictEqual(C.Nothing),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(5);const o=a.sendCommand.mock.calls[4][0];(0,e.expect)(o).toBeInstanceOf(O.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(o.args.kind).toBe("descriptor"),(0,e.expect)(o.args.dataHex).toBe(i),(0,e.expect)(o.args.signatureHex).toBe(i),(0,e.expect)(o.args.isFirstMessage).toBe(!0),(0,e.expect)(o.args.swapSignatureTag).toBe(!0)}),(0,e.it)("parses a real *legacy* tx via DefaultSolanaMessageNormaliser and preserves APDU order (descriptor, empty, descriptor) after base + token",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValue(s);const t=n.Keypair.generate(),r=n.Keypair.generate().publicKey,p=n.SystemProgram.transfer({fromPubkey:t.publicKey,toPubkey:r,lamports:1234}),c=n.Keypair.generate(),g=n.Keypair.generate().publicKey,y=n.Keypair.generate().publicKey,o=(0,f.createTransferInstruction)(g,y,c.publicKey,42n,[],f.TOKEN_PROGRAM_ID),R=new n.PublicKey("MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr"),T=new n.TransactionInstruction({programId:R,keys:[],data:H.Buffer.from("hi")}),{raw:N}=Z([p,o,T],[t,c],t),V=n.SystemProgram.programId.toBase58(),K=R.toBase58(),P=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:B},certificate:u},{type:k.SolanaContextTypes.SOLANA_LIFI,payload:{[V]:{data:i,signatures:{[l.SWAP_MODE]:i}},[K]:{data:i,signatures:{[l.SWAP_MODE]:i}}}}],D={trustedNamePKICertificate:d,tlvDescriptor:m,loadersResults:P,transactionBytes:N,normaliser:F.DefaultSolanaMessageNormaliser,loggerFactory:I.NullLoggerPublisherService},b=await new l.ProvideSolanaTransactionContextTask(a,D).run();(0,e.expect)(b).toStrictEqual(C.Nothing),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(7);const v=a.sendCommand.mock.calls[4][0];(0,e.expect)(v.args.kind).toBe("descriptor"),(0,e.expect)(v.args.isFirstMessage).toBe(!0),(0,e.expect)(v.args.swapSignatureTag).toBe(!0);const w=a.sendCommand.mock.calls[5][0];(0,e.expect)(w.args.kind).toBe("empty"),(0,e.expect)(w.args.isFirstMessage).toBe(!1),(0,e.expect)(w.args.swapSignatureTag).toBe(!0);const A=a.sendCommand.mock.calls[6][0];(0,e.expect)(A.args.kind).toBe("descriptor"),(0,e.expect)(A.args.isFirstMessage).toBe(!1),(0,e.expect)(A.args.swapSignatureTag).toBe(!0)}),(0,e.it)("parses a real *v0* tx via DefaultSolanaMessageNormaliser (no ALTs) and preserves APDU order (descriptor, descriptor, empty) after base + token",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValue(s);const t=n.Keypair.generate(),r=n.Keypair.generate().publicKey,p=n.SystemProgram.transfer({fromPubkey:t.publicKey,toPubkey:r,lamports:5678}),c=n.Keypair.generate().publicKey,g=n.Keypair.generate().publicKey,y=(0,f.getAssociatedTokenAddressSync)(g,c,!0,f.TOKEN_PROGRAM_ID,f.ASSOCIATED_TOKEN_PROGRAM_ID),o=(0,f.createAssociatedTokenAccountInstruction)(t.publicKey,y,c,g,f.TOKEN_PROGRAM_ID,f.ASSOCIATED_TOKEN_PROGRAM_ID),R=new n.PublicKey("MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr"),T=new n.TransactionInstruction({programId:R,keys:[],data:H.Buffer.from("hello")}),{raw:N}=h([p,o,T],[],t),V=n.SystemProgram.programId.toBase58(),K=f.ASSOCIATED_TOKEN_PROGRAM_ID.toBase58(),P=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:B},certificate:u},{type:k.SolanaContextTypes.SOLANA_LIFI,payload:{[V]:{data:i,signatures:{[l.SWAP_MODE]:i}},[K]:{data:i,signatures:{[l.SWAP_MODE]:i}}}}],D={trustedNamePKICertificate:d,tlvDescriptor:m,loadersResults:P,transactionBytes:N,normaliser:F.DefaultSolanaMessageNormaliser,loggerFactory:I.NullLoggerPublisherService},b=await new l.ProvideSolanaTransactionContextTask(a,D).run();(0,e.expect)(b).toEqual(C.Nothing),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(7);const v=a.sendCommand.mock.calls[4][0];(0,e.expect)(v).toBeInstanceOf(O.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(v.args.kind).toBe("descriptor"),(0,e.expect)(v.args.isFirstMessage).toBe(!0),(0,e.expect)(v.args.swapSignatureTag).toBe(!0);const w=a.sendCommand.mock.calls[5][0];(0,e.expect)(w).toBeInstanceOf(O.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(w.args.kind).toBe("descriptor"),(0,e.expect)(w.args.isFirstMessage).toBe(!1),(0,e.expect)(w.args.swapSignatureTag).toBe(!0);const A=a.sendCommand.mock.calls[6][0];(0,e.expect)(A).toBeInstanceOf(O.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(A.args.kind).toBe("empty"),(0,e.expect)(A.args.isFirstMessage).toBe(!1),(0,e.expect)(A.args.swapSignatureTag).toBe(!0)}),(0,e.it)("parses a real *v0* tx via DefaultSolanaMessageNormaliser and preserves APDU order System, createATA, token transfer (descriptor, descriptor, empty) after base + token",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValue(s);const t=n.Keypair.generate(),r=n.Keypair.generate().publicKey,p=n.SystemProgram.transfer({fromPubkey:t.publicKey,toPubkey:r,lamports:7777}),c=n.Keypair.generate(),g=n.Keypair.generate().publicKey,y=n.Keypair.generate().publicKey,o=(0,f.getAssociatedTokenAddressSync)(g,y,!0,f.TOKEN_PROGRAM_ID,f.ASSOCIATED_TOKEN_PROGRAM_ID),R=(0,f.createAssociatedTokenAccountInstruction)(t.publicKey,o,y,g,f.TOKEN_PROGRAM_ID,f.ASSOCIATED_TOKEN_PROGRAM_ID),T=n.Keypair.generate().publicKey,N=(0,f.createTransferInstruction)(T,o,c.publicKey,9n,[],f.TOKEN_PROGRAM_ID),{raw:V}=h([p,R,N],[c],t),K=n.SystemProgram.programId.toBase58(),P=f.ASSOCIATED_TOKEN_PROGRAM_ID.toBase58(),D=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:B},certificate:u},{type:k.SolanaContextTypes.SOLANA_LIFI,payload:{[K]:{data:i,signatures:{[l.SWAP_MODE]:i}},[P]:{data:i,signatures:{[l.SWAP_MODE]:i}}}}],L={trustedNamePKICertificate:d,tlvDescriptor:m,loadersResults:D,transactionBytes:V,normaliser:F.DefaultSolanaMessageNormaliser,loggerFactory:I.NullLoggerPublisherService},v=await new l.ProvideSolanaTransactionContextTask(a,L).run();(0,e.expect)(v).toEqual(C.Nothing),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(7);const w=a.sendCommand.mock.calls[4][0];(0,e.expect)(w).toBeInstanceOf(O.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(w.args.kind).toBe("descriptor"),(0,e.expect)(w.args.isFirstMessage).toBe(!0),(0,e.expect)(w.args.swapSignatureTag).toBe(!0);const A=a.sendCommand.mock.calls[5][0];(0,e.expect)(A).toBeInstanceOf(O.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(A.args.kind).toBe("descriptor"),(0,e.expect)(A.args.isFirstMessage).toBe(!1),(0,e.expect)(A.args.swapSignatureTag).toBe(!0);const M=a.sendCommand.mock.calls[6][0];(0,e.expect)(M).toBeInstanceOf(O.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(M.args.kind).toBe("empty"),(0,e.expect)(M.args.isFirstMessage).toBe(!1),(0,e.expect)(M.args.swapSignatureTag).toBe(!0)})})});
1
+ "use strict";var j=Object.create;var U=Object.defineProperty;var W=Object.getOwnPropertyDescriptor;var Y=Object.getOwnPropertyNames;var X=Object.getPrototypeOf,z=Object.prototype.hasOwnProperty;var J=(a,s,d,m)=>{if(s&&typeof s=="object"||typeof s=="function")for(let u of Y(s))!z.call(a,u)&&u!==d&&U(a,u,{get:()=>s[u],enumerable:!(m=W(s,u))||m.enumerable});return a};var Q=(a,s,d)=>(d=a!=null?j(X(a)):{},J(s||!a||!a.__esModule?U(d,"default",{value:a,enumerable:!0}):d,a));var k=require("@ledgerhq/context-module"),S=require("@ledgerhq/device-management-kit"),f=require("@solana/spl-token"),n=require("@solana/web3.js"),q=Q(require("bs58")),H=require("buffer"),C=require("purify-ts"),e=require("vitest"),E=require("../../app-binder/command/ProvideTLVDescriptorCommand"),O=require("../../app-binder/command/ProvideTLVTransactionInstructionDescriptorCommand"),F=require("../../app-binder/services/utils/DefaultSolanaMessageNormaliser"),l=require("./ProvideTransactionContextTask");const I=()=>({debug:e.vi.fn(),info:e.vi.fn(),warn:e.vi.fn(),error:e.vi.fn(),subscribers:[]}),G=q.default.encode(new Uint8Array(32).fill(170));function Z(a,s,d){const m=d??s[0]??n.Keypair.generate(),u=new n.Transaction;u.recentBlockhash=G,u.feePayer=m.publicKey,u.add(...a);const B=new Set,i=[m,...s].filter(t=>{const r=t.publicKey.toBase58();return B.has(r)?!1:(B.add(r),!0)});return u.sign(...i),{raw:u.serialize(),payer:m}}function h(a,s,d){const m=d??s[0]??n.Keypair.generate(),u=new n.TransactionMessage({payerKey:m.publicKey,recentBlockhash:G,instructions:a}).compileToV0Message(),B=new n.VersionedTransaction(u);return B.sign([m,...s]),{raw:B.serialize(),payer:m}}const x=a=>({toBase58:()=>a}),b=a=>({normaliseMessage:e.vi.fn(async()=>a)});(0,e.describe)("ProvideSolanaTransactionContextTask (merged)",()=>{let a;const s=(0,S.CommandResultFactory)({data:void 0}),d={payload:new Uint8Array([240,202,204,26]),keyUsageNumber:1},m=new Uint8Array([170,187,204]),u={payload:new Uint8Array([240,202,204,26]),keyUsageNumber:2},B={data:"f0cacc1a",signature:"01020304"},i="f0cacc1a";(0,e.beforeEach)(()=>{e.vi.resetAllMocks(),a={sendCommand:e.vi.fn()}}),(0,e.describe)("basic context",()=>{(0,e.it)("sends PKI certificate then TLV descriptor and returns Nothing (no loaders results)",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s);const t={trustedNamePKICertificate:d,tlvDescriptor:m,loadersResults:[],transactionBytes:new Uint8Array([240]),loggerFactory:I},p=await new l.ProvideSolanaTransactionContextTask(a,t).run();(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(2);const c=a.sendCommand.mock.calls[0][0];(0,e.expect)(c).toBeInstanceOf(S.LoadCertificateCommand),(0,e.expect)(c.args.certificate).toStrictEqual(d.payload),(0,e.expect)(c.args.keyUsage).toBe(d.keyUsageNumber);const g=a.sendCommand.mock.calls[1][0];(0,e.expect)(g).toBeInstanceOf(E.ProvideTLVDescriptorCommand),(0,e.expect)(g.args.payload).toStrictEqual(m),(0,e.expect)(p).toStrictEqual(C.Nothing)}),(0,e.it)("propagates a rejection thrown by InternalApi.sendCommand",async()=>{a.sendCommand.mockRejectedValueOnce(new Error("oupsy"));const t={trustedNamePKICertificate:d,tlvDescriptor:m,loadersResults:[],transactionBytes:new Uint8Array([202]),loggerFactory:I},r=new l.ProvideSolanaTransactionContextTask(a,t);await(0,e.expect)(r.run()).rejects.toThrow("oupsy"),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(1)}),(0,e.it)("ignores SolanaContextTypes.ERROR entries (no extra APDUs beyond base context)",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s);const t=[{type:k.SolanaContextTypes.ERROR,error:{message:"err"}}],r={trustedNamePKICertificate:d,tlvDescriptor:m,loadersResults:t,transactionBytes:new Uint8Array([26]),loggerFactory:I},c=await new l.ProvideSolanaTransactionContextTask(a,r).run();(0,e.expect)(c).toStrictEqual(C.Nothing),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(2),(0,e.expect)(a.sendCommand.mock.calls[0][0]).toBeInstanceOf(S.LoadCertificateCommand),(0,e.expect)(a.sendCommand.mock.calls[1][0]).toBeInstanceOf(E.ProvideTLVDescriptorCommand)})}),(0,e.describe)("basic context + token",()=>{(0,e.it)("when token metadata present, sends token certificate then TLV transaction-instruction descriptor",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s);const t=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:B},certificate:u}],r={trustedNamePKICertificate:d,tlvDescriptor:m,loadersResults:t,transactionBytes:new Uint8Array([26]),loggerFactory:I},c=await new l.ProvideSolanaTransactionContextTask(a,r).run();(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(4);const g=a.sendCommand.mock.calls[2][0];(0,e.expect)(g).toBeInstanceOf(S.LoadCertificateCommand),(0,e.expect)(g.args.certificate).toStrictEqual(u.payload),(0,e.expect)(g.args.keyUsage).toBe(u.keyUsageNumber);const y=a.sendCommand.mock.calls[3][0];(0,e.expect)(y).toBeInstanceOf(O.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(y.args.kind).toBe("descriptor"),(0,e.expect)(y.args.dataHex).toBe(B.data),(0,e.expect)(y.args.signatureHex).toBe(B.signature),(0,e.expect)(y.args.isFirstMessage).toBe(!0),(0,e.expect)(y.args.swapSignatureTag).toBe(!1),(0,e.expect)(c).toStrictEqual(C.Nothing)}),(0,e.it)("does not send token commands if token payload is missing",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s);const t=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:void 0,certificate:u}],r={trustedNamePKICertificate:d,tlvDescriptor:m,loadersResults:t,transactionBytes:new Uint8Array([240]),loggerFactory:I},c=await new l.ProvideSolanaTransactionContextTask(a,r).run();(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(2),(0,e.expect)(c).toStrictEqual(C.Nothing)}),(0,e.it)("does not send token commands if token certificate is missing",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s);const t=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:B},certificate:void 0}],r={trustedNamePKICertificate:d,tlvDescriptor:m,loadersResults:t,transactionBytes:new Uint8Array([202]),loggerFactory:I},c=await new l.ProvideSolanaTransactionContextTask(a,r).run();(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(2),(0,e.expect)(c).toStrictEqual(C.Nothing)}),(0,e.it)("throws a mapped error when sending token certificate returns a CommandErrorResult",async()=>{const t=(0,S.CommandResultFactory)({error:{_tag:"SomeError",errorCode:27264,message:"bad"}});a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(t);const r=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:B},certificate:u}],p={trustedNamePKICertificate:d,tlvDescriptor:m,loadersResults:r,transactionBytes:new Uint8Array([204]),loggerFactory:I},c=new l.ProvideSolanaTransactionContextTask(a,p);await(0,e.expect)(c.run()).rejects.toThrow("[SignerSolana] ProvideSolanaTransactionContextTask: Failed to send tokenMetadataCertificate to device, latest firmware version required"),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(3);const g=a.sendCommand.mock.calls[2][0];(0,e.expect)(g).toBeInstanceOf(S.LoadCertificateCommand)}),(0,e.it)("does not send swap APDUs when SOLANA_LIFI context is missing (token present)",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s);const t=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:B},certificate:u}],r={trustedNamePKICertificate:d,tlvDescriptor:m,loadersResults:t,transactionBytes:new Uint8Array([26]),normaliser:{normaliseMessage:e.vi.fn()},loggerFactory:I},c=await new l.ProvideSolanaTransactionContextTask(a,r).run();(0,e.expect)(c).toStrictEqual(C.Nothing),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(4),(0,e.expect)(a.sendCommand.mock.calls[0][0]).toBeInstanceOf(S.LoadCertificateCommand),(0,e.expect)(a.sendCommand.mock.calls[1][0]).toBeInstanceOf(E.ProvideTLVDescriptorCommand),(0,e.expect)(a.sendCommand.mock.calls[2][0]).toBeInstanceOf(S.LoadCertificateCommand);const g=a.sendCommand.mock.calls[3][0];(0,e.expect)(g).toBeInstanceOf(O.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(g.args.swapSignatureTag).toBe(!1),(0,e.expect)(g.args.isFirstMessage).toBe(!0)})}),(0,e.describe)("basic context + token + lifi",()=>{(0,e.it)("sends one APDU per instruction in order (descriptor/empty/descriptor) after base + token are sent",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValue(s);const t={compiledInstructions:[{programIdIndex:0},{programIdIndex:1},{programIdIndex:2}],allKeys:[x("A_PID"),x("B_PID"),x("C_PID")]},r=b(t),p=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:B},certificate:u},{type:k.SolanaContextTypes.SOLANA_LIFI,payload:{A_PID:{data:i,signatures:{[l.SWAP_MODE]:i}},C_PID:{data:i,signatures:{[l.SWAP_MODE]:i}}}}],c={trustedNamePKICertificate:d,tlvDescriptor:m,loadersResults:p,transactionBytes:new Uint8Array([240]),normaliser:r,loggerFactory:I},y=await new l.ProvideSolanaTransactionContextTask(a,c).run();(0,e.expect)(y).toStrictEqual(C.Nothing),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(7);const o=a.sendCommand.mock.calls[4][0];(0,e.expect)(o).toBeInstanceOf(O.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(o.args.kind).toBe("descriptor"),(0,e.expect)(o.args.dataHex).toBe(i),(0,e.expect)(o.args.signatureHex).toBe(i),(0,e.expect)(o.args.isFirstMessage).toBe(!0),(0,e.expect)(o.args.swapSignatureTag).toBe(!0);const R=a.sendCommand.mock.calls[5][0];(0,e.expect)(R).toBeInstanceOf(O.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(R.args.kind).toBe("empty"),(0,e.expect)(R.args.isFirstMessage).toBe(!1),(0,e.expect)(R.args.swapSignatureTag).toBe(!0);const T=a.sendCommand.mock.calls[6][0];(0,e.expect)(T).toBeInstanceOf(O.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(T.args.kind).toBe("descriptor"),(0,e.expect)(T.args.dataHex).toBe(i),(0,e.expect)(T.args.signatureHex).toBe(i),(0,e.expect)(T.args.isFirstMessage).toBe(!1),(0,e.expect)(T.args.swapSignatureTag).toBe(!0),(0,e.expect)(r.normaliseMessage).toHaveBeenCalledOnce()}),(0,e.it)("sends empty when descriptor exists but signatures[SWAP_MODE] is missing",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValue(s);const t={compiledInstructions:[{programIdIndex:0}],allKeys:[x("ONLY_PID")]},r=b(t),p=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:B},certificate:u},{type:k.SolanaContextTypes.SOLANA_LIFI,payload:{ONLY_PID:{data:i,signatures:{}}}}],c={trustedNamePKICertificate:d,tlvDescriptor:m,loadersResults:p,transactionBytes:new Uint8Array([202]),normaliser:r,loggerFactory:I},y=await new l.ProvideSolanaTransactionContextTask(a,c).run();(0,e.expect)(y).toStrictEqual(C.Nothing),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(5);const o=a.sendCommand.mock.calls[4][0];(0,e.expect)(o).toBeInstanceOf(O.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(o.args.kind).toBe("empty"),(0,e.expect)(o.args.isFirstMessage).toBe(!0),(0,e.expect)(o.args.swapSignatureTag).toBe(!0)}),(0,e.it)("sends empty when programId is missing for an instruction",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValue(s);const t={compiledInstructions:[{programIdIndex:5}],allKeys:[x("X")]},r=b(t),p=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:B},certificate:u},{type:k.SolanaContextTypes.SOLANA_LIFI,payload:{}}],c={trustedNamePKICertificate:d,tlvDescriptor:m,loadersResults:p,transactionBytes:new Uint8Array([204]),normaliser:r,loggerFactory:I},y=await new l.ProvideSolanaTransactionContextTask(a,c).run();(0,e.expect)(y).toStrictEqual(C.Nothing),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(5);const o=a.sendCommand.mock.calls[4][0];(0,e.expect)(o).toBeInstanceOf(O.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(o.args.kind).toBe("empty"),(0,e.expect)(o.args.isFirstMessage).toBe(!0),(0,e.expect)(o.args.swapSignatureTag).toBe(!0)}),(0,e.it)("propagates a rejection thrown by InternalApi.sendCommand on the second swap APDU (after base + token succeed)",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockRejectedValueOnce(new Error("err"));const t={compiledInstructions:[{programIdIndex:0},{programIdIndex:1},{programIdIndex:2}],allKeys:[x("A_PID"),x("B_PID"),x("C_PID")]},r=b(t),p=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:B},certificate:u},{type:k.SolanaContextTypes.SOLANA_LIFI,payload:{A_PID:{data:i,signatures:{[l.SWAP_MODE]:i}},C_PID:{data:i,signatures:{[l.SWAP_MODE]:i}}}}],c={trustedNamePKICertificate:d,tlvDescriptor:m,loadersResults:p,transactionBytes:new Uint8Array([26]),normaliser:r,loggerFactory:I},g=new l.ProvideSolanaTransactionContextTask(a,c);await(0,e.expect)(g.run()).rejects.toThrow("err"),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(6);const y=a.sendCommand.mock.calls[4][0];(0,e.expect)(y).toBeInstanceOf(O.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(y.args.kind).toBe("descriptor"),(0,e.expect)(y.args.isFirstMessage).toBe(!0),(0,e.expect)(y.args.swapSignatureTag).toBe(!0);const o=a.sendCommand.mock.calls[5][0];(0,e.expect)(o).toBeInstanceOf(O.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(o.args.kind).toBe("empty"),(0,e.expect)(o.args.isFirstMessage).toBe(!1),(0,e.expect)(o.args.swapSignatureTag).toBe(!0)}),(0,e.it)("uses signatures[SWAP_MODE] specifically when present",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValue(s);const t={compiledInstructions:[{programIdIndex:0}],allKeys:[x("SIG_PID")]},r=b(t),p=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:B},certificate:u},{type:k.SolanaContextTypes.SOLANA_LIFI,payload:{SIG_PID:{data:i,signatures:{prod:"deadbeef",[l.SWAP_MODE]:i}}}}],c={trustedNamePKICertificate:d,tlvDescriptor:m,loadersResults:p,transactionBytes:new Uint8Array([240]),normaliser:r,loggerFactory:I},y=await new l.ProvideSolanaTransactionContextTask(a,c).run();(0,e.expect)(y).toStrictEqual(C.Nothing),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(5);const o=a.sendCommand.mock.calls[4][0];(0,e.expect)(o).toBeInstanceOf(O.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(o.args.kind).toBe("descriptor"),(0,e.expect)(o.args.dataHex).toBe(i),(0,e.expect)(o.args.signatureHex).toBe(i),(0,e.expect)(o.args.isFirstMessage).toBe(!0),(0,e.expect)(o.args.swapSignatureTag).toBe(!0)}),(0,e.it)("parses a real *legacy* tx via DefaultSolanaMessageNormaliser and preserves APDU order (descriptor, empty, descriptor) after base + token",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValue(s);const t=n.Keypair.generate(),r=n.Keypair.generate().publicKey,p=n.SystemProgram.transfer({fromPubkey:t.publicKey,toPubkey:r,lamports:1234}),c=n.Keypair.generate(),g=n.Keypair.generate().publicKey,y=n.Keypair.generate().publicKey,o=(0,f.createTransferInstruction)(g,y,c.publicKey,42n,[],f.TOKEN_PROGRAM_ID),R=new n.PublicKey("MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr"),T=new n.TransactionInstruction({programId:R,keys:[],data:H.Buffer.from("hi")}),{raw:V}=Z([p,o,T],[t,c],t),K=n.SystemProgram.programId.toBase58(),N=R.toBase58(),P=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:B},certificate:u},{type:k.SolanaContextTypes.SOLANA_LIFI,payload:{[K]:{data:i,signatures:{[l.SWAP_MODE]:i}},[N]:{data:i,signatures:{[l.SWAP_MODE]:i}}}}],D={trustedNamePKICertificate:d,tlvDescriptor:m,loadersResults:P,transactionBytes:V,normaliser:F.DefaultSolanaMessageNormaliser,loggerFactory:I},_=await new l.ProvideSolanaTransactionContextTask(a,D).run();(0,e.expect)(_).toStrictEqual(C.Nothing),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(7);const v=a.sendCommand.mock.calls[4][0];(0,e.expect)(v.args.kind).toBe("descriptor"),(0,e.expect)(v.args.isFirstMessage).toBe(!0),(0,e.expect)(v.args.swapSignatureTag).toBe(!0);const w=a.sendCommand.mock.calls[5][0];(0,e.expect)(w.args.kind).toBe("empty"),(0,e.expect)(w.args.isFirstMessage).toBe(!1),(0,e.expect)(w.args.swapSignatureTag).toBe(!0);const A=a.sendCommand.mock.calls[6][0];(0,e.expect)(A.args.kind).toBe("descriptor"),(0,e.expect)(A.args.isFirstMessage).toBe(!1),(0,e.expect)(A.args.swapSignatureTag).toBe(!0)}),(0,e.it)("parses a real *v0* tx via DefaultSolanaMessageNormaliser (no ALTs) and preserves APDU order (descriptor, descriptor, empty) after base + token",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValue(s);const t=n.Keypair.generate(),r=n.Keypair.generate().publicKey,p=n.SystemProgram.transfer({fromPubkey:t.publicKey,toPubkey:r,lamports:5678}),c=n.Keypair.generate().publicKey,g=n.Keypair.generate().publicKey,y=(0,f.getAssociatedTokenAddressSync)(g,c,!0,f.TOKEN_PROGRAM_ID,f.ASSOCIATED_TOKEN_PROGRAM_ID),o=(0,f.createAssociatedTokenAccountInstruction)(t.publicKey,y,c,g,f.TOKEN_PROGRAM_ID,f.ASSOCIATED_TOKEN_PROGRAM_ID),R=new n.PublicKey("MemoSq4gqABAXKb96qnH8TysNcWxMyWCqXgDLGmfcHr"),T=new n.TransactionInstruction({programId:R,keys:[],data:H.Buffer.from("hello")}),{raw:V}=h([p,o,T],[],t),K=n.SystemProgram.programId.toBase58(),N=f.ASSOCIATED_TOKEN_PROGRAM_ID.toBase58(),P=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:B},certificate:u},{type:k.SolanaContextTypes.SOLANA_LIFI,payload:{[K]:{data:i,signatures:{[l.SWAP_MODE]:i}},[N]:{data:i,signatures:{[l.SWAP_MODE]:i}}}}],D={trustedNamePKICertificate:d,tlvDescriptor:m,loadersResults:P,transactionBytes:V,normaliser:F.DefaultSolanaMessageNormaliser,loggerFactory:I},_=await new l.ProvideSolanaTransactionContextTask(a,D).run();(0,e.expect)(_).toEqual(C.Nothing),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(7);const v=a.sendCommand.mock.calls[4][0];(0,e.expect)(v).toBeInstanceOf(O.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(v.args.kind).toBe("descriptor"),(0,e.expect)(v.args.isFirstMessage).toBe(!0),(0,e.expect)(v.args.swapSignatureTag).toBe(!0);const w=a.sendCommand.mock.calls[5][0];(0,e.expect)(w).toBeInstanceOf(O.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(w.args.kind).toBe("descriptor"),(0,e.expect)(w.args.isFirstMessage).toBe(!1),(0,e.expect)(w.args.swapSignatureTag).toBe(!0);const A=a.sendCommand.mock.calls[6][0];(0,e.expect)(A).toBeInstanceOf(O.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(A.args.kind).toBe("empty"),(0,e.expect)(A.args.isFirstMessage).toBe(!1),(0,e.expect)(A.args.swapSignatureTag).toBe(!0)}),(0,e.it)("parses a real *v0* tx via DefaultSolanaMessageNormaliser and preserves APDU order System, createATA, token transfer (descriptor, descriptor, empty) after base + token",async()=>{a.sendCommand.mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValueOnce(s).mockResolvedValue(s);const t=n.Keypair.generate(),r=n.Keypair.generate().publicKey,p=n.SystemProgram.transfer({fromPubkey:t.publicKey,toPubkey:r,lamports:7777}),c=n.Keypair.generate(),g=n.Keypair.generate().publicKey,y=n.Keypair.generate().publicKey,o=(0,f.getAssociatedTokenAddressSync)(g,y,!0,f.TOKEN_PROGRAM_ID,f.ASSOCIATED_TOKEN_PROGRAM_ID),R=(0,f.createAssociatedTokenAccountInstruction)(t.publicKey,o,y,g,f.TOKEN_PROGRAM_ID,f.ASSOCIATED_TOKEN_PROGRAM_ID),T=n.Keypair.generate().publicKey,V=(0,f.createTransferInstruction)(T,o,c.publicKey,9n,[],f.TOKEN_PROGRAM_ID),{raw:K}=h([p,R,V],[c],t),N=n.SystemProgram.programId.toBase58(),P=f.ASSOCIATED_TOKEN_PROGRAM_ID.toBase58(),D=[{type:k.SolanaContextTypes.SOLANA_TOKEN,payload:{solanaTokenDescriptor:B},certificate:u},{type:k.SolanaContextTypes.SOLANA_LIFI,payload:{[N]:{data:i,signatures:{[l.SWAP_MODE]:i}},[P]:{data:i,signatures:{[l.SWAP_MODE]:i}}}}],L={trustedNamePKICertificate:d,tlvDescriptor:m,loadersResults:D,transactionBytes:K,normaliser:F.DefaultSolanaMessageNormaliser,loggerFactory:I},v=await new l.ProvideSolanaTransactionContextTask(a,L).run();(0,e.expect)(v).toEqual(C.Nothing),(0,e.expect)(a.sendCommand).toHaveBeenCalledTimes(7);const w=a.sendCommand.mock.calls[4][0];(0,e.expect)(w).toBeInstanceOf(O.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(w.args.kind).toBe("descriptor"),(0,e.expect)(w.args.isFirstMessage).toBe(!0),(0,e.expect)(w.args.swapSignatureTag).toBe(!0);const A=a.sendCommand.mock.calls[5][0];(0,e.expect)(A).toBeInstanceOf(O.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(A.args.kind).toBe("descriptor"),(0,e.expect)(A.args.isFirstMessage).toBe(!1),(0,e.expect)(A.args.swapSignatureTag).toBe(!0);const M=a.sendCommand.mock.calls[6][0];(0,e.expect)(M).toBeInstanceOf(O.ProvideTLVTransactionInstructionDescriptorCommand),(0,e.expect)(M.args.kind).toBe("empty"),(0,e.expect)(M.args.isFirstMessage).toBe(!1),(0,e.expect)(M.args.swapSignatureTag).toBe(!0)})})});
2
2
  //# sourceMappingURL=ProvideTransactionContextTask.test.js.map