@ledgerhq/device-signer-kit-solana 0.0.0-transactionInspector-resolutionObj-20250916113438 → 0.0.0-transactionInspector-resolutionObj-20250916153045

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 (21) hide show
  1. package/lib/cjs/api/app-binder/SignTransactionDeviceActionTypes.js.map +1 -1
  2. package/lib/cjs/internal/app-binder/device-action/SignTransactionDeviceAction.js.map +1 -1
  3. package/lib/cjs/internal/app-binder/services/TransactionInspector.js +1 -1
  4. package/lib/cjs/internal/app-binder/services/TransactionInspector.js.map +3 -3
  5. package/lib/cjs/internal/app-binder/services/utils/transactionDecoders.js +1 -1
  6. package/lib/cjs/internal/app-binder/services/utils/transactionDecoders.js.map +3 -3
  7. package/lib/esm/internal/app-binder/device-action/SignTransactionDeviceAction.js.map +1 -1
  8. package/lib/esm/internal/app-binder/services/TransactionInspector.js +1 -1
  9. package/lib/esm/internal/app-binder/services/TransactionInspector.js.map +3 -3
  10. package/lib/esm/internal/app-binder/services/utils/transactionDecoders.js +1 -1
  11. package/lib/esm/internal/app-binder/services/utils/transactionDecoders.js.map +3 -3
  12. package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts +1 -1
  13. package/lib/types/api/app-binder/SignTransactionDeviceActionTypes.d.ts.map +1 -1
  14. package/lib/types/internal/app-binder/device-action/SignTransactionDeviceAction.d.ts +1 -1
  15. package/lib/types/internal/app-binder/device-action/SignTransactionDeviceAction.d.ts.map +1 -1
  16. package/lib/types/internal/app-binder/services/TransactionInspector.d.ts +11 -2
  17. package/lib/types/internal/app-binder/services/TransactionInspector.d.ts.map +1 -1
  18. package/lib/types/internal/app-binder/services/utils/transactionDecoders.d.ts +1 -12
  19. package/lib/types/internal/app-binder/services/utils/transactionDecoders.d.ts.map +1 -1
  20. package/lib/types/tsconfig.prod.tsbuildinfo +1 -1
  21. package/package.json +6 -6
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../src/api/app-binder/SignTransactionDeviceActionTypes.ts"],
4
- "sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport { type SolanaTransactionContextResultSuccess } from \"@ledgerhq/context-module/src/solana/domain/solanaContextTypes.js\";\nimport {\n type DeviceActionState,\n type ExecuteDeviceActionReturnType,\n type OpenAppDAError,\n type OpenAppDARequiredInteraction,\n type SendCommandInAppDAError,\n type UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type AppConfiguration } from \"@api/model/AppConfiguration\";\nimport { type Signature } from \"@api/model/Signature\";\nimport { type Transaction } from \"@api/model/Transaction\";\nimport { type TransactionResolutionContext } from \"@api/model/TransactionResolutionContext\";\nimport { type SolanaAppErrorCodes } from \"@internal/app-binder/command/utils/SolanaApplicationErrors\";\nimport { type TxInspectorResult } from \"@internal/app-binder/services/utils/transactionDecoders\";\n\nexport type SignTransactionDAOutput = Signature;\n\nexport type SignTransactionDAInput = {\n readonly derivationPath: string;\n readonly transaction: Transaction;\n readonly resolutionContext?: TransactionResolutionContext;\n readonly skipOpenApp: boolean;\n readonly contextModule: ContextModule;\n};\n\nexport type SignTransactionDAError =\n | OpenAppDAError\n | SendCommandInAppDAError<SolanaAppErrorCodes>;\n\ntype SignTransactionDARequiredInteraction =\n | UserInteractionRequired\n | OpenAppDARequiredInteraction;\n\nexport type SignTransactionDAIntermediateValue = {\n requiredUserInteraction: SignTransactionDARequiredInteraction;\n};\n\nexport type SignTransactionDAState = DeviceActionState<\n SignTransactionDAOutput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n>;\n\nexport type SignTransactionDAInternalState = {\n readonly error: SignTransactionDAError | null;\n readonly signature: Signature | null;\n readonly appConfig: AppConfiguration | null;\n readonly solanaTransactionContext: SolanaTransactionContextResultSuccess | null;\n readonly inspectorResult: TxInspectorResult | null;\n};\n\nexport type SignTransactionDAReturnType = ExecuteDeviceActionReturnType<\n SignTransactionDAOutput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n>;\n"],
4
+ "sourcesContent": ["import { type ContextModule } from \"@ledgerhq/context-module\";\nimport { type SolanaTransactionContextResultSuccess } from \"@ledgerhq/context-module/src/solana/domain/solanaContextTypes.js\";\nimport {\n type DeviceActionState,\n type ExecuteDeviceActionReturnType,\n type OpenAppDAError,\n type OpenAppDARequiredInteraction,\n type SendCommandInAppDAError,\n type UserInteractionRequired,\n} from \"@ledgerhq/device-management-kit\";\n\nimport { type AppConfiguration } from \"@api/model/AppConfiguration\";\nimport { type Signature } from \"@api/model/Signature\";\nimport { type Transaction } from \"@api/model/Transaction\";\nimport { type TransactionResolutionContext } from \"@api/model/TransactionResolutionContext\";\nimport { type SolanaAppErrorCodes } from \"@internal/app-binder/command/utils/SolanaApplicationErrors\";\nimport { type TxInspectorResult } from \"@internal/app-binder/services/TransactionInspector\";\n\nexport type SignTransactionDAOutput = Signature;\n\nexport type SignTransactionDAInput = {\n readonly derivationPath: string;\n readonly transaction: Transaction;\n readonly resolutionContext?: TransactionResolutionContext;\n readonly skipOpenApp: boolean;\n readonly contextModule: ContextModule;\n};\n\nexport type SignTransactionDAError =\n | OpenAppDAError\n | SendCommandInAppDAError<SolanaAppErrorCodes>;\n\ntype SignTransactionDARequiredInteraction =\n | UserInteractionRequired\n | OpenAppDARequiredInteraction;\n\nexport type SignTransactionDAIntermediateValue = {\n requiredUserInteraction: SignTransactionDARequiredInteraction;\n};\n\nexport type SignTransactionDAState = DeviceActionState<\n SignTransactionDAOutput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n>;\n\nexport type SignTransactionDAInternalState = {\n readonly error: SignTransactionDAError | null;\n readonly signature: Signature | null;\n readonly appConfig: AppConfiguration | null;\n readonly solanaTransactionContext: SolanaTransactionContextResultSuccess | null;\n readonly inspectorResult: TxInspectorResult | null;\n};\n\nexport type SignTransactionDAReturnType = ExecuteDeviceActionReturnType<\n SignTransactionDAOutput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue\n>;\n"],
5
5
  "mappings": "+WAAA,IAAAA,EAAA,kBAAAC,EAAAD",
6
6
  "names": ["SignTransactionDeviceActionTypes_exports", "__toCommonJS"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/device-action/SignTransactionDeviceAction.ts"],
4
- "sourcesContent": ["import {\n type CommandErrorResult,\n type CommandResult,\n type DeviceActionStateMachine,\n DeviceModelId,\n type InternalApi,\n isSuccessCommandResult,\n OpenAppDeviceAction,\n type StateMachineTypes,\n UnknownDAError,\n UserInteractionRequired,\n XStateDeviceAction,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, type Maybe, Right } from \"purify-ts\";\nimport { assign, fromPromise, setup } from \"xstate\";\n\nimport {\n type SignTransactionDAError,\n type SignTransactionDAInput,\n type SignTransactionDAIntermediateValue,\n type SignTransactionDAInternalState,\n type SignTransactionDAOutput,\n} from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { type AppConfiguration } from \"@api/model/AppConfiguration\";\nimport { type Signature } from \"@api/model/Signature\";\nimport { type TransactionResolutionContext } from \"@api/model/TransactionResolutionContext\";\nimport { GetAppConfigurationCommand } from \"@internal/app-binder/command/GetAppConfigurationCommand\";\nimport { SignTransactionCommand } from \"@internal/app-binder/command/SignTransactionCommand\";\nimport { type SolanaAppErrorCodes } from \"@internal/app-binder/command/utils/SolanaApplicationErrors\";\nimport { ApplicationChecker } from \"@internal/app-binder/services/ApplicationChecker\";\nimport {\n SolanaTransactionTypes,\n TransactionInspector,\n} from \"@internal/app-binder/services/TransactionInspector\";\nimport { type TxInspectorResult } from \"@internal/app-binder/services/utils/transactionDecoders\";\nimport {\n BuildTransactionContextTask,\n type BuildTransactionContextTaskArgs,\n type SolanaBuildContextResult,\n} from \"@internal/app-binder/task/BuildTransactionContextTask\";\nimport {\n ProvideSolanaTransactionContextTask,\n type SolanaContextForDevice,\n} from \"@internal/app-binder/task/ProvideTransactionContextTask\";\nimport { SignDataTask } from \"@internal/app-binder/task/SendSignDataTask\";\n\nexport type MachineDependencies = {\n readonly getAppConfig: () => Promise<\n CommandResult<AppConfiguration, SolanaAppErrorCodes>\n >;\n readonly buildContext: (arg0: {\n input: BuildTransactionContextTaskArgs;\n }) => Promise<SolanaBuildContextResult>;\n readonly provideContext: (arg0: {\n input: SolanaContextForDevice;\n }) => Promise<Maybe<CommandErrorResult<SolanaAppErrorCodes>>>;\n readonly inspectTransaction: (arg0: {\n serializedTransaction: Uint8Array;\n resolutionContext?: TransactionResolutionContext;\n }) => Promise<TxInspectorResult>;\n readonly signTransaction: (arg0: {\n input: {\n derivationPath: string;\n serializedTransaction: Uint8Array;\n };\n }) => Promise<\n CommandResult<Maybe<Signature | SolanaAppErrorCodes>, SolanaAppErrorCodes>\n >;\n};\n\nexport class SignTransactionDeviceAction extends XStateDeviceAction<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n> {\n makeStateMachine(\n internalApi: InternalApi,\n ): DeviceActionStateMachine<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n > {\n type types = StateMachineTypes<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n >;\n\n const {\n signTransaction,\n getAppConfig,\n buildContext,\n provideContext,\n inspectTransaction,\n } = this.extractDependencies(internalApi);\n\n return setup({\n types: {\n input: {} as types[\"input\"],\n context: {} as types[\"context\"],\n output: {} as types[\"output\"],\n },\n actors: {\n openAppStateMachine: new OpenAppDeviceAction({\n input: { appName: \"Solana\" },\n }).makeStateMachine(internalApi),\n\n getAppConfig: fromPromise(getAppConfig),\n inspectTransaction: fromPromise(\n ({\n input,\n }: {\n input: {\n serializedTransaction: Uint8Array;\n resolutionContext?: TransactionResolutionContext;\n };\n }) =>\n inspectTransaction({\n serializedTransaction: input.serializedTransaction,\n resolutionContext: input.resolutionContext,\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 }) => context.input.skipOpenApp,\n isSPLSupported: ({ context }) =>\n new ApplicationChecker(\n internalApi.getDeviceSessionState(),\n context._internalState.appConfig!,\n )\n .withMinVersionExclusive(\"1.4.0\")\n .excludeDeviceModel(DeviceModelId.NANO_S)\n .check(),\n isAnSPLTransaction: ({ context }) =>\n context._internalState.inspectorResult?.transactionType ===\n SolanaTransactionTypes.SPL,\n shouldSkipInspection: ({ context }) =>\n context._internalState.error === null &&\n !!context.input.resolutionContext,\n },\n actions: {\n assignErrorFromEvent: assign({\n _internalState: (_) => ({\n ..._.context._internalState,\n error: new UnknownDAError(\n _.event[\"error\"] instanceof Error\n ? _.event[\"error\"].message\n : String(_.event[\"error\"]),\n ),\n }),\n }),\n },\n }).createMachine({\n id: \"SignTransactionDeviceAction\",\n initial: \"InitialState\",\n context: ({ input }) => ({\n input,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n _internalState: {\n error: null,\n signature: null,\n appConfig: null,\n solanaTransactionContext: null,\n inspectorResult: null,\n },\n }),\n states: {\n InitialState: {\n always: [\n { target: \"GetAppConfig\", guard: \"skipOpenApp\" },\n { target: \"OpenAppDeviceAction\" },\n ],\n },\n OpenAppDeviceAction: {\n exit: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n invoke: {\n id: \"openAppStateMachine\",\n src: \"openAppStateMachine\",\n input: () => ({ appName: \"Solana\" }),\n onSnapshot: {\n actions: assign({\n intermediateValue: ({ event }) =>\n event.snapshot.context.intermediateValue,\n }),\n },\n onDone: {\n target: \"CheckOpenAppDeviceActionResult\",\n actions: assign({\n _internalState: ({ event, context }) =>\n event.output.caseOf({\n Right: () => context._internalState,\n Left: (error) => ({\n ...context._internalState,\n error,\n }),\n }),\n }),\n },\n },\n },\n CheckOpenAppDeviceActionResult: {\n always: [\n { target: \"GetAppConfig\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n GetAppConfig: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n invoke: {\n id: \"getAppConfig\",\n src: \"getAppConfig\",\n onDone: {\n target: \"GetAppConfigResultCheck\",\n actions: assign({\n _internalState: ({ event, context }) =>\n isSuccessCommandResult(event.output)\n ? {\n ...context._internalState,\n appConfig: event.output.data,\n }\n : { ...context._internalState, error: event.output.error },\n }),\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n GetAppConfigResultCheck: {\n always: [\n { target: \"InspectTransaction\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n InspectTransaction: {\n invoke: {\n id: \"inspectTransaction\",\n src: \"inspectTransaction\",\n\n input: ({ context }) => ({\n serializedTransaction: context.input.transaction,\n resolutionContext: context.input.resolutionContext,\n }),\n onDone: {\n target: \"AfterInspect\",\n actions: assign({\n _internalState: ({ context, event }) => ({\n ...context._internalState,\n inspectorResult: event.output,\n }),\n }),\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n AfterInspect: {\n always: [\n { target: \"BuildContext\", guard: \"isAnSPLTransaction\" },\n { target: \"SignTransaction\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n BuildContext: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n invoke: {\n id: \"buildContext\",\n src: \"buildContext\",\n input: ({ context }) => {\n const inspectorData =\n context._internalState.inspectorResult?.data;\n return {\n contextModule: context.input.contextModule,\n options: {\n tokenAddress: inspectorData?.tokenAddress,\n createATA: inspectorData?.createATA,\n },\n };\n },\n onDone: {\n target: \"ProvideContext\",\n actions: [\n assign({\n _internalState: ({ event, context }) => ({\n ...context._internalState,\n solanaTransactionContext: {\n descriptor: event.output.descriptor,\n certificate: event.output.calCertificate,\n tokenAccount: event.output.addressResult.tokenAccount,\n owner: event.output.addressResult.owner,\n contract: event.output.addressResult.contract,\n },\n }),\n }),\n ],\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n ProvideContext: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n invoke: {\n id: \"provideContext\",\n src: \"provideContext\",\n input: ({ context }) => {\n if (!context._internalState.solanaTransactionContext) {\n throw new UnknownDAError(\n \"Solana transaction context is not available\",\n );\n }\n return context._internalState.solanaTransactionContext;\n },\n onDone: {\n target: \"ProvideContextResultCheck\",\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n ProvideContextResultCheck: {\n always: [\n { target: \"SignTransaction\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n SignTransaction: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n },\n }),\n exit: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n }),\n invoke: {\n id: \"signTransaction\",\n src: \"signTransaction\",\n input: ({ context }) => {\n return {\n derivationPath: context.input.derivationPath,\n serializedTransaction: context.input.transaction,\n };\n },\n onDone: {\n target: \"SignTransactionResultCheck\",\n actions: [\n assign({\n _internalState: ({ event, context }) => {\n if (!isSuccessCommandResult(event.output))\n return {\n ...context._internalState,\n error: event.output.error,\n };\n\n const data = event.output.data.extract();\n if (\n event.output.data.isJust() &&\n data instanceof Uint8Array\n )\n return {\n ...context._internalState,\n signature: data,\n };\n\n return {\n ...context._internalState,\n error: new UnknownDAError(\"No Signature available\"),\n };\n },\n }),\n ],\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n SignTransactionResultCheck: {\n always: [\n { guard: \"noInternalError\", target: \"Success\" },\n { target: \"Error\" },\n ],\n },\n Success: { type: \"final\" },\n Error: { type: \"final\" },\n },\n output: ({ context }) =>\n context._internalState.signature\n ? Right(context._internalState.signature)\n : Left(\n context._internalState.error ||\n new UnknownDAError(`No error or signature available`),\n ),\n });\n }\n\n extractDependencies(internalApi: InternalApi): MachineDependencies {\n const getAppConfig = async () =>\n internalApi.sendCommand(new GetAppConfigurationCommand());\n\n const buildContext = async (arg0: {\n input: BuildTransactionContextTaskArgs;\n }) => new BuildTransactionContextTask(internalApi, arg0.input).run();\n\n const provideContext = async (arg0: { input: SolanaContextForDevice }) =>\n new ProvideSolanaTransactionContextTask(internalApi, arg0.input).run();\n\n const inspectTransaction = async (arg0: {\n serializedTransaction: Uint8Array;\n resolutionContext?: TransactionResolutionContext;\n }) =>\n Promise.resolve(\n new TransactionInspector(\n arg0.serializedTransaction,\n arg0.resolutionContext?.tokenAddress ?? null,\n arg0.resolutionContext?.createATA ?? null,\n ).inspectTransactionType(),\n );\n\n const signTransaction = async (arg0: {\n input: {\n derivationPath: string;\n serializedTransaction: Uint8Array;\n };\n }) =>\n new SignDataTask(internalApi, {\n commandFactory: (args) =>\n new SignTransactionCommand({\n serializedTransaction: args.chunkedData,\n more: args.more,\n extend: args.extend,\n }),\n derivationPath: arg0.input.derivationPath,\n sendingData: arg0.input.serializedTransaction,\n }).run();\n\n return {\n getAppConfig,\n buildContext,\n provideContext,\n signTransaction,\n inspectTransaction,\n };\n }\n}\n"],
4
+ "sourcesContent": ["import {\n type CommandErrorResult,\n type CommandResult,\n type DeviceActionStateMachine,\n DeviceModelId,\n type InternalApi,\n isSuccessCommandResult,\n OpenAppDeviceAction,\n type StateMachineTypes,\n UnknownDAError,\n UserInteractionRequired,\n XStateDeviceAction,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, type Maybe, Right } from \"purify-ts\";\nimport { assign, fromPromise, setup } from \"xstate\";\n\nimport {\n type SignTransactionDAError,\n type SignTransactionDAInput,\n type SignTransactionDAIntermediateValue,\n type SignTransactionDAInternalState,\n type SignTransactionDAOutput,\n} from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { type AppConfiguration } from \"@api/model/AppConfiguration\";\nimport { type Signature } from \"@api/model/Signature\";\nimport { type TransactionResolutionContext } from \"@api/model/TransactionResolutionContext\";\nimport { GetAppConfigurationCommand } from \"@internal/app-binder/command/GetAppConfigurationCommand\";\nimport { SignTransactionCommand } from \"@internal/app-binder/command/SignTransactionCommand\";\nimport { type SolanaAppErrorCodes } from \"@internal/app-binder/command/utils/SolanaApplicationErrors\";\nimport { ApplicationChecker } from \"@internal/app-binder/services/ApplicationChecker\";\nimport {\n SolanaTransactionTypes,\n TransactionInspector,\n} from \"@internal/app-binder/services/TransactionInspector\";\nimport { type TxInspectorResult } from \"@internal/app-binder/services/TransactionInspector\";\nimport {\n BuildTransactionContextTask,\n type BuildTransactionContextTaskArgs,\n type SolanaBuildContextResult,\n} from \"@internal/app-binder/task/BuildTransactionContextTask\";\nimport {\n ProvideSolanaTransactionContextTask,\n type SolanaContextForDevice,\n} from \"@internal/app-binder/task/ProvideTransactionContextTask\";\nimport { SignDataTask } from \"@internal/app-binder/task/SendSignDataTask\";\n\nexport type MachineDependencies = {\n readonly getAppConfig: () => Promise<\n CommandResult<AppConfiguration, SolanaAppErrorCodes>\n >;\n readonly buildContext: (arg0: {\n input: BuildTransactionContextTaskArgs;\n }) => Promise<SolanaBuildContextResult>;\n readonly provideContext: (arg0: {\n input: SolanaContextForDevice;\n }) => Promise<Maybe<CommandErrorResult<SolanaAppErrorCodes>>>;\n readonly inspectTransaction: (arg0: {\n serializedTransaction: Uint8Array;\n resolutionContext?: TransactionResolutionContext;\n }) => Promise<TxInspectorResult>;\n readonly signTransaction: (arg0: {\n input: {\n derivationPath: string;\n serializedTransaction: Uint8Array;\n };\n }) => Promise<\n CommandResult<Maybe<Signature | SolanaAppErrorCodes>, SolanaAppErrorCodes>\n >;\n};\n\nexport class SignTransactionDeviceAction extends XStateDeviceAction<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n> {\n makeStateMachine(\n internalApi: InternalApi,\n ): DeviceActionStateMachine<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n > {\n type types = StateMachineTypes<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n >;\n\n const {\n signTransaction,\n getAppConfig,\n buildContext,\n provideContext,\n inspectTransaction,\n } = this.extractDependencies(internalApi);\n\n return setup({\n types: {\n input: {} as types[\"input\"],\n context: {} as types[\"context\"],\n output: {} as types[\"output\"],\n },\n actors: {\n openAppStateMachine: new OpenAppDeviceAction({\n input: { appName: \"Solana\" },\n }).makeStateMachine(internalApi),\n\n getAppConfig: fromPromise(getAppConfig),\n inspectTransaction: fromPromise(\n ({\n input,\n }: {\n input: {\n serializedTransaction: Uint8Array;\n resolutionContext?: TransactionResolutionContext;\n };\n }) =>\n inspectTransaction({\n serializedTransaction: input.serializedTransaction,\n resolutionContext: input.resolutionContext,\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 }) => context.input.skipOpenApp,\n isSPLSupported: ({ context }) =>\n new ApplicationChecker(\n internalApi.getDeviceSessionState(),\n context._internalState.appConfig!,\n )\n .withMinVersionExclusive(\"1.4.0\")\n .excludeDeviceModel(DeviceModelId.NANO_S)\n .check(),\n isAnSPLTransaction: ({ context }) =>\n context._internalState.inspectorResult?.transactionType ===\n SolanaTransactionTypes.SPL,\n shouldSkipInspection: ({ context }) =>\n context._internalState.error === null &&\n !!context.input.resolutionContext,\n },\n actions: {\n assignErrorFromEvent: assign({\n _internalState: (_) => ({\n ..._.context._internalState,\n error: new UnknownDAError(\n _.event[\"error\"] instanceof Error\n ? _.event[\"error\"].message\n : String(_.event[\"error\"]),\n ),\n }),\n }),\n },\n }).createMachine({\n id: \"SignTransactionDeviceAction\",\n initial: \"InitialState\",\n context: ({ input }) => ({\n input,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n _internalState: {\n error: null,\n signature: null,\n appConfig: null,\n solanaTransactionContext: null,\n inspectorResult: null,\n },\n }),\n states: {\n InitialState: {\n always: [\n { target: \"GetAppConfig\", guard: \"skipOpenApp\" },\n { target: \"OpenAppDeviceAction\" },\n ],\n },\n OpenAppDeviceAction: {\n exit: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n invoke: {\n id: \"openAppStateMachine\",\n src: \"openAppStateMachine\",\n input: () => ({ appName: \"Solana\" }),\n onSnapshot: {\n actions: assign({\n intermediateValue: ({ event }) =>\n event.snapshot.context.intermediateValue,\n }),\n },\n onDone: {\n target: \"CheckOpenAppDeviceActionResult\",\n actions: assign({\n _internalState: ({ event, context }) =>\n event.output.caseOf({\n Right: () => context._internalState,\n Left: (error) => ({\n ...context._internalState,\n error,\n }),\n }),\n }),\n },\n },\n },\n CheckOpenAppDeviceActionResult: {\n always: [\n { target: \"GetAppConfig\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n GetAppConfig: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n invoke: {\n id: \"getAppConfig\",\n src: \"getAppConfig\",\n onDone: {\n target: \"GetAppConfigResultCheck\",\n actions: assign({\n _internalState: ({ event, context }) =>\n isSuccessCommandResult(event.output)\n ? {\n ...context._internalState,\n appConfig: event.output.data,\n }\n : { ...context._internalState, error: event.output.error },\n }),\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n GetAppConfigResultCheck: {\n always: [\n { target: \"InspectTransaction\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n InspectTransaction: {\n invoke: {\n id: \"inspectTransaction\",\n src: \"inspectTransaction\",\n\n input: ({ context }) => ({\n serializedTransaction: context.input.transaction,\n resolutionContext: context.input.resolutionContext,\n }),\n onDone: {\n target: \"AfterInspect\",\n actions: assign({\n _internalState: ({ context, event }) => ({\n ...context._internalState,\n inspectorResult: event.output,\n }),\n }),\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n AfterInspect: {\n always: [\n { target: \"BuildContext\", guard: \"isAnSPLTransaction\" },\n { target: \"SignTransaction\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n BuildContext: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n invoke: {\n id: \"buildContext\",\n src: \"buildContext\",\n input: ({ context }) => {\n const inspectorData =\n context._internalState.inspectorResult?.data;\n return {\n contextModule: context.input.contextModule,\n options: {\n tokenAddress: inspectorData?.tokenAddress,\n createATA: inspectorData?.createATA,\n },\n };\n },\n onDone: {\n target: \"ProvideContext\",\n actions: [\n assign({\n _internalState: ({ event, context }) => ({\n ...context._internalState,\n solanaTransactionContext: {\n descriptor: event.output.descriptor,\n certificate: event.output.calCertificate,\n tokenAccount: event.output.addressResult.tokenAccount,\n owner: event.output.addressResult.owner,\n contract: event.output.addressResult.contract,\n },\n }),\n }),\n ],\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n ProvideContext: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n invoke: {\n id: \"provideContext\",\n src: \"provideContext\",\n input: ({ context }) => {\n if (!context._internalState.solanaTransactionContext) {\n throw new UnknownDAError(\n \"Solana transaction context is not available\",\n );\n }\n return context._internalState.solanaTransactionContext;\n },\n onDone: {\n target: \"ProvideContextResultCheck\",\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n ProvideContextResultCheck: {\n always: [\n { target: \"SignTransaction\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n SignTransaction: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n },\n }),\n exit: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n }),\n invoke: {\n id: \"signTransaction\",\n src: \"signTransaction\",\n input: ({ context }) => {\n return {\n derivationPath: context.input.derivationPath,\n serializedTransaction: context.input.transaction,\n };\n },\n onDone: {\n target: \"SignTransactionResultCheck\",\n actions: [\n assign({\n _internalState: ({ event, context }) => {\n if (!isSuccessCommandResult(event.output))\n return {\n ...context._internalState,\n error: event.output.error,\n };\n\n const data = event.output.data.extract();\n if (\n event.output.data.isJust() &&\n data instanceof Uint8Array\n )\n return {\n ...context._internalState,\n signature: data,\n };\n\n return {\n ...context._internalState,\n error: new UnknownDAError(\"No Signature available\"),\n };\n },\n }),\n ],\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n SignTransactionResultCheck: {\n always: [\n { guard: \"noInternalError\", target: \"Success\" },\n { target: \"Error\" },\n ],\n },\n Success: { type: \"final\" },\n Error: { type: \"final\" },\n },\n output: ({ context }) =>\n context._internalState.signature\n ? Right(context._internalState.signature)\n : Left(\n context._internalState.error ||\n new UnknownDAError(`No error or signature available`),\n ),\n });\n }\n\n extractDependencies(internalApi: InternalApi): MachineDependencies {\n const getAppConfig = async () =>\n internalApi.sendCommand(new GetAppConfigurationCommand());\n\n const buildContext = async (arg0: {\n input: BuildTransactionContextTaskArgs;\n }) => new BuildTransactionContextTask(internalApi, arg0.input).run();\n\n const provideContext = async (arg0: { input: SolanaContextForDevice }) =>\n new ProvideSolanaTransactionContextTask(internalApi, arg0.input).run();\n\n const inspectTransaction = async (arg0: {\n serializedTransaction: Uint8Array;\n resolutionContext?: TransactionResolutionContext;\n }) =>\n Promise.resolve(\n new TransactionInspector(\n arg0.serializedTransaction,\n arg0.resolutionContext?.tokenAddress ?? null,\n arg0.resolutionContext?.createATA ?? null,\n ).inspectTransactionType(),\n );\n\n const signTransaction = async (arg0: {\n input: {\n derivationPath: string;\n serializedTransaction: Uint8Array;\n };\n }) =>\n new SignDataTask(internalApi, {\n commandFactory: (args) =>\n new SignTransactionCommand({\n serializedTransaction: args.chunkedData,\n more: args.more,\n extend: args.extend,\n }),\n derivationPath: arg0.input.derivationPath,\n sendingData: arg0.input.serializedTransaction,\n }).run();\n\n return {\n getAppConfig,\n buildContext,\n provideContext,\n signTransaction,\n inspectTransaction,\n };\n }\n}\n"],
5
5
  "mappings": "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",
6
6
  "names": ["SignTransactionDeviceAction_exports", "__export", "SignTransactionDeviceAction", "__toCommonJS", "import_device_management_kit", "import_purify_ts", "import_xstate", "import_GetAppConfigurationCommand", "import_SignTransactionCommand", "import_ApplicationChecker", "import_TransactionInspector", "import_BuildTransactionContextTask", "import_ProvideTransactionContextTask", "import_SendSignDataTask", "internalApi", "signTransaction", "getAppConfig", "buildContext", "provideContext", "inspectTransaction", "input", "context", "_", "event", "error", "inspectorData", "data", "arg0", "args"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var f=Object.defineProperty;var x=Object.getOwnPropertyDescriptor;var k=Object.getOwnPropertyNames;var S=Object.prototype.hasOwnProperty;var h=(a,e)=>{for(var t in e)f(a,t,{get:e[t],enumerable:!0})},L=(a,e,t,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of k(e))!S.call(a,o)&&o!==t&&f(a,o,{get:()=>e[o],enumerable:!(n=x(e,o))||n.enumerable});return a};var D=a=>L(f({},"__esModule",{value:!0}),a);var C={};h(C,{SolanaTransactionTypes:()=>K,TransactionInspector:()=>N});module.exports=D(C);var m=require("@solana/spl-token"),i=require("@solana/web3.js"),I=require("buffer"),T=require("../../app-binder/services/utils/transactionDecoders"),K=(t=>(t.STANDARD="Standard",t.SPL="SPL",t))(K||{});const R="http://api.mainnet-beta.solana.com/",M=new i.Connection(R,{commitment:"confirmed"}),g=a=>!!a&&(a.equals(m.ASSOCIATED_TOKEN_PROGRAM_ID)||a.equals(m.TOKEN_PROGRAM_ID)||a.equals(m.TOKEN_2022_PROGRAM_ID));class N{constructor(e,t,n){this.rawTransactionBytes=e;this.tokenAddress=t;this.createATA=n}async inspectTransactionType(){try{const e=await this.normaliseMessage(this.rawTransactionBytes);if(this.tokenAddress||this.createATA){const t=e.compiledInstructions.some(o=>g(e.allKeys[o.programIdIndex])),n={};return this.tokenAddress&&(n.tokenAddress=this.tokenAddress),this.createATA&&(n.createATA=this.createATA,!n.mintAddress&&this.createATA.mintAddress&&(n.mintAddress=this.createATA.mintAddress)),{transactionType:t?"SPL":"Standard",data:n}}for(const t of e.compiledInstructions){const n=e.allKeys[t.programIdIndex];if(!n)continue;const o=t.accountKeyIndexes.map(r=>e.allKeys[r]).filter(r=>!!r),y=new i.TransactionInstruction({programId:n,keys:o.map(r=>({pubkey:r,isSigner:!1,isWritable:!1})),data:I.Buffer.from(t.data)}),l={programId:n,ixMeta:t,message:e,instruction:y};for(const r of T.DECODERS){if(!r.when(l))continue;const u=r.decode(l);if(u)return{transactionType:"SPL",data:u}}if(g(n))return{transactionType:"SPL",data:{}}}return{transactionType:"Standard",data:{}}}catch{return{transactionType:"Standard",data:{}}}}async normaliseMessage(e){const t=this.tryDeserialiseVersioned(e);if(t){const s=t.message,c=await w(s);let A;return typeof s.getAccountKeys=="function"?A=s.getAccountKeys(c?{accountKeysFromLookups:c}:void 0).keySegments().flat():A=[...s.staticAccountKeys],{compiledInstructions:s.compiledInstructions.map(d=>{const b=d,P=Array.from(b.accounts??d.accountKeyIndexes??[]);let p;return d.data instanceof Uint8Array?p=d.data:typeof d.data=="string"?p=I.Buffer.from(d.data,"base64"):p=Uint8Array.from(d.data??[]),{programIdIndex:d.programIdIndex,accountKeyIndexes:P,data:p}}),allKeys:A}}const n=i.Transaction.from(e),o=new Map,y=s=>{if(!s)return;const c=s.toBase58();o.has(c)||o.set(c,s)};y(n.feePayer??null);for(const s of n.instructions){y(s.programId);for(const c of s.keys)y(c.pubkey)}const l=Array.from(o.values()),r=new Map(l.map((s,c)=>[s.toBase58(),c]));return{compiledInstructions:n.instructions.map(s=>({programIdIndex:r.get(s.programId.toBase58())??-1,accountKeyIndexes:s.keys.map(c=>r.get(c.pubkey.toBase58())??-1),data:s.data})),allKeys:l}}tryDeserialiseVersioned(e){try{return i.VersionedTransaction.deserialize(e)}catch{try{return{message:i.VersionedMessage.deserialize(e)}}catch{return null}}}}async function w(a){const e=a.addressTableLookups??[];if(!e.length)return;const t=[],n=[];return await Promise.all(e.map(async o=>{const l=(await M.getAddressLookupTable(o.accountKey)).value;if(!l)return;const r=l.state.addresses;for(const u of o.writableIndexes??[]){const s=r[u];s&&t.push(s)}for(const u of o.readonlyIndexes??[]){const s=r[u];s&&n.push(s)}})),{writable:t,readonly:n}}0&&(module.exports={SolanaTransactionTypes,TransactionInspector});
1
+ "use strict";var f=Object.defineProperty;var k=Object.getOwnPropertyDescriptor;var x=Object.getOwnPropertyNames;var S=Object.prototype.hasOwnProperty;var L=(r,s)=>{for(var a in s)f(r,a,{get:s[a],enumerable:!0})},h=(r,s,a,t)=>{if(s&&typeof s=="object"||typeof s=="function")for(let n of x(s))!S.call(r,n)&&n!==a&&f(r,n,{get:()=>s[n],enumerable:!(t=k(s,n))||t.enumerable});return r};var D=r=>h(f({},"__esModule",{value:!0}),r);var C={};L(C,{SolanaTransactionTypes:()=>K,TransactionInspector:()=>w});module.exports=D(C);var m=require("@solana/spl-token"),i=require("@solana/web3.js"),T=require("buffer"),g=require("../../app-binder/services/utils/transactionDecoders"),K=(a=>(a.STANDARD="Standard",a.SPL="SPL",a))(K||{});const R="https://api.mainnet-beta.solana.com/",M=new i.Connection(R,{commitment:"confirmed"}),I=r=>!!r&&(r.equals(m.ASSOCIATED_TOKEN_PROGRAM_ID)||r.equals(m.TOKEN_PROGRAM_ID)||r.equals(m.TOKEN_2022_PROGRAM_ID));class w{constructor(s,a,t){this.rawTransactionBytes=s;this.tokenAddress=a;this.createATA=t}async inspectTransactionType(){try{const s=await this.normaliseMessage(this.rawTransactionBytes);if(this.tokenAddress||this.createATA)return{transactionType:s.compiledInstructions.some(c=>I(s.allKeys[c.programIdIndex]))?"SPL":"Standard",data:{...this.tokenAddress?{tokenAddress:this.tokenAddress}:{},...this.createATA?{createATA:this.createATA}:{}}};let a=!1,t={};for(const n of s.compiledInstructions){const c=s.allKeys[n.programIdIndex];if(!c)continue;I(c)&&(a=!0);const l=n.accountKeyIndexes.map(e=>s.allKeys[e]).filter(e=>!!e),u=new i.TransactionInstruction({programId:c,keys:l.map(e=>({pubkey:e,isSigner:!1,isWritable:!1})),data:T.Buffer.from(n.data)}),y={programId:c,ixMeta:n,message:s,instruction:u};for(const e of g.DECODERS){if(!e.when(y))continue;const o=e.decode(y);o&&(o.createATA&&!t.createATA?t={...t,createATA:o.createATA}:o.tokenAddress&&!t.tokenAddress&&!t.createATA&&(t={...t,tokenAddress:o.tokenAddress}))}}return t.createATA?{transactionType:"SPL",data:t}:t.tokenAddress?{transactionType:"SPL",data:t}:a?{transactionType:"SPL",data:{}}:{transactionType:"Standard",data:{}}}catch{return{transactionType:"Standard",data:{}}}}async normaliseMessage(s){const a=this.tryDeserialiseVersioned(s);if(a){const e=a.message,o=await N(e);let A;return typeof e.getAccountKeys=="function"?A=e.getAccountKeys(o?{accountKeysFromLookups:o}:void 0).keySegments().flat():A=[...e.staticAccountKeys],{compiledInstructions:e.compiledInstructions.map(d=>{const b=d,P=Array.from(b.accounts??d.accountKeyIndexes??[]);let p;return d.data instanceof Uint8Array?p=d.data:typeof d.data=="string"?p=T.Buffer.from(d.data,"base64"):p=Uint8Array.from(d.data??[]),{programIdIndex:d.programIdIndex,accountKeyIndexes:P,data:p}}),allKeys:A}}const t=i.Transaction.from(s),n=new Map,c=e=>{if(!e)return;const o=e.toBase58();n.has(o)||n.set(o,e)};c(t.feePayer??null);for(const e of t.instructions){c(e.programId);for(const o of e.keys)c(o.pubkey)}const l=Array.from(n.values()),u=new Map(l.map((e,o)=>[e.toBase58(),o]));return{compiledInstructions:t.instructions.map(e=>({programIdIndex:u.get(e.programId.toBase58())??-1,accountKeyIndexes:e.keys.map(o=>u.get(o.pubkey.toBase58())??-1),data:e.data})),allKeys:l}}tryDeserialiseVersioned(s){try{return i.VersionedTransaction.deserialize(s)}catch{try{return{message:i.VersionedMessage.deserialize(s)}}catch{return null}}}}async function N(r){const s=r.addressTableLookups??[];if(!s.length)return;const a=[],t=[];return await Promise.all(s.map(async n=>{const l=(await M.getAddressLookupTable(n.accountKey)).value;if(!l)return;const u=l.state.addresses;for(const y of n.writableIndexes??[]){const e=u[y];e&&a.push(e)}for(const y of n.readonlyIndexes??[]){const e=u[y];e&&t.push(e)}})),{writable:a,readonly:t}}0&&(module.exports={SolanaTransactionTypes,TransactionInspector});
2
2
  //# sourceMappingURL=TransactionInspector.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/services/TransactionInspector.ts"],
4
- "sourcesContent": ["import {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n TOKEN_2022_PROGRAM_ID,\n TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport {\n Connection,\n type PublicKey,\n Transaction,\n TransactionInstruction,\n VersionedMessage,\n VersionedTransaction,\n} from \"@solana/web3.js\";\nimport { Buffer } from \"buffer\";\n\nimport {\n DECODERS,\n type IxContext,\n type TxInspectorResult,\n} from \"@internal/app-binder/services/utils/transactionDecoders\";\n\nexport enum SolanaTransactionTypes {\n STANDARD = \"Standard\",\n SPL = \"SPL\",\n}\n\nexport type NormalizedCompiledIx = {\n programIdIndex: number;\n accountKeyIndexes: number[];\n data: Uint8Array;\n};\n\nexport type NormalizedMessage = {\n compiledInstructions: NormalizedCompiledIx[];\n allKeys: PublicKey[];\n};\n\ntype LoadedAddresses = { writable: PublicKey[]; readonly: PublicKey[] };\n\nconst RPC_URL = \"http://api.mainnet-beta.solana.com/\";\n\nconst defaultConnection = new Connection(RPC_URL, { commitment: \"confirmed\" });\n\nconst isSPLProgramId = (pid: PublicKey | undefined) =>\n !!pid &&\n (pid.equals(ASSOCIATED_TOKEN_PROGRAM_ID) ||\n pid.equals(TOKEN_PROGRAM_ID) ||\n pid.equals(TOKEN_2022_PROGRAM_ID));\n\nexport class TransactionInspector {\n constructor(\n private readonly rawTransactionBytes: Uint8Array,\n private readonly tokenAddress?: string | null,\n private readonly createATA?: {\n address: string;\n mintAddress: string;\n } | null,\n ) {}\n\n public async inspectTransactionType(): Promise<TxInspectorResult> {\n try {\n const message = await this.normaliseMessage(this.rawTransactionBytes);\n\n // If tokenAddress or createATA is provided, use those directly\n // and only classify SPL vs Standard by scanning program IDs.\n if (this.tokenAddress || this.createATA) {\n const looksSPL = message.compiledInstructions.some((ix) =>\n isSPLProgramId(message.allKeys[ix.programIdIndex]),\n );\n\n const data: TxInspectorResult[\"data\"] = {};\n if (this.tokenAddress) data.tokenAddress = this.tokenAddress;\n if (this.createATA) {\n data.createATA = this.createATA;\n // If mint is known from createATA and caller didn't pass mintAddress explicitly,\n // populate it so downstream UI has the same shape as decoder output.\n if (!data.mintAddress && this.createATA.mintAddress) {\n data.mintAddress = this.createATA.mintAddress;\n }\n }\n\n return {\n transactionType: looksSPL\n ? SolanaTransactionTypes.SPL\n : SolanaTransactionTypes.STANDARD,\n data,\n };\n }\n\n // Normal path: decode from the message\n for (const ixMeta of message.compiledInstructions) {\n const programId = message.allKeys[ixMeta.programIdIndex];\n if (!programId) continue;\n\n const resolvedKeys = ixMeta.accountKeyIndexes\n .map((i) => message.allKeys[i])\n .filter((key): key is PublicKey => !!key);\n\n // Build an instruction even with partial keys; decoders handle missing fields gracefully.\n const instruction = new TransactionInstruction({\n programId,\n keys: resolvedKeys.map((key) => ({\n pubkey: key,\n isSigner: false,\n isWritable: false,\n })),\n data: Buffer.from(ixMeta.data),\n });\n\n const ctx: IxContext = { programId, ixMeta, message, instruction };\n\n for (const decoder of DECODERS) {\n if (!decoder.when(ctx)) continue;\n const data = decoder.decode(ctx);\n if (data) {\n return { transactionType: SolanaTransactionTypes.SPL, data };\n }\n }\n\n if (isSPLProgramId(programId)) {\n return { transactionType: SolanaTransactionTypes.SPL, data: {} };\n }\n }\n\n return { transactionType: SolanaTransactionTypes.STANDARD, data: {} };\n } catch {\n return { transactionType: SolanaTransactionTypes.STANDARD, data: {} };\n }\n }\n\n /**\n * Normalise any tx (legacy or v0) into { compiledInstructions, allKeys }.\n * For v0, we auto-fetch looked-up addresses from ALT(s) via the baked-in connection.\n */\n private async normaliseMessage(\n rawBytes: Uint8Array,\n ): Promise<NormalizedMessage> {\n const versionedTX = this.tryDeserialiseVersioned(rawBytes);\n if (versionedTX) {\n const msg = versionedTX.message as VersionedMessage & {\n getAccountKeys?: (options?: {\n accountKeysFromLookups?: LoadedAddresses;\n }) => {\n staticAccountKeys: PublicKey[];\n accountKeysFromLookups?: LoadedAddresses;\n keySegments: () => PublicKey[][];\n };\n compiledInstructions: Array<{\n programIdIndex: number;\n accountKeyIndexes?: number[]; // legacy field name\n accounts?: number[]; // v0 field name\n data: Uint8Array | string | number[];\n }>;\n staticAccountKeys: PublicKey[];\n };\n\n const lookedUp = await resolveLookedUpAddressesFromMessage(msg);\n\n let allKeys: PublicKey[];\n if (typeof msg.getAccountKeys === \"function\") {\n const messageAccountKeys = msg.getAccountKeys(\n lookedUp ? { accountKeysFromLookups: lookedUp } : undefined,\n );\n allKeys = messageAccountKeys.keySegments().flat();\n } else {\n allKeys = [...msg.staticAccountKeys];\n }\n\n const compiledInstructions: NormalizedCompiledIx[] =\n msg.compiledInstructions.map((ix) => {\n const ixWithAccounts = ix as typeof ix & { accounts?: number[] };\n const accountKeyIndexes = Array.from(\n ixWithAccounts.accounts ?? ix.accountKeyIndexes ?? [],\n ) as number[];\n\n let data: Uint8Array;\n if (ix.data instanceof Uint8Array) {\n data = ix.data;\n } else if (typeof ix.data === \"string\") {\n data = Buffer.from(ix.data, \"base64\"); // v0 encodes instruction data as base64\n } else {\n data = Uint8Array.from(ix.data ?? []);\n }\n\n return {\n programIdIndex: ix.programIdIndex,\n accountKeyIndexes,\n data,\n };\n });\n\n return { compiledInstructions, allKeys };\n }\n\n // Legacy (no ALTs)\n const legacy = Transaction.from(rawBytes);\n\n const allKeyMap = new Map<string, PublicKey>();\n const add = (pubkey?: PublicKey | null) => {\n if (!pubkey) return;\n const key = pubkey.toBase58();\n if (!allKeyMap.has(key)) allKeyMap.set(key, pubkey);\n };\n\n add(legacy.feePayer ?? null);\n for (const ix of legacy.instructions) {\n add(ix.programId);\n for (const key of ix.keys) add(key.pubkey);\n }\n const allKeys = Array.from(allKeyMap.values());\n const indexByB58 = new Map(allKeys.map((pk, i) => [pk.toBase58(), i]));\n\n const compiledInstructions: NormalizedCompiledIx[] =\n legacy.instructions.map((ix) => ({\n programIdIndex: indexByB58.get(ix.programId.toBase58()) ?? -1,\n accountKeyIndexes: ix.keys.map(\n (key) => indexByB58.get(key.pubkey.toBase58()) ?? -1,\n ),\n data: ix.data,\n }));\n\n return { compiledInstructions, allKeys };\n }\n\n private tryDeserialiseVersioned(\n rawBytes: Uint8Array,\n ): VersionedTransaction | null {\n try {\n return VersionedTransaction.deserialize(rawBytes);\n } catch {\n try {\n const msg = VersionedMessage.deserialize(rawBytes);\n // Wrap in a dummy VersionedTransaction-like shape just for uniform handling\n return { message: msg } as VersionedTransaction;\n } catch {\n return null;\n }\n }\n }\n}\n\n// fetch looked-up addresses for a VersionedMessage via the baked-in connection\nasync function resolveLookedUpAddressesFromMessage(\n msg: VersionedMessage,\n): Promise<LoadedAddresses | undefined> {\n const lookups = msg.addressTableLookups ?? [];\n if (!lookups.length) return;\n\n const writable: PublicKey[] = [];\n const readonly: PublicKey[] = [];\n\n await Promise.all(\n lookups.map(async (lu) => {\n const res = await defaultConnection.getAddressLookupTable(lu.accountKey);\n const table = res.value;\n if (!table) return;\n const addrs = table.state.addresses;\n\n for (const i of lu.writableIndexes ?? []) {\n const pk = addrs[i];\n if (pk) writable.push(pk);\n }\n for (const i of lu.readonlyIndexes ?? []) {\n const pk = addrs[i];\n if (pk) readonly.push(pk);\n }\n }),\n );\n\n return { writable, readonly };\n}\n"],
5
- "mappings": "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",
6
- "names": ["TransactionInspector_exports", "__export", "SolanaTransactionTypes", "TransactionInspector", "__toCommonJS", "import_spl_token", "import_web3", "import_buffer", "import_transactionDecoders", "RPC_URL", "defaultConnection", "isSPLProgramId", "pid", "rawTransactionBytes", "tokenAddress", "createATA", "message", "looksSPL", "ix", "data", "ixMeta", "programId", "resolvedKeys", "i", "key", "instruction", "ctx", "decoder", "rawBytes", "versionedTX", "msg", "lookedUp", "resolveLookedUpAddressesFromMessage", "allKeys", "ixWithAccounts", "accountKeyIndexes", "legacy", "allKeyMap", "add", "pubkey", "indexByB58", "pk", "lookups", "writable", "readonly", "lu", "table", "addrs"]
4
+ "sourcesContent": ["import {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n TOKEN_2022_PROGRAM_ID,\n TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport {\n Connection,\n type PublicKey,\n Transaction,\n TransactionInstruction,\n VersionedMessage,\n VersionedTransaction,\n} from \"@solana/web3.js\";\nimport { Buffer } from \"buffer\";\n\nimport {\n DECODERS,\n type IxContext,\n} from \"@internal/app-binder/services/utils/transactionDecoders\";\n\nexport enum SolanaTransactionTypes {\n STANDARD = \"Standard\",\n SPL = \"SPL\",\n}\n\nexport type NormalizedCompiledIx = {\n programIdIndex: number;\n accountKeyIndexes: number[];\n data: Uint8Array;\n};\n\nexport type NormalizedMessage = {\n compiledInstructions: NormalizedCompiledIx[];\n allKeys: PublicKey[];\n};\n\nexport interface TxInspectorResult {\n transactionType: SolanaTransactionTypes;\n data: {\n tokenAddress?: string;\n createATA?: { address: string; mintAddress: string };\n };\n}\n\ntype LoadedAddresses = { writable: PublicKey[]; readonly: PublicKey[] };\n\nconst RPC_URL = \"https://api.mainnet-beta.solana.com/\";\n\nconst defaultConnection = new Connection(RPC_URL, { commitment: \"confirmed\" });\n\nconst isSPLProgramId = (pid: PublicKey | undefined) =>\n !!pid &&\n (pid.equals(ASSOCIATED_TOKEN_PROGRAM_ID) ||\n pid.equals(TOKEN_PROGRAM_ID) ||\n pid.equals(TOKEN_2022_PROGRAM_ID));\n\nexport class TransactionInspector {\n constructor(\n private readonly rawTransactionBytes: Uint8Array,\n private readonly tokenAddress?: string | null,\n private readonly createATA?: {\n address: string;\n mintAddress: string;\n } | null,\n ) {}\n\n public async inspectTransactionType(): Promise<TxInspectorResult> {\n try {\n const message = await this.normaliseMessage(this.rawTransactionBytes);\n\n // Fast path when hints are provided\n if (this.tokenAddress || this.createATA) {\n const looksSPL = message.compiledInstructions.some((ix) =>\n isSPLProgramId(message.allKeys[ix.programIdIndex]),\n );\n return {\n transactionType: looksSPL\n ? SolanaTransactionTypes.SPL\n : SolanaTransactionTypes.STANDARD,\n data: {\n ...(this.tokenAddress ? { tokenAddress: this.tokenAddress } : {}),\n ...(this.createATA ? { createATA: this.createATA } : {}),\n },\n };\n }\n\n // Accumulate best data across all instructions\n let sawSPL = false;\n let best: TxInspectorResult[\"data\"] = {};\n\n for (const ixMeta of message.compiledInstructions) {\n const programId = message.allKeys[ixMeta.programIdIndex];\n if (!programId) continue;\n\n if (isSPLProgramId(programId)) sawSPL = true;\n\n const resolvedKeys = ixMeta.accountKeyIndexes\n .map((i) => message.allKeys[i])\n .filter((k): k is PublicKey => !!k);\n\n const instruction = new TransactionInstruction({\n programId,\n keys: resolvedKeys.map((pk) => ({\n pubkey: pk,\n isSigner: false,\n isWritable: false,\n })),\n data: Buffer.from(ixMeta.data),\n });\n\n const ctx: IxContext = { programId, ixMeta, message, instruction };\n\n for (const decoder of DECODERS) {\n if (!decoder.when(ctx)) continue;\n const data = decoder.decode(ctx);\n if (!data) continue;\n\n // Prefer createATA (needed when destination ATA doesn\u2019t exist yet)\n if (data.createATA && !best.createATA) {\n best = { ...best, createATA: data.createATA };\n } else if (\n data.tokenAddress &&\n !best.tokenAddress &&\n !best.createATA\n ) {\n best = { ...best, tokenAddress: data.tokenAddress };\n }\n }\n }\n\n if (best.createATA)\n return { transactionType: SolanaTransactionTypes.SPL, data: best };\n if (best.tokenAddress)\n return { transactionType: SolanaTransactionTypes.SPL, data: best };\n if (sawSPL)\n return { transactionType: SolanaTransactionTypes.SPL, data: {} };\n\n return { transactionType: SolanaTransactionTypes.STANDARD, data: {} };\n } catch {\n return { transactionType: SolanaTransactionTypes.STANDARD, data: {} };\n }\n }\n\n /**\n * Normalise any tx (legacy or v0) into { compiledInstructions, allKeys }.\n * For v0, auto-fetch looked-up addresses from ALT(s) via the baked-in connection.\n */\n private async normaliseMessage(\n rawBytes: Uint8Array,\n ): Promise<NormalizedMessage> {\n const versionedTX = this.tryDeserialiseVersioned(rawBytes);\n if (versionedTX) {\n const msg = versionedTX.message as VersionedMessage & {\n getAccountKeys?: (options?: {\n accountKeysFromLookups?: LoadedAddresses;\n }) => {\n staticAccountKeys: PublicKey[];\n accountKeysFromLookups?: LoadedAddresses;\n keySegments: () => PublicKey[][];\n };\n compiledInstructions: Array<{\n programIdIndex: number;\n accountKeyIndexes?: number[]; // legacy field name\n accounts?: number[]; // v0 field name\n data: Uint8Array | string | number[];\n }>;\n staticAccountKeys: PublicKey[];\n };\n\n const lookedUp = await resolveLookedUpAddressesFromMessage(msg);\n\n let allKeys: PublicKey[];\n if (typeof msg.getAccountKeys === \"function\") {\n const messageAccountKeys = msg.getAccountKeys(\n lookedUp ? { accountKeysFromLookups: lookedUp } : undefined,\n );\n allKeys = messageAccountKeys.keySegments().flat();\n } else {\n allKeys = [...msg.staticAccountKeys];\n }\n\n const compiledInstructions: NormalizedCompiledIx[] =\n msg.compiledInstructions.map((ix) => {\n const ixWithAccounts = ix as typeof ix & { accounts?: number[] };\n const accountKeyIndexes = Array.from(\n ixWithAccounts.accounts ?? ix.accountKeyIndexes ?? [],\n ) as number[];\n\n let data: Uint8Array;\n if (ix.data instanceof Uint8Array) {\n data = ix.data;\n } else if (typeof ix.data === \"string\") {\n data = Buffer.from(ix.data, \"base64\"); // v0 encodes instruction data as base64\n } else {\n data = Uint8Array.from(ix.data ?? []);\n }\n\n return {\n programIdIndex: ix.programIdIndex,\n accountKeyIndexes,\n data,\n };\n });\n\n return { compiledInstructions, allKeys };\n }\n\n // Legacy (no ALTs)\n const legacy = Transaction.from(rawBytes);\n\n const allKeyMap = new Map<string, PublicKey>();\n const add = (pubkey?: PublicKey | null) => {\n if (!pubkey) return;\n const key = pubkey.toBase58();\n if (!allKeyMap.has(key)) allKeyMap.set(key, pubkey);\n };\n\n add(legacy.feePayer ?? null);\n for (const ix of legacy.instructions) {\n add(ix.programId);\n for (const key of ix.keys) add(key.pubkey);\n }\n const allKeys = Array.from(allKeyMap.values());\n const indexByB58 = new Map(allKeys.map((pk, i) => [pk.toBase58(), i]));\n\n const compiledInstructions: NormalizedCompiledIx[] =\n legacy.instructions.map((ix) => ({\n programIdIndex: indexByB58.get(ix.programId.toBase58()) ?? -1,\n accountKeyIndexes: ix.keys.map(\n (key) => indexByB58.get(key.pubkey.toBase58()) ?? -1,\n ),\n data: ix.data,\n }));\n\n return { compiledInstructions, allKeys };\n }\n\n private tryDeserialiseVersioned(\n rawBytes: Uint8Array,\n ): VersionedTransaction | null {\n try {\n return VersionedTransaction.deserialize(rawBytes);\n } catch {\n try {\n const msg = VersionedMessage.deserialize(rawBytes);\n return { message: msg } as VersionedTransaction;\n } catch {\n return null;\n }\n }\n }\n}\n\n// fetch looked-up addresses for a VersionedMessage via the baked-in connection\nasync function resolveLookedUpAddressesFromMessage(\n msg: VersionedMessage,\n): Promise<LoadedAddresses | undefined> {\n const lookups = msg.addressTableLookups ?? [];\n if (!lookups.length) return;\n\n const writable: PublicKey[] = [];\n const readonly: PublicKey[] = [];\n\n await Promise.all(\n lookups.map(async (lu) => {\n const res = await defaultConnection.getAddressLookupTable(lu.accountKey);\n const table = res.value;\n if (!table) return;\n const addrs = table.state.addresses;\n\n for (const i of lu.writableIndexes ?? []) {\n const pk = addrs[i];\n if (pk) writable.push(pk);\n }\n for (const i of lu.readonlyIndexes ?? []) {\n const pk = addrs[i];\n if (pk) readonly.push(pk);\n }\n }),\n );\n\n return { writable, readonly };\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["TransactionInspector_exports", "__export", "SolanaTransactionTypes", "TransactionInspector", "__toCommonJS", "import_spl_token", "import_web3", "import_buffer", "import_transactionDecoders", "RPC_URL", "defaultConnection", "isSPLProgramId", "pid", "rawTransactionBytes", "tokenAddress", "createATA", "message", "ix", "sawSPL", "best", "ixMeta", "programId", "resolvedKeys", "i", "k", "instruction", "pk", "ctx", "decoder", "data", "rawBytes", "versionedTX", "msg", "lookedUp", "resolveLookedUpAddressesFromMessage", "allKeys", "ixWithAccounts", "accountKeyIndexes", "legacy", "allKeyMap", "add", "pubkey", "key", "indexByB58", "lookups", "writable", "readonly", "lu", "table", "addrs"]
7
7
  }
@@ -1,2 +1,2 @@
1
- "use strict";var y=Object.defineProperty;var A=Object.getOwnPropertyDescriptor;var p=Object.getOwnPropertyNames;var m=Object.prototype.hasOwnProperty;var I=(e,n)=>{for(var s in n)y(e,s,{get:n[s],enumerable:!0})},b=(e,n,s,o)=>{if(n&&typeof n=="object"||typeof n=="function")for(let d of p(n))!m.call(e,d)&&d!==s&&y(e,d,{get:()=>n[d],enumerable:!(o=A(n,d))||o.enumerable});return e};var T=e=>b(y({},"__esModule",{value:!0}),e);var f={};I(f,{DECODERS:()=>B});module.exports=T(f);var t=require("@solana/spl-token");const c=e=>e.equals(t.TOKEN_PROGRAM_ID)||e.equals(t.TOKEN_2022_PROGRAM_ID),r=e=>{try{return e()}catch{return null}},B=[{when:({programId:e})=>e.equals(t.ASSOCIATED_TOKEN_PROGRAM_ID),decode:({ixMeta:e,message:n})=>{const s=i=>{const u=e.accountKeyIndexes[i];return u!==void 0?n.allKeys[u]??null:null},o=s(1);let d=s(2),a=s(3);if(!d||!a){const i=e.accountKeyIndexes.slice(2);for(const u of i){const k=n.allKeys[u];if(k){if(!d&&k!==o){d=k;continue}if(!a&&k!==o&&k!==d&&(a=k),d&&a)break}}}let l=null;for(const i of e.accountKeyIndexes){const u=n.allKeys[i];if(u&&(u.equals(t.TOKEN_PROGRAM_ID)||u.equals(t.TOKEN_2022_PROGRAM_ID))){l=u;break}}if(!d||!a)return null;if(o)return{createATA:{address:o.toBase58(),mintAddress:a.toBase58()}};if(l){const i=l.equals(t.TOKEN_2022_PROGRAM_ID);return{createATA:{address:(0,t.getAssociatedTokenAddressSync)(a,d,!0,i?t.TOKEN_2022_PROGRAM_ID:t.TOKEN_PROGRAM_ID,t.ASSOCIATED_TOKEN_PROGRAM_ID).toBase58(),mintAddress:a.toBase58()}}}return null}},{when:({programId:e})=>e.equals(t.TOKEN_2022_PROGRAM_ID),decode:({instruction:e,programId:n})=>r(()=>{const{keys:{destination:s,mint:o}}=(0,t.decodeTransferCheckedWithFeeInstruction)(e,n);return{tokenAddress:s.pubkey.toBase58(),mintAddress:o.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:n})=>r(()=>{const{keys:{destination:s}}=(0,t.decodeTransferInstruction)(e,n);return{tokenAddress:s.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:n})=>r(()=>{const{keys:{destination:s,mint:o}}=(0,t.decodeTransferCheckedInstruction)(e,n);return{tokenAddress:s.pubkey.toBase58(),mintAddress:o.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:n})=>r(()=>{const{keys:{account:s,mint:o}}=(0,t.decodeInitializeAccountInstruction)(e,n);return{createATA:{address:s.pubkey.toBase58(),mintAddress:o.pubkey.toBase58()}}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:n})=>r(()=>{const{keys:{account:s,mint:o}}=(0,t.decodeInitializeAccount2Instruction)(e,n);return{createATA:{address:s.pubkey.toBase58(),mintAddress:o.pubkey.toBase58()}}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:n})=>r(()=>{const{keys:{account:s,mint:o}}=(0,t.decodeInitializeAccount3Instruction)(e,n);return{createATA:{address:s.pubkey.toBase58(),mintAddress:o.pubkey.toBase58()}}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:n})=>r(()=>{const{keys:{account:s}}=(0,t.decodeInitializeImmutableOwnerInstruction)(e,n);return{tokenAddress:s.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:n})=>r(()=>{const{keys:{account:s}}=(0,t.decodeCloseAccountInstruction)(e,n);return{tokenAddress:s.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:n})=>r(()=>{const{keys:{account:s}}=(0,t.decodeSyncNativeInstruction)(e,n);return{tokenAddress:s.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:n})=>r(()=>{const{keys:{account:s,mint:o}}=(0,t.decodeBurnCheckedInstruction)(e,n);return{tokenAddress:s.pubkey.toBase58(),mintAddress:o.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:n})=>r(()=>{const{keys:{account:s,mint:o}}=(0,t.decodeBurnInstruction)(e,n);return{tokenAddress:s.pubkey.toBase58(),mintAddress:o.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:n})=>r(()=>{const{keys:{account:s,mint:o}}=(0,t.decodeFreezeAccountInstruction)(e,n);return{tokenAddress:s.pubkey.toBase58(),mintAddress:o.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:n})=>r(()=>{const{keys:{account:s,mint:o}}=(0,t.decodeThawAccountInstruction)(e,n);return{tokenAddress:s.pubkey.toBase58(),mintAddress:o.pubkey.toBase58()}})},{when:({programId:e})=>e.equals(t.ASSOCIATED_TOKEN_PROGRAM_ID)||e.equals(t.TOKEN_PROGRAM_ID)||e.equals(t.TOKEN_2022_PROGRAM_ID),decode:()=>({})}];0&&(module.exports={DECODERS});
1
+ "use strict";var u=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var l=Object.getOwnPropertyNames;var A=Object.prototype.hasOwnProperty;var I=(e,t)=>{for(var o in t)u(e,o,{get:t[o],enumerable:!0})},p=(e,t,o,d)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of l(t))!A.call(e,r)&&r!==o&&u(e,r,{get:()=>t[r],enumerable:!(d=y(t,r))||d.enumerable});return e};var b=e=>p(u({},"__esModule",{value:!0}),e);var h={};I(h,{DECODERS:()=>m});module.exports=b(h);var n=require("@solana/spl-token");const c=e=>e.equals(n.TOKEN_PROGRAM_ID)||e.equals(n.TOKEN_2022_PROGRAM_ID),s=e=>{try{return e()}catch{return null}},m=[{when:({programId:e})=>e.equals(n.ASSOCIATED_TOKEN_PROGRAM_ID),decode:({ixMeta:e,message:t})=>{const o=k=>{const i=e.accountKeyIndexes[k];return i!==void 0?t.allKeys[i]??null:null},d=o(1),r=o(2),a=o(3);return!r||!a||!d?null:{createATA:{address:d.toBase58(),mintAddress:a.toBase58()}}}},{when:({programId:e})=>e.equals(n.TOKEN_2022_PROGRAM_ID),decode:({instruction:e,programId:t})=>s(()=>{const{keys:{destination:o}}=(0,n.decodeTransferCheckedWithFeeInstruction)(e,t);return{tokenAddress:o.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:t})=>s(()=>{const{keys:{destination:o}}=(0,n.decodeTransferInstruction)(e,t);return{tokenAddress:o.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:t})=>s(()=>{const{keys:{destination:o}}=(0,n.decodeTransferCheckedInstruction)(e,t);return{tokenAddress:o.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:t})=>s(()=>{const{keys:{account:o,mint:d}}=(0,n.decodeInitializeAccountInstruction)(e,t);return{createATA:{address:o.pubkey.toBase58(),mintAddress:d.pubkey.toBase58()}}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:t})=>s(()=>{const{keys:{account:o,mint:d}}=(0,n.decodeInitializeAccount2Instruction)(e,t);return{createATA:{address:o.pubkey.toBase58(),mintAddress:d.pubkey.toBase58()}}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:t})=>s(()=>{const{keys:{account:o,mint:d}}=(0,n.decodeInitializeAccount3Instruction)(e,t);return{createATA:{address:o.pubkey.toBase58(),mintAddress:d.pubkey.toBase58()}}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:t})=>s(()=>{const{keys:{account:o}}=(0,n.decodeInitializeImmutableOwnerInstruction)(e,t);return{tokenAddress:o.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:t})=>s(()=>{const{keys:{account:o}}=(0,n.decodeCloseAccountInstruction)(e,t);return{tokenAddress:o.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:t})=>s(()=>{const{keys:{account:o}}=(0,n.decodeSyncNativeInstruction)(e,t);return{tokenAddress:o.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:t})=>s(()=>{const{keys:{account:o}}=(0,n.decodeBurnCheckedInstruction)(e,t);return{tokenAddress:o.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:t})=>s(()=>{const{keys:{account:o}}=(0,n.decodeBurnInstruction)(e,t);return{tokenAddress:o.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:t})=>s(()=>{const{keys:{account:o}}=(0,n.decodeFreezeAccountInstruction)(e,t);return{tokenAddress:o.pubkey.toBase58()}})},{when:({programId:e})=>c(e),decode:({instruction:e,programId:t})=>s(()=>{const{keys:{account:o}}=(0,n.decodeThawAccountInstruction)(e,t);return{tokenAddress:o.pubkey.toBase58()}})},{when:({programId:e})=>e.equals(n.ASSOCIATED_TOKEN_PROGRAM_ID)||e.equals(n.TOKEN_PROGRAM_ID)||e.equals(n.TOKEN_2022_PROGRAM_ID),decode:()=>null}];0&&(module.exports={DECODERS});
2
2
  //# sourceMappingURL=transactionDecoders.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../../src/internal/app-binder/services/utils/transactionDecoders.ts"],
4
- "sourcesContent": ["import {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n decodeBurnCheckedInstruction,\n decodeBurnInstruction,\n decodeCloseAccountInstruction,\n decodeFreezeAccountInstruction,\n decodeInitializeAccount2Instruction,\n decodeInitializeAccount3Instruction,\n decodeInitializeAccountInstruction,\n decodeInitializeImmutableOwnerInstruction,\n decodeSyncNativeInstruction,\n decodeThawAccountInstruction,\n decodeTransferCheckedInstruction,\n decodeTransferCheckedWithFeeInstruction,\n decodeTransferInstruction,\n getAssociatedTokenAddressSync,\n TOKEN_2022_PROGRAM_ID,\n TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport { type PublicKey, type TransactionInstruction } from \"@solana/web3.js\";\n\nimport {\n type NormalizedCompiledIx,\n type NormalizedMessage,\n type SolanaTransactionTypes,\n} from \"@internal/app-binder/services/TransactionInspector\";\n\nexport interface TxInspectorResult {\n transactionType: SolanaTransactionTypes;\n data: {\n tokenAddress?: string;\n mintAddress?: string;\n createATA?: { address: string; mintAddress: string };\n };\n}\n\nexport type IxContext = {\n programId: PublicKey;\n ixMeta: NormalizedCompiledIx;\n message: NormalizedMessage;\n instruction: TransactionInstruction;\n};\n\nexport type Decoder = {\n when: (ctx: IxContext) => boolean;\n decode: (ctx: IxContext) => TxInspectorResult[\"data\"] | null;\n};\n\nconst isTokenProgramId = (pid: PublicKey) =>\n pid.equals(TOKEN_PROGRAM_ID) || pid.equals(TOKEN_2022_PROGRAM_ID);\n\nconst safe = <T>(fn: () => T): T | null => {\n try {\n return fn();\n } catch {\n return null;\n }\n};\n\nexport const DECODERS: Decoder[] = [\n // ATA creation (with derivation fallback)\n {\n when: ({ programId }) => programId.equals(ASSOCIATED_TOKEN_PROGRAM_ID),\n decode: ({ ixMeta, message }) => {\n // Helpers to read by ix index safely\n const byIdx = (n: number): PublicKey | null => {\n const i = ixMeta.accountKeyIndexes[n];\n return i !== undefined ? (message.allKeys[i] ?? null) : null;\n };\n\n // Common positions (fast path)\n const ataPk = byIdx(1);\n let ownerPk = byIdx(2);\n let mintPk = byIdx(3);\n\n // Recover owner/mint if they weren't in the usual slots\n if (!ownerPk || !mintPk) {\n const afterFirstTwo = ixMeta.accountKeyIndexes.slice(2);\n for (const k of afterFirstTwo) {\n const pk = message.allKeys[k];\n if (!pk) continue;\n if (!ownerPk && pk !== ataPk) {\n ownerPk = pk;\n continue;\n }\n if (!mintPk && pk !== ataPk && pk !== ownerPk) {\n mintPk = pk;\n }\n if (ownerPk && mintPk) break;\n }\n }\n\n // Find token program by VALUE anywhere (works for legacy or 2022)\n let tokenProgramPk: PublicKey | null = null;\n for (const k of ixMeta.accountKeyIndexes) {\n const pk = message.allKeys[k];\n if (!pk) continue;\n if (pk.equals(TOKEN_PROGRAM_ID) || pk.equals(TOKEN_2022_PROGRAM_ID)) {\n tokenProgramPk = pk;\n break;\n }\n }\n\n // Need owner+mint at minimum\n if (!ownerPk || !mintPk) return null;\n\n // If ATA pubkey was provided in the ix, trust it\n if (ataPk) {\n return {\n createATA: {\n address: ataPk.toBase58(),\n mintAddress: mintPk.toBase58(),\n },\n };\n }\n\n // If token program is present, derive deterministically\n if (tokenProgramPk) {\n const isV22 = tokenProgramPk.equals(TOKEN_2022_PROGRAM_ID);\n const derived = getAssociatedTokenAddressSync(\n mintPk,\n ownerPk,\n true, // allowOwnerOffCurve\n isV22 ? TOKEN_2022_PROGRAM_ID : TOKEN_PROGRAM_ID,\n ASSOCIATED_TOKEN_PROGRAM_ID,\n );\n return {\n createATA: {\n address: derived.toBase58(),\n mintAddress: mintPk.toBase58(),\n },\n };\n }\n\n // No ATA + no token program \u2192 let outer logic decide (Token-2022 hint / ALT fetch / conservative)\n return null;\n },\n },\n\n // Token-2022 fee\u2019d transfer (CWIF)\n {\n when: ({ programId }) => programId.equals(TOKEN_2022_PROGRAM_ID),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { destination, mint },\n } = decodeTransferCheckedWithFeeInstruction(instruction, programId);\n return {\n tokenAddress: destination.pubkey.toBase58(),\n mintAddress: mint.pubkey.toBase58(),\n };\n }),\n },\n\n // Transfers\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { destination },\n } = decodeTransferInstruction(instruction, programId);\n return { tokenAddress: destination.pubkey.toBase58() };\n }),\n },\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { destination, mint },\n } = decodeTransferCheckedInstruction(instruction, programId);\n return {\n tokenAddress: destination.pubkey.toBase58(),\n mintAddress: mint.pubkey.toBase58(),\n };\n }),\n },\n\n // Account init\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account, mint },\n } = decodeInitializeAccountInstruction(instruction, programId);\n return {\n createATA: {\n address: account.pubkey.toBase58(),\n mintAddress: mint.pubkey.toBase58(),\n },\n };\n }),\n },\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account, mint },\n } = decodeInitializeAccount2Instruction(instruction, programId);\n return {\n createATA: {\n address: account.pubkey.toBase58(),\n mintAddress: mint.pubkey.toBase58(),\n },\n };\n }),\n },\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account, mint },\n } = decodeInitializeAccount3Instruction(instruction, programId);\n return {\n createATA: {\n address: account.pubkey.toBase58(),\n mintAddress: mint.pubkey.toBase58(),\n },\n };\n }),\n },\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account },\n } = decodeInitializeImmutableOwnerInstruction(instruction, programId);\n return { tokenAddress: account.pubkey.toBase58() };\n }),\n },\n\n // Lifecycle / WSOL\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account },\n } = decodeCloseAccountInstruction(instruction, programId);\n return { tokenAddress: account.pubkey.toBase58() };\n }),\n },\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account },\n } = decodeSyncNativeInstruction(instruction, programId);\n return { tokenAddress: account.pubkey.toBase58() };\n }),\n },\n\n // Mint / Burn\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account, mint },\n } = decodeBurnCheckedInstruction(instruction, programId);\n return {\n tokenAddress: account.pubkey.toBase58(),\n mintAddress: mint.pubkey.toBase58(),\n };\n }),\n },\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account, mint },\n } = decodeBurnInstruction(instruction, programId);\n return {\n tokenAddress: account.pubkey.toBase58(),\n mintAddress: mint.pubkey.toBase58(),\n };\n }),\n },\n\n // Freeze / Thaw\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account, mint },\n } = decodeFreezeAccountInstruction(instruction, programId);\n return {\n tokenAddress: account.pubkey.toBase58(),\n mintAddress: mint.pubkey.toBase58(),\n };\n }),\n },\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account, mint },\n } = decodeThawAccountInstruction(instruction, programId);\n return {\n tokenAddress: account.pubkey.toBase58(),\n mintAddress: mint.pubkey.toBase58(),\n };\n }),\n },\n\n // LAST-RESORT: tag as SPL by program id only (when decoders can't run)\n {\n when: ({ programId }) =>\n programId.equals(ASSOCIATED_TOKEN_PROGRAM_ID) ||\n programId.equals(TOKEN_PROGRAM_ID) ||\n programId.equals(TOKEN_2022_PROGRAM_ID),\n decode: () => ({}),\n },\n];\n"],
5
- "mappings": "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",
6
- "names": ["transactionDecoders_exports", "__export", "DECODERS", "__toCommonJS", "import_spl_token", "isTokenProgramId", "pid", "safe", "fn", "programId", "ixMeta", "message", "byIdx", "n", "i", "ataPk", "ownerPk", "mintPk", "afterFirstTwo", "k", "pk", "tokenProgramPk", "isV22", "instruction", "destination", "mint", "account"]
4
+ "sourcesContent": ["import {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n decodeBurnCheckedInstruction,\n decodeBurnInstruction,\n decodeCloseAccountInstruction,\n decodeFreezeAccountInstruction,\n decodeInitializeAccount2Instruction,\n decodeInitializeAccount3Instruction,\n decodeInitializeAccountInstruction,\n decodeInitializeImmutableOwnerInstruction,\n decodeSyncNativeInstruction,\n decodeThawAccountInstruction,\n decodeTransferCheckedInstruction,\n decodeTransferCheckedWithFeeInstruction,\n decodeTransferInstruction,\n TOKEN_2022_PROGRAM_ID,\n TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport { type PublicKey, type TransactionInstruction } from \"@solana/web3.js\";\n\nimport {\n type NormalizedCompiledIx,\n type NormalizedMessage,\n type TxInspectorResult,\n} from \"@internal/app-binder/services/TransactionInspector\";\n\nexport type IxContext = {\n programId: PublicKey;\n ixMeta: NormalizedCompiledIx;\n message: NormalizedMessage;\n instruction: TransactionInstruction;\n};\n\nexport type Decoder = {\n when: (ctx: IxContext) => boolean;\n decode: (ctx: IxContext) => TxInspectorResult[\"data\"] | null;\n};\n\nconst isTokenProgramId = (pid: PublicKey) =>\n pid.equals(TOKEN_PROGRAM_ID) || pid.equals(TOKEN_2022_PROGRAM_ID);\n\nconst safe = <T>(fn: () => T): T | null => {\n try {\n return fn();\n } catch {\n return null;\n }\n};\n\nexport const DECODERS: Decoder[] = [\n // ATA creation (with derivation fallback)\n {\n when: ({ programId }) => programId.equals(ASSOCIATED_TOKEN_PROGRAM_ID),\n decode: ({ ixMeta, message }) => {\n const byIdx = (n: number): PublicKey | null => {\n const i = ixMeta.accountKeyIndexes[n];\n return i !== undefined ? (message.allKeys[i] ?? null) : null;\n };\n\n const ataPk = byIdx(1);\n const ownerPk = byIdx(2);\n const mintPk = byIdx(3);\n if (!ownerPk || !mintPk || !ataPk) return null;\n\n return {\n createATA: {\n address: ataPk.toBase58(),\n mintAddress: mintPk.toBase58(),\n },\n };\n },\n },\n\n // Token-2022 fee\u2019d transfer (CWIF)\n {\n when: ({ programId }) => programId.equals(TOKEN_2022_PROGRAM_ID),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { destination },\n } = decodeTransferCheckedWithFeeInstruction(instruction, programId);\n return {\n tokenAddress: destination.pubkey.toBase58(),\n };\n }),\n },\n\n // Transfers\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { destination },\n } = decodeTransferInstruction(instruction, programId);\n return { tokenAddress: destination.pubkey.toBase58() };\n }),\n },\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { destination },\n } = decodeTransferCheckedInstruction(instruction, programId);\n return {\n tokenAddress: destination.pubkey.toBase58(),\n };\n }),\n },\n\n // Account init\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account, mint },\n } = decodeInitializeAccountInstruction(instruction, programId);\n return {\n createATA: {\n address: account.pubkey.toBase58(),\n mintAddress: mint.pubkey.toBase58(),\n },\n };\n }),\n },\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account, mint },\n } = decodeInitializeAccount2Instruction(instruction, programId);\n return {\n createATA: {\n address: account.pubkey.toBase58(),\n mintAddress: mint.pubkey.toBase58(),\n },\n };\n }),\n },\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account, mint },\n } = decodeInitializeAccount3Instruction(instruction, programId);\n return {\n createATA: {\n address: account.pubkey.toBase58(),\n mintAddress: mint.pubkey.toBase58(),\n },\n };\n }),\n },\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account },\n } = decodeInitializeImmutableOwnerInstruction(instruction, programId);\n return { tokenAddress: account.pubkey.toBase58() };\n }),\n },\n\n // Lifecycle / WSOL\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account },\n } = decodeCloseAccountInstruction(instruction, programId);\n return { tokenAddress: account.pubkey.toBase58() };\n }),\n },\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account },\n } = decodeSyncNativeInstruction(instruction, programId);\n return { tokenAddress: account.pubkey.toBase58() };\n }),\n },\n\n // Mint / Burn\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account },\n } = decodeBurnCheckedInstruction(instruction, programId);\n return {\n tokenAddress: account.pubkey.toBase58(),\n };\n }),\n },\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account },\n } = decodeBurnInstruction(instruction, programId);\n return {\n tokenAddress: account.pubkey.toBase58(),\n };\n }),\n },\n\n // Freeze / Thaw\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account },\n } = decodeFreezeAccountInstruction(instruction, programId);\n return {\n tokenAddress: account.pubkey.toBase58(),\n };\n }),\n },\n {\n when: ({ programId }) => isTokenProgramId(programId),\n decode: ({ instruction, programId }) =>\n safe(() => {\n const {\n keys: { account },\n } = decodeThawAccountInstruction(instruction, programId);\n return {\n tokenAddress: account.pubkey.toBase58(),\n };\n }),\n },\n\n // LAST-RESORT: tag as SPL by program id only (when decoders can't run)\n {\n when: ({ programId }) =>\n programId.equals(ASSOCIATED_TOKEN_PROGRAM_ID) ||\n programId.equals(TOKEN_PROGRAM_ID) ||\n programId.equals(TOKEN_2022_PROGRAM_ID),\n decode: () => null,\n },\n];\n"],
5
+ "mappings": "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",
6
+ "names": ["transactionDecoders_exports", "__export", "DECODERS", "__toCommonJS", "import_spl_token", "isTokenProgramId", "pid", "safe", "fn", "programId", "ixMeta", "message", "byIdx", "n", "ataPk", "ownerPk", "mintPk", "instruction", "destination", "account", "mint"]
7
7
  }
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/device-action/SignTransactionDeviceAction.ts"],
4
- "sourcesContent": ["import {\n type CommandErrorResult,\n type CommandResult,\n type DeviceActionStateMachine,\n DeviceModelId,\n type InternalApi,\n isSuccessCommandResult,\n OpenAppDeviceAction,\n type StateMachineTypes,\n UnknownDAError,\n UserInteractionRequired,\n XStateDeviceAction,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, type Maybe, Right } from \"purify-ts\";\nimport { assign, fromPromise, setup } from \"xstate\";\n\nimport {\n type SignTransactionDAError,\n type SignTransactionDAInput,\n type SignTransactionDAIntermediateValue,\n type SignTransactionDAInternalState,\n type SignTransactionDAOutput,\n} from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { type AppConfiguration } from \"@api/model/AppConfiguration\";\nimport { type Signature } from \"@api/model/Signature\";\nimport { type TransactionResolutionContext } from \"@api/model/TransactionResolutionContext\";\nimport { GetAppConfigurationCommand } from \"@internal/app-binder/command/GetAppConfigurationCommand\";\nimport { SignTransactionCommand } from \"@internal/app-binder/command/SignTransactionCommand\";\nimport { type SolanaAppErrorCodes } from \"@internal/app-binder/command/utils/SolanaApplicationErrors\";\nimport { ApplicationChecker } from \"@internal/app-binder/services/ApplicationChecker\";\nimport {\n SolanaTransactionTypes,\n TransactionInspector,\n} from \"@internal/app-binder/services/TransactionInspector\";\nimport { type TxInspectorResult } from \"@internal/app-binder/services/utils/transactionDecoders\";\nimport {\n BuildTransactionContextTask,\n type BuildTransactionContextTaskArgs,\n type SolanaBuildContextResult,\n} from \"@internal/app-binder/task/BuildTransactionContextTask\";\nimport {\n ProvideSolanaTransactionContextTask,\n type SolanaContextForDevice,\n} from \"@internal/app-binder/task/ProvideTransactionContextTask\";\nimport { SignDataTask } from \"@internal/app-binder/task/SendSignDataTask\";\n\nexport type MachineDependencies = {\n readonly getAppConfig: () => Promise<\n CommandResult<AppConfiguration, SolanaAppErrorCodes>\n >;\n readonly buildContext: (arg0: {\n input: BuildTransactionContextTaskArgs;\n }) => Promise<SolanaBuildContextResult>;\n readonly provideContext: (arg0: {\n input: SolanaContextForDevice;\n }) => Promise<Maybe<CommandErrorResult<SolanaAppErrorCodes>>>;\n readonly inspectTransaction: (arg0: {\n serializedTransaction: Uint8Array;\n resolutionContext?: TransactionResolutionContext;\n }) => Promise<TxInspectorResult>;\n readonly signTransaction: (arg0: {\n input: {\n derivationPath: string;\n serializedTransaction: Uint8Array;\n };\n }) => Promise<\n CommandResult<Maybe<Signature | SolanaAppErrorCodes>, SolanaAppErrorCodes>\n >;\n};\n\nexport class SignTransactionDeviceAction extends XStateDeviceAction<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n> {\n makeStateMachine(\n internalApi: InternalApi,\n ): DeviceActionStateMachine<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n > {\n type types = StateMachineTypes<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n >;\n\n const {\n signTransaction,\n getAppConfig,\n buildContext,\n provideContext,\n inspectTransaction,\n } = this.extractDependencies(internalApi);\n\n return setup({\n types: {\n input: {} as types[\"input\"],\n context: {} as types[\"context\"],\n output: {} as types[\"output\"],\n },\n actors: {\n openAppStateMachine: new OpenAppDeviceAction({\n input: { appName: \"Solana\" },\n }).makeStateMachine(internalApi),\n\n getAppConfig: fromPromise(getAppConfig),\n inspectTransaction: fromPromise(\n ({\n input,\n }: {\n input: {\n serializedTransaction: Uint8Array;\n resolutionContext?: TransactionResolutionContext;\n };\n }) =>\n inspectTransaction({\n serializedTransaction: input.serializedTransaction,\n resolutionContext: input.resolutionContext,\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 }) => context.input.skipOpenApp,\n isSPLSupported: ({ context }) =>\n new ApplicationChecker(\n internalApi.getDeviceSessionState(),\n context._internalState.appConfig!,\n )\n .withMinVersionExclusive(\"1.4.0\")\n .excludeDeviceModel(DeviceModelId.NANO_S)\n .check(),\n isAnSPLTransaction: ({ context }) =>\n context._internalState.inspectorResult?.transactionType ===\n SolanaTransactionTypes.SPL,\n shouldSkipInspection: ({ context }) =>\n context._internalState.error === null &&\n !!context.input.resolutionContext,\n },\n actions: {\n assignErrorFromEvent: assign({\n _internalState: (_) => ({\n ..._.context._internalState,\n error: new UnknownDAError(\n _.event[\"error\"] instanceof Error\n ? _.event[\"error\"].message\n : String(_.event[\"error\"]),\n ),\n }),\n }),\n },\n }).createMachine({\n id: \"SignTransactionDeviceAction\",\n initial: \"InitialState\",\n context: ({ input }) => ({\n input,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n _internalState: {\n error: null,\n signature: null,\n appConfig: null,\n solanaTransactionContext: null,\n inspectorResult: null,\n },\n }),\n states: {\n InitialState: {\n always: [\n { target: \"GetAppConfig\", guard: \"skipOpenApp\" },\n { target: \"OpenAppDeviceAction\" },\n ],\n },\n OpenAppDeviceAction: {\n exit: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n invoke: {\n id: \"openAppStateMachine\",\n src: \"openAppStateMachine\",\n input: () => ({ appName: \"Solana\" }),\n onSnapshot: {\n actions: assign({\n intermediateValue: ({ event }) =>\n event.snapshot.context.intermediateValue,\n }),\n },\n onDone: {\n target: \"CheckOpenAppDeviceActionResult\",\n actions: assign({\n _internalState: ({ event, context }) =>\n event.output.caseOf({\n Right: () => context._internalState,\n Left: (error) => ({\n ...context._internalState,\n error,\n }),\n }),\n }),\n },\n },\n },\n CheckOpenAppDeviceActionResult: {\n always: [\n { target: \"GetAppConfig\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n GetAppConfig: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n invoke: {\n id: \"getAppConfig\",\n src: \"getAppConfig\",\n onDone: {\n target: \"GetAppConfigResultCheck\",\n actions: assign({\n _internalState: ({ event, context }) =>\n isSuccessCommandResult(event.output)\n ? {\n ...context._internalState,\n appConfig: event.output.data,\n }\n : { ...context._internalState, error: event.output.error },\n }),\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n GetAppConfigResultCheck: {\n always: [\n { target: \"InspectTransaction\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n InspectTransaction: {\n invoke: {\n id: \"inspectTransaction\",\n src: \"inspectTransaction\",\n\n input: ({ context }) => ({\n serializedTransaction: context.input.transaction,\n resolutionContext: context.input.resolutionContext,\n }),\n onDone: {\n target: \"AfterInspect\",\n actions: assign({\n _internalState: ({ context, event }) => ({\n ...context._internalState,\n inspectorResult: event.output,\n }),\n }),\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n AfterInspect: {\n always: [\n { target: \"BuildContext\", guard: \"isAnSPLTransaction\" },\n { target: \"SignTransaction\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n BuildContext: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n invoke: {\n id: \"buildContext\",\n src: \"buildContext\",\n input: ({ context }) => {\n const inspectorData =\n context._internalState.inspectorResult?.data;\n return {\n contextModule: context.input.contextModule,\n options: {\n tokenAddress: inspectorData?.tokenAddress,\n createATA: inspectorData?.createATA,\n },\n };\n },\n onDone: {\n target: \"ProvideContext\",\n actions: [\n assign({\n _internalState: ({ event, context }) => ({\n ...context._internalState,\n solanaTransactionContext: {\n descriptor: event.output.descriptor,\n certificate: event.output.calCertificate,\n tokenAccount: event.output.addressResult.tokenAccount,\n owner: event.output.addressResult.owner,\n contract: event.output.addressResult.contract,\n },\n }),\n }),\n ],\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n ProvideContext: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n invoke: {\n id: \"provideContext\",\n src: \"provideContext\",\n input: ({ context }) => {\n if (!context._internalState.solanaTransactionContext) {\n throw new UnknownDAError(\n \"Solana transaction context is not available\",\n );\n }\n return context._internalState.solanaTransactionContext;\n },\n onDone: {\n target: \"ProvideContextResultCheck\",\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n ProvideContextResultCheck: {\n always: [\n { target: \"SignTransaction\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n SignTransaction: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n },\n }),\n exit: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n }),\n invoke: {\n id: \"signTransaction\",\n src: \"signTransaction\",\n input: ({ context }) => {\n return {\n derivationPath: context.input.derivationPath,\n serializedTransaction: context.input.transaction,\n };\n },\n onDone: {\n target: \"SignTransactionResultCheck\",\n actions: [\n assign({\n _internalState: ({ event, context }) => {\n if (!isSuccessCommandResult(event.output))\n return {\n ...context._internalState,\n error: event.output.error,\n };\n\n const data = event.output.data.extract();\n if (\n event.output.data.isJust() &&\n data instanceof Uint8Array\n )\n return {\n ...context._internalState,\n signature: data,\n };\n\n return {\n ...context._internalState,\n error: new UnknownDAError(\"No Signature available\"),\n };\n },\n }),\n ],\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n SignTransactionResultCheck: {\n always: [\n { guard: \"noInternalError\", target: \"Success\" },\n { target: \"Error\" },\n ],\n },\n Success: { type: \"final\" },\n Error: { type: \"final\" },\n },\n output: ({ context }) =>\n context._internalState.signature\n ? Right(context._internalState.signature)\n : Left(\n context._internalState.error ||\n new UnknownDAError(`No error or signature available`),\n ),\n });\n }\n\n extractDependencies(internalApi: InternalApi): MachineDependencies {\n const getAppConfig = async () =>\n internalApi.sendCommand(new GetAppConfigurationCommand());\n\n const buildContext = async (arg0: {\n input: BuildTransactionContextTaskArgs;\n }) => new BuildTransactionContextTask(internalApi, arg0.input).run();\n\n const provideContext = async (arg0: { input: SolanaContextForDevice }) =>\n new ProvideSolanaTransactionContextTask(internalApi, arg0.input).run();\n\n const inspectTransaction = async (arg0: {\n serializedTransaction: Uint8Array;\n resolutionContext?: TransactionResolutionContext;\n }) =>\n Promise.resolve(\n new TransactionInspector(\n arg0.serializedTransaction,\n arg0.resolutionContext?.tokenAddress ?? null,\n arg0.resolutionContext?.createATA ?? null,\n ).inspectTransactionType(),\n );\n\n const signTransaction = async (arg0: {\n input: {\n derivationPath: string;\n serializedTransaction: Uint8Array;\n };\n }) =>\n new SignDataTask(internalApi, {\n commandFactory: (args) =>\n new SignTransactionCommand({\n serializedTransaction: args.chunkedData,\n more: args.more,\n extend: args.extend,\n }),\n derivationPath: arg0.input.derivationPath,\n sendingData: arg0.input.serializedTransaction,\n }).run();\n\n return {\n getAppConfig,\n buildContext,\n provideContext,\n signTransaction,\n inspectTransaction,\n };\n }\n}\n"],
4
+ "sourcesContent": ["import {\n type CommandErrorResult,\n type CommandResult,\n type DeviceActionStateMachine,\n DeviceModelId,\n type InternalApi,\n isSuccessCommandResult,\n OpenAppDeviceAction,\n type StateMachineTypes,\n UnknownDAError,\n UserInteractionRequired,\n XStateDeviceAction,\n} from \"@ledgerhq/device-management-kit\";\nimport { Left, type Maybe, Right } from \"purify-ts\";\nimport { assign, fromPromise, setup } from \"xstate\";\n\nimport {\n type SignTransactionDAError,\n type SignTransactionDAInput,\n type SignTransactionDAIntermediateValue,\n type SignTransactionDAInternalState,\n type SignTransactionDAOutput,\n} from \"@api/app-binder/SignTransactionDeviceActionTypes\";\nimport { type AppConfiguration } from \"@api/model/AppConfiguration\";\nimport { type Signature } from \"@api/model/Signature\";\nimport { type TransactionResolutionContext } from \"@api/model/TransactionResolutionContext\";\nimport { GetAppConfigurationCommand } from \"@internal/app-binder/command/GetAppConfigurationCommand\";\nimport { SignTransactionCommand } from \"@internal/app-binder/command/SignTransactionCommand\";\nimport { type SolanaAppErrorCodes } from \"@internal/app-binder/command/utils/SolanaApplicationErrors\";\nimport { ApplicationChecker } from \"@internal/app-binder/services/ApplicationChecker\";\nimport {\n SolanaTransactionTypes,\n TransactionInspector,\n} from \"@internal/app-binder/services/TransactionInspector\";\nimport { type TxInspectorResult } from \"@internal/app-binder/services/TransactionInspector\";\nimport {\n BuildTransactionContextTask,\n type BuildTransactionContextTaskArgs,\n type SolanaBuildContextResult,\n} from \"@internal/app-binder/task/BuildTransactionContextTask\";\nimport {\n ProvideSolanaTransactionContextTask,\n type SolanaContextForDevice,\n} from \"@internal/app-binder/task/ProvideTransactionContextTask\";\nimport { SignDataTask } from \"@internal/app-binder/task/SendSignDataTask\";\n\nexport type MachineDependencies = {\n readonly getAppConfig: () => Promise<\n CommandResult<AppConfiguration, SolanaAppErrorCodes>\n >;\n readonly buildContext: (arg0: {\n input: BuildTransactionContextTaskArgs;\n }) => Promise<SolanaBuildContextResult>;\n readonly provideContext: (arg0: {\n input: SolanaContextForDevice;\n }) => Promise<Maybe<CommandErrorResult<SolanaAppErrorCodes>>>;\n readonly inspectTransaction: (arg0: {\n serializedTransaction: Uint8Array;\n resolutionContext?: TransactionResolutionContext;\n }) => Promise<TxInspectorResult>;\n readonly signTransaction: (arg0: {\n input: {\n derivationPath: string;\n serializedTransaction: Uint8Array;\n };\n }) => Promise<\n CommandResult<Maybe<Signature | SolanaAppErrorCodes>, SolanaAppErrorCodes>\n >;\n};\n\nexport class SignTransactionDeviceAction extends XStateDeviceAction<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n> {\n makeStateMachine(\n internalApi: InternalApi,\n ): DeviceActionStateMachine<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n > {\n type types = StateMachineTypes<\n SignTransactionDAOutput,\n SignTransactionDAInput,\n SignTransactionDAError,\n SignTransactionDAIntermediateValue,\n SignTransactionDAInternalState\n >;\n\n const {\n signTransaction,\n getAppConfig,\n buildContext,\n provideContext,\n inspectTransaction,\n } = this.extractDependencies(internalApi);\n\n return setup({\n types: {\n input: {} as types[\"input\"],\n context: {} as types[\"context\"],\n output: {} as types[\"output\"],\n },\n actors: {\n openAppStateMachine: new OpenAppDeviceAction({\n input: { appName: \"Solana\" },\n }).makeStateMachine(internalApi),\n\n getAppConfig: fromPromise(getAppConfig),\n inspectTransaction: fromPromise(\n ({\n input,\n }: {\n input: {\n serializedTransaction: Uint8Array;\n resolutionContext?: TransactionResolutionContext;\n };\n }) =>\n inspectTransaction({\n serializedTransaction: input.serializedTransaction,\n resolutionContext: input.resolutionContext,\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 }) => context.input.skipOpenApp,\n isSPLSupported: ({ context }) =>\n new ApplicationChecker(\n internalApi.getDeviceSessionState(),\n context._internalState.appConfig!,\n )\n .withMinVersionExclusive(\"1.4.0\")\n .excludeDeviceModel(DeviceModelId.NANO_S)\n .check(),\n isAnSPLTransaction: ({ context }) =>\n context._internalState.inspectorResult?.transactionType ===\n SolanaTransactionTypes.SPL,\n shouldSkipInspection: ({ context }) =>\n context._internalState.error === null &&\n !!context.input.resolutionContext,\n },\n actions: {\n assignErrorFromEvent: assign({\n _internalState: (_) => ({\n ..._.context._internalState,\n error: new UnknownDAError(\n _.event[\"error\"] instanceof Error\n ? _.event[\"error\"].message\n : String(_.event[\"error\"]),\n ),\n }),\n }),\n },\n }).createMachine({\n id: \"SignTransactionDeviceAction\",\n initial: \"InitialState\",\n context: ({ input }) => ({\n input,\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n _internalState: {\n error: null,\n signature: null,\n appConfig: null,\n solanaTransactionContext: null,\n inspectorResult: null,\n },\n }),\n states: {\n InitialState: {\n always: [\n { target: \"GetAppConfig\", guard: \"skipOpenApp\" },\n { target: \"OpenAppDeviceAction\" },\n ],\n },\n OpenAppDeviceAction: {\n exit: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n invoke: {\n id: \"openAppStateMachine\",\n src: \"openAppStateMachine\",\n input: () => ({ appName: \"Solana\" }),\n onSnapshot: {\n actions: assign({\n intermediateValue: ({ event }) =>\n event.snapshot.context.intermediateValue,\n }),\n },\n onDone: {\n target: \"CheckOpenAppDeviceActionResult\",\n actions: assign({\n _internalState: ({ event, context }) =>\n event.output.caseOf({\n Right: () => context._internalState,\n Left: (error) => ({\n ...context._internalState,\n error,\n }),\n }),\n }),\n },\n },\n },\n CheckOpenAppDeviceActionResult: {\n always: [\n { target: \"GetAppConfig\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n GetAppConfig: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n invoke: {\n id: \"getAppConfig\",\n src: \"getAppConfig\",\n onDone: {\n target: \"GetAppConfigResultCheck\",\n actions: assign({\n _internalState: ({ event, context }) =>\n isSuccessCommandResult(event.output)\n ? {\n ...context._internalState,\n appConfig: event.output.data,\n }\n : { ...context._internalState, error: event.output.error },\n }),\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n GetAppConfigResultCheck: {\n always: [\n { target: \"InspectTransaction\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n InspectTransaction: {\n invoke: {\n id: \"inspectTransaction\",\n src: \"inspectTransaction\",\n\n input: ({ context }) => ({\n serializedTransaction: context.input.transaction,\n resolutionContext: context.input.resolutionContext,\n }),\n onDone: {\n target: \"AfterInspect\",\n actions: assign({\n _internalState: ({ context, event }) => ({\n ...context._internalState,\n inspectorResult: event.output,\n }),\n }),\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n AfterInspect: {\n always: [\n { target: \"BuildContext\", guard: \"isAnSPLTransaction\" },\n { target: \"SignTransaction\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n BuildContext: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n invoke: {\n id: \"buildContext\",\n src: \"buildContext\",\n input: ({ context }) => {\n const inspectorData =\n context._internalState.inspectorResult?.data;\n return {\n contextModule: context.input.contextModule,\n options: {\n tokenAddress: inspectorData?.tokenAddress,\n createATA: inspectorData?.createATA,\n },\n };\n },\n onDone: {\n target: \"ProvideContext\",\n actions: [\n assign({\n _internalState: ({ event, context }) => ({\n ...context._internalState,\n solanaTransactionContext: {\n descriptor: event.output.descriptor,\n certificate: event.output.calCertificate,\n tokenAccount: event.output.addressResult.tokenAccount,\n owner: event.output.addressResult.owner,\n contract: event.output.addressResult.contract,\n },\n }),\n }),\n ],\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n ProvideContext: {\n entry: assign({\n intermediateValue: () => ({\n requiredUserInteraction: UserInteractionRequired.None,\n }),\n }),\n invoke: {\n id: \"provideContext\",\n src: \"provideContext\",\n input: ({ context }) => {\n if (!context._internalState.solanaTransactionContext) {\n throw new UnknownDAError(\n \"Solana transaction context is not available\",\n );\n }\n return context._internalState.solanaTransactionContext;\n },\n onDone: {\n target: \"ProvideContextResultCheck\",\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n ProvideContextResultCheck: {\n always: [\n { target: \"SignTransaction\", guard: \"noInternalError\" },\n { target: \"Error\" },\n ],\n },\n SignTransaction: {\n entry: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.SignTransaction,\n },\n }),\n exit: assign({\n intermediateValue: {\n requiredUserInteraction: UserInteractionRequired.None,\n },\n }),\n invoke: {\n id: \"signTransaction\",\n src: \"signTransaction\",\n input: ({ context }) => {\n return {\n derivationPath: context.input.derivationPath,\n serializedTransaction: context.input.transaction,\n };\n },\n onDone: {\n target: \"SignTransactionResultCheck\",\n actions: [\n assign({\n _internalState: ({ event, context }) => {\n if (!isSuccessCommandResult(event.output))\n return {\n ...context._internalState,\n error: event.output.error,\n };\n\n const data = event.output.data.extract();\n if (\n event.output.data.isJust() &&\n data instanceof Uint8Array\n )\n return {\n ...context._internalState,\n signature: data,\n };\n\n return {\n ...context._internalState,\n error: new UnknownDAError(\"No Signature available\"),\n };\n },\n }),\n ],\n },\n onError: {\n target: \"Error\",\n actions: \"assignErrorFromEvent\",\n },\n },\n },\n SignTransactionResultCheck: {\n always: [\n { guard: \"noInternalError\", target: \"Success\" },\n { target: \"Error\" },\n ],\n },\n Success: { type: \"final\" },\n Error: { type: \"final\" },\n },\n output: ({ context }) =>\n context._internalState.signature\n ? Right(context._internalState.signature)\n : Left(\n context._internalState.error ||\n new UnknownDAError(`No error or signature available`),\n ),\n });\n }\n\n extractDependencies(internalApi: InternalApi): MachineDependencies {\n const getAppConfig = async () =>\n internalApi.sendCommand(new GetAppConfigurationCommand());\n\n const buildContext = async (arg0: {\n input: BuildTransactionContextTaskArgs;\n }) => new BuildTransactionContextTask(internalApi, arg0.input).run();\n\n const provideContext = async (arg0: { input: SolanaContextForDevice }) =>\n new ProvideSolanaTransactionContextTask(internalApi, arg0.input).run();\n\n const inspectTransaction = async (arg0: {\n serializedTransaction: Uint8Array;\n resolutionContext?: TransactionResolutionContext;\n }) =>\n Promise.resolve(\n new TransactionInspector(\n arg0.serializedTransaction,\n arg0.resolutionContext?.tokenAddress ?? null,\n arg0.resolutionContext?.createATA ?? null,\n ).inspectTransactionType(),\n );\n\n const signTransaction = async (arg0: {\n input: {\n derivationPath: string;\n serializedTransaction: Uint8Array;\n };\n }) =>\n new SignDataTask(internalApi, {\n commandFactory: (args) =>\n new SignTransactionCommand({\n serializedTransaction: args.chunkedData,\n more: args.more,\n extend: args.extend,\n }),\n derivationPath: arg0.input.derivationPath,\n sendingData: arg0.input.serializedTransaction,\n }).run();\n\n return {\n getAppConfig,\n buildContext,\n provideContext,\n signTransaction,\n inspectTransaction,\n };\n }\n}\n"],
5
5
  "mappings": "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",
6
6
  "names": ["DeviceModelId", "isSuccessCommandResult", "OpenAppDeviceAction", "UnknownDAError", "UserInteractionRequired", "XStateDeviceAction", "Left", "Right", "assign", "fromPromise", "setup", "GetAppConfigurationCommand", "SignTransactionCommand", "ApplicationChecker", "SolanaTransactionTypes", "TransactionInspector", "BuildTransactionContextTask", "ProvideSolanaTransactionContextTask", "SignDataTask", "SignTransactionDeviceAction", "internalApi", "signTransaction", "getAppConfig", "buildContext", "provideContext", "inspectTransaction", "input", "context", "_", "event", "error", "inspectorData", "data", "arg0", "args"]
7
7
  }
@@ -1,2 +1,2 @@
1
- import{ASSOCIATED_TOKEN_PROGRAM_ID as g,TOKEN_2022_PROGRAM_ID as T,TOKEN_PROGRAM_ID as K}from"@solana/spl-token";import{Connection as b,Transaction as P,TransactionInstruction as x,VersionedMessage as k,VersionedTransaction as S}from"@solana/web3.js";import{Buffer as p}from"buffer";import{DECODERS as h}from"../../app-binder/services/utils/transactionDecoders";var L=(t=>(t.STANDARD="Standard",t.SPL="SPL",t))(L||{});const D="http://api.mainnet-beta.solana.com/",R=new b(D,{commitment:"confirmed"}),A=d=>!!d&&(d.equals(g)||d.equals(K)||d.equals(T));class _{constructor(n,t,s){this.rawTransactionBytes=n;this.tokenAddress=t;this.createATA=s}async inspectTransactionType(){try{const n=await this.normaliseMessage(this.rawTransactionBytes);if(this.tokenAddress||this.createATA){const t=n.compiledInstructions.some(a=>A(n.allKeys[a.programIdIndex])),s={};return this.tokenAddress&&(s.tokenAddress=this.tokenAddress),this.createATA&&(s.createATA=this.createATA,!s.mintAddress&&this.createATA.mintAddress&&(s.mintAddress=this.createATA.mintAddress)),{transactionType:t?"SPL":"Standard",data:s}}for(const t of n.compiledInstructions){const s=n.allKeys[t.programIdIndex];if(!s)continue;const a=t.accountKeyIndexes.map(o=>n.allKeys[o]).filter(o=>!!o),u=new x({programId:s,keys:a.map(o=>({pubkey:o,isSigner:!1,isWritable:!1})),data:p.from(t.data)}),i={programId:s,ixMeta:t,message:n,instruction:u};for(const o of h){if(!o.when(i))continue;const l=o.decode(i);if(l)return{transactionType:"SPL",data:l}}if(A(s))return{transactionType:"SPL",data:{}}}return{transactionType:"Standard",data:{}}}catch{return{transactionType:"Standard",data:{}}}}async normaliseMessage(n){const t=this.tryDeserialiseVersioned(n);if(t){const e=t.message,r=await M(e);let m;return typeof e.getAccountKeys=="function"?m=e.getAccountKeys(r?{accountKeysFromLookups:r}:void 0).keySegments().flat():m=[...e.staticAccountKeys],{compiledInstructions:e.compiledInstructions.map(c=>{const f=c,I=Array.from(f.accounts??c.accountKeyIndexes??[]);let y;return c.data instanceof Uint8Array?y=c.data:typeof c.data=="string"?y=p.from(c.data,"base64"):y=Uint8Array.from(c.data??[]),{programIdIndex:c.programIdIndex,accountKeyIndexes:I,data:y}}),allKeys:m}}const s=P.from(n),a=new Map,u=e=>{if(!e)return;const r=e.toBase58();a.has(r)||a.set(r,e)};u(s.feePayer??null);for(const e of s.instructions){u(e.programId);for(const r of e.keys)u(r.pubkey)}const i=Array.from(a.values()),o=new Map(i.map((e,r)=>[e.toBase58(),r]));return{compiledInstructions:s.instructions.map(e=>({programIdIndex:o.get(e.programId.toBase58())??-1,accountKeyIndexes:e.keys.map(r=>o.get(r.pubkey.toBase58())??-1),data:e.data})),allKeys:i}}tryDeserialiseVersioned(n){try{return S.deserialize(n)}catch{try{return{message:k.deserialize(n)}}catch{return null}}}}async function M(d){const n=d.addressTableLookups??[];if(!n.length)return;const t=[],s=[];return await Promise.all(n.map(async a=>{const i=(await R.getAddressLookupTable(a.accountKey)).value;if(!i)return;const o=i.state.addresses;for(const l of a.writableIndexes??[]){const e=o[l];e&&t.push(e)}for(const l of a.readonlyIndexes??[]){const e=o[l];e&&s.push(e)}})),{writable:t,readonly:s}}export{L as SolanaTransactionTypes,_ as TransactionInspector};
1
+ import{ASSOCIATED_TOKEN_PROGRAM_ID as I,TOKEN_2022_PROGRAM_ID as g,TOKEN_PROGRAM_ID as K}from"@solana/spl-token";import{Connection as b,Transaction as P,TransactionInstruction as k,VersionedMessage as x,VersionedTransaction as S}from"@solana/web3.js";import{Buffer as p}from"buffer";import{DECODERS as L}from"../../app-binder/services/utils/transactionDecoders";var h=(a=>(a.STANDARD="Standard",a.SPL="SPL",a))(h||{});const D="https://api.mainnet-beta.solana.com/",R=new b(D,{commitment:"confirmed"}),A=i=>!!i&&(i.equals(I)||i.equals(K)||i.equals(g));class _{constructor(n,a,s){this.rawTransactionBytes=n;this.tokenAddress=a;this.createATA=s}async inspectTransactionType(){try{const n=await this.normaliseMessage(this.rawTransactionBytes);if(this.tokenAddress||this.createATA)return{transactionType:n.compiledInstructions.some(r=>A(n.allKeys[r.programIdIndex]))?"SPL":"Standard",data:{...this.tokenAddress?{tokenAddress:this.tokenAddress}:{},...this.createATA?{createATA:this.createATA}:{}}};let a=!1,s={};for(const o of n.compiledInstructions){const r=n.allKeys[o.programIdIndex];if(!r)continue;A(r)&&(a=!0);const d=o.accountKeyIndexes.map(e=>n.allKeys[e]).filter(e=>!!e),l=new k({programId:r,keys:d.map(e=>({pubkey:e,isSigner:!1,isWritable:!1})),data:p.from(o.data)}),u={programId:r,ixMeta:o,message:n,instruction:l};for(const e of L){if(!e.when(u))continue;const t=e.decode(u);t&&(t.createATA&&!s.createATA?s={...s,createATA:t.createATA}:t.tokenAddress&&!s.tokenAddress&&!s.createATA&&(s={...s,tokenAddress:t.tokenAddress}))}}return s.createATA?{transactionType:"SPL",data:s}:s.tokenAddress?{transactionType:"SPL",data:s}:a?{transactionType:"SPL",data:{}}:{transactionType:"Standard",data:{}}}catch{return{transactionType:"Standard",data:{}}}}async normaliseMessage(n){const a=this.tryDeserialiseVersioned(n);if(a){const e=a.message,t=await M(e);let m;return typeof e.getAccountKeys=="function"?m=e.getAccountKeys(t?{accountKeysFromLookups:t}:void 0).keySegments().flat():m=[...e.staticAccountKeys],{compiledInstructions:e.compiledInstructions.map(c=>{const f=c,T=Array.from(f.accounts??c.accountKeyIndexes??[]);let y;return c.data instanceof Uint8Array?y=c.data:typeof c.data=="string"?y=p.from(c.data,"base64"):y=Uint8Array.from(c.data??[]),{programIdIndex:c.programIdIndex,accountKeyIndexes:T,data:y}}),allKeys:m}}const s=P.from(n),o=new Map,r=e=>{if(!e)return;const t=e.toBase58();o.has(t)||o.set(t,e)};r(s.feePayer??null);for(const e of s.instructions){r(e.programId);for(const t of e.keys)r(t.pubkey)}const d=Array.from(o.values()),l=new Map(d.map((e,t)=>[e.toBase58(),t]));return{compiledInstructions:s.instructions.map(e=>({programIdIndex:l.get(e.programId.toBase58())??-1,accountKeyIndexes:e.keys.map(t=>l.get(t.pubkey.toBase58())??-1),data:e.data})),allKeys:d}}tryDeserialiseVersioned(n){try{return S.deserialize(n)}catch{try{return{message:x.deserialize(n)}}catch{return null}}}}async function M(i){const n=i.addressTableLookups??[];if(!n.length)return;const a=[],s=[];return await Promise.all(n.map(async o=>{const d=(await R.getAddressLookupTable(o.accountKey)).value;if(!d)return;const l=d.state.addresses;for(const u of o.writableIndexes??[]){const e=l[u];e&&a.push(e)}for(const u of o.readonlyIndexes??[]){const e=l[u];e&&s.push(e)}})),{writable:a,readonly:s}}export{h as SolanaTransactionTypes,_ as TransactionInspector};
2
2
  //# sourceMappingURL=TransactionInspector.js.map
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../../../../../src/internal/app-binder/services/TransactionInspector.ts"],
4
- "sourcesContent": ["import {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n TOKEN_2022_PROGRAM_ID,\n TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport {\n Connection,\n type PublicKey,\n Transaction,\n TransactionInstruction,\n VersionedMessage,\n VersionedTransaction,\n} from \"@solana/web3.js\";\nimport { Buffer } from \"buffer\";\n\nimport {\n DECODERS,\n type IxContext,\n type TxInspectorResult,\n} from \"@internal/app-binder/services/utils/transactionDecoders\";\n\nexport enum SolanaTransactionTypes {\n STANDARD = \"Standard\",\n SPL = \"SPL\",\n}\n\nexport type NormalizedCompiledIx = {\n programIdIndex: number;\n accountKeyIndexes: number[];\n data: Uint8Array;\n};\n\nexport type NormalizedMessage = {\n compiledInstructions: NormalizedCompiledIx[];\n allKeys: PublicKey[];\n};\n\ntype LoadedAddresses = { writable: PublicKey[]; readonly: PublicKey[] };\n\nconst RPC_URL = \"http://api.mainnet-beta.solana.com/\";\n\nconst defaultConnection = new Connection(RPC_URL, { commitment: \"confirmed\" });\n\nconst isSPLProgramId = (pid: PublicKey | undefined) =>\n !!pid &&\n (pid.equals(ASSOCIATED_TOKEN_PROGRAM_ID) ||\n pid.equals(TOKEN_PROGRAM_ID) ||\n pid.equals(TOKEN_2022_PROGRAM_ID));\n\nexport class TransactionInspector {\n constructor(\n private readonly rawTransactionBytes: Uint8Array,\n private readonly tokenAddress?: string | null,\n private readonly createATA?: {\n address: string;\n mintAddress: string;\n } | null,\n ) {}\n\n public async inspectTransactionType(): Promise<TxInspectorResult> {\n try {\n const message = await this.normaliseMessage(this.rawTransactionBytes);\n\n // If tokenAddress or createATA is provided, use those directly\n // and only classify SPL vs Standard by scanning program IDs.\n if (this.tokenAddress || this.createATA) {\n const looksSPL = message.compiledInstructions.some((ix) =>\n isSPLProgramId(message.allKeys[ix.programIdIndex]),\n );\n\n const data: TxInspectorResult[\"data\"] = {};\n if (this.tokenAddress) data.tokenAddress = this.tokenAddress;\n if (this.createATA) {\n data.createATA = this.createATA;\n // If mint is known from createATA and caller didn't pass mintAddress explicitly,\n // populate it so downstream UI has the same shape as decoder output.\n if (!data.mintAddress && this.createATA.mintAddress) {\n data.mintAddress = this.createATA.mintAddress;\n }\n }\n\n return {\n transactionType: looksSPL\n ? SolanaTransactionTypes.SPL\n : SolanaTransactionTypes.STANDARD,\n data,\n };\n }\n\n // Normal path: decode from the message\n for (const ixMeta of message.compiledInstructions) {\n const programId = message.allKeys[ixMeta.programIdIndex];\n if (!programId) continue;\n\n const resolvedKeys = ixMeta.accountKeyIndexes\n .map((i) => message.allKeys[i])\n .filter((key): key is PublicKey => !!key);\n\n // Build an instruction even with partial keys; decoders handle missing fields gracefully.\n const instruction = new TransactionInstruction({\n programId,\n keys: resolvedKeys.map((key) => ({\n pubkey: key,\n isSigner: false,\n isWritable: false,\n })),\n data: Buffer.from(ixMeta.data),\n });\n\n const ctx: IxContext = { programId, ixMeta, message, instruction };\n\n for (const decoder of DECODERS) {\n if (!decoder.when(ctx)) continue;\n const data = decoder.decode(ctx);\n if (data) {\n return { transactionType: SolanaTransactionTypes.SPL, data };\n }\n }\n\n if (isSPLProgramId(programId)) {\n return { transactionType: SolanaTransactionTypes.SPL, data: {} };\n }\n }\n\n return { transactionType: SolanaTransactionTypes.STANDARD, data: {} };\n } catch {\n return { transactionType: SolanaTransactionTypes.STANDARD, data: {} };\n }\n }\n\n /**\n * Normalise any tx (legacy or v0) into { compiledInstructions, allKeys }.\n * For v0, we auto-fetch looked-up addresses from ALT(s) via the baked-in connection.\n */\n private async normaliseMessage(\n rawBytes: Uint8Array,\n ): Promise<NormalizedMessage> {\n const versionedTX = this.tryDeserialiseVersioned(rawBytes);\n if (versionedTX) {\n const msg = versionedTX.message as VersionedMessage & {\n getAccountKeys?: (options?: {\n accountKeysFromLookups?: LoadedAddresses;\n }) => {\n staticAccountKeys: PublicKey[];\n accountKeysFromLookups?: LoadedAddresses;\n keySegments: () => PublicKey[][];\n };\n compiledInstructions: Array<{\n programIdIndex: number;\n accountKeyIndexes?: number[]; // legacy field name\n accounts?: number[]; // v0 field name\n data: Uint8Array | string | number[];\n }>;\n staticAccountKeys: PublicKey[];\n };\n\n const lookedUp = await resolveLookedUpAddressesFromMessage(msg);\n\n let allKeys: PublicKey[];\n if (typeof msg.getAccountKeys === \"function\") {\n const messageAccountKeys = msg.getAccountKeys(\n lookedUp ? { accountKeysFromLookups: lookedUp } : undefined,\n );\n allKeys = messageAccountKeys.keySegments().flat();\n } else {\n allKeys = [...msg.staticAccountKeys];\n }\n\n const compiledInstructions: NormalizedCompiledIx[] =\n msg.compiledInstructions.map((ix) => {\n const ixWithAccounts = ix as typeof ix & { accounts?: number[] };\n const accountKeyIndexes = Array.from(\n ixWithAccounts.accounts ?? ix.accountKeyIndexes ?? [],\n ) as number[];\n\n let data: Uint8Array;\n if (ix.data instanceof Uint8Array) {\n data = ix.data;\n } else if (typeof ix.data === \"string\") {\n data = Buffer.from(ix.data, \"base64\"); // v0 encodes instruction data as base64\n } else {\n data = Uint8Array.from(ix.data ?? []);\n }\n\n return {\n programIdIndex: ix.programIdIndex,\n accountKeyIndexes,\n data,\n };\n });\n\n return { compiledInstructions, allKeys };\n }\n\n // Legacy (no ALTs)\n const legacy = Transaction.from(rawBytes);\n\n const allKeyMap = new Map<string, PublicKey>();\n const add = (pubkey?: PublicKey | null) => {\n if (!pubkey) return;\n const key = pubkey.toBase58();\n if (!allKeyMap.has(key)) allKeyMap.set(key, pubkey);\n };\n\n add(legacy.feePayer ?? null);\n for (const ix of legacy.instructions) {\n add(ix.programId);\n for (const key of ix.keys) add(key.pubkey);\n }\n const allKeys = Array.from(allKeyMap.values());\n const indexByB58 = new Map(allKeys.map((pk, i) => [pk.toBase58(), i]));\n\n const compiledInstructions: NormalizedCompiledIx[] =\n legacy.instructions.map((ix) => ({\n programIdIndex: indexByB58.get(ix.programId.toBase58()) ?? -1,\n accountKeyIndexes: ix.keys.map(\n (key) => indexByB58.get(key.pubkey.toBase58()) ?? -1,\n ),\n data: ix.data,\n }));\n\n return { compiledInstructions, allKeys };\n }\n\n private tryDeserialiseVersioned(\n rawBytes: Uint8Array,\n ): VersionedTransaction | null {\n try {\n return VersionedTransaction.deserialize(rawBytes);\n } catch {\n try {\n const msg = VersionedMessage.deserialize(rawBytes);\n // Wrap in a dummy VersionedTransaction-like shape just for uniform handling\n return { message: msg } as VersionedTransaction;\n } catch {\n return null;\n }\n }\n }\n}\n\n// fetch looked-up addresses for a VersionedMessage via the baked-in connection\nasync function resolveLookedUpAddressesFromMessage(\n msg: VersionedMessage,\n): Promise<LoadedAddresses | undefined> {\n const lookups = msg.addressTableLookups ?? [];\n if (!lookups.length) return;\n\n const writable: PublicKey[] = [];\n const readonly: PublicKey[] = [];\n\n await Promise.all(\n lookups.map(async (lu) => {\n const res = await defaultConnection.getAddressLookupTable(lu.accountKey);\n const table = res.value;\n if (!table) return;\n const addrs = table.state.addresses;\n\n for (const i of lu.writableIndexes ?? []) {\n const pk = addrs[i];\n if (pk) writable.push(pk);\n }\n for (const i of lu.readonlyIndexes ?? []) {\n const pk = addrs[i];\n if (pk) readonly.push(pk);\n }\n }),\n );\n\n return { writable, readonly };\n}\n"],
5
- "mappings": "AAAA,OACE,+BAAAA,EACA,yBAAAC,EACA,oBAAAC,MACK,oBACP,OACE,cAAAC,EAEA,eAAAC,EACA,0BAAAC,EACA,oBAAAC,EACA,wBAAAC,MACK,kBACP,OAAS,UAAAC,MAAc,SAEvB,OACE,YAAAC,MAGK,0DAEA,IAAKC,OACVA,EAAA,SAAW,WACXA,EAAA,IAAM,MAFIA,OAAA,IAkBZ,MAAMC,EAAU,sCAEVC,EAAoB,IAAIT,EAAWQ,EAAS,CAAE,WAAY,WAAY,CAAC,EAEvEE,EAAkBC,GACtB,CAAC,CAACA,IACDA,EAAI,OAAOd,CAA2B,GACrCc,EAAI,OAAOZ,CAAgB,GAC3BY,EAAI,OAAOb,CAAqB,GAE7B,MAAMc,CAAqB,CAChC,YACmBC,EACAC,EACAC,EAIjB,CANiB,yBAAAF,EACA,kBAAAC,EACA,eAAAC,CAIhB,CAEH,MAAa,wBAAqD,CAChE,GAAI,CACF,MAAMC,EAAU,MAAM,KAAK,iBAAiB,KAAK,mBAAmB,EAIpE,GAAI,KAAK,cAAgB,KAAK,UAAW,CACvC,MAAMC,EAAWD,EAAQ,qBAAqB,KAAME,GAClDR,EAAeM,EAAQ,QAAQE,EAAG,cAAc,CAAC,CACnD,EAEMC,EAAkC,CAAC,EACzC,OAAI,KAAK,eAAcA,EAAK,aAAe,KAAK,cAC5C,KAAK,YACPA,EAAK,UAAY,KAAK,UAGlB,CAACA,EAAK,aAAe,KAAK,UAAU,cACtCA,EAAK,YAAc,KAAK,UAAU,cAI/B,CACL,gBAAiBF,EACb,MACA,WACJ,KAAAE,CACF,CACF,CAGA,UAAWC,KAAUJ,EAAQ,qBAAsB,CACjD,MAAMK,EAAYL,EAAQ,QAAQI,EAAO,cAAc,EACvD,GAAI,CAACC,EAAW,SAEhB,MAAMC,EAAeF,EAAO,kBACzB,IAAKG,GAAMP,EAAQ,QAAQO,CAAC,CAAC,EAC7B,OAAQC,GAA0B,CAAC,CAACA,CAAG,EAGpCC,EAAc,IAAIvB,EAAuB,CAC7C,UAAAmB,EACA,KAAMC,EAAa,IAAKE,IAAS,CAC/B,OAAQA,EACR,SAAU,GACV,WAAY,EACd,EAAE,EACF,KAAMnB,EAAO,KAAKe,EAAO,IAAI,CAC/B,CAAC,EAEKM,EAAiB,CAAE,UAAAL,EAAW,OAAAD,EAAQ,QAAAJ,EAAS,YAAAS,CAAY,EAEjE,UAAWE,KAAWrB,EAAU,CAC9B,GAAI,CAACqB,EAAQ,KAAKD,CAAG,EAAG,SACxB,MAAMP,EAAOQ,EAAQ,OAAOD,CAAG,EAC/B,GAAIP,EACF,MAAO,CAAE,gBAAiB,MAA4B,KAAAA,CAAK,CAE/D,CAEA,GAAIT,EAAeW,CAAS,EAC1B,MAAO,CAAE,gBAAiB,MAA4B,KAAM,CAAC,CAAE,CAEnE,CAEA,MAAO,CAAE,gBAAiB,WAAiC,KAAM,CAAC,CAAE,CACtE,MAAQ,CACN,MAAO,CAAE,gBAAiB,WAAiC,KAAM,CAAC,CAAE,CACtE,CACF,CAMA,MAAc,iBACZO,EAC4B,CAC5B,MAAMC,EAAc,KAAK,wBAAwBD,CAAQ,EACzD,GAAIC,EAAa,CACf,MAAMC,EAAMD,EAAY,QAiBlBE,EAAW,MAAMC,EAAoCF,CAAG,EAE9D,IAAIG,EACJ,OAAI,OAAOH,EAAI,gBAAmB,WAIhCG,EAH2BH,EAAI,eAC7BC,EAAW,CAAE,uBAAwBA,CAAS,EAAI,MACpD,EAC6B,YAAY,EAAE,KAAK,EAEhDE,EAAU,CAAC,GAAGH,EAAI,iBAAiB,EA0B9B,CAAE,qBAtBPA,EAAI,qBAAqB,IAAKZ,GAAO,CACnC,MAAMgB,EAAiBhB,EACjBiB,EAAoB,MAAM,KAC9BD,EAAe,UAAYhB,EAAG,mBAAqB,CAAC,CACtD,EAEA,IAAIC,EACJ,OAAID,EAAG,gBAAgB,WACrBC,EAAOD,EAAG,KACD,OAAOA,EAAG,MAAS,SAC5BC,EAAOd,EAAO,KAAKa,EAAG,KAAM,QAAQ,EAEpCC,EAAO,WAAW,KAAKD,EAAG,MAAQ,CAAC,CAAC,EAG/B,CACL,eAAgBA,EAAG,eACnB,kBAAAiB,EACA,KAAAhB,CACF,CACF,CAAC,EAE4B,QAAAc,CAAQ,CACzC,CAGA,MAAMG,EAASnC,EAAY,KAAK2B,CAAQ,EAElCS,EAAY,IAAI,IAChBC,EAAOC,GAA8B,CACzC,GAAI,CAACA,EAAQ,OACb,MAAMf,EAAMe,EAAO,SAAS,EACvBF,EAAU,IAAIb,CAAG,GAAGa,EAAU,IAAIb,EAAKe,CAAM,CACpD,EAEAD,EAAIF,EAAO,UAAY,IAAI,EAC3B,UAAWlB,KAAMkB,EAAO,aAAc,CACpCE,EAAIpB,EAAG,SAAS,EAChB,UAAWM,KAAON,EAAG,KAAMoB,EAAId,EAAI,MAAM,CAC3C,CACA,MAAMS,EAAU,MAAM,KAAKI,EAAU,OAAO,CAAC,EACvCG,EAAa,IAAI,IAAIP,EAAQ,IAAI,CAACQ,EAAIlB,IAAM,CAACkB,EAAG,SAAS,EAAGlB,CAAC,CAAC,CAAC,EAWrE,MAAO,CAAE,qBARPa,EAAO,aAAa,IAAKlB,IAAQ,CAC/B,eAAgBsB,EAAW,IAAItB,EAAG,UAAU,SAAS,CAAC,GAAK,GAC3D,kBAAmBA,EAAG,KAAK,IACxBM,GAAQgB,EAAW,IAAIhB,EAAI,OAAO,SAAS,CAAC,GAAK,EACpD,EACA,KAAMN,EAAG,IACX,EAAE,EAE2B,QAAAe,CAAQ,CACzC,CAEQ,wBACNL,EAC6B,CAC7B,GAAI,CACF,OAAOxB,EAAqB,YAAYwB,CAAQ,CAClD,MAAQ,CACN,GAAI,CAGF,MAAO,CAAE,QAFGzB,EAAiB,YAAYyB,CAAQ,CAE3B,CACxB,MAAQ,CACN,OAAO,IACT,CACF,CACF,CACF,CAGA,eAAeI,EACbF,EACsC,CACtC,MAAMY,EAAUZ,EAAI,qBAAuB,CAAC,EAC5C,GAAI,CAACY,EAAQ,OAAQ,OAErB,MAAMC,EAAwB,CAAC,EACzBC,EAAwB,CAAC,EAE/B,aAAM,QAAQ,IACZF,EAAQ,IAAI,MAAOG,GAAO,CAExB,MAAMC,GADM,MAAMrC,EAAkB,sBAAsBoC,EAAG,UAAU,GACrD,MAClB,GAAI,CAACC,EAAO,OACZ,MAAMC,EAAQD,EAAM,MAAM,UAE1B,UAAWvB,KAAKsB,EAAG,iBAAmB,CAAC,EAAG,CACxC,MAAMJ,EAAKM,EAAMxB,CAAC,EACdkB,GAAIE,EAAS,KAAKF,CAAE,CAC1B,CACA,UAAWlB,KAAKsB,EAAG,iBAAmB,CAAC,EAAG,CACxC,MAAMJ,EAAKM,EAAMxB,CAAC,EACdkB,GAAIG,EAAS,KAAKH,CAAE,CAC1B,CACF,CAAC,CACH,EAEO,CAAE,SAAAE,EAAU,SAAAC,CAAS,CAC9B",
6
- "names": ["ASSOCIATED_TOKEN_PROGRAM_ID", "TOKEN_2022_PROGRAM_ID", "TOKEN_PROGRAM_ID", "Connection", "Transaction", "TransactionInstruction", "VersionedMessage", "VersionedTransaction", "Buffer", "DECODERS", "SolanaTransactionTypes", "RPC_URL", "defaultConnection", "isSPLProgramId", "pid", "TransactionInspector", "rawTransactionBytes", "tokenAddress", "createATA", "message", "looksSPL", "ix", "data", "ixMeta", "programId", "resolvedKeys", "i", "key", "instruction", "ctx", "decoder", "rawBytes", "versionedTX", "msg", "lookedUp", "resolveLookedUpAddressesFromMessage", "allKeys", "ixWithAccounts", "accountKeyIndexes", "legacy", "allKeyMap", "add", "pubkey", "indexByB58", "pk", "lookups", "writable", "readonly", "lu", "table", "addrs"]
4
+ "sourcesContent": ["import {\n ASSOCIATED_TOKEN_PROGRAM_ID,\n TOKEN_2022_PROGRAM_ID,\n TOKEN_PROGRAM_ID,\n} from \"@solana/spl-token\";\nimport {\n Connection,\n type PublicKey,\n Transaction,\n TransactionInstruction,\n VersionedMessage,\n VersionedTransaction,\n} from \"@solana/web3.js\";\nimport { Buffer } from \"buffer\";\n\nimport {\n DECODERS,\n type IxContext,\n} from \"@internal/app-binder/services/utils/transactionDecoders\";\n\nexport enum SolanaTransactionTypes {\n STANDARD = \"Standard\",\n SPL = \"SPL\",\n}\n\nexport type NormalizedCompiledIx = {\n programIdIndex: number;\n accountKeyIndexes: number[];\n data: Uint8Array;\n};\n\nexport type NormalizedMessage = {\n compiledInstructions: NormalizedCompiledIx[];\n allKeys: PublicKey[];\n};\n\nexport interface TxInspectorResult {\n transactionType: SolanaTransactionTypes;\n data: {\n tokenAddress?: string;\n createATA?: { address: string; mintAddress: string };\n };\n}\n\ntype LoadedAddresses = { writable: PublicKey[]; readonly: PublicKey[] };\n\nconst RPC_URL = \"https://api.mainnet-beta.solana.com/\";\n\nconst defaultConnection = new Connection(RPC_URL, { commitment: \"confirmed\" });\n\nconst isSPLProgramId = (pid: PublicKey | undefined) =>\n !!pid &&\n (pid.equals(ASSOCIATED_TOKEN_PROGRAM_ID) ||\n pid.equals(TOKEN_PROGRAM_ID) ||\n pid.equals(TOKEN_2022_PROGRAM_ID));\n\nexport class TransactionInspector {\n constructor(\n private readonly rawTransactionBytes: Uint8Array,\n private readonly tokenAddress?: string | null,\n private readonly createATA?: {\n address: string;\n mintAddress: string;\n } | null,\n ) {}\n\n public async inspectTransactionType(): Promise<TxInspectorResult> {\n try {\n const message = await this.normaliseMessage(this.rawTransactionBytes);\n\n // Fast path when hints are provided\n if (this.tokenAddress || this.createATA) {\n const looksSPL = message.compiledInstructions.some((ix) =>\n isSPLProgramId(message.allKeys[ix.programIdIndex]),\n );\n return {\n transactionType: looksSPL\n ? SolanaTransactionTypes.SPL\n : SolanaTransactionTypes.STANDARD,\n data: {\n ...(this.tokenAddress ? { tokenAddress: this.tokenAddress } : {}),\n ...(this.createATA ? { createATA: this.createATA } : {}),\n },\n };\n }\n\n // Accumulate best data across all instructions\n let sawSPL = false;\n let best: TxInspectorResult[\"data\"] = {};\n\n for (const ixMeta of message.compiledInstructions) {\n const programId = message.allKeys[ixMeta.programIdIndex];\n if (!programId) continue;\n\n if (isSPLProgramId(programId)) sawSPL = true;\n\n const resolvedKeys = ixMeta.accountKeyIndexes\n .map((i) => message.allKeys[i])\n .filter((k): k is PublicKey => !!k);\n\n const instruction = new TransactionInstruction({\n programId,\n keys: resolvedKeys.map((pk) => ({\n pubkey: pk,\n isSigner: false,\n isWritable: false,\n })),\n data: Buffer.from(ixMeta.data),\n });\n\n const ctx: IxContext = { programId, ixMeta, message, instruction };\n\n for (const decoder of DECODERS) {\n if (!decoder.when(ctx)) continue;\n const data = decoder.decode(ctx);\n if (!data) continue;\n\n // Prefer createATA (needed when destination ATA doesn\u2019t exist yet)\n if (data.createATA && !best.createATA) {\n best = { ...best, createATA: data.createATA };\n } else if (\n data.tokenAddress &&\n !best.tokenAddress &&\n !best.createATA\n ) {\n best = { ...best, tokenAddress: data.tokenAddress };\n }\n }\n }\n\n if (best.createATA)\n return { transactionType: SolanaTransactionTypes.SPL, data: best };\n if (best.tokenAddress)\n return { transactionType: SolanaTransactionTypes.SPL, data: best };\n if (sawSPL)\n return { transactionType: SolanaTransactionTypes.SPL, data: {} };\n\n return { transactionType: SolanaTransactionTypes.STANDARD, data: {} };\n } catch {\n return { transactionType: SolanaTransactionTypes.STANDARD, data: {} };\n }\n }\n\n /**\n * Normalise any tx (legacy or v0) into { compiledInstructions, allKeys }.\n * For v0, auto-fetch looked-up addresses from ALT(s) via the baked-in connection.\n */\n private async normaliseMessage(\n rawBytes: Uint8Array,\n ): Promise<NormalizedMessage> {\n const versionedTX = this.tryDeserialiseVersioned(rawBytes);\n if (versionedTX) {\n const msg = versionedTX.message as VersionedMessage & {\n getAccountKeys?: (options?: {\n accountKeysFromLookups?: LoadedAddresses;\n }) => {\n staticAccountKeys: PublicKey[];\n accountKeysFromLookups?: LoadedAddresses;\n keySegments: () => PublicKey[][];\n };\n compiledInstructions: Array<{\n programIdIndex: number;\n accountKeyIndexes?: number[]; // legacy field name\n accounts?: number[]; // v0 field name\n data: Uint8Array | string | number[];\n }>;\n staticAccountKeys: PublicKey[];\n };\n\n const lookedUp = await resolveLookedUpAddressesFromMessage(msg);\n\n let allKeys: PublicKey[];\n if (typeof msg.getAccountKeys === \"function\") {\n const messageAccountKeys = msg.getAccountKeys(\n lookedUp ? { accountKeysFromLookups: lookedUp } : undefined,\n );\n allKeys = messageAccountKeys.keySegments().flat();\n } else {\n allKeys = [...msg.staticAccountKeys];\n }\n\n const compiledInstructions: NormalizedCompiledIx[] =\n msg.compiledInstructions.map((ix) => {\n const ixWithAccounts = ix as typeof ix & { accounts?: number[] };\n const accountKeyIndexes = Array.from(\n ixWithAccounts.accounts ?? ix.accountKeyIndexes ?? [],\n ) as number[];\n\n let data: Uint8Array;\n if (ix.data instanceof Uint8Array) {\n data = ix.data;\n } else if (typeof ix.data === \"string\") {\n data = Buffer.from(ix.data, \"base64\"); // v0 encodes instruction data as base64\n } else {\n data = Uint8Array.from(ix.data ?? []);\n }\n\n return {\n programIdIndex: ix.programIdIndex,\n accountKeyIndexes,\n data,\n };\n });\n\n return { compiledInstructions, allKeys };\n }\n\n // Legacy (no ALTs)\n const legacy = Transaction.from(rawBytes);\n\n const allKeyMap = new Map<string, PublicKey>();\n const add = (pubkey?: PublicKey | null) => {\n if (!pubkey) return;\n const key = pubkey.toBase58();\n if (!allKeyMap.has(key)) allKeyMap.set(key, pubkey);\n };\n\n add(legacy.feePayer ?? null);\n for (const ix of legacy.instructions) {\n add(ix.programId);\n for (const key of ix.keys) add(key.pubkey);\n }\n const allKeys = Array.from(allKeyMap.values());\n const indexByB58 = new Map(allKeys.map((pk, i) => [pk.toBase58(), i]));\n\n const compiledInstructions: NormalizedCompiledIx[] =\n legacy.instructions.map((ix) => ({\n programIdIndex: indexByB58.get(ix.programId.toBase58()) ?? -1,\n accountKeyIndexes: ix.keys.map(\n (key) => indexByB58.get(key.pubkey.toBase58()) ?? -1,\n ),\n data: ix.data,\n }));\n\n return { compiledInstructions, allKeys };\n }\n\n private tryDeserialiseVersioned(\n rawBytes: Uint8Array,\n ): VersionedTransaction | null {\n try {\n return VersionedTransaction.deserialize(rawBytes);\n } catch {\n try {\n const msg = VersionedMessage.deserialize(rawBytes);\n return { message: msg } as VersionedTransaction;\n } catch {\n return null;\n }\n }\n }\n}\n\n// fetch looked-up addresses for a VersionedMessage via the baked-in connection\nasync function resolveLookedUpAddressesFromMessage(\n msg: VersionedMessage,\n): Promise<LoadedAddresses | undefined> {\n const lookups = msg.addressTableLookups ?? [];\n if (!lookups.length) return;\n\n const writable: PublicKey[] = [];\n const readonly: PublicKey[] = [];\n\n await Promise.all(\n lookups.map(async (lu) => {\n const res = await defaultConnection.getAddressLookupTable(lu.accountKey);\n const table = res.value;\n if (!table) return;\n const addrs = table.state.addresses;\n\n for (const i of lu.writableIndexes ?? []) {\n const pk = addrs[i];\n if (pk) writable.push(pk);\n }\n for (const i of lu.readonlyIndexes ?? []) {\n const pk = addrs[i];\n if (pk) readonly.push(pk);\n }\n }),\n );\n\n return { writable, readonly };\n}\n"],
5
+ "mappings": "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",
6
+ "names": ["ASSOCIATED_TOKEN_PROGRAM_ID", "TOKEN_2022_PROGRAM_ID", "TOKEN_PROGRAM_ID", "Connection", "Transaction", "TransactionInstruction", "VersionedMessage", "VersionedTransaction", "Buffer", "DECODERS", "SolanaTransactionTypes", "RPC_URL", "defaultConnection", "isSPLProgramId", "pid", "TransactionInspector", "rawTransactionBytes", "tokenAddress", "createATA", "message", "ix", "sawSPL", "best", "ixMeta", "programId", "resolvedKeys", "i", "k", "instruction", "pk", "ctx", "decoder", "data", "rawBytes", "versionedTX", "msg", "lookedUp", "resolveLookedUpAddressesFromMessage", "allKeys", "ixWithAccounts", "accountKeyIndexes", "legacy", "allKeyMap", "add", "pubkey", "key", "indexByB58", "lookups", "writable", "readonly", "lu", "table", "addrs"]
7
7
  }